// content_graph/related_content.rs // // Sidebar widget showing content related to the current node. // Pure HTML — no JS, fully SSR-safe. // Data comes from RELATED_NODES static map generated at build time. use leptos::prelude::*; use super::generated::related::{RelatedNode, RELATED_NODES}; // ── Kind display helpers ────────────────────────────────────────────────────── fn kind_label(kind: &str) -> &'static str { match kind { "Implements" | "ImplementedBy" => "implements", "RelatedTo" | "RelatedFrom" => "related", "PartOf" | "ParentOf" => "part of", "References" | "ReferencedBy" => "references", "Extends" | "ExtendedBy" => "extends", "ManifestsIn" => "manifests in", "Resolves" => "resolves", "Complements" => "complements", "DependsOn" => "depends on", "DocumentedIn" => "documented in", _ => kind, } } fn kind_css(kind: &str) -> &'static str { match kind { "Implements" | "ImplementedBy" => "ds-badge-primary", "RelatedTo" | "RelatedFrom" => "ds-badge-secondary", "PartOf" | "ParentOf" => "ds-badge-accent", "References" | "ReferencedBy" => "ds-badge-neutral", _ => "ds-badge-ghost", } } // ── Component ───────────────────────────────────────────────────────────────── /// Sidebar list of related content items for a given node. /// /// Renders nothing if the node has no relationships. #[component] pub fn RelatedContent(node_id: String) -> impl IntoView { let related: &'static [RelatedNode] = RELATED_NODES .iter() .find(|(id, _)| *id == node_id.as_str()) .map(|(_, nodes)| *nodes) .unwrap_or(&[]); if related.is_empty() { return view! { <> }.into_any(); } view! { }.into_any() }