tailwind_rs_core/classes/
class_builder.rs

1//! ClassBuilder implementation
2//!
3//! This module contains the ClassBuilder struct and its methods.
4//!
5//! ## Example
6//!
7//! ```rust
8//! use tailwind_rs_core::ClassBuilder;
9//!
10//! // Create type-safe Tailwind classes
11//! let class_builder = ClassBuilder::new();
12//! let class_set = class_builder
13//!     .class("bg-blue-500")
14//!     .class("text-white")
15//!     .class("px-4")
16//!     .class("py-2")
17//!     .class("rounded-lg")
18//!     .class("hover:bg-blue-600")
19//!     .build();
20//!
21//! // Convert to CSS classes
22//! let css_classes = class_set.to_css_classes();
23//! // Result: "bg-blue-500 text-white px-4 py-2 rounded-lg hover:bg-blue-600"
24//! ```
25
26use crate::responsive::Breakpoint;
27use super::ClassSet;
28
29/// Builder for creating class sets
30#[derive(Debug, Clone)]
31pub struct ClassBuilder {
32    class_set: ClassSet,
33}
34
35impl ClassBuilder {
36    /// Create a new class builder
37    pub fn new() -> Self {
38        Self {
39            class_set: ClassSet::new(),
40        }
41    }
42
43    /// Add a base class
44    pub fn class(mut self, class: impl Into<String>) -> Self {
45        self.class_set.add_class(class);
46        self
47    }
48
49    /// Add multiple base classes
50    pub fn classes(mut self, classes: impl IntoIterator<Item = String>) -> Self {
51        self.class_set.add_classes(classes);
52        self
53    }
54
55    /// Add a responsive class
56    pub fn responsive(mut self, breakpoint: Breakpoint, class: impl Into<String>) -> Self {
57        self.class_set.add_responsive_class(breakpoint, class);
58        self
59    }
60
61    /// Add a conditional class
62    pub fn conditional(mut self, condition: impl Into<String>, class: impl Into<String>) -> Self {
63        self.class_set.add_conditional_class(condition, class);
64        self
65    }
66
67    /// Add a custom CSS property
68    pub fn custom(mut self, property: impl Into<String>, value: impl Into<String>) -> Self {
69        self.class_set.add_custom(property, value);
70        self
71    }
72
73    /// Add a custom variant class (Tailwind v4.1.13 @custom-variant support)
74    pub fn custom_variant(mut self, variant: impl Into<String>, class: impl Into<String>) -> Self {
75        let variant = variant.into();
76        let class = class.into();
77        
78        // Add the variant as a conditional class
79        self.class_set.add_conditional_class(variant, class);
80        self
81    }
82
83    /// Add an ARIA variant class
84    pub fn aria(self, aria_attr: impl Into<String>, class: impl Into<String>) -> Self {
85        let variant = format!("aria-{}", aria_attr.into());
86        self.custom_variant(variant, class)
87    }
88
89    /// Add a data variant class
90    pub fn data(self, data_attr: impl Into<String>, value: Option<String>, class: impl Into<String>) -> Self {
91        let variant = if let Some(val) = value {
92            format!("data-{}={}", data_attr.into(), val)
93        } else {
94            format!("data-{}", data_attr.into())
95        };
96        self.custom_variant(variant, class)
97    }
98
99    /// Add a supports variant class
100    pub fn supports(self, feature: impl Into<String>, class: impl Into<String>) -> Self {
101        let variant = format!("supports-{}", feature.into());
102        self.custom_variant(variant, class)
103    }
104
105    /// Build the class set
106    pub fn build(self) -> ClassSet {
107        self.class_set
108    }
109
110    /// Build the class set and convert to CSS string
111    pub fn build_string(self) -> String {
112        self.class_set.to_css_classes()
113    }
114}
115
116impl Default for ClassBuilder {
117    fn default() -> Self {
118        Self::new()
119    }
120}