@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,243 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layout layout — pure derivation of positioned layers from a `layout`
|
|
3
|
-
* block's child sub-blocks. The layout counterpart to `drawingLayout.ts`,
|
|
4
|
-
* with two deliberate differences:
|
|
5
|
-
*
|
|
6
|
-
* - **Absolute** positioning. Each child's `x`/`y`/`width`/`height` are
|
|
7
|
-
* used as-is in viewport units (no auto-grid, no fit-to-viewport
|
|
8
|
-
* scaling). A layout is a free-form canvas; authors place things where
|
|
9
|
-
* they want them.
|
|
10
|
-
* - **Text content lives in the child body.** A `{[text …]}` child's
|
|
11
|
-
* paragraphs/lists/marks under its heading become the text — readable
|
|
12
|
-
* markdown rather than an encoded blob. (`content.html` is filled by the
|
|
13
|
-
* editor for rich on-canvas rendering; SSR uses the plain `content.text`.)
|
|
14
|
-
*
|
|
15
|
-
* Each child heading is one layer: `### {#id} {[<type> x=.. y=.. …]}`.
|
|
16
|
-
* Children are emitted in document order, so the first child is the
|
|
17
|
-
* back-most layer (painters' order).
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type { Layer, ShapeLayer, TextLayer, PathLayer, ImageLayer } from '../../schemas/Doc.js';
|
|
21
|
-
import { extractPlainText } from '../../markdown/utils.js';
|
|
22
|
-
import { normalizeShapeKind } from './drawingLayout.js';
|
|
23
|
-
import { shapePath } from '../utils/shapeGeometry.js';
|
|
24
|
-
|
|
25
|
-
export interface LayoutLayersResult {
|
|
26
|
-
layers: Layer[];
|
|
27
|
-
warnings: string[];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface LayoutLayerDefaults {
|
|
31
|
-
/**
|
|
32
|
-
* Default ink — text color and path/line stroke — used when the author
|
|
33
|
-
* omits `color=`/`stroke=`. `layoutBlock` passes the theme text color so
|
|
34
|
-
* un-styled text stays legible on dark themes; the editor's scene canvas
|
|
35
|
-
* omits it and gets the dark-slate default that suits its fixed light
|
|
36
|
-
* surface.
|
|
37
|
-
*/
|
|
38
|
-
ink?: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Fallback ink for callers that don't supply defaults (editor scene canvas). */
|
|
42
|
-
const DEFAULT_INK = '#1e293b';
|
|
43
|
-
|
|
44
|
-
/** Minimal Block shape this derivation reads (subset of `Block`). */
|
|
45
|
-
interface LayoutChildBlock {
|
|
46
|
-
id: string;
|
|
47
|
-
template?: string;
|
|
48
|
-
templateOverrides?: Record<string, string>;
|
|
49
|
-
title?: string;
|
|
50
|
-
contents?: import('../../markdown/types.js').MarkdownNode[];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const DEFAULT_TEXT = { w: 300, h: 80 };
|
|
54
|
-
const DEFAULT_SHAPE = { w: 160, h: 90 };
|
|
55
|
-
const DEFAULT_IMAGE = { w: 320, h: 240 };
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Map a layout block's children → positioned layers. Pure: same children
|
|
59
|
-
* always produce the same layers.
|
|
60
|
-
*/
|
|
61
|
-
export function computeLayoutLayers(
|
|
62
|
-
children: readonly LayoutChildBlock[],
|
|
63
|
-
_viewport: { width: number; height: number },
|
|
64
|
-
defaults: LayoutLayerDefaults = {},
|
|
65
|
-
): LayoutLayersResult {
|
|
66
|
-
const ink = defaults.ink ?? DEFAULT_INK;
|
|
67
|
-
const layers: Layer[] = [];
|
|
68
|
-
const warnings: string[] = [];
|
|
69
|
-
|
|
70
|
-
for (const child of children) {
|
|
71
|
-
const params = child.templateOverrides ?? {};
|
|
72
|
-
const annotation = (child.template ?? '').toLowerCase();
|
|
73
|
-
const x = numParam(params, 'x') ?? 0;
|
|
74
|
-
const y = numParam(params, 'y') ?? 0;
|
|
75
|
-
|
|
76
|
-
if (annotation === 'image' || annotation === 'img') {
|
|
77
|
-
const src = strParam(params, 'src');
|
|
78
|
-
if (!src) {
|
|
79
|
-
warnings.push(`Layout image "${child.id}" has no src= and was skipped`);
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
const layer: ImageLayer = {
|
|
83
|
-
id: child.id,
|
|
84
|
-
type: 'image',
|
|
85
|
-
position: {
|
|
86
|
-
x,
|
|
87
|
-
y,
|
|
88
|
-
width: numParam(params, 'width') ?? DEFAULT_IMAGE.w,
|
|
89
|
-
height: numParam(params, 'height') ?? DEFAULT_IMAGE.h,
|
|
90
|
-
},
|
|
91
|
-
content: {
|
|
92
|
-
src,
|
|
93
|
-
alt: strParam(params, 'alt') ?? '',
|
|
94
|
-
...(strParam(params, 'fit')
|
|
95
|
-
? { fit: strParam(params, 'fit') as 'cover' | 'contain' | 'fill' }
|
|
96
|
-
: {}),
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
layers.push(layer);
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const kind = normalizeShapeKind(child.template);
|
|
104
|
-
if (!kind) {
|
|
105
|
-
warnings.push(
|
|
106
|
-
`Layout child "${child.id}" is not a layer (annotation "${child.template ?? '—'}") and was skipped`,
|
|
107
|
-
);
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (kind === 'text') {
|
|
112
|
-
const text = bodyText(child) || child.title || '';
|
|
113
|
-
const layer: TextLayer = {
|
|
114
|
-
id: child.id,
|
|
115
|
-
type: 'text',
|
|
116
|
-
position: {
|
|
117
|
-
x,
|
|
118
|
-
y,
|
|
119
|
-
width: numParam(params, 'width') ?? DEFAULT_TEXT.w,
|
|
120
|
-
height: numParam(params, 'height') ?? DEFAULT_TEXT.h,
|
|
121
|
-
},
|
|
122
|
-
content: { text, style: textStyleFromParams(params, ink) },
|
|
123
|
-
};
|
|
124
|
-
layers.push(layer);
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const width = numParam(params, 'width') ?? numParam(params, 'w') ?? DEFAULT_SHAPE.w;
|
|
129
|
-
const height = numParam(params, 'height') ?? numParam(params, 'h') ?? DEFAULT_SHAPE.h;
|
|
130
|
-
|
|
131
|
-
if (kind === 'rect' || kind === 'circle') {
|
|
132
|
-
const shape: ShapeLayer = {
|
|
133
|
-
id: child.id,
|
|
134
|
-
type: 'shape',
|
|
135
|
-
position: { x, y, width, height },
|
|
136
|
-
content: {
|
|
137
|
-
shape: kind,
|
|
138
|
-
...(strParam(params, 'fill') ? { fill: strParam(params, 'fill') } : {}),
|
|
139
|
-
...(strParam(params, 'stroke') ? { stroke: strParam(params, 'stroke') } : {}),
|
|
140
|
-
...(numParam(params, 'strokeWidth') != null
|
|
141
|
-
? { strokeWidth: numParam(params, 'strokeWidth') }
|
|
142
|
-
: {}),
|
|
143
|
-
...(strParam(params, 'borderStyle')
|
|
144
|
-
? { borderStyle: strParam(params, 'borderStyle') as 'solid' | 'dashed' | 'dotted' }
|
|
145
|
-
: {}),
|
|
146
|
-
...(kind === 'rect' && numParam(params, 'borderRadius') != null
|
|
147
|
-
? { borderRadius: numParam(params, 'borderRadius') }
|
|
148
|
-
: {}),
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
layers.push(shape);
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// line / arrow / path / named polygon → PathLayer (absolute geometry).
|
|
156
|
-
const diagonal = `M ${round(x)} ${round(y)} L ${round(x + width)} ${round(y + height)}`;
|
|
157
|
-
let d = diagonal;
|
|
158
|
-
let pathFill = 'none';
|
|
159
|
-
let endMarker: 'none' | 'arrow' = 'none';
|
|
160
|
-
if (kind === 'path') {
|
|
161
|
-
d = strParam(params, 'd') ?? diagonal;
|
|
162
|
-
pathFill = strParam(params, 'fill') ?? 'none';
|
|
163
|
-
} else if (kind === 'arrow') {
|
|
164
|
-
endMarker = 'arrow';
|
|
165
|
-
} else if (kind !== 'line') {
|
|
166
|
-
d = shapePath(kind, x, y, width, height) ?? diagonal;
|
|
167
|
-
pathFill = strParam(params, 'fill') ?? 'none';
|
|
168
|
-
}
|
|
169
|
-
const path: PathLayer = {
|
|
170
|
-
id: child.id,
|
|
171
|
-
type: 'path',
|
|
172
|
-
position: { x: 0, y: 0, width: '100%', height: '100%' },
|
|
173
|
-
content: {
|
|
174
|
-
d,
|
|
175
|
-
stroke: strParam(params, 'stroke') ?? ink,
|
|
176
|
-
strokeWidth: numParam(params, 'strokeWidth') ?? 2,
|
|
177
|
-
fill: pathFill,
|
|
178
|
-
...(strParam(params, 'dasharray') ? { dasharray: strParam(params, 'dasharray') } : {}),
|
|
179
|
-
...(endMarker !== 'none' ? { endMarker } : {}),
|
|
180
|
-
},
|
|
181
|
-
};
|
|
182
|
-
layers.push(path);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return { layers, warnings };
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/** Build a TextStyle from a text layer's annotation params. */
|
|
189
|
-
function textStyleFromParams(
|
|
190
|
-
params: Record<string, string>,
|
|
191
|
-
ink: string,
|
|
192
|
-
): TextLayer['content']['style'] {
|
|
193
|
-
const style: TextLayer['content']['style'] = {
|
|
194
|
-
fontSize: numParam(params, 'fontSize') ?? 32,
|
|
195
|
-
color: strParam(params, 'color') ?? ink,
|
|
196
|
-
};
|
|
197
|
-
const fontFamily = strParam(params, 'fontFamily');
|
|
198
|
-
if (fontFamily) style.fontFamily = fontFamily;
|
|
199
|
-
const fontWeight = strParam(params, 'fontWeight');
|
|
200
|
-
if (fontWeight === 'bold' || fontWeight === 'normal') style.fontWeight = fontWeight;
|
|
201
|
-
const fontStyle = strParam(params, 'fontStyle');
|
|
202
|
-
if (fontStyle === 'italic' || fontStyle === 'normal') style.fontStyle = fontStyle;
|
|
203
|
-
const align = strParam(params, 'align');
|
|
204
|
-
if (align === 'left' || align === 'center' || align === 'right') style.textAlign = align;
|
|
205
|
-
const valign = strParam(params, 'valign');
|
|
206
|
-
if (valign === 'top' || valign === 'middle' || valign === 'bottom') style.verticalAlign = valign;
|
|
207
|
-
const lineHeight = numParam(params, 'lineHeight');
|
|
208
|
-
if (lineHeight != null) style.lineHeight = lineHeight;
|
|
209
|
-
const padding = numParam(params, 'padding');
|
|
210
|
-
if (padding != null) style.padding = padding;
|
|
211
|
-
const background = strParam(params, 'background');
|
|
212
|
-
if (background) style.background = background;
|
|
213
|
-
return style;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** Read a raw string param (trims a trailing comma — `x=21, y=25` tolerated). */
|
|
217
|
-
function strParam(params: Record<string, string>, key: string): string | undefined {
|
|
218
|
-
const raw = params[key];
|
|
219
|
-
if (raw == null) return undefined;
|
|
220
|
-
const v = raw.replace(/,\s*$/, '').trim();
|
|
221
|
-
return v.length > 0 ? v : undefined;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/** Coerce a numeric param, tolerating a trailing comma. Undefined on failure. */
|
|
225
|
-
function numParam(params: Record<string, string>, key: string): number | undefined {
|
|
226
|
-
const v = strParam(params, key);
|
|
227
|
-
if (v == null) return undefined;
|
|
228
|
-
const n = Number(v);
|
|
229
|
-
return Number.isFinite(n) ? n : undefined;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/** Plain text of a block's body content. */
|
|
233
|
-
function bodyText(block: LayoutChildBlock): string {
|
|
234
|
-
if (!block.contents || block.contents.length === 0) return '';
|
|
235
|
-
return block.contents
|
|
236
|
-
.map((node) => extractPlainText(node))
|
|
237
|
-
.join('\n')
|
|
238
|
-
.trim();
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function round(n: number): number {
|
|
242
|
-
return Math.round(n * 100) / 100;
|
|
243
|
-
}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* List Block Template
|
|
3
|
-
*
|
|
4
|
-
* Displays 3-5 items in a numbered vertical list with staggered animations.
|
|
5
|
-
* Good for enumerations like "things to see", "key features", or "tips".
|
|
6
|
-
* Supports optional accent images.
|
|
7
|
-
*
|
|
8
|
-
* This is shared code used by both site and efb-app doc renderers.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { Layer } from '../../schemas/Doc.js';
|
|
12
|
-
import type { ListBlockInput, TemplateContext } from '../../schemas/BlockTemplates.js';
|
|
13
|
-
import {
|
|
14
|
-
getThemeFont,
|
|
15
|
-
shouldUseShadow,
|
|
16
|
-
themedEntrance,
|
|
17
|
-
themedFontSize,
|
|
18
|
-
themedImageTreatment,
|
|
19
|
-
} from '../utils/themeUtils.js';
|
|
20
|
-
import { createAccentLayers, getAccentLayout, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
|
|
21
|
-
|
|
22
|
-
const LIST_ITEM_LINE_HEIGHT = 1.2;
|
|
23
|
-
const LIST_ITEM_GAP_PX = 18;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Mirror the renderer's character-based wrapping closely enough to reserve
|
|
27
|
-
* vertical space for each independently positioned text layer.
|
|
28
|
-
*/
|
|
29
|
-
function estimateWrappedLineCount(text: string, fontSize: number, maxWidth: number): number {
|
|
30
|
-
if (!text.trim()) return 1;
|
|
31
|
-
|
|
32
|
-
const charsPerLine = Math.floor(maxWidth / (fontSize * 0.5));
|
|
33
|
-
if (charsPerLine <= 0) return 1;
|
|
34
|
-
|
|
35
|
-
let lineCount = 0;
|
|
36
|
-
let currentLineLength = 0;
|
|
37
|
-
|
|
38
|
-
for (const word of text.split(/\s+/)) {
|
|
39
|
-
const testLineLength = currentLineLength ? currentLineLength + 1 + word.length : word.length;
|
|
40
|
-
|
|
41
|
-
if (testLineLength <= charsPerLine) {
|
|
42
|
-
currentLineLength = testLineLength;
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (currentLineLength) lineCount += 1;
|
|
47
|
-
|
|
48
|
-
let remainingLength = word.length;
|
|
49
|
-
while (remainingLength > charsPerLine) {
|
|
50
|
-
lineCount += 1;
|
|
51
|
-
remainingLength -= charsPerLine;
|
|
52
|
-
}
|
|
53
|
-
currentLineLength = remainingLength;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return Math.max(1, lineCount + (currentLineLength ? 1 : 0));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function listBlock(input: ListBlockInput, context: TemplateContext): Layer[] {
|
|
60
|
-
const { title, accentImage } = input;
|
|
61
|
-
// `items` is required by the schema, but malformed / partially-authored
|
|
62
|
-
// blocks (e.g. someone wrote `template: list` with no items yet) reach
|
|
63
|
-
// this code path during live preview. Treat missing/non-array as empty
|
|
64
|
-
// so we render the title-and-background frame instead of blowing up
|
|
65
|
-
// every keystroke with a TypeError.
|
|
66
|
-
const items: string[] = Array.isArray(input.items) ? input.items : [];
|
|
67
|
-
const { theme } = context;
|
|
68
|
-
|
|
69
|
-
// Get layout adjustments if accent image is present
|
|
70
|
-
const accentLayout = accentImage ? getAccentLayout(accentImage.position) : DEFAULT_LAYOUT;
|
|
71
|
-
|
|
72
|
-
const titleFontSize = themedFontSize(44, context, true);
|
|
73
|
-
const itemFontSize = themedFontSize(34, context, false);
|
|
74
|
-
|
|
75
|
-
const layers: Layer[] = [
|
|
76
|
-
// Background — gradient
|
|
77
|
-
{
|
|
78
|
-
type: 'shape',
|
|
79
|
-
id: 'bg',
|
|
80
|
-
content: {
|
|
81
|
-
shape: 'rect',
|
|
82
|
-
fill: `linear-gradient(155deg, ${theme.colors.backgroundLight} 0%, ${theme.colors.background} 100%)`,
|
|
83
|
-
},
|
|
84
|
-
position: { x: 0, y: 0, width: '100%', height: '100%' },
|
|
85
|
-
},
|
|
86
|
-
];
|
|
87
|
-
|
|
88
|
-
// Add accent image layers
|
|
89
|
-
if (accentImage) {
|
|
90
|
-
layers.push(
|
|
91
|
-
...createAccentLayers(
|
|
92
|
-
accentImage,
|
|
93
|
-
input.id,
|
|
94
|
-
themedImageTreatment(context, input.imageTreatment),
|
|
95
|
-
),
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Left edge of the text column — derived from the center+width pair so
|
|
100
|
-
// the title and items share one left axis instead of a centered title
|
|
101
|
-
// floating over a left-aligned column. Falls back to a safe 8% if the
|
|
102
|
-
// layout strings ever turn out unparseable (they're authored, but
|
|
103
|
-
// defensive against future edits to the accent-layout types).
|
|
104
|
-
const centerX = parseFloat(accentLayout.textCenterX);
|
|
105
|
-
const widthPct = parseFloat(accentLayout.textWidth);
|
|
106
|
-
const leftPct =
|
|
107
|
-
Number.isFinite(centerX) && Number.isFinite(widthPct) ? centerX - widthPct / 2 : 8;
|
|
108
|
-
const leftX = `${leftPct}%`;
|
|
109
|
-
|
|
110
|
-
// Title if provided
|
|
111
|
-
const startY = title ? 34 : 26;
|
|
112
|
-
if (title) {
|
|
113
|
-
layers.push({
|
|
114
|
-
type: 'text',
|
|
115
|
-
id: 'list-title',
|
|
116
|
-
content: {
|
|
117
|
-
text: title,
|
|
118
|
-
style: {
|
|
119
|
-
fontSize: titleFontSize,
|
|
120
|
-
fontFamily: getThemeFont(context, 'title'),
|
|
121
|
-
fontWeight: 'bold',
|
|
122
|
-
color: theme.colors.text,
|
|
123
|
-
textAlign: 'left',
|
|
124
|
-
shadow: shouldUseShadow(context),
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
position: {
|
|
128
|
-
x: leftX,
|
|
129
|
-
y: adjustY('20%', accentLayout),
|
|
130
|
-
width: accentLayout.textWidth,
|
|
131
|
-
},
|
|
132
|
-
animation: themedEntrance(context, 'text', { type: 'fadeIn', duration: 1 }),
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Render the number and body in separate columns. The body is therefore a
|
|
137
|
-
// single text layer whose wrapped lines all share the same x coordinate,
|
|
138
|
-
// producing a hanging indent instead of wrapping underneath the number.
|
|
139
|
-
const textWidthPx = (Number.isFinite(widthPct) ? widthPct / 100 : 0.85) * context.viewport.width;
|
|
140
|
-
const markerText = `${items.length}.`;
|
|
141
|
-
const markerWidthPx = Math.max(itemFontSize, markerText.length * itemFontSize * 0.5);
|
|
142
|
-
const markerGapPx = itemFontSize * 0.35;
|
|
143
|
-
const bodyIndentPx = markerWidthPx + markerGapPx;
|
|
144
|
-
const bodyLeftX = `${leftPct + (bodyIndentPx / context.viewport.width) * 100}%`;
|
|
145
|
-
const bodyWidthPx = Math.max(itemFontSize, textWidthPx - bodyIndentPx);
|
|
146
|
-
let itemY = startY;
|
|
147
|
-
|
|
148
|
-
// List items with staggered animation
|
|
149
|
-
for (let i = 0; i < items.length; i++) {
|
|
150
|
-
const itemText = items[i]!;
|
|
151
|
-
const lineCount = estimateWrappedLineCount(itemText, itemFontSize, bodyWidthPx);
|
|
152
|
-
const animation = themedEntrance(context, 'text', {
|
|
153
|
-
type: 'fadeIn',
|
|
154
|
-
duration: 0.8,
|
|
155
|
-
delay: 0.3 + 0.3 * i,
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
layers.push({
|
|
159
|
-
type: 'text',
|
|
160
|
-
id: `item-${i}-marker`,
|
|
161
|
-
content: {
|
|
162
|
-
text: `${i + 1}.`,
|
|
163
|
-
style: {
|
|
164
|
-
fontSize: itemFontSize,
|
|
165
|
-
fontFamily: getThemeFont(context, 'body'),
|
|
166
|
-
color: theme.colors.text,
|
|
167
|
-
textAlign: 'right',
|
|
168
|
-
lineHeight: LIST_ITEM_LINE_HEIGHT,
|
|
169
|
-
shadow: shouldUseShadow(context),
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
position: {
|
|
173
|
-
x: leftX,
|
|
174
|
-
y: adjustY(`${itemY}%`, accentLayout),
|
|
175
|
-
width: markerWidthPx,
|
|
176
|
-
},
|
|
177
|
-
animation,
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
layers.push({
|
|
181
|
-
type: 'text',
|
|
182
|
-
id: `item-${i}`,
|
|
183
|
-
content: {
|
|
184
|
-
text: itemText,
|
|
185
|
-
style: {
|
|
186
|
-
fontSize: itemFontSize,
|
|
187
|
-
fontFamily: getThemeFont(context, 'body'),
|
|
188
|
-
color: theme.colors.text,
|
|
189
|
-
textAlign: 'left',
|
|
190
|
-
lineHeight: LIST_ITEM_LINE_HEIGHT,
|
|
191
|
-
shadow: shouldUseShadow(context),
|
|
192
|
-
},
|
|
193
|
-
},
|
|
194
|
-
position: {
|
|
195
|
-
x: bodyLeftX,
|
|
196
|
-
y: adjustY(`${itemY}%`, accentLayout),
|
|
197
|
-
width: bodyWidthPx,
|
|
198
|
-
},
|
|
199
|
-
animation,
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
const itemHeightPx = lineCount * itemFontSize * LIST_ITEM_LINE_HEIGHT;
|
|
203
|
-
itemY += ((itemHeightPx + LIST_ITEM_GAP_PX) / context.viewport.height) * 100;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return layers;
|
|
207
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Map Block Template
|
|
3
|
-
*
|
|
4
|
-
* Full-screen geographic map with optional title and caption overlays.
|
|
5
|
-
* Great for establishing geographic context at the start of a doc
|
|
6
|
-
* or when discussing location-specific content.
|
|
7
|
-
* Adapts font sizes and positioning for different viewports.
|
|
8
|
-
*
|
|
9
|
-
* Map tiles are fetched from free/open-source providers.
|
|
10
|
-
* See docs/MAP_TILES.md for available styles and attribution requirements.
|
|
11
|
-
*
|
|
12
|
-
* This is shared code used by both site and efb-app doc renderers.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { Layer } from '../../schemas/Doc.js';
|
|
16
|
-
import type { MapBlockInput, TemplateContext } from '../../schemas/BlockTemplates.js';
|
|
17
|
-
import { getThemeFont, shouldUseShadow, themedFontSize } from '../utils/themeUtils.js';
|
|
18
|
-
import { withAlpha } from '../../schemas/colorUtils.js';
|
|
19
|
-
import { mapAmbientMotion } from './accentImage.js';
|
|
20
|
-
|
|
21
|
-
export function mapBlock(input: MapBlockInput, context: TemplateContext): Layer[] {
|
|
22
|
-
const {
|
|
23
|
-
center,
|
|
24
|
-
zoom,
|
|
25
|
-
mapStyle = 'terrain',
|
|
26
|
-
title,
|
|
27
|
-
caption,
|
|
28
|
-
markers,
|
|
29
|
-
ambientMotion,
|
|
30
|
-
staticSrc,
|
|
31
|
-
} = input;
|
|
32
|
-
const { theme, layout } = context;
|
|
33
|
-
|
|
34
|
-
// Scale font sizes for viewport
|
|
35
|
-
const titleFontSize = themedFontSize(64, context, true);
|
|
36
|
-
const captionFontSize = themedFontSize(32, context, false);
|
|
37
|
-
|
|
38
|
-
// Determine animation based on ambientMotion setting
|
|
39
|
-
const mapAnimation = mapAmbientMotion(ambientMotion);
|
|
40
|
-
|
|
41
|
-
const layers: Layer[] = [
|
|
42
|
-
// Map background
|
|
43
|
-
{
|
|
44
|
-
type: 'map',
|
|
45
|
-
id: 'map-bg',
|
|
46
|
-
content: {
|
|
47
|
-
center,
|
|
48
|
-
zoom,
|
|
49
|
-
style: mapStyle,
|
|
50
|
-
markers,
|
|
51
|
-
showAttribution: true,
|
|
52
|
-
staticSrc, // Use pre-rendered image if available
|
|
53
|
-
},
|
|
54
|
-
position: { x: 0, y: 0, width: '100%', height: '100%' },
|
|
55
|
-
animation: mapAnimation,
|
|
56
|
-
},
|
|
57
|
-
];
|
|
58
|
-
|
|
59
|
-
// Overlay bands are tinted from the theme background so the theme text
|
|
60
|
-
// color on them stays readable in light and dark themes alike; they
|
|
61
|
-
// fade out toward the map so the band doesn't read as a hard seam.
|
|
62
|
-
const bg = theme.colors.background;
|
|
63
|
-
|
|
64
|
-
// Add title overlay if provided
|
|
65
|
-
if (title) {
|
|
66
|
-
layers.push({
|
|
67
|
-
type: 'shape',
|
|
68
|
-
id: 'title-overlay',
|
|
69
|
-
content: {
|
|
70
|
-
shape: 'rect',
|
|
71
|
-
fill: `linear-gradient(180deg, ${withAlpha(bg, 0.85)} 0%, ${withAlpha(bg, 0.6)} 70%, ${withAlpha(bg, 0)} 100%)`,
|
|
72
|
-
},
|
|
73
|
-
position: { x: 0, y: 0, width: '100%', height: '20%' },
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Title text - positioned at top of slide
|
|
77
|
-
layers.push({
|
|
78
|
-
type: 'text',
|
|
79
|
-
id: 'title',
|
|
80
|
-
content: {
|
|
81
|
-
text: title,
|
|
82
|
-
style: {
|
|
83
|
-
fontSize: titleFontSize,
|
|
84
|
-
fontFamily: getThemeFont(context, 'title'),
|
|
85
|
-
fontWeight: 'bold',
|
|
86
|
-
color: theme.colors.text,
|
|
87
|
-
textAlign: 'center',
|
|
88
|
-
shadow: shouldUseShadow(context),
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
position: {
|
|
92
|
-
x: '50%',
|
|
93
|
-
y: '9%',
|
|
94
|
-
anchor: 'center',
|
|
95
|
-
width: layout.maxTextWidth,
|
|
96
|
-
},
|
|
97
|
-
animation: { type: 'fadeIn', duration: 1, delay: 0.3 },
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Add caption if provided
|
|
102
|
-
if (caption) {
|
|
103
|
-
layers.push({
|
|
104
|
-
type: 'shape',
|
|
105
|
-
id: 'caption-overlay',
|
|
106
|
-
content: {
|
|
107
|
-
shape: 'rect',
|
|
108
|
-
fill: `linear-gradient(0deg, ${withAlpha(bg, 0.85)} 0%, ${withAlpha(bg, 0.6)} 70%, ${withAlpha(bg, 0)} 100%)`,
|
|
109
|
-
},
|
|
110
|
-
position: { x: 0, y: '80%', width: '100%', height: '20%' },
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Caption text
|
|
114
|
-
layers.push({
|
|
115
|
-
type: 'text',
|
|
116
|
-
id: 'caption',
|
|
117
|
-
content: {
|
|
118
|
-
text: caption,
|
|
119
|
-
style: {
|
|
120
|
-
fontSize: captionFontSize,
|
|
121
|
-
fontFamily: getThemeFont(context, 'body'),
|
|
122
|
-
color: theme.colors.text,
|
|
123
|
-
textAlign: 'center',
|
|
124
|
-
shadow: shouldUseShadow(context),
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
position: {
|
|
128
|
-
x: '50%',
|
|
129
|
-
y: layout.captionY,
|
|
130
|
-
anchor: 'center',
|
|
131
|
-
width: layout.maxTextWidth,
|
|
132
|
-
},
|
|
133
|
-
animation: { type: 'fadeIn', duration: 1, delay: 0.5 },
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return layers;
|
|
138
|
-
}
|