"use client"; import { useEffect, useState, useCallback } from "react"; import * as Icon from "react-bootstrap-icons"; import { Nav, Dropdown } from "react-bootstrap"; type Theme = "light" | "dark" | "auto"; const COOKIE = "NBN-theme"; const getCookie = (name: string) => { const m = document.cookie.match(new RegExp("(^|; )" + name + "=([^;]+)")); return m ? decodeURIComponent(m[2]) : null; }; const setCookie = (name: string, value: string) => { document.cookie = `${name}=${encodeURIComponent(value)}; Path=/; Max-Age=31536000; SameSite=Lax; Domain=specnext.dev`; }; const prefersDark = () => window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches; export default function ThemeDropdown() { const [mounted, setMounted] = useState(false); const [theme, setTheme] = useState("auto"); const apply = useCallback((t: Theme) => { const effective = t === "auto" ? (prefersDark() ? "dark" : "light") : t; document.documentElement.setAttribute("data-bs-theme", effective); }, []); useEffect(() => { setMounted(true); const v = getCookie(COOKIE); console.log("Cookie:", v); const initial: Theme = v === "light" || v === "dark" || v === "auto" ? (v as Theme) : "auto"; setTheme(initial); // Important: apply immediately so “auto” reflects system after hydration apply(initial); }, [apply]); useEffect(() => { if (!mounted || theme !== "auto") return; const mql = window.matchMedia("(prefers-color-scheme: dark)"); const onChange = () => apply("auto"); mql.addEventListener("change", onChange); const onPageShow = () => apply("auto"); window.addEventListener("pageshow", onPageShow); return () => { mql.removeEventListener("change", onChange); window.removeEventListener("pageshow", onPageShow); }; }, [mounted, theme, apply]); const choose = (t: Theme) => { setCookie(COOKIE, t); setTheme(t); apply(t); }; const isActive = (t: Theme) => theme === t; const ToggleIcon = !mounted ? Icon.CircleHalf : theme === "dark" ? Icon.MoonStarsFill : theme === "light" ? Icon.SunFill : Icon.CircleHalf; return ( ); }