import { useState } from "react"; import type { RegistryItem } from "@hyperframes/core/registry"; import { useBlockCatalog } from "../../hooks/useBlockCatalog"; import { Film, Plus } from "../../icons/SystemIcons"; import { useTrackDesignInput } from "../../contexts/DesignPanelInputContext"; import type { DomEditSelection } from "./domEditing"; import { FLAT_PREVIEW_GRID } from "./propertyPanelFlatPrimitives"; import type { ElementTiming } from "./propertyPanelFlatTimingDerivation"; export const MEDIA_TREATMENT_OVERLAY_TAG = "media-treatment-overlay"; export function filterMediaTreatmentOverlays(items: readonly RegistryItem[]): RegistryItem[] { return items.filter( (item) => item.type === "hyperframes:block" && item.tags?.includes(MEDIA_TREATMENT_OVERLAY_TAG) === true, ); } export function deriveMediaOverlayPlacement( element: Pick, timing: Pick, ) { const authoredTrack = Number.parseInt(element.dataAttributes["track-index"] ?? "", 10); return { start: timing.start, ...(timing.duration > 0 ? { duration: timing.duration } : {}), ...(Number.isFinite(authoredTrack) ? { track: authoredTrack + 1 } : {}), compositionPath: element.sourceFile, }; } export function FlatOverlaysSection({ onAddOverlay, }: { onAddOverlay: (name: string) => Promise; }) { const track = useTrackDesignInput(); const { blocks, loading, error } = useBlockCatalog(); const overlays = filterMediaTreatmentOverlays(blocks); const [adding, setAdding] = useState(null); const [previewing, setPreviewing] = useState(null); if (loading) { return
Loading overlays…
; } if (error) { return
{error}
; } const busy = adding !== null; return (
{overlays.map((overlay) => ( ))}
); }