@bendyline/squisq 1.2.2 → 1.4.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/dist/{Doc-BfBhiCNr.d.ts → Doc-BeSeH2iX.d.ts} +141 -33
- package/dist/ImageEditDoc-BTIvw0oq.d.ts +84 -0
- package/dist/__tests__/colorUtils.test.d.ts +2 -0
- package/dist/__tests__/colorUtils.test.d.ts.map +1 -0
- package/dist/__tests__/colorUtils.test.js +94 -0
- package/dist/__tests__/colorUtils.test.js.map +1 -0
- package/dist/__tests__/getLayers.test.js +31 -7
- package/dist/__tests__/getLayers.test.js.map +1 -1
- package/dist/__tests__/iconResolve.test.d.ts +2 -0
- package/dist/__tests__/iconResolve.test.d.ts.map +1 -0
- package/dist/__tests__/iconResolve.test.js +99 -0
- package/dist/__tests__/iconResolve.test.js.map +1 -0
- package/dist/__tests__/imageEditState.test.d.ts +2 -0
- package/dist/__tests__/imageEditState.test.d.ts.map +1 -0
- package/dist/__tests__/imageEditState.test.js +61 -0
- package/dist/__tests__/imageEditState.test.js.map +1 -0
- package/dist/__tests__/imageEditVersions.test.d.ts +2 -0
- package/dist/__tests__/imageEditVersions.test.d.ts.map +1 -0
- package/dist/__tests__/imageEditVersions.test.js +141 -0
- package/dist/__tests__/imageEditVersions.test.js.map +1 -0
- package/dist/__tests__/inferDocumentTitle.test.d.ts +2 -0
- package/dist/__tests__/inferDocumentTitle.test.d.ts.map +1 -0
- package/dist/__tests__/inferDocumentTitle.test.js +42 -0
- package/dist/__tests__/inferDocumentTitle.test.js.map +1 -0
- package/dist/__tests__/jsonForm.chooseControl.test.d.ts +2 -0
- package/dist/__tests__/jsonForm.chooseControl.test.d.ts.map +1 -0
- package/dist/__tests__/jsonForm.chooseControl.test.js +74 -0
- package/dist/__tests__/jsonForm.chooseControl.test.js.map +1 -0
- package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts +2 -0
- package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts.map +1 -0
- package/dist/__tests__/jsonForm.evaluateWhen.test.js +51 -0
- package/dist/__tests__/jsonForm.evaluateWhen.test.js.map +1 -0
- package/dist/__tests__/jsonForm.inferSchema.test.d.ts +2 -0
- package/dist/__tests__/jsonForm.inferSchema.test.d.ts.map +1 -0
- package/dist/__tests__/jsonForm.inferSchema.test.js +23 -0
- package/dist/__tests__/jsonForm.inferSchema.test.js.map +1 -0
- package/dist/__tests__/jsonForm.pointer.test.d.ts +2 -0
- package/dist/__tests__/jsonForm.pointer.test.d.ts.map +1 -0
- package/dist/__tests__/jsonForm.pointer.test.js +94 -0
- package/dist/__tests__/jsonForm.pointer.test.js.map +1 -0
- package/dist/__tests__/markdown.test.js +40 -0
- package/dist/__tests__/markdown.test.js.map +1 -1
- package/dist/__tests__/markdownIcons.test.d.ts +2 -0
- package/dist/__tests__/markdownIcons.test.d.ts.map +1 -0
- package/dist/__tests__/markdownIcons.test.js +93 -0
- package/dist/__tests__/markdownIcons.test.js.map +1 -0
- package/dist/__tests__/markdownToDoc.test.js +15 -4
- package/dist/__tests__/markdownToDoc.test.js.map +1 -1
- package/dist/__tests__/recommendTemplates.test.d.ts +2 -0
- package/dist/__tests__/recommendTemplates.test.d.ts.map +1 -0
- package/dist/__tests__/recommendTemplates.test.js +158 -0
- package/dist/__tests__/recommendTemplates.test.js.map +1 -0
- package/dist/__tests__/scopedContentContainer.test.d.ts +2 -0
- package/dist/__tests__/scopedContentContainer.test.d.ts.map +1 -0
- package/dist/__tests__/scopedContentContainer.test.js +74 -0
- package/dist/__tests__/scopedContentContainer.test.js.map +1 -0
- package/dist/__tests__/slideshowGenerator.test.js +1 -1
- package/dist/__tests__/slideshowGenerator.test.js.map +1 -1
- package/dist/__tests__/surface.test.d.ts +2 -0
- package/dist/__tests__/surface.test.d.ts.map +1 -0
- package/dist/__tests__/surface.test.js +57 -0
- package/dist/__tests__/surface.test.js.map +1 -0
- package/dist/__tests__/templateAnnotationParse.test.d.ts +2 -0
- package/dist/__tests__/templateAnnotationParse.test.d.ts.map +1 -0
- package/dist/__tests__/templateAnnotationParse.test.js +42 -0
- package/dist/__tests__/templateAnnotationParse.test.js.map +1 -0
- package/dist/__tests__/templates.test.js +90 -9
- package/dist/__tests__/templates.test.js.map +1 -1
- package/dist/__tests__/themeCompile.test.d.ts +2 -0
- package/dist/__tests__/themeCompile.test.d.ts.map +1 -0
- package/dist/__tests__/themeCompile.test.js +134 -0
- package/dist/__tests__/themeCompile.test.js.map +1 -0
- package/dist/__tests__/themeValidator.test.d.ts +2 -0
- package/dist/__tests__/themeValidator.test.d.ts.map +1 -0
- package/dist/__tests__/themeValidator.test.js +107 -0
- package/dist/__tests__/themeValidator.test.js.map +1 -0
- package/dist/__tests__/versions.test.d.ts +2 -0
- package/dist/__tests__/versions.test.d.ts.map +1 -0
- package/dist/__tests__/versions.test.js +339 -0
- package/dist/__tests__/versions.test.js.map +1 -0
- package/dist/{chunk-CYQHG27J.js → chunk-2TMAWB4Y.js} +74 -1
- package/dist/chunk-2TMAWB4Y.js.map +1 -0
- package/dist/{chunk-LAZELBON.js → chunk-3K5OG6KI.js} +165 -17
- 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-GAQLMORN.js → chunk-KSWJR66U.js} +248 -44
- 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/audioMapping.d.ts.map +1 -1
- package/dist/doc/audioMapping.js +80 -9
- package/dist/doc/audioMapping.js.map +1 -1
- package/dist/doc/getLayers.d.ts.map +1 -1
- package/dist/doc/getLayers.js +29 -18
- package/dist/doc/getLayers.js.map +1 -1
- package/dist/doc/markdownToDoc.d.ts.map +1 -1
- package/dist/doc/markdownToDoc.js +40 -6
- package/dist/doc/markdownToDoc.js.map +1 -1
- package/dist/doc/templates/featureBlock.d.ts +18 -0
- package/dist/doc/templates/featureBlock.d.ts.map +1 -0
- package/dist/doc/templates/featureBlock.js +180 -0
- package/dist/doc/templates/featureBlock.js.map +1 -0
- package/dist/doc/templates/fullBleedQuote.d.ts +12 -0
- package/dist/doc/templates/fullBleedQuote.d.ts.map +1 -1
- package/dist/doc/templates/fullBleedQuote.js +12 -0
- package/dist/doc/templates/fullBleedQuote.js.map +1 -1
- package/dist/doc/templates/index.d.ts +28 -4
- package/dist/doc/templates/index.d.ts.map +1 -1
- package/dist/doc/templates/index.js +45 -12
- package/dist/doc/templates/index.js.map +1 -1
- package/dist/doc/templates/listBlock.d.ts.map +1 -1
- package/dist/doc/templates/listBlock.js +22 -5
- package/dist/doc/templates/listBlock.js.map +1 -1
- package/dist/doc/templates/statHighlight.d.ts +12 -0
- package/dist/doc/templates/statHighlight.d.ts.map +1 -1
- package/dist/doc/templates/statHighlight.js +12 -0
- package/dist/doc/templates/statHighlight.js.map +1 -1
- package/dist/doc/templates/titleBlock.d.ts +11 -0
- package/dist/doc/templates/titleBlock.d.ts.map +1 -1
- package/dist/doc/templates/titleBlock.js +8 -0
- package/dist/doc/templates/titleBlock.js.map +1 -1
- package/dist/doc/utils/themeUtils.d.ts +4 -4
- package/dist/doc/utils/themeUtils.d.ts.map +1 -1
- package/dist/doc/utils/themeUtils.js +8 -7
- package/dist/doc/utils/themeUtils.js.map +1 -1
- package/dist/generate/slideshowGenerator.js +1 -1
- package/dist/generate/slideshowGenerator.js.map +1 -1
- package/dist/generate/templateMapper.js +2 -2
- package/dist/generate/templateMapper.js.map +1 -1
- package/dist/icons/iconData.d.ts +26 -0
- package/dist/icons/iconData.d.ts.map +1 -0
- package/dist/icons/iconData.js +12 -0
- package/dist/icons/iconData.js.map +1 -0
- package/dist/icons/index.d.ts +12 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +10 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/resolve.d.ts +61 -0
- package/dist/icons/resolve.d.ts.map +1 -0
- package/dist/icons/resolve.js +130 -0
- package/dist/icons/resolve.js.map +1 -0
- package/dist/imageEdit/ImageEditVersionManager.d.ts +31 -0
- package/dist/imageEdit/ImageEditVersionManager.d.ts.map +1 -0
- package/dist/imageEdit/ImageEditVersionManager.js +39 -0
- package/dist/imageEdit/ImageEditVersionManager.js.map +1 -0
- package/dist/imageEdit/export.d.ts +33 -0
- package/dist/imageEdit/export.d.ts.map +1 -0
- package/dist/imageEdit/export.js +253 -0
- package/dist/imageEdit/export.js.map +1 -0
- package/dist/imageEdit/index.d.ts +14 -0
- package/dist/imageEdit/index.d.ts.map +1 -0
- package/dist/imageEdit/index.js +22 -0
- package/dist/imageEdit/index.js.map +1 -0
- package/dist/imageEdit/persistence.d.ts +15 -0
- package/dist/imageEdit/persistence.d.ts.map +1 -0
- package/dist/imageEdit/persistence.js +49 -0
- package/dist/imageEdit/persistence.js.map +1 -0
- package/dist/imageEdit/state.d.ts +42 -0
- package/dist/imageEdit/state.d.ts.map +1 -0
- package/dist/imageEdit/state.js +98 -0
- package/dist/imageEdit/state.js.map +1 -0
- package/dist/imageEdit/versionPaths.d.ts +27 -0
- package/dist/imageEdit/versionPaths.d.ts.map +1 -0
- package/dist/imageEdit/versionPaths.js +57 -0
- package/dist/imageEdit/versionPaths.js.map +1 -0
- package/dist/imageEdit/versions.d.ts +67 -0
- package/dist/imageEdit/versions.d.ts.map +1 -0
- package/dist/imageEdit/versions.js +161 -0
- package/dist/imageEdit/versions.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/jsonForm/chooseControl.d.ts +20 -0
- package/dist/jsonForm/chooseControl.d.ts.map +1 -0
- package/dist/jsonForm/chooseControl.js +82 -0
- package/dist/jsonForm/chooseControl.js.map +1 -0
- package/dist/jsonForm/evaluateWhen.d.ts +12 -0
- package/dist/jsonForm/evaluateWhen.d.ts.map +1 -0
- package/dist/jsonForm/evaluateWhen.js +65 -0
- package/dist/jsonForm/evaluateWhen.js.map +1 -0
- package/dist/jsonForm/index.d.ts +14 -0
- package/dist/jsonForm/index.d.ts.map +1 -0
- package/dist/jsonForm/index.js +12 -0
- package/dist/jsonForm/index.js.map +1 -0
- package/dist/jsonForm/inferSchema.d.ts +12 -0
- package/dist/jsonForm/inferSchema.d.ts.map +1 -0
- package/dist/jsonForm/inferSchema.js +15 -0
- package/dist/jsonForm/inferSchema.js.map +1 -0
- package/dist/jsonForm/pointer.d.ts +26 -0
- package/dist/jsonForm/pointer.d.ts.map +1 -0
- package/dist/jsonForm/pointer.js +102 -0
- package/dist/jsonForm/pointer.js.map +1 -0
- package/dist/jsonForm/types.d.ts +120 -0
- package/dist/jsonForm/types.d.ts.map +1 -0
- package/dist/jsonForm/types.js +10 -0
- package/dist/jsonForm/types.js.map +1 -0
- package/dist/markdown/convert.d.ts +11 -1
- package/dist/markdown/convert.d.ts.map +1 -1
- package/dist/markdown/convert.js +235 -15
- package/dist/markdown/convert.js.map +1 -1
- package/dist/markdown/index.d.ts +2 -2
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +1 -1
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/types.d.ts +34 -1
- package/dist/markdown/types.d.ts.map +1 -1
- package/dist/markdown/utils.d.ts +40 -0
- package/dist/markdown/utils.d.ts.map +1 -1
- package/dist/markdown/utils.js +155 -0
- package/dist/markdown/utils.js.map +1 -1
- package/dist/recommend/index.d.ts +16 -0
- package/dist/recommend/index.d.ts.map +1 -0
- package/dist/recommend/index.js +15 -0
- package/dist/recommend/index.js.map +1 -0
- package/dist/recommend/templates.d.ts +39 -0
- package/dist/recommend/templates.d.ts.map +1 -0
- package/dist/recommend/templates.js +235 -0
- package/dist/recommend/templates.js.map +1 -0
- package/dist/schemas/BlockTemplates.d.ts +46 -8
- package/dist/schemas/BlockTemplates.d.ts.map +1 -1
- package/dist/schemas/BlockTemplates.js +3 -3
- package/dist/schemas/BlockTemplates.js.map +1 -1
- package/dist/schemas/ImageEditDoc.d.ts +81 -0
- package/dist/schemas/ImageEditDoc.d.ts.map +1 -0
- package/dist/schemas/ImageEditDoc.js +20 -0
- package/dist/schemas/ImageEditDoc.js.map +1 -0
- package/dist/schemas/Theme.d.ts +93 -23
- package/dist/schemas/Theme.d.ts.map +1 -1
- package/dist/schemas/Theme.js +80 -13
- package/dist/schemas/Theme.js.map +1 -1
- package/dist/schemas/colorUtils.d.ts +51 -0
- package/dist/schemas/colorUtils.d.ts.map +1 -0
- package/dist/schemas/colorUtils.js +154 -0
- package/dist/schemas/colorUtils.js.map +1 -0
- package/dist/schemas/fontStacks.d.ts +57 -0
- package/dist/schemas/fontStacks.d.ts.map +1 -0
- package/dist/schemas/fontStacks.js +227 -0
- package/dist/schemas/fontStacks.js.map +1 -0
- package/dist/schemas/index.d.ts +5 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +4 -0
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/themeCompile.d.ts +45 -0
- package/dist/schemas/themeCompile.d.ts.map +1 -0
- package/dist/schemas/themeCompile.js +160 -0
- package/dist/schemas/themeCompile.js.map +1 -0
- package/dist/schemas/themeLibrary.d.ts +11 -15
- package/dist/schemas/themeLibrary.d.ts.map +1 -1
- package/dist/schemas/themeLibrary.js +18 -499
- package/dist/schemas/themeLibrary.js.map +1 -1
- package/dist/schemas/themeValidator.d.ts +26 -0
- package/dist/schemas/themeValidator.d.ts.map +1 -0
- package/dist/schemas/themeValidator.js +352 -0
- package/dist/schemas/themeValidator.js.map +1 -0
- package/dist/schemas/themes/bold.json +48 -0
- package/dist/schemas/themes/cinematic.json +54 -0
- package/dist/schemas/themes/documentary.json +49 -0
- package/dist/schemas/themes/gezellig.json +44 -0
- package/dist/schemas/themes/index.d.ts +26 -0
- package/dist/schemas/themes/index.d.ts.map +1 -0
- package/dist/schemas/themes/index.js +49 -0
- package/dist/schemas/themes/index.js.map +1 -0
- package/dist/schemas/themes/magazine.json +44 -0
- package/dist/schemas/themes/minimalist.json +45 -0
- package/dist/schemas/themes/morning-light.json +42 -0
- package/dist/schemas/themes/standard-dark.json +50 -0
- package/dist/schemas/themes/standard.json +42 -0
- package/dist/schemas/themes/tech-dark.json +48 -0
- package/dist/schemas/themes/warm-earth.json +50 -0
- package/dist/storage/ScopedContentContainer.d.ts +44 -0
- package/dist/storage/ScopedContentContainer.d.ts.map +1 -0
- package/dist/storage/ScopedContentContainer.js +94 -0
- package/dist/storage/ScopedContentContainer.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- 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/{types-DYAzisMG.d.ts → types-BdZkdJ3z.d.ts} +35 -2
- package/dist/types-D98li1gV.d.ts +93 -0
- package/dist/versions/DocumentVersionManager.d.ts +31 -0
- package/dist/versions/DocumentVersionManager.d.ts.map +1 -0
- package/dist/versions/DocumentVersionManager.js +33 -0
- package/dist/versions/DocumentVersionManager.js.map +1 -0
- package/dist/versions/index.d.ts +29 -0
- package/dist/versions/index.d.ts.map +1 -0
- package/dist/versions/index.js +28 -0
- package/dist/versions/index.js.map +1 -0
- package/dist/versions/operations.d.ts +44 -0
- package/dist/versions/operations.d.ts.map +1 -0
- package/dist/versions/operations.js +190 -0
- package/dist/versions/operations.js.map +1 -0
- package/dist/versions/paths.d.ts +29 -0
- package/dist/versions/paths.d.ts.map +1 -0
- package/dist/versions/paths.js +66 -0
- package/dist/versions/paths.js.map +1 -0
- package/dist/versions/timestamp.d.ts +22 -0
- package/dist/versions/timestamp.d.ts.map +1 -0
- package/dist/versions/timestamp.js +44 -0
- package/dist/versions/timestamp.js.map +1 -0
- package/dist/versions/types.d.ts +92 -0
- package/dist/versions/types.d.ts.map +1 -0
- package/dist/versions/types.js +11 -0
- package/dist/versions/types.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__/markdown.test.ts +44 -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__/surface.test.ts +68 -0
- 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 +95 -13
- 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 +248 -15
- package/src/markdown/index.ts +4 -0
- package/src/markdown/types.ts +38 -1
- 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 +152 -23
- 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 -524
- 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/chunk-53TZ2UTL.js +0 -470
- package/dist/chunk-53TZ2UTL.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-GAQLMORN.js.map +0 -1
- package/dist/chunk-LAZELBON.js.map +0 -1
- package/dist/chunk-QM5PKNPW.js.map +0 -1
- package/dist/chunk-TSG2OSE6.js.map +0 -1
- package/dist/chunk-XM4WSOHB.js +0 -92
- package/dist/chunk-XM4WSOHB.js.map +0 -1
- package/dist/themeLibrary-IP7EdyRq.d.ts +0 -44
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path conventions for version snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Snapshots live at `<VERSIONS_PREFIX><basename>.<timestamp>[<-suffix>].md`.
|
|
5
|
+
* The optional numeric suffix (`-2`, `-3`, ...) is appended only when two
|
|
6
|
+
* snapshots collide on the same UTC second.
|
|
7
|
+
*/
|
|
8
|
+
/** Subfolder (inside the ContentContainer) that holds version snapshots. */
|
|
9
|
+
export declare const VERSIONS_PREFIX = ".versions/";
|
|
10
|
+
/**
|
|
11
|
+
* Strip the directory and extension from a document path to produce the
|
|
12
|
+
* basename used in version filenames. `subdir/index.md` -> `index`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getDocBasename(documentPath: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Build a version snapshot path. Optionally append a collision suffix
|
|
17
|
+
* (e.g. `2`, `3`) when two saves land on the same UTC second.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildVersionPath(basename: string, date: Date, collision?: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Parse a version snapshot path. Returns null if it doesn't match the
|
|
22
|
+
* convention (so unrelated files stored under `.versions/` are ignored).
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseVersionPath(path: string): {
|
|
25
|
+
basename: string;
|
|
26
|
+
timestamp: Date;
|
|
27
|
+
collision: number;
|
|
28
|
+
} | null;
|
|
29
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/versions/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,4EAA4E;AAC5E,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,SAAI,GAAG,MAAM,CAIpF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GACX;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyBjE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path conventions for version snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Snapshots live at `<VERSIONS_PREFIX><basename>.<timestamp>[<-suffix>].md`.
|
|
5
|
+
* The optional numeric suffix (`-2`, `-3`, ...) is appended only when two
|
|
6
|
+
* snapshots collide on the same UTC second.
|
|
7
|
+
*/
|
|
8
|
+
import { formatVersionTimestamp, parseVersionTimestamp } from './timestamp.js';
|
|
9
|
+
/** Subfolder (inside the ContentContainer) that holds version snapshots. */
|
|
10
|
+
export const VERSIONS_PREFIX = '.versions/';
|
|
11
|
+
/**
|
|
12
|
+
* Strip the directory and extension from a document path to produce the
|
|
13
|
+
* basename used in version filenames. `subdir/index.md` -> `index`.
|
|
14
|
+
*/
|
|
15
|
+
export function getDocBasename(documentPath) {
|
|
16
|
+
const slash = documentPath.lastIndexOf('/');
|
|
17
|
+
const file = slash >= 0 ? documentPath.slice(slash + 1) : documentPath;
|
|
18
|
+
const dot = file.lastIndexOf('.');
|
|
19
|
+
return dot > 0 ? file.slice(0, dot) : file;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build a version snapshot path. Optionally append a collision suffix
|
|
23
|
+
* (e.g. `2`, `3`) when two saves land on the same UTC second.
|
|
24
|
+
*/
|
|
25
|
+
export function buildVersionPath(basename, date, collision = 0) {
|
|
26
|
+
const stamp = formatVersionTimestamp(date);
|
|
27
|
+
const suffix = collision > 0 ? `-${collision + 1}` : '';
|
|
28
|
+
return `${VERSIONS_PREFIX}${basename}.${stamp}${suffix}.md`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse a version snapshot path. Returns null if it doesn't match the
|
|
32
|
+
* convention (so unrelated files stored under `.versions/` are ignored).
|
|
33
|
+
*/
|
|
34
|
+
export function parseVersionPath(path) {
|
|
35
|
+
if (!path.startsWith(VERSIONS_PREFIX))
|
|
36
|
+
return null;
|
|
37
|
+
const rest = path.slice(VERSIONS_PREFIX.length);
|
|
38
|
+
if (!rest.endsWith('.md'))
|
|
39
|
+
return null;
|
|
40
|
+
const stem = rest.slice(0, -'.md'.length);
|
|
41
|
+
// basename can contain dots; the timestamp is always the *last* dot-segment
|
|
42
|
+
// (optionally followed by a `-N` collision suffix).
|
|
43
|
+
const lastDot = stem.lastIndexOf('.');
|
|
44
|
+
if (lastDot <= 0)
|
|
45
|
+
return null;
|
|
46
|
+
const basename = stem.slice(0, lastDot);
|
|
47
|
+
const tail = stem.slice(lastDot + 1);
|
|
48
|
+
const dash = tail.indexOf('-');
|
|
49
|
+
let stamp;
|
|
50
|
+
let collision = 0;
|
|
51
|
+
if (dash >= 0) {
|
|
52
|
+
stamp = tail.slice(0, dash);
|
|
53
|
+
const n = Number(tail.slice(dash + 1));
|
|
54
|
+
if (!Number.isInteger(n) || n < 2)
|
|
55
|
+
return null;
|
|
56
|
+
collision = n - 1;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
stamp = tail;
|
|
60
|
+
}
|
|
61
|
+
const timestamp = parseVersionTimestamp(stamp);
|
|
62
|
+
if (!timestamp)
|
|
63
|
+
return null;
|
|
64
|
+
return { basename, timestamp, collision };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/versions/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,YAAoB;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAU,EAAE,SAAS,GAAG,CAAC;IAC1E,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,GAAG,eAAe,GAAG,QAAQ,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY;IAEZ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,4EAA4E;IAC5E,oDAAoD;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAa,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACd,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sortable, human-readable timestamps for version filenames.
|
|
3
|
+
*
|
|
4
|
+
* Format: ISO 8601 basic, UTC, second precision, `Z` suffix —
|
|
5
|
+
* e.g. `20260430T152030Z`. Lexicographic order matches chronological order,
|
|
6
|
+
* so `listFiles` returns versions in time order without parsing.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Format a Date as a sortable, filename-safe UTC timestamp string.
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatVersionTimestamp(date: Date): string;
|
|
12
|
+
/**
|
|
13
|
+
* Parse a version timestamp string back to a Date. Returns null if the input
|
|
14
|
+
* doesn't match the expected format.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseVersionTimestamp(stamp: string): Date | null;
|
|
17
|
+
/**
|
|
18
|
+
* The pattern a valid version timestamp matches. Exported so other modules
|
|
19
|
+
* can validate filenames without re-deriving the regex.
|
|
20
|
+
*/
|
|
21
|
+
export declare const VERSION_TIMESTAMP_PATTERN: RegExp;
|
|
22
|
+
//# sourceMappingURL=timestamp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp.d.ts","sourceRoot":"","sources":["../../src/versions/timestamp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAWzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAOhE;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAAe,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sortable, human-readable timestamps for version filenames.
|
|
3
|
+
*
|
|
4
|
+
* Format: ISO 8601 basic, UTC, second precision, `Z` suffix —
|
|
5
|
+
* e.g. `20260430T152030Z`. Lexicographic order matches chronological order,
|
|
6
|
+
* so `listFiles` returns versions in time order without parsing.
|
|
7
|
+
*/
|
|
8
|
+
const TIMESTAMP_RE = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/;
|
|
9
|
+
function pad2(n) {
|
|
10
|
+
return n < 10 ? `0${n}` : String(n);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Format a Date as a sortable, filename-safe UTC timestamp string.
|
|
14
|
+
*/
|
|
15
|
+
export function formatVersionTimestamp(date) {
|
|
16
|
+
return (String(date.getUTCFullYear()).padStart(4, '0') +
|
|
17
|
+
pad2(date.getUTCMonth() + 1) +
|
|
18
|
+
pad2(date.getUTCDate()) +
|
|
19
|
+
'T' +
|
|
20
|
+
pad2(date.getUTCHours()) +
|
|
21
|
+
pad2(date.getUTCMinutes()) +
|
|
22
|
+
pad2(date.getUTCSeconds()) +
|
|
23
|
+
'Z');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse a version timestamp string back to a Date. Returns null if the input
|
|
27
|
+
* doesn't match the expected format.
|
|
28
|
+
*/
|
|
29
|
+
export function parseVersionTimestamp(stamp) {
|
|
30
|
+
const m = TIMESTAMP_RE.exec(stamp);
|
|
31
|
+
if (!m)
|
|
32
|
+
return null;
|
|
33
|
+
const [, y, mo, d, h, mi, s] = m;
|
|
34
|
+
const ms = Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(s));
|
|
35
|
+
if (Number.isNaN(ms))
|
|
36
|
+
return null;
|
|
37
|
+
return new Date(ms);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The pattern a valid version timestamp matches. Exported so other modules
|
|
41
|
+
* can validate filenames without re-deriving the regex.
|
|
42
|
+
*/
|
|
43
|
+
export const VERSION_TIMESTAMP_PATTERN = TIMESTAMP_RE;
|
|
44
|
+
//# sourceMappingURL=timestamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/versions/timestamp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,YAAY,GAAG,gDAAgD,CAAC;AAEtE,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAU;IAC/C,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,GAAG;QACH,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for the document version-history feature.
|
|
3
|
+
*
|
|
4
|
+
* Versions are snapshots of the primary markdown document stored alongside
|
|
5
|
+
* the document inside the same {@link ContentContainer}. They live under
|
|
6
|
+
* `.versions/<docBasename>.<sortableTimestamp>.md`. The container is the
|
|
7
|
+
* unit of persistence — when the host serializes the container to a ZIP,
|
|
8
|
+
* a real folder, or anywhere else, the version snapshots ride along.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* A single version snapshot record.
|
|
12
|
+
*/
|
|
13
|
+
export interface Version {
|
|
14
|
+
/** Container-relative path, e.g. `.versions/index.20260430T152030Z.md`. */
|
|
15
|
+
path: string;
|
|
16
|
+
/** Document basename without extension, e.g. `index`. */
|
|
17
|
+
basename: string;
|
|
18
|
+
/** Parsed timestamp from the filename, in UTC. */
|
|
19
|
+
timestamp: Date;
|
|
20
|
+
/** Snapshot size in bytes. */
|
|
21
|
+
size: number;
|
|
22
|
+
/**
|
|
23
|
+
* Collision suffix index. `0` for a path with no `-N` suffix, `1` for `-2`,
|
|
24
|
+
* `2` for `-3`, and so on. Used as the tie-break for ordering snapshots
|
|
25
|
+
* that share the same UTC second.
|
|
26
|
+
*/
|
|
27
|
+
collision: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Result of a {@link saveVersion} call.
|
|
31
|
+
*/
|
|
32
|
+
export interface SaveVersionResult {
|
|
33
|
+
/** True when a new snapshot file was actually written. */
|
|
34
|
+
saved: boolean;
|
|
35
|
+
/** The newly stamped version (only when `saved` is true). */
|
|
36
|
+
version: Version | null;
|
|
37
|
+
/**
|
|
38
|
+
* Why the save behaved the way it did:
|
|
39
|
+
* - `'saved'` — a new snapshot was written.
|
|
40
|
+
* - `'unchanged'` — current content matches the latest snapshot byte-for-byte.
|
|
41
|
+
* - `'no-document'` — the container has no primary markdown document.
|
|
42
|
+
* - `'empty'` — the resolved content was empty.
|
|
43
|
+
*/
|
|
44
|
+
reason: 'saved' | 'unchanged' | 'no-document' | 'empty';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Options for {@link saveVersion}.
|
|
48
|
+
*/
|
|
49
|
+
export interface SaveVersionOptions {
|
|
50
|
+
/** Override the document content; otherwise the container's primary doc is read. */
|
|
51
|
+
content?: string;
|
|
52
|
+
/** Override the timestamp; defaults to `new Date()`. Useful for tests. */
|
|
53
|
+
now?: Date;
|
|
54
|
+
/** Skip the diff-vs-latest check and force a write. */
|
|
55
|
+
force?: boolean;
|
|
56
|
+
/** Override the document basename used to build the version filename. */
|
|
57
|
+
basename?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Pruning policy passed to {@link pruneVersions}.
|
|
61
|
+
*/
|
|
62
|
+
export type PrunePolicy = {
|
|
63
|
+
type: 'keep-last-n';
|
|
64
|
+
n: number;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'older-than';
|
|
67
|
+
date: Date;
|
|
68
|
+
} | {
|
|
69
|
+
type: 'predicate';
|
|
70
|
+
keep: (v: Version, all: Version[]) => boolean;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Options for {@link revertToVersion}.
|
|
74
|
+
*/
|
|
75
|
+
export interface RevertOptions {
|
|
76
|
+
/**
|
|
77
|
+
* Whether to snapshot the current document content before replacing it.
|
|
78
|
+
* Defaults to `true` so a revert is always recoverable.
|
|
79
|
+
*/
|
|
80
|
+
snapshotCurrent?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Options for {@link coalesceVersions}.
|
|
84
|
+
*/
|
|
85
|
+
export interface CoalesceOptions {
|
|
86
|
+
/**
|
|
87
|
+
* Two adjacent snapshots whose timestamps are within `windowMs` collapse
|
|
88
|
+
* to the newer one. Defaults to 60_000 (one minute).
|
|
89
|
+
*/
|
|
90
|
+
windowMs?: number;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/versions/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,SAAS,EAAE,IAAI,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB;;;;;;OAMG;IACH,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAE,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for the document version-history feature.
|
|
3
|
+
*
|
|
4
|
+
* Versions are snapshots of the primary markdown document stored alongside
|
|
5
|
+
* the document inside the same {@link ContentContainer}. They live under
|
|
6
|
+
* `.versions/<docBasename>.<sortableTimestamp>.md`. The container is the
|
|
7
|
+
* unit of persistence — when the host serializes the container to a ZIP,
|
|
8
|
+
* a real folder, or anywhere else, the version snapshots ride along.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/versions/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bendyline/squisq",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Headless utilities for doc/block rendering, spatial math, Markdown, and storage",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Bendyline",
|
|
@@ -85,13 +85,40 @@
|
|
|
85
85
|
"types": "./dist/transform/index.d.ts",
|
|
86
86
|
"import": "./dist/transform/index.js",
|
|
87
87
|
"default": "./dist/transform/index.js"
|
|
88
|
+
},
|
|
89
|
+
"./versions": {
|
|
90
|
+
"types": "./dist/versions/index.d.ts",
|
|
91
|
+
"import": "./dist/versions/index.js",
|
|
92
|
+
"default": "./dist/versions/index.js"
|
|
93
|
+
},
|
|
94
|
+
"./jsonForm": {
|
|
95
|
+
"types": "./dist/jsonForm/index.d.ts",
|
|
96
|
+
"import": "./dist/jsonForm/index.js",
|
|
97
|
+
"default": "./dist/jsonForm/index.js"
|
|
98
|
+
},
|
|
99
|
+
"./imageEdit": {
|
|
100
|
+
"types": "./dist/imageEdit/index.d.ts",
|
|
101
|
+
"import": "./dist/imageEdit/index.js",
|
|
102
|
+
"default": "./dist/imageEdit/index.js"
|
|
103
|
+
},
|
|
104
|
+
"./icons": {
|
|
105
|
+
"types": "./dist/icons/index.d.ts",
|
|
106
|
+
"import": "./dist/icons/index.js",
|
|
107
|
+
"default": "./dist/icons/index.js"
|
|
108
|
+
},
|
|
109
|
+
"./recommend": {
|
|
110
|
+
"types": "./dist/recommend/index.d.ts",
|
|
111
|
+
"import": "./dist/recommend/index.js",
|
|
112
|
+
"default": "./dist/recommend/index.js"
|
|
88
113
|
}
|
|
89
114
|
},
|
|
90
115
|
"scripts": {
|
|
91
116
|
"build": "tsup",
|
|
117
|
+
"dev": "concurrently -n js,dts -c blue,gray -r \"tsup --watch --no-dts --no-clean\" \"tsup --watch --dts-only --no-clean\"",
|
|
92
118
|
"typecheck": "tsc --noEmit"
|
|
93
119
|
},
|
|
94
120
|
"dependencies": {
|
|
121
|
+
"genson-js": "0.0.8",
|
|
95
122
|
"hast-util-from-html": "2.0.3",
|
|
96
123
|
"localforage": "1.10.0",
|
|
97
124
|
"ngeohash": "0.6.3",
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
isHex,
|
|
4
|
+
oklchLighten,
|
|
5
|
+
oklchDarken,
|
|
6
|
+
oklchSetChroma,
|
|
7
|
+
contrastRatio,
|
|
8
|
+
pickContrastingText,
|
|
9
|
+
deriveScale,
|
|
10
|
+
relativeLuminance,
|
|
11
|
+
} from '../schemas/colorUtils.js';
|
|
12
|
+
|
|
13
|
+
describe('isHex', () => {
|
|
14
|
+
it('accepts #rgb and #rrggbb', () => {
|
|
15
|
+
expect(isHex('#fff')).toBe(true);
|
|
16
|
+
expect(isHex('#123abc')).toBe(true);
|
|
17
|
+
expect(isHex('#FF0080')).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it('rejects malformed strings', () => {
|
|
20
|
+
expect(isHex('fff')).toBe(false);
|
|
21
|
+
expect(isHex('#1234')).toBe(false);
|
|
22
|
+
expect(isHex('#xyz')).toBe(false);
|
|
23
|
+
expect(isHex('rgb(0,0,0)')).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('oklchLighten / oklchDarken', () => {
|
|
28
|
+
it('lighten produces a lighter color (higher luminance)', () => {
|
|
29
|
+
const dark = '#101010';
|
|
30
|
+
const lighter = oklchLighten(dark, 0.2);
|
|
31
|
+
expect(relativeLuminance(lighter)).toBeGreaterThan(relativeLuminance(dark));
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('darken produces a darker color (lower luminance)', () => {
|
|
35
|
+
const light = '#e0e0e0';
|
|
36
|
+
const darker = oklchDarken(light, 0.2);
|
|
37
|
+
expect(relativeLuminance(darker)).toBeLessThan(relativeLuminance(light));
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('round-trips approximately stable for moderate adjustments', () => {
|
|
41
|
+
const seed = '#3182ce';
|
|
42
|
+
const round = oklchDarken(oklchLighten(seed, 0.1), 0.1);
|
|
43
|
+
// sRGB gamut clamping prevents perfect round-trip; expect within a small epsilon.
|
|
44
|
+
expect(round).toMatch(/^#[0-9a-f]{6}$/);
|
|
45
|
+
const lumDiff = Math.abs(relativeLuminance(seed) - relativeLuminance(round));
|
|
46
|
+
expect(lumDiff).toBeLessThan(0.05);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('returns a hex string', () => {
|
|
50
|
+
expect(oklchLighten('#3182ce', 0.1)).toMatch(/^#[0-9a-f]{6}$/);
|
|
51
|
+
expect(oklchDarken('#3182ce', 0.1)).toMatch(/^#[0-9a-f]{6}$/);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('falls back to input on parse failure', () => {
|
|
55
|
+
expect(oklchLighten('not-a-color', 0.1)).toBe('not-a-color');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('oklchSetChroma', () => {
|
|
60
|
+
it('reducing chroma toward 0 desaturates a color', () => {
|
|
61
|
+
const vivid = '#ff3366';
|
|
62
|
+
const muted = oklchSetChroma(vivid, 0.1);
|
|
63
|
+
// Muted version's R/G/B channels should be much closer to each other than vivid.
|
|
64
|
+
const parse = (h: string) => [
|
|
65
|
+
parseInt(h.slice(1, 3), 16),
|
|
66
|
+
parseInt(h.slice(3, 5), 16),
|
|
67
|
+
parseInt(h.slice(5, 7), 16),
|
|
68
|
+
];
|
|
69
|
+
const [vr, vg, vb] = parse(vivid);
|
|
70
|
+
const [mr, mg, mb] = parse(muted);
|
|
71
|
+
const vSpread = Math.max(vr, vg, vb) - Math.min(vr, vg, vb);
|
|
72
|
+
const mSpread = Math.max(mr, mg, mb) - Math.min(mr, mg, mb);
|
|
73
|
+
expect(mSpread).toBeLessThan(vSpread);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('contrastRatio', () => {
|
|
78
|
+
it('white-on-black is the maximum (≈21)', () => {
|
|
79
|
+
expect(contrastRatio('#ffffff', '#000000')).toBeCloseTo(21, 0);
|
|
80
|
+
});
|
|
81
|
+
it('same-color is 1', () => {
|
|
82
|
+
expect(contrastRatio('#aabbcc', '#aabbcc')).toBeCloseTo(1, 5);
|
|
83
|
+
});
|
|
84
|
+
it('is symmetric', () => {
|
|
85
|
+
expect(contrastRatio('#222', '#ddd')).toBeCloseTo(contrastRatio('#ddd', '#222'), 5);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('pickContrastingText', () => {
|
|
90
|
+
it('returns dark text for light backgrounds', () => {
|
|
91
|
+
expect(pickContrastingText('#ffffff')).toBe('#1a202c');
|
|
92
|
+
expect(pickContrastingText('#f7fafc')).toBe('#1a202c');
|
|
93
|
+
});
|
|
94
|
+
it('returns light text for dark backgrounds', () => {
|
|
95
|
+
expect(pickContrastingText('#000000')).toBe('#f7fafc');
|
|
96
|
+
expect(pickContrastingText('#1a202c')).toBe('#f7fafc');
|
|
97
|
+
});
|
|
98
|
+
it('respects custom light/dark options', () => {
|
|
99
|
+
expect(pickContrastingText('#000000', '#fefefe', '#020202')).toBe('#fefefe');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('deriveScale', () => {
|
|
104
|
+
it('produces 5 stops with base in the middle', () => {
|
|
105
|
+
const scale = deriveScale('#3182ce', 0.15);
|
|
106
|
+
expect(scale.base).toBe('#3182ce');
|
|
107
|
+
expect(relativeLuminance(scale.lighter2)).toBeGreaterThan(relativeLuminance(scale.lighter1));
|
|
108
|
+
expect(relativeLuminance(scale.lighter1)).toBeGreaterThan(relativeLuminance(scale.base));
|
|
109
|
+
expect(relativeLuminance(scale.base)).toBeGreaterThan(relativeLuminance(scale.darker1));
|
|
110
|
+
expect(relativeLuminance(scale.darker1)).toBeGreaterThan(relativeLuminance(scale.darker2));
|
|
111
|
+
});
|
|
112
|
+
});
|
|
@@ -11,7 +11,7 @@ import type { Block, Layer, TextLayer, ShapeLayer } from '../schemas/Doc.js';
|
|
|
11
11
|
|
|
12
12
|
function makeTemplateBlock(overrides: Partial<TemplateBlock> = {}): TemplateBlock {
|
|
13
13
|
return {
|
|
14
|
-
template: '
|
|
14
|
+
template: 'title',
|
|
15
15
|
id: 'test-title-1',
|
|
16
16
|
duration: 5,
|
|
17
17
|
audioSegment: 0,
|
|
@@ -43,7 +43,7 @@ const defaultContext: RenderContext = {
|
|
|
43
43
|
|
|
44
44
|
describe('getLayers', () => {
|
|
45
45
|
it('generates layers for a known template block', () => {
|
|
46
|
-
const block = makeTemplateBlock({ template: '
|
|
46
|
+
const block = makeTemplateBlock({ template: 'title', title: 'Test Title' });
|
|
47
47
|
const layers = getLayers(block, defaultContext);
|
|
48
48
|
|
|
49
49
|
expect(Array.isArray(layers)).toBe(true);
|
|
@@ -83,6 +83,31 @@ describe('getLayers', () => {
|
|
|
83
83
|
expect(layers).toEqual(existingLayers);
|
|
84
84
|
});
|
|
85
85
|
|
|
86
|
+
it('resolves legacy template aliases through TEMPLATE_ALIASES', () => {
|
|
87
|
+
// Regression: `getLayers` previously did `block.template in templateRegistry`
|
|
88
|
+
// without alias resolution, so docs authored with the legacy long ids
|
|
89
|
+
// (`titleBlock`, `quoteBlock`, `mapBlock`, `listBlock`) rendered as
|
|
90
|
+
// empty SVG cards in the linear/document view — `hasTemplate()` accepts
|
|
91
|
+
// the alias, so `isAnnotatedBlock` returns true and the card wrapper
|
|
92
|
+
// renders, but the registry lookup below would miss the alias and the
|
|
93
|
+
// layer array came back empty.
|
|
94
|
+
const aliasedToCanonical: Array<[string, string]> = [
|
|
95
|
+
['titleBlock', 'title'],
|
|
96
|
+
['quoteBlock', 'quote'],
|
|
97
|
+
['listBlock', 'list'],
|
|
98
|
+
];
|
|
99
|
+
for (const [alias] of aliasedToCanonical) {
|
|
100
|
+
const block = makeTemplateBlock({
|
|
101
|
+
template: alias as TemplateBlock['template'],
|
|
102
|
+
title: 'Aliased',
|
|
103
|
+
items: ['a', 'b', 'c'],
|
|
104
|
+
quote: 'q',
|
|
105
|
+
} as Partial<TemplateBlock>);
|
|
106
|
+
const layers = getLayers(block, defaultContext);
|
|
107
|
+
expect(layers.length).toBeGreaterThan(0);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
86
111
|
it('returns empty array for unknown template', () => {
|
|
87
112
|
const block = {
|
|
88
113
|
template: 'totally_nonexistent',
|
|
@@ -103,7 +128,7 @@ describe('getLayers', () => {
|
|
|
103
128
|
});
|
|
104
129
|
|
|
105
130
|
it('uses default context values when context is omitted', () => {
|
|
106
|
-
const block = makeTemplateBlock({ template: '
|
|
131
|
+
const block = makeTemplateBlock({ template: 'title', title: 'Defaults' });
|
|
107
132
|
const layers = getLayers(block);
|
|
108
133
|
|
|
109
134
|
expect(Array.isArray(layers)).toBe(true);
|
|
@@ -147,7 +172,7 @@ describe('getLayers', () => {
|
|
|
147
172
|
};
|
|
148
173
|
|
|
149
174
|
it('injects persistent bottom and top layers around block layers', () => {
|
|
150
|
-
const block = makeTemplateBlock({ template: '
|
|
175
|
+
const block = makeTemplateBlock({ template: 'title', title: 'With Persistent' });
|
|
151
176
|
const layers = getLayers(block, { ...defaultContext, persistentLayers: persistentConfig });
|
|
152
177
|
|
|
153
178
|
// First layer should be the bottom persistent layer
|
|
@@ -160,7 +185,7 @@ describe('getLayers', () => {
|
|
|
160
185
|
|
|
161
186
|
it('respects useBottomLayer: false opt-out', () => {
|
|
162
187
|
const block = makeTemplateBlock({
|
|
163
|
-
template: '
|
|
188
|
+
template: 'title',
|
|
164
189
|
title: 'No Bottom',
|
|
165
190
|
useBottomLayer: false,
|
|
166
191
|
});
|
|
@@ -174,7 +199,7 @@ describe('getLayers', () => {
|
|
|
174
199
|
|
|
175
200
|
it('respects useTopLayer: false opt-out', () => {
|
|
176
201
|
const block = makeTemplateBlock({
|
|
177
|
-
template: '
|
|
202
|
+
template: 'title',
|
|
178
203
|
title: 'No Top',
|
|
179
204
|
useTopLayer: false,
|
|
180
205
|
});
|
|
@@ -187,7 +212,7 @@ describe('getLayers', () => {
|
|
|
187
212
|
});
|
|
188
213
|
|
|
189
214
|
it('skips injection when no persistent layers are configured', () => {
|
|
190
|
-
const block = makeTemplateBlock({ template: '
|
|
215
|
+
const block = makeTemplateBlock({ template: 'title', title: 'No Persistent' });
|
|
191
216
|
const withoutPersistent = getLayers(block, defaultContext);
|
|
192
217
|
const withEmptyPersistent = getLayers(block, {
|
|
193
218
|
...defaultContext,
|