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 (