import { Textarea } from "@/components/ui/textarea"; import { FontPicker } from "@/components/ui/font-picker"; import { FontFamily } from "@/constants/font-constants"; import { TextElement } from "@/types/timeline"; import { useTimelineStore } from "@/stores/timeline-store"; import { Slider } from "@/components/ui/slider"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { useState } from "react"; import { PropertyItem, PropertyItemLabel, PropertyItemValue, } from "./property-item"; export function TextProperties({ element, trackId, }: { element: TextElement; trackId: string; }) { const { updateTextElement } = useTimelineStore(); // Local state for input values to allow temporary empty/invalid states const [fontSizeInput, setFontSizeInput] = useState( element.fontSize.toString() ); const [opacityInput, setOpacityInput] = useState( Math.round(element.opacity * 100).toString() ); const parseAndValidateNumber = ( value: string, min: number, max: number, fallback: number ): number => { const parsed = parseInt(value, 10); if (isNaN(parsed)) return fallback; return Math.max(min, Math.min(max, parsed)); }; const handleFontSizeChange = (value: string) => { setFontSizeInput(value); if (value.trim() !== "") { const fontSize = parseAndValidateNumber(value, 8, 300, element.fontSize); updateTextElement(trackId, element.id, { fontSize }); } }; const handleFontSizeBlur = () => { const fontSize = parseAndValidateNumber( fontSizeInput, 8, 300, element.fontSize ); setFontSizeInput(fontSize.toString()); updateTextElement(trackId, element.id, { fontSize }); }; const handleOpacityChange = (value: string) => { setOpacityInput(value); if (value.trim() !== "") { const opacityPercent = parseAndValidateNumber( value, 0, 100, Math.round(element.opacity * 100) ); updateTextElement(trackId, element.id, { opacity: opacityPercent / 100 }); } }; const handleOpacityBlur = () => { const opacityPercent = parseAndValidateNumber( opacityInput, 0, 100, Math.round(element.opacity * 100) ); setOpacityInput(opacityPercent.toString()); updateTextElement(trackId, element.id, { opacity: opacityPercent / 100 }); }; return (