import { useCallback, useState } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Slider } from "@/components/ui/slider" import { Switch } from "@/components/ui/switch" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { useTimelineTransitions } from "@/features/timeline/hooks/use-timeline-transitions" import { TimelineTransition } from "@/features/timeline/types/timeline-transition" import { Transition } from "@/features/transitions/types/transitions" import { cn } from "@/lib/utils" import { TransitionCurveEditor } from "./transition-curve-editor" import { TransitionCurveVisualizer } from "./transition-curve-visualizer" interface TransitionControlPanelProps { transition: TimelineTransition transitionResource?: Transition onUpdate: (updates: Partial) => void onDelete?: () => void className?: string } /** * Панель управления параметрами перехода * Позволяет настраивать все аспекты перехода включая кривые и расширенные параметры */ export function TransitionControlPanel({ transition, transitionResource, onUpdate, onDelete, className, }: TransitionControlPanelProps) { const [previewTime, setPreviewTime] = useState(transition.duration / 2) const { updateTransition, removeTransition } = useTimelineTransitions() // Обновление перехода через хук const handleUpdate = useCallback( (updates: Partial) => { updateTransition(transition.id, updates) onUpdate?.(updates) }, [transition.id, updateTransition, onUpdate], ) // Удаление перехода через хук const handleDelete = useCallback(() => { removeTransition(transition.id) onDelete?.() }, [transition.id, removeTransition, onDelete]) // Обновление параметров const updateParameters = useCallback( (paramUpdates: Partial) => { handleUpdate({ parameters: { ...transition.parameters, ...paramUpdates, }, }) }, [transition.parameters, handleUpdate], ) // Обновление blur параметров const updateBlurParams = useCallback( (blurUpdates: Partial>) => { updateParameters({ blur: { ...transition.parameters.blur, ...blurUpdates, }, }) }, [transition.parameters.blur, updateParameters], ) // Обновление color параметров const updateColorParams = useCallback( (colorUpdates: Partial>) => { updateParameters({ color: { ...transition.parameters.color, ...colorUpdates, }, }) }, [transition.parameters.color, updateParameters], ) return ( {transitionResource?.labels?.ru || transition.transitionId} {onDelete && ( )} Основные Кривая Эффекты Просмотр {/* Основные параметры */}
handleUpdate({ duration: value })} min={transitionResource?.duration.min || 0.1} max={transitionResource?.duration.max || 5} step={0.1} />
updateParameters({ intensity: value })} min={0} max={1} step={0.01} />
handleUpdate({ isEnabled: checked })} />
{/* Редактор кривой */} handleUpdate({ curve })} width={300} height={200} showGrid showPresets /> {/* Расширенные эффекты */} {/* Blur параметры */}
updateBlurParams({ enabled: checked })} />
{transition.parameters.blur?.enabled && ( <>
updateBlurParams({ amount: value })} min={0} max={100} step={1} />
)}

{/* Color параметры */}
updateColorParams({ enabled: checked })} />
{transition.parameters.color?.enabled && ( <>
updateColorParams({ tint: e.target.value })} className="w-20" /> updateColorParams({ tint: e.target.value })} placeholder="#FFFFFF" />
updateColorParams({ saturation: value })} min={-100} max={100} step={1} />
updateColorParams({ brightness: value })} min={-100} max={100} step={1} />
)}
{/* Предварительный просмотр */}
setPreviewTime(value)} min={0} max={transition.duration} step={0.01} />
{/* Информация о переходе */}
ID: {transition.id}
Тип: {transition.type}
Позиция: {transition.position.toFixed(2)}s
{transitionResource?.gpuAccelerated &&
✓ GPU ускорение
} {transition.keyframes.length > 0 &&
Keyframes: {transition.keyframes.length}
} {transition.renderCache?.status &&
Кеш: {transition.renderCache.status}
}
) }