/**
 * Browser-safe authored composition contract.
 *
 * Source HTML is authored with data-start + data-duration + data-track-index.
 * data-end is compiler-derived and data-layer is legacy input only. Readers
 * accept legacy documents; writers always emit the canonical representation.
 */
declare const COMPOSITION_CONTRACT_VERSION: 1;
declare const COMPOSITION_ATTRIBUTES: Readonly<{
    readonly start: "data-start";
    readonly duration: "data-duration";
    readonly trackIndex: "data-track-index";
    readonly derivedEnd: "data-end";
    readonly legacyTrack: "data-layer";
}>;
declare const CANONICAL_AUTHORED_TIMING_ATTRIBUTES: readonly ["data-start", "data-duration", "data-track-index"];
declare const DERIVED_TIMING_ATTRIBUTES: readonly ["data-end"];
declare const LEGACY_TIMING_ATTRIBUTES: readonly ["data-end", "data-layer"];
type ReferenceExpression = {
    kind: "absolute";
    value: number;
} | {
    kind: "reference";
    refId: string;
    offset: number;
};
type ClipTimingDiagnosticCode = "invalid-start" | "unresolved-start-reference" | "invalid-duration" | "invalid-end" | "end-before-start" | "deprecated-end" | "conflicting-end" | "invalid-track-index" | "deprecated-layer" | "conflicting-layer";
interface ClipTimingDiagnostic {
    code: ClipTimingDiagnosticCode;
    attribute: string;
    value: string | null;
}
interface ClipAttributeReader {
    getAttribute(name: string): string | null;
}
interface ClipAttributeWriter extends ClipAttributeReader {
    setAttribute(name: string, value: string): void;
    removeAttribute(name: string): void;
}
interface ReadClipTimingOptions {
    /** Resolve a reference to the referenced clip's absolute end time. */
    resolveReferenceEnd?: (refId: string) => number | null | undefined;
    /** Start used when data-start is absent. Defaults to zero. */
    defaultStart?: number | null;
}
interface ClipTiming {
    startExpression: ReferenceExpression | null;
    start: number | null;
    duration: number | null;
    end: number | null;
    trackIndex: number;
    durationSource: "duration" | "legacy-end" | "missing" | "invalid";
    trackSource: "track-index" | "legacy-layer" | "default" | "invalid";
    diagnostics: ClipTimingDiagnostic[];
}
interface ClipTimingUpdate {
    start?: number | string | ReferenceExpression;
    duration?: number | null;
    trackIndex?: number | null;
}
declare class ClipTimingWriteError extends Error {
    readonly code: "invalid-start" | "invalid-duration" | "invalid-track-index";
    constructor(code: ClipTimingWriteError["code"], message: string);
}
/** Parse a value to a finite number, or null if it is absent/invalid. */
declare function parseNumeric(value: string | null | undefined): number | null;
/**
 * Parse the data-start grammar: absolute seconds, `clip-id`, or
 * `clip-id +/- offset`, where references resolve to the referenced clip's end.
 */
declare function parseStartExpression(raw: string | null | undefined): ReferenceExpression | null;
/** Read canonical timing, accepting legacy attributes without preferring them. */
declare function readClipTiming(attributes: ClipAttributeReader, options?: ReadClipTimingOptions): ClipTiming;
/** Write only canonical authored timing and remove derived/legacy source attributes. */
declare function writeClipTiming(attributes: ClipAttributeWriter, update: ClipTimingUpdate): ClipTiming;

export { CANONICAL_AUTHORED_TIMING_ATTRIBUTES, COMPOSITION_ATTRIBUTES, COMPOSITION_CONTRACT_VERSION, type ClipAttributeReader, type ClipAttributeWriter, type ClipTiming, type ClipTimingDiagnostic, type ClipTimingDiagnosticCode, type ClipTimingUpdate, ClipTimingWriteError, DERIVED_TIMING_ATTRIBUTES, LEGACY_TIMING_ATTRIBUTES, type ReadClipTimingOptions, type ReferenceExpression, parseNumeric, parseStartExpression, readClipTiming, writeClipTiming };
