import { useState, useRef, useEffect } from 'react'; import { Settings, Sun, Moon, Monitor, Check } from 'lucide-react'; import { useTheme, ThemeMode, ColorScheme } from '@/hooks/useTheme'; const modes: { value: ThemeMode; label: string; icon: typeof Sun }[] = [ { value: 'light', label: 'Light', icon: Sun }, { value: 'dark', label: 'Dark', icon: Moon }, { value: 'system', label: 'System', icon: Monitor }, ]; const colorSchemes: { value: ColorScheme; label: string; color: string }[] = [ { value: 'blue', label: 'Blue', color: 'bg-blue-500' }, { value: 'purple', label: 'Purple', color: 'bg-purple-500' }, { value: 'green', label: 'Green', color: 'bg-green-500' }, { value: 'orange', label: 'Orange', color: 'bg-orange-500' }, ]; interface AppearanceMenuProps { /** Compact mode for mobile - shows inline instead of dropdown */ compact?: boolean; } export function AppearanceMenu({ compact = false }: AppearanceMenuProps) { const { mode, colorScheme, resolvedTheme, setMode, setColorScheme } = useTheme(); const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const CurrentIcon = resolvedTheme === 'dark' ? Moon : Sun; // Compact inline mode for mobile drawer if (compact) { return (
{/* Theme Mode */}

Theme

{modes.map(({ value, label, icon: Icon }) => ( ))}
{/* Color Scheme */}

Accent Color

{colorSchemes.map(({ value, label, color }) => ( ))}
); } // Standard dropdown mode for header return (
{isOpen && (
{/* Theme Mode Section */}

Theme

{modes.map(({ value, label, icon: Icon }) => ( ))}
{/* Color Scheme Section */}

Accent Color

{colorSchemes.map(({ value, label, color }) => ( ))}
)}
); }