Skip to main content

basecoat_core/classes/
sidebar.rs

1use crate::props::sidebar::SidebarProps;
2
3/// Returns the canonical CSS class string for a sidebar.
4///
5/// Upstream: `.sidebar` class on the `<aside>` element.
6pub fn sidebar(p: &SidebarProps) -> String {
7    match &p.class {
8        Some(extra) if !extra.is_empty() => format!("sidebar {extra}"),
9        _ => "sidebar".to_string(),
10    }
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16    use crate::props::sidebar::SidebarProps;
17
18    #[test]
19    fn base_class() {
20        assert_eq!(sidebar(&SidebarProps::default()), "sidebar");
21    }
22
23    #[test]
24    fn with_extra_class() {
25        let p = SidebarProps {
26            class: Some("border-r".into()),
27            ..Default::default()
28        };
29        assert_eq!(sidebar(&p), "sidebar border-r");
30    }
31
32    #[test]
33    fn empty_extra_class_is_ignored() {
34        let p = SidebarProps {
35            class: Some("".into()),
36            ..Default::default()
37        };
38        assert_eq!(sidebar(&p), "sidebar");
39    }
40
41    #[test]
42    fn class_unchanged_regardless_of_state_props() {
43        // default_open / breakpoint_px do NOT influence the class string —
44        // they only affect rendered attributes / controller behavior.
45        let collapsed = SidebarProps {
46            default_open: false,
47            breakpoint_px: 1024.0,
48            ..Default::default()
49        };
50        assert_eq!(sidebar(&collapsed), "sidebar");
51        let expanded = SidebarProps {
52            default_open: true,
53            breakpoint_px: 768.0,
54            class: Some("w-72".into()),
55            ..Default::default()
56        };
57        assert_eq!(sidebar(&expanded), "sidebar w-72");
58    }
59}