tailwind_css/modules/borders/border/border_radius/
mod.rs

1use super::*;
2
3#[doc=include_str!("readme.md")]
4#[derive(Copy, Clone, Debug)]
5pub struct TailwindRounded {
6    kind: RoundedKind,
7    size: LengthUnit,
8}
9
10#[derive(Copy, Clone, Debug)]
11enum RoundedKind {
12    Rounded,
13    RoundedT,
14    RoundedR,
15    RoundedB,
16    RoundedL,
17    RoundedTL,
18    RoundedTR,
19    RoundedBL,
20    RoundedBR,
21}
22
23impl Display for RoundedKind {
24    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
25        match self {
26            Self::Rounded => write!(f, "rounded"),
27            Self::RoundedT => write!(f, "rounded-t"),
28            Self::RoundedR => write!(f, "rounded-r"),
29            Self::RoundedB => write!(f, "rounded-b"),
30            Self::RoundedL => write!(f, "rounded-l"),
31            Self::RoundedTL => write!(f, "rounded-tl"),
32            Self::RoundedTR => write!(f, "rounded-tr"),
33            Self::RoundedBL => write!(f, "rounded-bl"),
34            Self::RoundedBR => write!(f, "rounded-br"),
35        }
36    }
37}
38
39impl Display for TailwindRounded {
40    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
41        write!(f, "{}-[{}]", self.kind, self.size)
42    }
43}
44
45impl TailwindInstance for TailwindRounded {
46    fn attributes(&self, _: &TailwindBuilder) -> CssAttributes {
47        let size = format!("{:?}", self.size);
48        match self.kind {
49            RoundedKind::Rounded => css_attributes! {
50                "border-radius" => &size
51            },
52            RoundedKind::RoundedT => css_attributes! {
53                "border-top-left-radius" => &size,
54                "border-top-right-radius" => &size,
55            },
56            RoundedKind::RoundedR => css_attributes! {
57                "border-top-right-radius" => &size,
58                "border-bottom-right-radius" => &size,
59            },
60            RoundedKind::RoundedB => css_attributes! {
61                "border-bottom-right-radius" => &size,
62                "border-bottom-left-radius" => &size,
63            },
64            RoundedKind::RoundedL => css_attributes! {
65                "border-top-left-radius" => &size,
66                "border-bottom-left-radius" => &size,
67            },
68            RoundedKind::RoundedTL => css_attributes! {
69                "border-top-left-radius" => &size,
70            },
71            RoundedKind::RoundedTR => css_attributes! {
72                "border-top-right-radius" => &size,
73            },
74            RoundedKind::RoundedBL => css_attributes! {
75                "border-bottom-left-radius" => &size,
76            },
77            RoundedKind::RoundedBR => css_attributes! {
78                "border-bottom-right-radius" => &size,
79            },
80        }
81    }
82}
83
84impl TailwindRounded {
85    pub fn parse(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
86        match pattern {
87            ["t" | "8", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedT, arbitrary),
88            ["r" | "6", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedR, arbitrary),
89            ["b" | "2", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedB, arbitrary),
90            ["l" | "4", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedL, arbitrary),
91            ["tl" | "7", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedTL, arbitrary),
92            ["tr" | "9", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedTR, arbitrary),
93            ["bl" | "3", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedBL, arbitrary),
94            ["br" | "1", rest @ ..] => Self::parse_inner(rest, RoundedKind::RoundedBR, arbitrary),
95            _ => Self::parse_inner(pattern, RoundedKind::Rounded, arbitrary),
96        }
97    }
98    fn parse_inner(pattern: &[&str], kind: RoundedKind, arbitrary: &TailwindArbitrary) -> Result<Self> {
99        if arbitrary.is_some() {
100            return Ok(Self { kind, size: arbitrary.as_length_or_fraction()? });
101        }
102        let rem = |n| Ok(Self { kind, size: LengthUnit::rem(n) });
103        let px = |n| Ok(Self { kind, size: LengthUnit::px(n) });
104        match pattern {
105            ["none"] => px(0.0),
106            ["sm"] => rem(0.125),
107            [] => rem(0.25),
108            ["md"] => rem(0.375),
109            ["lg"] => rem(0.5),
110            ["xl"] => rem(0.75),
111            ["2xl"] => rem(1.0),
112            ["3xl"] => rem(1.5),
113            ["full"] => px(9999.0),
114            _ => syntax_error!(""),
115        }
116    }
117}