Components

Collapsible

Documentation

use leptos::prelude::*;
use tailwind_fuse::*;

use crate::behavior::{
    CollapsibleContent as CollapsibleContentPrimitive, CollapsibleRoot as CollapsibleRootPrimitive,
    CollapsibleTrigger as CollapsibleTriggerPrimitive,
};

#[derive(TwClass)]
#[tw(class = "space-y-2")]
struct CollapsibleStyle {}

#[derive(TwClass)]
#[tw(
    class = "flex w-full items-center justify-between rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 disabled:pointer-events-none"
)]
struct CollapsibleTriggerStyle {}

#[derive(TwClass)]
#[tw(
    class = "overflow-hidden text-sm data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-top-1 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-1"
)]
struct CollapsibleContentStyle {}

#[component]
pub fn Collapsible(
    #[prop(optional)] class: &'static str,
    open: RwSignal<bool>,
    children: Children,
) -> impl IntoView {
    let class = CollapsibleStyle {}.with_class(class);
    view! {
        <CollapsibleRootPrimitive class=class open=open>
            {children()}
        </CollapsibleRootPrimitive>
    }
}

#[component]
pub fn CollapsibleTrigger(
    #[prop(optional)] class: &'static str,
    #[prop(optional, into)] disabled: Signal<bool>,
    children: Children,
) -> impl IntoView {
    let class = CollapsibleTriggerStyle {}.with_class(class);
    view! {
        <CollapsibleTriggerPrimitive class=class disabled=disabled>
            {children()}
        </CollapsibleTriggerPrimitive>
    }
}

#[component]
pub fn CollapsibleContent(
    #[prop(optional)] class: &'static str,
    children: ChildrenFn,
) -> impl IntoView {
    let class = CollapsibleContentStyle {}.with_class(class);
    view! { <CollapsibleContentPrimitive class=class>{children()}</CollapsibleContentPrimitive> }
}
Click to expand