tailwind_rs_core/utilities/effects/
drop_shadow.rs

1//! Drop shadow utilities for tailwind-rs
2//!
3//! This module provides utilities for drop shadow effects.
4
5use crate::classes::ClassBuilder;
6use serde::{Deserialize, Serialize};
7use std::fmt;
8
9/// Drop shadow values
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11pub enum DropShadow {
12    /// No shadow
13    None,
14    /// Small shadow
15    Sm,
16    /// Default shadow
17    Default,
18    /// Medium shadow
19    Md,
20    /// Large shadow
21    Lg,
22    /// Extra large shadow
23    Xl,
24    /// 2x large shadow
25    Xl2,
26    /// 3x large shadow
27    Xl3,
28    // Colored drop shadows
29    /// Red drop shadow
30    Red,
31    /// Blue drop shadow
32    Blue,
33    /// Green drop shadow
34    Green,
35    /// Yellow drop shadow
36    Yellow,
37    /// Purple drop shadow
38    Purple,
39    /// Pink drop shadow
40    Pink,
41    /// Orange drop shadow
42    Orange,
43    /// Indigo drop shadow
44    Indigo,
45    /// Cyan drop shadow
46    Cyan,
47    /// Teal drop shadow
48    Teal,
49    /// Lime drop shadow
50    Lime,
51    /// Emerald drop shadow
52    Emerald,
53    /// Rose drop shadow
54    Rose,
55    /// Violet drop shadow
56    Violet,
57    /// Fuchsia drop shadow
58    Fuchsia,
59    /// Sky drop shadow
60    Sky,
61    /// Amber drop shadow
62    Amber,
63    /// Stone drop shadow
64    Stone,
65    /// Neutral drop shadow
66    Neutral,
67    /// Zinc drop shadow
68    Zinc,
69    /// Gray drop shadow
70    Gray,
71    /// Slate drop shadow
72    Slate,
73}
74
75impl fmt::Display for DropShadow {
76    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77        match self {
78            DropShadow::None => write!(f, "drop-shadow-none"),
79            DropShadow::Sm => write!(f, "drop-shadow-sm"),
80            DropShadow::Default => write!(f, "drop-shadow"),
81            DropShadow::Md => write!(f, "drop-shadow-md"),
82            DropShadow::Lg => write!(f, "drop-shadow-lg"),
83            DropShadow::Xl => write!(f, "drop-shadow-xl"),
84            DropShadow::Xl2 => write!(f, "drop-shadow-2xl"),
85            DropShadow::Xl3 => write!(f, "drop-shadow-3xl"),
86            // Colored drop shadows
87            DropShadow::Red => write!(f, "drop-shadow-red"),
88            DropShadow::Blue => write!(f, "drop-shadow-blue"),
89            DropShadow::Green => write!(f, "drop-shadow-green"),
90            DropShadow::Yellow => write!(f, "drop-shadow-yellow"),
91            DropShadow::Purple => write!(f, "drop-shadow-purple"),
92            DropShadow::Pink => write!(f, "drop-shadow-pink"),
93            DropShadow::Orange => write!(f, "drop-shadow-orange"),
94            DropShadow::Indigo => write!(f, "drop-shadow-indigo"),
95            DropShadow::Cyan => write!(f, "drop-shadow-cyan"),
96            DropShadow::Teal => write!(f, "drop-shadow-teal"),
97            DropShadow::Lime => write!(f, "drop-shadow-lime"),
98            DropShadow::Emerald => write!(f, "drop-shadow-emerald"),
99            DropShadow::Rose => write!(f, "drop-shadow-rose"),
100            DropShadow::Violet => write!(f, "drop-shadow-violet"),
101            DropShadow::Fuchsia => write!(f, "drop-shadow-fuchsia"),
102            DropShadow::Sky => write!(f, "drop-shadow-sky"),
103            DropShadow::Amber => write!(f, "drop-shadow-amber"),
104            DropShadow::Stone => write!(f, "drop-shadow-stone"),
105            DropShadow::Neutral => write!(f, "drop-shadow-neutral"),
106            DropShadow::Zinc => write!(f, "drop-shadow-zinc"),
107            DropShadow::Gray => write!(f, "drop-shadow-gray"),
108            DropShadow::Slate => write!(f, "drop-shadow-slate"),
109        }
110    }
111}
112
113/// Trait for adding drop shadow utilities to a class builder
114pub trait DropShadowUtilities {
115    fn drop_shadow(self, shadow: DropShadow) -> Self;
116    
117    // Convenience methods for colored drop shadows
118    fn drop_shadow_red(self) -> Self;
119    fn drop_shadow_blue(self) -> Self;
120    fn drop_shadow_green(self) -> Self;
121    fn drop_shadow_yellow(self) -> Self;
122    fn drop_shadow_purple(self) -> Self;
123    fn drop_shadow_pink(self) -> Self;
124    fn drop_shadow_orange(self) -> Self;
125    fn drop_shadow_indigo(self) -> Self;
126    fn drop_shadow_cyan(self) -> Self;
127    fn drop_shadow_teal(self) -> Self;
128    fn drop_shadow_lime(self) -> Self;
129    fn drop_shadow_emerald(self) -> Self;
130    fn drop_shadow_rose(self) -> Self;
131    fn drop_shadow_violet(self) -> Self;
132    fn drop_shadow_fuchsia(self) -> Self;
133    fn drop_shadow_sky(self) -> Self;
134    fn drop_shadow_amber(self) -> Self;
135    fn drop_shadow_stone(self) -> Self;
136    fn drop_shadow_neutral(self) -> Self;
137    fn drop_shadow_zinc(self) -> Self;
138    fn drop_shadow_gray(self) -> Self;
139    fn drop_shadow_slate(self) -> Self;
140}
141
142impl DropShadowUtilities for ClassBuilder {
143    fn drop_shadow(self, shadow: DropShadow) -> Self {
144        self.class(shadow.to_string())
145    }
146    
147    fn drop_shadow_red(self) -> Self {
148        self.drop_shadow(DropShadow::Red)
149    }
150    
151    fn drop_shadow_blue(self) -> Self {
152        self.drop_shadow(DropShadow::Blue)
153    }
154    
155    fn drop_shadow_green(self) -> Self {
156        self.drop_shadow(DropShadow::Green)
157    }
158    
159    fn drop_shadow_yellow(self) -> Self {
160        self.drop_shadow(DropShadow::Yellow)
161    }
162    
163    fn drop_shadow_purple(self) -> Self {
164        self.drop_shadow(DropShadow::Purple)
165    }
166    
167    fn drop_shadow_pink(self) -> Self {
168        self.drop_shadow(DropShadow::Pink)
169    }
170    
171    fn drop_shadow_orange(self) -> Self {
172        self.drop_shadow(DropShadow::Orange)
173    }
174    
175    fn drop_shadow_indigo(self) -> Self {
176        self.drop_shadow(DropShadow::Indigo)
177    }
178    
179    fn drop_shadow_cyan(self) -> Self {
180        self.drop_shadow(DropShadow::Cyan)
181    }
182    
183    fn drop_shadow_teal(self) -> Self {
184        self.drop_shadow(DropShadow::Teal)
185    }
186    
187    fn drop_shadow_lime(self) -> Self {
188        self.drop_shadow(DropShadow::Lime)
189    }
190    
191    fn drop_shadow_emerald(self) -> Self {
192        self.drop_shadow(DropShadow::Emerald)
193    }
194    
195    fn drop_shadow_rose(self) -> Self {
196        self.drop_shadow(DropShadow::Rose)
197    }
198    
199    fn drop_shadow_violet(self) -> Self {
200        self.drop_shadow(DropShadow::Violet)
201    }
202    
203    fn drop_shadow_fuchsia(self) -> Self {
204        self.drop_shadow(DropShadow::Fuchsia)
205    }
206    
207    fn drop_shadow_sky(self) -> Self {
208        self.drop_shadow(DropShadow::Sky)
209    }
210    
211    fn drop_shadow_amber(self) -> Self {
212        self.drop_shadow(DropShadow::Amber)
213    }
214    
215    fn drop_shadow_stone(self) -> Self {
216        self.drop_shadow(DropShadow::Stone)
217    }
218    
219    fn drop_shadow_neutral(self) -> Self {
220        self.drop_shadow(DropShadow::Neutral)
221    }
222    
223    fn drop_shadow_zinc(self) -> Self {
224        self.drop_shadow(DropShadow::Zinc)
225    }
226    
227    fn drop_shadow_gray(self) -> Self {
228        self.drop_shadow(DropShadow::Gray)
229    }
230    
231    fn drop_shadow_slate(self) -> Self {
232        self.drop_shadow(DropShadow::Slate)
233    }
234}
235
236#[cfg(test)]
237mod tests {
238    use super::*;
239
240    #[test]
241    fn test_drop_shadow_display() {
242        assert_eq!(DropShadow::None.to_string(), "drop-shadow-none");
243        assert_eq!(DropShadow::Sm.to_string(), "drop-shadow-sm");
244        assert_eq!(DropShadow::Default.to_string(), "drop-shadow");
245        assert_eq!(DropShadow::Md.to_string(), "drop-shadow-md");
246        assert_eq!(DropShadow::Lg.to_string(), "drop-shadow-lg");
247        assert_eq!(DropShadow::Xl.to_string(), "drop-shadow-xl");
248        assert_eq!(DropShadow::Xl2.to_string(), "drop-shadow-2xl");
249        assert_eq!(DropShadow::Xl3.to_string(), "drop-shadow-3xl");
250        
251        // Test colored drop shadows
252        assert_eq!(DropShadow::Red.to_string(), "drop-shadow-red");
253        assert_eq!(DropShadow::Blue.to_string(), "drop-shadow-blue");
254        assert_eq!(DropShadow::Green.to_string(), "drop-shadow-green");
255        assert_eq!(DropShadow::Yellow.to_string(), "drop-shadow-yellow");
256        assert_eq!(DropShadow::Purple.to_string(), "drop-shadow-purple");
257        assert_eq!(DropShadow::Pink.to_string(), "drop-shadow-pink");
258        assert_eq!(DropShadow::Orange.to_string(), "drop-shadow-orange");
259        assert_eq!(DropShadow::Indigo.to_string(), "drop-shadow-indigo");
260        assert_eq!(DropShadow::Cyan.to_string(), "drop-shadow-cyan");
261        assert_eq!(DropShadow::Teal.to_string(), "drop-shadow-teal");
262        assert_eq!(DropShadow::Lime.to_string(), "drop-shadow-lime");
263        assert_eq!(DropShadow::Emerald.to_string(), "drop-shadow-emerald");
264        assert_eq!(DropShadow::Rose.to_string(), "drop-shadow-rose");
265        assert_eq!(DropShadow::Violet.to_string(), "drop-shadow-violet");
266        assert_eq!(DropShadow::Fuchsia.to_string(), "drop-shadow-fuchsia");
267        assert_eq!(DropShadow::Sky.to_string(), "drop-shadow-sky");
268        assert_eq!(DropShadow::Amber.to_string(), "drop-shadow-amber");
269        assert_eq!(DropShadow::Stone.to_string(), "drop-shadow-stone");
270        assert_eq!(DropShadow::Neutral.to_string(), "drop-shadow-neutral");
271        assert_eq!(DropShadow::Zinc.to_string(), "drop-shadow-zinc");
272        assert_eq!(DropShadow::Gray.to_string(), "drop-shadow-gray");
273        assert_eq!(DropShadow::Slate.to_string(), "drop-shadow-slate");
274    }
275
276    #[test]
277    fn test_drop_shadow_utilities() {
278        let classes = ClassBuilder::new()
279            .drop_shadow(DropShadow::Lg)
280            .build();
281        
282        assert!(classes.to_css_classes().contains("drop-shadow-lg"));
283    }
284
285    #[test]
286    fn test_drop_shadow_convenience_methods() {
287        let classes = ClassBuilder::new()
288            .drop_shadow_red()
289            .drop_shadow_blue()
290            .drop_shadow_green()
291            .build();
292        
293        let css_classes = classes.to_css_classes();
294        assert!(css_classes.contains("drop-shadow-red"));
295        assert!(css_classes.contains("drop-shadow-blue"));
296        assert!(css_classes.contains("drop-shadow-green"));
297    }
298
299    #[test]
300    fn test_drop_shadow_serialization() {
301        let drop_shadow = DropShadow::Md;
302        let serialized = serde_json::to_string(&drop_shadow).unwrap();
303        let deserialized: DropShadow = serde_json::from_str(&serialized).unwrap();
304        assert_eq!(drop_shadow, deserialized);
305    }
306
307    #[test]
308    fn test_drop_shadow_equality_and_hash() {
309        let drop_shadow1 = DropShadow::Lg;
310        let drop_shadow2 = DropShadow::Lg;
311        let drop_shadow3 = DropShadow::Md;
312        
313        assert_eq!(drop_shadow1, drop_shadow2);
314        assert_ne!(drop_shadow1, drop_shadow3);
315        
316        // Test that equal effects have the same hash
317        use std::collections::hash_map::DefaultHasher;
318        use std::hash::{Hash, Hasher};
319        
320        let mut hasher1 = DefaultHasher::new();
321        let mut hasher2 = DefaultHasher::new();
322        drop_shadow1.hash(&mut hasher1);
323        drop_shadow2.hash(&mut hasher2);
324        assert_eq!(hasher1.finish(), hasher2.finish());
325    }
326}