@bendyline/squisq 0.1.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/dist/{themeLibrary-DySHPcgj.d.ts → Doc-1hmT1LZl.d.ts} +1 -42
- package/dist/__tests__/animationUtils.test.d.ts +2 -0
- package/dist/__tests__/animationUtils.test.d.ts.map +1 -0
- package/dist/__tests__/animationUtils.test.js +60 -0
- package/dist/__tests__/animationUtils.test.js.map +1 -0
- package/dist/__tests__/contentExtractor.test.d.ts +2 -0
- package/dist/__tests__/contentExtractor.test.d.ts.map +1 -0
- package/dist/__tests__/contentExtractor.test.js +151 -0
- package/dist/__tests__/contentExtractor.test.js.map +1 -0
- package/dist/__tests__/geohash.test.d.ts +2 -0
- package/dist/__tests__/geohash.test.d.ts.map +1 -0
- package/dist/__tests__/geohash.test.js +87 -0
- package/dist/__tests__/geohash.test.js.map +1 -0
- package/dist/__tests__/getLayers.test.d.ts +2 -0
- package/dist/__tests__/getLayers.test.d.ts.map +1 -0
- package/dist/__tests__/getLayers.test.js +167 -0
- package/dist/__tests__/getLayers.test.js.map +1 -0
- package/dist/__tests__/haversine.test.d.ts +2 -0
- package/dist/__tests__/haversine.test.d.ts.map +1 -0
- package/dist/__tests__/haversine.test.js +56 -0
- package/dist/__tests__/haversine.test.js.map +1 -0
- package/dist/__tests__/localForageAdapter.test.d.ts +8 -0
- package/dist/__tests__/localForageAdapter.test.d.ts.map +1 -0
- package/dist/__tests__/localForageAdapter.test.js +130 -0
- package/dist/__tests__/localForageAdapter.test.js.map +1 -0
- package/dist/__tests__/markdown.test.d.ts +2 -0
- package/dist/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/__tests__/markdown.test.js +654 -0
- package/dist/__tests__/markdown.test.js.map +1 -0
- package/dist/__tests__/markdownToDoc.test.d.ts +2 -0
- package/dist/__tests__/markdownToDoc.test.d.ts.map +1 -0
- package/dist/__tests__/markdownToDoc.test.js +313 -0
- package/dist/__tests__/markdownToDoc.test.js.map +1 -0
- package/dist/__tests__/seededRandom.test.d.ts +2 -0
- package/dist/__tests__/seededRandom.test.d.ts.map +1 -0
- package/dist/__tests__/seededRandom.test.js +125 -0
- package/dist/__tests__/seededRandom.test.js.map +1 -0
- package/dist/__tests__/slideshowGenerator.test.d.ts +2 -0
- package/dist/__tests__/slideshowGenerator.test.d.ts.map +1 -0
- package/dist/__tests__/slideshowGenerator.test.js +114 -0
- package/dist/__tests__/slideshowGenerator.test.js.map +1 -0
- package/dist/__tests__/storage.test.d.ts +2 -0
- package/dist/__tests__/storage.test.d.ts.map +1 -0
- package/dist/__tests__/storage.test.js +51 -0
- package/dist/__tests__/storage.test.js.map +1 -0
- package/dist/__tests__/templates.test.d.ts +2 -0
- package/dist/__tests__/templates.test.d.ts.map +1 -0
- package/dist/__tests__/templates.test.js +217 -0
- package/dist/__tests__/templates.test.js.map +1 -0
- package/dist/__tests__/timing.test.d.ts +2 -0
- package/dist/__tests__/timing.test.d.ts.map +1 -0
- package/dist/__tests__/timing.test.js +131 -0
- package/dist/__tests__/timing.test.js.map +1 -0
- package/dist/chunk-3E5F2XMR.js +129 -0
- package/dist/chunk-3E5F2XMR.js.map +1 -0
- package/dist/chunk-6YJPI6VI.js +35 -0
- package/dist/chunk-6YJPI6VI.js.map +1 -0
- package/dist/chunk-FVTQSNR7.js +100 -0
- package/dist/chunk-FVTQSNR7.js.map +1 -0
- package/dist/chunk-V543AI2F.js +1 -0
- package/dist/chunk-V543AI2F.js.map +1 -0
- package/dist/chunk-VP5SZTZ2.js +792 -0
- package/dist/chunk-VP5SZTZ2.js.map +1 -0
- package/dist/doc/docToMarkdown.d.ts +41 -0
- package/dist/doc/docToMarkdown.d.ts.map +1 -0
- package/dist/doc/docToMarkdown.js +88 -0
- package/dist/doc/docToMarkdown.js.map +1 -0
- package/dist/doc/getLayers.d.ts +65 -0
- package/dist/doc/getLayers.d.ts.map +1 -0
- package/dist/doc/getLayers.js +103 -0
- package/dist/doc/getLayers.js.map +1 -0
- package/dist/doc/index.d.ts +9 -3
- package/dist/doc/index.d.ts.map +1 -0
- package/dist/doc/index.js +6 -125
- package/dist/doc/index.js.map +1 -1
- package/dist/doc/markdownToDoc.d.ts +68 -0
- package/dist/doc/markdownToDoc.d.ts.map +1 -0
- package/dist/doc/markdownToDoc.js +225 -0
- package/dist/doc/markdownToDoc.js.map +1 -0
- package/dist/doc/templates/accentImage.d.ts +59 -0
- package/dist/doc/templates/accentImage.d.ts.map +1 -0
- package/dist/doc/templates/accentImage.js +275 -0
- package/dist/doc/templates/accentImage.js.map +1 -0
- package/dist/doc/templates/captionUtils.d.ts +20 -0
- package/dist/doc/templates/captionUtils.d.ts.map +1 -0
- package/dist/doc/templates/captionUtils.js +29 -0
- package/dist/doc/templates/captionUtils.js.map +1 -0
- package/dist/doc/templates/comparisonBar.d.ts +13 -0
- package/dist/doc/templates/comparisonBar.d.ts.map +1 -0
- package/dist/doc/templates/comparisonBar.js +127 -0
- package/dist/doc/templates/comparisonBar.js.map +1 -0
- package/dist/doc/templates/coverBlock.d.ts +51 -0
- package/dist/doc/templates/coverBlock.d.ts.map +1 -0
- package/dist/doc/templates/coverBlock.js +125 -0
- package/dist/doc/templates/coverBlock.js.map +1 -0
- package/dist/doc/templates/dateEvent.d.ts +15 -0
- package/dist/doc/templates/dateEvent.d.ts.map +1 -0
- package/dist/doc/templates/dateEvent.js +110 -0
- package/dist/doc/templates/dateEvent.js.map +1 -0
- package/dist/doc/templates/definitionCard.d.ts +13 -0
- package/dist/doc/templates/definitionCard.d.ts.map +1 -0
- package/dist/doc/templates/definitionCard.js +114 -0
- package/dist/doc/templates/definitionCard.js.map +1 -0
- package/dist/doc/templates/factCard.d.ts +15 -0
- package/dist/doc/templates/factCard.d.ts.map +1 -0
- package/dist/doc/templates/factCard.js +100 -0
- package/dist/doc/templates/factCard.js.map +1 -0
- package/dist/doc/templates/fullBleedQuote.d.ts +13 -0
- package/dist/doc/templates/fullBleedQuote.d.ts.map +1 -0
- package/dist/doc/templates/fullBleedQuote.js +54 -0
- package/dist/doc/templates/fullBleedQuote.js.map +1 -0
- package/dist/doc/templates/imageWithCaption.d.ts +13 -0
- package/dist/doc/templates/imageWithCaption.d.ts.map +1 -0
- package/dist/doc/templates/imageWithCaption.js +142 -0
- package/dist/doc/templates/imageWithCaption.js.map +1 -0
- package/dist/doc/templates/index.d.ts +104 -0
- package/dist/doc/templates/index.d.ts.map +1 -0
- package/dist/doc/templates/index.js +442 -0
- package/dist/doc/templates/index.js.map +1 -0
- package/dist/doc/templates/listBlock.d.ts +13 -0
- package/dist/doc/templates/listBlock.d.ts.map +1 -0
- package/dist/doc/templates/listBlock.js +89 -0
- package/dist/doc/templates/listBlock.js.map +1 -0
- package/dist/doc/templates/mapBlock.d.ts +17 -0
- package/dist/doc/templates/mapBlock.d.ts.map +1 -0
- package/dist/doc/templates/mapBlock.js +112 -0
- package/dist/doc/templates/mapBlock.js.map +1 -0
- package/dist/doc/templates/persistentLayers.d.ts +39 -0
- package/dist/doc/templates/persistentLayers.d.ts.map +1 -0
- package/dist/doc/templates/persistentLayers.js +447 -0
- package/dist/doc/templates/persistentLayers.js.map +1 -0
- package/dist/doc/templates/photoGrid.d.ts +20 -0
- package/dist/doc/templates/photoGrid.d.ts.map +1 -0
- package/dist/doc/templates/photoGrid.js +172 -0
- package/dist/doc/templates/photoGrid.js.map +1 -0
- package/dist/doc/templates/pullQuote.d.ts +13 -0
- package/dist/doc/templates/pullQuote.d.ts.map +1 -0
- package/dist/doc/templates/pullQuote.js +109 -0
- package/dist/doc/templates/pullQuote.js.map +1 -0
- package/dist/doc/templates/quoteBlock.d.ts +15 -0
- package/dist/doc/templates/quoteBlock.d.ts.map +1 -0
- package/dist/doc/templates/quoteBlock.js +97 -0
- package/dist/doc/templates/quoteBlock.js.map +1 -0
- package/dist/doc/templates/sectionHeader.d.ts +14 -0
- package/dist/doc/templates/sectionHeader.d.ts.map +1 -0
- package/dist/doc/templates/sectionHeader.js +96 -0
- package/dist/doc/templates/sectionHeader.js.map +1 -0
- package/dist/doc/templates/statHighlight.d.ts +15 -0
- package/dist/doc/templates/statHighlight.d.ts.map +1 -0
- package/dist/doc/templates/statHighlight.js +99 -0
- package/dist/doc/templates/statHighlight.js.map +1 -0
- package/dist/doc/templates/titleBlock.d.ts +13 -0
- package/dist/doc/templates/titleBlock.d.ts.map +1 -0
- package/dist/doc/templates/titleBlock.js +92 -0
- package/dist/doc/templates/titleBlock.js.map +1 -0
- package/dist/doc/templates/twoColumn.d.ts +15 -0
- package/dist/doc/templates/twoColumn.d.ts.map +1 -0
- package/dist/doc/templates/twoColumn.js +219 -0
- package/dist/doc/templates/twoColumn.js.map +1 -0
- package/dist/doc/templates/videoPullQuote.d.ts +20 -0
- package/dist/doc/templates/videoPullQuote.d.ts.map +1 -0
- package/dist/doc/templates/videoPullQuote.js +118 -0
- package/dist/doc/templates/videoPullQuote.js.map +1 -0
- package/dist/doc/templates/videoWithCaption.d.ts +20 -0
- package/dist/doc/templates/videoWithCaption.d.ts.map +1 -0
- package/dist/doc/templates/videoWithCaption.js +104 -0
- package/dist/doc/templates/videoWithCaption.js.map +1 -0
- package/dist/doc/utils/animationUtils.d.ts +34 -0
- package/dist/doc/utils/animationUtils.d.ts.map +1 -0
- package/dist/doc/utils/animationUtils.js +110 -0
- package/dist/doc/utils/animationUtils.js.map +1 -0
- package/dist/doc/utils/themeUtils.d.ts +55 -0
- package/dist/doc/utils/themeUtils.d.ts.map +1 -0
- package/dist/doc/utils/themeUtils.js +109 -0
- package/dist/doc/utils/themeUtils.js.map +1 -0
- package/dist/generate/contentExtractor.d.ts +112 -0
- package/dist/generate/contentExtractor.d.ts.map +1 -0
- package/dist/generate/contentExtractor.js +638 -0
- package/dist/generate/contentExtractor.js.map +1 -0
- package/dist/generate/index.d.ts +7 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +4 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/slideshowGenerator.d.ts +72 -0
- package/dist/generate/slideshowGenerator.d.ts.map +1 -0
- package/dist/generate/slideshowGenerator.js +159 -0
- package/dist/generate/slideshowGenerator.js.map +1 -0
- package/dist/generate/templateMapper.d.ts +23 -0
- package/dist/generate/templateMapper.d.ts.map +1 -0
- package/dist/generate/templateMapper.js +114 -0
- package/dist/generate/templateMapper.js.map +1 -0
- package/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -216
- package/dist/index.js.map +1 -1
- package/dist/markdown/convert.d.ts +71 -0
- package/dist/markdown/convert.d.ts.map +1 -0
- package/dist/markdown/convert.js +746 -0
- package/dist/markdown/convert.js.map +1 -0
- package/dist/markdown/htmlParse.d.ts +26 -0
- package/dist/markdown/htmlParse.d.ts.map +1 -0
- package/dist/markdown/htmlParse.js +195 -0
- package/dist/markdown/htmlParse.js.map +1 -0
- package/dist/markdown/index.d.ts +19 -225
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +33 -32
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/parse.d.ts +27 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +90 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/stringify.d.ts +32 -0
- package/dist/markdown/stringify.d.ts.map +1 -0
- package/dist/markdown/stringify.js +108 -0
- package/dist/markdown/stringify.js.map +1 -0
- package/dist/markdown/types.d.ts +496 -0
- package/dist/markdown/types.d.ts.map +1 -0
- package/dist/markdown/types.js +17 -0
- package/dist/markdown/types.js.map +1 -0
- package/dist/markdown/utils.d.ts +78 -0
- package/dist/markdown/utils.d.ts.map +1 -0
- package/dist/markdown/utils.js +149 -0
- package/dist/markdown/utils.js.map +1 -0
- package/dist/random/SeededRandom.d.ts +50 -0
- package/dist/random/SeededRandom.d.ts.map +1 -0
- package/dist/random/SeededRandom.js +115 -0
- package/dist/random/SeededRandom.js.map +1 -0
- package/dist/random/index.d.ts +2 -0
- package/dist/random/index.d.ts.map +1 -0
- package/dist/random/index.js +2 -0
- package/dist/random/index.js.map +1 -0
- package/dist/schemas/BlockTemplates.d.ts +583 -0
- package/dist/schemas/BlockTemplates.d.ts.map +1 -0
- package/dist/schemas/BlockTemplates.js +72 -0
- package/dist/schemas/BlockTemplates.js.map +1 -0
- package/dist/schemas/Doc.d.ts +411 -0
- package/dist/schemas/Doc.d.ts.map +1 -0
- package/dist/schemas/Doc.js +90 -0
- package/dist/schemas/Doc.js.map +1 -0
- package/dist/schemas/LayoutStrategy.d.ts +84 -0
- package/dist/schemas/LayoutStrategy.d.ts.map +1 -0
- package/dist/schemas/LayoutStrategy.js +123 -0
- package/dist/schemas/LayoutStrategy.js.map +1 -0
- package/dist/schemas/MediaProvider.d.ts +65 -0
- package/dist/schemas/MediaProvider.d.ts.map +1 -0
- package/dist/schemas/MediaProvider.js +13 -0
- package/dist/schemas/MediaProvider.js.map +1 -0
- package/dist/schemas/Theme.d.ts +163 -0
- package/dist/schemas/Theme.d.ts.map +1 -0
- package/dist/schemas/Theme.js +62 -0
- package/dist/schemas/Theme.js.map +1 -0
- package/dist/schemas/Types.d.ts +14 -0
- package/dist/schemas/Types.d.ts.map +1 -0
- package/dist/schemas/Types.js +5 -0
- package/dist/schemas/Types.js.map +1 -0
- package/dist/schemas/Viewport.d.ts +74 -0
- package/dist/schemas/Viewport.d.ts.map +1 -0
- package/dist/schemas/Viewport.js +63 -0
- package/dist/schemas/Viewport.js.map +1 -0
- package/dist/schemas/index.d.ts +10 -70
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -60
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/themeLibrary.d.ts +41 -0
- package/dist/schemas/themeLibrary.d.ts.map +1 -0
- package/dist/schemas/themeLibrary.js +466 -0
- package/dist/schemas/themeLibrary.js.map +1 -0
- package/dist/spatial/Geohash.d.ts +85 -0
- package/dist/spatial/Geohash.d.ts.map +1 -0
- package/dist/spatial/Geohash.js +142 -0
- package/dist/spatial/Geohash.js.map +1 -0
- package/dist/spatial/Haversine.d.ts +24 -0
- package/dist/spatial/Haversine.d.ts.map +1 -0
- package/dist/spatial/Haversine.js +48 -0
- package/dist/spatial/Haversine.js.map +1 -0
- package/dist/spatial/index.d.ts +3 -111
- package/dist/spatial/index.d.ts.map +1 -0
- package/dist/spatial/index.js +2 -24
- package/dist/spatial/index.js.map +1 -1
- package/dist/storage/LocalForageAdapter.d.ts +36 -0
- package/dist/storage/LocalForageAdapter.d.ts.map +1 -0
- package/dist/storage/LocalForageAdapter.js +82 -0
- package/dist/storage/LocalForageAdapter.js.map +1 -0
- package/dist/storage/LocalStorageAdapter.d.ts +16 -0
- package/dist/storage/LocalStorageAdapter.d.ts.map +1 -0
- package/dist/storage/LocalStorageAdapter.js +50 -0
- package/dist/storage/LocalStorageAdapter.js.map +1 -0
- package/dist/storage/MemoryStorageAdapter.d.ts +15 -0
- package/dist/storage/MemoryStorageAdapter.d.ts.map +1 -0
- package/dist/storage/MemoryStorageAdapter.js +34 -0
- package/dist/storage/MemoryStorageAdapter.js.map +1 -0
- package/dist/storage/Storage.d.ts +23 -0
- package/dist/storage/Storage.d.ts.map +1 -0
- package/dist/storage/Storage.js +9 -0
- package/dist/storage/Storage.js.map +1 -0
- package/dist/storage/index.d.ts +6 -91
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +3 -10
- package/dist/storage/index.js.map +1 -1
- package/dist/story/index.d.ts +3 -2
- package/dist/themeLibrary-DR1VRo-8.d.ts +44 -0
- package/dist/timing/index.d.ts +4 -0
- package/dist/timing/index.d.ts.map +1 -0
- package/dist/timing/index.js +3 -0
- package/dist/timing/index.js.map +1 -0
- package/dist/timing/narrationTiming.d.ts +54 -0
- package/dist/timing/narrationTiming.d.ts.map +1 -0
- package/dist/timing/narrationTiming.js +190 -0
- package/dist/timing/narrationTiming.js.map +1 -0
- package/dist/timing/readingTime.d.ts +54 -0
- package/dist/timing/readingTime.d.ts.map +1 -0
- package/dist/timing/readingTime.js +49 -0
- package/dist/timing/readingTime.js.map +1 -0
- package/package.json +19 -5
- package/src/__tests__/contentExtractor.test.ts +183 -0
- package/src/__tests__/seededRandom.test.ts +142 -0
- package/src/__tests__/slideshowGenerator.test.ts +128 -0
- package/src/__tests__/timing.test.ts +167 -0
- package/src/generate/contentExtractor.ts +808 -0
- package/src/generate/index.ts +21 -0
- package/src/generate/slideshowGenerator.ts +273 -0
- package/src/generate/templateMapper.ts +170 -0
- package/src/index.ts +3 -0
- package/src/random/SeededRandom.ts +127 -0
- package/src/random/index.ts +1 -0
- package/src/timing/index.ts +17 -0
- package/src/timing/narrationTiming.ts +220 -0
- package/src/timing/readingTime.ts +94 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doc Schema
|
|
3
|
+
*
|
|
4
|
+
* Defines the JSON format for AI-scriptable visual docs that accompany
|
|
5
|
+
* audio narration. A Doc describes a sequence of animated blocks
|
|
6
|
+
* with text overlays, images, and transitions synchronized to audio.
|
|
7
|
+
*
|
|
8
|
+
* The format is designed to be:
|
|
9
|
+
* 1. AI-generatable - Claude can create scripts from article content
|
|
10
|
+
* 2. Browser-renderable - SVG + CSS animations (ES2015 compatible)
|
|
11
|
+
* 3. Video-exportable - Frame-by-frame capture via Playwright
|
|
12
|
+
*
|
|
13
|
+
* Timing: Blocks are timed to match narration audio segments. Each article
|
|
14
|
+
* has 3-6 MP3 files (intro + sections), and blocks are grouped by segment.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Configuration for the Start/resting block shown before playback begins.
|
|
18
|
+
*/
|
|
19
|
+
export interface StartBlockConfig {
|
|
20
|
+
/** Hero image path (relative to article media) */
|
|
21
|
+
heroSrc: string;
|
|
22
|
+
/** Alt text for the hero image */
|
|
23
|
+
heroAlt?: string;
|
|
24
|
+
/** Title to display over the hero */
|
|
25
|
+
title: string;
|
|
26
|
+
/** Optional subtitle */
|
|
27
|
+
subtitle?: string;
|
|
28
|
+
/** Ambient motion for the hero image */
|
|
29
|
+
ambientMotion?: 'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight';
|
|
30
|
+
/** Photo credit / artist name for the hero image */
|
|
31
|
+
heroCredit?: string;
|
|
32
|
+
/** License identifier for the hero image */
|
|
33
|
+
heroLicense?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A complete visual doc for an article.
|
|
37
|
+
*/
|
|
38
|
+
export interface Doc {
|
|
39
|
+
/** Article ID this doc belongs to */
|
|
40
|
+
articleId: string;
|
|
41
|
+
/** Total duration in seconds (sum of all audio segments) */
|
|
42
|
+
duration: number;
|
|
43
|
+
/** Ordered list of blocks */
|
|
44
|
+
blocks: Block[];
|
|
45
|
+
/** Audio track configuration */
|
|
46
|
+
audio: AudioTrack;
|
|
47
|
+
/** Caption track for closed captions (generated by postprocess-doc) */
|
|
48
|
+
captions?: CaptionTrack;
|
|
49
|
+
/**
|
|
50
|
+
* Start/resting block shown before playback begins.
|
|
51
|
+
* Displays hero image with title - acts as a "poster" for the doc.
|
|
52
|
+
* The player shows this until the user starts playback.
|
|
53
|
+
*/
|
|
54
|
+
startBlock?: StartBlockConfig;
|
|
55
|
+
/**
|
|
56
|
+
* Persistent layers rendered on every block (behind and/or on top of content).
|
|
57
|
+
* Used for consistent branding overlays, background gradients, etc.
|
|
58
|
+
*/
|
|
59
|
+
persistentLayers?: import('./BlockTemplates.js').PersistentLayerConfig;
|
|
60
|
+
/**
|
|
61
|
+
* Optional theme identifier. Resolved at render time via `resolveTheme()`.
|
|
62
|
+
* When omitted, the renderer uses the default theme ('documentary').
|
|
63
|
+
*/
|
|
64
|
+
themeId?: string;
|
|
65
|
+
/** Optional metadata */
|
|
66
|
+
meta?: {
|
|
67
|
+
generatedAt?: string;
|
|
68
|
+
generatedBy?: string;
|
|
69
|
+
version?: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* YAML frontmatter from the source markdown.
|
|
73
|
+
* Carries rendering hints like `document-render-as` and custom metadata.
|
|
74
|
+
*/
|
|
75
|
+
frontmatter?: Record<string, unknown>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A single block in the doc.
|
|
79
|
+
*
|
|
80
|
+
* Blocks can be flat (audio-synced timeline) or nested (markdown-driven hierarchy).
|
|
81
|
+
* When derived from markdown, a block corresponds to a heading section:
|
|
82
|
+
* - `sourceHeading` references the original MarkdownHeading node
|
|
83
|
+
* - `contents` holds the body markdown between this heading and the next
|
|
84
|
+
* - `children` holds sub-heading blocks (e.g., H2s under an H1)
|
|
85
|
+
*/
|
|
86
|
+
export interface Block {
|
|
87
|
+
/** Unique identifier for this block */
|
|
88
|
+
id: string;
|
|
89
|
+
/** When this block appears (seconds from start) */
|
|
90
|
+
startTime: number;
|
|
91
|
+
/** How long this block is visible (seconds) */
|
|
92
|
+
duration: number;
|
|
93
|
+
/** Which audio segment this block belongs to (0-indexed) */
|
|
94
|
+
audioSegment: number;
|
|
95
|
+
/**
|
|
96
|
+
* Pre-computed visual layers, rendered back-to-front.
|
|
97
|
+
*
|
|
98
|
+
* Optional — template-derived blocks typically omit this and compute
|
|
99
|
+
* layers on demand via `getLayers()` from `@bendyline/squisq/doc`.
|
|
100
|
+
* Raw blocks (e.g., hand-crafted by AI) may provide layers directly.
|
|
101
|
+
*/
|
|
102
|
+
layers?: Layer[];
|
|
103
|
+
/** Entry transition from previous block */
|
|
104
|
+
transition?: Transition;
|
|
105
|
+
/** Template name that generated this block (for debugging) */
|
|
106
|
+
template?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Nested sub-blocks (heading hierarchy).
|
|
109
|
+
* When a doc is derived from markdown, sub-headings within this
|
|
110
|
+
* heading's section become child blocks. For example, H2 blocks
|
|
111
|
+
* under an H1 block appear here.
|
|
112
|
+
*/
|
|
113
|
+
children?: Block[];
|
|
114
|
+
/**
|
|
115
|
+
* Markdown body content for this block's section.
|
|
116
|
+
* Contains the block-level markdown nodes (paragraphs, lists, code,
|
|
117
|
+
* blockquotes, etc.) that appear between this heading and the next
|
|
118
|
+
* heading or sub-heading. Empty for pure structural blocks.
|
|
119
|
+
*/
|
|
120
|
+
contents?: import('../markdown/types.js').MarkdownBlockNode[];
|
|
121
|
+
/**
|
|
122
|
+
* Reference to the MarkdownHeading node that created this block.
|
|
123
|
+
* Present when the block was derived from markdown via markdownToDoc().
|
|
124
|
+
* Enables round-tripping back to markdown and provides heading depth.
|
|
125
|
+
* Absent for the preamble block (content before the first heading).
|
|
126
|
+
*/
|
|
127
|
+
sourceHeading?: import('../markdown/types.js').MarkdownHeading;
|
|
128
|
+
/**
|
|
129
|
+
* Template overrides extracted from markdown directives.
|
|
130
|
+
* For example, `### Data Section {template=chart colorScheme=blue}`
|
|
131
|
+
* would produce `{ template: 'chart', colorScheme: 'blue' }`.
|
|
132
|
+
* Allows per-block customization of template selection and parameters.
|
|
133
|
+
*/
|
|
134
|
+
templateOverrides?: Record<string, string>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A visual element within a block.
|
|
138
|
+
* Layers are composited back-to-front (first layer is background).
|
|
139
|
+
*/
|
|
140
|
+
export type Layer = ImageLayer | TextLayer | ShapeLayer | MapLayer | VideoLayer;
|
|
141
|
+
interface BaseLayer {
|
|
142
|
+
/** Unique identifier for this layer */
|
|
143
|
+
id: string;
|
|
144
|
+
/** Position and size */
|
|
145
|
+
position: Position;
|
|
146
|
+
/** Animation to apply */
|
|
147
|
+
animation?: Animation;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Image layer - displays an image with optional Ken Burns effect.
|
|
151
|
+
*/
|
|
152
|
+
export interface ImageLayer extends BaseLayer {
|
|
153
|
+
type: 'image';
|
|
154
|
+
content: {
|
|
155
|
+
/** Path to image file (relative to article media dir) */
|
|
156
|
+
src: string;
|
|
157
|
+
/** Alt text for accessibility */
|
|
158
|
+
alt: string;
|
|
159
|
+
/** How to fit image in bounds */
|
|
160
|
+
fit?: 'cover' | 'contain' | 'fill';
|
|
161
|
+
/** Photo credit / artist name */
|
|
162
|
+
credit?: string;
|
|
163
|
+
/** License identifier (e.g., 'CC BY-SA 4.0') */
|
|
164
|
+
license?: string;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Text layer - displays text with styling.
|
|
169
|
+
*/
|
|
170
|
+
export interface TextLayer extends BaseLayer {
|
|
171
|
+
type: 'text';
|
|
172
|
+
content: {
|
|
173
|
+
/** Text to display (supports \n for line breaks) */
|
|
174
|
+
text: string;
|
|
175
|
+
/** Text styling */
|
|
176
|
+
style: TextStyle;
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Shape layer - simple geometric shapes for visual accents.
|
|
181
|
+
*/
|
|
182
|
+
export interface ShapeLayer extends BaseLayer {
|
|
183
|
+
type: 'shape';
|
|
184
|
+
content: {
|
|
185
|
+
/** Shape type */
|
|
186
|
+
shape: 'rect' | 'circle' | 'line';
|
|
187
|
+
/** Fill color (CSS color or 'none') */
|
|
188
|
+
fill?: string;
|
|
189
|
+
/** Stroke color */
|
|
190
|
+
stroke?: string;
|
|
191
|
+
/** Stroke width in pixels */
|
|
192
|
+
strokeWidth?: number;
|
|
193
|
+
/** Corner radius for rect */
|
|
194
|
+
borderRadius?: number;
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Map layer - displays a geographic map with optional markers.
|
|
199
|
+
*
|
|
200
|
+
* Maps are rendered as composite tile images from free tile providers.
|
|
201
|
+
* Supported styles use open-source/free tiles requiring attribution.
|
|
202
|
+
*/
|
|
203
|
+
export interface MapLayer extends BaseLayer {
|
|
204
|
+
type: 'map';
|
|
205
|
+
content: {
|
|
206
|
+
/** Center coordinates for the map */
|
|
207
|
+
center: {
|
|
208
|
+
lat: number;
|
|
209
|
+
lng: number;
|
|
210
|
+
};
|
|
211
|
+
/** Zoom level (0-18, typically 8-14 for doc blocks) */
|
|
212
|
+
zoom: number;
|
|
213
|
+
/** Map tile style */
|
|
214
|
+
style: MapTileStyle;
|
|
215
|
+
/** Optional markers to display on the map */
|
|
216
|
+
markers?: MapMarker[];
|
|
217
|
+
/** Pre-rendered static image path (for video export reliability) */
|
|
218
|
+
staticSrc?: string;
|
|
219
|
+
/** Show attribution text (default: true) */
|
|
220
|
+
showAttribution?: boolean;
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Video layer - displays a short video clip, always muted (narration provides audio).
|
|
225
|
+
*
|
|
226
|
+
* Rendered via an HTML5 <video> element inside <foreignObject>, similar to how
|
|
227
|
+
* ImageLayer uses <img> for Ken Burns effects. clipStart/clipEnd define the window
|
|
228
|
+
* within the source video to play. During Playwright frame capture (seekTo mode),
|
|
229
|
+
* the video is seeked programmatically rather than playing in real time.
|
|
230
|
+
*/
|
|
231
|
+
export interface VideoLayer extends BaseLayer {
|
|
232
|
+
type: 'video';
|
|
233
|
+
content: {
|
|
234
|
+
/** Path to video file (relative to article media dir) */
|
|
235
|
+
src: string;
|
|
236
|
+
/** Path to poster frame (shown before video loads / during seek) */
|
|
237
|
+
posterSrc?: string;
|
|
238
|
+
/** Alt text for accessibility */
|
|
239
|
+
alt: string;
|
|
240
|
+
/** How to fit video in bounds */
|
|
241
|
+
fit?: 'cover' | 'contain' | 'fill';
|
|
242
|
+
/** Start time within the source video (seconds) */
|
|
243
|
+
clipStart: number;
|
|
244
|
+
/** End time within the source video (seconds) */
|
|
245
|
+
clipEnd: number;
|
|
246
|
+
/** Total source video duration (for validation) */
|
|
247
|
+
sourceDuration?: number;
|
|
248
|
+
/** Video credit / artist name */
|
|
249
|
+
credit?: string;
|
|
250
|
+
/** License identifier (e.g., 'CC BY-SA 4.0') */
|
|
251
|
+
license?: string;
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Available map tile styles from free/open-source providers.
|
|
256
|
+
*/
|
|
257
|
+
export type MapTileStyle = 'terrain' | 'satellite' | 'road' | 'toner' | 'watercolor';
|
|
258
|
+
/**
|
|
259
|
+
* A marker to display on the map.
|
|
260
|
+
*/
|
|
261
|
+
export interface MapMarker {
|
|
262
|
+
/** Marker latitude */
|
|
263
|
+
lat: number;
|
|
264
|
+
/** Marker longitude */
|
|
265
|
+
lng: number;
|
|
266
|
+
/** Optional label text */
|
|
267
|
+
label?: string;
|
|
268
|
+
/** Marker color (CSS color, default: #ef4444) */
|
|
269
|
+
color?: string;
|
|
270
|
+
/** Marker icon type */
|
|
271
|
+
icon?: 'pin' | 'circle' | 'star';
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Position and dimensions for a layer.
|
|
275
|
+
* Values can be pixels (number) or percentages (string like "50%").
|
|
276
|
+
*/
|
|
277
|
+
export interface Position {
|
|
278
|
+
/** X position (pixels or percentage) */
|
|
279
|
+
x: number | string;
|
|
280
|
+
/** Y position (pixels or percentage) */
|
|
281
|
+
y: number | string;
|
|
282
|
+
/** Width (pixels or percentage) */
|
|
283
|
+
width?: number | string;
|
|
284
|
+
/** Height (pixels or percentage) */
|
|
285
|
+
height?: number | string;
|
|
286
|
+
/** Anchor point for positioning */
|
|
287
|
+
anchor?: 'center' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Text styling options.
|
|
291
|
+
*/
|
|
292
|
+
export interface TextStyle {
|
|
293
|
+
/** Font size in pixels */
|
|
294
|
+
fontSize: number;
|
|
295
|
+
/** Font family (defaults to system sans-serif) */
|
|
296
|
+
fontFamily?: string;
|
|
297
|
+
/** Font weight */
|
|
298
|
+
fontWeight?: 'normal' | 'bold';
|
|
299
|
+
/** Text color (CSS color) */
|
|
300
|
+
color: string;
|
|
301
|
+
/** Text alignment */
|
|
302
|
+
textAlign?: 'left' | 'center' | 'right';
|
|
303
|
+
/** Line height multiplier */
|
|
304
|
+
lineHeight?: number;
|
|
305
|
+
/** Add drop shadow for readability over images */
|
|
306
|
+
shadow?: boolean;
|
|
307
|
+
/** Background color for text box */
|
|
308
|
+
background?: string;
|
|
309
|
+
/** Padding around text (pixels) */
|
|
310
|
+
padding?: number;
|
|
311
|
+
/** Maximum number of lines before truncation (adds "..." to last line) */
|
|
312
|
+
maxLines?: number;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Animation to apply to a layer.
|
|
316
|
+
*/
|
|
317
|
+
export interface Animation {
|
|
318
|
+
/** Animation type */
|
|
319
|
+
type: AnimationType;
|
|
320
|
+
/** Duration in seconds (defaults to layer's block duration) */
|
|
321
|
+
duration?: number;
|
|
322
|
+
/** Delay before animation starts (seconds) */
|
|
323
|
+
delay?: number;
|
|
324
|
+
/** CSS easing function */
|
|
325
|
+
easing?: string;
|
|
326
|
+
/** For Ken Burns: zoom direction */
|
|
327
|
+
direction?: 'in' | 'out';
|
|
328
|
+
/** For pan animations: pan direction */
|
|
329
|
+
panDirection?: 'left' | 'right' | 'up' | 'down';
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Available animation types.
|
|
333
|
+
*/
|
|
334
|
+
export type AnimationType = 'none' | 'fadeIn' | 'fadeOut' | 'slowZoom' | 'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight' | 'typewriter';
|
|
335
|
+
/**
|
|
336
|
+
* Transition between blocks.
|
|
337
|
+
*/
|
|
338
|
+
export interface Transition {
|
|
339
|
+
/** Transition type */
|
|
340
|
+
type: TransitionType;
|
|
341
|
+
/** Duration in seconds */
|
|
342
|
+
duration: number;
|
|
343
|
+
}
|
|
344
|
+
export type TransitionType = 'cut' | 'fade' | 'dissolve' | 'slideLeft' | 'slideRight';
|
|
345
|
+
/**
|
|
346
|
+
* Audio track configuration.
|
|
347
|
+
* Articles have multiple MP3 segments (intro + sections).
|
|
348
|
+
*/
|
|
349
|
+
export interface AudioTrack {
|
|
350
|
+
/** Audio segments in playback order */
|
|
351
|
+
segments: AudioSegment[];
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* A single caption phrase to display during playback.
|
|
355
|
+
*/
|
|
356
|
+
export interface CaptionPhrase {
|
|
357
|
+
/** The text to display */
|
|
358
|
+
text: string;
|
|
359
|
+
/** Start time in seconds (relative to doc start) */
|
|
360
|
+
startTime: number;
|
|
361
|
+
/** End time in seconds */
|
|
362
|
+
endTime: number;
|
|
363
|
+
/** Which audio segment this caption belongs to (0-indexed) */
|
|
364
|
+
audioSegment: number;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Caption track for a doc.
|
|
368
|
+
*/
|
|
369
|
+
export interface CaptionTrack {
|
|
370
|
+
/** Caption phrases in chronological order */
|
|
371
|
+
phrases: CaptionPhrase[];
|
|
372
|
+
/** When the captions were generated */
|
|
373
|
+
generatedAt: string;
|
|
374
|
+
/** Algorithm version for regeneration detection */
|
|
375
|
+
version: number;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* A single audio segment (one MP3 file).
|
|
379
|
+
*/
|
|
380
|
+
export interface AudioSegment {
|
|
381
|
+
/** Path to MP3 file (relative to article media dir) */
|
|
382
|
+
src: string;
|
|
383
|
+
/** Segment name (e.g., "intro", "history") */
|
|
384
|
+
name: string;
|
|
385
|
+
/** Duration in seconds */
|
|
386
|
+
duration: number;
|
|
387
|
+
/** Start time in overall timeline (calculated) */
|
|
388
|
+
startTime: number;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Calculate total duration from audio segments.
|
|
392
|
+
*/
|
|
393
|
+
export declare function calculateDuration(audio: AudioTrack): number;
|
|
394
|
+
/**
|
|
395
|
+
* Find which audio segment is playing at a given time.
|
|
396
|
+
*/
|
|
397
|
+
export declare function getSegmentAtTime(audio: AudioTrack, time: number): number;
|
|
398
|
+
/**
|
|
399
|
+
* Find which block should be visible at a given time.
|
|
400
|
+
*/
|
|
401
|
+
export declare function getBlockAtTime(blocks: Block[], time: number): Block | null;
|
|
402
|
+
/**
|
|
403
|
+
* Find the caption phrase that should be displayed at a given time.
|
|
404
|
+
*/
|
|
405
|
+
export declare function getCaptionAtTime(captions: CaptionTrack | undefined, time: number): CaptionPhrase | null;
|
|
406
|
+
/**
|
|
407
|
+
* Validate a Doc for completeness.
|
|
408
|
+
*/
|
|
409
|
+
export declare function validateDoc(script: Doc): string[];
|
|
410
|
+
export {};
|
|
411
|
+
//# sourceMappingURL=Doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Doc.d.ts","sourceRoot":"","sources":["../../src/schemas/Doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doc Schema
|
|
3
|
+
*
|
|
4
|
+
* Defines the JSON format for AI-scriptable visual docs that accompany
|
|
5
|
+
* audio narration. A Doc describes a sequence of animated blocks
|
|
6
|
+
* with text overlays, images, and transitions synchronized to audio.
|
|
7
|
+
*
|
|
8
|
+
* The format is designed to be:
|
|
9
|
+
* 1. AI-generatable - Claude can create scripts from article content
|
|
10
|
+
* 2. Browser-renderable - SVG + CSS animations (ES2015 compatible)
|
|
11
|
+
* 3. Video-exportable - Frame-by-frame capture via Playwright
|
|
12
|
+
*
|
|
13
|
+
* Timing: Blocks are timed to match narration audio segments. Each article
|
|
14
|
+
* has 3-6 MP3 files (intro + sections), and blocks are grouped by segment.
|
|
15
|
+
*/
|
|
16
|
+
// ============================================
|
|
17
|
+
// Helper Functions
|
|
18
|
+
// ============================================
|
|
19
|
+
/**
|
|
20
|
+
* Calculate total duration from audio segments.
|
|
21
|
+
*/
|
|
22
|
+
export function calculateDuration(audio) {
|
|
23
|
+
return audio.segments.reduce((sum, seg) => sum + seg.duration, 0);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Find which audio segment is playing at a given time.
|
|
27
|
+
*/
|
|
28
|
+
export function getSegmentAtTime(audio, time) {
|
|
29
|
+
let elapsed = 0;
|
|
30
|
+
for (let i = 0; i < audio.segments.length; i++) {
|
|
31
|
+
elapsed += audio.segments[i].duration;
|
|
32
|
+
if (time < elapsed)
|
|
33
|
+
return i;
|
|
34
|
+
}
|
|
35
|
+
return audio.segments.length - 1;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Find which block should be visible at a given time.
|
|
39
|
+
*/
|
|
40
|
+
export function getBlockAtTime(blocks, time) {
|
|
41
|
+
for (let i = blocks.length - 1; i >= 0; i--) {
|
|
42
|
+
const block = blocks[i];
|
|
43
|
+
if (time >= block.startTime && time < block.startTime + block.duration) {
|
|
44
|
+
return block;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return blocks[0] || null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Find the caption phrase that should be displayed at a given time.
|
|
51
|
+
*/
|
|
52
|
+
export function getCaptionAtTime(captions, time) {
|
|
53
|
+
if (!captions || !captions.phrases.length)
|
|
54
|
+
return null;
|
|
55
|
+
for (const phrase of captions.phrases) {
|
|
56
|
+
if (time >= phrase.startTime && time < phrase.endTime) {
|
|
57
|
+
return phrase;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validate a Doc for completeness.
|
|
64
|
+
*/
|
|
65
|
+
export function validateDoc(script) {
|
|
66
|
+
const errors = [];
|
|
67
|
+
if (!script.articleId) {
|
|
68
|
+
errors.push('Missing articleId');
|
|
69
|
+
}
|
|
70
|
+
if (!script.blocks || script.blocks.length === 0) {
|
|
71
|
+
errors.push('No blocks defined');
|
|
72
|
+
}
|
|
73
|
+
if (!script.audio || !script.audio.segments || script.audio.segments.length === 0) {
|
|
74
|
+
errors.push('No audio segments defined');
|
|
75
|
+
}
|
|
76
|
+
// Check for gaps in block coverage
|
|
77
|
+
const totalDuration = script.duration;
|
|
78
|
+
let covered = 0;
|
|
79
|
+
for (const block of script.blocks) {
|
|
80
|
+
if (block.startTime > covered + 0.1) {
|
|
81
|
+
errors.push(`Gap in blocks: ${covered}s to ${block.startTime}s`);
|
|
82
|
+
}
|
|
83
|
+
covered = Math.max(covered, block.startTime + block.duration);
|
|
84
|
+
}
|
|
85
|
+
if (covered < totalDuration - 0.1) {
|
|
86
|
+
errors.push(`Blocks end at ${covered}s but audio is ${totalDuration}s`);
|
|
87
|
+
}
|
|
88
|
+
return errors;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=Doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Doc.js","sourceRoot":"","sources":["../../src/schemas/Doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout Strategy
|
|
3
|
+
*
|
|
4
|
+
* Provides orientation-specific layout hints for slide templates.
|
|
5
|
+
* Templates use these hints to position content appropriately for
|
|
6
|
+
* different aspect ratios (landscape, portrait, square).
|
|
7
|
+
*
|
|
8
|
+
* Key adaptations by orientation:
|
|
9
|
+
* - Portrait: Larger relative text, stacked layouts instead of side-by-side
|
|
10
|
+
* - Square: Balanced layout with moderate adjustments
|
|
11
|
+
* - Landscape: Default/reference layout
|
|
12
|
+
*/
|
|
13
|
+
import type { ViewportOrientation, ViewportConfig } from './Viewport.js';
|
|
14
|
+
/**
|
|
15
|
+
* Layout hints for template positioning based on orientation.
|
|
16
|
+
*/
|
|
17
|
+
export interface LayoutHints {
|
|
18
|
+
/** Primary content Y position (percentage string, e.g., "35%") */
|
|
19
|
+
primaryY: string;
|
|
20
|
+
/** Secondary content Y position (percentage string) */
|
|
21
|
+
secondaryY: string;
|
|
22
|
+
/** Tertiary/detail Y position (percentage string) */
|
|
23
|
+
tertiaryY: string;
|
|
24
|
+
/** Title font size multiplier (relative to base) */
|
|
25
|
+
titleScale: number;
|
|
26
|
+
/** Body text font size multiplier (relative to base) */
|
|
27
|
+
bodyScale: number;
|
|
28
|
+
/** Two-column: left X position (percentage string) */
|
|
29
|
+
columnLeftX: string;
|
|
30
|
+
/** Two-column: right X position (percentage string) */
|
|
31
|
+
columnRightX: string;
|
|
32
|
+
/** Two-column in portrait: top Y position for stacked layout */
|
|
33
|
+
columnTopY: string;
|
|
34
|
+
/** Two-column in portrait: bottom Y position for stacked layout */
|
|
35
|
+
columnBottomY: string;
|
|
36
|
+
/** Whether two-column should stack vertically */
|
|
37
|
+
stackColumns: boolean;
|
|
38
|
+
/** Max text width (percentage string) for wrapping */
|
|
39
|
+
maxTextWidth: string;
|
|
40
|
+
/** Horizontal padding from edges (percentage string) */
|
|
41
|
+
horizontalPadding: string;
|
|
42
|
+
/** Caption position Y for imageWithCaption (percentage string) */
|
|
43
|
+
captionY: string;
|
|
44
|
+
/** Caption font size multiplier */
|
|
45
|
+
captionScale: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get layout hints for a given orientation.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getLayoutHints(orientation: ViewportOrientation): LayoutHints;
|
|
51
|
+
/**
|
|
52
|
+
* Calculate a scaled font size based on viewport and layout hints.
|
|
53
|
+
*
|
|
54
|
+
* @param basePx - Base font size in pixels (designed for 1920x1080)
|
|
55
|
+
* @param viewport - Target viewport configuration
|
|
56
|
+
* @param orientation - Viewport orientation
|
|
57
|
+
* @param isTitle - Whether this is title text (uses titleScale) or body (uses bodyScale)
|
|
58
|
+
*/
|
|
59
|
+
export declare function scaledFontSize(basePx: number, viewport: ViewportConfig, orientation: ViewportOrientation, isTitle?: boolean): number;
|
|
60
|
+
/**
|
|
61
|
+
* Get position for two-column layout based on orientation.
|
|
62
|
+
* Returns { left: {x, y}, right: {x, y} } positions.
|
|
63
|
+
*/
|
|
64
|
+
export declare function getTwoColumnPositions(orientation: ViewportOrientation): {
|
|
65
|
+
left: {
|
|
66
|
+
x: string;
|
|
67
|
+
y: string;
|
|
68
|
+
};
|
|
69
|
+
right: {
|
|
70
|
+
x: string;
|
|
71
|
+
y: string;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Get safe text bounds for a given orientation.
|
|
76
|
+
* Returns margins to keep text away from edges.
|
|
77
|
+
*/
|
|
78
|
+
export declare function getSafeTextBounds(orientation: ViewportOrientation): {
|
|
79
|
+
left: string;
|
|
80
|
+
right: string;
|
|
81
|
+
top: string;
|
|
82
|
+
bottom: string;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=LayoutStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayoutStrategy.d.ts","sourceRoot":"","sources":["../../src/schemas/LayoutStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGzE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,YAAY,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB;AA4DD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,mBAAmB,GAAG,WAAW,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,mBAAmB,EAChC,OAAO,GAAE,OAAe,GACvB,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,mBAAmB,GAAG;IACvE,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC,CAgBA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,mBAAmB,GAAG;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAQA"}
|