tailwind_rs_core/utilities/effects/
drop_shadow.rs1use crate::classes::ClassBuilder;
6use serde::{Deserialize, Serialize};
7use std::fmt;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11pub enum DropShadow {
12 None,
14 Sm,
16 Default,
18 Md,
20 Lg,
22 Xl,
24 Xl2,
26 Xl3,
28 Red,
31 Blue,
33 Green,
35 Yellow,
37 Purple,
39 Pink,
41 Orange,
43 Indigo,
45 Cyan,
47 Teal,
49 Lime,
51 Emerald,
53 Rose,
55 Violet,
57 Fuchsia,
59 Sky,
61 Amber,
63 Stone,
65 Neutral,
67 Zinc,
69 Gray,
71 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 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
113pub trait DropShadowUtilities {
115 fn drop_shadow(self, shadow: DropShadow) -> Self;
116
117 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 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 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}