diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx index 3d66a3c56..9e8f04cf4 100644 --- a/apps/web/src/app/projects/page.tsx +++ b/apps/web/src/app/projects/page.tsx @@ -18,6 +18,7 @@ import { useRouter } from "next/navigation"; import { useCallback, useEffect, useState } from "react"; import { DeleteProjectDialog } from "@/components/delete-project-dialog"; import { RenameProjectDialog } from "@/components/rename-project-dialog"; +import { ThemeToggle } from "@/components/theme-toggle"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Checkbox } from "@/components/ui/checkbox"; @@ -215,6 +216,7 @@ export default function ProjectsPage() { Select Projects + )} diff --git a/apps/web/src/components/theme-toggle.tsx b/apps/web/src/components/theme-toggle.tsx index 8302a19c6..b843b318a 100644 --- a/apps/web/src/components/theme-toggle.tsx +++ b/apps/web/src/components/theme-toggle.tsx @@ -3,6 +3,7 @@ import { Button } from "./ui/button"; import { Sun, Moon } from "lucide-react"; import { useTheme } from "next-themes"; +import { useEffect, useState } from "react"; interface ThemeToggleProps { className?: string; @@ -10,16 +11,27 @@ interface ThemeToggleProps { export function ThemeToggle({ className }: ThemeToggleProps) { const { theme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + // Wait for client-side render to avoid hydration mismatch + useEffect(() => setMounted(true), []); + + if (!mounted) return null; // don't render on the server return ( ); -} +} \ No newline at end of file