@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,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diagram layout — shared between the read-only SVG render path
|
|
3
|
-
* (`diagramBlock` template) and the interactive editor (React Flow in
|
|
4
|
-
* `@bendyline/squisq-editor-react`). Same children + same options always
|
|
5
|
-
* produce the same node positions and edge list, so previews and the
|
|
6
|
-
* editor stay visually consistent.
|
|
7
|
-
*
|
|
8
|
-
* Layout rules:
|
|
9
|
-
* 1. Children with both `x` and `y` set keep their authored coordinates.
|
|
10
|
-
* 2. Children missing either coordinate are auto-placed in a square-ish
|
|
11
|
-
* grid in declaration order, offset below the bounding box of the
|
|
12
|
-
* explicitly-positioned children.
|
|
13
|
-
* 3. Edges come from each child's `connectsTo`. Targets that don't match
|
|
14
|
-
* any sibling id are dropped (and counted in `warnings`).
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { Block, BlockConnection } from '../../schemas/Doc.js';
|
|
18
|
-
|
|
19
|
-
export interface DiagramNodePosition {
|
|
20
|
-
/** Block id (matches `Block.id`). */
|
|
21
|
-
id: string;
|
|
22
|
-
/** Display label (block title or fallback to id). */
|
|
23
|
-
label: string;
|
|
24
|
-
/** Pixel x coordinate (canvas-relative). */
|
|
25
|
-
x: number;
|
|
26
|
-
/** Pixel y coordinate (canvas-relative). */
|
|
27
|
-
y: number;
|
|
28
|
-
/** True when the position came from `x=`/`y=` attributes; false when auto-laid out. */
|
|
29
|
-
pinned: boolean;
|
|
30
|
-
/** Optional `.class` tokens carried over from the heading. */
|
|
31
|
-
classes?: string[];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface DiagramEdge {
|
|
35
|
-
/** Synthetic stable edge id. */
|
|
36
|
-
id: string;
|
|
37
|
-
/** Source node id. */
|
|
38
|
-
source: string;
|
|
39
|
-
/** Target node id. */
|
|
40
|
-
target: string;
|
|
41
|
-
/** Connection type from `connectsTo=target:type` (used as edge label). */
|
|
42
|
-
type?: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface DiagramLayout {
|
|
46
|
-
nodes: DiagramNodePosition[];
|
|
47
|
-
edges: DiagramEdge[];
|
|
48
|
-
warnings: string[];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface DiagramLayoutOptions {
|
|
52
|
-
/** Horizontal grid pitch between auto-laid-out nodes. Default: 260 (node width 180 + 80 air). */
|
|
53
|
-
gapX?: number;
|
|
54
|
-
/** Vertical grid pitch between auto-laid-out nodes. Default: 140. */
|
|
55
|
-
gapY?: number;
|
|
56
|
-
/** Padding around the explicit-positions bounding box before the grid starts. Default: 80. */
|
|
57
|
-
gridPad?: number;
|
|
58
|
-
/** Origin x for the grid when no explicit nodes anchor it. Default: 80. */
|
|
59
|
-
gridOriginX?: number;
|
|
60
|
-
/** Origin y for the grid when no explicit nodes anchor it. Default: 80. */
|
|
61
|
-
gridOriginY?: number;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const DEFAULT_OPTS: Required<DiagramLayoutOptions> = {
|
|
65
|
-
gapX: 260,
|
|
66
|
-
gapY: 140,
|
|
67
|
-
gridPad: 80,
|
|
68
|
-
gridOriginX: 80,
|
|
69
|
-
gridOriginY: 80,
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Compute node positions and edges for a diagram from a parent block's
|
|
74
|
-
* children. Pure function — same inputs always produce the same output.
|
|
75
|
-
*/
|
|
76
|
-
export function computeDiagramLayout(
|
|
77
|
-
children: readonly Block[],
|
|
78
|
-
options: DiagramLayoutOptions = {},
|
|
79
|
-
): DiagramLayout {
|
|
80
|
-
const opts = { ...DEFAULT_OPTS, ...options };
|
|
81
|
-
const warnings: string[] = [];
|
|
82
|
-
|
|
83
|
-
// First pass: extract explicit positions, record which children still need a grid slot.
|
|
84
|
-
type Entry = { child: Block; pinned: boolean; x: number; y: number };
|
|
85
|
-
const entries: Entry[] = [];
|
|
86
|
-
const unpositionedIdx: number[] = [];
|
|
87
|
-
|
|
88
|
-
for (let i = 0; i < children.length; i++) {
|
|
89
|
-
const c = children[i];
|
|
90
|
-
const hasX = typeof c.x === 'number';
|
|
91
|
-
const hasY = typeof c.y === 'number';
|
|
92
|
-
if (hasX && hasY) {
|
|
93
|
-
entries.push({ child: c, pinned: true, x: c.x as number, y: c.y as number });
|
|
94
|
-
} else {
|
|
95
|
-
entries.push({ child: c, pinned: false, x: 0, y: 0 });
|
|
96
|
-
unpositionedIdx.push(i);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Second pass: lay out unpositioned children in a square-ish grid.
|
|
101
|
-
if (unpositionedIdx.length > 0) {
|
|
102
|
-
const cols = Math.max(1, Math.ceil(Math.sqrt(unpositionedIdx.length)));
|
|
103
|
-
// Find the bottom-right of the pinned bounding box so the grid sits below it.
|
|
104
|
-
let baseX = opts.gridOriginX;
|
|
105
|
-
let baseY = opts.gridOriginY;
|
|
106
|
-
const pinned = entries.filter((e) => e.pinned);
|
|
107
|
-
if (pinned.length > 0) {
|
|
108
|
-
const minX = Math.min(...pinned.map((e) => e.x));
|
|
109
|
-
const maxY = Math.max(...pinned.map((e) => e.y));
|
|
110
|
-
baseX = minX;
|
|
111
|
-
baseY = maxY + opts.gridPad + opts.gapY;
|
|
112
|
-
}
|
|
113
|
-
unpositionedIdx.forEach((entryIdx, k) => {
|
|
114
|
-
const col = k % cols;
|
|
115
|
-
const row = Math.floor(k / cols);
|
|
116
|
-
entries[entryIdx].x = baseX + col * opts.gapX;
|
|
117
|
-
entries[entryIdx].y = baseY + row * opts.gapY;
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Third pass: emit nodes + the id-set used to validate edge targets.
|
|
122
|
-
const nodes: DiagramNodePosition[] = entries.map((e) => ({
|
|
123
|
-
id: e.child.id,
|
|
124
|
-
label: e.child.title ?? e.child.id,
|
|
125
|
-
x: e.x,
|
|
126
|
-
y: e.y,
|
|
127
|
-
pinned: e.pinned,
|
|
128
|
-
...(e.child.classes && e.child.classes.length > 0 ? { classes: e.child.classes } : {}),
|
|
129
|
-
}));
|
|
130
|
-
const nodeIds = new Set(nodes.map((n) => n.id));
|
|
131
|
-
|
|
132
|
-
// Fourth pass: emit edges from each child's connectsTo, dropping ghosts.
|
|
133
|
-
const edges: DiagramEdge[] = [];
|
|
134
|
-
const seenEdgeIds = new Set<string>();
|
|
135
|
-
for (const child of children) {
|
|
136
|
-
if (!child.connectsTo) continue;
|
|
137
|
-
for (const conn of child.connectsTo) {
|
|
138
|
-
if (!nodeIds.has(conn.target)) {
|
|
139
|
-
warnings.push(`Edge from "${child.id}" to "${conn.target}" dropped: no such sibling node`);
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
const edgeId = makeEdgeId(child.id, conn);
|
|
143
|
-
if (seenEdgeIds.has(edgeId)) continue;
|
|
144
|
-
seenEdgeIds.add(edgeId);
|
|
145
|
-
edges.push({
|
|
146
|
-
id: edgeId,
|
|
147
|
-
source: child.id,
|
|
148
|
-
target: conn.target,
|
|
149
|
-
...(conn.type ? { type: conn.type } : {}),
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return { nodes, edges, warnings };
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function makeEdgeId(source: string, conn: BlockConnection): string {
|
|
158
|
-
return conn.type ? `${source}->${conn.target}:${conn.type}` : `${source}->${conn.target}`;
|
|
159
|
-
}
|
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Drawing block template.
|
|
3
|
-
*
|
|
4
|
-
* Renders the parent block's children as free-form shapes on a canvas:
|
|
5
|
-
* - Each child becomes a shape (`rect`/`circle` → ShapeLayer, `line`/
|
|
6
|
-
* `arrow`/`path` → PathLayer, `text` → TextLayer) with its title as a
|
|
7
|
-
* centered label and its body text as an optional sublabel.
|
|
8
|
-
* - `line`/`arrow` children with `from`/`to` (and any child's
|
|
9
|
-
* `connectsTo`) become connectors clipped to the shapes they join.
|
|
10
|
-
*
|
|
11
|
-
* Coordinates from `x`/`y`/`width`/`height` are author-defined units; the
|
|
12
|
-
* template fits the bounding box of all shapes to the viewport with
|
|
13
|
-
* padding (same approach as `diagramBlock`), so authors don't think in
|
|
14
|
-
* absolute pixels.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { Layer, ShapeLayer, TextLayer, PathLayer } from '../../schemas/Doc.js';
|
|
18
|
-
import type { DrawingBlockInput, TemplateContext } from '../../schemas/BlockTemplates.js';
|
|
19
|
-
import { resolveColorScheme, getThemeFont, themedFontSize } from '../utils/themeUtils.js';
|
|
20
|
-
import { computeDrawingLayout, type DrawingShape, type DrawingConnector } from './drawingLayout.js';
|
|
21
|
-
import { shapePath, connectorPath, snapEndpoints } from '../utils/shapeGeometry.js';
|
|
22
|
-
|
|
23
|
-
const PADDING = 80;
|
|
24
|
-
|
|
25
|
-
export function drawingBlock(input: DrawingBlockInput, context: TemplateContext): Layer[] {
|
|
26
|
-
const { theme, viewport, children = [] } = context;
|
|
27
|
-
const colors = resolveColorScheme(context, input.colorScheme);
|
|
28
|
-
const defaultStroke = input.stroke ?? colors.text ?? theme.colors.text;
|
|
29
|
-
const defaultFill = input.fill ?? 'none';
|
|
30
|
-
|
|
31
|
-
const layout = computeDrawingLayout(children);
|
|
32
|
-
|
|
33
|
-
// No shapes authored as children → empty drawing hint.
|
|
34
|
-
if (layout.shapes.length === 0 && layout.connectors.length === 0) {
|
|
35
|
-
return [emptyHint(input, context)];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Bounding box of all shapes in author coordinates.
|
|
39
|
-
const minX = Math.min(...layout.shapes.map((s) => s.x));
|
|
40
|
-
const maxX = Math.max(...layout.shapes.map((s) => s.x + s.width));
|
|
41
|
-
const minY = Math.min(...layout.shapes.map((s) => s.y));
|
|
42
|
-
const maxY = Math.max(...layout.shapes.map((s) => s.y + s.height));
|
|
43
|
-
|
|
44
|
-
const titleHeight = input.title ? 120 : 0;
|
|
45
|
-
const availW = Math.max(1, viewport.width - PADDING * 2);
|
|
46
|
-
const availH = Math.max(1, viewport.height - PADDING * 2 - titleHeight);
|
|
47
|
-
const contentW = Math.max(1, maxX - minX);
|
|
48
|
-
const contentH = Math.max(1, maxY - minY);
|
|
49
|
-
|
|
50
|
-
// Uniform scale that fits both dimensions. Small drawings may grow
|
|
51
|
-
// (shapes are vector) up to 1.8× so a three-shape sketch doesn't render
|
|
52
|
-
// as a tiny off-center cluster; the title and the scaled drawing are
|
|
53
|
-
// centered together as one group.
|
|
54
|
-
const scale = Math.min(availW / contentW, availH / contentH, 1.8);
|
|
55
|
-
const scaledW = contentW * scale;
|
|
56
|
-
const scaledH = contentH * scale;
|
|
57
|
-
const groupTop = Math.max(PADDING / 2, (viewport.height - titleHeight - scaledH) / 2);
|
|
58
|
-
const offsetX = PADDING + (availW - scaledW) / 2;
|
|
59
|
-
const offsetY = groupTop + titleHeight;
|
|
60
|
-
|
|
61
|
-
const tx = (x: number) => offsetX + (x - minX) * scale;
|
|
62
|
-
const ty = (y: number) => offsetY + (y - minY) * scale;
|
|
63
|
-
const fontAdj = Math.min(Math.max(scale, 1), 1.5);
|
|
64
|
-
|
|
65
|
-
const layers: Layer[] = [];
|
|
66
|
-
|
|
67
|
-
if (input.title) {
|
|
68
|
-
layers.push({
|
|
69
|
-
type: 'text',
|
|
70
|
-
id: 'drawing-title',
|
|
71
|
-
content: {
|
|
72
|
-
text: input.title,
|
|
73
|
-
style: {
|
|
74
|
-
fontSize: themedFontSize(40, context, true),
|
|
75
|
-
fontFamily: getThemeFont(context, 'title'),
|
|
76
|
-
fontWeight: 'bold',
|
|
77
|
-
color: theme.colors.text,
|
|
78
|
-
textAlign: 'center',
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
position: { x: '50%', y: groupTop + titleHeight / 2 - 16, anchor: 'center' },
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Center lookup so connectors can clip to the shapes they join.
|
|
86
|
-
const boxes = new Map<string, { cx: number; cy: number; rx: number; ry: number }>();
|
|
87
|
-
for (const s of layout.shapes) {
|
|
88
|
-
const x = tx(s.x);
|
|
89
|
-
const y = ty(s.y);
|
|
90
|
-
const w = s.width * scale;
|
|
91
|
-
const h = s.height * scale;
|
|
92
|
-
boxes.set(s.id, {
|
|
93
|
-
cx: x + w / 2,
|
|
94
|
-
cy: y + h / 2,
|
|
95
|
-
rx: Math.max(1, w / 2),
|
|
96
|
-
ry: Math.max(1, h / 2),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Connectors first so they sit behind shapes.
|
|
101
|
-
for (const conn of layout.connectors) {
|
|
102
|
-
const a = boxes.get(conn.from);
|
|
103
|
-
const b = boxes.get(conn.to);
|
|
104
|
-
if (!a || !b) continue;
|
|
105
|
-
const { start, end } = snapEndpoints(a, b);
|
|
106
|
-
const path: PathLayer = {
|
|
107
|
-
type: 'path',
|
|
108
|
-
id: `connector-${conn.id}`,
|
|
109
|
-
content: {
|
|
110
|
-
d: connectorPath(conn.routing, start, end),
|
|
111
|
-
stroke: conn.stroke ?? defaultStroke,
|
|
112
|
-
strokeWidth: conn.strokeWidth ?? Math.round(2 * fontAdj),
|
|
113
|
-
fill: 'none',
|
|
114
|
-
...(conn.dasharray ? { dasharray: conn.dasharray } : {}),
|
|
115
|
-
...(conn.startMarker !== 'none' ? { startMarker: conn.startMarker } : {}),
|
|
116
|
-
...(conn.endMarker !== 'none' ? { endMarker: conn.endMarker } : {}),
|
|
117
|
-
},
|
|
118
|
-
position: { x: 0, y: 0, width: '100%', height: '100%' },
|
|
119
|
-
};
|
|
120
|
-
layers.push(path);
|
|
121
|
-
if (conn.label) layers.push(connectorLabel(conn, a, b, context, fontAdj));
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Shapes (and their labels) on top.
|
|
125
|
-
for (const s of layout.shapes) {
|
|
126
|
-
const x = tx(s.x);
|
|
127
|
-
const y = ty(s.y);
|
|
128
|
-
const w = s.width * scale;
|
|
129
|
-
const h = s.height * scale;
|
|
130
|
-
layers.push(...shapeLayers(s, x, y, w, h, context, defaultStroke, defaultFill, fontAdj));
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return layers;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// ============================================
|
|
137
|
-
// Per-shape layer emission
|
|
138
|
-
// ============================================
|
|
139
|
-
|
|
140
|
-
function shapeLayers(
|
|
141
|
-
s: DrawingShape,
|
|
142
|
-
x: number,
|
|
143
|
-
y: number,
|
|
144
|
-
w: number,
|
|
145
|
-
h: number,
|
|
146
|
-
context: TemplateContext,
|
|
147
|
-
defaultStroke: string,
|
|
148
|
-
defaultFill: string,
|
|
149
|
-
fontAdj: number,
|
|
150
|
-
): Layer[] {
|
|
151
|
-
const out: Layer[] = [];
|
|
152
|
-
const stroke = s.stroke ?? defaultStroke;
|
|
153
|
-
const fill = s.fill ?? defaultFill;
|
|
154
|
-
|
|
155
|
-
if (s.kind === 'text') {
|
|
156
|
-
out.push(
|
|
157
|
-
textLayer(
|
|
158
|
-
`shape-${s.id}`,
|
|
159
|
-
s.text ?? s.label ?? '',
|
|
160
|
-
x + w / 2,
|
|
161
|
-
y + h / 2,
|
|
162
|
-
w,
|
|
163
|
-
context,
|
|
164
|
-
s.stroke ?? context.theme.colors.text,
|
|
165
|
-
true,
|
|
166
|
-
fontAdj,
|
|
167
|
-
),
|
|
168
|
-
);
|
|
169
|
-
return out;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
if (s.kind === 'rect' || s.kind === 'circle') {
|
|
173
|
-
const shape: ShapeLayer = {
|
|
174
|
-
type: 'shape',
|
|
175
|
-
id: `shape-${s.id}`,
|
|
176
|
-
content: {
|
|
177
|
-
shape: s.kind,
|
|
178
|
-
fill,
|
|
179
|
-
stroke,
|
|
180
|
-
strokeWidth: s.strokeWidth ?? Math.round(2 * fontAdj),
|
|
181
|
-
...(s.kind === 'rect' && s.borderRadius != null ? { borderRadius: s.borderRadius } : {}),
|
|
182
|
-
},
|
|
183
|
-
position: { x, y, width: w, height: h },
|
|
184
|
-
};
|
|
185
|
-
out.push(shape);
|
|
186
|
-
} else {
|
|
187
|
-
// line / arrow / path / polygon shapes → PathLayer.
|
|
188
|
-
const diagonal = `M ${round(x)} ${round(y)} L ${round(x + w)} ${round(y + h)}`;
|
|
189
|
-
let d = diagonal;
|
|
190
|
-
let pathFill = 'none';
|
|
191
|
-
let endMarker: 'none' | 'arrow' = 'none';
|
|
192
|
-
if (s.kind === 'path') {
|
|
193
|
-
d = s.d ?? diagonal;
|
|
194
|
-
pathFill = fill;
|
|
195
|
-
} else if (s.kind === 'arrow') {
|
|
196
|
-
endMarker = 'arrow';
|
|
197
|
-
} else if (s.kind !== 'line') {
|
|
198
|
-
// Named polygon / curved shape → computed filled path.
|
|
199
|
-
d = shapePath(s.kind, x, y, w, h) ?? diagonal;
|
|
200
|
-
pathFill = fill;
|
|
201
|
-
}
|
|
202
|
-
const path: PathLayer = {
|
|
203
|
-
type: 'path',
|
|
204
|
-
id: `shape-${s.id}`,
|
|
205
|
-
content: {
|
|
206
|
-
d,
|
|
207
|
-
stroke,
|
|
208
|
-
strokeWidth: s.strokeWidth ?? Math.round(2 * fontAdj),
|
|
209
|
-
fill: pathFill,
|
|
210
|
-
...(s.dasharray ? { dasharray: s.dasharray } : {}),
|
|
211
|
-
...(endMarker !== 'none' ? { endMarker } : {}),
|
|
212
|
-
},
|
|
213
|
-
position: { x: 0, y: 0, width: '100%', height: '100%' },
|
|
214
|
-
};
|
|
215
|
-
out.push(path);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Label (heading text) centered on the shape; sublabel (body) below it.
|
|
219
|
-
if (s.label) {
|
|
220
|
-
out.push(
|
|
221
|
-
textLayer(
|
|
222
|
-
`shape-label-${s.id}`,
|
|
223
|
-
s.label,
|
|
224
|
-
x + w / 2,
|
|
225
|
-
y + h / 2,
|
|
226
|
-
w,
|
|
227
|
-
context,
|
|
228
|
-
s.stroke ?? context.theme.colors.text,
|
|
229
|
-
true,
|
|
230
|
-
fontAdj,
|
|
231
|
-
),
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
if (s.sublabel) {
|
|
235
|
-
out.push(
|
|
236
|
-
textLayer(
|
|
237
|
-
`shape-sublabel-${s.id}`,
|
|
238
|
-
s.sublabel,
|
|
239
|
-
x + w / 2,
|
|
240
|
-
y + h + 14 * fontAdj,
|
|
241
|
-
w,
|
|
242
|
-
context,
|
|
243
|
-
context.theme.colors.textMuted,
|
|
244
|
-
false,
|
|
245
|
-
fontAdj,
|
|
246
|
-
),
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
return out;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function textLayer(
|
|
253
|
-
id: string,
|
|
254
|
-
text: string,
|
|
255
|
-
cx: number,
|
|
256
|
-
cy: number,
|
|
257
|
-
width: number,
|
|
258
|
-
context: TemplateContext,
|
|
259
|
-
color: string,
|
|
260
|
-
bold: boolean,
|
|
261
|
-
fontAdj: number,
|
|
262
|
-
): TextLayer {
|
|
263
|
-
return {
|
|
264
|
-
type: 'text',
|
|
265
|
-
id,
|
|
266
|
-
content: {
|
|
267
|
-
text,
|
|
268
|
-
style: {
|
|
269
|
-
fontSize: themedFontSize(Math.round((bold ? 22 : 18) * fontAdj), context, false),
|
|
270
|
-
fontFamily: getThemeFont(context, 'body'),
|
|
271
|
-
...(bold ? { fontWeight: 'bold' as const } : {}),
|
|
272
|
-
color,
|
|
273
|
-
textAlign: 'center',
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
position: { x: cx, y: cy, anchor: 'center', width },
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
function connectorLabel(
|
|
281
|
-
conn: DrawingConnector,
|
|
282
|
-
a: { cx: number; cy: number },
|
|
283
|
-
b: { cx: number; cy: number },
|
|
284
|
-
context: TemplateContext,
|
|
285
|
-
fontAdj: number,
|
|
286
|
-
): TextLayer {
|
|
287
|
-
const fontSize = themedFontSize(Math.round(18 * fontAdj), context, false);
|
|
288
|
-
return {
|
|
289
|
-
type: 'text',
|
|
290
|
-
id: `connector-label-${conn.id}`,
|
|
291
|
-
content: {
|
|
292
|
-
text: conn.label ?? '',
|
|
293
|
-
style: {
|
|
294
|
-
fontSize,
|
|
295
|
-
fontFamily: getThemeFont(context, 'body'),
|
|
296
|
-
color: context.theme.colors.textMuted,
|
|
297
|
-
textAlign: 'center',
|
|
298
|
-
},
|
|
299
|
-
},
|
|
300
|
-
// Floated just above the connector midpoint so the line never
|
|
301
|
-
// strikes through the label text.
|
|
302
|
-
position: { x: (a.cx + b.cx) / 2, y: (a.cy + b.cy) / 2 - fontSize * 0.9, anchor: 'center' },
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function emptyHint(input: DrawingBlockInput, context: TemplateContext): TextLayer {
|
|
307
|
-
return {
|
|
308
|
-
type: 'text',
|
|
309
|
-
id: 'drawing-empty',
|
|
310
|
-
content: {
|
|
311
|
-
text: input.title ?? 'Empty drawing',
|
|
312
|
-
style: {
|
|
313
|
-
fontSize: themedFontSize(36, context, true),
|
|
314
|
-
fontFamily: getThemeFont(context, 'title'),
|
|
315
|
-
color: context.theme.colors.textMuted,
|
|
316
|
-
textAlign: 'center',
|
|
317
|
-
},
|
|
318
|
-
},
|
|
319
|
-
position: { x: '50%', y: '50%', anchor: 'center' },
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
function round(n: number): number {
|
|
324
|
-
return Math.round(n * 100) / 100;
|
|
325
|
-
}
|