@bendyline/squisq 1.3.0 → 1.4.1
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/dist/{Doc-Ch4tc3vv.d.ts → Doc-BeSeH2iX.d.ts} +118 -41
- package/dist/ImageEditDoc-BTIvw0oq.d.ts +84 -0
- package/dist/{chunk-CYQHG27J.js → chunk-2TMAWB4Y.js} +74 -1
- package/dist/chunk-2TMAWB4Y.js.map +1 -0
- package/dist/{chunk-OASJKWO5.js → chunk-3K5OG6KI.js} +92 -7
- package/dist/chunk-3K5OG6KI.js.map +1 -0
- package/dist/chunk-57CVQCFX.js +193 -0
- package/dist/chunk-57CVQCFX.js.map +1 -0
- package/dist/{chunk-QM5PKNPW.js → chunk-5WFRKURX.js} +1 -1
- package/dist/chunk-5WFRKURX.js.map +1 -0
- package/dist/chunk-B4EEON3N.js +1317 -0
- package/dist/chunk-B4EEON3N.js.map +1 -0
- package/dist/chunk-DBS6RIFL.js +81 -0
- package/dist/chunk-DBS6RIFL.js.map +1 -0
- package/dist/{chunk-MIBRIRGJ.js → chunk-FR2RBTKO.js} +3 -3
- package/dist/{chunk-MIBRIRGJ.js.map → chunk-FR2RBTKO.js.map} +1 -1
- package/dist/chunk-H3AXU4MJ.js +179 -0
- package/dist/chunk-H3AXU4MJ.js.map +1 -0
- package/dist/chunk-JELIRVDP.js +24 -0
- package/dist/chunk-JELIRVDP.js.map +1 -0
- package/dist/chunk-K32VJONL.js +193 -0
- package/dist/chunk-K32VJONL.js.map +1 -0
- package/dist/{chunk-6BAVXFYC.js → chunk-KSWJR66U.js} +218 -42
- package/dist/chunk-KSWJR66U.js.map +1 -0
- package/dist/{chunk-TSG2OSE6.js → chunk-MYIH7FWD.js} +3 -3
- package/dist/chunk-MYIH7FWD.js.map +1 -0
- package/dist/chunk-VLJJHDAC.js +218 -0
- package/dist/chunk-VLJJHDAC.js.map +1 -0
- package/dist/chunk-WMOI7FN3.js +182 -0
- package/dist/chunk-WMOI7FN3.js.map +1 -0
- package/dist/chunk-ZTX4PFFT.js +520 -0
- package/dist/chunk-ZTX4PFFT.js.map +1 -0
- package/dist/doc/index.d.ts +5 -10
- package/dist/doc/index.js +145 -7
- package/dist/doc/index.js.map +1 -1
- package/dist/generate/index.d.ts +99 -7
- package/dist/generate/index.js +16 -3
- package/dist/generate/index.js.map +1 -1
- package/dist/icons/index.d.ts +87 -0
- package/dist/icons/index.js +17 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/imageEdit/index.d.ts +216 -0
- package/dist/imageEdit/index.js +54 -0
- package/dist/imageEdit/index.js.map +1 -0
- package/dist/index.d.ts +21 -9
- package/dist/index.js +461 -8
- package/dist/index.js.map +1 -1
- package/dist/jsonForm/index.d.ts +191 -0
- package/dist/jsonForm/index.js +27 -0
- package/dist/jsonForm/index.js.map +1 -0
- package/dist/markdown/index.d.ts +265 -19
- package/dist/markdown/index.js +39 -33
- package/dist/markdown/index.js.map +1 -1
- package/dist/random/index.d.ts +51 -2
- package/dist/random/index.js +9 -1
- package/dist/random/index.js.map +1 -1
- package/dist/recommend/index.d.ts +42 -0
- package/dist/recommend/index.js +10 -0
- package/dist/recommend/index.js.map +1 -0
- package/dist/schemas/index.d.ts +188 -10
- package/dist/schemas/index.js +120 -7
- package/dist/schemas/index.js.map +1 -1
- package/dist/spatial/index.d.ts +111 -3
- package/dist/spatial/index.js +24 -2
- package/dist/spatial/index.js.map +1 -1
- package/dist/storage/index.d.ts +159 -9
- package/dist/storage/index.js +20 -5
- package/dist/storage/index.js.map +1 -1
- package/dist/story/index.d.ts +53 -13
- package/dist/story/index.js +12 -4
- package/dist/themeLibrary-BHjJ0Qx6.d.ts +40 -0
- package/dist/timing/index.d.ts +109 -4
- package/dist/timing/index.js +23 -2
- package/dist/timing/index.js.map +1 -1
- package/dist/transform/index.d.ts +175 -6
- package/dist/transform/index.js +490 -3
- package/dist/transform/index.js.map +1 -1
- package/dist/{types-CkNttVSF.d.ts → types-BdZkdJ3z.d.ts} +17 -2
- package/dist/types-D98li1gV.d.ts +93 -0
- package/dist/versions/index.d.ts +128 -0
- package/dist/versions/index.js +35 -0
- package/dist/versions/index.js.map +1 -0
- package/package.json +28 -1
- package/src/__tests__/colorUtils.test.ts +112 -0
- package/src/__tests__/getLayers.test.ts +32 -7
- package/src/__tests__/iconResolve.test.ts +122 -0
- package/src/__tests__/imageEditState.test.ts +74 -0
- package/src/__tests__/imageEditVersions.test.ts +169 -0
- package/src/__tests__/inferDocumentTitle.test.ts +50 -0
- package/src/__tests__/jsonForm.chooseControl.test.ts +86 -0
- package/src/__tests__/jsonForm.evaluateWhen.test.ts +59 -0
- package/src/__tests__/jsonForm.inferSchema.test.ts +25 -0
- package/src/__tests__/jsonForm.pointer.test.ts +103 -0
- package/src/__tests__/markdownIcons.test.ts +104 -0
- package/src/__tests__/markdownToDoc.test.ts +19 -4
- package/src/__tests__/recommendTemplates.test.ts +183 -0
- package/src/__tests__/scopedContentContainer.test.ts +89 -0
- package/src/__tests__/slideshowGenerator.test.ts +1 -1
- package/src/__tests__/templateAnnotationParse.test.ts +42 -0
- package/src/__tests__/templates.test.ts +93 -9
- package/src/__tests__/themeCompile.test.ts +156 -0
- package/src/__tests__/themeValidator.test.ts +125 -0
- package/src/__tests__/versions.test.ts +415 -0
- package/src/doc/audioMapping.ts +55 -11
- package/src/doc/getLayers.ts +32 -21
- package/src/doc/markdownToDoc.ts +45 -7
- package/src/doc/templates/featureBlock.ts +202 -0
- package/src/doc/templates/fullBleedQuote.ts +13 -0
- package/src/doc/templates/index.ts +50 -16
- package/src/doc/templates/listBlock.ts +24 -5
- package/src/doc/templates/statHighlight.ts +13 -0
- package/src/doc/templates/titleBlock.ts +9 -0
- package/src/doc/utils/themeUtils.ts +8 -7
- package/src/generate/slideshowGenerator.ts +1 -1
- package/src/generate/templateMapper.ts +2 -2
- package/src/icons/iconData.ts +31 -0
- package/src/icons/index.ts +18 -0
- package/src/icons/resolve.ts +139 -0
- package/src/imageEdit/ImageEditVersionManager.ts +73 -0
- package/src/imageEdit/export.ts +326 -0
- package/src/imageEdit/index.ts +71 -0
- package/src/imageEdit/persistence.ts +62 -0
- package/src/imageEdit/state.ts +112 -0
- package/src/imageEdit/versionPaths.ts +57 -0
- package/src/imageEdit/versions.ts +231 -0
- package/src/index.ts +4 -0
- package/src/jsonForm/chooseControl.ts +88 -0
- package/src/jsonForm/evaluateWhen.ts +59 -0
- package/src/jsonForm/index.ts +22 -0
- package/src/jsonForm/inferSchema.ts +25 -0
- package/src/jsonForm/pointer.ts +109 -0
- package/src/jsonForm/types.ts +167 -0
- package/src/markdown/convert.ts +145 -5
- package/src/markdown/index.ts +3 -0
- package/src/markdown/types.ts +19 -2
- package/src/markdown/utils.ts +159 -0
- package/src/recommend/index.ts +16 -0
- package/src/recommend/templates.ts +273 -0
- package/src/schemas/BlockTemplates.ts +50 -7
- package/src/schemas/ImageEditDoc.ts +95 -0
- package/src/schemas/Theme.ts +98 -31
- package/src/schemas/colorUtils.ts +186 -0
- package/src/schemas/fontStacks.ts +257 -0
- package/src/schemas/index.ts +12 -0
- package/src/schemas/themeCompile.ts +203 -0
- package/src/schemas/themeLibrary.ts +18 -597
- package/src/schemas/themeValidator.ts +388 -0
- package/src/schemas/themes/bold.json +48 -0
- package/src/schemas/themes/cinematic.json +54 -0
- package/src/schemas/themes/documentary.json +49 -0
- package/src/schemas/themes/gezellig.json +44 -0
- package/src/schemas/themes/index.ts +53 -0
- package/src/schemas/themes/magazine.json +44 -0
- package/src/schemas/themes/minimalist.json +45 -0
- package/src/schemas/themes/morning-light.json +42 -0
- package/src/schemas/themes/standard-dark.json +50 -0
- package/src/schemas/themes/standard.json +42 -0
- package/src/schemas/themes/tech-dark.json +48 -0
- package/src/schemas/themes/warm-earth.json +50 -0
- package/src/storage/ScopedContentContainer.ts +113 -0
- package/src/storage/index.ts +1 -0
- package/src/versions/DocumentVersionManager.ts +70 -0
- package/src/versions/index.ts +54 -0
- package/src/versions/operations.ts +230 -0
- package/src/versions/paths.ts +66 -0
- package/src/versions/timestamp.ts +48 -0
- package/src/versions/types.ts +91 -0
- package/dist/__tests__/animationUtils.test.d.ts +0 -2
- package/dist/__tests__/animationUtils.test.d.ts.map +0 -1
- package/dist/__tests__/animationUtils.test.js +0 -60
- package/dist/__tests__/animationUtils.test.js.map +0 -1
- package/dist/__tests__/contentContainer.test.d.ts +0 -2
- package/dist/__tests__/contentContainer.test.d.ts.map +0 -1
- package/dist/__tests__/contentContainer.test.js +0 -234
- package/dist/__tests__/contentContainer.test.js.map +0 -1
- package/dist/__tests__/contentExtractor.test.d.ts +0 -2
- package/dist/__tests__/contentExtractor.test.d.ts.map +0 -1
- package/dist/__tests__/contentExtractor.test.js +0 -151
- package/dist/__tests__/contentExtractor.test.js.map +0 -1
- package/dist/__tests__/coverBlock.test.d.ts +0 -2
- package/dist/__tests__/coverBlock.test.d.ts.map +0 -1
- package/dist/__tests__/coverBlock.test.js +0 -197
- package/dist/__tests__/coverBlock.test.js.map +0 -1
- package/dist/__tests__/dataTable.test.d.ts +0 -2
- package/dist/__tests__/dataTable.test.d.ts.map +0 -1
- package/dist/__tests__/dataTable.test.js +0 -110
- package/dist/__tests__/dataTable.test.js.map +0 -1
- package/dist/__tests__/geohash.test.d.ts +0 -2
- package/dist/__tests__/geohash.test.d.ts.map +0 -1
- package/dist/__tests__/geohash.test.js +0 -87
- package/dist/__tests__/geohash.test.js.map +0 -1
- package/dist/__tests__/getLayers.test.d.ts +0 -2
- package/dist/__tests__/getLayers.test.d.ts.map +0 -1
- package/dist/__tests__/getLayers.test.js +0 -167
- package/dist/__tests__/getLayers.test.js.map +0 -1
- package/dist/__tests__/haversine.test.d.ts +0 -2
- package/dist/__tests__/haversine.test.d.ts.map +0 -1
- package/dist/__tests__/haversine.test.js +0 -56
- package/dist/__tests__/haversine.test.js.map +0 -1
- package/dist/__tests__/localForageAdapter.test.d.ts +0 -8
- package/dist/__tests__/localForageAdapter.test.d.ts.map +0 -1
- package/dist/__tests__/localForageAdapter.test.js +0 -130
- package/dist/__tests__/localForageAdapter.test.js.map +0 -1
- package/dist/__tests__/markdown.test.d.ts +0 -2
- package/dist/__tests__/markdown.test.d.ts.map +0 -1
- package/dist/__tests__/markdown.test.js +0 -715
- package/dist/__tests__/markdown.test.js.map +0 -1
- package/dist/__tests__/markdownToDoc.test.d.ts +0 -2
- package/dist/__tests__/markdownToDoc.test.d.ts.map +0 -1
- package/dist/__tests__/markdownToDoc.test.js +0 -447
- package/dist/__tests__/markdownToDoc.test.js.map +0 -1
- package/dist/__tests__/seededRandom.test.d.ts +0 -2
- package/dist/__tests__/seededRandom.test.d.ts.map +0 -1
- package/dist/__tests__/seededRandom.test.js +0 -125
- package/dist/__tests__/seededRandom.test.js.map +0 -1
- package/dist/__tests__/slideshowGenerator.test.d.ts +0 -2
- package/dist/__tests__/slideshowGenerator.test.d.ts.map +0 -1
- package/dist/__tests__/slideshowGenerator.test.js +0 -114
- package/dist/__tests__/slideshowGenerator.test.js.map +0 -1
- package/dist/__tests__/storage.test.d.ts +0 -2
- package/dist/__tests__/storage.test.d.ts.map +0 -1
- package/dist/__tests__/storage.test.js +0 -51
- package/dist/__tests__/storage.test.js.map +0 -1
- package/dist/__tests__/surface.test.d.ts +0 -2
- package/dist/__tests__/surface.test.d.ts.map +0 -1
- package/dist/__tests__/surface.test.js +0 -57
- package/dist/__tests__/surface.test.js.map +0 -1
- package/dist/__tests__/templates.test.d.ts +0 -2
- package/dist/__tests__/templates.test.d.ts.map +0 -1
- package/dist/__tests__/templates.test.js +0 -217
- package/dist/__tests__/templates.test.js.map +0 -1
- package/dist/__tests__/timing.test.d.ts +0 -2
- package/dist/__tests__/timing.test.d.ts.map +0 -1
- package/dist/__tests__/timing.test.js +0 -131
- package/dist/__tests__/timing.test.js.map +0 -1
- package/dist/chunk-6BAVXFYC.js.map +0 -1
- package/dist/chunk-7GF6RDED.js +0 -82
- package/dist/chunk-7GF6RDED.js.map +0 -1
- package/dist/chunk-CYQHG27J.js.map +0 -1
- package/dist/chunk-F22AE6BY.js +0 -121
- package/dist/chunk-F22AE6BY.js.map +0 -1
- package/dist/chunk-FIQR4AJG.js +0 -517
- package/dist/chunk-FIQR4AJG.js.map +0 -1
- package/dist/chunk-OASJKWO5.js.map +0 -1
- package/dist/chunk-QM5PKNPW.js.map +0 -1
- package/dist/chunk-TSG2OSE6.js.map +0 -1
- package/dist/doc/audioMapping.d.ts +0 -36
- package/dist/doc/audioMapping.d.ts.map +0 -1
- package/dist/doc/audioMapping.js +0 -315
- package/dist/doc/audioMapping.js.map +0 -1
- package/dist/doc/docToMarkdown.d.ts +0 -41
- package/dist/doc/docToMarkdown.d.ts.map +0 -1
- package/dist/doc/docToMarkdown.js +0 -88
- package/dist/doc/docToMarkdown.js.map +0 -1
- package/dist/doc/getLayers.d.ts +0 -65
- package/dist/doc/getLayers.d.ts.map +0 -1
- package/dist/doc/getLayers.js +0 -103
- package/dist/doc/getLayers.js.map +0 -1
- package/dist/doc/index.d.ts.map +0 -1
- package/dist/doc/markdownToDoc.d.ts +0 -75
- package/dist/doc/markdownToDoc.d.ts.map +0 -1
- package/dist/doc/markdownToDoc.js +0 -398
- package/dist/doc/markdownToDoc.js.map +0 -1
- package/dist/doc/templates/accentImage.d.ts +0 -59
- package/dist/doc/templates/accentImage.d.ts.map +0 -1
- package/dist/doc/templates/accentImage.js +0 -275
- package/dist/doc/templates/accentImage.js.map +0 -1
- package/dist/doc/templates/captionUtils.d.ts +0 -20
- package/dist/doc/templates/captionUtils.d.ts.map +0 -1
- package/dist/doc/templates/captionUtils.js +0 -29
- package/dist/doc/templates/captionUtils.js.map +0 -1
- package/dist/doc/templates/comparisonBar.d.ts +0 -13
- package/dist/doc/templates/comparisonBar.d.ts.map +0 -1
- package/dist/doc/templates/comparisonBar.js +0 -145
- package/dist/doc/templates/comparisonBar.js.map +0 -1
- package/dist/doc/templates/coverBlock.d.ts +0 -51
- package/dist/doc/templates/coverBlock.d.ts.map +0 -1
- package/dist/doc/templates/coverBlock.js +0 -153
- package/dist/doc/templates/coverBlock.js.map +0 -1
- package/dist/doc/templates/dataTable.d.ts +0 -14
- package/dist/doc/templates/dataTable.d.ts.map +0 -1
- package/dist/doc/templates/dataTable.js +0 -73
- package/dist/doc/templates/dataTable.js.map +0 -1
- package/dist/doc/templates/dateEvent.d.ts +0 -15
- package/dist/doc/templates/dateEvent.d.ts.map +0 -1
- package/dist/doc/templates/dateEvent.js +0 -114
- package/dist/doc/templates/dateEvent.js.map +0 -1
- package/dist/doc/templates/definitionCard.d.ts +0 -13
- package/dist/doc/templates/definitionCard.d.ts.map +0 -1
- package/dist/doc/templates/definitionCard.js +0 -117
- package/dist/doc/templates/definitionCard.js.map +0 -1
- package/dist/doc/templates/factCard.d.ts +0 -15
- package/dist/doc/templates/factCard.d.ts.map +0 -1
- package/dist/doc/templates/factCard.js +0 -104
- package/dist/doc/templates/factCard.js.map +0 -1
- package/dist/doc/templates/fullBleedQuote.d.ts +0 -13
- package/dist/doc/templates/fullBleedQuote.d.ts.map +0 -1
- package/dist/doc/templates/fullBleedQuote.js +0 -55
- package/dist/doc/templates/fullBleedQuote.js.map +0 -1
- package/dist/doc/templates/imageWithCaption.d.ts +0 -13
- package/dist/doc/templates/imageWithCaption.d.ts.map +0 -1
- package/dist/doc/templates/imageWithCaption.js +0 -146
- package/dist/doc/templates/imageWithCaption.js.map +0 -1
- package/dist/doc/templates/index.d.ts +0 -105
- package/dist/doc/templates/index.d.ts.map +0 -1
- package/dist/doc/templates/index.js +0 -445
- package/dist/doc/templates/index.js.map +0 -1
- package/dist/doc/templates/listBlock.d.ts +0 -13
- package/dist/doc/templates/listBlock.d.ts.map +0 -1
- package/dist/doc/templates/listBlock.js +0 -92
- package/dist/doc/templates/listBlock.js.map +0 -1
- package/dist/doc/templates/mapBlock.d.ts +0 -17
- package/dist/doc/templates/mapBlock.d.ts.map +0 -1
- package/dist/doc/templates/mapBlock.js +0 -115
- package/dist/doc/templates/mapBlock.js.map +0 -1
- package/dist/doc/templates/persistentLayers.d.ts +0 -39
- package/dist/doc/templates/persistentLayers.d.ts.map +0 -1
- package/dist/doc/templates/persistentLayers.js +0 -447
- package/dist/doc/templates/persistentLayers.js.map +0 -1
- package/dist/doc/templates/photoGrid.d.ts +0 -20
- package/dist/doc/templates/photoGrid.d.ts.map +0 -1
- package/dist/doc/templates/photoGrid.js +0 -175
- package/dist/doc/templates/photoGrid.js.map +0 -1
- package/dist/doc/templates/pullQuote.d.ts +0 -13
- package/dist/doc/templates/pullQuote.d.ts.map +0 -1
- package/dist/doc/templates/pullQuote.js +0 -113
- package/dist/doc/templates/pullQuote.js.map +0 -1
- package/dist/doc/templates/quoteBlock.d.ts +0 -15
- package/dist/doc/templates/quoteBlock.d.ts.map +0 -1
- package/dist/doc/templates/quoteBlock.js +0 -101
- package/dist/doc/templates/quoteBlock.js.map +0 -1
- package/dist/doc/templates/sectionHeader.d.ts +0 -14
- package/dist/doc/templates/sectionHeader.d.ts.map +0 -1
- package/dist/doc/templates/sectionHeader.js +0 -97
- package/dist/doc/templates/sectionHeader.js.map +0 -1
- package/dist/doc/templates/statHighlight.d.ts +0 -15
- package/dist/doc/templates/statHighlight.d.ts.map +0 -1
- package/dist/doc/templates/statHighlight.js +0 -102
- package/dist/doc/templates/statHighlight.js.map +0 -1
- package/dist/doc/templates/titleBlock.d.ts +0 -13
- package/dist/doc/templates/titleBlock.d.ts.map +0 -1
- package/dist/doc/templates/titleBlock.js +0 -95
- package/dist/doc/templates/titleBlock.js.map +0 -1
- package/dist/doc/templates/twoColumn.d.ts +0 -15
- package/dist/doc/templates/twoColumn.d.ts.map +0 -1
- package/dist/doc/templates/twoColumn.js +0 -225
- package/dist/doc/templates/twoColumn.js.map +0 -1
- package/dist/doc/templates/videoPullQuote.d.ts +0 -20
- package/dist/doc/templates/videoPullQuote.d.ts.map +0 -1
- package/dist/doc/templates/videoPullQuote.js +0 -122
- package/dist/doc/templates/videoPullQuote.js.map +0 -1
- package/dist/doc/templates/videoWithCaption.d.ts +0 -20
- package/dist/doc/templates/videoWithCaption.d.ts.map +0 -1
- package/dist/doc/templates/videoWithCaption.js +0 -107
- package/dist/doc/templates/videoWithCaption.js.map +0 -1
- package/dist/doc/utils/animationUtils.d.ts +0 -34
- package/dist/doc/utils/animationUtils.d.ts.map +0 -1
- package/dist/doc/utils/animationUtils.js +0 -110
- package/dist/doc/utils/animationUtils.js.map +0 -1
- package/dist/doc/utils/themeUtils.d.ts +0 -64
- package/dist/doc/utils/themeUtils.d.ts.map +0 -1
- package/dist/doc/utils/themeUtils.js +0 -135
- package/dist/doc/utils/themeUtils.js.map +0 -1
- package/dist/generate/contentExtractor.d.ts +0 -112
- package/dist/generate/contentExtractor.d.ts.map +0 -1
- package/dist/generate/contentExtractor.js +0 -638
- package/dist/generate/contentExtractor.js.map +0 -1
- package/dist/generate/index.d.ts.map +0 -1
- package/dist/generate/slideshowGenerator.d.ts +0 -72
- package/dist/generate/slideshowGenerator.d.ts.map +0 -1
- package/dist/generate/slideshowGenerator.js +0 -159
- package/dist/generate/slideshowGenerator.js.map +0 -1
- package/dist/generate/templateMapper.d.ts +0 -23
- package/dist/generate/templateMapper.d.ts.map +0 -1
- package/dist/generate/templateMapper.js +0 -114
- package/dist/generate/templateMapper.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/markdown/convert.d.ts +0 -71
- package/dist/markdown/convert.d.ts.map +0 -1
- package/dist/markdown/convert.js +0 -845
- package/dist/markdown/convert.js.map +0 -1
- package/dist/markdown/htmlParse.d.ts +0 -26
- package/dist/markdown/htmlParse.d.ts.map +0 -1
- package/dist/markdown/htmlParse.js +0 -195
- package/dist/markdown/htmlParse.js.map +0 -1
- package/dist/markdown/index.d.ts.map +0 -1
- package/dist/markdown/parse.d.ts +0 -27
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js +0 -90
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/stringify.d.ts +0 -32
- package/dist/markdown/stringify.d.ts.map +0 -1
- package/dist/markdown/stringify.js +0 -108
- package/dist/markdown/stringify.js.map +0 -1
- package/dist/markdown/types.d.ts +0 -516
- package/dist/markdown/types.d.ts.map +0 -1
- package/dist/markdown/types.js +0 -17
- package/dist/markdown/types.js.map +0 -1
- package/dist/markdown/utils.d.ts +0 -78
- package/dist/markdown/utils.d.ts.map +0 -1
- package/dist/markdown/utils.js +0 -153
- package/dist/markdown/utils.js.map +0 -1
- package/dist/random/SeededRandom.d.ts +0 -50
- package/dist/random/SeededRandom.d.ts.map +0 -1
- package/dist/random/SeededRandom.js +0 -115
- package/dist/random/SeededRandom.js.map +0 -1
- package/dist/random/index.d.ts.map +0 -1
- package/dist/schemas/BlockTemplates.d.ts +0 -600
- package/dist/schemas/BlockTemplates.d.ts.map +0 -1
- package/dist/schemas/BlockTemplates.js +0 -72
- package/dist/schemas/BlockTemplates.js.map +0 -1
- package/dist/schemas/Doc.d.ts +0 -503
- package/dist/schemas/Doc.d.ts.map +0 -1
- package/dist/schemas/Doc.js +0 -90
- package/dist/schemas/Doc.js.map +0 -1
- package/dist/schemas/LayoutStrategy.d.ts +0 -84
- package/dist/schemas/LayoutStrategy.d.ts.map +0 -1
- package/dist/schemas/LayoutStrategy.js +0 -123
- package/dist/schemas/LayoutStrategy.js.map +0 -1
- package/dist/schemas/MediaProvider.d.ts +0 -65
- package/dist/schemas/MediaProvider.d.ts.map +0 -1
- package/dist/schemas/MediaProvider.js +0 -13
- package/dist/schemas/MediaProvider.js.map +0 -1
- package/dist/schemas/Theme.d.ts +0 -194
- package/dist/schemas/Theme.d.ts.map +0 -1
- package/dist/schemas/Theme.js +0 -97
- package/dist/schemas/Theme.js.map +0 -1
- package/dist/schemas/Types.d.ts +0 -14
- package/dist/schemas/Types.d.ts.map +0 -1
- package/dist/schemas/Types.js +0 -5
- package/dist/schemas/Types.js.map +0 -1
- package/dist/schemas/Viewport.d.ts +0 -74
- package/dist/schemas/Viewport.d.ts.map +0 -1
- package/dist/schemas/Viewport.js +0 -63
- package/dist/schemas/Viewport.js.map +0 -1
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/themeLibrary.d.ts +0 -41
- package/dist/schemas/themeLibrary.d.ts.map +0 -1
- package/dist/schemas/themeLibrary.js +0 -597
- package/dist/schemas/themeLibrary.js.map +0 -1
- package/dist/spatial/Geohash.d.ts +0 -85
- package/dist/spatial/Geohash.d.ts.map +0 -1
- package/dist/spatial/Geohash.js +0 -142
- package/dist/spatial/Geohash.js.map +0 -1
- package/dist/spatial/Haversine.d.ts +0 -24
- package/dist/spatial/Haversine.d.ts.map +0 -1
- package/dist/spatial/Haversine.js +0 -48
- package/dist/spatial/Haversine.js.map +0 -1
- package/dist/spatial/index.d.ts.map +0 -1
- package/dist/storage/ContentContainer.d.ts +0 -87
- package/dist/storage/ContentContainer.d.ts.map +0 -1
- package/dist/storage/ContentContainer.js +0 -131
- package/dist/storage/ContentContainer.js.map +0 -1
- package/dist/storage/LocalForageAdapter.d.ts +0 -36
- package/dist/storage/LocalForageAdapter.d.ts.map +0 -1
- package/dist/storage/LocalForageAdapter.js +0 -82
- package/dist/storage/LocalForageAdapter.js.map +0 -1
- package/dist/storage/LocalStorageAdapter.d.ts +0 -16
- package/dist/storage/LocalStorageAdapter.d.ts.map +0 -1
- package/dist/storage/LocalStorageAdapter.js +0 -50
- package/dist/storage/LocalStorageAdapter.js.map +0 -1
- package/dist/storage/MediaProviderFromContainer.d.ts +0 -21
- package/dist/storage/MediaProviderFromContainer.d.ts.map +0 -1
- package/dist/storage/MediaProviderFromContainer.js +0 -79
- package/dist/storage/MediaProviderFromContainer.js.map +0 -1
- package/dist/storage/MemoryStorageAdapter.d.ts +0 -15
- package/dist/storage/MemoryStorageAdapter.d.ts.map +0 -1
- package/dist/storage/MemoryStorageAdapter.js +0 -34
- package/dist/storage/MemoryStorageAdapter.js.map +0 -1
- package/dist/storage/Storage.d.ts +0 -23
- package/dist/storage/Storage.d.ts.map +0 -1
- package/dist/storage/Storage.js +0 -9
- package/dist/storage/Storage.js.map +0 -1
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/themeLibrary-CEo2D4b6.d.ts +0 -44
- package/dist/timing/index.d.ts.map +0 -1
- package/dist/timing/narrationTiming.d.ts +0 -54
- package/dist/timing/narrationTiming.d.ts.map +0 -1
- package/dist/timing/narrationTiming.js +0 -190
- package/dist/timing/narrationTiming.js.map +0 -1
- package/dist/timing/readingTime.d.ts +0 -54
- package/dist/timing/readingTime.d.ts.map +0 -1
- package/dist/timing/readingTime.js +0 -49
- package/dist/timing/readingTime.js.map +0 -1
- package/dist/transform/applyTransform.d.ts +0 -22
- package/dist/transform/applyTransform.d.ts.map +0 -1
- package/dist/transform/applyTransform.js +0 -68
- package/dist/transform/applyTransform.js.map +0 -1
- package/dist/transform/blockAnalyzer.d.ts +0 -48
- package/dist/transform/blockAnalyzer.d.ts.map +0 -1
- package/dist/transform/blockAnalyzer.js +0 -135
- package/dist/transform/blockAnalyzer.js.map +0 -1
- package/dist/transform/index.d.ts.map +0 -1
- package/dist/transform/registry.d.ts +0 -19
- package/dist/transform/registry.d.ts.map +0 -1
- package/dist/transform/registry.js +0 -41
- package/dist/transform/registry.js.map +0 -1
- package/dist/transform/styles/dataDriven.d.ts +0 -4
- package/dist/transform/styles/dataDriven.d.ts.map +0 -1
- package/dist/transform/styles/dataDriven.js +0 -15
- package/dist/transform/styles/dataDriven.js.map +0 -1
- package/dist/transform/styles/documentary.d.ts +0 -4
- package/dist/transform/styles/documentary.d.ts.map +0 -1
- package/dist/transform/styles/documentary.js +0 -15
- package/dist/transform/styles/documentary.js.map +0 -1
- package/dist/transform/styles/index.d.ts +0 -6
- package/dist/transform/styles/index.d.ts.map +0 -1
- package/dist/transform/styles/index.js +0 -6
- package/dist/transform/styles/index.js.map +0 -1
- package/dist/transform/styles/magazine.d.ts +0 -4
- package/dist/transform/styles/magazine.d.ts.map +0 -1
- package/dist/transform/styles/magazine.js +0 -15
- package/dist/transform/styles/magazine.js.map +0 -1
- package/dist/transform/styles/minimal.d.ts +0 -4
- package/dist/transform/styles/minimal.d.ts.map +0 -1
- package/dist/transform/styles/minimal.js +0 -15
- package/dist/transform/styles/minimal.js.map +0 -1
- package/dist/transform/styles/narrative.d.ts +0 -4
- package/dist/transform/styles/narrative.d.ts.map +0 -1
- package/dist/transform/styles/narrative.js +0 -15
- package/dist/transform/styles/narrative.js.map +0 -1
- package/dist/transform/templateSelector.d.ts +0 -30
- package/dist/transform/templateSelector.d.ts.map +0 -1
- package/dist/transform/templateSelector.js +0 -218
- package/dist/transform/templateSelector.js.map +0 -1
- package/dist/transform/timingAllocator.d.ts +0 -21
- package/dist/transform/timingAllocator.d.ts.map +0 -1
- package/dist/transform/timingAllocator.js +0 -111
- package/dist/transform/timingAllocator.js.map +0 -1
- package/dist/transform/types.d.ts +0 -86
- package/dist/transform/types.d.ts.map +0 -1
- package/dist/transform/types.js +0 -9
- package/dist/transform/types.js.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template recommendations for the editor's block template picker.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { parseMarkdown } from '@bendyline/squisq/markdown';
|
|
7
|
+
* import { profileBlockContents, recommendTemplatesForBlock } from '@bendyline/squisq/recommend';
|
|
8
|
+
*
|
|
9
|
+
* const doc = parseMarkdown(blockBodySource);
|
|
10
|
+
* const profile = profileBlockContents(doc.children);
|
|
11
|
+
* const { recommended, rest } = recommendTemplatesForBlock(profile, ALL_TEMPLATE_NAMES);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export type { BlockContentProfile, RecommendationResult } from './templates.js';
|
|
16
|
+
export { profileBlockContents, recommendTemplatesForBlock } from './templates.js';
|
|
@@ -0,0 +1,273 @@
|
|
|
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
|
+
MarkdownHtmlBlock,
|
|
17
|
+
MarkdownNode,
|
|
18
|
+
} from '../markdown/types.js';
|
|
19
|
+
|
|
20
|
+
export interface BlockContentProfile {
|
|
21
|
+
hasImage: boolean;
|
|
22
|
+
imageCount: number;
|
|
23
|
+
hasVideo: boolean;
|
|
24
|
+
hasBlockquote: boolean;
|
|
25
|
+
hasList: boolean;
|
|
26
|
+
hasTable: boolean;
|
|
27
|
+
hasDate: boolean;
|
|
28
|
+
hasNumberHighlight: boolean;
|
|
29
|
+
wordCount: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface RecommendationResult {
|
|
33
|
+
recommended: string[];
|
|
34
|
+
rest: string[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const EMPTY_PROFILE: BlockContentProfile = Object.freeze({
|
|
38
|
+
hasImage: false,
|
|
39
|
+
imageCount: 0,
|
|
40
|
+
hasVideo: false,
|
|
41
|
+
hasBlockquote: false,
|
|
42
|
+
hasList: false,
|
|
43
|
+
hasTable: false,
|
|
44
|
+
hasDate: false,
|
|
45
|
+
hasNumberHighlight: false,
|
|
46
|
+
wordCount: 0,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const DATE_PATTERNS: RegExp[] = [
|
|
50
|
+
/\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2},?\s+)?\d{4}\b/i,
|
|
51
|
+
/\b\d{1,2}\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}\b/i,
|
|
52
|
+
/\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)\.?\s+\d{1,2},?\s+\d{4}\b/i,
|
|
53
|
+
/\b\d{4}-\d{2}-\d{2}\b/,
|
|
54
|
+
/\b\d{1,2}\/\d{1,2}\/\d{2,4}\b/,
|
|
55
|
+
/\bQ[1-4]\s+\d{4}\b/,
|
|
56
|
+
/\b\d{4}s\b/,
|
|
57
|
+
/\b\d{1,2}(st|nd|rd|th)\s+century\b/i,
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Matches a "highlight number" — a prominent figure suitable for a Stat
|
|
62
|
+
* Highlight block. Qualifies on any of:
|
|
63
|
+
* - currency prefix: `$2.3M`, `€500`, `¥1,234`
|
|
64
|
+
* - unit suffix: `50%`, `100 years`, `5×`, `2.3M`
|
|
65
|
+
* - standalone large: `1,234`, `5000`, `12,345`
|
|
66
|
+
* Plain small numbers (`42`) intentionally don't qualify.
|
|
67
|
+
*/
|
|
68
|
+
const NUMBER_HIGHLIGHT_RE =
|
|
69
|
+
/(?:[$€£¥]\s?\d+(?:[.,]\d+)*(?:\s?(?:[MBK]|million|billion|thousand))?|\d+(?:[.,]\d+)*\s?(?:%|‰|x|×|[MBK]|million|billion|thousand|percent|years?|days?|hours?)|\d{3,}(?:[.,]\d+)*)/i;
|
|
70
|
+
|
|
71
|
+
const VIDEO_HOST_RE = /(youtube\.com|youtu\.be|vimeo\.com|wistia\.|loom\.com)/i;
|
|
72
|
+
|
|
73
|
+
function htmlElementsByTag(root: MarkdownNode, tagNames: Set<string>): HtmlElement[] {
|
|
74
|
+
const blocks = findNodesByType<MarkdownHtmlBlock>(root, 'htmlBlock');
|
|
75
|
+
// Inline HTML (htmlInline) also carries htmlChildren; include both.
|
|
76
|
+
const inline = findNodesByType<MarkdownNode>(root, 'htmlInline') as Array<
|
|
77
|
+
MarkdownNode & { htmlChildren?: HtmlNode[] }
|
|
78
|
+
>;
|
|
79
|
+
const out: HtmlElement[] = [];
|
|
80
|
+
const visit = (n: HtmlNode): void => {
|
|
81
|
+
if (n.type === 'htmlElement') {
|
|
82
|
+
if (tagNames.has(n.tagName.toLowerCase())) out.push(n);
|
|
83
|
+
for (const c of n.children) visit(c);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
for (const b of blocks) for (const c of b.htmlChildren) visit(c);
|
|
87
|
+
for (const i of inline) {
|
|
88
|
+
if (Array.isArray(i.htmlChildren)) for (const c of i.htmlChildren) visit(c);
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Walk a slice of block nodes and summarize what kinds of content it
|
|
95
|
+
* contains. Cheap to run — no markdown parsing, just AST traversal.
|
|
96
|
+
*/
|
|
97
|
+
export function profileBlockContents(nodes: MarkdownBlockNode[]): BlockContentProfile {
|
|
98
|
+
if (!nodes || nodes.length === 0) return { ...EMPTY_PROFILE };
|
|
99
|
+
|
|
100
|
+
let imageCount = 0;
|
|
101
|
+
let hasBlockquote = false;
|
|
102
|
+
let hasList = false;
|
|
103
|
+
let hasTable = false;
|
|
104
|
+
|
|
105
|
+
const plainParts: string[] = [];
|
|
106
|
+
|
|
107
|
+
for (const node of nodes) {
|
|
108
|
+
imageCount += findNodesByType(node, 'image').length;
|
|
109
|
+
imageCount += findNodesByType(node, 'imageReference').length;
|
|
110
|
+
if (findNodesByType(node, 'blockquote').length > 0) hasBlockquote = true;
|
|
111
|
+
if (findNodesByType(node, 'list').length > 0) hasList = true;
|
|
112
|
+
if (findNodesByType(node, 'table').length > 0) hasTable = true;
|
|
113
|
+
plainParts.push(extractPlainText(node));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// HTML embeds: <img>, <video>, <iframe src=…video host>
|
|
117
|
+
const root: MarkdownNode = { type: 'document', children: nodes };
|
|
118
|
+
const imgTags = htmlElementsByTag(root, new Set(['img']));
|
|
119
|
+
imageCount += imgTags.length;
|
|
120
|
+
|
|
121
|
+
const videoTags = htmlElementsByTag(root, new Set(['video', 'iframe', 'source']));
|
|
122
|
+
let hasVideo = false;
|
|
123
|
+
for (const el of videoTags) {
|
|
124
|
+
if (el.tagName.toLowerCase() === 'video') {
|
|
125
|
+
hasVideo = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
const src = el.attributes.src || el.attributes.href || '';
|
|
129
|
+
if (VIDEO_HOST_RE.test(src)) {
|
|
130
|
+
hasVideo = true;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Link-only video embeds (markdown link to a known video host).
|
|
136
|
+
if (!hasVideo) {
|
|
137
|
+
const links = findNodesByType<MarkdownNode & { url?: string }>(root, 'link');
|
|
138
|
+
for (const link of links) {
|
|
139
|
+
if (link.url && VIDEO_HOST_RE.test(link.url)) {
|
|
140
|
+
hasVideo = true;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const plainText = plainParts.join(' ').trim();
|
|
147
|
+
const wordCount = plainText ? plainText.split(/\s+/).length : 0;
|
|
148
|
+
|
|
149
|
+
let hasDate = false;
|
|
150
|
+
for (const re of DATE_PATTERNS) {
|
|
151
|
+
if (re.test(plainText)) {
|
|
152
|
+
hasDate = true;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Number highlight: a paragraph that's mostly a single prominent figure.
|
|
158
|
+
let hasNumberHighlight = false;
|
|
159
|
+
walkMarkdownTree(root, (n) => {
|
|
160
|
+
if (hasNumberHighlight) return true;
|
|
161
|
+
if (n.type !== 'paragraph') return;
|
|
162
|
+
const text = extractPlainText(n).trim();
|
|
163
|
+
if (!text) return true;
|
|
164
|
+
const m = text.match(NUMBER_HIGHLIGHT_RE);
|
|
165
|
+
if (!m) return true;
|
|
166
|
+
// Paragraph qualifies when its word count is small AND a prominent
|
|
167
|
+
// number occupies a meaningful chunk of it. Keeps "the company grew
|
|
168
|
+
// 50% last year" from triggering, but accepts "$2.3M raised".
|
|
169
|
+
const words = text.split(/\s+/).length;
|
|
170
|
+
if (words <= 8) hasNumberHighlight = true;
|
|
171
|
+
return true;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
hasImage: imageCount > 0,
|
|
176
|
+
imageCount,
|
|
177
|
+
hasVideo,
|
|
178
|
+
hasBlockquote,
|
|
179
|
+
hasList,
|
|
180
|
+
hasTable,
|
|
181
|
+
hasDate,
|
|
182
|
+
hasNumberHighlight,
|
|
183
|
+
wordCount,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── Recommendation rules ───────────────────────────────────────────
|
|
188
|
+
|
|
189
|
+
const UNIVERSAL_DEFAULTS = ['title', 'sectionHeader', 'factCard', 'twoColumn'];
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Given a content profile, return the canonical template-name list that
|
|
193
|
+
* should appear in the "Recommended" bucket. Caller is responsible for
|
|
194
|
+
* preserving deduplication / ordering when intersecting with the full
|
|
195
|
+
* template list (see {@link recommendTemplatesForBlock}).
|
|
196
|
+
*/
|
|
197
|
+
function recommendedNamesForProfile(profile: BlockContentProfile): string[] {
|
|
198
|
+
const names = new Set<string>();
|
|
199
|
+
let anyContentSignal = false;
|
|
200
|
+
|
|
201
|
+
if (profile.hasImage) {
|
|
202
|
+
anyContentSignal = true;
|
|
203
|
+
names.add('imageWithCaption');
|
|
204
|
+
names.add('leftFeature');
|
|
205
|
+
names.add('rightFeature');
|
|
206
|
+
if (profile.imageCount >= 2) names.add('photoGrid');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (profile.hasVideo) {
|
|
210
|
+
anyContentSignal = true;
|
|
211
|
+
names.add('videoWithCaption');
|
|
212
|
+
if (profile.hasBlockquote) names.add('videoPullQuote');
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (profile.hasBlockquote) {
|
|
216
|
+
anyContentSignal = true;
|
|
217
|
+
names.add('quote');
|
|
218
|
+
names.add('pullQuote');
|
|
219
|
+
names.add('fullBleedQuote');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (profile.hasList) {
|
|
223
|
+
anyContentSignal = true;
|
|
224
|
+
names.add('list');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (profile.hasTable) {
|
|
228
|
+
anyContentSignal = true;
|
|
229
|
+
names.add('dataTable');
|
|
230
|
+
names.add('comparisonBar');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (profile.hasDate) {
|
|
234
|
+
anyContentSignal = true;
|
|
235
|
+
names.add('dateEvent');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (profile.hasNumberHighlight) {
|
|
239
|
+
anyContentSignal = true;
|
|
240
|
+
names.add('statHighlight');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (anyContentSignal) {
|
|
244
|
+
// Universal pair only — keep recommended focused.
|
|
245
|
+
names.add('title');
|
|
246
|
+
names.add('sectionHeader');
|
|
247
|
+
} else {
|
|
248
|
+
for (const n of UNIVERSAL_DEFAULTS) names.add(n);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return Array.from(names);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Split a flat list of template names into a "Recommended" bucket
|
|
256
|
+
* (matches the active block's content profile) and a "rest" bucket
|
|
257
|
+
* (everything else). Both buckets preserve the input ordering of
|
|
258
|
+
* `allNames`, so the visual layout stays predictable as templates are
|
|
259
|
+
* added.
|
|
260
|
+
*/
|
|
261
|
+
export function recommendTemplatesForBlock(
|
|
262
|
+
profile: BlockContentProfile,
|
|
263
|
+
allNames: readonly string[],
|
|
264
|
+
): RecommendationResult {
|
|
265
|
+
const desired = new Set(recommendedNamesForProfile(profile));
|
|
266
|
+
const recommended: string[] = [];
|
|
267
|
+
const rest: string[] = [];
|
|
268
|
+
for (const name of allNames) {
|
|
269
|
+
if (desired.has(name)) recommended.push(name);
|
|
270
|
+
else rest.push(name);
|
|
271
|
+
}
|
|
272
|
+
return { recommended, rest };
|
|
273
|
+
}
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Defines a template system for AI-generated doc blocks. Instead of
|
|
5
5
|
* specifying low-level layers, positions, and animations, AI can use
|
|
6
|
-
* high-level templates like "
|
|
6
|
+
* high-level templates like "title" or "statHighlight" with simple
|
|
7
7
|
* content parameters.
|
|
8
8
|
*
|
|
9
9
|
* Templates are expanded into full Block structures at render time,
|
|
10
10
|
* ensuring consistent styling and reducing AI generation errors.
|
|
11
11
|
*
|
|
12
12
|
* Template Types:
|
|
13
|
-
* -
|
|
13
|
+
* - title: Doc intro with title + subtitle
|
|
14
14
|
* - sectionHeader: Colored section divider
|
|
15
15
|
* - statHighlight: Big number/stat with description
|
|
16
|
-
* -
|
|
16
|
+
* - quote: Large centered quote
|
|
17
17
|
* - factCard: Key fact with explanation
|
|
18
18
|
* - twoColumn: Side-by-side comparison
|
|
19
19
|
* - dateEvent: Timeline-style date + description
|
|
@@ -116,7 +116,7 @@ interface BaseTemplateBlock {
|
|
|
116
116
|
* Title block - doc intro with large title and subtitle.
|
|
117
117
|
*/
|
|
118
118
|
export interface TitleBlockInput extends BaseTemplateBlock {
|
|
119
|
-
template: '
|
|
119
|
+
template: 'title';
|
|
120
120
|
/** Main title text */
|
|
121
121
|
title: string;
|
|
122
122
|
/** Subtitle or tagline (supports \n for line breaks) */
|
|
@@ -164,7 +164,7 @@ export interface StatHighlightInput extends BaseTemplateBlock {
|
|
|
164
164
|
* Quote block - large centered quote text.
|
|
165
165
|
*/
|
|
166
166
|
export interface QuoteBlockInput extends BaseTemplateBlock {
|
|
167
|
-
template: '
|
|
167
|
+
template: 'quote';
|
|
168
168
|
/** The quote text (supports \n for line breaks) */
|
|
169
169
|
quote: string;
|
|
170
170
|
/** Attribution (author, source) */
|
|
@@ -252,6 +252,47 @@ export interface ImageWithCaptionInput extends BaseTemplateBlock {
|
|
|
252
252
|
imageLicense?: string;
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
+
/**
|
|
256
|
+
* Shared fields for left/right feature blocks. A "feature" pairs an
|
|
257
|
+
* image on one side of the block with a title and body paragraph on
|
|
258
|
+
* the other — a common editorial layout for product highlights,
|
|
259
|
+
* profile callouts, or section intros.
|
|
260
|
+
*/
|
|
261
|
+
interface FeatureInputBase extends BaseTemplateBlock {
|
|
262
|
+
/** Path to the feature image. */
|
|
263
|
+
imageSrc: string;
|
|
264
|
+
/** Alt text for accessibility. */
|
|
265
|
+
imageAlt?: string;
|
|
266
|
+
/**
|
|
267
|
+
* Explicit display width of the image, in pixels (typically pulled
|
|
268
|
+
* from a `<img width>` attribute when the WYSIWYG editor resized it).
|
|
269
|
+
* When set, the renderer treats the image as a sized asset and
|
|
270
|
+
* centers it inside its half with padding instead of stretching it
|
|
271
|
+
* to fill the cell.
|
|
272
|
+
*/
|
|
273
|
+
imageWidth?: number;
|
|
274
|
+
/** Explicit display height of the image, in pixels. */
|
|
275
|
+
imageHeight?: number;
|
|
276
|
+
/** Heading / title text shown next to the image. */
|
|
277
|
+
title?: string;
|
|
278
|
+
/** Body text shown below the title. */
|
|
279
|
+
body?: string;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Left feature — image on the left, title + body stacked on the right.
|
|
284
|
+
*/
|
|
285
|
+
export interface LeftFeatureInput extends FeatureInputBase {
|
|
286
|
+
template: 'leftFeature';
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Right feature — image on the right, title + body stacked on the left.
|
|
291
|
+
*/
|
|
292
|
+
export interface RightFeatureInput extends FeatureInputBase {
|
|
293
|
+
template: 'rightFeature';
|
|
294
|
+
}
|
|
295
|
+
|
|
255
296
|
/**
|
|
256
297
|
* Map block - geographic map showing article location.
|
|
257
298
|
*
|
|
@@ -260,7 +301,7 @@ export interface ImageWithCaptionInput extends BaseTemplateBlock {
|
|
|
260
301
|
* See docs/MAP_TILES.md for available tile styles and attribution.
|
|
261
302
|
*/
|
|
262
303
|
export interface MapBlockInput extends BaseTemplateBlock {
|
|
263
|
-
template: '
|
|
304
|
+
template: 'map';
|
|
264
305
|
/** Map center coordinates */
|
|
265
306
|
center: {
|
|
266
307
|
lat: number;
|
|
@@ -299,7 +340,7 @@ export interface FullBleedQuoteInput extends BaseTemplateBlock {
|
|
|
299
340
|
* Good for enumerations like "things to see" or "key features".
|
|
300
341
|
*/
|
|
301
342
|
export interface ListBlockInput extends BaseTemplateBlock {
|
|
302
|
-
template: '
|
|
343
|
+
template: 'list';
|
|
303
344
|
/** List items (3-5 recommended) */
|
|
304
345
|
items: string[];
|
|
305
346
|
/** Optional header above the list */
|
|
@@ -459,6 +500,8 @@ export type TemplateBlock =
|
|
|
459
500
|
| TwoColumnInput
|
|
460
501
|
| DateEventInput
|
|
461
502
|
| ImageWithCaptionInput
|
|
503
|
+
| LeftFeatureInput
|
|
504
|
+
| RightFeatureInput
|
|
462
505
|
| MapBlockInput
|
|
463
506
|
| FullBleedQuoteInput
|
|
464
507
|
| ListBlockInput
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImageEditDoc — JSON document describing a layered, editable image.
|
|
3
|
+
*
|
|
4
|
+
* This is the persistent state of the `<ImageEditor>` component. It lives
|
|
5
|
+
* inside a `<imagebasename>_files/` sidecar folder (exposed as a
|
|
6
|
+
* {@link ContentContainer}) at `state.json`, alongside referenced asset
|
|
7
|
+
* bytes in `assets/` and version snapshots in `.versions/`.
|
|
8
|
+
*
|
|
9
|
+
* Layers compose the existing core {@link Layer} types (image / text /
|
|
10
|
+
* shape) so renderers can share infrastructure with the doc system.
|
|
11
|
+
* Editor-specific metadata (name, visibility, lock, opacity, blendMode)
|
|
12
|
+
* lives in {@link EditorLayerMeta} and is merged onto each layer. The
|
|
13
|
+
* {@link Layer.animation} field is permitted but ignored by the image
|
|
14
|
+
* editor — animations are a slideshow concept.
|
|
15
|
+
*
|
|
16
|
+
* All asset paths in layers (e.g. `ImageLayer.content.src`) are
|
|
17
|
+
* relative to the sidecar root, keeping the document portable.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { ImageLayer, ShapeLayer, TextLayer } from './Doc.js';
|
|
21
|
+
|
|
22
|
+
// ============================================
|
|
23
|
+
// Layer type
|
|
24
|
+
// ============================================
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Per-layer editor metadata. Merged into each layer so the persisted
|
|
28
|
+
* shape is a single object. All fields optional; sensible defaults
|
|
29
|
+
* apply when absent (visible: true, locked: false, opacity: 1).
|
|
30
|
+
*/
|
|
31
|
+
export interface EditorLayerMeta {
|
|
32
|
+
/** Human-readable name shown in the layers panel. */
|
|
33
|
+
name?: string;
|
|
34
|
+
/** When false, the layer is hidden from rendering. Default true. */
|
|
35
|
+
visible?: boolean;
|
|
36
|
+
/** When true, the layer cannot be selected/edited. Default false. */
|
|
37
|
+
locked?: boolean;
|
|
38
|
+
/** 0..1 multiplier on the layer's alpha. Default 1. */
|
|
39
|
+
opacity?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Canvas blend mode (matches the CSS / Canvas2D vocabulary).
|
|
42
|
+
* Default 'source-over' (normal compositing).
|
|
43
|
+
*/
|
|
44
|
+
blendMode?: GlobalCompositeOperation;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** A layer in an {@link ImageEditDoc}. */
|
|
48
|
+
export type ImageEditLayer = (ImageLayer | TextLayer | ShapeLayer) & EditorLayerMeta;
|
|
49
|
+
|
|
50
|
+
/** The layer kinds the image editor supports. */
|
|
51
|
+
export type ImageEditLayerKind = ImageEditLayer['type'];
|
|
52
|
+
|
|
53
|
+
// ============================================
|
|
54
|
+
// Document
|
|
55
|
+
// ============================================
|
|
56
|
+
|
|
57
|
+
/** Canvas dimensions and background. */
|
|
58
|
+
export interface ImageEditCanvas {
|
|
59
|
+
/** Canvas width in pixels. */
|
|
60
|
+
width: number;
|
|
61
|
+
/** Canvas height in pixels. */
|
|
62
|
+
height: number;
|
|
63
|
+
/**
|
|
64
|
+
* Background fill (CSS color, or `'transparent'` for an alpha canvas).
|
|
65
|
+
* Default: `'transparent'`.
|
|
66
|
+
*/
|
|
67
|
+
background?: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Optional document metadata. */
|
|
71
|
+
export interface ImageEditMeta {
|
|
72
|
+
/** Path to the original source image (sidecar-relative). Set when the doc is seeded from an existing image. */
|
|
73
|
+
sourcePath?: string;
|
|
74
|
+
/** ISO timestamp set on first save. */
|
|
75
|
+
createdAt?: string;
|
|
76
|
+
/** ISO timestamp updated on every save. */
|
|
77
|
+
updatedAt?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The persisted image-editor document.
|
|
82
|
+
*
|
|
83
|
+
* Layers are composited back-to-front: `layers[0]` is the bottom of the stack
|
|
84
|
+
* (typically the base raster), `layers[layers.length - 1]` is the top.
|
|
85
|
+
*/
|
|
86
|
+
export interface ImageEditDoc {
|
|
87
|
+
/** Schema version. Bumped on breaking changes. */
|
|
88
|
+
version: 1;
|
|
89
|
+
/** Canvas configuration. */
|
|
90
|
+
canvas: ImageEditCanvas;
|
|
91
|
+
/** Layers, back-to-front. */
|
|
92
|
+
layers: ImageEditLayer[];
|
|
93
|
+
/** Optional metadata. */
|
|
94
|
+
meta?: ImageEditMeta;
|
|
95
|
+
}
|