'use client'; import { persistTheme, themePreferenceEvent } from '@/lib/theme/client'; import { type ThemePreference } from '@/lib/theme/config'; import { useEffect, useRef, useState } from 'react'; import styles from './ThemePill.module.css'; interface Props { initialPreference: ThemePreference; } const labels: Record = { light: 'Light', dark: 'Dark', system: 'System', }; export function ThemePill({ initialPreference }: Props) { const [pref, setPref] = useState(initialPreference); const menuRef = useRef(null); const [open, setOpen] = useState(false); useEffect(() => { setPref(initialPreference); }, [initialPreference]); useEffect(() => { const handler = () => { const stored = localStorage.getItem('hpc.theme.preference'); if (stored === 'light' || stored === 'dark' || stored === 'system') setPref(stored); }; window.addEventListener(themePreferenceEvent, handler); return () => window.removeEventListener(themePreferenceEvent, handler); }, []); useEffect(() => { function handleClick(e: MouseEvent) { if (!menuRef.current?.contains(e.target as Node)) setOpen(false); } document.addEventListener('mousedown', handleClick); return () => document.removeEventListener('mousedown', handleClick); }, []); const selectTheme = (next: ThemePreference) => { setOpen(false); persistTheme(next); setPref(next); }; const options: ThemePreference[] = ['light', 'dark', 'system']; const otherOptions = options.filter((o) => o !== pref); const displayLabel = pref === 'dark' ? 'Dark' : 'Light'; return (
{open && (
{otherOptions.map((o) => ( ))}
)}
); }