import { Monitor, Moon, Sun } from "lucide-react"; import { useTranslation } from "react-i18next"; import { useTheme } from "../core/hooks/useTheme.ts"; import { useToggleVisibility } from "../core/hooks/useToggleVisiblility.ts"; import { cn } from "../core/utils/cn.ts"; import { Button } from "./UI/Button.tsx"; import { Subtle } from "./UI/Typography/Subtle.tsx"; type ThemePreference = "light" | "dark" | "system"; interface ThemeSwitcherProps { className?: string; disableHover?: boolean; } const TOOLTIP_TIMEOUT = 2000; // 2 seconds export default function ThemeSwitcher({ className: passedClassName = "", disableHover = false, }: ThemeSwitcherProps) { const [showTooltip, toggleShowTooltip] = useToggleVisibility({ timeout: TOOLTIP_TIMEOUT, }); 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] ?? "system"; setPreference(nextPreference); toggleShowTooltip(); }; const preferenceDisplayMap: Record = { light: t("theme.light"), dark: t("theme.dark"), system: t("theme.system"), }; const currentDisplayPreference = preferenceDisplayMap[preference]; return ( ); }