import { useState, useRef, useEffect } from 'react' import { Palette } from 'lucide-react' import { themeList } from '../themes/registry' import { useStore } from '../store' /** * ThemeSwatch - Renders a circular swatch with 3 color segments */ function ThemeSwatch({ colors, size = 28, active = false }) { // Split circle into 3 segments using conic gradient const gradient = `conic-gradient( ${colors[0]} 0deg 120deg, ${colors[1]} 120deg 240deg, ${colors[2]} 240deg 360deg )` return (
) } /** * ThemePicker - Popover component for selecting themes */ export default function ThemePicker() { const [isOpen, setIsOpen] = useState(false) const theme = useStore((s) => s.theme) const setThemeOverride = useStore((s) => s.setThemeOverride) const triggerRef = useRef(null) const popoverRef = useRef(null) const themes = themeList() const currentTheme = themes.find(t => t.id === theme) || themes[0] // Handle click outside to close useEffect(() => { if (!isOpen) return function handleClickOutside(e) { if ( popoverRef.current && !popoverRef.current.contains(e.target) && triggerRef.current && !triggerRef.current.contains(e.target) ) { setIsOpen(false) } } function handleEscape(e) { if (e.key === 'Escape') { setIsOpen(false) } } document.addEventListener('mousedown', handleClickOutside) document.addEventListener('keydown', handleEscape) return () => { document.removeEventListener('mousedown', handleClickOutside) document.removeEventListener('keydown', handleEscape) } }, [isOpen]) const handleThemeSelect = (themeId) => { setThemeOverride(themeId) setIsOpen(false) } return (