/** * Story timeline math (spec: "Map Stories / Clock, seek, and the scrub * model") — a pure module: step timings in, absolute intervals out. No DOM, * no clock, fully unit-testable. * * Sequencing semantics: * - Sequential (default): a step starts when EVERYTHING before it has * finished (max end of all prior steps) — so a short parallel step never * pulls the next step into the middle of a longer one. * - `parallel`: joins the PREVIOUS step's start (Animaps' "scenes" without * a grouping element). * - `delay` staggers either form's start. */ export interface StepTiming { /** How long the step's animation runs (ms). 0 = instantaneous state change. */ duration: number; /** Stagger before the step starts (ms), applied after sequential/parallel placement. */ delay: number; /** Start with the previous step instead of after everything so far. */ parallel: boolean; } export interface StepInterval { start: number; end: number; } export interface Timeline { intervals: StepInterval[]; /** Total running time — max end across all steps. */ total: number; } export declare function computeTimeline(steps: readonly StepTiming[]): Timeline; /** * `"800"` / `"800ms"` / `"2s"` → milliseconds. The shared duration grammar * for step timings and camera payloads (returns `fallback` on anything * unparseable — callers decide whether to warn). */ export declare function parseDurationMs(raw: string | number | undefined | null, fallback?: number): number;