tinkr 0.0.43

Tinkr is a web framework for quickly building full-stack web applications with Leptos.
Documentation
use leptos::prelude::*;

#[component]
pub fn FormSection(
    #[prop(into)] title: String,
    #[prop(optional, into)] class: Option<String>,
    children: Children,
) -> impl IntoView {
    let base_class = "";
    let final_class = match class {
        Some(custom_class) => format!("{} {}", base_class, custom_class),
        None => base_class.to_string(),
    };

    view! {
        <div class=final_class>
            <h3 class="text-lg font-medium text-neutral-900 dark:text-neutral-100 mb-4">{title}</h3>
            {children()}
        </div>
    }
}

#[component]
pub fn FormGrid(
    #[prop(optional)] cols: Option<u8>,
    #[prop(optional, into)] class: Option<String>,
    children: Children,
) -> impl IntoView {
    let cols_class = match cols {
        Some(1) => "grid-cols-1",
        Some(2) => "grid-cols-1 md:grid-cols-2",
        Some(3) => "grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
        Some(4) => "grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
        _ => "grid-cols-1",
    };

    let base_class = format!("grid {} gap-4", cols_class);
    let final_class = match class {
        Some(custom_class) => format!("{} {}", base_class, custom_class),
        None => base_class.to_string(),
    };

    view! { <div class=final_class>{children()}</div> }
}

#[component]
pub fn FormActions(
    #[prop(optional, into)] class: Option<String>,
    children: Children,
) -> impl IntoView {
    let base_class = "flex justify-between items-center pt-4 border-t dark:border-neutral-700";
    let final_class = match class {
        Some(custom_class) => format!("{} {}", base_class, custom_class),
        None => base_class.to_string(),
    };

    view! { <div class=final_class>{children()}</div> }
}