use crate::responsive::Breakpoint;
use super::ClassSet;
#[derive(Debug, Clone)]
pub struct ClassBuilder {
class_set: ClassSet,
}
impl ClassBuilder {
pub fn new() -> Self {
Self {
class_set: ClassSet::new(),
}
}
pub fn class(mut self, class: impl Into<String>) -> Self {
self.class_set.add_class(class);
self
}
pub fn classes(mut self, classes: impl IntoIterator<Item = String>) -> Self {
self.class_set.add_classes(classes);
self
}
pub fn responsive(mut self, breakpoint: Breakpoint, class: impl Into<String>) -> Self {
self.class_set.add_responsive_class(breakpoint, class);
self
}
pub fn conditional(mut self, condition: impl Into<String>, class: impl Into<String>) -> Self {
self.class_set.add_conditional_class(condition, class);
self
}
pub fn custom(mut self, property: impl Into<String>, value: impl Into<String>) -> Self {
self.class_set.add_custom(property, value);
self
}
pub fn custom_variant(mut self, variant: impl Into<String>, class: impl Into<String>) -> Self {
let variant = variant.into();
let class = class.into();
self.class_set.add_conditional_class(variant, class);
self
}
pub fn aria(self, aria_attr: impl Into<String>, class: impl Into<String>) -> Self {
let variant = format!("aria-{}", aria_attr.into());
self.custom_variant(variant, class)
}
pub fn data(self, data_attr: impl Into<String>, value: Option<String>, class: impl Into<String>) -> Self {
let variant = if let Some(val) = value {
format!("data-{}={}", data_attr.into(), val)
} else {
format!("data-{}", data_attr.into())
};
self.custom_variant(variant, class)
}
pub fn supports(self, feature: impl Into<String>, class: impl Into<String>) -> Self {
let variant = format!("supports-{}", feature.into());
self.custom_variant(variant, class)
}
pub fn build(self) -> ClassSet {
self.class_set
}
pub fn build_string(self) -> String {
self.class_set.to_css_classes()
}
}
impl Default for ClassBuilder {
fn default() -> Self {
Self::new()
}
}