diff --git a/src/app/(mobile)/m/dashboard-view.tsx b/src/app/(mobile)/m/dashboard-view.tsx
index 3730aef..b895153 100644
--- a/src/app/(mobile)/m/dashboard-view.tsx
+++ b/src/app/(mobile)/m/dashboard-view.tsx
@@ -3,7 +3,8 @@
import { useState, useEffect, useCallback, useRef } from "react";
import { useRouter } from "next/navigation";
import { toast } from "sonner";
-import { RefreshCw, X } from "lucide-react";
+import { RefreshCw, X, Moon, Sun } from "lucide-react";
+import { useTheme } from "next-themes";
import getPocketBase from "@/lib/pocketbase";
import type {
BossDashboardData,
@@ -56,6 +57,19 @@ export default function BossDashboardView() {
realtimeStatusRef.current = realtimeStatus;
}, [realtimeStatus]);
+ // Light/dark toggle — next-themes mounted check avoids SSR/hydration
+ // mismatch (next-themes returns "light" before mount regardless of the
+ // persisted value).
+ const { theme: colorMode, setTheme: setColorMode } = useTheme();
+ const [mounted, setMounted] = useState(false);
+ useEffect(() => {
+ // eslint-disable-next-line react-hooks/set-state-in-effect
+ setMounted(true);
+ }, []);
+ const toggleColorMode = useCallback(() => {
+ setColorMode(colorMode === "dark" ? "light" : "dark");
+ }, [colorMode, setColorMode]);
+
const fetchData = useCallback(async () => {
// Pre-check auth — if PB has no valid token, redirect via the router so
// we preserve the in-memory state of the dashboard (search, tabs, sheet)
@@ -225,7 +239,7 @@ export default function BossDashboardView() {
- Good {greeting()}, {firstName}.
+ Good {greeting()}, {firstName}.