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 { Switch } from "@/components/ui/switch"; // Add Switch import import { useState, useRef } 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() ); // Track the last selected color for toggling const lastSelectedColor = useRef("#000000"); 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 }); }; // Update last selected color when a new color is picked const handleColorChange = (color: string) => { if (color !== "transparent") { lastSelectedColor.current = color; } updateTextElement(trackId, element.id, { backgroundColor: color }); }; // Toggle between transparent and last selected color const handleTransparentToggle = (isTransparent: boolean) => { const newColor = isTransparent ? "transparent" : lastSelectedColor.current; updateTextElement(trackId, element.id, { backgroundColor: newColor }); }; return (