tailwind_rs_core/utilities/sizing/
fraction.rs

1//! Fraction utilities for tailwind-rs
2
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6/// Fraction enum for fractional sizing
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8pub enum Fraction {
9    /// 1/2 fraction
10    Half,
11    /// 1/3 fraction
12    Third,
13    /// 2/3 fraction
14    TwoThirds,
15    /// 1/4 fraction
16    Quarter,
17    /// 2/4 fraction
18    TwoQuarters,
19    /// 3/4 fraction
20    ThreeQuarters,
21    /// 1/5 fraction
22    Fifth,
23    /// 2/5 fraction
24    TwoFifths,
25    /// 3/5 fraction
26    ThreeFifths,
27    /// 4/5 fraction
28    FourFifths,
29    /// 1/6 fraction
30    Sixth,
31    /// 2/6 fraction
32    TwoSixths,
33    /// 3/6 fraction
34    ThreeSixths,
35    /// 4/6 fraction
36    FourSixths,
37    /// 5/6 fraction
38    FiveSixths,
39    /// 1/12 fraction
40    Twelfth,
41    /// 2/12 fraction
42    TwoTwelfths,
43    /// 3/12 fraction
44    ThreeTwelfths,
45    /// 4/12 fraction
46    FourTwelfths,
47    /// 5/12 fraction
48    FiveTwelfths,
49    /// 6/12 fraction
50    SixTwelfths,
51    /// 7/12 fraction
52    SevenTwelfths,
53    /// 8/12 fraction
54    EightTwelfths,
55    /// 9/12 fraction
56    NineTwelfths,
57    /// 10/12 fraction
58    TenTwelfths,
59    /// 11/12 fraction
60    ElevenTwelfths,
61}
62
63impl fmt::Display for Fraction {
64    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65        match self {
66            Fraction::Half => write!(f, "1/2"),
67            Fraction::Third => write!(f, "1/3"),
68            Fraction::TwoThirds => write!(f, "2/3"),
69            Fraction::Quarter => write!(f, "1/4"),
70            Fraction::TwoQuarters => write!(f, "2/4"),
71            Fraction::ThreeQuarters => write!(f, "3/4"),
72            Fraction::Fifth => write!(f, "1/5"),
73            Fraction::TwoFifths => write!(f, "2/5"),
74            Fraction::ThreeFifths => write!(f, "3/5"),
75            Fraction::FourFifths => write!(f, "4/5"),
76            Fraction::Sixth => write!(f, "1/6"),
77            Fraction::TwoSixths => write!(f, "2/6"),
78            Fraction::ThreeSixths => write!(f, "3/6"),
79            Fraction::FourSixths => write!(f, "4/6"),
80            Fraction::FiveSixths => write!(f, "5/6"),
81            Fraction::Twelfth => write!(f, "1/12"),
82            Fraction::TwoTwelfths => write!(f, "2/12"),
83            Fraction::ThreeTwelfths => write!(f, "3/12"),
84            Fraction::FourTwelfths => write!(f, "4/12"),
85            Fraction::FiveTwelfths => write!(f, "5/12"),
86            Fraction::SixTwelfths => write!(f, "6/12"),
87            Fraction::SevenTwelfths => write!(f, "7/12"),
88            Fraction::EightTwelfths => write!(f, "8/12"),
89            Fraction::NineTwelfths => write!(f, "9/12"),
90            Fraction::TenTwelfths => write!(f, "10/12"),
91            Fraction::ElevenTwelfths => write!(f, "11/12"),
92        }
93    }
94}
95
96impl Fraction {
97    pub fn to_class_name(&self) -> String {
98        self.to_string()
99    }
100
101    pub fn to_css_value(&self) -> String {
102        match self {
103            Fraction::Half => "50%".to_string(),
104            Fraction::Third => "33.333333%".to_string(),
105            Fraction::TwoThirds => "66.666667%".to_string(),
106            Fraction::Quarter => "25%".to_string(),
107            Fraction::TwoQuarters => "50%".to_string(),
108            Fraction::ThreeQuarters => "75%".to_string(),
109            Fraction::Fifth => "20%".to_string(),
110            Fraction::TwoFifths => "40%".to_string(),
111            Fraction::ThreeFifths => "60%".to_string(),
112            Fraction::FourFifths => "80%".to_string(),
113            Fraction::Sixth => "16.666667%".to_string(),
114            Fraction::TwoSixths => "33.333333%".to_string(),
115            Fraction::ThreeSixths => "50%".to_string(),
116            Fraction::FourSixths => "66.666667%".to_string(),
117            Fraction::FiveSixths => "83.333333%".to_string(),
118            Fraction::Twelfth => "8.333333%".to_string(),
119            Fraction::TwoTwelfths => "16.666667%".to_string(),
120            Fraction::ThreeTwelfths => "25%".to_string(),
121            Fraction::FourTwelfths => "33.333333%".to_string(),
122            Fraction::FiveTwelfths => "41.666667%".to_string(),
123            Fraction::SixTwelfths => "50%".to_string(),
124            Fraction::SevenTwelfths => "58.333333%".to_string(),
125            Fraction::EightTwelfths => "66.666667%".to_string(),
126            Fraction::NineTwelfths => "75%".to_string(),
127            Fraction::TenTwelfths => "83.333333%".to_string(),
128            Fraction::ElevenTwelfths => "91.666667%".to_string(),
129        }
130    }
131}
132
133#[cfg(test)]
134mod tests {
135    use super::*;
136
137    #[test]
138    fn test_fraction_display() {
139        assert_eq!(Fraction::Half.to_string(), "1/2");
140        assert_eq!(Fraction::Third.to_string(), "1/3");
141        assert_eq!(Fraction::TwoThirds.to_string(), "2/3");
142    }
143
144    #[test]
145    fn test_fraction_css_value() {
146        assert_eq!(Fraction::Half.to_css_value(), "50%");
147        assert_eq!(Fraction::Third.to_css_value(), "33.333333%");
148        assert_eq!(Fraction::TwoThirds.to_css_value(), "66.666667%");
149    }
150}