tailwind_rs_core/utilities/sizing/
aspect_ratio.rs

1//! Aspect ratio utilities for tailwind-rs
2
3use crate::classes::ClassBuilder;
4use serde::{Deserialize, Serialize};
5use std::fmt;
6
7/// Aspect ratio values
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9pub enum AspectRatio {
10    /// 1:1 aspect ratio
11    Square,
12    /// 16:9 aspect ratio
13    Video,
14    /// 4:3 aspect ratio
15    Photo,
16    /// 3:2 aspect ratio
17    Portrait,
18    /// 2:3 aspect ratio
19    Landscape,
20    /// Auto aspect ratio
21    Auto,
22}
23
24impl fmt::Display for AspectRatio {
25    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26        match self {
27            AspectRatio::Square => write!(f, "aspect-square"),
28            AspectRatio::Video => write!(f, "aspect-video"),
29            AspectRatio::Photo => write!(f, "aspect-photo"),
30            AspectRatio::Portrait => write!(f, "aspect-portrait"),
31            AspectRatio::Landscape => write!(f, "aspect-landscape"),
32            AspectRatio::Auto => write!(f, "aspect-auto"),
33        }
34    }
35}
36
37/// Trait for adding aspect ratio utilities to a class builder
38pub trait AspectRatioUtilities {
39    fn aspect_ratio(self, aspect_ratio: AspectRatio) -> Self;
40}
41
42impl AspectRatioUtilities for ClassBuilder {
43    fn aspect_ratio(self, aspect_ratio: AspectRatio) -> Self {
44        self.class(aspect_ratio.to_string())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_aspect_ratio_display() {
54        assert_eq!(AspectRatio::Square.to_string(), "aspect-square");
55        assert_eq!(AspectRatio::Video.to_string(), "aspect-video");
56        assert_eq!(AspectRatio::Photo.to_string(), "aspect-photo");
57    }
58
59    #[test]
60    fn test_aspect_ratio_utilities() {
61        let classes = ClassBuilder::new()
62            .aspect_ratio(AspectRatio::Square)
63            .build();
64
65        assert!(classes.to_css_classes().contains("aspect-square"));
66    }
67}