use dioxus::prelude::*; #[component] pub(crate) fn Foundation() -> Element { rsx! { main { class: "browse-page product-shell", header { class: "foundation-intro", h1 { "Foundation" } p { class: "product-lede", "Self-hosted typography, blueprint tokens, and reusable front-end states for upcoming product slices." } } section { id: "browse-foundation", class: "foundation-hero blueprint-panel", div { class: "foundation-hero-copy", p { class: "eyebrow", "Token and asset check" } h2 { "Blueprint styling foundation" } p { "This route keeps the front-end primitives visible without making implementation scaffolding the product home." } div { class: "button-row", button { class: "button button-primary", "Primary action" } button { class: "button button-ghost", "Ghost action" } } } div { class: "blueprint-preview", aria_label: "Blueprint placeholder preview", div { class: "blueprint-preview-grid" } span { class: "blueprint-axis blueprint-axis-x", "X" } span { class: "blueprint-axis blueprint-axis-y", "Y" } span { class: "blueprint-dimension", "120 × 86 × 42 mm" } } } section { class: "foundation-grid", aria_label: "Foundation primitives", for item in foundation_items() { FoundationCard { item } } } section { id: "ui-states", class: "state-grid", aria_label: "Reusable states", div { class: "state-card loading-state", span { class: "status-pill", "Loading" } div { class: "skeleton-line skeleton-wide" } div { class: "skeleton-line" } div { class: "skeleton-box" } } div { class: "state-card empty-state", span { class: "status-pill status-muted", "Empty" } h2 { "No projects yet" } p { "Empty browse states can use this panel before live feeds are connected." } } div { class: "state-card error-state", span { class: "status-pill status-error", "Error" } h2 { "Feed unavailable" } p { "Error states keep the browse surface useful without inventing data plumbing in this slice." } } } } } } #[derive(Clone, Copy, PartialEq)] struct FoundationItem { label: &'static str, title: &'static str, body: &'static str, meta: &'static str, } fn foundation_items() -> [FoundationItem; 3] { [ FoundationItem { label: "Panel", title: "Project card surface", body: "A crisp bordered card for future model summaries, previews, and maker metadata.", meta: "primitive/card", }, FoundationItem { label: "Input", title: "Search and filter shell", body: "Reusable input styling for browse, profile, and publish flows without binding to a data source yet.", meta: "primitive/input", }, FoundationItem { label: "Status", title: "Metadata and chips", body: "Compact mono labels for license, dimensions, file state, and feed status.", meta: "primitive/status", }, ] } #[component] fn FoundationCard(item: FoundationItem) -> Element { rsx! { article { class: "foundation-card card-surface", div { class: "card-media blueprint-media", span { class: "status-pill", "{item.label}" } } div { class: "card-body", h2 { class: "card-title", "{item.title}" } p { "{item.body}" } span { class: "card-meta", "{item.meta}" } } } } } #[cfg(test)] mod tests { use super::*; #[test] fn foundation_items_cover_base_primitives() { let items = foundation_items(); assert!(items.iter().any(|item| item.label == "Panel")); assert!(items.iter().any(|item| item.label == "Input")); assert!(items.iter().any(|item| item.label == "Status")); } #[test] fn foundation_copy_avoids_workflow_marketing() { let combined = foundation_items() .iter() .map(|item| item.body) .collect::>() .join(" "); assert!(!combined.contains("Jira")); assert!(!combined.contains("Polytoken")); } }