tailwind_rs_core/utilities/sizing/
sizing_value.rs

1//! Sizing value utilities for tailwind-rs
2
3use crate::utilities::sizing::{Fraction, GridFraction};
4use serde::{Deserialize, Serialize};
5use std::fmt;
6
7/// Sizing value enum
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9pub enum SizingValue {
10    /// Auto sizing
11    Auto,
12    /// Full sizing (100%)
13    Full,
14    /// Screen sizing (100vh/100vw)
15    Screen,
16    /// Min content sizing
17    Min,
18    /// Max content sizing
19    Max,
20    /// Fit content sizing
21    Fit,
22    /// Fraction sizing
23    Fraction(Fraction),
24    /// Grid fraction sizing
25    GridFraction(GridFraction),
26    /// Integer sizing (in rem units)
27    Integer(u32),
28    /// Pixel sizing
29    Px(u32),
30}
31
32impl fmt::Display for SizingValue {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        match self {
35            SizingValue::Auto => write!(f, "auto"),
36            SizingValue::Full => write!(f, "full"),
37            SizingValue::Screen => write!(f, "screen"),
38            SizingValue::Min => write!(f, "min"),
39            SizingValue::Max => write!(f, "max"),
40            SizingValue::Fit => write!(f, "fit"),
41            SizingValue::Fraction(fraction) => write!(f, "{}", fraction),
42            SizingValue::GridFraction(grid_fraction) => write!(f, "{}", grid_fraction),
43            SizingValue::Integer(value) => write!(f, "{}", value),
44            SizingValue::Px(value) => write!(f, "{}px", value),
45        }
46    }
47}
48
49impl SizingValue {
50    pub fn to_class_name(&self) -> String {
51        match self {
52            SizingValue::Auto => "auto".to_string(),
53            SizingValue::Full => "full".to_string(),
54            SizingValue::Screen => "screen".to_string(),
55            SizingValue::Min => "min".to_string(),
56            SizingValue::Max => "max".to_string(),
57            SizingValue::Fit => "fit".to_string(),
58            SizingValue::Fraction(fraction) => fraction.to_class_name(),
59            SizingValue::GridFraction(grid_fraction) => grid_fraction.to_class_name(),
60            SizingValue::Integer(value) => value.to_string(),
61            SizingValue::Px(value) => format!("{}px", value),
62        }
63    }
64    
65    pub fn to_css_value(&self) -> String {
66        match self {
67            SizingValue::Auto => "auto".to_string(),
68            SizingValue::Full => "100%".to_string(),
69            SizingValue::Screen => "100vh".to_string(),
70            SizingValue::Min => "min-content".to_string(),
71            SizingValue::Max => "max-content".to_string(),
72            SizingValue::Fit => "fit-content".to_string(),
73            SizingValue::Fraction(fraction) => fraction.to_css_value(),
74            SizingValue::GridFraction(grid_fraction) => grid_fraction.to_css_value(),
75            SizingValue::Integer(value) => format!("{}rem", value * 4 / 16), // Convert to rem
76            SizingValue::Px(value) => format!("{}px", value),
77        }
78    }
79}
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    fn test_sizing_value_display() {
87        assert_eq!(SizingValue::Auto.to_string(), "auto");
88        assert_eq!(SizingValue::Full.to_string(), "full");
89        assert_eq!(SizingValue::Integer(4).to_string(), "4");
90    }
91
92    #[test]
93    fn test_sizing_value_class_name() {
94        assert_eq!(SizingValue::Auto.to_class_name(), "auto");
95        assert_eq!(SizingValue::Full.to_class_name(), "full");
96        assert_eq!(SizingValue::Integer(4).to_class_name(), "4");
97    }
98
99    #[test]
100    fn test_sizing_value_css_value() {
101        assert_eq!(SizingValue::Auto.to_css_value(), "auto");
102        assert_eq!(SizingValue::Full.to_css_value(), "100%");
103        assert_eq!(SizingValue::Integer(4).to_css_value(), "1rem");
104    }
105}