/** * Индикатор коллизий переходов * Показывает предупреждения о пересекающихся переходах */ import { AlertCircle, AlertTriangle } from "lucide-react" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { Button } from "@/components/ui/button" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { TimelineTransition } from "@/features/timeline/types/timeline-transition" import { cn } from "@/lib/utils" interface TransitionCollision { transition1: TimelineTransition transition2: TimelineTransition type: "overlap" | "adjacent" | "clip-boundary" severity: "warning" | "error" message: string } interface TransitionCollisionIndicatorProps { collisions: TransitionCollision[] onResolve?: (collision: TransitionCollision) => void className?: string compact?: boolean } /** * Компонент для отображения коллизий переходов */ export function TransitionCollisionIndicator({ collisions, onResolve, className, compact = false, }: TransitionCollisionIndicatorProps) { if (collisions.length === 0) return null // В компактном режиме показываем только иконку с тултипом if (compact) { return (
{collisions.some((c) => c.severity === "error") ? ( ) : ( )} {collisions.length}

Обнаружены коллизии переходов

{collisions.slice(0, 3).map((collision, index) => (

• {collision.message}

))} {collisions.length > 3 && (

и ещё {collisions.length - 3}...

)}
) } // Полный режим отображения return (
{collisions.map((collision, index) => (
{collision.severity === "error" ? ( ) : ( )}
Коллизия переходов

{collision.message}

{getCollisionDetails(collision)}
{onResolve && ( )}
))}
) } /** * Получить детали коллизии для отображения */ function getCollisionDetails(collision: TransitionCollision) { switch (collision.type) { case "overlap": return (

Переход 1: {collision.transition1.position.toFixed(2)}s -{" "} {(collision.transition1.position + collision.transition1.duration).toFixed(2)}s

Переход 2: {collision.transition2.position.toFixed(2)}s -{" "} {(collision.transition2.position + collision.transition2.duration).toFixed(2)}s

) case "adjacent": return

Переходы расположены слишком близко друг к другу

case "clip-boundary": return

Переход выходит за границы клипа

default: return null } } /** * Хелпер для создания объекта коллизии */ export function createCollision( transition1: TimelineTransition, transition2: TimelineTransition, type: TransitionCollision["type"], severity: TransitionCollision["severity"] = "warning", message?: string, ): TransitionCollision { const defaultMessages = { overlap: "Переходы пересекаются по времени", adjacent: "Переходы расположены слишком близко", clip_boundary: "Переход выходит за границы клипа", } return { transition1, transition2, type, severity, message: message || defaultMessages[type] || "Обнаружена коллизия переходов", } }