import { useTheme } from "@core/hooks/useTheme.ts"; import { cn } from "@core/utils/cn.ts"; import { Monitor, Moon, Sun } from "lucide-react"; import { useTranslation } from "react-i18next"; import { Subtle } from "./UI/Typography/Subtle.tsx"; import { Button } from "./UI/Button.tsx"; type ThemePreference = "light" | "dark" | "system"; interface ThemeSwitcherProps { className?: string; disableHover?: boolean; } export default function ThemeSwitcher({ className: passedClassName = "", disableHover = false, }: ThemeSwitcherProps) { const { preference, setPreference } = useTheme(); const { t } = useTranslation("ui"); const iconBaseClass = "size-4 flex-shrink-0 text-gray-500 dark:text-gray-400 transition-colors duration-150"; const iconHoverClass = !disableHover ? "group-hover:text-gray-700 dark:group-hover:text-gray-200" : ""; const combinedIconClass = cn(iconBaseClass, iconHoverClass); const themeIcons = { light: , dark: , system: , }; const toggleTheme = () => { const preferences: ThemePreference[] = ["light", "dark", "system"]; const currentIndex = preferences.indexOf(preference); const nextPreference = preferences[(currentIndex + 1) % preferences.length]; setPreference(nextPreference); }; const preferenceDisplayMap: Record = { light: t("theme.light"), dark: t("theme.dark"), system: t("theme.system"), }; const currentDisplayPreference = preferenceDisplayMap[preference]; return ( ); }