rustyle_css/tokens/
spacing.rs

1//! Spacing token system
2//!
3//! Provides a consistent spacing scale based on typography principles.
4
5use crate::css::Length;
6
7/// Spacing scale values
8#[derive(Clone, Debug)]
9pub struct SpacingTokens {
10    pub xs: Length,
11    pub sm: Length,
12    pub md: Length,
13    pub lg: Length,
14    pub xl: Length,
15    pub xl2: Length,
16    pub xl3: Length,
17    pub xl4: Length,
18    pub xl5: Length,
19    pub xl6: Length,
20}
21
22impl SpacingTokens {
23    /// Create new spacing tokens
24    pub fn new(
25        xs: Length,
26        sm: Length,
27        md: Length,
28        lg: Length,
29        xl: Length,
30        xl2: Length,
31        xl3: Length,
32        xl4: Length,
33        xl5: Length,
34        xl6: Length,
35    ) -> Self {
36        Self {
37            xs,
38            sm,
39            md,
40            lg,
41            xl,
42            xl2,
43            xl3,
44            xl4,
45            xl5,
46            xl6,
47        }
48    }
49
50    /// Get spacing by name
51    pub fn get(&self, name: &str) -> &Length {
52        match name {
53            "xs" => &self.xs,
54            "sm" => &self.sm,
55            "md" => &self.md,
56            "lg" => &self.lg,
57            "xl" => &self.xl,
58            "2xl" | "xl2" => &self.xl2,
59            "3xl" | "xl3" => &self.xl3,
60            "4xl" | "xl4" => &self.xl4,
61            "5xl" | "xl5" => &self.xl5,
62            "6xl" | "xl6" => &self.xl6,
63            _ => &self.md, // Default to medium
64        }
65    }
66
67    /// Convert spacing tokens to CSS custom properties
68    pub fn to_css_vars(&self) -> String {
69        format!(
70            "  --spacing-xs: {};\n  --spacing-sm: {};\n  --spacing-md: {};\n  --spacing-lg: {};\n  --spacing-xl: {};\n  --spacing-2xl: {};\n  --spacing-3xl: {};\n  --spacing-4xl: {};\n  --spacing-5xl: {};\n  --spacing-6xl: {};\n",
71            self.xs.to_css(),
72            self.sm.to_css(),
73            self.md.to_css(),
74            self.lg.to_css(),
75            self.xl.to_css(),
76            self.xl2.to_css(),
77            self.xl3.to_css(),
78            self.xl4.to_css(),
79            self.xl5.to_css(),
80            self.xl6.to_css(),
81        )
82    }
83}
84
85impl Default for SpacingTokens {
86    fn default() -> Self {
87        Self {
88            xs: Length::rem(0.25),  // 4px
89            sm: Length::rem(0.5),   // 8px
90            md: Length::rem(1.0),   // 16px
91            lg: Length::rem(1.5),   // 24px
92            xl: Length::rem(2.0),   // 32px
93            xl2: Length::rem(3.0),  // 48px
94            xl3: Length::rem(4.0),  // 64px
95            xl4: Length::rem(6.0),  // 96px
96            xl5: Length::rem(8.0),  // 128px
97            xl6: Length::rem(12.0), // 192px
98        }
99    }
100}