"use client"; import { Monitor, Moon, Sun, Palette } from "lucide-react"; import { useEffect, useState } from "react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; type Theme = "light" | "dark" | "system" | "github-dark" | "dracula" | "rose-pine" | "tokyo-night"; function getStoredTheme(): Theme { if (typeof window === "undefined") return "dark"; return (localStorage.getItem("theme") as Theme) || "system"; } function applyTheme(theme: Theme) { const html = document.documentElement; const isSystemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; const activeTheme: string = theme === "system" ? (isSystemDark ? "dark" : "light") : theme; if (activeTheme === "light") { html.classList.remove("dark"); html.removeAttribute("data-theme"); } else { html.classList.add("dark"); if (activeTheme !== "dark" && activeTheme !== "system") { html.setAttribute("data-theme", activeTheme); } else { html.removeAttribute("data-theme"); } } } export function ThemeToggle() { const [theme, setTheme] = useState("dark"); useEffect(() => { const stored = getStoredTheme(); setTheme(stored); applyTheme(stored); const mq = window.matchMedia("(prefers-color-scheme: dark)"); const handler = () => { if (getStoredTheme() === "system") { applyTheme("system"); } }; mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); }, []); const changeTheme = (newTheme: Theme) => { setTheme(newTheme); localStorage.setItem("theme", newTheme); applyTheme(newTheme); }; return ( changeTheme("light")} className="cursor-pointer"> Light changeTheme("dark")} className="cursor-pointer"> Default Dark changeTheme("github-dark")} className="cursor-pointer"> GitHub Dark changeTheme("dracula")} className="cursor-pointer"> Dracula changeTheme("rose-pine")} className="cursor-pointer"> Rosé Pine changeTheme("tokyo-night")} className="cursor-pointer"> Tokyo Night changeTheme("system")} className="cursor-pointer border-t mt-1 pt-1"> System ); } export default ThemeToggle;