use leptos::*; use leptos_meta::Style; use thaw::*; #[slot] pub struct DemoCode { #[prop(default = true)] is_highlight: bool, children: Children, } #[component] pub fn Demo(demo_code: DemoCode, #[prop(optional)] children: Option) -> impl IntoView { let theme = use_theme(Theme::light); let css_vars = Memo::new(move |_| { let mut css_vars = String::new(); theme.with(|theme| { if theme.common.color_scheme == "dark" { css_vars.push_str("--demo-color: #ffffff60;"); css_vars.push_str("--demo-color-hover: #ffffffe0;"); css_vars.push_str("--demo-border-color: #383f52;"); css_vars.push_str("--demo-background-color: #242832;"); } else { css_vars.push_str("--demo-color: #00000060;"); css_vars.push_str("--demo-color-hover: #000000e0;"); css_vars.push_str(&format!( "--demo-border-color: {};", theme.common.border_color )); css_vars.push_str("--demo-background-color: #f9fafb;"); } }); css_vars }); let code_class = Memo::new(move |_| { theme.with(|theme| { format!( "demo-demo__code color-scheme--{}", theme.common.color_scheme ) }) }); let is_show_code = RwSignal::new(children.is_none()); let is_highlight = demo_code.is_highlight; let frag = (demo_code.children)(); let mut html = String::new(); for node in frag.nodes { match node { View::Text(text) => html.push_str(&text.content), _ => { leptos::logging::warn!("Only text nodes are supported as children of .") } } } view! {
{ if let Some(children) = children { view! {
{children()}
{ move || if is_show_code.get() { view! { } } else { view! { } } } { move || if is_show_code.get() { "Hide code" } else { "Show code" } }
}.into() } else { None } }
{ if is_highlight { view! { } } else { view! { } } }
} }