tailwind_css/modules/borders/border/border_radius/
mod.rs1use 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}