Function

useTimelineExternalClipDrop

Adds native browser drag-and-drop support for app-owned clip data.

Usage notes

The hook owns browser event handling, track/time resolution, and local feedback state. Apps own payload parsing and clip placement factories; the engine owns validation, policy, history, grouped edits, and undo/redo.

Signature

Type Definition
useTimelineExternalClipDrop(options: UseTimelineExternalClipDropOptions<DragData, TrackKind>): UseTimelineExternalClipDropResult<TrackKind>

Type parameters

NameConstraintDefaultDescription
DragDataNoneNoneApp-owned payload resolved from the native drag event.
TrackKindNonestringApp-defined track kind values used by target tracks.

Parameters

NameTypeDescription
optionsUseTimelineExternalClipDropOptions<DragData, TrackKind>Drop geometry, app payload callbacks, edit mode, and optional policy.

Returns

Root props, feedback state, and the last drop command result.

Examples

tsx Example
import { addRational, fromSeconds } from '@techsquidtv/canvas-timeline-utils';
import { useTimelineExternalClipDrop } from '#react/hooks';
interface MediaAsset {
id: string;
durationSeconds: number;
}
export function AssetDropSurface() {
const drop = useTimelineExternalClipDrop<MediaAsset>({
resolveDragData: (event) => {
const id = event.dataTransfer.getData('text/plain');
return id ? { id, durationSeconds: 5 } : null;
},
createPlacements: ({ data, dropTime, targetTrack }) => {
const duration = fromSeconds(data.durationSeconds, dropTime.r);
return [
{
trackId: targetTrack.id,
clip: {
id: `clip-${data.id}`,
sourceId: data.id,
timelineStart: dropTime,
timelineEnd: addRational(dropTime, duration),
sourceStart: fromSeconds(0, dropTime.r),
sourceEnd: duration,
},
},
];
},
});
return <div {...drop.rootProps}>{drop.valid ? 'Drop media' : 'Drag media here'}</div>;
}