tailwind_rs_core/utilities/effects/
opacity.rs

1//! Opacity utilities for tailwind-rs
2//!
3//! This module provides utilities for opacity effects.
4
5use crate::classes::ClassBuilder;
6use serde::{Deserialize, Serialize};
7use std::fmt;
8
9/// Opacity values
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11pub enum Opacity {
12    /// 0% opacity
13    Zero,
14    /// 5% opacity
15    Five,
16    /// 10% opacity
17    Ten,
18    /// 20% opacity
19    Twenty,
20    /// 25% opacity
21    TwentyFive,
22    /// 30% opacity
23    Thirty,
24    /// 40% opacity
25    Forty,
26    /// 50% opacity
27    Fifty,
28    /// 60% opacity
29    Sixty,
30    /// 70% opacity
31    Seventy,
32    /// 75% opacity
33    SeventyFive,
34    /// 80% opacity
35    Eighty,
36    /// 90% opacity
37    Ninety,
38    /// 95% opacity
39    NinetyFive,
40    /// 100% opacity
41    Hundred,
42}
43
44impl fmt::Display for Opacity {
45    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46        match self {
47            Opacity::Zero => write!(f, "opacity-0"),
48            Opacity::Five => write!(f, "opacity-5"),
49            Opacity::Ten => write!(f, "opacity-10"),
50            Opacity::Twenty => write!(f, "opacity-20"),
51            Opacity::TwentyFive => write!(f, "opacity-25"),
52            Opacity::Thirty => write!(f, "opacity-30"),
53            Opacity::Forty => write!(f, "opacity-40"),
54            Opacity::Fifty => write!(f, "opacity-50"),
55            Opacity::Sixty => write!(f, "opacity-60"),
56            Opacity::Seventy => write!(f, "opacity-70"),
57            Opacity::SeventyFive => write!(f, "opacity-75"),
58            Opacity::Eighty => write!(f, "opacity-80"),
59            Opacity::Ninety => write!(f, "opacity-90"),
60            Opacity::NinetyFive => write!(f, "opacity-95"),
61            Opacity::Hundred => write!(f, "opacity-100"),
62        }
63    }
64}
65
66/// Trait for adding opacity utilities to a class builder
67pub trait OpacityUtilities {
68    fn opacity(self, opacity: Opacity) -> Self;
69}
70
71impl OpacityUtilities for ClassBuilder {
72    fn opacity(self, opacity: Opacity) -> Self {
73        self.class(opacity.to_string())
74    }
75}
76
77#[cfg(test)]
78mod tests {
79    use super::*;
80
81    #[test]
82    fn test_opacity_display() {
83        assert_eq!(Opacity::Zero.to_string(), "opacity-0");
84        assert_eq!(Opacity::Five.to_string(), "opacity-5");
85        assert_eq!(Opacity::Ten.to_string(), "opacity-10");
86        assert_eq!(Opacity::Twenty.to_string(), "opacity-20");
87        assert_eq!(Opacity::TwentyFive.to_string(), "opacity-25");
88        assert_eq!(Opacity::Thirty.to_string(), "opacity-30");
89        assert_eq!(Opacity::Forty.to_string(), "opacity-40");
90        assert_eq!(Opacity::Fifty.to_string(), "opacity-50");
91        assert_eq!(Opacity::Sixty.to_string(), "opacity-60");
92        assert_eq!(Opacity::Seventy.to_string(), "opacity-70");
93        assert_eq!(Opacity::SeventyFive.to_string(), "opacity-75");
94        assert_eq!(Opacity::Eighty.to_string(), "opacity-80");
95        assert_eq!(Opacity::Ninety.to_string(), "opacity-90");
96        assert_eq!(Opacity::NinetyFive.to_string(), "opacity-95");
97        assert_eq!(Opacity::Hundred.to_string(), "opacity-100");
98    }
99
100    #[test]
101    fn test_opacity_utilities() {
102        let classes = ClassBuilder::new().opacity(Opacity::Fifty).build();
103
104        assert!(classes.to_css_classes().contains("opacity-50"));
105    }
106
107    #[test]
108    fn test_opacity_serialization() {
109        let opacity = Opacity::SeventyFive;
110        let serialized = serde_json::to_string(&opacity).unwrap();
111        let deserialized: Opacity = serde_json::from_str(&serialized).unwrap();
112        assert_eq!(opacity, deserialized);
113    }
114
115    #[test]
116    fn test_opacity_equality_and_hash() {
117        let opacity1 = Opacity::Fifty;
118        let opacity2 = Opacity::Fifty;
119        let opacity3 = Opacity::SeventyFive;
120
121        assert_eq!(opacity1, opacity2);
122        assert_ne!(opacity1, opacity3);
123
124        // Test that equal effects have the same hash
125        use std::collections::hash_map::DefaultHasher;
126        use std::hash::{Hash, Hasher};
127
128        let mut hasher1 = DefaultHasher::new();
129        let mut hasher2 = DefaultHasher::new();
130        opacity1.hash(&mut hasher1);
131        opacity2.hash(&mut hasher2);
132        assert_eq!(hasher1.finish(), hasher2.finish());
133    }
134}