From c8e6d1813916577a0dc1b5b22c91de7aa53e8960 Mon Sep 17 00:00:00 2001 From: Greg Johnston Date: Fri, 3 Mar 2023 10:44:15 -0500 Subject: [PATCH] feat: allow multiple class names in `view!` macro `class = ` (closes #612) (#614) --- leptos_dom/src/html.rs | 11 +++++++++++ leptos_dom/src/macro_helpers/into_class.rs | 9 +++++++-- leptos_macro/src/view.rs | 5 ++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/leptos_dom/src/html.rs b/leptos_dom/src/html.rs index c3e4981cf..990d9de52 100644 --- a/leptos_dom/src/html.rs +++ b/leptos_dom/src/html.rs @@ -576,6 +576,17 @@ impl HtmlElement { } } + /// Adds a list of classes separated by ASCII whitespace to an element. + #[track_caller] + pub fn classes(self, classes: impl Into>) -> Self { + let classes = classes.into(); + let mut this = self; + for class in classes.split_ascii_whitespace() { + this = this.class(class.to_string(), true); + } + this + } + /// Sets a property on an element. #[track_caller] pub fn prop( diff --git a/leptos_dom/src/macro_helpers/into_class.rs b/leptos_dom/src/macro_helpers/into_class.rs index 344838013..a015bc544 100644 --- a/leptos_dom/src/macro_helpers/into_class.rs +++ b/leptos_dom/src/macro_helpers/into_class.rs @@ -107,10 +107,15 @@ pub(crate) fn class_expression( if force || !HydrationCtx::is_hydrating() { let class_name = wasm_bindgen::intern(class_name); + if value { - class_list.add_1(class_name).unwrap_throw(); + if let Err(e) = class_list.add_1(class_name) { + crate::error!("[HtmlElement::class()] {e:?}"); + } } else { - class_list.remove_1(class_name).unwrap_throw(); + if let Err(e) = class_list.remove_1(class_name) { + crate::error!("[HtmlElement::class()] {e:?}"); + } } } } diff --git a/leptos_macro/src/view.rs b/leptos_macro/src/view.rs index 3c3ba4a29..5c15b6ff8 100644 --- a/leptos_macro/src/view.rs +++ b/leptos_macro/src/view.rs @@ -748,7 +748,10 @@ fn element_to_tokens( None => quote! {}, Some(class) => { quote! { - .class(#class, true) + .classes( + #[allow(unused_braces)] + #class + ) } } };