import * as React from "react"; import { Moon, Sun, Monitor } from "lucide-react"; import { useTheme, type ThemePreference } from "@/hooks/use-theme"; import { cn } from "@/lib/cn"; export interface ThemeToggleProps extends Omit, "onClick"> { /** Whether to show the third "system" option. Default: true. */ showSystem?: boolean; /** Label for screen readers. */ ariaLabel?: string; } /** * ThemeToggle - theme toggle with 2 or 3 states (light/dark/system). * Client-side only. Wrap with a mounting boundary if needed. */ const ThemeToggle = React.forwardRef( ({ className, showSystem = true, ariaLabel, ...props }, ref) => { const { preference, resolved, setPreference } = useTheme(); const cycle: ThemePreference[] = showSystem ? ["light", "dark", "system"] : ["light", "dark"]; const getNext = (): ThemePreference => { const idx = cycle.indexOf(preference); return cycle[(idx + 1) % cycle.length]; }; const Icon = preference === "system" ? Monitor : resolved === "dark" ? Moon : Sun; const labelText = preference === "system" ? "Follow system" : resolved === "dark" ? "Dark mode" : "Light mode"; return ( ); } ); ThemeToggle.displayName = "ThemeToggle"; export { ThemeToggle };