import Konva from 'konva';
import { Track } from '../../components/track/Track';
import type { Clip, ClipStateUpdate, Theme, TimeMs, TrackConfig, TrackType } from '../models/types';
export interface MultiDragMoveRequest {
    draggedClipId: string;
    deltaTime: TimeMs;
    targetTrackY: number;
    currentTrackId: string;
    crossTrackOffsetY: number;
    isFinal: boolean;
}
export interface TimelineTrackBridgeHandlers {
    onClipUpdate: (clip: Clip, originalClip?: Clip, clipUpdates?: ClipStateUpdate[]) => void;
    onClipAdd: (clip: Clip) => void;
    onClipRemove: (clipId: string) => void;
    onClipSplit: (clip1: Clip, clip2: Clip) => void;
    onClipSelect: (clip: Clip) => void;
    onTimeJump: (time: TimeMs) => void;
    onHorizontalDragAutoScroll?: (nextScrollLeft: number) => number;
    onClipOverlap?: (clip: Clip, currentTrackId: string) => void;
    onClipCrossTrackPreview?: (clip: Clip, targetTrackY: number, currentTrackId: string) => 'self' | 'external' | 'clear';
    onClipCrossTrack?: (clip: Clip, originalClip: Clip | null, targetTrackY: number, currentTrackId: string) => boolean | void;
    onClearDropPreview?: () => void;
    onClearSelection?: () => void;
    onSnapGuideChange?: (guideTime: TimeMs | null) => void;
    onClipToggleSelection?: (clipId: string) => void;
    onSetSingleSelection?: (clipId: string) => void;
    getMultiDragClipIds?: (clipId: string) => string[] | null;
    onMultiDragMove?: (request: MultiDragMoveRequest) => boolean | void;
    onMultiDragInteractionEnd?: () => void;
}
export interface TimelineTrackBridgeCreateOptions {
    layer: Konva.Layer;
    config: TrackConfig;
    trackType: TrackType;
    zoom: number;
    trackY: number;
    trackHeight: number;
    theme: Theme;
    dragActivationThreshold?: number;
    enableClipSnap?: boolean;
    clipSnapThreshold?: number;
}
export type TimelineTrackConstructor<TTrack = Track> = new (layer: Konva.Layer, config: TrackConfig, trackType: TrackType, zoom: number, trackY: number, trackHeight: number, theme: Theme, onClipUpdate: (clip: Clip, originalClip?: Clip, clipUpdates?: ClipStateUpdate[]) => void, onClipAdd: (clip: Clip) => void, onClipRemove: (clipId: string) => void, onClipSplit: (clip1: Clip, clip2: Clip) => void, onClipSelect: (clip: Clip) => void, onTimeJump: (time: TimeMs) => void, onHorizontalDragAutoScroll?: (nextScrollLeft: number) => number, onClipOverlap?: (clip: Clip, currentTrackId: string) => void, onClipCrossTrackPreview?: (clip: Clip, targetTrackY: number, currentTrackId: string) => 'self' | 'external' | 'clear', onClipCrossTrack?: (clip: Clip, originalClip: Clip | null, targetTrackY: number, currentTrackId: string) => boolean | void, onClearDropPreview?: () => void, onClearSelection?: () => void, onSnapGuideChange?: (guideTime: TimeMs | null) => void, onClipToggleSelection?: (clipId: string) => void, onSetSingleSelection?: (clipId: string) => void, getMultiDragClipIds?: (clipId: string) => string[] | null, onMultiDragMove?: (request: MultiDragMoveRequest) => boolean | void, onMultiDragInteractionEnd?: () => void, dragActivationThreshold?: number, enableClipSnap?: boolean, clipSnapThreshold?: number) => TTrack;
export declare class TimelineTrackBridge<TTrack = Track> {
    private readonly handlers;
    private readonly TrackCtor;
    constructor(handlers: TimelineTrackBridgeHandlers, TrackCtor?: TimelineTrackConstructor<TTrack>);
    createTrack(options: TimelineTrackBridgeCreateOptions): TTrack;
}
