import { type Writable } from 'svelte/store'; import type { ViewerApi } from '../../core/types/viewer-api'; import type { StoryWithDefaults } from './storyLoader'; import { type NarrationPlayer } from '../narrationPlayer'; import { type StoryPlaybackClock, type StoryPlaybackState } from '../playbackClock.svelte'; import { type TransitionEventMap } from './chapterTransitionOrchestrator'; export type StoryViewerRuntimeState = 'IDLE' | 'LOADING_CHAPTER' | 'PLAYING_NARRATION' | 'PLAYING_MEDIA' | 'PRESENTING_SILENT' | 'TRANSITION_DELAY' | 'PAUSED' | 'ENDED'; type RuntimeDeps = { language?: string; createNarrationPlayer?: () => NarrationPlayer; createPlaybackClock?: () => StoryPlaybackClock; now?: () => number; setTimeoutFn?: typeof setTimeout; clearTimeoutFn?: typeof clearTimeout; setIntervalFn?: typeof setInterval; clearIntervalFn?: typeof clearInterval; requestAnimationFrame?: (callback: FrameRequestCallback) => number; cancelAnimationFrame?: (handle: number) => void; prefersReducedMotion?: boolean; posePaintedTimeoutMs?: number; sourceOpenTimeoutMs?: number; crossfadeMs?: number; onTransitionEvent?: (event: K, payload: TransitionEventMap[K]) => void; }; export type StoryViewerRuntime = { loadStory: (story: StoryWithDefaults) => Promise; loadChapter: (index: number, options?: { autoPlay?: boolean; }) => Promise; play: () => void; pause: () => void; stop: () => void; destroy: () => void; getState: () => StoryViewerRuntimeState; currentChapterIndex: Writable; isLoading: Writable; playState: Writable<'idle' | 'playing' | 'paused'>; playbackState: Writable; stageFade: Writable; getStory: () => StoryWithDefaults | null; }; /** Target opacity for the story stage, and how long it has to get there. */ export type StageFade = { opacity: number; durationMs: number; }; export declare const createStoryViewerRuntime: (viewer: ViewerApi, deps?: RuntimeDeps) => StoryViewerRuntime; export {};