import React, { DetailedHTMLProps, HTMLAttributes } from "react"; import { twMerge } from "tailwind-merge"; import { Moon, Sun } from "lucide-react"; type Props = DetailedHTMLProps< HTMLAttributes, HTMLDivElement > & { active?: boolean; setActive?: React.Dispatch>; iconWrapperProps?: DetailedHTMLProps< HTMLAttributes, HTMLDivElement >; defaultScheme?: "light" | "dark"; }; /** * # Color Scheme Loader * @className_wrapper twui-color-scheme-selector */ export default function ColorSchemeSelector({ active: initialActive, setActive: externalSetActive, iconWrapperProps, defaultScheme, ...props }: Props) { const [active, setActive] = React.useState(initialActive); React.useEffect(() => { const isDocumentDark = document.documentElement.classList.contains("dark"); const isDocumentLight = document.documentElement.classList.contains("light"); if (isDocumentDark) { setActive(true); return; } else if (isDocumentLight) { setActive(false); return; } const existingTheme = localStorage.getItem("theme"); if (existingTheme === "dark") { setActive(true); } else if (existingTheme === "light") { setActive(false); } else if (defaultScheme) { setActive(defaultScheme == "dark" ? false : true); } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) { setActive(true); } else if (typeof active == "undefined") { setActive(false); } }, []); React.useEffect(() => { if (typeof active == "undefined") return; if (active) { document.documentElement.className = "dark"; localStorage.setItem("theme", "dark"); } else { document.documentElement.className = "light"; localStorage.setItem("theme", "light"); } }, [active]); return (
); }