canonrs-server 0.1.0

CanonRS server-side rendering support
use leptos::prelude::*;
use super::{Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator};
use canonrs_core::primitives::{BreadcrumbPrimitive, BreadcrumbItemPrimitive, BreadcrumbLinkPrimitive, BreadcrumbSeparatorPrimitive};
use canonrs_core::meta::ActivityState;

#[component]
pub fn BasicExample() -> impl IntoView {
    view! {
        <div style="display: flex; flex-direction: column; gap: 2rem;">
            <div>
                <h4>"Basic Breadcrumb"</h4>
                <Breadcrumb>
                    <BreadcrumbItem>
                        <BreadcrumbLink href="/">"Home"</BreadcrumbLink>
                    </BreadcrumbItem>
                    <BreadcrumbItem>
                        <BreadcrumbSeparator>"/"</BreadcrumbSeparator>
                    </BreadcrumbItem>
                    <BreadcrumbItem>
                        <BreadcrumbLink href="/products">"Products"</BreadcrumbLink>
                    </BreadcrumbItem>
                    <BreadcrumbItem>
                        <BreadcrumbSeparator>"/"</BreadcrumbSeparator>
                    </BreadcrumbItem>
                    <BreadcrumbItem>
                        <BreadcrumbLink href="/products/category">"Category"</BreadcrumbLink>
                    </BreadcrumbItem>
                    <BreadcrumbItem>
                        <BreadcrumbSeparator>"/"</BreadcrumbSeparator>
                    </BreadcrumbItem>
                    <BreadcrumbItem>
                        <BreadcrumbPage>"Item"</BreadcrumbPage>
                    </BreadcrumbItem>
                </Breadcrumb>
            </div>

            <div>
                <h4>"Collapsible Breadcrumb"</h4>
                <BreadcrumbPrimitive class=String::new()>
                    <BreadcrumbItemPrimitive class=String::new()>
                        <BreadcrumbLinkPrimitive href="/".to_string() state=ActivityState::Inactive class=String::new()>"Home"</BreadcrumbLinkPrimitive>
                    </BreadcrumbItemPrimitive>
                    <BreadcrumbItemPrimitive class=String::new()>
                        <BreadcrumbSeparatorPrimitive class=String::new()>"/"</BreadcrumbSeparatorPrimitive>
                    </BreadcrumbItemPrimitive>

                    <details data-breadcrumb-collapse="" id="breadcrumb-collapse-1">
                        <summary data-breadcrumb-ellipsis-trigger="">"..."</summary>
                        <div data-breadcrumb-collapse-content="">
                            <BreadcrumbLinkPrimitive href="/docs".to_string() state=ActivityState::Inactive class=String::new()>"Documentation"</BreadcrumbLinkPrimitive>
                            <BreadcrumbLinkPrimitive href="/docs/components".to_string() state=ActivityState::Inactive class=String::new()>"Components"</BreadcrumbLinkPrimitive>
                            <BreadcrumbLinkPrimitive href="/docs/components/forms".to_string() state=ActivityState::Inactive class=String::new()>"Forms"</BreadcrumbLinkPrimitive>
                        </div>
                    </details>

                    <BreadcrumbItemPrimitive class=String::new()>
                        <BreadcrumbSeparatorPrimitive class=String::new()>"/"</BreadcrumbSeparatorPrimitive>
                    </BreadcrumbItemPrimitive>
                    <BreadcrumbItemPrimitive class=String::new()>
                        <BreadcrumbLinkPrimitive href="/products".to_string() state=ActivityState::Inactive class=String::new()>"Products"</BreadcrumbLinkPrimitive>
                    </BreadcrumbItemPrimitive>
                    <BreadcrumbItemPrimitive class=String::new()>
                        <BreadcrumbSeparatorPrimitive class=String::new()>"/"</BreadcrumbSeparatorPrimitive>
                    </BreadcrumbItemPrimitive>
                    <BreadcrumbItemPrimitive class=String::new()>
                        <span data-rs-breadcrumb-page="" aria-current="page">"Current Item"</span>
                    </BreadcrumbItemPrimitive>
                </BreadcrumbPrimitive>
            </div>
        </div>
    }
}

#[component]
pub fn AutoExample() -> impl IntoView {
    use super::BreadcrumbAuto;
    use canonrs_core::{NavigationState, HeadingHierarchy, HeadingNode};
    use std::collections::HashMap;

    let mock_state = {
        let mut state = NavigationState::new();
        let headings = vec![
            HeadingNode {
                id: "introduction".to_string(),
                text: "Introduction".to_string(),
                level: 1,
                parent_id: None,
                children_ids: vec!["getting-started".to_string()],
            },
            HeadingNode {
                id: "getting-started".to_string(),
                text: "Getting Started".to_string(),
                level: 2,
                parent_id: Some("introduction".to_string()),
                children_ids: vec!["installation".to_string()],
            },
            HeadingNode {
                id: "installation".to_string(),
                text: "Installation".to_string(),
                level: 3,
                parent_id: Some("getting-started".to_string()),
                children_ids: vec![],
            },
        ];
        let mut id_to_index = HashMap::new();
        for (idx, node) in headings.iter().enumerate() {
            id_to_index.insert(node.id.clone(), idx);
        }
        state.heading_hierarchy = HeadingHierarchy { headings, id_to_index };
        state.current_heading_id = Some("installation".to_string());
        state
    };

    let state_signal = RwSignal::new(mock_state);
    provide_context(state_signal);

    view! {
        <div>
            <h4>"Auto Breadcrumb (from NavigationContext)"</h4>
            <BreadcrumbAuto />
        </div>
    }
}