import type { Composition } from "../../composition.js";
/**
 * Trim the clip's SOURCE WINDOW by setting `in` and/or `out` directly. Only
 * `video`/`audio` clips have an `in`/`out` window; `text`/`overlay` are
 * duration-based and reject a trim (code:4 — use a resize/duration op instead).
 *
 * trackOffset is the ANCHOR and never moves. Invariants:
 *  - **in** is resolved FIRST, clamped to `[0, out - MIN_CLIP_DUR]`. Because
 *    trackOffset does not move, an `in` change does NOT shift the keyframe time
 *    origin (keyframe `time` is trackOffset-relative — each renderer mounts the
 *    clip in `<Sequence from={trackOffset*fps}>` and reads useCurrentFrame;
 *    `clip.in` only feeds `<Video startFrom={in*fps}>`). So an `in` trim leaves
 *    keyframes UNTOUCHED. (This is the key difference from the store's left-edge
 *    `resizeClip`, which ALSO moves trackOffset by the same delta and therefore
 *    must rebase — that op is a different verb: a timeline-position move.)
 *  - **out** is resolved against the FINAL `in`, clamped to
 *    `[in + MIN_CLIP_DUR, in + cap]`, where `cap` is the gap to the next clip on
 *    the SAME track (`nextOffset - trackOffset`), so the clip-end
 *    (`trackOffset + (out - in)`) can never overlap a later neighbour — even an
 *    extend-LEFT of `in` that grows the duration is caught here, because `out`
 *    is always re-checked against the cap once `in` is final. Single-clip tracks
 *    have no neighbour → cap = +∞. Keyframes past the new clip-local end
 *    (`out - in`) are dropped + a boundary added (`splitKeyframesAtLocal(.a`).
 *
 * Throws `CompositionOpError{code:4}` when:
 *  - no clip matches `clipId`, or
 *  - neither `in` nor `out` is provided, or
 *  - the supplied `in`/`out` pair is degenerate (`in >= out`), or
 *  - the clip is duration-based (no source window to trim).
 */
export declare function trimClip(comp: Composition, p: {
    clipId: string;
    in?: number;
    out?: number;
}): void;
//# sourceMappingURL=trimClip.d.ts.map