tailwind_rs_core/classes/
class_builder.rs1use crate::responsive::Breakpoint;
6use super::ClassSet;
7
8#[derive(Debug, Clone)]
10pub struct ClassBuilder {
11    class_set: ClassSet,
12}
13
14impl ClassBuilder {
15    pub fn new() -> Self {
17        Self {
18            class_set: ClassSet::new(),
19        }
20    }
21
22    pub fn class(mut self, class: impl Into<String>) -> Self {
24        self.class_set.add_class(class);
25        self
26    }
27
28    pub fn classes(mut self, classes: impl IntoIterator<Item = String>) -> Self {
30        self.class_set.add_classes(classes);
31        self
32    }
33
34    pub fn responsive(mut self, breakpoint: Breakpoint, class: impl Into<String>) -> Self {
36        self.class_set.add_responsive_class(breakpoint, class);
37        self
38    }
39
40    pub fn conditional(mut self, condition: impl Into<String>, class: impl Into<String>) -> Self {
42        self.class_set.add_conditional_class(condition, class);
43        self
44    }
45
46    pub fn custom(mut self, property: impl Into<String>, value: impl Into<String>) -> Self {
48        self.class_set.add_custom(property, value);
49        self
50    }
51
52    pub fn custom_variant(mut self, variant: impl Into<String>, class: impl Into<String>) -> Self {
54        let variant = variant.into();
55        let class = class.into();
56        
57        self.class_set.add_conditional_class(variant, class);
59        self
60    }
61
62    pub fn aria(self, aria_attr: impl Into<String>, class: impl Into<String>) -> Self {
64        let variant = format!("aria-{}", aria_attr.into());
65        self.custom_variant(variant, class)
66    }
67
68    pub fn data(self, data_attr: impl Into<String>, value: Option<String>, class: impl Into<String>) -> Self {
70        let variant = if let Some(val) = value {
71            format!("data-{}={}", data_attr.into(), val)
72        } else {
73            format!("data-{}", data_attr.into())
74        };
75        self.custom_variant(variant, class)
76    }
77
78    pub fn supports(self, feature: impl Into<String>, class: impl Into<String>) -> Self {
80        let variant = format!("supports-{}", feature.into());
81        self.custom_variant(variant, class)
82    }
83
84    pub fn build(self) -> ClassSet {
86        self.class_set
87    }
88
89    pub fn build_string(self) -> String {
91        self.class_set.to_css_classes()
92    }
93}
94
95impl Default for ClassBuilder {
96    fn default() -> Self {
97        Self::new()
98    }
99}