/** Current manifest schema version. Stamped on persist so future schema
 *  changes can detect and migrate older islands. */
declare const SLIDESHOW_MANIFEST_VERSION = 1;
/** Raw author-facing shapes parsed from the JSON island. */
interface SlideshowManifest {
    /** Schema version (absent on pre-versioning islands → treat as 1). */
    version?: number;
    slides: SlideRef[];
    slideSequences?: SlideSequence[];
}
interface SlideRef {
    sceneId: string;
    startTime?: number;
    endTime?: number;
    notes?: string;
    fragments?: number[];
    hotspots?: SlideHotspot[];
    /**
     * When true, the slide's first `<video>` plays automatically on enter (the
     * presenter lands on the slide and the clip plays). The slideshow still holds
     * — it never auto-advances — so the presenter clicks Next when ready.
     * Defaults to false. Use it when the video is the slide's primary content and
     * its natural end is the cue to advance, not for background/ambient clips.
     */
    autoplay?: boolean;
    ttsScript?: string;
    ttsAudioUrl?: string;
    ttsDurationMs?: number;
}
interface SlideHotspot {
    id: string;
    label: string;
    target: string;
    region?: {
        x: number;
        y: number;
        w: number;
        h: number;
    };
}
interface SlideSequence {
    id: string;
    label: string;
    slides: SlideRef[];
}
/** A slide with its time range resolved from the matching scene. */
interface ResolvedSlide extends SlideRef {
    start: number;
    end: number;
    fragments: number[];
    hotspots: SlideHotspot[];
}
interface ResolvedSlideSequence {
    id: string;
    label: string;
    slides: ResolvedSlide[];
}
interface ResolvedSlideshow {
    slides: ResolvedSlide[];
    sequences: Record<string, ResolvedSlideSequence>;
}

declare const SLIDESHOW_ISLAND_TYPE = "application/hyperframes-slideshow+json";
/**
 * Builds the island <script> matcher. Capture group 1 = inner JSON.
 *
 * Factory (fresh RegExp per call) on purpose: a RegExp with the `g` flag carries
 * a mutable `lastIndex`, so callers that need `g` must call this each time rather
 * than caching a shared instance.
 */
declare function slideshowIslandRegex(flags?: string): RegExp;
interface SceneRange {
    id: string;
    start: number;
    duration: number;
}
/** Extract the JSON island from composition HTML. Returns null if absent. */
declare function parseSlideshowManifest(html: string): SlideshowManifest | null;
declare function resolveSlideshow(manifest: SlideshowManifest, scenes: SceneRange[]): {
    resolved: ResolvedSlideshow;
    errors: string[];
};

/**
 * Whether a composition id names a "scene-like" composition — i.e. a real slide
 * scene, not the root timeline (`main`) or a non-scene overlay (captions, ambient
 * layers). Shared by the runtime scene-window computation and the slideshow lint
 * rule so the two can never drift.
 */
declare function isSceneLikeCompositionId(compositionId: string): boolean;

export { type ResolvedSlide, type ResolvedSlideSequence, type ResolvedSlideshow, SLIDESHOW_ISLAND_TYPE, SLIDESHOW_MANIFEST_VERSION, type SlideHotspot, type SlideRef, type SlideSequence, type SlideshowManifest, isSceneLikeCompositionId, parseSlideshowManifest, resolveSlideshow, slideshowIslandRegex };
