import { useCallback, useEffect, useRef, useState } from "react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { cn } from "@/lib/utils"; interface ThemeSeedInputProps { value: string; onChange: (hex: string) => void; className?: string; } function isValidHex(value: string): boolean { return /^#[0-9a-fA-F]{6}$/.test(value); } export function ThemeSeedInput({ value, onChange, className }: ThemeSeedInputProps) { const [hexText, setHexText] = useState(value); const debounceRef = useRef(null); // Sync external value to internal text when it changes useEffect(() => { setHexText(value); }, [value]); const debouncedOnChange = useCallback( (newHex: string) => { if (debounceRef.current !== null) { window.clearTimeout(debounceRef.current); } debounceRef.current = window.setTimeout(() => { onChange(newHex); debounceRef.current = null; }, 150); }, [onChange], ); const handleColorChange = useCallback( (e: React.ChangeEvent) => { const newHex = e.target.value; setHexText(newHex); debouncedOnChange(newHex); }, [debouncedOnChange], ); const handleTextChange = useCallback( (e: React.ChangeEvent) => { const newVal = e.target.value; setHexText(newVal); if (isValidHex(newVal)) { debouncedOnChange(newVal); } }, [debouncedOnChange], ); const handleTextBlur = useCallback(() => { // On blur, reset to valid value if text is invalid if (!isValidHex(hexText)) { setHexText(value); } }, [hexText, value]); return (

We'll generate a full palette in OKLCH.

); }