import { type Composition, type Track } from "../../composition.js";
export interface AddTrackOpts {
    afterTrackId?: string;
    language?: string;
    label?: string;
}
/**
 * Add a new lane of `kind` to `comp`. Mints a fresh `trk_` id, auto-labels it
 * `<LETTER><N>` (audio→A2, video→V2, text→CC2, overlay→O1) unless `opts.label`
 * overrides, and places it:
 *  - directly after `opts.afterTrackId` when given (anchor.displayOrder + 1,
 *    shifting everything ≥ that down by one); or
 *  - at the END of the same-kind block by default (a new audio lane lands after
 *    the last existing audio lane, never inside the video block); or
 *  - at the tail of all tracks when no lane of `kind` exists yet.
 *
 * Returns the minted `trackId` so callers (UI, CLI, tests) can immediately
 * reference the new lane. Recompacts displayOrder so the contiguous-0..N-1
 * invariant holds after the add.
 */
export declare function addTrack(comp: Composition, p: {
    kind: Track["kind"];
    opts?: AddTrackOpts;
}): {
    trackId: string;
};
/**
 * Remove the lane `trackId` from `comp` and recompact displayOrder. The
 * lane's clips disappear with it (orphaning is the caller's concern — the
 * store's two-step has-clips confirm gate lives in the store; this op is the
 * unconditional removal once that gate has passed). We `splice` the EXISTING
 * `comp.tracks` array so it keeps its identity (decision #1).
 *
 * Throws `CompositionOpError{code:4}` when no track matches `trackId`.
 */
export declare function removeTrack(comp: Composition, p: {
    trackId: string;
}): void;
//# sourceMappingURL=track.d.ts.map