//! Application shell: skip link, header, router, footer. use leptos::prelude::*; use leptos_router::components::{A, Redirect, Route, Router, Routes}; use leptos_router::path; use web::model::SessionProbe; use web::viewmodel::{NAV_ITEMS, PRODUCT_NAME, dashboard_nav_visible}; use super::components::dashboard::Dashboard; use super::components::deployment::ConfigResource; use super::components::feedback::SessionSkeleton; use super::components::icons::{Icon, IconKind}; use super::components::landing::Landing; use super::components::theme::ThemeToggle; /// Root component, mounted to `
` by `main.rs`. #[component] pub fn App() -> impl IntoView { // One app-level session probe, shared with the header and the `/dashboard` // guard so navigation gating and route guarding read a single source of // truth. `LocalResource` is `Copy`, so context provision is cheap. let session = LocalResource::new(|| async { crate::api::probe_session().await }); provide_context(session); // One app-level config resource, shared with the landing CTA and the // dashboard deployment card so both read a single `/api/config` fetch. let config: ConfigResource = LocalResource::new(|| async { crate::api::fetch_config().await }); provide_context(config); view! {"404"
"That route does not exist in this client."
"Back to landing"