tailwind_rs_core/classes/
class_builder.rs

1//! ClassBuilder implementation
2//!
3//! This module contains the ClassBuilder struct and its methods.
4
5use crate::responsive::Breakpoint;
6use super::ClassSet;
7
8/// Builder for creating class sets
9#[derive(Debug, Clone)]
10pub struct ClassBuilder {
11    class_set: ClassSet,
12}
13
14impl ClassBuilder {
15    /// Create a new class builder
16    pub fn new() -> Self {
17        Self {
18            class_set: ClassSet::new(),
19        }
20    }
21
22    /// Add a base class
23    pub fn class(mut self, class: impl Into<String>) -> Self {
24        self.class_set.add_class(class);
25        self
26    }
27
28    /// Add multiple base classes
29    pub fn classes(mut self, classes: impl IntoIterator<Item = String>) -> Self {
30        self.class_set.add_classes(classes);
31        self
32    }
33
34    /// Add a responsive class
35    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    /// Add a conditional class
41    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    /// Add a custom CSS property
47    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    /// Add a custom variant class (Tailwind v4.1.13 @custom-variant support)
53    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        // Add the variant as a conditional class
58        self.class_set.add_conditional_class(variant, class);
59        self
60    }
61
62    /// Add an ARIA variant class
63    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    /// Add a data variant class
69    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    /// Add a supports variant class
79    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    /// Build the class set
85    pub fn build(self) -> ClassSet {
86        self.class_set
87    }
88
89    /// Build the class set and convert to CSS string
90    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}