tailwind_rs_core/classes/
class_builder.rs

1//! ClassBuilder implementation
2//!
3//! This module contains the ClassBuilder struct and its methods.
4
5use super::ClassSet;
6use crate::responsive::Breakpoint;
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(
70        self,
71        data_attr: impl Into<String>,
72        value: Option<String>,
73        class: impl Into<String>,
74    ) -> Self {
75        let variant = if let Some(val) = value {
76            format!("data-{}={}", data_attr.into(), val)
77        } else {
78            format!("data-{}", data_attr.into())
79        };
80        self.custom_variant(variant, class)
81    }
82
83    /// Add a supports variant class
84    pub fn supports(self, feature: impl Into<String>, class: impl Into<String>) -> Self {
85        let variant = format!("supports-{}", feature.into());
86        self.custom_variant(variant, class)
87    }
88
89    /// Build the class set
90    pub fn build(self) -> ClassSet {
91        self.class_set
92    }
93
94    /// Build the class set and convert to CSS string
95    pub fn build_string(self) -> String {
96        self.class_set.to_css_classes()
97    }
98}
99
100impl Default for ClassBuilder {
101    fn default() -> Self {
102        Self::new()
103    }
104}