Files
2026-08-16 14:58:47 +08:00

68 lines
2.5 KiB
TypeScript

/**
* `lib/video-export` — the classroom-video compiler (issue #864).
*
* The compiler turns classroom data into a `VideoTimeline` **IR** with pure
* passes — the system contract for video export (#854). It is produced and
* inspected without FFmpeg / Chrome; live app state enters only through the
* injected {@link TimingProbe} / {@link AssetSource}. The Hyperframes composition
* is a downstream consumer of the IR, added in a later phase.
*
* Purity is machine-enforced by an eslint boundary on `lib/video-export/**`
* (allows only `@openmaic/dsl`, `zod`, in-folder relatives, and the sibling
* `lib/choreography` spec — no `@/` host paths, no React/DOM/render backend), so
* the compiler stays interpretable in pure Node.
*
* @example
* const ir = compileVideoTimeline(
* { stage, scenes },
* { timing: myProbe, assets: mySource, config: { playbackSpeed: 1 } },
* );
* const manifest = emitManifest(ir); // validated JSON
*/
export * from './ir';
export * from './deps';
export * from './geometry';
export * from './interactive-static';
export * from './runtime-diagnostics';
export { compileVideoTimeline, type CompileInput, type CompileDeps } from './compile';
export { normalizeScenes, type NormalizeResult } from './passes/normalize';
export { buildTimelineOptions } from './passes/probe';
export { buildTimeline, type TimelineResult } from './passes/timeline';
export { applyVisuals, prepareQuizQuestionList, type VisualsResult } from './passes/visuals';
export { applyInteractiveHtml, type InteractiveResult } from './passes/interactive';
export { reflowQuizTimelines, type ReflowResult } from './passes/reflow';
export {
applyGeometry,
resolveEffectGeometry,
resolveVideoPlacement,
type GeometryResult,
} from './passes/geometry';
export { planAssets, sanitizeFilenamePart, type AssetsResult } from './passes/assets';
export {
emitManifest,
emitManifestJson,
VideoExportManifestSchema,
type VideoExportManifest,
} from './passes/emit';
export { toSrt, toVtt, usableCues } from './subtitles';
export { splitCue, splitCues, splitCueText, textUnits } from './split-cue';
export {
emitHyperframes,
assetUrl,
ASSETS_DIR,
type EmitHyperframesOptions,
type EmittedProject,
type EmittedFile,
type VideoExportLabels,
type InteractiveFallbackLabels,
type EmittedVendorAsset,
type CoverCardLabels,
type VideoExportCta,
} from './emit-hyperframes';
export {
quizQuestionListCss,
renderQuizQuestionListSurface,
type QuizQuestionListContent,
type QuizQuestionListLabels,
} from './emit-hyperframes/quiz-question-list';