feat(style): compose generated class states

Add CssClass/CssClasses with/with_if helpers so nested partial view data can compose generated CSS constants without ad hoc class strings.

req: style/003

req: component/003
This commit is contained in:
slhx agent
2026-06-02 07:24:10 +02:00
parent a138f92b33
commit 3ab89adf2d
4 changed files with 29 additions and 9 deletions
+24
View File
@@ -186,6 +186,14 @@ impl CssClass {
pub const fn as_str(self) -> &'static str {
self.name
}
pub fn with(self, class: CssClass) -> CssClasses {
CssClasses::from([self, class])
}
pub fn with_if(self, condition: bool, class: CssClass) -> CssClasses {
CssClasses::from(self).with_if(condition, class)
}
}
impl AsRef<str> for CssClass {
@@ -315,6 +323,22 @@ impl CssClasses {
pub fn as_str(&self) -> &str {
&self.names
}
pub fn with(mut self, class: CssClass) -> Self {
if !self.names.is_empty() {
self.names.push(' ');
}
self.names.push_str(class.as_str());
self
}
pub fn with_if(self, condition: bool, class: CssClass) -> Self {
if condition {
self.with(class)
} else {
self
}
}
}
impl From<CssClass> for CssClasses {
+3
View File
@@ -141,6 +141,9 @@ fn generated_css_classes_join_for_hemplate_dynamic_class_attrs() {
assert_eq!(classes.as_str(), "work-card is-selected");
assert_eq!(classes.to_string(), "work-card is-selected");
assert_eq!(CARD.with(SELECTED).as_str(), "work-card is-selected");
assert_eq!(CARD.with_if(true, SELECTED).as_str(), "work-card is-selected");
assert_eq!(CARD.with_if(false, SELECTED).as_str(), "work-card");
}
#[test]