import { useState, useRef, useEffect, useCallback } from 'react'; import { Plus, ChevronDown } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useTranslation } from 'react-i18next'; import type { VariableDefinition, ThemedValue } from '@/types/variables'; const DEFAULT_THEME_VALUES = ['Default']; export interface VariableEditorProps { variables: Record | undefined; themes: Record | undefined; themeAxis: string; setVariable: (name: string, def: VariableDefinition) => void; ensureThemes: () => void; } /** Footer bar with the "Add variable" button and type-selection dropdown. */ export default function VariableEditor({ variables, themes, themeAxis, setVariable, ensureThemes, }: VariableEditorProps) { const { t } = useTranslation(); const [showAddMenu, setShowAddMenu] = useState(false); const addMenuRef = useRef(null); useEffect(() => { const handler = (e: MouseEvent) => { if (showAddMenu && addMenuRef.current && !addMenuRef.current.contains(e.target as Node)) setShowAddMenu(false); }; if (showAddMenu) { document.addEventListener('mousedown', handler); return () => document.removeEventListener('mousedown', handler); } }, [showAddMenu]); const handleAdd = useCallback( (type: VariableDefinition['type']) => { ensureThemes(); const existing = variables ? Object.keys(variables) : []; let counter = 1; const baseName = type === 'color' ? 'color' : type === 'number' ? 'number' : 'string'; let varName = `${baseName}-${counter}`; while (existing.includes(varName)) { counter++; varName = `${baseName}-${counter}`; } const currentTV = themes?.[themeAxis] ?? DEFAULT_THEME_VALUES; let defaultValue: VariableDefinition['value']; if (currentTV.length > 1) { defaultValue = currentTV.map((tv) => ({ value: type === 'color' ? '#000000' : type === 'number' ? 0 : '', theme: { [themeAxis]: tv }, })) as ThemedValue[]; } else { defaultValue = type === 'color' ? '#000000' : type === 'number' ? 0 : ''; } setVariable(varName, { type, value: defaultValue }); setShowAddMenu(false); }, [ensureThemes, variables, themes, themeAxis, setVariable], ); return (
{showAddMenu && (
{(['color', 'number', 'string'] as const).map((t) => ( ))}
)}
); }