/** * 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 };