import { useEffect, useState } from "react"; import { Listbox } from "@headlessui/react"; import clsx from "clsx"; const themes = [ { name: "Light", value: "light", icon: LightIcon }, { name: "Dark", value: "dark", icon: DarkIcon }, { name: "System", value: "system", icon: SystemIcon }, ]; function LightIcon(props) { return ( ); } function DarkIcon(props) { return ( ); } function SystemIcon(props) { return ( ); } export function ThemeSelector(props) { let [selectedTheme, setSelectedTheme] = useState(); useEffect(() => { if (selectedTheme) { document.documentElement.setAttribute("data-theme", selectedTheme.value); } else { setSelectedTheme( themes.find((theme) => theme.value === document.documentElement.getAttribute("data-theme")) ); } }, [selectedTheme]); useEffect(() => { let handler = () => setSelectedTheme(themes.find((theme) => theme.value === (window.localStorage.theme ?? "system"))); window.addEventListener("storage", handler); return () => window.removeEventListener("storage", handler); }, []); return ( Theme {themes.map((theme) => ( clsx("flex cursor-pointer select-none items-center rounded-[0.625rem] p-1", { "text-brand-dark dark:text-brand-light": selected, "text-slate-800 dark:text-slate-100": active && !selected, "text-slate-700 dark:text-slate-400": !active && !selected, "bg-slate-100 dark:bg-slate-900/40": active, }) }> {({ selected }) => ( <>
{theme.name}
)}
))}
); }