@bendyline/squisq 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/README.md +8 -8
- package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-DynJleo-.d.ts → Doc-COe-rPQB.d.ts} +7 -5
- package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-dtKahVyD.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- package/dist/{chunk-VWCJ2WXC.js → chunk-2ZWIXGAC.js} +0 -1
- package/dist/{chunk-VYFRI7R6.js → chunk-32R2RZAO.js} +72 -3
- package/dist/chunk-3IGPAPQ7.js +645 -0
- package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
- package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
- package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
- package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
- package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
- package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
- package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
- package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
- package/dist/chunk-BCCXTMN5.js +699 -0
- package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
- package/dist/{chunk-XNLB57UD.js → chunk-EK446BUE.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-JI77MGAK.js → chunk-GIIOY6XR.js} +2178 -1291
- package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
- package/dist/chunk-OPO5K4DZ.js +241 -0
- package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
- package/dist/{chunk-OTKVFVL6.js → chunk-QNTQIEIV.js} +130 -47
- package/dist/{chunk-5UYI3RJB.js → chunk-QWCFK5FN.js} +55 -40
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
- package/dist/{chunk-QUUPYOSP.js → chunk-SPTY4C6F.js} +136 -5
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +311 -13
- package/dist/doc/index.js +25 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +1 -3
- package/dist/icons/index.js +2 -4
- package/dist/icons/inlineIconMarker.js +1 -2
- package/dist/imageEdit/index.d.ts +48 -17
- package/dist/imageEdit/index.js +3 -4
- package/dist/index.d.ts +13 -13
- package/dist/index.js +67 -33
- package/dist/jsonForm/index.d.ts +10 -3
- package/dist/jsonForm/index.js +8 -7
- package/dist/markdown/index.d.ts +75 -11
- package/dist/markdown/index.js +32 -7
- package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-BSMOocve.d.ts} +2 -2
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +12 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +1 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +2 -4
- package/dist/schemas/index.d.ts +18 -6
- package/dist/schemas/index.js +7 -6
- package/dist/spatial/index.d.ts +2 -1
- package/dist/spatial/index.js +1 -2
- package/dist/storage/index.d.ts +4 -2
- package/dist/storage/index.js +1 -2
- package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-BUTWjufL.d.ts} +1 -1
- package/dist/timing/index.js +2 -4
- package/dist/transform/index.d.ts +3 -3
- package/dist/transform/index.js +6 -7
- package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
- package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
- package/dist/versions/index.d.ts +14 -11
- package/dist/versions/index.js +2 -3
- package/package.json +8 -3
- package/dist/chunk-2UQOHYE2.js.map +0 -1
- package/dist/chunk-3E5F2XMR.js.map +0 -1
- package/dist/chunk-4X3JQXNM.js.map +0 -1
- package/dist/chunk-5DKBFXPY.js.map +0 -1
- package/dist/chunk-5J4HKRJF.js.map +0 -1
- package/dist/chunk-5UYI3RJB.js.map +0 -1
- package/dist/chunk-66QO7XFB.js.map +0 -1
- package/dist/chunk-AMIR72JP.js +0 -380
- package/dist/chunk-AMIR72JP.js.map +0 -1
- package/dist/chunk-DBS6RIFL.js.map +0 -1
- package/dist/chunk-DNJKBAI7.js +0 -1
- package/dist/chunk-DNJKBAI7.js.map +0 -1
- package/dist/chunk-ET53IIEP.js +0 -1
- package/dist/chunk-ET53IIEP.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-ILWDXLUK.js.map +0 -1
- package/dist/chunk-JHZWYRSW.js.map +0 -1
- package/dist/chunk-JI77MGAK.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-OTKVFVL6.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.js.map +0 -1
- package/dist/chunk-QUUPYOSP.js.map +0 -1
- package/dist/chunk-R2GC6RLD.js +0 -344
- package/dist/chunk-R2GC6RLD.js.map +0 -1
- package/dist/chunk-R2YZTCLO.js.map +0 -1
- package/dist/chunk-S7A5D7ZJ.js +0 -174
- package/dist/chunk-S7A5D7ZJ.js.map +0 -1
- package/dist/chunk-TUWMK62B.js.map +0 -1
- package/dist/chunk-V543AI2F.js +0 -1
- package/dist/chunk-V543AI2F.js.map +0 -1
- package/dist/chunk-VR7UPJ7C.js.map +0 -1
- package/dist/chunk-VWCJ2WXC.js.map +0 -1
- package/dist/chunk-VYFRI7R6.js.map +0 -1
- package/dist/chunk-XNLB57UD.js.map +0 -1
- package/dist/chunk-ZLQKNOZQ.js +0 -1
- package/dist/chunk-ZLQKNOZQ.js.map +0 -1
- package/dist/doc/index.js.map +0 -1
- package/dist/generate/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/icons/inlineIconMarker.js.map +0 -1
- package/dist/imageEdit/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsonForm/index.js.map +0 -1
- package/dist/markdown/index.js.map +0 -1
- package/dist/narration/index.js.map +0 -1
- package/dist/random/index.js.map +0 -1
- package/dist/recommend/index.js.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/spatial/index.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/timing/index.js.map +0 -1
- package/dist/transform/index.js.map +0 -1
- package/dist/versions/index.js.map +0 -1
- package/src/__tests__/animationUtils.test.ts +0 -117
- package/src/__tests__/annotationCoercion.test.ts +0 -243
- package/src/__tests__/applyNarrationTiming.test.ts +0 -190
- package/src/__tests__/applyRenderStyle.test.ts +0 -146
- package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
- package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
- package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
- package/src/__tests__/asciiDiagramParse.test.ts +0 -233
- package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
- package/src/__tests__/asciiDiagramRender.test.ts +0 -162
- package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
- package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
- package/src/__tests__/asciiTimelineParse.test.ts +0 -205
- package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
- package/src/__tests__/asciiTimelineRender.test.ts +0 -376
- package/src/__tests__/atmosphereLayers.test.ts +0 -108
- package/src/__tests__/attrTokens.test.ts +0 -167
- package/src/__tests__/colorUtils.test.ts +0 -112
- package/src/__tests__/contentContainer.test.ts +0 -325
- package/src/__tests__/contentExtractor.test.ts +0 -243
- package/src/__tests__/coverBlock.test.ts +0 -310
- package/src/__tests__/customTemplateSample.test.ts +0 -144
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
- package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
- package/src/__tests__/dataTable.test.ts +0 -145
- package/src/__tests__/diagramBlock.test.ts +0 -122
- package/src/__tests__/diagramLayout.test.ts +0 -134
- package/src/__tests__/diagramText.test.ts +0 -26
- package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
- package/src/__tests__/drawing.test.ts +0 -109
- package/src/__tests__/drawingBlock.test.ts +0 -124
- package/src/__tests__/drawingLayout.test.ts +0 -171
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
- package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
- package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
- package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
- package/src/__tests__/geohash.test.ts +0 -110
- package/src/__tests__/getLayers.test.ts +0 -243
- package/src/__tests__/getLayersFallback.test.ts +0 -103
- package/src/__tests__/haversine.test.ts +0 -63
- package/src/__tests__/iconResolve.test.ts +0 -122
- package/src/__tests__/imageEditExportSvg.test.ts +0 -70
- package/src/__tests__/imageEditState.test.ts +0 -74
- package/src/__tests__/imageEditVersions.test.ts +0 -243
- package/src/__tests__/inferDocumentTitle.test.ts +0 -50
- package/src/__tests__/inlineIconMarker.test.ts +0 -36
- package/src/__tests__/inputDescriptors.test.ts +0 -162
- package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
- package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
- package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
- package/src/__tests__/jsonForm.pointer.test.ts +0 -149
- package/src/__tests__/jsonForm.tokens.test.ts +0 -84
- package/src/__tests__/layoutBlock.test.ts +0 -83
- package/src/__tests__/layoutLayout.test.ts +0 -169
- package/src/__tests__/localForageAdapter.test.ts +0 -155
- package/src/__tests__/majorApiTypes.test.ts +0 -18
- package/src/__tests__/markdown.test.ts +0 -1009
- package/src/__tests__/markdownIcons.test.ts +0 -104
- package/src/__tests__/markdownSanitize.test.ts +0 -81
- package/src/__tests__/markdownToDoc.test.ts +0 -957
- package/src/__tests__/matchFontFamily.test.ts +0 -114
- package/src/__tests__/materializeBlockLayers.test.ts +0 -167
- package/src/__tests__/materializePageSections.test.ts +0 -404
- package/src/__tests__/materializeTestUtils.ts +0 -17
- package/src/__tests__/mediaAnnotations.test.ts +0 -91
- package/src/__tests__/mediaSchedule.test.ts +0 -118
- package/src/__tests__/narrationAlign.test.ts +0 -150
- package/src/__tests__/narrationFeatures.test.ts +0 -71
- package/src/__tests__/narrationNuclei.test.ts +0 -45
- package/src/__tests__/narrationPacing.test.ts +0 -189
- package/src/__tests__/narrationScript.test.ts +0 -149
- package/src/__tests__/narrationSessionRepro.test.ts +0 -62
- package/src/__tests__/narrationSidecar.test.ts +0 -88
- package/src/__tests__/narrationSyllables.test.ts +0 -65
- package/src/__tests__/narrationTestSignals.ts +0 -167
- package/src/__tests__/narrationVad.test.ts +0 -66
- package/src/__tests__/pageStyle.test.ts +0 -258
- package/src/__tests__/pandocAttrParse.test.ts +0 -187
- package/src/__tests__/recommendTemplates.test.ts +0 -183
- package/src/__tests__/resolveDocTheme.test.ts +0 -69
- package/src/__tests__/rootExports.test.ts +0 -61
- package/src/__tests__/scopedContentContainer.test.ts +0 -109
- package/src/__tests__/seededRandom.test.ts +0 -142
- package/src/__tests__/shapeGeometry.test.ts +0 -138
- package/src/__tests__/shapeVocabulary.test.ts +0 -133
- package/src/__tests__/storage.test.ts +0 -60
- package/src/__tests__/structuredData.test.ts +0 -249
- package/src/__tests__/surface.test.ts +0 -68
- package/src/__tests__/templateAnnotationParse.test.ts +0 -173
- package/src/__tests__/templateInputs.test.ts +0 -69
- package/src/__tests__/templateMetadata.test.ts +0 -32
- package/src/__tests__/templates.test.ts +0 -710
- package/src/__tests__/themeCompile.test.ts +0 -225
- package/src/__tests__/themeValidator.test.ts +0 -131
- package/src/__tests__/timing.test.ts +0 -167
- package/src/__tests__/transformProvenance.test.ts +0 -160
- package/src/__tests__/transformV2.test.ts +0 -163
- package/src/__tests__/transitionNormalize.test.ts +0 -61
- package/src/__tests__/treeviewBattle.test.ts +0 -76
- package/src/__tests__/treeviewDetect.test.ts +0 -168
- package/src/__tests__/treeviewParse.test.ts +0 -118
- package/src/__tests__/treeviewPipeline.test.ts +0 -183
- package/src/__tests__/treeviewRender.test.ts +0 -91
- package/src/__tests__/validateDoc.test.ts +0 -260
- package/src/__tests__/versions.test.ts +0 -459
- package/src/doc/annotationBlocks.ts +0 -117
- package/src/doc/applyNarrationTiming.ts +0 -244
- package/src/doc/asciiDiagram/chars.ts +0 -210
- package/src/doc/asciiDiagram/detect.ts +0 -175
- package/src/doc/asciiDiagram/index.ts +0 -38
- package/src/doc/asciiDiagram/mapping.ts +0 -225
- package/src/doc/asciiDiagram/parse.ts +0 -1095
- package/src/doc/asciiDiagram/render.ts +0 -963
- package/src/doc/asciiDiagram/repair.ts +0 -400
- package/src/doc/asciiDiagram/types.ts +0 -65
- package/src/doc/asciiTimeline/detect.ts +0 -138
- package/src/doc/asciiTimeline/index.ts +0 -26
- package/src/doc/asciiTimeline/mapping.ts +0 -43
- package/src/doc/asciiTimeline/parse.ts +0 -870
- package/src/doc/asciiTimeline/render.ts +0 -427
- package/src/doc/asciiTimeline/types.ts +0 -73
- package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
- package/src/doc/audioMapping.ts +0 -442
- package/src/doc/customTemplatesFrontmatter.ts +0 -273
- package/src/doc/customThemesFrontmatter.ts +0 -95
- package/src/doc/docToMarkdown.ts +0 -284
- package/src/doc/index.ts +0 -161
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -465
- package/src/doc/mediaAnnotations.ts +0 -120
- package/src/doc/page/PageSection.ts +0 -174
- package/src/doc/page/materializePageSection.ts +0 -616
- package/src/doc/page/resolvePageBlock.ts +0 -108
- package/src/doc/page/sectionExtractors.ts +0 -466
- package/src/doc/pageCss.ts +0 -628
- package/src/doc/resolveDocTheme.ts +0 -56
- package/src/doc/standaloneAnnotation.ts +0 -58
- package/src/doc/structuredData.ts +0 -301
- package/src/doc/templateInputs.ts +0 -424
- package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
- package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
- package/src/doc/templates/accentImage.ts +0 -362
- package/src/doc/templates/captionUtils.ts +0 -56
- package/src/doc/templates/comparisonBar.ts +0 -173
- package/src/doc/templates/coverBlock.ts +0 -255
- package/src/doc/templates/customTemplate.ts +0 -51
- package/src/doc/templates/dataTable.ts +0 -102
- package/src/doc/templates/dateEvent.ts +0 -147
- package/src/doc/templates/definitionCard.ts +0 -140
- package/src/doc/templates/diagramBlock.ts +0 -403
- package/src/doc/templates/diagramLayout.ts +0 -159
- package/src/doc/templates/drawingBlock.ts +0 -325
- package/src/doc/templates/drawingLayout.ts +0 -539
- package/src/doc/templates/factCard.ts +0 -146
- package/src/doc/templates/fallbackBlock.ts +0 -123
- package/src/doc/templates/featureBlock.ts +0 -209
- package/src/doc/templates/fullBleedQuote.ts +0 -83
- package/src/doc/templates/imageWithCaption.ts +0 -186
- package/src/doc/templates/index.ts +0 -642
- package/src/doc/templates/inputDescriptors.ts +0 -451
- package/src/doc/templates/layoutBlock.ts +0 -43
- package/src/doc/templates/layoutLayout.ts +0 -243
- package/src/doc/templates/listBlock.ts +0 -207
- package/src/doc/templates/mapBlock.ts +0 -138
- package/src/doc/templates/metadata.ts +0 -130
- package/src/doc/templates/persistentLayers.ts +0 -526
- package/src/doc/templates/photoGrid.ts +0 -190
- package/src/doc/templates/pullQuote.ts +0 -141
- package/src/doc/templates/quoteBlock.ts +0 -141
- package/src/doc/templates/registry.ts +0 -88
- package/src/doc/templates/sectionHeader.ts +0 -120
- package/src/doc/templates/statHighlight.ts +0 -146
- package/src/doc/templates/templateNames.ts +0 -22
- package/src/doc/templates/timelineBlock.ts +0 -613
- package/src/doc/templates/titleBlock.ts +0 -150
- package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
- package/src/doc/templates/tokens/resolveTokens.ts +0 -453
- package/src/doc/templates/treeBlock.ts +0 -131
- package/src/doc/templates/twoColumn.ts +0 -263
- package/src/doc/templates/videoPullQuote.ts +0 -142
- package/src/doc/templates/videoWithCaption.ts +0 -135
- package/src/doc/treeview/chars.ts +0 -72
- package/src/doc/treeview/detect.ts +0 -145
- package/src/doc/treeview/index.ts +0 -30
- package/src/doc/treeview/mapping.ts +0 -95
- package/src/doc/treeview/parse.ts +0 -201
- package/src/doc/treeview/render.ts +0 -41
- package/src/doc/treeview/types.ts +0 -43
- package/src/doc/utils/animationUtils.ts +0 -399
- package/src/doc/utils/applyRenderStyle.ts +0 -106
- package/src/doc/utils/diagramText.ts +0 -78
- package/src/doc/utils/imageTreatment.ts +0 -70
- package/src/doc/utils/nearest.ts +0 -59
- package/src/doc/utils/shapeGeometry.ts +0 -614
- package/src/doc/utils/themeUtils.ts +0 -243
- package/src/doc/validate.ts +0 -575
- package/src/generate/contentExtractor.ts +0 -921
- package/src/generate/index.ts +0 -18
- package/src/generate/templateMapper.ts +0 -177
- package/src/icons/iconData.ts +0 -31
- package/src/icons/index.ts +0 -26
- package/src/icons/inlineIconMarker.ts +0 -73
- package/src/icons/resolve.ts +0 -139
- package/src/imageEdit/ImageEditVersionManager.ts +0 -73
- package/src/imageEdit/export.ts +0 -410
- package/src/imageEdit/index.ts +0 -72
- package/src/imageEdit/persistence.ts +0 -113
- package/src/imageEdit/state.ts +0 -112
- package/src/imageEdit/versionPaths.ts +0 -44
- package/src/imageEdit/versions.ts +0 -152
- package/src/index.ts +0 -15
- package/src/internal/immutable.ts +0 -58
- package/src/jsonForm/chooseControl.ts +0 -88
- package/src/jsonForm/evaluateWhen.ts +0 -59
- package/src/jsonForm/index.ts +0 -32
- package/src/jsonForm/inferSchema.ts +0 -25
- package/src/jsonForm/pointer.ts +0 -154
- package/src/jsonForm/tokens.ts +0 -78
- package/src/jsonForm/types.ts +0 -167
- package/src/markdown/annotationCoercion.ts +0 -295
- package/src/markdown/attrTokens.ts +0 -243
- package/src/markdown/convert.ts +0 -1353
- package/src/markdown/htmlParse.ts +0 -212
- package/src/markdown/index.ts +0 -152
- package/src/markdown/parse.ts +0 -103
- package/src/markdown/sanitize.ts +0 -318
- package/src/markdown/stringify.ts +0 -207
- package/src/markdown/types.ts +0 -710
- package/src/markdown/utils.ts +0 -459
- package/src/narration/align.ts +0 -514
- package/src/narration/features.ts +0 -231
- package/src/narration/index.ts +0 -86
- package/src/narration/nuclei.ts +0 -118
- package/src/narration/pacing.ts +0 -211
- package/src/narration/script.ts +0 -239
- package/src/narration/session.ts +0 -100
- package/src/narration/sidecar.ts +0 -187
- package/src/narration/syllables.ts +0 -85
- package/src/narration/trace.ts +0 -50
- package/src/narration/types.ts +0 -299
- package/src/narration/vad.ts +0 -131
- package/src/ngeohash.d.ts +0 -11
- package/src/random/SeededRandom.ts +0 -127
- package/src/random/index.ts +0 -1
- package/src/recommend/index.ts +0 -16
- package/src/recommend/numberHighlight.ts +0 -25
- package/src/recommend/templates.ts +0 -393
- package/src/schemas/BlockTemplates.ts +0 -1046
- package/src/schemas/CustomTemplates.ts +0 -126
- package/src/schemas/Doc.ts +0 -1073
- package/src/schemas/ImageEditDoc.ts +0 -102
- package/src/schemas/LayoutStrategy.ts +0 -178
- package/src/schemas/Media.ts +0 -179
- package/src/schemas/MediaProvider.ts +0 -70
- package/src/schemas/PageStyle.ts +0 -213
- package/src/schemas/Theme.ts +0 -413
- package/src/schemas/Transitions.ts +0 -224
- package/src/schemas/Types.ts +0 -15
- package/src/schemas/Viewport.ts +0 -91
- package/src/schemas/colorUtils.ts +0 -219
- package/src/schemas/fontStacks.ts +0 -339
- package/src/schemas/index.ts +0 -31
- package/src/schemas/pageStyleDefaults.ts +0 -204
- package/src/schemas/themeCompile.ts +0 -244
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -609
- package/src/schemas/themes/bold.json +0 -77
- package/src/schemas/themes/cinematic.json +0 -143
- package/src/schemas/themes/documentary.json +0 -125
- package/src/schemas/themes/gezellig.json +0 -123
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -126
- package/src/schemas/themes/minimalist.json +0 -74
- package/src/schemas/themes/morning-light.json +0 -117
- package/src/schemas/themes/standard-dark.json +0 -109
- package/src/schemas/themes/standard.json +0 -98
- package/src/schemas/themes/tech-dark.json +0 -143
- package/src/schemas/themes/warm-earth.json +0 -74
- package/src/spatial/Geohash.ts +0 -196
- package/src/spatial/Haversine.ts +0 -59
- package/src/spatial/index.ts +0 -2
- package/src/storage/ContentContainer.ts +0 -220
- package/src/storage/LocalForageAdapter.ts +0 -103
- package/src/storage/LocalStorageAdapter.ts +0 -57
- package/src/storage/MediaProviderFromContainer.ts +0 -92
- package/src/storage/MemoryStorageAdapter.ts +0 -37
- package/src/storage/ScopedContentContainer.ts +0 -143
- package/src/storage/Storage.ts +0 -28
- package/src/storage/index.ts +0 -9
- package/src/timing/index.ts +0 -17
- package/src/timing/narrationTiming.ts +0 -220
- package/src/timing/readingTime.ts +0 -94
- package/src/transform/applyTransform.ts +0 -122
- package/src/transform/blockAnalyzer.ts +0 -181
- package/src/transform/index.ts +0 -23
- package/src/transform/registry.ts +0 -217
- package/src/transform/styles/dataDriven.ts +0 -18
- package/src/transform/styles/documentary.ts +0 -18
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -19
- package/src/transform/styles/minimal.ts +0 -18
- package/src/transform/styles/narrative.ts +0 -19
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -158
- package/src/versions/DocumentVersionManager.ts +0 -70
- package/src/versions/gitignore.ts +0 -34
- package/src/versions/index.ts +0 -56
- package/src/versions/operations.ts +0 -144
- package/src/versions/paths.ts +0 -51
- package/src/versions/snapshotStore.ts +0 -202
- package/src/versions/timestamp.ts +0 -48
- package/src/versions/types.ts +0 -93
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Block template recommendations.
|
|
3
|
-
*
|
|
4
|
-
* Given a slice of markdown block nodes (the body underneath a heading),
|
|
5
|
-
* profile the content for image / video / quote / list / table / date /
|
|
6
|
-
* stat signals, then map that profile to the set of templates that make
|
|
7
|
-
* sense for the block. Used by the editor's template picker to surface a
|
|
8
|
-
* "Recommended for this block" section above the full template list.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { extractPlainText, findNodesByType, walkMarkdownTree } from '../markdown/utils.js';
|
|
12
|
-
import type {
|
|
13
|
-
HtmlElement,
|
|
14
|
-
HtmlNode,
|
|
15
|
-
MarkdownBlockNode,
|
|
16
|
-
MarkdownCodeBlock,
|
|
17
|
-
MarkdownHtmlBlock,
|
|
18
|
-
MarkdownNode,
|
|
19
|
-
} from '../markdown/types.js';
|
|
20
|
-
import {
|
|
21
|
-
detectAsciiDiagram,
|
|
22
|
-
isEligibleAsciiFenceLang,
|
|
23
|
-
isExplicitDiagramLang,
|
|
24
|
-
} from '../doc/asciiDiagram/detect.js';
|
|
25
|
-
import {
|
|
26
|
-
detectAsciiTimeline,
|
|
27
|
-
isEligibleAsciiTimelineFenceLang,
|
|
28
|
-
isExplicitTimelineLang,
|
|
29
|
-
} from '../doc/asciiTimeline/detect.js';
|
|
30
|
-
import { detectTree, isEligibleTreeFenceLang, isExplicitTreeLang } from '../doc/treeview/detect.js';
|
|
31
|
-
import { matchNumberHighlight } from './numberHighlight.js';
|
|
32
|
-
|
|
33
|
-
export interface BlockContentProfile {
|
|
34
|
-
hasImage: boolean;
|
|
35
|
-
imageCount: number;
|
|
36
|
-
hasVideo: boolean;
|
|
37
|
-
hasBlockquote: boolean;
|
|
38
|
-
hasList: boolean;
|
|
39
|
-
hasTable: boolean;
|
|
40
|
-
hasDate: boolean;
|
|
41
|
-
hasNumberHighlight: boolean;
|
|
42
|
-
wordCount: number;
|
|
43
|
-
/**
|
|
44
|
-
* True when the body is dominated by exactly one code fence whose content
|
|
45
|
-
* is an ASCII box-and-line diagram (see `doc/asciiDiagram/detect.ts`).
|
|
46
|
-
* Optional so externally-constructed profiles keep compiling.
|
|
47
|
-
*/
|
|
48
|
-
hasAsciiDiagram?: boolean;
|
|
49
|
-
/** True when a dominant code fence is an authored marker+axis timeline. */
|
|
50
|
-
hasTimeline?: boolean;
|
|
51
|
-
/**
|
|
52
|
-
* True when the body is dominated by exactly one code fence whose content
|
|
53
|
-
* is an ASCII file-tree / outline (see `doc/treeview/detect.ts`). Mutually
|
|
54
|
-
* exclusive with `hasAsciiDiagram`.
|
|
55
|
-
*/
|
|
56
|
-
hasTree?: boolean;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface RecommendationResult {
|
|
60
|
-
recommended: string[];
|
|
61
|
-
rest: string[];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const EMPTY_PROFILE: BlockContentProfile = Object.freeze({
|
|
65
|
-
hasImage: false,
|
|
66
|
-
imageCount: 0,
|
|
67
|
-
hasVideo: false,
|
|
68
|
-
hasBlockquote: false,
|
|
69
|
-
hasList: false,
|
|
70
|
-
hasTable: false,
|
|
71
|
-
hasDate: false,
|
|
72
|
-
hasNumberHighlight: false,
|
|
73
|
-
wordCount: 0,
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const DATE_PATTERNS: RegExp[] = [
|
|
77
|
-
/\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2},?\s+)?\d{4}\b/i,
|
|
78
|
-
/\b\d{1,2}\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}\b/i,
|
|
79
|
-
/\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)\.?\s+\d{1,2},?\s+\d{4}\b/i,
|
|
80
|
-
/\b\d{4}-\d{2}-\d{2}\b/,
|
|
81
|
-
/\b\d{1,2}\/\d{1,2}\/\d{2,4}\b/,
|
|
82
|
-
/\bQ[1-4]\s+\d{4}\b/,
|
|
83
|
-
/\b\d{4}s\b/,
|
|
84
|
-
/\b\d{1,2}(st|nd|rd|th)\s+century\b/i,
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
const VIDEO_HOST_RE = /(youtube\.com|youtu\.be|vimeo\.com|wistia\.|loom\.com)/i;
|
|
88
|
-
|
|
89
|
-
function htmlElementsByTag(root: MarkdownNode, tagNames: Set<string>): HtmlElement[] {
|
|
90
|
-
const blocks = findNodesByType<MarkdownHtmlBlock>(root, 'htmlBlock');
|
|
91
|
-
// Inline HTML (htmlInline) also carries htmlChildren; include both.
|
|
92
|
-
const inline = findNodesByType<MarkdownNode>(root, 'htmlInline') as Array<
|
|
93
|
-
MarkdownNode & { htmlChildren?: HtmlNode[] }
|
|
94
|
-
>;
|
|
95
|
-
const out: HtmlElement[] = [];
|
|
96
|
-
const visit = (n: HtmlNode): void => {
|
|
97
|
-
if (n.type === 'htmlElement') {
|
|
98
|
-
if (tagNames.has(n.tagName.toLowerCase())) out.push(n);
|
|
99
|
-
for (const c of n.children) visit(c);
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
for (const b of blocks) for (const c of b.htmlChildren) visit(c);
|
|
103
|
-
for (const i of inline) {
|
|
104
|
-
if (Array.isArray(i.htmlChildren)) for (const c of i.htmlChildren) visit(c);
|
|
105
|
-
}
|
|
106
|
-
return out;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Walk a slice of block nodes and summarize what kinds of content it
|
|
111
|
-
* contains. Cheap to run — no markdown parsing, just AST traversal.
|
|
112
|
-
*/
|
|
113
|
-
export function profileBlockContents(nodes: MarkdownBlockNode[]): BlockContentProfile {
|
|
114
|
-
if (!nodes || nodes.length === 0) return { ...EMPTY_PROFILE };
|
|
115
|
-
|
|
116
|
-
let imageCount = 0;
|
|
117
|
-
let hasBlockquote = false;
|
|
118
|
-
let hasList = false;
|
|
119
|
-
let hasTable = false;
|
|
120
|
-
|
|
121
|
-
const plainParts: string[] = [];
|
|
122
|
-
|
|
123
|
-
for (const node of nodes) {
|
|
124
|
-
imageCount += findNodesByType(node, 'image').length;
|
|
125
|
-
imageCount += findNodesByType(node, 'imageReference').length;
|
|
126
|
-
if (findNodesByType(node, 'blockquote').length > 0) hasBlockquote = true;
|
|
127
|
-
if (findNodesByType(node, 'list').length > 0) hasList = true;
|
|
128
|
-
if (findNodesByType(node, 'table').length > 0) hasTable = true;
|
|
129
|
-
plainParts.push(extractPlainText(node));
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// HTML embeds: <img>, <video>, <iframe src=…video host>
|
|
133
|
-
const root: MarkdownNode = { type: 'document', children: nodes };
|
|
134
|
-
const imgTags = htmlElementsByTag(root, new Set(['img']));
|
|
135
|
-
imageCount += imgTags.length;
|
|
136
|
-
|
|
137
|
-
const videoTags = htmlElementsByTag(root, new Set(['video', 'iframe', 'source']));
|
|
138
|
-
let hasVideo = false;
|
|
139
|
-
for (const el of videoTags) {
|
|
140
|
-
if (el.tagName.toLowerCase() === 'video') {
|
|
141
|
-
hasVideo = true;
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
const src = el.attributes.src || el.attributes.href || '';
|
|
145
|
-
if (VIDEO_HOST_RE.test(src)) {
|
|
146
|
-
hasVideo = true;
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Link-only video embeds (markdown link to a known video host).
|
|
152
|
-
if (!hasVideo) {
|
|
153
|
-
const links = findNodesByType<MarkdownNode & { url?: string }>(root, 'link');
|
|
154
|
-
for (const link of links) {
|
|
155
|
-
if (link.url && VIDEO_HOST_RE.test(link.url)) {
|
|
156
|
-
hasVideo = true;
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const plainText = plainParts.join(' ').trim();
|
|
163
|
-
const wordCount = plainText ? plainText.split(/\s+/).length : 0;
|
|
164
|
-
|
|
165
|
-
let hasDate = false;
|
|
166
|
-
for (const re of DATE_PATTERNS) {
|
|
167
|
-
if (re.test(plainText)) {
|
|
168
|
-
hasDate = true;
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Number highlight: a paragraph that's mostly a single prominent figure.
|
|
174
|
-
let hasNumberHighlight = false;
|
|
175
|
-
walkMarkdownTree(root, (n) => {
|
|
176
|
-
if (hasNumberHighlight) return true;
|
|
177
|
-
if (n.type !== 'paragraph') return;
|
|
178
|
-
const text = extractPlainText(n).trim();
|
|
179
|
-
if (!text) return true;
|
|
180
|
-
const m = matchNumberHighlight(text);
|
|
181
|
-
if (!m) return true;
|
|
182
|
-
// Paragraph qualifies when its word count is small AND a prominent
|
|
183
|
-
// number occupies a meaningful chunk of it. Keeps "the company grew
|
|
184
|
-
// 50% last year" from triggering, but accepts "$2.3M raised".
|
|
185
|
-
const words = text.split(/\s+/).length;
|
|
186
|
-
if (words <= 8) hasNumberHighlight = true;
|
|
187
|
-
return true;
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
// ASCII diagram: exactly one code fence with an eligible (inert) language
|
|
191
|
-
// whose content detects as box-and-line art, in a body it dominates — no
|
|
192
|
-
// competing table/image/video signal and at most a little surrounding
|
|
193
|
-
// prose. The diagram template replaces the whole slide, so hiding a real
|
|
194
|
-
// table or a second fence is the costly failure this guards against.
|
|
195
|
-
let hasAsciiDiagram = false;
|
|
196
|
-
const codeNodes: MarkdownCodeBlock[] = [];
|
|
197
|
-
for (const node of nodes) codeNodes.push(...findNodesByType<MarkdownCodeBlock>(node, 'code'));
|
|
198
|
-
if (
|
|
199
|
-
codeNodes.length === 1 &&
|
|
200
|
-
isEligibleAsciiFenceLang(codeNodes[0].lang) &&
|
|
201
|
-
!hasTable &&
|
|
202
|
-
imageCount === 0 &&
|
|
203
|
-
!hasVideo
|
|
204
|
-
) {
|
|
205
|
-
const nonCodeChars = Math.max(0, plainText.length - codeNodes[0].value.length);
|
|
206
|
-
const explicit = isExplicitDiagramLang(codeNodes[0].lang);
|
|
207
|
-
if (nonCodeChars <= 400 && detectAsciiDiagram(codeNodes[0].value, { explicit }).isDiagram) {
|
|
208
|
-
hasAsciiDiagram = true;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// ASCII timeline: after the more specific closed-box diagram gate and
|
|
213
|
-
// before tree connector detection.
|
|
214
|
-
let hasTimeline = false;
|
|
215
|
-
if (
|
|
216
|
-
!hasAsciiDiagram &&
|
|
217
|
-
codeNodes.length === 1 &&
|
|
218
|
-
isEligibleAsciiTimelineFenceLang(codeNodes[0].lang) &&
|
|
219
|
-
!hasTable &&
|
|
220
|
-
imageCount === 0 &&
|
|
221
|
-
!hasVideo
|
|
222
|
-
) {
|
|
223
|
-
const nonCodeChars = Math.max(0, plainText.length - codeNodes[0].value.length);
|
|
224
|
-
const explicit = isExplicitTimelineLang(codeNodes[0].lang);
|
|
225
|
-
if (nonCodeChars <= 400 && detectAsciiTimeline(codeNodes[0].value, { explicit }).isTimeline) {
|
|
226
|
-
hasTimeline = true;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Tree detection comes last: timeline callout elbows can otherwise look
|
|
231
|
-
// like connector branches to the deliberately lenient tree parser.
|
|
232
|
-
let hasTree = false;
|
|
233
|
-
if (
|
|
234
|
-
!hasAsciiDiagram &&
|
|
235
|
-
!hasTimeline &&
|
|
236
|
-
codeNodes.length === 1 &&
|
|
237
|
-
isEligibleTreeFenceLang(codeNodes[0].lang) &&
|
|
238
|
-
!hasTable &&
|
|
239
|
-
imageCount === 0 &&
|
|
240
|
-
!hasVideo
|
|
241
|
-
) {
|
|
242
|
-
const nonCodeChars = Math.max(0, plainText.length - codeNodes[0].value.length);
|
|
243
|
-
const explicit = isExplicitTreeLang(codeNodes[0].lang);
|
|
244
|
-
if (nonCodeChars <= 400 && detectTree(codeNodes[0].value, { explicit }).isTree) {
|
|
245
|
-
hasTree = true;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return {
|
|
250
|
-
hasImage: imageCount > 0,
|
|
251
|
-
imageCount,
|
|
252
|
-
hasVideo,
|
|
253
|
-
hasBlockquote,
|
|
254
|
-
hasList,
|
|
255
|
-
hasTable,
|
|
256
|
-
hasDate,
|
|
257
|
-
hasNumberHighlight,
|
|
258
|
-
wordCount,
|
|
259
|
-
hasAsciiDiagram,
|
|
260
|
-
hasTimeline,
|
|
261
|
-
hasTree,
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// ── Recommendation rules ───────────────────────────────────────────
|
|
266
|
-
|
|
267
|
-
const UNIVERSAL_DEFAULTS = ['title', 'sectionHeader', 'factCard', 'twoColumn'];
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Given a content profile, return the canonical template-name list that
|
|
271
|
-
* should appear in the "Recommended" bucket. Caller is responsible for
|
|
272
|
-
* preserving deduplication / ordering when intersecting with the full
|
|
273
|
-
* template list (see {@link recommendTemplatesForBlock}).
|
|
274
|
-
*/
|
|
275
|
-
function recommendedNamesForProfile(profile: BlockContentProfile): string[] {
|
|
276
|
-
const names = new Set<string>();
|
|
277
|
-
let anyContentSignal = false;
|
|
278
|
-
|
|
279
|
-
if (profile.hasAsciiDiagram) {
|
|
280
|
-
anyContentSignal = true;
|
|
281
|
-
names.add('diagram');
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
if (profile.hasTimeline) {
|
|
285
|
-
anyContentSignal = true;
|
|
286
|
-
names.add('timeline');
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
if (profile.hasTree) {
|
|
290
|
-
anyContentSignal = true;
|
|
291
|
-
names.add('tree');
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
if (profile.hasImage) {
|
|
295
|
-
anyContentSignal = true;
|
|
296
|
-
names.add('imageWithCaption');
|
|
297
|
-
names.add('leftFeature');
|
|
298
|
-
names.add('rightFeature');
|
|
299
|
-
if (profile.imageCount >= 2) names.add('photoGrid');
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
if (profile.hasVideo) {
|
|
303
|
-
anyContentSignal = true;
|
|
304
|
-
names.add('videoWithCaption');
|
|
305
|
-
if (profile.hasBlockquote) names.add('videoPullQuote');
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
if (profile.hasBlockquote) {
|
|
309
|
-
anyContentSignal = true;
|
|
310
|
-
names.add('quote');
|
|
311
|
-
names.add('pullQuote');
|
|
312
|
-
names.add('fullBleedQuote');
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (profile.hasList) {
|
|
316
|
-
anyContentSignal = true;
|
|
317
|
-
names.add('list');
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
if (profile.hasTable) {
|
|
321
|
-
anyContentSignal = true;
|
|
322
|
-
names.add('dataTable');
|
|
323
|
-
names.add('comparisonBar');
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (profile.hasDate) {
|
|
327
|
-
anyContentSignal = true;
|
|
328
|
-
names.add('dateEvent');
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
if (profile.hasNumberHighlight) {
|
|
332
|
-
anyContentSignal = true;
|
|
333
|
-
names.add('statHighlight');
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
if (anyContentSignal) {
|
|
337
|
-
// Universal pair only — keep recommended focused.
|
|
338
|
-
names.add('title');
|
|
339
|
-
names.add('sectionHeader');
|
|
340
|
-
} else {
|
|
341
|
-
for (const n of UNIVERSAL_DEFAULTS) names.add(n);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
return Array.from(names);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Deterministic single-template choice for an unannotated heading block,
|
|
349
|
-
* from strong content signals only. Returns `undefined` when no signal is
|
|
350
|
-
* decisive — the caller keeps its structural default (`sectionHeader`).
|
|
351
|
-
*
|
|
352
|
-
* Precedence favors the most specific/structured content: a table beats
|
|
353
|
-
* an image beats a blockquote beats a stat-looking line. `blockIndex`
|
|
354
|
-
* alternates left/right feature composition for single-image blocks so a
|
|
355
|
-
* run of image sections doesn't stack the same layout.
|
|
356
|
-
*
|
|
357
|
-
* Used by `markdownToDoc`'s auto template picking (see its `autoTemplates`
|
|
358
|
-
* option); the multi-candidate `recommendTemplatesForBlock` below serves
|
|
359
|
-
* the editor's template-picker UI instead.
|
|
360
|
-
*/
|
|
361
|
-
export function pickAutoTemplate(profile: BlockContentProfile, blockIndex = 0): string | undefined {
|
|
362
|
-
if (profile.hasAsciiDiagram) return 'diagram';
|
|
363
|
-
if (profile.hasTimeline) return 'timeline';
|
|
364
|
-
if (profile.hasTree) return 'tree';
|
|
365
|
-
if (profile.hasTable) return 'dataTable';
|
|
366
|
-
if (profile.imageCount >= 2) return 'photoGrid';
|
|
367
|
-
if (profile.hasImage) return blockIndex % 2 === 0 ? 'leftFeature' : 'rightFeature';
|
|
368
|
-
if (profile.hasBlockquote) return 'quote';
|
|
369
|
-
if (profile.hasNumberHighlight) return 'statHighlight';
|
|
370
|
-
if (profile.hasList) return 'list';
|
|
371
|
-
return undefined;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Split a flat list of template names into a "Recommended" bucket
|
|
376
|
-
* (matches the active block's content profile) and a "rest" bucket
|
|
377
|
-
* (everything else). Both buckets preserve the input ordering of
|
|
378
|
-
* `allNames`, so the visual layout stays predictable as templates are
|
|
379
|
-
* added.
|
|
380
|
-
*/
|
|
381
|
-
export function recommendTemplatesForBlock(
|
|
382
|
-
profile: BlockContentProfile,
|
|
383
|
-
allNames: readonly string[],
|
|
384
|
-
): RecommendationResult {
|
|
385
|
-
const desired = new Set(recommendedNamesForProfile(profile));
|
|
386
|
-
const recommended: string[] = [];
|
|
387
|
-
const rest: string[] = [];
|
|
388
|
-
for (const name of allNames) {
|
|
389
|
-
if (desired.has(name)) recommended.push(name);
|
|
390
|
-
else rest.push(name);
|
|
391
|
-
}
|
|
392
|
-
return { recommended, rest };
|
|
393
|
-
}
|