@bendyline/squisq 1.3.0 → 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-Ch4tc3vv.d.ts → Doc-BeSeH2iX.d.ts} +118 -41
- 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__/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__/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-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/audioMapping.d.ts.map +1 -1
- package/dist/doc/audioMapping.js +42 -7
- 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 +135 -5
- package/dist/markdown/convert.js.map +1 -1
- package/dist/markdown/index.d.ts +1 -1
- 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 +17 -2
- 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 +70 -31
- package/dist/schemas/Theme.d.ts.map +1 -1
- package/dist/schemas/Theme.js +48 -16
- 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 -566
- 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-CkNttVSF.d.ts → types-BdZkdJ3z.d.ts} +17 -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__/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/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/themeLibrary-CEo2D4b6.d.ts +0 -44
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1",
|
|
3
|
+
"id": "minimalist",
|
|
4
|
+
"name": "Minimalist",
|
|
5
|
+
"description": "Clean near-white background with sans-serif type and minimal animation.",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#2d3748",
|
|
8
|
+
"secondary": "#4a5568",
|
|
9
|
+
"background": "#f7fafc",
|
|
10
|
+
"backgroundLight": "#edf2f7",
|
|
11
|
+
"text": "#1a202c",
|
|
12
|
+
"textMuted": "#718096",
|
|
13
|
+
"highlight": "#3182ce",
|
|
14
|
+
"warning": "#e53e3e"
|
|
15
|
+
},
|
|
16
|
+
"typography": {
|
|
17
|
+
"bodyFont": { "stackId": "inter" },
|
|
18
|
+
"titleFont": { "stackId": "inter" },
|
|
19
|
+
"titleWeight": "bold",
|
|
20
|
+
"lineHeight": 1.6
|
|
21
|
+
},
|
|
22
|
+
"style": {
|
|
23
|
+
"textShadow": false,
|
|
24
|
+
"overlayOpacity": 0.3,
|
|
25
|
+
"animationSpeed": 1.2,
|
|
26
|
+
"borderRadius": 8
|
|
27
|
+
},
|
|
28
|
+
"renderStyle": {
|
|
29
|
+
"name": "minimalist",
|
|
30
|
+
"defaultTextAnimation": "fadeIn",
|
|
31
|
+
"ambientMotion": false,
|
|
32
|
+
"defaultTransition": { "type": "fade", "duration": 0.6 },
|
|
33
|
+
"templateHints": {
|
|
34
|
+
"title": { "showAccentLine": false }
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"colorSchemes": {
|
|
38
|
+
"blue": { "bg": "#ebf8ff", "text": "#2b6cb0", "accent": "#3182ce" },
|
|
39
|
+
"green": { "bg": "#f0fff4", "text": "#276749", "accent": "#38a169" },
|
|
40
|
+
"purple": { "bg": "#faf5ff", "text": "#553c9a", "accent": "#805ad5" },
|
|
41
|
+
"red": { "bg": "#fff5f5", "text": "#c53030", "accent": "#e53e3e" },
|
|
42
|
+
"orange": { "bg": "#fffaf0", "text": "#c05621", "accent": "#dd6b20" },
|
|
43
|
+
"teal": { "bg": "#e6fffa", "text": "#285e61", "accent": "#319795" }
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1",
|
|
3
|
+
"id": "morning-light",
|
|
4
|
+
"name": "Morning Light",
|
|
5
|
+
"description": "Warm light background with dark text and gentle serif typography.",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#744210",
|
|
8
|
+
"secondary": "#975a16",
|
|
9
|
+
"background": "#faf8f5",
|
|
10
|
+
"backgroundLight": "#f5f0eb",
|
|
11
|
+
"text": "#2d3748",
|
|
12
|
+
"textMuted": "#718096",
|
|
13
|
+
"highlight": "#dd6b20",
|
|
14
|
+
"warning": "#c53030"
|
|
15
|
+
},
|
|
16
|
+
"typography": {
|
|
17
|
+
"bodyFont": { "stackId": "lora" },
|
|
18
|
+
"titleFont": { "stackId": "merriweather" },
|
|
19
|
+
"titleWeight": "bold",
|
|
20
|
+
"lineHeight": 1.7
|
|
21
|
+
},
|
|
22
|
+
"style": {
|
|
23
|
+
"textShadow": false,
|
|
24
|
+
"overlayOpacity": 0.35,
|
|
25
|
+
"animationSpeed": 1.1,
|
|
26
|
+
"borderRadius": 4
|
|
27
|
+
},
|
|
28
|
+
"renderStyle": {
|
|
29
|
+
"name": "morning-light",
|
|
30
|
+
"defaultTextAnimation": "fadeIn",
|
|
31
|
+
"ambientMotion": false,
|
|
32
|
+
"defaultTransition": { "type": "fade", "duration": 1.0 }
|
|
33
|
+
},
|
|
34
|
+
"colorSchemes": {
|
|
35
|
+
"blue": { "bg": "#ebf8ff", "text": "#2c5282", "accent": "#4299e1" },
|
|
36
|
+
"green": { "bg": "#f0fff4", "text": "#22543d", "accent": "#48bb78" },
|
|
37
|
+
"purple": { "bg": "#faf5ff", "text": "#44337a", "accent": "#9f7aea" },
|
|
38
|
+
"red": { "bg": "#fff5f5", "text": "#9b2c2c", "accent": "#fc8181" },
|
|
39
|
+
"orange": { "bg": "#fffaf0", "text": "#744210", "accent": "#ed8936" },
|
|
40
|
+
"teal": { "bg": "#e6fffa", "text": "#234e52", "accent": "#38b2ac" }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1",
|
|
3
|
+
"id": "standard-dark",
|
|
4
|
+
"name": "Standard Dark",
|
|
5
|
+
"description": "Standard, dark variant. System fonts, dark navy background, light text.",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#3182ce",
|
|
8
|
+
"secondary": "#4a5568",
|
|
9
|
+
"background": "#1a202c",
|
|
10
|
+
"backgroundLight": "#2d3748",
|
|
11
|
+
"text": "#f7fafc",
|
|
12
|
+
"textMuted": "#a0aec0",
|
|
13
|
+
"highlight": "#4299e1",
|
|
14
|
+
"warning": "#fc8181"
|
|
15
|
+
},
|
|
16
|
+
"typography": {
|
|
17
|
+
"bodyFont": { "stackId": "system-sans" },
|
|
18
|
+
"titleFont": { "stackId": "system-serif" },
|
|
19
|
+
"monoFont": { "stackId": "system-mono" },
|
|
20
|
+
"titleWeight": "bold"
|
|
21
|
+
},
|
|
22
|
+
"style": {
|
|
23
|
+
"textShadow": true,
|
|
24
|
+
"overlayOpacity": 0.45,
|
|
25
|
+
"animationSpeed": 1.0
|
|
26
|
+
},
|
|
27
|
+
"renderStyle": {
|
|
28
|
+
"name": "standard",
|
|
29
|
+
"defaultTextAnimation": "fadeIn",
|
|
30
|
+
"defaultImageAnimation": "slowZoom",
|
|
31
|
+
"ambientMotion": true,
|
|
32
|
+
"defaultTransition": { "type": "fade", "duration": 0.7 }
|
|
33
|
+
},
|
|
34
|
+
"colorSchemes": {
|
|
35
|
+
"blue": { "bg": "#1a365d", "text": "#63b3ed", "accent": "#90cdf4" },
|
|
36
|
+
"green": { "bg": "#22543d", "text": "#9ae6b4", "accent": "#68d391" },
|
|
37
|
+
"purple": { "bg": "#44337a", "text": "#d6bcfa", "accent": "#b794f4" },
|
|
38
|
+
"red": { "bg": "#742a2a", "text": "#fc8181", "accent": "#feb2b2" },
|
|
39
|
+
"orange": { "bg": "#744210", "text": "#fbd38d", "accent": "#f6ad55" },
|
|
40
|
+
"teal": { "bg": "#234e52", "text": "#81e6d9", "accent": "#4fd1c5" }
|
|
41
|
+
},
|
|
42
|
+
"persistentLayers": {
|
|
43
|
+
"bottomLayers": [
|
|
44
|
+
{
|
|
45
|
+
"template": "gradientBackground",
|
|
46
|
+
"config": { "type": "gradientBackground", "preset": "dark-vignette" }
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1",
|
|
3
|
+
"id": "standard",
|
|
4
|
+
"name": "Standard Light",
|
|
5
|
+
"description": "Clean and safe — black-on-white, system fonts only, no external font dependencies. Default theme.",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#2563eb",
|
|
8
|
+
"secondary": "#475569",
|
|
9
|
+
"background": "#ffffff",
|
|
10
|
+
"backgroundLight": "#f1f5f9",
|
|
11
|
+
"text": "#0f172a",
|
|
12
|
+
"textMuted": "#475569",
|
|
13
|
+
"highlight": "#1d4ed8",
|
|
14
|
+
"warning": "#dc2626"
|
|
15
|
+
},
|
|
16
|
+
"typography": {
|
|
17
|
+
"bodyFont": { "stackId": "system-sans" },
|
|
18
|
+
"titleFont": { "stackId": "system-serif" },
|
|
19
|
+
"monoFont": { "stackId": "system-mono" },
|
|
20
|
+
"titleWeight": "bold"
|
|
21
|
+
},
|
|
22
|
+
"style": {
|
|
23
|
+
"textShadow": false,
|
|
24
|
+
"overlayOpacity": 0.35,
|
|
25
|
+
"animationSpeed": 1.0
|
|
26
|
+
},
|
|
27
|
+
"renderStyle": {
|
|
28
|
+
"name": "standard",
|
|
29
|
+
"defaultTextAnimation": "fadeIn",
|
|
30
|
+
"defaultImageAnimation": "slowZoom",
|
|
31
|
+
"ambientMotion": true,
|
|
32
|
+
"defaultTransition": { "type": "fade", "duration": 0.7 }
|
|
33
|
+
},
|
|
34
|
+
"colorSchemes": {
|
|
35
|
+
"blue": { "bg": "#dbeafe", "text": "#1d4ed8", "accent": "#2563eb" },
|
|
36
|
+
"green": { "bg": "#dcfce7", "text": "#166534", "accent": "#16a34a" },
|
|
37
|
+
"purple": { "bg": "#ede9fe", "text": "#5b21b6", "accent": "#7c3aed" },
|
|
38
|
+
"red": { "bg": "#fee2e2", "text": "#991b1b", "accent": "#dc2626" },
|
|
39
|
+
"orange": { "bg": "#ffedd5", "text": "#9a3412", "accent": "#ea580c" },
|
|
40
|
+
"teal": { "bg": "#ccfbf1", "text": "#115e59", "accent": "#0d9488" }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1",
|
|
3
|
+
"id": "tech-dark",
|
|
4
|
+
"name": "Tech Dark",
|
|
5
|
+
"description": "True black with neon cyan/green accents and monospace titles.",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#00e5ff",
|
|
8
|
+
"secondary": "#00e676",
|
|
9
|
+
"background": "#0a0a0a",
|
|
10
|
+
"backgroundLight": "#1a1a2e",
|
|
11
|
+
"text": "#e0e0e0",
|
|
12
|
+
"textMuted": "#9e9e9e",
|
|
13
|
+
"highlight": "#00e5ff",
|
|
14
|
+
"warning": "#ff5252"
|
|
15
|
+
},
|
|
16
|
+
"typography": {
|
|
17
|
+
"bodyFont": { "stackId": "ibm-plex-sans" },
|
|
18
|
+
"titleFont": { "stackId": "jetbrains-mono" },
|
|
19
|
+
"monoFont": { "stackId": "jetbrains-mono" },
|
|
20
|
+
"titleWeight": "bold",
|
|
21
|
+
"titleScale": 0.9,
|
|
22
|
+
"lineHeight": 1.5
|
|
23
|
+
},
|
|
24
|
+
"style": {
|
|
25
|
+
"textShadow": true,
|
|
26
|
+
"overlayOpacity": 0.55,
|
|
27
|
+
"animationSpeed": 0.9,
|
|
28
|
+
"borderRadius": 2
|
|
29
|
+
},
|
|
30
|
+
"renderStyle": {
|
|
31
|
+
"name": "tech-dark",
|
|
32
|
+
"defaultTextAnimation": "typewriter",
|
|
33
|
+
"defaultImageAnimation": "slowZoom",
|
|
34
|
+
"ambientMotion": true,
|
|
35
|
+
"defaultTransition": { "type": "dissolve", "duration": 0.4 },
|
|
36
|
+
"templateHints": {
|
|
37
|
+
"statHighlight": { "entrance": "dramatic" }
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"colorSchemes": {
|
|
41
|
+
"blue": { "bg": "#0d1b2a", "text": "#00b0ff", "accent": "#40c4ff" },
|
|
42
|
+
"green": { "bg": "#0d1b0d", "text": "#00e676", "accent": "#69f0ae" },
|
|
43
|
+
"purple": { "bg": "#1a0d2e", "text": "#d500f9", "accent": "#ea80fc" },
|
|
44
|
+
"red": { "bg": "#2e0d0d", "text": "#ff5252", "accent": "#ff8a80" },
|
|
45
|
+
"orange": { "bg": "#2e1a0d", "text": "#ff9100", "accent": "#ffab40" },
|
|
46
|
+
"teal": { "bg": "#0d2e2e", "text": "#1de9b6", "accent": "#64ffda" }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1",
|
|
3
|
+
"id": "warm-earth",
|
|
4
|
+
"name": "Warm Earth",
|
|
5
|
+
"description": "Natural warm tones with earthy browns and terracotta accents.",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#9c4221",
|
|
8
|
+
"secondary": "#c05621",
|
|
9
|
+
"background": "#1c1410",
|
|
10
|
+
"backgroundLight": "#2d241e",
|
|
11
|
+
"text": "#faf5f0",
|
|
12
|
+
"textMuted": "#c4a882",
|
|
13
|
+
"highlight": "#dd6b20",
|
|
14
|
+
"warning": "#e53e3e"
|
|
15
|
+
},
|
|
16
|
+
"typography": {
|
|
17
|
+
"bodyFont": { "stackId": "pt-serif" },
|
|
18
|
+
"titleFont": { "stackId": "pt-serif" },
|
|
19
|
+
"titleWeight": "bold",
|
|
20
|
+
"lineHeight": 1.6
|
|
21
|
+
},
|
|
22
|
+
"style": {
|
|
23
|
+
"textShadow": true,
|
|
24
|
+
"overlayOpacity": 0.5,
|
|
25
|
+
"animationSpeed": 1.1
|
|
26
|
+
},
|
|
27
|
+
"renderStyle": {
|
|
28
|
+
"name": "warm-earth",
|
|
29
|
+
"defaultTextAnimation": "fadeIn",
|
|
30
|
+
"defaultImageAnimation": "panLeft",
|
|
31
|
+
"ambientMotion": true,
|
|
32
|
+
"defaultTransition": { "type": "fade", "duration": 0.9 }
|
|
33
|
+
},
|
|
34
|
+
"colorSchemes": {
|
|
35
|
+
"blue": { "bg": "#2a1f14", "text": "#90cdf4", "accent": "#63b3ed" },
|
|
36
|
+
"green": { "bg": "#1e2a14", "text": "#9ae6b4", "accent": "#68d391" },
|
|
37
|
+
"purple": { "bg": "#2a142a", "text": "#d6bcfa", "accent": "#b794f4" },
|
|
38
|
+
"red": { "bg": "#2a1414", "text": "#fc8181", "accent": "#feb2b2" },
|
|
39
|
+
"orange": { "bg": "#2a1e0a", "text": "#fbd38d", "accent": "#f6ad55" },
|
|
40
|
+
"teal": { "bg": "#142a28", "text": "#81e6d9", "accent": "#4fd1c5" }
|
|
41
|
+
},
|
|
42
|
+
"persistentLayers": {
|
|
43
|
+
"bottomLayers": [
|
|
44
|
+
{
|
|
45
|
+
"template": "gradientBackground",
|
|
46
|
+
"config": { "type": "gradientBackground", "preset": "earth-tones" }
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScopedContentContainer
|
|
3
|
+
*
|
|
4
|
+
* Wraps a parent {@link ContentContainer} and prefixes every path with a
|
|
5
|
+
* fixed subfolder, presenting that subfolder as the root. Useful for
|
|
6
|
+
* sidecar folders (e.g. `<imagebasename>_files/`) where a component
|
|
7
|
+
* should be able to read/write/list files relative to its own root
|
|
8
|
+
* without knowing where it lives in the parent tree.
|
|
9
|
+
*
|
|
10
|
+
* Scopes nest: `scopeContainer(scopeContainer(parent, 'a'), 'b')` is
|
|
11
|
+
* equivalent to `scopeContainer(parent, 'a/b')`.
|
|
12
|
+
*
|
|
13
|
+
* `getDocumentPath()` always returns `null` for scoped sidecars — they
|
|
14
|
+
* are not document roots.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { ContentContainer, ContentEntry } from './ContentContainer.js';
|
|
18
|
+
|
|
19
|
+
/** Normalize a prefix: strip leading/trailing slashes, ensure no `..` segments. */
|
|
20
|
+
function normalizePrefix(prefix: string): string {
|
|
21
|
+
let p = prefix.trim();
|
|
22
|
+
while (p.startsWith('/')) p = p.slice(1);
|
|
23
|
+
while (p.endsWith('/')) p = p.slice(0, -1);
|
|
24
|
+
if (p.length === 0) {
|
|
25
|
+
throw new Error('ScopedContentContainer: prefix must not be empty');
|
|
26
|
+
}
|
|
27
|
+
if (p.split('/').some((seg) => seg === '..' || seg === '.')) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`ScopedContentContainer: prefix must not contain '.' or '..' segments: ${prefix}`,
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
return p;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A ContentContainer view rooted at a subfolder of a parent container.
|
|
37
|
+
* All paths passed to / returned from this container are relative to
|
|
38
|
+
* the subfolder; the parent never sees an unprefixed path.
|
|
39
|
+
*/
|
|
40
|
+
export class ScopedContentContainer implements ContentContainer {
|
|
41
|
+
private readonly parent: ContentContainer;
|
|
42
|
+
/** Prefix without trailing slash. */
|
|
43
|
+
readonly prefix: string;
|
|
44
|
+
/** Prefix with trailing slash. */
|
|
45
|
+
private readonly prefixSlash: string;
|
|
46
|
+
|
|
47
|
+
constructor(parent: ContentContainer, prefix: string) {
|
|
48
|
+
this.parent = parent;
|
|
49
|
+
this.prefix = normalizePrefix(prefix);
|
|
50
|
+
this.prefixSlash = `${this.prefix}/`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private toParent(path: string): string {
|
|
54
|
+
let p = path;
|
|
55
|
+
while (p.startsWith('/')) p = p.slice(1);
|
|
56
|
+
return this.prefixSlash + p;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Strip the prefix from a parent-space path. Returns null if the path is outside the scope. */
|
|
60
|
+
private fromParent(parentPath: string): string | null {
|
|
61
|
+
if (!parentPath.startsWith(this.prefixSlash)) return null;
|
|
62
|
+
return parentPath.slice(this.prefixSlash.length);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
readFile(path: string): Promise<ArrayBuffer | null> {
|
|
66
|
+
return this.parent.readFile(this.toParent(path));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
writeFile(path: string, data: ArrayBuffer | Uint8Array, mimeType?: string): Promise<void> {
|
|
70
|
+
return this.parent.writeFile(this.toParent(path), data, mimeType);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
removeFile(path: string): Promise<void> {
|
|
74
|
+
return this.parent.removeFile(this.toParent(path));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async listFiles(prefix?: string): Promise<ContentEntry[]> {
|
|
78
|
+
const parentPrefix = prefix ? this.toParent(prefix) : this.prefixSlash;
|
|
79
|
+
const entries = await this.parent.listFiles(parentPrefix);
|
|
80
|
+
const out: ContentEntry[] = [];
|
|
81
|
+
for (const e of entries) {
|
|
82
|
+
const local = this.fromParent(e.path);
|
|
83
|
+
if (local === null) continue;
|
|
84
|
+
out.push({ path: local, mimeType: e.mimeType, size: e.size });
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
exists(path: string): Promise<boolean> {
|
|
90
|
+
return this.parent.exists(this.toParent(path));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Sidecars are not document roots. */
|
|
94
|
+
async getDocumentPath(): Promise<string | null> {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async readDocument(): Promise<string | null> {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async writeDocument(): Promise<void> {
|
|
103
|
+
throw new Error(
|
|
104
|
+
'ScopedContentContainer is a sidecar view and does not support writeDocument(). ' +
|
|
105
|
+
'Write to a specific path with writeFile() instead.',
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Factory: convenience wrapper for `new ScopedContentContainer(parent, prefix)`. */
|
|
111
|
+
export function scopeContainer(parent: ContentContainer, prefix: string): ScopedContentContainer {
|
|
112
|
+
return new ScopedContentContainer(parent, prefix);
|
|
113
|
+
}
|
package/src/storage/index.ts
CHANGED
|
@@ -5,4 +5,5 @@ export { LocalForageAdapter } from './LocalForageAdapter.js';
|
|
|
5
5
|
export type { LocalForageAdapterOptions } from './LocalForageAdapter.js';
|
|
6
6
|
export type { ContentContainer, ContentEntry } from './ContentContainer.js';
|
|
7
7
|
export { MemoryContentContainer, findDocumentPath } from './ContentContainer.js';
|
|
8
|
+
export { ScopedContentContainer, scopeContainer } from './ScopedContentContainer.js';
|
|
8
9
|
export { createMediaProviderFromContainer } from './MediaProviderFromContainer.js';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience wrapper around the version operations that captures a
|
|
3
|
+
* {@link ContentContainer} reference and an optional basename override.
|
|
4
|
+
*
|
|
5
|
+
* Hosts that prefer a stable handle (e.g. to pass into a UI component)
|
|
6
|
+
* use this; everything it does is also reachable as a free function.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
10
|
+
import {
|
|
11
|
+
coalesceVersions,
|
|
12
|
+
listVersions,
|
|
13
|
+
pruneVersions,
|
|
14
|
+
readVersion,
|
|
15
|
+
revertToVersion,
|
|
16
|
+
saveVersion,
|
|
17
|
+
} from './operations.js';
|
|
18
|
+
import type {
|
|
19
|
+
CoalesceOptions,
|
|
20
|
+
PrunePolicy,
|
|
21
|
+
RevertOptions,
|
|
22
|
+
SaveVersionOptions,
|
|
23
|
+
SaveVersionResult,
|
|
24
|
+
Version,
|
|
25
|
+
} from './types.js';
|
|
26
|
+
|
|
27
|
+
export interface DocumentVersionManagerOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Override the document basename used in version filenames. Defaults to
|
|
30
|
+
* the basename of `container.getDocumentPath()` resolved at call time.
|
|
31
|
+
*/
|
|
32
|
+
basename?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class DocumentVersionManager {
|
|
36
|
+
private readonly container: ContentContainer;
|
|
37
|
+
private readonly basename: string | undefined;
|
|
38
|
+
|
|
39
|
+
constructor(container: ContentContainer, options: DocumentVersionManagerOptions = {}) {
|
|
40
|
+
this.container = container;
|
|
41
|
+
this.basename = options.basename;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
saveVersion(options: SaveVersionOptions = {}): Promise<SaveVersionResult> {
|
|
45
|
+
return saveVersion(this.container, { basename: this.basename, ...options });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
listVersions(): Promise<Version[]> {
|
|
49
|
+
return listVersions(this.container, this.basename);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
readVersion(version: Version | string): Promise<string | null> {
|
|
53
|
+
return readVersion(this.container, version);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
revertToVersion(
|
|
57
|
+
version: Version | string,
|
|
58
|
+
options?: RevertOptions,
|
|
59
|
+
): Promise<{ reverted: boolean; snapshotted: Version | null }> {
|
|
60
|
+
return revertToVersion(this.container, version, options);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
pruneVersions(policy: PrunePolicy): Promise<Version[]> {
|
|
64
|
+
return pruneVersions(this.container, policy, this.basename);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
coalesceVersions(options?: CoalesceOptions): Promise<Version[]> {
|
|
68
|
+
return coalesceVersions(this.container, options, this.basename);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document version history for Squisq.
|
|
3
|
+
*
|
|
4
|
+
* Snapshots of the primary markdown document live inside the same
|
|
5
|
+
* {@link ContentContainer} at `.versions/<basename>.<timestamp>.md`.
|
|
6
|
+
* Hosts call {@link DocumentVersionManager.saveVersion} (or the
|
|
7
|
+
* underlying {@link saveVersion}) when they want to stamp a new version;
|
|
8
|
+
* the editor's auto-save effect calls it on idle. Either way, snapshots
|
|
9
|
+
* are written only when the document differs from the latest one.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { DocumentVersionManager } from '@bendyline/squisq/versions';
|
|
14
|
+
*
|
|
15
|
+
* const versioning = new DocumentVersionManager(container);
|
|
16
|
+
* const result = await versioning.saveVersion();
|
|
17
|
+
* if (result.saved) console.log('Stamped', result.version);
|
|
18
|
+
*
|
|
19
|
+
* const history = await versioning.listVersions();
|
|
20
|
+
* await versioning.revertToVersion(history[0]);
|
|
21
|
+
* await versioning.pruneVersions({ type: 'keep-last-n', n: 50 });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export type {
|
|
26
|
+
Version,
|
|
27
|
+
SaveVersionOptions,
|
|
28
|
+
SaveVersionResult,
|
|
29
|
+
PrunePolicy,
|
|
30
|
+
RevertOptions,
|
|
31
|
+
CoalesceOptions,
|
|
32
|
+
} from './types.js';
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
saveVersion,
|
|
36
|
+
listVersions,
|
|
37
|
+
readVersion,
|
|
38
|
+
revertToVersion,
|
|
39
|
+
pruneVersions,
|
|
40
|
+
coalesceVersions,
|
|
41
|
+
} from './operations.js';
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
DocumentVersionManager,
|
|
45
|
+
type DocumentVersionManagerOptions,
|
|
46
|
+
} from './DocumentVersionManager.js';
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
formatVersionTimestamp,
|
|
50
|
+
parseVersionTimestamp,
|
|
51
|
+
VERSION_TIMESTAMP_PATTERN,
|
|
52
|
+
} from './timestamp.js';
|
|
53
|
+
|
|
54
|
+
export { VERSIONS_PREFIX, getDocBasename, buildVersionPath, parseVersionPath } from './paths.js';
|