diff --git a/leptos_reactive/Cargo.toml b/leptos_reactive/Cargo.toml index 45169e934..35b7311e1 100644 --- a/leptos_reactive/Cargo.toml +++ b/leptos_reactive/Cargo.toml @@ -27,7 +27,7 @@ bytecheck = { version = "0.7", features = [ rustc-hash = "1" serde-wasm-bindgen = "0.6" serde_json = "1" -spin-sdk = { version = "2", optional = true } +spin-sdk = { version = "3", optional = true } base64 = "0.22" thiserror = "1" tokio = { version = "1", features = [ diff --git a/meta/src/body.rs b/meta/src/body.rs index e0a2aaf49..f67cfa314 100644 --- a/meta/src/body.rs +++ b/meta/src/body.rs @@ -11,6 +11,8 @@ pub struct BodyContext { #[cfg(feature = "ssr")] class: Rc>>, #[cfg(feature = "ssr")] + id: Rc>>, + #[cfg(feature = "ssr")] attributes: Rc>>, } @@ -24,6 +26,13 @@ impl BodyContext { leptos::leptos_dom::ssr::escape_attr(&val.get()) ) }); + + let id = self.id.borrow().as_ref().map(|val| { + format!( + "id=\"{}\"", + leptos::leptos_dom::ssr::escape_attr(&val.get()) + ) + }); let attributes = self.attributes.borrow(); let attributes = (!attributes.is_empty()).then(|| { attributes @@ -41,7 +50,7 @@ impl BodyContext { .join(" ") }); - let mut val = [class, attributes] + let mut val = [id, class, attributes] .into_iter() .flatten() .collect::>() @@ -92,6 +101,9 @@ pub fn Body( /// The `class` attribute on the ``. #[prop(optional, into)] class: Option, + /// The `id` attribute on the ``. + #[prop(optional, into)] + id: Option, /// Arbitrary attributes to add to the `` #[prop(attrs)] attributes: Vec<(&'static str, Attribute)>, @@ -112,15 +124,27 @@ pub fn Body( }); } + + if let Some(id) = id { + create_render_effect({ + let el = el.clone(); + move |_| { + let value = id.get(); + _ = el.set_attribute("id", &value); + } + }); + } for (name, value) in attributes { leptos::leptos_dom::attribute_helper(el.unchecked_ref(), name.into(), value); } } else if #[cfg(feature = "ssr")] { let meta = crate::use_head(); *meta.body.class.borrow_mut() = class; + *meta.body.id.borrow_mut() = id; meta.body.attributes.borrow_mut().extend(attributes); } else { _ = class; + _ = id; _ = attributes; #[cfg(debug_assertions)]