canonrs-server 0.1.0

CanonRS server-side rendering support
use leptos::prelude::*;
use canonrs_core::infra::uid::generate;
use crate::ui::card::{Card, CardHeader, CardContent, CardFooter};

#[derive(Clone, Copy, PartialEq, Default)]
pub enum CardVariant {
    #[default] Default,
    Interactive,
    Outlined,
    Elevated,
}
impl CardVariant {
    pub fn as_str(&self) -> &'static str {
        match self {
            Self::Default     => "default",
            Self::Interactive => "interactive",
            Self::Outlined    => "outlined",
            Self::Elevated    => "elevated",
        }
    }
}

#[component]
pub fn CardBlock(
    #[prop(optional)] header: Option<ChildrenFn>,
    #[prop(optional)] content: Option<ChildrenFn>,
    #[prop(optional)] footer: Option<ChildrenFn>,
    #[prop(default = CardVariant::Default)] variant: CardVariant,
    #[prop(into, default = String::new())] class: String,
) -> impl IntoView {
    let uid = generate("bl");
    let header  = StoredValue::new(header);
    let content = StoredValue::new(content);
    let footer  = StoredValue::new(footer);
    view! {
        <article attr:data-rs-card="" attr:data-rs-uid=uid>
            <Card variant=variant.as_str().to_string() class=class>
                {move || header.get_value().map(|h| view! { <CardHeader>{h()}</CardHeader> })}
                {move || content.get_value().map(|c| view! { <CardContent>{c()}</CardContent> })}
                {move || footer.get_value().map(|f| view! { <CardFooter>{f()}</CardFooter> })}
            </Card>
        </article>
    }
}