canonrs-server 0.1.0

CanonRS server-side rendering support
use leptos::prelude::*;
use super::accordion_boundary::{Accordion, AccordionItem, AccordionTrigger, AccordionContent, AccordionSelection, DisabledState};
use canonrs_core::primitives::layout::stack::{StackPrimitive as Stack, StackDirection, StackGap};

#[component]
pub fn AccordionShowcasePreview() -> impl IntoView {
    view! {
        <Stack direction=StackDirection::Vertical gap=StackGap::Lg>
            <Accordion>
                <AccordionItem>
                    <AccordionTrigger>"What is CanonRS?"</AccordionTrigger>
                    <AccordionContent>"CanonRS is a design system built in Rust and Leptos with a 3-layer architecture."</AccordionContent>
                </AccordionItem>
                <AccordionItem>
                    <AccordionTrigger>"How does it work?"</AccordionTrigger>
                    <AccordionContent>"Primitives define structure. Behaviors add interactivity. UI components compose both."</AccordionContent>
                </AccordionItem>
                <AccordionItem>
                    <AccordionTrigger>"Is SSR supported?"</AccordionTrigger>
                    <AccordionContent>"Yes. All state is defined at the primitive level via data-rs-state."</AccordionContent>
                </AccordionItem>
            </Accordion>
            <p data-rs-showcase-preview-anchor="">
                "Open/close state governed by DOM — single or multiple selection."
            </p>
            <Stack direction=StackDirection::Vertical gap=StackGap::Sm>
                <span data-rs-showcase-preview-label="">"Multiple selection"</span>
                <Accordion selection=AccordionSelection::Multiple>
                    <AccordionItem>
                        <AccordionTrigger>"Section A"</AccordionTrigger>
                        <AccordionContent>"Content for section A."</AccordionContent>
                    </AccordionItem>
                    <AccordionItem>
                        <AccordionTrigger>"Section B"</AccordionTrigger>
                        <AccordionContent>"Content for section B."</AccordionContent>
                    </AccordionItem>
                </Accordion>
            </Stack>
            <Stack direction=StackDirection::Vertical gap=StackGap::Sm>
                <span data-rs-showcase-preview-label="">"Non-collapsible"</span>
                <Accordion collapsible="false".to_string()>
                    <AccordionItem>
                        <AccordionTrigger>"Always one open"</AccordionTrigger>
                        <AccordionContent>"This accordion always keeps one item open."</AccordionContent>
                    </AccordionItem>
                    <AccordionItem>
                        <AccordionTrigger>"Second item"</AccordionTrigger>
                        <AccordionContent>"Click to switch — cannot close all."</AccordionContent>
                    </AccordionItem>
                </Accordion>
            </Stack>
            <Stack direction=StackDirection::Vertical gap=StackGap::Sm>
                <span data-rs-showcase-preview-label="">"Disabled item"</span>
                <Accordion>
                    <AccordionItem>
                        <AccordionTrigger>"Active item"</AccordionTrigger>
                        <AccordionContent>"This item is interactive."</AccordionContent>
                    </AccordionItem>
                    <AccordionItem disabled=DisabledState::Disabled>
                        <AccordionTrigger disabled=DisabledState::Disabled>"Disabled item"</AccordionTrigger>
                        <AccordionContent>"This content is not reachable."</AccordionContent>
                    </AccordionItem>
                </Accordion>
            </Stack>
        </Stack>
    }
}