@bendyline/squisq 2.1.0 → 2.2.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/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-DynJleo-.d.ts → Doc-BubIpWsp.d.ts} +1 -1
- package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-CGxk5CHc.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- package/dist/chunk-2L55443L.js +0 -0
- 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-JI77MGAK.js → chunk-7ARJZYQY.js} +159 -120
- 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-QUUPYOSP.js → chunk-CB45YGAM.js} +2 -3
- package/dist/{chunk-XNLB57UD.js → chunk-DYPMOPIW.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-5UYI3RJB.js → chunk-FDYDYL77.js} +54 -40
- package/dist/{chunk-OTKVFVL6.js → chunk-I2O6W7DX.js} +116 -44
- 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-QKPXHDLR.js +0 -0
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
- package/dist/chunk-WV5ARNDA.js +0 -0
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/chunk-XWNNA3KE.js +0 -0
- package/dist/chunk-YZNGMV3G.js +0 -0
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +27 -12
- package/dist/doc/index.js +16 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +2 -3
- package/dist/icons/index.js +3 -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 +11 -11
- package/dist/index.js +60 -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-wSLA2A1g.d.ts} +2 -2
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +13 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +2 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +3 -4
- package/dist/schemas/index.d.ts +5 -5
- package/dist/schemas/index.js +5 -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-DU9mUmVl.d.ts} +1 -1
- package/dist/timing/index.js +3 -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 +4 -2
- 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,399 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Animation Utilities
|
|
3
|
-
*
|
|
4
|
-
* Helper functions for mapping Doc animations to CSS classes and styles.
|
|
5
|
-
* Generates the appropriate animation class names and CSS custom properties
|
|
6
|
-
* for duration, delay, and easing.
|
|
7
|
-
*
|
|
8
|
-
* This is shared code used by both site and efb-app doc renderers.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type {
|
|
12
|
-
Animation,
|
|
13
|
-
AnimationType,
|
|
14
|
-
TransitionDirection,
|
|
15
|
-
TransitionType,
|
|
16
|
-
} from '../../schemas/Doc.js';
|
|
17
|
-
|
|
18
|
-
interface AnimationResult {
|
|
19
|
-
/** CSS class name to apply */
|
|
20
|
-
className: string;
|
|
21
|
-
/** Inline styles for CSS custom properties */
|
|
22
|
-
style: Record<string, string>;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Get CSS class and styles for an animation.
|
|
27
|
-
*/
|
|
28
|
-
export function getAnimationStyle(
|
|
29
|
-
animation: Animation | undefined,
|
|
30
|
-
_currentTime: number = 0,
|
|
31
|
-
): AnimationResult {
|
|
32
|
-
if (!animation || animation.type === 'none') {
|
|
33
|
-
return { className: '', style: {} };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const className = getAnimationClassName(animation);
|
|
37
|
-
const style = getAnimationCSSVars(animation);
|
|
38
|
-
|
|
39
|
-
return { className, style };
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Map animation type to CSS class name.
|
|
44
|
-
*/
|
|
45
|
-
function getAnimationClassName(animation: Animation): string {
|
|
46
|
-
const { type, direction, panDirection } = animation;
|
|
47
|
-
|
|
48
|
-
switch (type) {
|
|
49
|
-
case 'fadeIn':
|
|
50
|
-
return 'anim-fadeIn';
|
|
51
|
-
case 'fadeOut':
|
|
52
|
-
return 'anim-fadeOut';
|
|
53
|
-
case 'slowZoom':
|
|
54
|
-
// Slow zoom (Ken Burns style) has variants based on direction and pan
|
|
55
|
-
if (panDirection === 'left') return 'anim-slowZoom-panLeft';
|
|
56
|
-
if (panDirection === 'right') return 'anim-slowZoom-panRight';
|
|
57
|
-
if (direction === 'out') return 'anim-slowZoom-out';
|
|
58
|
-
return 'anim-slowZoom-in';
|
|
59
|
-
case 'zoomIn':
|
|
60
|
-
return 'anim-zoomIn';
|
|
61
|
-
case 'zoomOut':
|
|
62
|
-
return 'anim-zoomOut';
|
|
63
|
-
case 'panLeft':
|
|
64
|
-
return 'anim-panLeft';
|
|
65
|
-
case 'panRight':
|
|
66
|
-
return 'anim-panRight';
|
|
67
|
-
case 'typewriter':
|
|
68
|
-
return 'anim-typewriter';
|
|
69
|
-
default:
|
|
70
|
-
return '';
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Generate CSS custom properties for animation timing.
|
|
76
|
-
*/
|
|
77
|
-
function getAnimationCSSVars(animation: Animation): Record<string, string> {
|
|
78
|
-
const vars: Record<string, string> = {};
|
|
79
|
-
|
|
80
|
-
if (animation.duration !== undefined) {
|
|
81
|
-
vars['--anim-duration'] = `${animation.duration}s`;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (animation.delay !== undefined) {
|
|
85
|
-
vars['--anim-delay'] = `${animation.delay}s`;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (animation.easing) {
|
|
89
|
-
vars['--anim-easing'] = animation.easing;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return vars;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Get default duration for an animation type.
|
|
97
|
-
*/
|
|
98
|
-
export function getDefaultAnimationDuration(type: AnimationType): number {
|
|
99
|
-
switch (type) {
|
|
100
|
-
case 'slowZoom':
|
|
101
|
-
case 'panLeft':
|
|
102
|
-
case 'panRight':
|
|
103
|
-
return 8; // Long, slow animations
|
|
104
|
-
case 'typewriter':
|
|
105
|
-
return 3;
|
|
106
|
-
case 'fadeIn':
|
|
107
|
-
case 'fadeOut':
|
|
108
|
-
return 1;
|
|
109
|
-
case 'zoomIn':
|
|
110
|
-
case 'zoomOut':
|
|
111
|
-
return 0.5;
|
|
112
|
-
default:
|
|
113
|
-
return 1;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Get transition class for slide entry/exit.
|
|
119
|
-
*/
|
|
120
|
-
export function getTransitionClass(
|
|
121
|
-
type: TransitionType,
|
|
122
|
-
entering: boolean,
|
|
123
|
-
direction?: TransitionDirection,
|
|
124
|
-
): string {
|
|
125
|
-
if (type === 'cut') return '';
|
|
126
|
-
const mode = entering ? 'enter' : 'exit';
|
|
127
|
-
return `transition-${getTransitionVisualClass(type, direction)}-${mode}`;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
type TransitionVisualClass =
|
|
131
|
-
| 'cut'
|
|
132
|
-
| 'fade'
|
|
133
|
-
| 'dissolve'
|
|
134
|
-
| 'pushLeft'
|
|
135
|
-
| 'pushRight'
|
|
136
|
-
| 'pushUp'
|
|
137
|
-
| 'pushDown'
|
|
138
|
-
| 'wipeLeft'
|
|
139
|
-
| 'wipeRight'
|
|
140
|
-
| 'wipeUp'
|
|
141
|
-
| 'wipeDown'
|
|
142
|
-
| 'splitHorizontal'
|
|
143
|
-
| 'splitVertical'
|
|
144
|
-
| 'revealLeft'
|
|
145
|
-
| 'revealRight'
|
|
146
|
-
| 'revealUp'
|
|
147
|
-
| 'revealDown'
|
|
148
|
-
| 'random'
|
|
149
|
-
| 'randomBarsHorizontal'
|
|
150
|
-
| 'randomBarsVertical'
|
|
151
|
-
| 'shapeCircle'
|
|
152
|
-
| 'shapeDiamond'
|
|
153
|
-
| 'shapePlus'
|
|
154
|
-
| 'uncoverLeft'
|
|
155
|
-
| 'uncoverRight'
|
|
156
|
-
| 'uncoverUp'
|
|
157
|
-
| 'uncoverDown'
|
|
158
|
-
| 'coverLeft'
|
|
159
|
-
| 'coverRight'
|
|
160
|
-
| 'coverUp'
|
|
161
|
-
| 'coverDown'
|
|
162
|
-
| 'zoom'
|
|
163
|
-
| 'panLeft'
|
|
164
|
-
| 'panRight'
|
|
165
|
-
| 'panUp'
|
|
166
|
-
| 'panDown'
|
|
167
|
-
| 'flash'
|
|
168
|
-
| 'newsflash'
|
|
169
|
-
| 'fallOver'
|
|
170
|
-
| 'drape'
|
|
171
|
-
| 'curtains'
|
|
172
|
-
| 'wind'
|
|
173
|
-
| 'prestige'
|
|
174
|
-
| 'fracture'
|
|
175
|
-
| 'crush'
|
|
176
|
-
| 'peelOff'
|
|
177
|
-
| 'pageCurl'
|
|
178
|
-
| 'pageCurlDouble'
|
|
179
|
-
| 'pageCurlSingle'
|
|
180
|
-
| 'airplane'
|
|
181
|
-
| 'origami'
|
|
182
|
-
| 'checkerboard'
|
|
183
|
-
| 'blindsHorizontal'
|
|
184
|
-
| 'blindsVertical'
|
|
185
|
-
| 'clock'
|
|
186
|
-
| 'ripple'
|
|
187
|
-
| 'honeycomb'
|
|
188
|
-
| 'glitter'
|
|
189
|
-
| 'vortex'
|
|
190
|
-
| 'shred'
|
|
191
|
-
| 'switch'
|
|
192
|
-
| 'flip'
|
|
193
|
-
| 'gallery'
|
|
194
|
-
| 'cube'
|
|
195
|
-
| 'doors'
|
|
196
|
-
| 'box'
|
|
197
|
-
| 'ferrisWheel'
|
|
198
|
-
| 'conveyor'
|
|
199
|
-
| 'rotate'
|
|
200
|
-
| 'window'
|
|
201
|
-
| 'orbit'
|
|
202
|
-
| 'flyThrough'
|
|
203
|
-
| 'morph'
|
|
204
|
-
| 'combHorizontal'
|
|
205
|
-
| 'combVertical'
|
|
206
|
-
| 'pullLeft'
|
|
207
|
-
| 'pullRight'
|
|
208
|
-
| 'pullUp'
|
|
209
|
-
| 'pullDown'
|
|
210
|
-
| 'stripsLeft'
|
|
211
|
-
| 'stripsRight'
|
|
212
|
-
| 'stripsUp'
|
|
213
|
-
| 'stripsDown'
|
|
214
|
-
| 'wedge'
|
|
215
|
-
| 'wheel'
|
|
216
|
-
| 'wheelReverse'
|
|
217
|
-
| 'prism'
|
|
218
|
-
| 'warp'
|
|
219
|
-
| 'slideLeft'
|
|
220
|
-
| 'slideRight'
|
|
221
|
-
| 'slideUp'
|
|
222
|
-
| 'slideDown';
|
|
223
|
-
|
|
224
|
-
const TRANSITION_VISUAL_CLASS_BY_TYPE: Record<TransitionType, TransitionVisualClass> = {
|
|
225
|
-
airplane: 'airplane',
|
|
226
|
-
blinds: 'blindsHorizontal',
|
|
227
|
-
box: 'box',
|
|
228
|
-
checker: 'checkerboard',
|
|
229
|
-
checkerboard: 'checkerboard',
|
|
230
|
-
circle: 'shapeCircle',
|
|
231
|
-
clock: 'clock',
|
|
232
|
-
comb: 'combHorizontal',
|
|
233
|
-
conveyor: 'conveyor',
|
|
234
|
-
cover: 'coverLeft',
|
|
235
|
-
crush: 'crush',
|
|
236
|
-
cube: 'cube',
|
|
237
|
-
curtains: 'curtains',
|
|
238
|
-
cut: 'cut',
|
|
239
|
-
diamond: 'shapeDiamond',
|
|
240
|
-
dissolve: 'dissolve',
|
|
241
|
-
doors: 'doors',
|
|
242
|
-
drape: 'drape',
|
|
243
|
-
fade: 'fade',
|
|
244
|
-
fallOver: 'fallOver',
|
|
245
|
-
ferris: 'ferrisWheel',
|
|
246
|
-
ferrisWheel: 'ferrisWheel',
|
|
247
|
-
flash: 'flash',
|
|
248
|
-
flip: 'flip',
|
|
249
|
-
flyThrough: 'flyThrough',
|
|
250
|
-
flythrough: 'flyThrough',
|
|
251
|
-
fracture: 'fracture',
|
|
252
|
-
gallery: 'gallery',
|
|
253
|
-
glitter: 'glitter',
|
|
254
|
-
honeycomb: 'honeycomb',
|
|
255
|
-
morph: 'morph',
|
|
256
|
-
newsflash: 'newsflash',
|
|
257
|
-
orbit: 'orbit',
|
|
258
|
-
origami: 'origami',
|
|
259
|
-
pageCurl: 'pageCurl',
|
|
260
|
-
pageCurlDouble: 'pageCurlDouble',
|
|
261
|
-
pageCurlSingle: 'pageCurlSingle',
|
|
262
|
-
pan: 'panLeft',
|
|
263
|
-
peelOff: 'peelOff',
|
|
264
|
-
plus: 'shapePlus',
|
|
265
|
-
prestige: 'prestige',
|
|
266
|
-
prism: 'prism',
|
|
267
|
-
pull: 'pullLeft',
|
|
268
|
-
push: 'pushLeft',
|
|
269
|
-
random: 'random',
|
|
270
|
-
randomBar: 'randomBarsHorizontal',
|
|
271
|
-
randomBars: 'randomBarsVertical',
|
|
272
|
-
reveal: 'revealLeft',
|
|
273
|
-
ripple: 'ripple',
|
|
274
|
-
rotate: 'rotate',
|
|
275
|
-
shape: 'shapeCircle',
|
|
276
|
-
shred: 'shred',
|
|
277
|
-
slideDown: 'slideDown',
|
|
278
|
-
slideLeft: 'slideLeft',
|
|
279
|
-
slideRight: 'slideRight',
|
|
280
|
-
slideUp: 'slideUp',
|
|
281
|
-
split: 'splitHorizontal',
|
|
282
|
-
strips: 'stripsLeft',
|
|
283
|
-
switch: 'switch',
|
|
284
|
-
uncover: 'uncoverLeft',
|
|
285
|
-
vortex: 'vortex',
|
|
286
|
-
warp: 'warp',
|
|
287
|
-
wedge: 'wedge',
|
|
288
|
-
wheel: 'wheel',
|
|
289
|
-
wheelReverse: 'wheelReverse',
|
|
290
|
-
wind: 'wind',
|
|
291
|
-
window: 'window',
|
|
292
|
-
wipe: 'wipeLeft',
|
|
293
|
-
zoom: 'zoom',
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
function getTransitionVisualClass(
|
|
297
|
-
type: TransitionType,
|
|
298
|
-
direction?: TransitionDirection,
|
|
299
|
-
): TransitionVisualClass {
|
|
300
|
-
switch (type) {
|
|
301
|
-
case 'randomBars':
|
|
302
|
-
case 'randomBar':
|
|
303
|
-
return axisClass('randomBars', direction, type === 'randomBar' ? 'Horizontal' : 'Vertical');
|
|
304
|
-
case 'comb':
|
|
305
|
-
return axisClass('comb', direction, 'Horizontal');
|
|
306
|
-
case 'blinds':
|
|
307
|
-
return axisClass('blinds', direction, 'Horizontal');
|
|
308
|
-
case 'split':
|
|
309
|
-
return axisClass('split', direction, 'Horizontal');
|
|
310
|
-
case 'push':
|
|
311
|
-
return directionalClass('push', direction, 'Left');
|
|
312
|
-
case 'wipe':
|
|
313
|
-
return directionalClass('wipe', direction, 'Left');
|
|
314
|
-
case 'cover':
|
|
315
|
-
return directionalClass('cover', direction, 'Left');
|
|
316
|
-
case 'uncover':
|
|
317
|
-
return directionalClass('uncover', direction, 'Left');
|
|
318
|
-
case 'pull':
|
|
319
|
-
return directionalClass('pull', direction, 'Left');
|
|
320
|
-
case 'reveal':
|
|
321
|
-
return directionalClass('reveal', direction, 'Left');
|
|
322
|
-
case 'strips':
|
|
323
|
-
return directionalClass('strips', direction, 'Left');
|
|
324
|
-
case 'pan':
|
|
325
|
-
return directionalClass('pan', direction, 'Left');
|
|
326
|
-
default:
|
|
327
|
-
return TRANSITION_VISUAL_CLASS_BY_TYPE[type];
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
function directionalClass(
|
|
332
|
-
prefix: 'cover' | 'pan' | 'pull' | 'push' | 'reveal' | 'strips' | 'uncover' | 'wipe',
|
|
333
|
-
direction: TransitionDirection | undefined,
|
|
334
|
-
fallback: 'Left' | 'Right' | 'Up' | 'Down',
|
|
335
|
-
): TransitionVisualClass {
|
|
336
|
-
const suffix = directionSuffix(direction, fallback);
|
|
337
|
-
return `${prefix}${suffix}` as TransitionVisualClass;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
function axisClass(
|
|
341
|
-
prefix: 'blinds' | 'comb' | 'randomBars' | 'split',
|
|
342
|
-
direction: TransitionDirection | undefined,
|
|
343
|
-
fallback: 'Horizontal' | 'Vertical',
|
|
344
|
-
): TransitionVisualClass {
|
|
345
|
-
const suffix = axisSuffix(direction, fallback);
|
|
346
|
-
return `${prefix}${suffix}` as TransitionVisualClass;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
function directionSuffix(
|
|
350
|
-
direction: TransitionDirection | undefined,
|
|
351
|
-
fallback: 'Left' | 'Right' | 'Up' | 'Down',
|
|
352
|
-
): 'Left' | 'Right' | 'Up' | 'Down' {
|
|
353
|
-
switch (direction) {
|
|
354
|
-
case 'right':
|
|
355
|
-
return 'Right';
|
|
356
|
-
case 'up':
|
|
357
|
-
return 'Up';
|
|
358
|
-
case 'down':
|
|
359
|
-
return 'Down';
|
|
360
|
-
case 'left':
|
|
361
|
-
default:
|
|
362
|
-
return fallback;
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
function axisSuffix(
|
|
367
|
-
direction: TransitionDirection | undefined,
|
|
368
|
-
fallback: 'Horizontal' | 'Vertical',
|
|
369
|
-
): 'Horizontal' | 'Vertical' {
|
|
370
|
-
switch (direction) {
|
|
371
|
-
case 'vertical':
|
|
372
|
-
case 'up':
|
|
373
|
-
case 'down':
|
|
374
|
-
return 'Vertical';
|
|
375
|
-
case 'horizontal':
|
|
376
|
-
case 'left':
|
|
377
|
-
case 'right':
|
|
378
|
-
return 'Horizontal';
|
|
379
|
-
default:
|
|
380
|
-
return fallback;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Calculate animation progress (0-1) based on current time.
|
|
386
|
-
*/
|
|
387
|
-
export function getAnimationProgress(
|
|
388
|
-
animation: Animation,
|
|
389
|
-
currentTime: number,
|
|
390
|
-
slideDuration: number,
|
|
391
|
-
): number {
|
|
392
|
-
const delay = animation.delay || 0;
|
|
393
|
-
const duration = animation.duration || slideDuration;
|
|
394
|
-
|
|
395
|
-
if (currentTime < delay) return 0;
|
|
396
|
-
if (currentTime >= delay + duration) return 1;
|
|
397
|
-
|
|
398
|
-
return (currentTime - delay) / duration;
|
|
399
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Render-style post-pass — applies a theme's mechanical motion defaults to
|
|
3
|
-
* template-generated layers.
|
|
4
|
-
*
|
|
5
|
-
* This is the intent-free half of theme motion (see `themedEntrance` in
|
|
6
|
-
* [themeUtils.ts](./themeUtils.ts) for the intent-bearing half): it never
|
|
7
|
-
* decides *what kind* of entrance a layer gets, only
|
|
8
|
-
*
|
|
9
|
-
* 1. scales existing animation durations/delays by the theme's
|
|
10
|
-
* `style.animationSpeed` multiplier (1.4 = calmer/slower, 0.7 = snappier,
|
|
11
|
-
* 1.0 = no-op), and
|
|
12
|
-
* 2. gives full-bleed cover imagery with no authored animation a gentle,
|
|
13
|
-
* deterministic Ken Burns when the theme opts into ambient motion.
|
|
14
|
-
*
|
|
15
|
-
* Applied ONLY to template-generated layers — raw authored `block.layers`
|
|
16
|
-
* are never touched, and an explicit `animation` (including
|
|
17
|
-
* `{ type: 'none' }`) always wins.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type { Layer, Animation } from '../../schemas/Doc.js';
|
|
21
|
-
import type { Theme } from '../../schemas/Theme.js';
|
|
22
|
-
import { SeededRandom, hashString } from '../../random/index.js';
|
|
23
|
-
|
|
24
|
-
/** The gentle Ken Burns variants ambient motion rotates between. */
|
|
25
|
-
const AMBIENT_VARIANTS: readonly Animation[] = [
|
|
26
|
-
{ type: 'slowZoom', direction: 'in' },
|
|
27
|
-
{ type: 'slowZoom', direction: 'out' },
|
|
28
|
-
{ type: 'slowZoom', panDirection: 'left' },
|
|
29
|
-
{ type: 'slowZoom', panDirection: 'right' },
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
/** Minimum ambient Ken Burns duration — short blocks shouldn't rush the pan. */
|
|
33
|
-
const MIN_AMBIENT_DURATION_SECONDS = 8;
|
|
34
|
-
|
|
35
|
-
function isZeroish(v: number | string | undefined): boolean {
|
|
36
|
-
return v === 0 || v === '0' || v === '0%';
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Full-bleed cover imagery is the only shape we can safely blanket-animate:
|
|
41
|
-
* anything smaller (strips, insets, grid cells) was placed deliberately and
|
|
42
|
-
* a zoom would fight the composition.
|
|
43
|
-
*/
|
|
44
|
-
function isFullBleedCoverMedia(layer: Layer): boolean {
|
|
45
|
-
if (layer.type !== 'image' && layer.type !== 'video') return false;
|
|
46
|
-
const { position } = layer;
|
|
47
|
-
if (!isZeroish(position.x) || !isZeroish(position.y)) return false;
|
|
48
|
-
if (position.width !== '100%' || position.height !== '100%') return false;
|
|
49
|
-
const fit = (layer.content as { fit?: string }).fit;
|
|
50
|
-
return fit === undefined || fit === 'cover';
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Whether the theme asks for ambient Ken Burns on otherwise-static imagery. */
|
|
54
|
-
export function themeWantsAmbientMotion(theme: Theme): boolean {
|
|
55
|
-
return theme.renderStyle.ambientMotion === true;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Apply the theme's mechanical motion defaults to a block's
|
|
60
|
-
* template-generated layers. Pure: returns new layer objects where a change
|
|
61
|
-
* applies and the original objects where none does.
|
|
62
|
-
*
|
|
63
|
-
* @param layers Template-generated layers (never raw authored layers)
|
|
64
|
-
* @param block The source block — supplies the ambient-motion seed and duration
|
|
65
|
-
* @param theme Resolved theme
|
|
66
|
-
*/
|
|
67
|
-
export function applyRenderStyleToLayers(
|
|
68
|
-
layers: Layer[],
|
|
69
|
-
block: { id: string; duration?: number },
|
|
70
|
-
theme: Theme,
|
|
71
|
-
): Layer[] {
|
|
72
|
-
const speed = theme.style.animationSpeed ?? 1.0;
|
|
73
|
-
const ambient = themeWantsAmbientMotion(theme);
|
|
74
|
-
if (speed === 1.0 && !ambient) return layers;
|
|
75
|
-
|
|
76
|
-
return layers.map((layer) => {
|
|
77
|
-
let animation = layer.animation;
|
|
78
|
-
|
|
79
|
-
// Ambient Ken Burns for full-bleed cover imagery with no authored
|
|
80
|
-
// animation. Deterministic per block+layer so re-renders, export
|
|
81
|
-
// frames, and screenshots always agree.
|
|
82
|
-
if (!animation && ambient && isFullBleedCoverMedia(layer)) {
|
|
83
|
-
const rng = new SeededRandom(hashString(`${block.id}:${layer.id}`));
|
|
84
|
-
const variant = rng.pickRequired(AMBIENT_VARIANTS as Animation[]);
|
|
85
|
-
animation = {
|
|
86
|
-
...variant,
|
|
87
|
-
duration: Math.max(MIN_AMBIENT_DURATION_SECONDS, block.duration ?? 0),
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!animation || animation.type === 'none') {
|
|
92
|
-
return animation === layer.animation ? layer : { ...layer, animation };
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Speed scaling — single site so templates never double-scale.
|
|
96
|
-
if (speed !== 1.0) {
|
|
97
|
-
animation = {
|
|
98
|
-
...animation,
|
|
99
|
-
...(animation.duration != null ? { duration: animation.duration * speed } : {}),
|
|
100
|
-
...(animation.delay != null ? { delay: animation.delay * speed } : {}),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return animation === layer.animation ? layer : { ...layer, animation };
|
|
105
|
-
});
|
|
106
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/** Text fitting shared by the live diagram canvas and template renderer. */
|
|
2
|
-
|
|
3
|
-
export const DIAGRAM_LABEL_LINE_HEIGHT = 1.25;
|
|
4
|
-
export const DIAGRAM_LABEL_HORIZONTAL_PADDING = 24;
|
|
5
|
-
export const DIAGRAM_LABEL_VERTICAL_PADDING = 16;
|
|
6
|
-
export const DIAGRAM_LABEL_MIN_FONT_SIZE = 10;
|
|
7
|
-
|
|
8
|
-
export interface DiagramLabelFit {
|
|
9
|
-
fontSize: number;
|
|
10
|
-
lineCount: number;
|
|
11
|
-
/** Upward shift that centers the full line group around the node midpoint. */
|
|
12
|
-
firstLineOffset: number;
|
|
13
|
-
textWidth: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Fit a plain diagram label inside a node card using the same character-width
|
|
18
|
-
* estimate and word wrapping as React's `TextLayer`.
|
|
19
|
-
*/
|
|
20
|
-
export function fitDiagramLabel(
|
|
21
|
-
text: string,
|
|
22
|
-
boxWidth: number,
|
|
23
|
-
boxHeight: number,
|
|
24
|
-
preferredFontSize: number,
|
|
25
|
-
): DiagramLabelFit {
|
|
26
|
-
const textWidth = Math.max(1, boxWidth - DIAGRAM_LABEL_HORIZONTAL_PADDING);
|
|
27
|
-
const textHeight = Math.max(1, boxHeight - DIAGRAM_LABEL_VERTICAL_PADDING);
|
|
28
|
-
const preferred = Math.max(DIAGRAM_LABEL_MIN_FONT_SIZE, Math.floor(preferredFontSize));
|
|
29
|
-
|
|
30
|
-
let fontSize = preferred;
|
|
31
|
-
let lineCount = countWrappedLines(text, fontSize, textWidth);
|
|
32
|
-
while (
|
|
33
|
-
fontSize > DIAGRAM_LABEL_MIN_FONT_SIZE &&
|
|
34
|
-
lineCount * fontSize * DIAGRAM_LABEL_LINE_HEIGHT > textHeight
|
|
35
|
-
) {
|
|
36
|
-
fontSize--;
|
|
37
|
-
lineCount = countWrappedLines(text, fontSize, textWidth);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return {
|
|
41
|
-
fontSize,
|
|
42
|
-
lineCount,
|
|
43
|
-
firstLineOffset:
|
|
44
|
-
lineCount === 1 ? 0 : -((lineCount - 1) * fontSize * DIAGRAM_LABEL_LINE_HEIGHT) / 2,
|
|
45
|
-
textWidth,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function countWrappedLines(text: string, fontSize: number, maxWidth: number): number {
|
|
50
|
-
return text
|
|
51
|
-
.split('\n')
|
|
52
|
-
.reduce((count, line) => count + wrappedLineCount(line, fontSize, maxWidth), 0);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function wrappedLineCount(text: string, fontSize: number, maxWidth: number): number {
|
|
56
|
-
if (!text.trim()) return 1;
|
|
57
|
-
const charsPerLine = Math.floor(maxWidth / (fontSize * 0.5));
|
|
58
|
-
if (charsPerLine <= 0) return 1;
|
|
59
|
-
|
|
60
|
-
let lines = 0;
|
|
61
|
-
let currentLength = 0;
|
|
62
|
-
for (const word of text.split(/\s+/)) {
|
|
63
|
-
const testLength = currentLength > 0 ? currentLength + 1 + word.length : word.length;
|
|
64
|
-
if (testLength <= charsPerLine) {
|
|
65
|
-
currentLength = testLength;
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
if (currentLength > 0) lines++;
|
|
69
|
-
if (word.length > charsPerLine) {
|
|
70
|
-
lines += Math.floor((word.length - 1) / charsPerLine);
|
|
71
|
-
currentLength = word.length % charsPerLine || charsPerLine;
|
|
72
|
-
} else {
|
|
73
|
-
currentLength = word.length;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (currentLength > 0) lines++;
|
|
77
|
-
return Math.max(1, lines);
|
|
78
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Image treatment → CSS filter derivation.
|
|
3
|
-
*
|
|
4
|
-
* Treatments are theme-level photographic grades (see `ImageTreatment` in
|
|
5
|
-
* [Doc.ts](../../schemas/Doc.ts)). They compile to plain CSS `filter`
|
|
6
|
-
* functions so the same string works on a foreignObject `<img>`, an SVG
|
|
7
|
-
* `<image>` element, and in headless frame capture — no SVG filter defs to
|
|
8
|
-
* coordinate, no renderer-specific code paths.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { ImageTreatment } from '../../schemas/Doc.js';
|
|
12
|
-
import { hexHueDegrees } from '../../schemas/colorUtils.js';
|
|
13
|
-
|
|
14
|
-
/** Sepia's intrinsic tint hue (deg) — duotone rotates from here to the target. */
|
|
15
|
-
const SEPIA_HUE_DEGREES = 40;
|
|
16
|
-
|
|
17
|
-
const clamp01 = (v: number) => Math.max(0, Math.min(1, v));
|
|
18
|
-
const r2 = (v: number) => Math.round(v * 100) / 100;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Build the CSS `filter` value for a treatment and/or blur.
|
|
22
|
-
* Returns `undefined` when there is nothing to apply.
|
|
23
|
-
*/
|
|
24
|
-
export function cssFilterForTreatment(
|
|
25
|
-
treatment?: ImageTreatment,
|
|
26
|
-
blur?: number,
|
|
27
|
-
): string | undefined {
|
|
28
|
-
const parts: string[] = [];
|
|
29
|
-
|
|
30
|
-
if (blur != null && blur > 0) {
|
|
31
|
-
parts.push(`blur(${Math.round(blur)}px)`);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (treatment && treatment.type !== 'none') {
|
|
35
|
-
const s = clamp01(treatment.strength ?? 0.6);
|
|
36
|
-
switch (treatment.type) {
|
|
37
|
-
case 'mono':
|
|
38
|
-
// Archival black & white with a whisper of contrast to keep depth.
|
|
39
|
-
parts.push(`grayscale(${r2(s)})`, `contrast(${r2(1 + 0.05 * s)})`);
|
|
40
|
-
break;
|
|
41
|
-
case 'duotone': {
|
|
42
|
-
// Classic CSS duotone approximation: flatten to gray, tint through
|
|
43
|
-
// sepia (intrinsic hue ~40°), rotate to the target hue, re-saturate.
|
|
44
|
-
const hue = hexHueDegrees(treatment.color ?? '#3d5a80');
|
|
45
|
-
parts.push(
|
|
46
|
-
'grayscale(1)',
|
|
47
|
-
`sepia(${r2(Math.max(0.35, s))})`,
|
|
48
|
-
`hue-rotate(${Math.round(hue - SEPIA_HUE_DEGREES)}deg)`,
|
|
49
|
-
`saturate(${r2(1 + s)})`,
|
|
50
|
-
);
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
case 'warm':
|
|
54
|
-
// Partial sepia is a well-behaved warmer; slight saturation lift.
|
|
55
|
-
parts.push(`sepia(${r2(0.4 * s)})`, `saturate(${r2(1 + 0.15 * s)})`);
|
|
56
|
-
break;
|
|
57
|
-
case 'cool':
|
|
58
|
-
// Desaturate a touch and nudge warm tones toward magenta/blue —
|
|
59
|
-
// small rotations read as a grade, large ones wreck hues.
|
|
60
|
-
parts.push(
|
|
61
|
-
`saturate(${r2(1 - 0.25 * s)})`,
|
|
62
|
-
`hue-rotate(${Math.round(-12 * s)}deg)`,
|
|
63
|
-
`contrast(${r2(1 + 0.06 * s)})`,
|
|
64
|
-
);
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return parts.length > 0 ? parts.join(' ') : undefined;
|
|
70
|
-
}
|