'use client' import { useTheme } from 'next-themes' import { useEffect, useState, useRef } from 'react' import { THEMES } from '@/lib/themes' import { Button } from '@/components/ui/button' export function ThemeSelector() { const { theme, setTheme } = useTheme() const [mounted, setMounted] = useState(false) const [open, setOpen] = useState(false) const ref = useRef(null) useEffect(() => { setMounted(true) }, []) // Migrate legacy "dark" theme to "void" useEffect(() => { if (mounted && theme === 'dark') { setTheme('void') } }, [mounted, theme, setTheme]) // Close on outside click useEffect(() => { if (!open) return const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) { setOpen(false) } } document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, [open]) if (!mounted) { return
} const darkThemes = THEMES.filter(t => t.group === 'dark') const lightThemes = THEMES.filter(t => t.group === 'light') return (
{open && ( <>
setOpen(false)} />
Dark
{darkThemes.map(t => ( { setTheme(t.id); setOpen(false) }} /> ))}
Light
{lightThemes.map(t => ( { setTheme(t.id); setOpen(false) }} /> ))}
)}
) } function ThemeRow({ meta, active, onSelect }: { meta: typeof THEMES[number]; active: boolean; onSelect: () => void }) { return ( ) } function PaletteIcon() { return ( ) }