@bendyline/squisq 2.1.0 → 2.3.0
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/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/README.md +8 -8
- package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-DynJleo-.d.ts → Doc-COe-rPQB.d.ts} +7 -5
- package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-dtKahVyD.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- package/dist/{chunk-VWCJ2WXC.js → chunk-2ZWIXGAC.js} +0 -1
- package/dist/{chunk-VYFRI7R6.js → chunk-32R2RZAO.js} +72 -3
- package/dist/chunk-3IGPAPQ7.js +645 -0
- package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
- package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
- package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
- package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
- package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
- package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
- package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
- package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
- package/dist/chunk-BCCXTMN5.js +699 -0
- package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
- package/dist/{chunk-XNLB57UD.js → chunk-EK446BUE.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-JI77MGAK.js → chunk-GIIOY6XR.js} +2178 -1291
- package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
- package/dist/chunk-OPO5K4DZ.js +241 -0
- package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
- package/dist/{chunk-OTKVFVL6.js → chunk-QNTQIEIV.js} +130 -47
- package/dist/{chunk-5UYI3RJB.js → chunk-QWCFK5FN.js} +55 -40
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
- package/dist/{chunk-QUUPYOSP.js → chunk-SPTY4C6F.js} +136 -5
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +311 -13
- package/dist/doc/index.js +25 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +1 -3
- package/dist/icons/index.js +2 -4
- package/dist/icons/inlineIconMarker.js +1 -2
- package/dist/imageEdit/index.d.ts +48 -17
- package/dist/imageEdit/index.js +3 -4
- package/dist/index.d.ts +13 -13
- package/dist/index.js +67 -33
- package/dist/jsonForm/index.d.ts +10 -3
- package/dist/jsonForm/index.js +8 -7
- package/dist/markdown/index.d.ts +75 -11
- package/dist/markdown/index.js +32 -7
- package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-BSMOocve.d.ts} +2 -2
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +12 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +1 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +2 -4
- package/dist/schemas/index.d.ts +18 -6
- package/dist/schemas/index.js +7 -6
- package/dist/spatial/index.d.ts +2 -1
- package/dist/spatial/index.js +1 -2
- package/dist/storage/index.d.ts +4 -2
- package/dist/storage/index.js +1 -2
- package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-BUTWjufL.d.ts} +1 -1
- package/dist/timing/index.js +2 -4
- package/dist/transform/index.d.ts +3 -3
- package/dist/transform/index.js +6 -7
- package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
- package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
- package/dist/versions/index.d.ts +14 -11
- package/dist/versions/index.js +2 -3
- package/package.json +8 -3
- package/dist/chunk-2UQOHYE2.js.map +0 -1
- package/dist/chunk-3E5F2XMR.js.map +0 -1
- package/dist/chunk-4X3JQXNM.js.map +0 -1
- package/dist/chunk-5DKBFXPY.js.map +0 -1
- package/dist/chunk-5J4HKRJF.js.map +0 -1
- package/dist/chunk-5UYI3RJB.js.map +0 -1
- package/dist/chunk-66QO7XFB.js.map +0 -1
- package/dist/chunk-AMIR72JP.js +0 -380
- package/dist/chunk-AMIR72JP.js.map +0 -1
- package/dist/chunk-DBS6RIFL.js.map +0 -1
- package/dist/chunk-DNJKBAI7.js +0 -1
- package/dist/chunk-DNJKBAI7.js.map +0 -1
- package/dist/chunk-ET53IIEP.js +0 -1
- package/dist/chunk-ET53IIEP.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-ILWDXLUK.js.map +0 -1
- package/dist/chunk-JHZWYRSW.js.map +0 -1
- package/dist/chunk-JI77MGAK.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-OTKVFVL6.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.js.map +0 -1
- package/dist/chunk-QUUPYOSP.js.map +0 -1
- package/dist/chunk-R2GC6RLD.js +0 -344
- package/dist/chunk-R2GC6RLD.js.map +0 -1
- package/dist/chunk-R2YZTCLO.js.map +0 -1
- package/dist/chunk-S7A5D7ZJ.js +0 -174
- package/dist/chunk-S7A5D7ZJ.js.map +0 -1
- package/dist/chunk-TUWMK62B.js.map +0 -1
- package/dist/chunk-V543AI2F.js +0 -1
- package/dist/chunk-V543AI2F.js.map +0 -1
- package/dist/chunk-VR7UPJ7C.js.map +0 -1
- package/dist/chunk-VWCJ2WXC.js.map +0 -1
- package/dist/chunk-VYFRI7R6.js.map +0 -1
- package/dist/chunk-XNLB57UD.js.map +0 -1
- package/dist/chunk-ZLQKNOZQ.js +0 -1
- package/dist/chunk-ZLQKNOZQ.js.map +0 -1
- package/dist/doc/index.js.map +0 -1
- package/dist/generate/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/icons/inlineIconMarker.js.map +0 -1
- package/dist/imageEdit/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsonForm/index.js.map +0 -1
- package/dist/markdown/index.js.map +0 -1
- package/dist/narration/index.js.map +0 -1
- package/dist/random/index.js.map +0 -1
- package/dist/recommend/index.js.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/spatial/index.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/timing/index.js.map +0 -1
- package/dist/transform/index.js.map +0 -1
- package/dist/versions/index.js.map +0 -1
- package/src/__tests__/animationUtils.test.ts +0 -117
- package/src/__tests__/annotationCoercion.test.ts +0 -243
- package/src/__tests__/applyNarrationTiming.test.ts +0 -190
- package/src/__tests__/applyRenderStyle.test.ts +0 -146
- package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
- package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
- package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
- package/src/__tests__/asciiDiagramParse.test.ts +0 -233
- package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
- package/src/__tests__/asciiDiagramRender.test.ts +0 -162
- package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
- package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
- package/src/__tests__/asciiTimelineParse.test.ts +0 -205
- package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
- package/src/__tests__/asciiTimelineRender.test.ts +0 -376
- package/src/__tests__/atmosphereLayers.test.ts +0 -108
- package/src/__tests__/attrTokens.test.ts +0 -167
- package/src/__tests__/colorUtils.test.ts +0 -112
- package/src/__tests__/contentContainer.test.ts +0 -325
- package/src/__tests__/contentExtractor.test.ts +0 -243
- package/src/__tests__/coverBlock.test.ts +0 -310
- package/src/__tests__/customTemplateSample.test.ts +0 -144
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
- package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
- package/src/__tests__/dataTable.test.ts +0 -145
- package/src/__tests__/diagramBlock.test.ts +0 -122
- package/src/__tests__/diagramLayout.test.ts +0 -134
- package/src/__tests__/diagramText.test.ts +0 -26
- package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
- package/src/__tests__/drawing.test.ts +0 -109
- package/src/__tests__/drawingBlock.test.ts +0 -124
- package/src/__tests__/drawingLayout.test.ts +0 -171
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
- package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
- package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
- package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
- package/src/__tests__/geohash.test.ts +0 -110
- package/src/__tests__/getLayers.test.ts +0 -243
- package/src/__tests__/getLayersFallback.test.ts +0 -103
- package/src/__tests__/haversine.test.ts +0 -63
- package/src/__tests__/iconResolve.test.ts +0 -122
- package/src/__tests__/imageEditExportSvg.test.ts +0 -70
- package/src/__tests__/imageEditState.test.ts +0 -74
- package/src/__tests__/imageEditVersions.test.ts +0 -243
- package/src/__tests__/inferDocumentTitle.test.ts +0 -50
- package/src/__tests__/inlineIconMarker.test.ts +0 -36
- package/src/__tests__/inputDescriptors.test.ts +0 -162
- package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
- package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
- package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
- package/src/__tests__/jsonForm.pointer.test.ts +0 -149
- package/src/__tests__/jsonForm.tokens.test.ts +0 -84
- package/src/__tests__/layoutBlock.test.ts +0 -83
- package/src/__tests__/layoutLayout.test.ts +0 -169
- package/src/__tests__/localForageAdapter.test.ts +0 -155
- package/src/__tests__/majorApiTypes.test.ts +0 -18
- package/src/__tests__/markdown.test.ts +0 -1009
- package/src/__tests__/markdownIcons.test.ts +0 -104
- package/src/__tests__/markdownSanitize.test.ts +0 -81
- package/src/__tests__/markdownToDoc.test.ts +0 -957
- package/src/__tests__/matchFontFamily.test.ts +0 -114
- package/src/__tests__/materializeBlockLayers.test.ts +0 -167
- package/src/__tests__/materializePageSections.test.ts +0 -404
- package/src/__tests__/materializeTestUtils.ts +0 -17
- package/src/__tests__/mediaAnnotations.test.ts +0 -91
- package/src/__tests__/mediaSchedule.test.ts +0 -118
- package/src/__tests__/narrationAlign.test.ts +0 -150
- package/src/__tests__/narrationFeatures.test.ts +0 -71
- package/src/__tests__/narrationNuclei.test.ts +0 -45
- package/src/__tests__/narrationPacing.test.ts +0 -189
- package/src/__tests__/narrationScript.test.ts +0 -149
- package/src/__tests__/narrationSessionRepro.test.ts +0 -62
- package/src/__tests__/narrationSidecar.test.ts +0 -88
- package/src/__tests__/narrationSyllables.test.ts +0 -65
- package/src/__tests__/narrationTestSignals.ts +0 -167
- package/src/__tests__/narrationVad.test.ts +0 -66
- package/src/__tests__/pageStyle.test.ts +0 -258
- package/src/__tests__/pandocAttrParse.test.ts +0 -187
- package/src/__tests__/recommendTemplates.test.ts +0 -183
- package/src/__tests__/resolveDocTheme.test.ts +0 -69
- package/src/__tests__/rootExports.test.ts +0 -61
- package/src/__tests__/scopedContentContainer.test.ts +0 -109
- package/src/__tests__/seededRandom.test.ts +0 -142
- package/src/__tests__/shapeGeometry.test.ts +0 -138
- package/src/__tests__/shapeVocabulary.test.ts +0 -133
- package/src/__tests__/storage.test.ts +0 -60
- package/src/__tests__/structuredData.test.ts +0 -249
- package/src/__tests__/surface.test.ts +0 -68
- package/src/__tests__/templateAnnotationParse.test.ts +0 -173
- package/src/__tests__/templateInputs.test.ts +0 -69
- package/src/__tests__/templateMetadata.test.ts +0 -32
- package/src/__tests__/templates.test.ts +0 -710
- package/src/__tests__/themeCompile.test.ts +0 -225
- package/src/__tests__/themeValidator.test.ts +0 -131
- package/src/__tests__/timing.test.ts +0 -167
- package/src/__tests__/transformProvenance.test.ts +0 -160
- package/src/__tests__/transformV2.test.ts +0 -163
- package/src/__tests__/transitionNormalize.test.ts +0 -61
- package/src/__tests__/treeviewBattle.test.ts +0 -76
- package/src/__tests__/treeviewDetect.test.ts +0 -168
- package/src/__tests__/treeviewParse.test.ts +0 -118
- package/src/__tests__/treeviewPipeline.test.ts +0 -183
- package/src/__tests__/treeviewRender.test.ts +0 -91
- package/src/__tests__/validateDoc.test.ts +0 -260
- package/src/__tests__/versions.test.ts +0 -459
- package/src/doc/annotationBlocks.ts +0 -117
- package/src/doc/applyNarrationTiming.ts +0 -244
- package/src/doc/asciiDiagram/chars.ts +0 -210
- package/src/doc/asciiDiagram/detect.ts +0 -175
- package/src/doc/asciiDiagram/index.ts +0 -38
- package/src/doc/asciiDiagram/mapping.ts +0 -225
- package/src/doc/asciiDiagram/parse.ts +0 -1095
- package/src/doc/asciiDiagram/render.ts +0 -963
- package/src/doc/asciiDiagram/repair.ts +0 -400
- package/src/doc/asciiDiagram/types.ts +0 -65
- package/src/doc/asciiTimeline/detect.ts +0 -138
- package/src/doc/asciiTimeline/index.ts +0 -26
- package/src/doc/asciiTimeline/mapping.ts +0 -43
- package/src/doc/asciiTimeline/parse.ts +0 -870
- package/src/doc/asciiTimeline/render.ts +0 -427
- package/src/doc/asciiTimeline/types.ts +0 -73
- package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
- package/src/doc/audioMapping.ts +0 -442
- package/src/doc/customTemplatesFrontmatter.ts +0 -273
- package/src/doc/customThemesFrontmatter.ts +0 -95
- package/src/doc/docToMarkdown.ts +0 -284
- package/src/doc/index.ts +0 -161
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -465
- package/src/doc/mediaAnnotations.ts +0 -120
- package/src/doc/page/PageSection.ts +0 -174
- package/src/doc/page/materializePageSection.ts +0 -616
- package/src/doc/page/resolvePageBlock.ts +0 -108
- package/src/doc/page/sectionExtractors.ts +0 -466
- package/src/doc/pageCss.ts +0 -628
- package/src/doc/resolveDocTheme.ts +0 -56
- package/src/doc/standaloneAnnotation.ts +0 -58
- package/src/doc/structuredData.ts +0 -301
- package/src/doc/templateInputs.ts +0 -424
- package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
- package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
- package/src/doc/templates/accentImage.ts +0 -362
- package/src/doc/templates/captionUtils.ts +0 -56
- package/src/doc/templates/comparisonBar.ts +0 -173
- package/src/doc/templates/coverBlock.ts +0 -255
- package/src/doc/templates/customTemplate.ts +0 -51
- package/src/doc/templates/dataTable.ts +0 -102
- package/src/doc/templates/dateEvent.ts +0 -147
- package/src/doc/templates/definitionCard.ts +0 -140
- package/src/doc/templates/diagramBlock.ts +0 -403
- package/src/doc/templates/diagramLayout.ts +0 -159
- package/src/doc/templates/drawingBlock.ts +0 -325
- package/src/doc/templates/drawingLayout.ts +0 -539
- package/src/doc/templates/factCard.ts +0 -146
- package/src/doc/templates/fallbackBlock.ts +0 -123
- package/src/doc/templates/featureBlock.ts +0 -209
- package/src/doc/templates/fullBleedQuote.ts +0 -83
- package/src/doc/templates/imageWithCaption.ts +0 -186
- package/src/doc/templates/index.ts +0 -642
- package/src/doc/templates/inputDescriptors.ts +0 -451
- package/src/doc/templates/layoutBlock.ts +0 -43
- package/src/doc/templates/layoutLayout.ts +0 -243
- package/src/doc/templates/listBlock.ts +0 -207
- package/src/doc/templates/mapBlock.ts +0 -138
- package/src/doc/templates/metadata.ts +0 -130
- package/src/doc/templates/persistentLayers.ts +0 -526
- package/src/doc/templates/photoGrid.ts +0 -190
- package/src/doc/templates/pullQuote.ts +0 -141
- package/src/doc/templates/quoteBlock.ts +0 -141
- package/src/doc/templates/registry.ts +0 -88
- package/src/doc/templates/sectionHeader.ts +0 -120
- package/src/doc/templates/statHighlight.ts +0 -146
- package/src/doc/templates/templateNames.ts +0 -22
- package/src/doc/templates/timelineBlock.ts +0 -613
- package/src/doc/templates/titleBlock.ts +0 -150
- package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
- package/src/doc/templates/tokens/resolveTokens.ts +0 -453
- package/src/doc/templates/treeBlock.ts +0 -131
- package/src/doc/templates/twoColumn.ts +0 -263
- package/src/doc/templates/videoPullQuote.ts +0 -142
- package/src/doc/templates/videoWithCaption.ts +0 -135
- package/src/doc/treeview/chars.ts +0 -72
- package/src/doc/treeview/detect.ts +0 -145
- package/src/doc/treeview/index.ts +0 -30
- package/src/doc/treeview/mapping.ts +0 -95
- package/src/doc/treeview/parse.ts +0 -201
- package/src/doc/treeview/render.ts +0 -41
- package/src/doc/treeview/types.ts +0 -43
- package/src/doc/utils/animationUtils.ts +0 -399
- package/src/doc/utils/applyRenderStyle.ts +0 -106
- package/src/doc/utils/diagramText.ts +0 -78
- package/src/doc/utils/imageTreatment.ts +0 -70
- package/src/doc/utils/nearest.ts +0 -59
- package/src/doc/utils/shapeGeometry.ts +0 -614
- package/src/doc/utils/themeUtils.ts +0 -243
- package/src/doc/validate.ts +0 -575
- package/src/generate/contentExtractor.ts +0 -921
- package/src/generate/index.ts +0 -18
- package/src/generate/templateMapper.ts +0 -177
- package/src/icons/iconData.ts +0 -31
- package/src/icons/index.ts +0 -26
- package/src/icons/inlineIconMarker.ts +0 -73
- package/src/icons/resolve.ts +0 -139
- package/src/imageEdit/ImageEditVersionManager.ts +0 -73
- package/src/imageEdit/export.ts +0 -410
- package/src/imageEdit/index.ts +0 -72
- package/src/imageEdit/persistence.ts +0 -113
- package/src/imageEdit/state.ts +0 -112
- package/src/imageEdit/versionPaths.ts +0 -44
- package/src/imageEdit/versions.ts +0 -152
- package/src/index.ts +0 -15
- package/src/internal/immutable.ts +0 -58
- package/src/jsonForm/chooseControl.ts +0 -88
- package/src/jsonForm/evaluateWhen.ts +0 -59
- package/src/jsonForm/index.ts +0 -32
- package/src/jsonForm/inferSchema.ts +0 -25
- package/src/jsonForm/pointer.ts +0 -154
- package/src/jsonForm/tokens.ts +0 -78
- package/src/jsonForm/types.ts +0 -167
- package/src/markdown/annotationCoercion.ts +0 -295
- package/src/markdown/attrTokens.ts +0 -243
- package/src/markdown/convert.ts +0 -1353
- package/src/markdown/htmlParse.ts +0 -212
- package/src/markdown/index.ts +0 -152
- package/src/markdown/parse.ts +0 -103
- package/src/markdown/sanitize.ts +0 -318
- package/src/markdown/stringify.ts +0 -207
- package/src/markdown/types.ts +0 -710
- package/src/markdown/utils.ts +0 -459
- package/src/narration/align.ts +0 -514
- package/src/narration/features.ts +0 -231
- package/src/narration/index.ts +0 -86
- package/src/narration/nuclei.ts +0 -118
- package/src/narration/pacing.ts +0 -211
- package/src/narration/script.ts +0 -239
- package/src/narration/session.ts +0 -100
- package/src/narration/sidecar.ts +0 -187
- package/src/narration/syllables.ts +0 -85
- package/src/narration/trace.ts +0 -50
- package/src/narration/types.ts +0 -299
- package/src/narration/vad.ts +0 -131
- package/src/ngeohash.d.ts +0 -11
- package/src/random/SeededRandom.ts +0 -127
- package/src/random/index.ts +0 -1
- package/src/recommend/index.ts +0 -16
- package/src/recommend/numberHighlight.ts +0 -25
- package/src/recommend/templates.ts +0 -393
- package/src/schemas/BlockTemplates.ts +0 -1046
- package/src/schemas/CustomTemplates.ts +0 -126
- package/src/schemas/Doc.ts +0 -1073
- package/src/schemas/ImageEditDoc.ts +0 -102
- package/src/schemas/LayoutStrategy.ts +0 -178
- package/src/schemas/Media.ts +0 -179
- package/src/schemas/MediaProvider.ts +0 -70
- package/src/schemas/PageStyle.ts +0 -213
- package/src/schemas/Theme.ts +0 -413
- package/src/schemas/Transitions.ts +0 -224
- package/src/schemas/Types.ts +0 -15
- package/src/schemas/Viewport.ts +0 -91
- package/src/schemas/colorUtils.ts +0 -219
- package/src/schemas/fontStacks.ts +0 -339
- package/src/schemas/index.ts +0 -31
- package/src/schemas/pageStyleDefaults.ts +0 -204
- package/src/schemas/themeCompile.ts +0 -244
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -609
- package/src/schemas/themes/bold.json +0 -77
- package/src/schemas/themes/cinematic.json +0 -143
- package/src/schemas/themes/documentary.json +0 -125
- package/src/schemas/themes/gezellig.json +0 -123
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -126
- package/src/schemas/themes/minimalist.json +0 -74
- package/src/schemas/themes/morning-light.json +0 -117
- package/src/schemas/themes/standard-dark.json +0 -109
- package/src/schemas/themes/standard.json +0 -98
- package/src/schemas/themes/tech-dark.json +0 -143
- package/src/schemas/themes/warm-earth.json +0 -74
- package/src/spatial/Geohash.ts +0 -196
- package/src/spatial/Haversine.ts +0 -59
- package/src/spatial/index.ts +0 -2
- package/src/storage/ContentContainer.ts +0 -220
- package/src/storage/LocalForageAdapter.ts +0 -103
- package/src/storage/LocalStorageAdapter.ts +0 -57
- package/src/storage/MediaProviderFromContainer.ts +0 -92
- package/src/storage/MemoryStorageAdapter.ts +0 -37
- package/src/storage/ScopedContentContainer.ts +0 -143
- package/src/storage/Storage.ts +0 -28
- package/src/storage/index.ts +0 -9
- package/src/timing/index.ts +0 -17
- package/src/timing/narrationTiming.ts +0 -220
- package/src/timing/readingTime.ts +0 -94
- package/src/transform/applyTransform.ts +0 -122
- package/src/transform/blockAnalyzer.ts +0 -181
- package/src/transform/index.ts +0 -23
- package/src/transform/registry.ts +0 -217
- package/src/transform/styles/dataDriven.ts +0 -18
- package/src/transform/styles/documentary.ts +0 -18
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -19
- package/src/transform/styles/minimal.ts +0 -18
- package/src/transform/styles/narrative.ts +0 -19
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -158
- package/src/versions/DocumentVersionManager.ts +0 -70
- package/src/versions/gitignore.ts +0 -34
- package/src/versions/index.ts +0 -56
- package/src/versions/operations.ts +0 -144
- package/src/versions/paths.ts +0 -51
- package/src/versions/snapshotStore.ts +0 -202
- package/src/versions/timestamp.ts +0 -48
- package/src/versions/types.ts +0 -93
|
@@ -1,642 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Block Template Registry
|
|
3
|
-
*
|
|
4
|
-
* Central registry of all block templates. Provides functions to:
|
|
5
|
-
* - Look up templates by name
|
|
6
|
-
* - Expand template blocks into full Layer arrays
|
|
7
|
-
* - Convert a template-based doc script into a renderable format
|
|
8
|
-
*
|
|
9
|
-
* Supports multiple viewport configurations for different aspect ratios.
|
|
10
|
-
*
|
|
11
|
-
* This is shared code used by both site and efb-app doc renderers.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { Block } from '../../schemas/Doc.js';
|
|
15
|
-
import type {
|
|
16
|
-
TemplateBlock,
|
|
17
|
-
DocBlock,
|
|
18
|
-
PersistentLayerConfig,
|
|
19
|
-
} from '../../schemas/BlockTemplates.js';
|
|
20
|
-
import type { Theme } from '../../schemas/Theme.js';
|
|
21
|
-
import type { CustomTemplateDefinition } from '../../schemas/CustomTemplates.js';
|
|
22
|
-
import { isTemplateBlock } from '../../schemas/BlockTemplates.js';
|
|
23
|
-
import { DEFAULT_THEME as defaultTheme } from '../../schemas/themeLibrary.js';
|
|
24
|
-
import { expandPersistentLayers } from './persistentLayers.js';
|
|
25
|
-
import { resolveBlockTransition } from '../../schemas/Transitions.js';
|
|
26
|
-
import { resolveTemplateName } from './templateNames.js';
|
|
27
|
-
import { cloneData } from '../../internal/immutable.js';
|
|
28
|
-
import type { ViewportConfig } from '../../schemas/Viewport.js';
|
|
29
|
-
import { VIEWPORT_PRESETS } from '../../schemas/Viewport.js';
|
|
30
|
-
import { buildRegistry, templateRegistry, type RuntimeTemplateRegistry } from './registry.js';
|
|
31
|
-
import {
|
|
32
|
-
materializeBlockLayersWithRuntime,
|
|
33
|
-
type ExpandedPersistentLayerSet,
|
|
34
|
-
type LayerMaterializationDiagnostic,
|
|
35
|
-
type LayerMaterializationFailureMode,
|
|
36
|
-
} from '../materializeBlockLayers.js';
|
|
37
|
-
|
|
38
|
-
export { TEMPLATE_METADATA } from './metadata.js';
|
|
39
|
-
export type { TemplateMetadata } from './metadata.js';
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Registry mapping template ids (the strings that appear in
|
|
43
|
-
* `{[name]}` markdown annotations) to their implementation functions.
|
|
44
|
-
*
|
|
45
|
-
* Some implementation functions keep historical "Block" suffixes
|
|
46
|
-
* (`titleBlock`, `quoteBlock`, `mapBlock`, `listBlock`) for source
|
|
47
|
-
* readability — the registry surfaces them under the cleaner short
|
|
48
|
-
* ids (`title`, `quote`, `map`, `list`). Internal aliases keep legacy
|
|
49
|
-
* document names readable without expanding the public API surface.
|
|
50
|
-
*
|
|
51
|
-
* Note: coverBlock is not in the registry as it's used directly for
|
|
52
|
-
* start blocks, not as a regular template in the block sequence.
|
|
53
|
-
*/
|
|
54
|
-
export { buildRegistry, templateRegistry } from './registry.js';
|
|
55
|
-
export type { RuntimeTemplateRegistry } from './registry.js';
|
|
56
|
-
|
|
57
|
-
export { materializeBlockLayers } from '../materializeBlockLayers.js';
|
|
58
|
-
export type {
|
|
59
|
-
BlockLayerMaterialization,
|
|
60
|
-
LayerMaterializationDiagnostic,
|
|
61
|
-
LayerMaterializationFailureMode,
|
|
62
|
-
LayerMaterializationSource,
|
|
63
|
-
MaterializeBlockLayersOptions,
|
|
64
|
-
} from '../materializeBlockLayers.js';
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Resolve a template id through the internal compatibility table. Returns
|
|
68
|
-
* the input unchanged when no alias is registered.
|
|
69
|
-
*/
|
|
70
|
-
export { resolveTemplateName } from './templateNames.js';
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Container templates render their parent block by consuming the block's
|
|
74
|
-
* child headings (via `context.children`) — `diagram` draws them as nodes,
|
|
75
|
-
* `drawing` as shapes, `layout` as absolutely-positioned layers. Those
|
|
76
|
-
* children are therefore NOT independently renderable slides/sections;
|
|
77
|
-
* render paths use {@link isContainerTemplate} to skip descending into
|
|
78
|
-
* them (see `flattenRenderableBlocks`).
|
|
79
|
-
*/
|
|
80
|
-
export { CONTAINER_TEMPLATES } from './templateNames.js';
|
|
81
|
-
|
|
82
|
-
/** True when `name` (or its alias) is a children-consuming container template. */
|
|
83
|
-
export { isContainerTemplate } from './templateNames.js';
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Audio segment timing info for aligning blocks with audio.
|
|
87
|
-
*/
|
|
88
|
-
export interface AudioSegmentTiming {
|
|
89
|
-
/** Start time of this segment in the overall timeline */
|
|
90
|
-
startTime: number;
|
|
91
|
-
/** Duration of this segment */
|
|
92
|
-
duration: number;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Options for expanding doc blocks.
|
|
97
|
-
*/
|
|
98
|
-
export interface ExpandDocBlocksOptions {
|
|
99
|
-
/** Theme for template rendering (defaults to DEFAULT_THEME) */
|
|
100
|
-
theme?: Theme;
|
|
101
|
-
/** Viewport configuration (defaults to 16:9 landscape) */
|
|
102
|
-
viewport?: ViewportConfig;
|
|
103
|
-
/** Persistent layers for visual consistency across blocks */
|
|
104
|
-
persistentLayers?: PersistentLayerConfig | false;
|
|
105
|
-
/**
|
|
106
|
-
* Audio segment timing information.
|
|
107
|
-
* When provided, blocks are timed relative to their audio segment's start time,
|
|
108
|
-
* ensuring proper synchronization with audio playback.
|
|
109
|
-
*/
|
|
110
|
-
audioSegments?: AudioSegmentTiming[];
|
|
111
|
-
/**
|
|
112
|
-
* User-defined custom templates to merge onto the built-in registry
|
|
113
|
-
* before expanding blocks. Typically passed straight from
|
|
114
|
-
* `Doc.customTemplates`. Built-in names take precedence on collision.
|
|
115
|
-
*/
|
|
116
|
-
customTemplates?: readonly CustomTemplateDefinition[];
|
|
117
|
-
/** Failed templates render a visible fallback by default. */
|
|
118
|
-
failureMode?: LayerMaterializationFailureMode;
|
|
119
|
-
/** Receives structured template failures without hidden console output. */
|
|
120
|
-
onDiagnostic?: (
|
|
121
|
-
diagnostic: LayerMaterializationDiagnostic,
|
|
122
|
-
block: DocBlock,
|
|
123
|
-
blockIndex: number,
|
|
124
|
-
) => void;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Expand all template blocks in a doc, calculating start times.
|
|
129
|
-
* Injects persistent layers (bottom/top) based on per-block flags.
|
|
130
|
-
*
|
|
131
|
-
* When audioSegments is provided, blocks are timed relative to their audio segment's
|
|
132
|
-
* start time, ensuring blocks appear when their audio is playing. Blocks within each
|
|
133
|
-
* segment are distributed proportionally across the segment duration.
|
|
134
|
-
*
|
|
135
|
-
* @param blocks - Array of template or raw blocks
|
|
136
|
-
* @param options - Expansion options including theme, viewport, and persistent layers
|
|
137
|
-
*/
|
|
138
|
-
/**
|
|
139
|
-
* Materialize one block through the canonical layer contract, then add its
|
|
140
|
-
* timeline envelope and resolved transition.
|
|
141
|
-
*/
|
|
142
|
-
function materializeScheduledBlock(
|
|
143
|
-
sourceBlock: DocBlock,
|
|
144
|
-
blockIndex: number,
|
|
145
|
-
totalBlocks: number,
|
|
146
|
-
theme: Theme,
|
|
147
|
-
viewport: ViewportConfig,
|
|
148
|
-
persistentLayers: PersistentLayerConfig | undefined,
|
|
149
|
-
expandedPersistentLayers: ExpandedPersistentLayerSet | undefined,
|
|
150
|
-
registry: RuntimeTemplateRegistry,
|
|
151
|
-
failureMode: LayerMaterializationFailureMode,
|
|
152
|
-
onDiagnostic?: ExpandDocBlocksOptions['onDiagnostic'],
|
|
153
|
-
): Block {
|
|
154
|
-
const materialized = materializeBlockLayersWithRuntime(
|
|
155
|
-
sourceBlock,
|
|
156
|
-
{
|
|
157
|
-
theme,
|
|
158
|
-
viewport,
|
|
159
|
-
persistentLayers: persistentLayers ?? false,
|
|
160
|
-
blockIndex,
|
|
161
|
-
totalBlocks,
|
|
162
|
-
failureMode,
|
|
163
|
-
},
|
|
164
|
-
{ registry, expandedPersistentLayers },
|
|
165
|
-
);
|
|
166
|
-
if (materialized.diagnostic) {
|
|
167
|
-
onDiagnostic?.(materialized.diagnostic, sourceBlock, blockIndex);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const expandedBlock: Block = isTemplateBlock(sourceBlock)
|
|
171
|
-
? {
|
|
172
|
-
id: sourceBlock.id,
|
|
173
|
-
startTime: 0,
|
|
174
|
-
duration: sourceBlock.duration,
|
|
175
|
-
audioSegment: sourceBlock.audioSegment,
|
|
176
|
-
...(materialized.layers.length > 0 ? { layers: materialized.layers } : {}),
|
|
177
|
-
transition: sourceBlock.transition,
|
|
178
|
-
template: sourceBlock.template,
|
|
179
|
-
}
|
|
180
|
-
: {
|
|
181
|
-
...cloneData(sourceBlock as Block),
|
|
182
|
-
...(materialized.layers.length > 0 ? { layers: materialized.layers } : {}),
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
const transition = resolveBlockTransition(expandedBlock, theme, blockIndex);
|
|
186
|
-
if (transition !== expandedBlock.transition) {
|
|
187
|
-
expandedBlock.transition = transition;
|
|
188
|
-
}
|
|
189
|
-
return expandedBlock;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export function expandDocBlocks(blocks: DocBlock[], options: ExpandDocBlocksOptions = {}): Block[] {
|
|
193
|
-
const opts: ExpandDocBlocksOptions = options;
|
|
194
|
-
|
|
195
|
-
const theme = opts.theme ?? defaultTheme;
|
|
196
|
-
const viewport = opts.viewport ?? VIEWPORT_PRESETS.landscape;
|
|
197
|
-
const {
|
|
198
|
-
persistentLayers,
|
|
199
|
-
audioSegments,
|
|
200
|
-
customTemplates,
|
|
201
|
-
failureMode = 'fallback',
|
|
202
|
-
onDiagnostic,
|
|
203
|
-
} = opts;
|
|
204
|
-
const totalBlocks = blocks.length;
|
|
205
|
-
// Merge user-defined templates once, then share the immutable runtime view.
|
|
206
|
-
const registry: RuntimeTemplateRegistry =
|
|
207
|
-
customTemplates && customTemplates.length > 0
|
|
208
|
-
? buildRegistry(customTemplates)
|
|
209
|
-
: (templateRegistry as unknown as RuntimeTemplateRegistry);
|
|
210
|
-
|
|
211
|
-
// Callers that pass no config inherit the theme's atmosphere.
|
|
212
|
-
const effectivePersistentLayers =
|
|
213
|
-
persistentLayers === false ? undefined : (persistentLayers ?? theme.persistentLayers);
|
|
214
|
-
const expandedPersistentLayers = effectivePersistentLayers
|
|
215
|
-
? {
|
|
216
|
-
bottomLayers: expandPersistentLayers(effectivePersistentLayers.bottomLayers, theme),
|
|
217
|
-
topLayers: expandPersistentLayers(effectivePersistentLayers.topLayers, theme),
|
|
218
|
-
}
|
|
219
|
-
: undefined;
|
|
220
|
-
|
|
221
|
-
// If no audio segments provided, use simple cumulative timing
|
|
222
|
-
if (!audioSegments || audioSegments.length === 0) {
|
|
223
|
-
let currentTime = 0;
|
|
224
|
-
return blocks.map((block, index) => {
|
|
225
|
-
const expandedBlock = materializeScheduledBlock(
|
|
226
|
-
block,
|
|
227
|
-
index,
|
|
228
|
-
totalBlocks,
|
|
229
|
-
theme,
|
|
230
|
-
viewport,
|
|
231
|
-
effectivePersistentLayers,
|
|
232
|
-
expandedPersistentLayers,
|
|
233
|
-
registry,
|
|
234
|
-
failureMode,
|
|
235
|
-
onDiagnostic,
|
|
236
|
-
);
|
|
237
|
-
expandedBlock.startTime = currentTime;
|
|
238
|
-
currentTime += expandedBlock.duration;
|
|
239
|
-
return expandedBlock;
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Group blocks by their audioSegment index
|
|
244
|
-
const blocksBySegment = new Map<number, { block: DocBlock; originalIndex: number }[]>();
|
|
245
|
-
blocks.forEach((block, index) => {
|
|
246
|
-
const segmentIndex = (block as TemplateBlock).audioSegment ?? 0;
|
|
247
|
-
if (!blocksBySegment.has(segmentIndex)) {
|
|
248
|
-
blocksBySegment.set(segmentIndex, []);
|
|
249
|
-
}
|
|
250
|
-
blocksBySegment.get(segmentIndex)!.push({ block, originalIndex: index });
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
// Expand blocks, timing them relative to their audio segment
|
|
254
|
-
const expandedBlocks: Block[] = new Array(blocks.length);
|
|
255
|
-
|
|
256
|
-
for (const [segmentIndex, segmentBlocks] of blocksBySegment) {
|
|
257
|
-
const audioSegment = audioSegments[segmentIndex];
|
|
258
|
-
if (!audioSegment) {
|
|
259
|
-
// No audio segment info - use simple sequential timing within the segment
|
|
260
|
-
let offsetTime = 0;
|
|
261
|
-
for (const { block, originalIndex } of segmentBlocks) {
|
|
262
|
-
const expandedBlock = materializeScheduledBlock(
|
|
263
|
-
block,
|
|
264
|
-
originalIndex,
|
|
265
|
-
totalBlocks,
|
|
266
|
-
theme,
|
|
267
|
-
viewport,
|
|
268
|
-
effectivePersistentLayers,
|
|
269
|
-
expandedPersistentLayers,
|
|
270
|
-
registry,
|
|
271
|
-
failureMode,
|
|
272
|
-
onDiagnostic,
|
|
273
|
-
);
|
|
274
|
-
|
|
275
|
-
expandedBlock.startTime = offsetTime;
|
|
276
|
-
offsetTime += expandedBlock.duration;
|
|
277
|
-
expandedBlocks[originalIndex] = expandedBlock;
|
|
278
|
-
}
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Section headers (sectionHeader template) get their original duration since
|
|
283
|
-
// the title is spoken at the start of the segment. Other blocks are scaled
|
|
284
|
-
// to fill the remaining time.
|
|
285
|
-
const sectionHeaderBlocks: typeof segmentBlocks = [];
|
|
286
|
-
const contentBlocks: typeof segmentBlocks = [];
|
|
287
|
-
|
|
288
|
-
for (const item of segmentBlocks) {
|
|
289
|
-
const templateBlock = item.block as TemplateBlock;
|
|
290
|
-
if (templateBlock.template === 'sectionHeader') {
|
|
291
|
-
sectionHeaderBlocks.push(item);
|
|
292
|
-
} else {
|
|
293
|
-
contentBlocks.push(item);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// Calculate fixed duration (section headers) and scalable duration (content)
|
|
298
|
-
const fixedDuration = sectionHeaderBlocks.reduce((sum, { block }) => {
|
|
299
|
-
return sum + ((block as TemplateBlock).duration ?? 0);
|
|
300
|
-
}, 0);
|
|
301
|
-
|
|
302
|
-
const contentBlockDuration = contentBlocks.reduce((sum, { block }) => {
|
|
303
|
-
return sum + ((block as TemplateBlock).duration ?? 0);
|
|
304
|
-
}, 0);
|
|
305
|
-
|
|
306
|
-
// Remaining time after section header(s) for content blocks
|
|
307
|
-
const remainingDuration = audioSegment.duration - fixedDuration;
|
|
308
|
-
|
|
309
|
-
// Scale factor only applies to content blocks
|
|
310
|
-
const scaleFactor =
|
|
311
|
-
contentBlockDuration > 0 && remainingDuration > 0
|
|
312
|
-
? remainingDuration / contentBlockDuration
|
|
313
|
-
: 1;
|
|
314
|
-
|
|
315
|
-
// First pass: expand all blocks and track which have source timing
|
|
316
|
-
interface ExpandedSlideInfo {
|
|
317
|
-
block: Block;
|
|
318
|
-
originalIndex: number;
|
|
319
|
-
templateBlock: TemplateBlock;
|
|
320
|
-
hasSourceTiming: boolean;
|
|
321
|
-
}
|
|
322
|
-
const expandedInfos: ExpandedSlideInfo[] = [];
|
|
323
|
-
|
|
324
|
-
for (const { block, originalIndex } of segmentBlocks) {
|
|
325
|
-
const expandedBlock = materializeScheduledBlock(
|
|
326
|
-
block,
|
|
327
|
-
originalIndex,
|
|
328
|
-
totalBlocks,
|
|
329
|
-
theme,
|
|
330
|
-
viewport,
|
|
331
|
-
effectivePersistentLayers,
|
|
332
|
-
expandedPersistentLayers,
|
|
333
|
-
registry,
|
|
334
|
-
failureMode,
|
|
335
|
-
onDiagnostic,
|
|
336
|
-
);
|
|
337
|
-
|
|
338
|
-
const templateBlock = block as TemplateBlock;
|
|
339
|
-
expandedInfos.push({
|
|
340
|
-
block: expandedBlock,
|
|
341
|
-
originalIndex,
|
|
342
|
-
templateBlock,
|
|
343
|
-
hasSourceTiming: typeof templateBlock.sourceStartTime === 'number',
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// Sort blocks within this segment.
|
|
348
|
-
// When ANY block has source timing (from audio analysis), section headers
|
|
349
|
-
// are placed first since they are intro cards for the segment. When there
|
|
350
|
-
// is no source timing (e.g., preview/synthetic mode), keep original
|
|
351
|
-
// document order so the slideshow matches what the author wrote.
|
|
352
|
-
const hasAnySourceTiming = expandedInfos.some((info) => info.hasSourceTiming);
|
|
353
|
-
|
|
354
|
-
expandedInfos.sort((a, b) => {
|
|
355
|
-
if (hasAnySourceTiming) {
|
|
356
|
-
const aIsHeader = a.templateBlock.template === 'sectionHeader';
|
|
357
|
-
const bIsHeader = b.templateBlock.template === 'sectionHeader';
|
|
358
|
-
|
|
359
|
-
// Section headers come first when we have audio-based timing
|
|
360
|
-
if (aIsHeader && !bIsHeader) return -1;
|
|
361
|
-
if (!aIsHeader && bIsHeader) return 1;
|
|
362
|
-
|
|
363
|
-
// Both have source timing - sort by time
|
|
364
|
-
if (a.hasSourceTiming && b.hasSourceTiming) {
|
|
365
|
-
return a.templateBlock.sourceStartTime! - b.templateBlock.sourceStartTime!;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// One has timing, one doesn't - timing comes first
|
|
369
|
-
if (a.hasSourceTiming && !b.hasSourceTiming) return -1;
|
|
370
|
-
if (!a.hasSourceTiming && b.hasSourceTiming) return 1;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Keep original document order
|
|
374
|
-
return a.originalIndex - b.originalIndex;
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
// Second pass: assign start times
|
|
378
|
-
// Slides with sourceStartTime use that; others fill gaps
|
|
379
|
-
let offsetWithinSegment = 0;
|
|
380
|
-
for (let i = 0; i < expandedInfos.length; i++) {
|
|
381
|
-
const info = expandedInfos[i];
|
|
382
|
-
const { block: expandedBlock, templateBlock } = info;
|
|
383
|
-
|
|
384
|
-
// Use source timing if available, otherwise use sequential offset
|
|
385
|
-
if (info.hasSourceTiming) {
|
|
386
|
-
// Use the source timing - this is when the content is spoken
|
|
387
|
-
const sourceStart = templateBlock.sourceStartTime!;
|
|
388
|
-
expandedBlock.startTime = audioSegment.startTime + sourceStart;
|
|
389
|
-
// Use source duration if available, otherwise use block duration
|
|
390
|
-
if (typeof templateBlock.sourceDuration === 'number') {
|
|
391
|
-
expandedBlock.duration = Math.max(5, templateBlock.sourceDuration);
|
|
392
|
-
}
|
|
393
|
-
// Update offset for next block
|
|
394
|
-
offsetWithinSegment = sourceStart + expandedBlock.duration;
|
|
395
|
-
} else if (templateBlock.template === 'sectionHeader') {
|
|
396
|
-
// Section headers start at the beginning of the segment
|
|
397
|
-
expandedBlock.startTime = audioSegment.startTime + offsetWithinSegment;
|
|
398
|
-
offsetWithinSegment += expandedBlock.duration;
|
|
399
|
-
} else {
|
|
400
|
-
// No source timing - place after previous block
|
|
401
|
-
expandedBlock.startTime = audioSegment.startTime + offsetWithinSegment;
|
|
402
|
-
// Scale content block duration to fit
|
|
403
|
-
const scaledDuration = expandedBlock.duration * scaleFactor;
|
|
404
|
-
expandedBlock.duration = scaledDuration;
|
|
405
|
-
offsetWithinSegment += scaledDuration;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
expandedBlocks[info.originalIndex] = expandedBlock;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// Third pass: fix overlaps and gaps by adjusting durations
|
|
412
|
-
// Sort by startTime for overlap detection
|
|
413
|
-
const segmentExpandedBlocks = expandedInfos
|
|
414
|
-
.map((info) => expandedBlocks[info.originalIndex])
|
|
415
|
-
.sort((a, b) => a.startTime - b.startTime);
|
|
416
|
-
|
|
417
|
-
for (let i = 0; i < segmentExpandedBlocks.length - 1; i++) {
|
|
418
|
-
const current = segmentExpandedBlocks[i];
|
|
419
|
-
const next = segmentExpandedBlocks[i + 1];
|
|
420
|
-
const currentEnd = current.startTime + current.duration;
|
|
421
|
-
|
|
422
|
-
if (currentEnd > next.startTime) {
|
|
423
|
-
// Overlap - shorten current block to end when next begins
|
|
424
|
-
current.duration = next.startTime - current.startTime;
|
|
425
|
-
} else if (currentEnd < next.startTime - 0.5) {
|
|
426
|
-
// Gap > 0.5s - extend current block to fill (visual continuity)
|
|
427
|
-
// Same formula as overlap: snap to next block start
|
|
428
|
-
current.duration = Math.max(0.1, next.startTime - current.startTime);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// Minimum gap between any two transitions (including section boundaries).
|
|
433
|
-
// No block should be visible for less than this before a transition occurs.
|
|
434
|
-
const MIN_TRANSITION_GAP = 5;
|
|
435
|
-
const segmentEnd = audioSegment.startTime + audioSegment.duration;
|
|
436
|
-
|
|
437
|
-
// Fourth pass: enforce minimum transition gap at section boundary.
|
|
438
|
-
// Eliminate blocks from the end that would start within MIN_TRANSITION_GAP
|
|
439
|
-
// of the section end (creating a jarring transition right before the next
|
|
440
|
-
// section header). Loop to handle cascading eliminations.
|
|
441
|
-
while (segmentExpandedBlocks.length > 1) {
|
|
442
|
-
const lastBlock = segmentExpandedBlocks[segmentExpandedBlocks.length - 1];
|
|
443
|
-
const timeFromLastToEnd = segmentEnd - lastBlock.startTime;
|
|
444
|
-
|
|
445
|
-
if (timeFromLastToEnd < MIN_TRANSITION_GAP && lastBlock.template !== 'sectionHeader') {
|
|
446
|
-
const prevBlock = segmentExpandedBlocks[segmentExpandedBlocks.length - 2];
|
|
447
|
-
prevBlock.duration = segmentEnd - prevBlock.startTime;
|
|
448
|
-
lastBlock.duration = 0;
|
|
449
|
-
lastBlock.startTime = segmentEnd;
|
|
450
|
-
segmentExpandedBlocks.pop();
|
|
451
|
-
} else {
|
|
452
|
-
// Extend last block to fill to segment end
|
|
453
|
-
if (lastBlock.startTime + lastBlock.duration < segmentEnd) {
|
|
454
|
-
lastBlock.duration = segmentEnd - lastBlock.startTime;
|
|
455
|
-
}
|
|
456
|
-
break;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// Handle single-block segment
|
|
461
|
-
if (segmentExpandedBlocks.length === 1) {
|
|
462
|
-
const onlyBlock = segmentExpandedBlocks[0];
|
|
463
|
-
if (onlyBlock.startTime + onlyBlock.duration < segmentEnd) {
|
|
464
|
-
onlyBlock.duration = segmentEnd - onlyBlock.startTime;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
// Fifth pass: eliminate any remaining blocks shorter than MIN_TRANSITION_GAP.
|
|
469
|
-
// Walk backwards and merge short blocks into their predecessor.
|
|
470
|
-
// Skip index 0 (first block, typically section header) to preserve segment start.
|
|
471
|
-
let changed = true;
|
|
472
|
-
while (changed) {
|
|
473
|
-
changed = false;
|
|
474
|
-
for (let i = segmentExpandedBlocks.length - 1; i >= 1; i--) {
|
|
475
|
-
const block = segmentExpandedBlocks[i];
|
|
476
|
-
if (block.duration > 0 && block.duration < MIN_TRANSITION_GAP) {
|
|
477
|
-
const prev = segmentExpandedBlocks[i - 1];
|
|
478
|
-
const blockEnd = block.startTime + block.duration;
|
|
479
|
-
prev.duration = blockEnd - prev.startTime;
|
|
480
|
-
block.duration = 0;
|
|
481
|
-
block.startTime = segmentEnd;
|
|
482
|
-
segmentExpandedBlocks.splice(i, 1);
|
|
483
|
-
changed = true;
|
|
484
|
-
break; // Restart loop after modification
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
// Sixth pass: split blocks that are too long (>20s)
|
|
490
|
-
// This ensures no single block lingers for too long
|
|
491
|
-
const MAX_BLOCK_DURATION = 20;
|
|
492
|
-
|
|
493
|
-
for (let i = 0; i < segmentExpandedBlocks.length; i++) {
|
|
494
|
-
const block = segmentExpandedBlocks[i];
|
|
495
|
-
|
|
496
|
-
if (block.duration > MAX_BLOCK_DURATION) {
|
|
497
|
-
// Calculate how many parts we need
|
|
498
|
-
const numParts = Math.ceil(block.duration / MAX_BLOCK_DURATION);
|
|
499
|
-
const partDuration = block.duration / numParts;
|
|
500
|
-
|
|
501
|
-
// Only split if each part would meet minimum transition gap
|
|
502
|
-
if (partDuration >= MIN_TRANSITION_GAP) {
|
|
503
|
-
// Shorten original block to first part
|
|
504
|
-
block.duration = partDuration;
|
|
505
|
-
|
|
506
|
-
// Create additional blocks for remaining parts
|
|
507
|
-
for (let p = 1; p < numParts; p++) {
|
|
508
|
-
const splitBlock: Block = {
|
|
509
|
-
id: `${block.id}-split-${p}`,
|
|
510
|
-
startTime: block.startTime + p * partDuration,
|
|
511
|
-
duration: partDuration,
|
|
512
|
-
audioSegment: block.audioSegment,
|
|
513
|
-
layers: (block.layers ?? []).map((layer) => ({
|
|
514
|
-
...cloneData(layer),
|
|
515
|
-
id: `${layer.id}-split-${p}`,
|
|
516
|
-
})),
|
|
517
|
-
transition: { type: 'dissolve', duration: 1.0 },
|
|
518
|
-
template: block.template,
|
|
519
|
-
};
|
|
520
|
-
// Insert into expanded blocks array
|
|
521
|
-
expandedBlocks.push(splitBlock);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
// Filter out zero-duration blocks (eliminated in earlier passes)
|
|
529
|
-
return expandedBlocks.filter((block) => block && block.duration > 0);
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
/**
|
|
533
|
-
* Get list of available template names.
|
|
534
|
-
*/
|
|
535
|
-
export function getAvailableTemplates(): string[] {
|
|
536
|
-
return Object.keys(templateRegistry);
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
/**
|
|
540
|
-
* Check if a template exists. Accepts both the canonical short id
|
|
541
|
-
* (`title`, `quote`, `map`, `list`) and legacy aliases
|
|
542
|
-
* (`titleBlock`, `quoteBlock`, `mapBlock`, `listBlock`).
|
|
543
|
-
*/
|
|
544
|
-
export function hasTemplate(name: string): boolean {
|
|
545
|
-
return resolveTemplateName(name) in templateRegistry;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
// Re-export types and utilities from schemas
|
|
549
|
-
export {
|
|
550
|
-
isTemplateBlock,
|
|
551
|
-
createTemplateContext,
|
|
552
|
-
scaledFontSize,
|
|
553
|
-
} from '../../schemas/BlockTemplates.js';
|
|
554
|
-
export type {
|
|
555
|
-
TemplateBlock,
|
|
556
|
-
DocBlock,
|
|
557
|
-
TemplateContext,
|
|
558
|
-
PersistentLayerConfig,
|
|
559
|
-
} from '../../schemas/BlockTemplates.js';
|
|
560
|
-
export {
|
|
561
|
-
DEFAULT_THEME,
|
|
562
|
-
resolveTheme,
|
|
563
|
-
getAvailableThemes,
|
|
564
|
-
getThemeSummaries,
|
|
565
|
-
} from '../../schemas/themeLibrary.js';
|
|
566
|
-
export type {
|
|
567
|
-
Theme,
|
|
568
|
-
ThemeColorPalette,
|
|
569
|
-
ThemeColorScheme,
|
|
570
|
-
ThemeTypography,
|
|
571
|
-
ThemeStyle,
|
|
572
|
-
RenderStyle,
|
|
573
|
-
} from '../../schemas/Theme.js';
|
|
574
|
-
// Re-export timing types (AudioSegmentTiming and ExpandDocBlocksOptions are already exported above)
|
|
575
|
-
export { VIEWPORT_PRESETS, getViewport, getViewportOrientation } from '../../schemas/Viewport.js';
|
|
576
|
-
export type {
|
|
577
|
-
ViewportConfig,
|
|
578
|
-
ViewportPreset,
|
|
579
|
-
ViewportOrientation,
|
|
580
|
-
} from '../../schemas/Viewport.js';
|
|
581
|
-
export { getLayoutHints, getTwoColumnPositions } from '../../schemas/LayoutStrategy.js';
|
|
582
|
-
export type { LayoutHints } from '../../schemas/LayoutStrategy.js';
|
|
583
|
-
export {
|
|
584
|
-
expandPersistentLayers,
|
|
585
|
-
getPersistentLayersFromTheme,
|
|
586
|
-
resolvePersistentLayers,
|
|
587
|
-
wrapWithPersistentLayers,
|
|
588
|
-
} from './persistentLayers.js';
|
|
589
|
-
|
|
590
|
-
// Re-export individual templates for direct access
|
|
591
|
-
export { titleBlock } from './titleBlock.js';
|
|
592
|
-
export { sectionHeader } from './sectionHeader.js';
|
|
593
|
-
export { statHighlight } from './statHighlight.js';
|
|
594
|
-
export { quoteBlock } from './quoteBlock.js';
|
|
595
|
-
export { factCard } from './factCard.js';
|
|
596
|
-
export { twoColumn } from './twoColumn.js';
|
|
597
|
-
export { dateEvent } from './dateEvent.js';
|
|
598
|
-
export { imageWithCaption } from './imageWithCaption.js';
|
|
599
|
-
export { leftFeature, rightFeature } from './featureBlock.js';
|
|
600
|
-
export { mapBlock } from './mapBlock.js';
|
|
601
|
-
export { coverBlock, expandCoverBlock } from './coverBlock.js';
|
|
602
|
-
export type { CoverBlockInput } from './coverBlock.js';
|
|
603
|
-
export { fullBleedQuote } from './fullBleedQuote.js';
|
|
604
|
-
export { listBlock } from './listBlock.js';
|
|
605
|
-
export { photoGrid } from './photoGrid.js';
|
|
606
|
-
export { definitionCard } from './definitionCard.js';
|
|
607
|
-
export { comparisonBar } from './comparisonBar.js';
|
|
608
|
-
export { pullQuote } from './pullQuote.js';
|
|
609
|
-
export { videoWithCaption } from './videoWithCaption.js';
|
|
610
|
-
export { videoPullQuote } from './videoPullQuote.js';
|
|
611
|
-
export { dataTable } from './dataTable.js';
|
|
612
|
-
export { diagramBlock } from './diagramBlock.js';
|
|
613
|
-
export { treeBlock } from './treeBlock.js';
|
|
614
|
-
export { timelineBlock } from './timelineBlock.js';
|
|
615
|
-
export { computeDiagramLayout } from './diagramLayout.js';
|
|
616
|
-
export type {
|
|
617
|
-
DiagramLayout,
|
|
618
|
-
DiagramNodePosition,
|
|
619
|
-
DiagramEdge,
|
|
620
|
-
DiagramLayoutOptions,
|
|
621
|
-
} from './diagramLayout.js';
|
|
622
|
-
export { drawingBlock } from './drawingBlock.js';
|
|
623
|
-
export {
|
|
624
|
-
computeDrawingLayout,
|
|
625
|
-
normalizeShapeKind,
|
|
626
|
-
isShapeName,
|
|
627
|
-
SHAPE_NAMES,
|
|
628
|
-
} from './drawingLayout.js';
|
|
629
|
-
export type {
|
|
630
|
-
DrawingLayout,
|
|
631
|
-
DrawingShape,
|
|
632
|
-
DrawingShapeKind,
|
|
633
|
-
DrawingConnector,
|
|
634
|
-
DrawingLayoutOptions,
|
|
635
|
-
} from './drawingLayout.js';
|
|
636
|
-
export { layoutBlock } from './layoutBlock.js';
|
|
637
|
-
export { computeLayoutLayers } from './layoutLayout.js';
|
|
638
|
-
export type { LayoutLayersResult, LayoutLayerDefaults } from './layoutLayout.js';
|
|
639
|
-
|
|
640
|
-
// Re-export accent image utilities
|
|
641
|
-
export { getAccentLayout, createAccentLayers, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
|
|
642
|
-
export type { AccentLayout } from './accentImage.js';
|