diff --git a/panel/index.html b/panel/index.html index 02119e7..8de346c 100644 --- a/panel/index.html +++ b/panel/index.html @@ -1,9 +1,20 @@ - + Felis · Control Panel +
diff --git a/panel/src/App.tsx b/panel/src/App.tsx index b3dced4..fa55429 100644 --- a/panel/src/App.tsx +++ b/panel/src/App.tsx @@ -1,4 +1,5 @@ import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; +import { ThemeProvider } from "@/lib/theme"; import { TierProvider } from "@/lib/tier"; import { AppShell } from "@/components/AppShell"; import { RequireAdmin } from "@/components/RequireAdmin"; @@ -23,8 +24,9 @@ import { FleetTable } from "@/pages/ops/FleetTable"; // the split is by concern, not by tier. TierProvider fetches /me once at boot. export default function App() { return ( - - + + + {/* Pre-app local-password surfaces (spec §B1). They sit OUTSIDE RequireAuth — RequireAuth redirects here — and outside AppShell, so @@ -62,5 +64,6 @@ export default function App() { + ); } diff --git a/panel/src/components/AppShell.tsx b/panel/src/components/AppShell.tsx index 46c6c07..22da94f 100644 --- a/panel/src/components/AppShell.tsx +++ b/panel/src/components/AppShell.tsx @@ -1,19 +1,20 @@ import { useEffect } from "react"; import { NavLink, Outlet } from "react-router-dom"; -import { Cat, Globe } from "lucide-react"; +import { Cat, Globe, Sun, Moon } from "lucide-react"; import { useTranslation } from "react-i18next"; import * as SelectPrimitive from "@radix-ui/react-select"; import { cn } from "@/lib/utils"; import { useTier } from "@/lib/tier"; import { visibleSections } from "@/lib/nav"; import { Select, SelectContent, SelectItem } from "@/components/ui/select"; +import { useTheme } from "@/lib/theme"; function LangToggle() { const { i18n } = useTranslation(); return (