import { useState } from "react"; import { NavLink, Outlet, Navigate, useLocation } from "react-router-dom"; import { useAuth } from "../hooks/useAuth"; import { UpgradeProvider } from "../hooks/useUpgrade"; import Logo from "./Logo"; import { FuelGauge, NudgeDock } from "./Nudges"; import SkyCanvas from "./SkyCanvas"; import UpgradeModal from "./UpgradeModal"; import { AsteroidIcon, CometIcon, HelmetIcon, LaunchpadIcon, LaunchWindowIcon, OrbitIcon, PlanetIcon, RadarIcon, SatelliteDishIcon, } from "./icons/Icons"; // Theme in the icon, clarity in the label: the plain label always shows. // Eight stops: related pages share one entry (`also` keeps it lit on them). const NAV: { to: string; label: string; icon: typeof RadarIcon; end?: boolean; also?: string[] }[] = [ { to: "/app", label: "Home", icon: RadarIcon, end: true }, { to: "/app/sources", label: "Sources", icon: SatelliteDishIcon, also: ["/app/map"] }, { to: "/app/notebooks", label: "Notebooks", icon: PlanetIcon }, { to: "/app/studio", label: "Create", icon: LaunchWindowIcon, also: ["/app/launch-kit"] }, { to: "/app/videos", label: "Videos", icon: CometIcon }, { to: "/app/launchpad", label: "Launchpad", icon: LaunchpadIcon, also: ["/app/resurface"] }, { to: "/app/archive", label: "Library", icon: AsteroidIcon }, { to: "/app/voice", label: "Voice", icon: HelmetIcon }, ]; const COLLAPSED_KEY = "ns_sidebar_collapsed"; function readCollapsed(): boolean { try { return localStorage.getItem(COLLAPSED_KEY) === "1"; } catch { return false; } } export default function AppShell() { const { user, loading, logout } = useAuth(); const location = useLocation(); const [collapsed, setCollapsed] = useState(readCollapsed); const toggle = () => setCollapsed((c) => { try { localStorage.setItem(COLLAPSED_KEY, c ? "0" : "1"); } catch { /* private mode: remember for this visit only */ } return !c; }); if (loading) return