@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 @@
|
|
|
1
|
+
{"version":3,"file":"iconData.js","sourceRoot":"","sources":["../../src/icons/iconData.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,MAAM,UAAU,GACd,04jaAA04ja,CAAC;AAE74ja,MAAM,CAAC,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icons barrel — subpath `@bendyline/squisq/icons`.
|
|
3
|
+
*
|
|
4
|
+
* Exposes the FontAwesome Free catalog (`ICONS`, `IconEntry`,
|
|
5
|
+
* `IconFamily`) and the lookup helpers (`resolveIcon`,
|
|
6
|
+
* `canonicalIconToken`, `looksLikeIconToken`).
|
|
7
|
+
*/
|
|
8
|
+
export { ICONS } from './iconData.js';
|
|
9
|
+
export type { IconEntry, IconFamily } from './iconData.js';
|
|
10
|
+
export { resolveIcon, canonicalIconToken, looksLikeIconToken, suggestIcons, iconGlyph, } from './resolve.js';
|
|
11
|
+
export type { IconSuggestion } from './resolve.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icons barrel — subpath `@bendyline/squisq/icons`.
|
|
3
|
+
*
|
|
4
|
+
* Exposes the FontAwesome Free catalog (`ICONS`, `IconEntry`,
|
|
5
|
+
* `IconFamily`) and the lookup helpers (`resolveIcon`,
|
|
6
|
+
* `canonicalIconToken`, `looksLikeIconToken`).
|
|
7
|
+
*/
|
|
8
|
+
export { ICONS } from './iconData.js';
|
|
9
|
+
export { resolveIcon, canonicalIconToken, looksLikeIconToken, suggestIcons, iconGlyph, } from './resolve.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon Resolver
|
|
3
|
+
*
|
|
4
|
+
* Looks up a user-supplied token against the FontAwesome Free catalog.
|
|
5
|
+
*
|
|
6
|
+
* Tokens come in two forms:
|
|
7
|
+
* - **Bare** (`github`) — resolves only when the name is unique across
|
|
8
|
+
* families. The picker prefers this form for friendliness.
|
|
9
|
+
* - **Qualified** (`fa-brands:github`, `fa-solid:user`) — required when
|
|
10
|
+
* the name collides across families (e.g. `user` ships in both solid
|
|
11
|
+
* and regular).
|
|
12
|
+
*
|
|
13
|
+
* Returning `null` from `resolveIcon` is a deliberate signal: callers
|
|
14
|
+
* should render the source token verbatim so authors can write
|
|
15
|
+
* `{[notathing]}` in prose without it being silently swallowed.
|
|
16
|
+
*/
|
|
17
|
+
import type { IconEntry, IconFamily } from './iconData.js';
|
|
18
|
+
/**
|
|
19
|
+
* True when a token looks like an icon reference. Used by the markdown
|
|
20
|
+
* parser to decide whether a `{[…]}` body in a heading is worth probing
|
|
21
|
+
* (the heading-template path already extracted the trailing annotation
|
|
22
|
+
* by the time inline detection runs).
|
|
23
|
+
*/
|
|
24
|
+
export declare function looksLikeIconToken(token: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve a token to an icon. Returns `null` when the token is unknown
|
|
27
|
+
* OR when the bare form collides — callers should render `null` results
|
|
28
|
+
* as literal markdown text so authors can opt out by qualifying.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveIcon(token: string): IconEntry | null;
|
|
31
|
+
/**
|
|
32
|
+
* The canonical "shortest unambiguous" token for an icon — bare if the
|
|
33
|
+
* name is unique, otherwise the qualified form. Used when serializing
|
|
34
|
+
* a resolved icon back to markdown so we don't gratuitously qualify
|
|
35
|
+
* names that don't need it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function canonicalIconToken(entry: IconEntry): string;
|
|
38
|
+
/**
|
|
39
|
+
* Render the icon's Unicode codepoint as a single-character string.
|
|
40
|
+
* Returns `''` for entries without a codepoint (defensive — FA always
|
|
41
|
+
* has one). Used by editors and previews that want to display the
|
|
42
|
+
* actual glyph using the FontAwesome font; pair with the right
|
|
43
|
+
* font-family/font-weight for the icon's family.
|
|
44
|
+
*/
|
|
45
|
+
export declare function iconGlyph(entry: IconEntry): string;
|
|
46
|
+
/** Single autocomplete suggestion. `score` ranks lower-is-better:
|
|
47
|
+
* 0 = name starts-with query, 1 = name contains query,
|
|
48
|
+
* 2 = keyword contains query. */
|
|
49
|
+
export interface IconSuggestion {
|
|
50
|
+
entry: IconEntry;
|
|
51
|
+
token: string;
|
|
52
|
+
score: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Rank icons against a partial token typed by the user. Used by the
|
|
56
|
+
* Monaco completion provider in editor-react and re-exported so any
|
|
57
|
+
* host can build its own typeahead.
|
|
58
|
+
*/
|
|
59
|
+
export declare function suggestIcons(query: string, limit?: number): IconSuggestion[];
|
|
60
|
+
export type { IconEntry, IconFamily };
|
|
61
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/icons/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoB3D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgB3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAI3D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAKlD;AAED;;kCAEkC;AAClC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,cAAc,EAAE,CAyBxE;AAED,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon Resolver
|
|
3
|
+
*
|
|
4
|
+
* Looks up a user-supplied token against the FontAwesome Free catalog.
|
|
5
|
+
*
|
|
6
|
+
* Tokens come in two forms:
|
|
7
|
+
* - **Bare** (`github`) — resolves only when the name is unique across
|
|
8
|
+
* families. The picker prefers this form for friendliness.
|
|
9
|
+
* - **Qualified** (`fa-brands:github`, `fa-solid:user`) — required when
|
|
10
|
+
* the name collides across families (e.g. `user` ships in both solid
|
|
11
|
+
* and regular).
|
|
12
|
+
*
|
|
13
|
+
* Returning `null` from `resolveIcon` is a deliberate signal: callers
|
|
14
|
+
* should render the source token verbatim so authors can write
|
|
15
|
+
* `{[notathing]}` in prose without it being silently swallowed.
|
|
16
|
+
*/
|
|
17
|
+
import { ICONS } from './iconData.js';
|
|
18
|
+
// Index built once per module: name → IconEntry[]. Multi-entry buckets
|
|
19
|
+
// indicate cross-family collisions that require a qualified token.
|
|
20
|
+
const BY_NAME = new Map();
|
|
21
|
+
for (const entry of ICONS) {
|
|
22
|
+
const bucket = BY_NAME.get(entry.name);
|
|
23
|
+
if (bucket)
|
|
24
|
+
bucket.push(entry);
|
|
25
|
+
else
|
|
26
|
+
BY_NAME.set(entry.name, [entry]);
|
|
27
|
+
}
|
|
28
|
+
const FAMILY_PREFIXES = {
|
|
29
|
+
'fa-brands': 'brands',
|
|
30
|
+
'fa-solid': 'solid',
|
|
31
|
+
'fa-regular': 'regular',
|
|
32
|
+
brands: 'brands',
|
|
33
|
+
solid: 'solid',
|
|
34
|
+
regular: 'regular',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* True when a token looks like an icon reference. Used by the markdown
|
|
38
|
+
* parser to decide whether a `{[…]}` body in a heading is worth probing
|
|
39
|
+
* (the heading-template path already extracted the trailing annotation
|
|
40
|
+
* by the time inline detection runs).
|
|
41
|
+
*/
|
|
42
|
+
export function looksLikeIconToken(token) {
|
|
43
|
+
return /^[a-zA-Z0-9_:-]+$/.test(token);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a token to an icon. Returns `null` when the token is unknown
|
|
47
|
+
* OR when the bare form collides — callers should render `null` results
|
|
48
|
+
* as literal markdown text so authors can opt out by qualifying.
|
|
49
|
+
*/
|
|
50
|
+
export function resolveIcon(token) {
|
|
51
|
+
if (!looksLikeIconToken(token))
|
|
52
|
+
return null;
|
|
53
|
+
// Qualified form: `<family-prefix>:<name>`.
|
|
54
|
+
const colon = token.indexOf(':');
|
|
55
|
+
if (colon > 0) {
|
|
56
|
+
const prefix = token.slice(0, colon);
|
|
57
|
+
const name = token.slice(colon + 1);
|
|
58
|
+
const family = FAMILY_PREFIXES[prefix];
|
|
59
|
+
if (!family)
|
|
60
|
+
return null;
|
|
61
|
+
const bucket = BY_NAME.get(name);
|
|
62
|
+
return bucket?.find((e) => e.family === family) ?? null;
|
|
63
|
+
}
|
|
64
|
+
// Bare form: must be unique across families.
|
|
65
|
+
const bucket = BY_NAME.get(token);
|
|
66
|
+
if (!bucket || bucket.length !== 1)
|
|
67
|
+
return null;
|
|
68
|
+
return bucket[0];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The canonical "shortest unambiguous" token for an icon — bare if the
|
|
72
|
+
* name is unique, otherwise the qualified form. Used when serializing
|
|
73
|
+
* a resolved icon back to markdown so we don't gratuitously qualify
|
|
74
|
+
* names that don't need it.
|
|
75
|
+
*/
|
|
76
|
+
export function canonicalIconToken(entry) {
|
|
77
|
+
const bucket = BY_NAME.get(entry.name);
|
|
78
|
+
if (bucket && bucket.length === 1)
|
|
79
|
+
return entry.name;
|
|
80
|
+
return `fa-${entry.family}:${entry.name}`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Render the icon's Unicode codepoint as a single-character string.
|
|
84
|
+
* Returns `''` for entries without a codepoint (defensive — FA always
|
|
85
|
+
* has one). Used by editors and previews that want to display the
|
|
86
|
+
* actual glyph using the FontAwesome font; pair with the right
|
|
87
|
+
* font-family/font-weight for the icon's family.
|
|
88
|
+
*/
|
|
89
|
+
export function iconGlyph(entry) {
|
|
90
|
+
if (!entry.unicode)
|
|
91
|
+
return '';
|
|
92
|
+
const code = parseInt(entry.unicode, 16);
|
|
93
|
+
if (!Number.isFinite(code))
|
|
94
|
+
return '';
|
|
95
|
+
return String.fromCodePoint(code);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Rank icons against a partial token typed by the user. Used by the
|
|
99
|
+
* Monaco completion provider in editor-react and re-exported so any
|
|
100
|
+
* host can build its own typeahead.
|
|
101
|
+
*/
|
|
102
|
+
export function suggestIcons(query, limit = 50) {
|
|
103
|
+
const q = query.trim().toLowerCase();
|
|
104
|
+
const matches = [];
|
|
105
|
+
for (const icon of ICONS) {
|
|
106
|
+
let score = -1;
|
|
107
|
+
if (!q) {
|
|
108
|
+
// Empty query — surface a few common icons. We just walk in
|
|
109
|
+
// order; the limit cuts it off.
|
|
110
|
+
score = 3;
|
|
111
|
+
}
|
|
112
|
+
else if (icon.name.startsWith(q)) {
|
|
113
|
+
score = 0;
|
|
114
|
+
}
|
|
115
|
+
else if (icon.name.includes(q)) {
|
|
116
|
+
score = 1;
|
|
117
|
+
}
|
|
118
|
+
else if (icon.keywords.includes(q)) {
|
|
119
|
+
score = 2;
|
|
120
|
+
}
|
|
121
|
+
if (score < 0)
|
|
122
|
+
continue;
|
|
123
|
+
matches.push({ entry: icon, token: canonicalIconToken(icon), score });
|
|
124
|
+
if (matches.length > 400)
|
|
125
|
+
break; // hard cap before sort
|
|
126
|
+
}
|
|
127
|
+
matches.sort((a, b) => a.score - b.score || a.token.length - b.token.length || a.token.localeCompare(b.token));
|
|
128
|
+
return matches.slice(0, limit);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/icons/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience wrapper around the image-edit version operations that
|
|
3
|
+
* captures a {@link ContentContainer} reference and an optional basename
|
|
4
|
+
* override. Mirrors `DocumentVersionManager` in shape.
|
|
5
|
+
*/
|
|
6
|
+
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
7
|
+
import type { CoalesceOptions, PrunePolicy, Version } from '../versions/types.js';
|
|
8
|
+
import { type RevertImageEditOptions, type SaveImageEditVersionOptions, type SaveImageEditVersionResult } from './versions.js';
|
|
9
|
+
import type { ImageEditDoc } from '../schemas/ImageEditDoc.js';
|
|
10
|
+
export interface ImageEditVersionManagerOptions {
|
|
11
|
+
/** Override the basename used in version filenames. Defaults to `'state'`. */
|
|
12
|
+
basename?: string;
|
|
13
|
+
/** Override the source filename inside the sidecar. Defaults to `state.json`. */
|
|
14
|
+
stateFilename?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class ImageEditVersionManager {
|
|
17
|
+
private readonly container;
|
|
18
|
+
private readonly basename;
|
|
19
|
+
private readonly stateFilename;
|
|
20
|
+
constructor(container: ContentContainer, options?: ImageEditVersionManagerOptions);
|
|
21
|
+
saveVersion(options?: SaveImageEditVersionOptions): Promise<SaveImageEditVersionResult>;
|
|
22
|
+
listVersions(): Promise<Version[]>;
|
|
23
|
+
readVersion(version: Version | string): Promise<ImageEditDoc | null>;
|
|
24
|
+
revertToVersion(version: Version | string, options?: RevertImageEditOptions): Promise<{
|
|
25
|
+
reverted: boolean;
|
|
26
|
+
snapshotted: Version | null;
|
|
27
|
+
}>;
|
|
28
|
+
pruneVersions(policy: PrunePolicy): Promise<Version[]>;
|
|
29
|
+
coalesceVersions(options?: CoalesceOptions): Promise<Version[]>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ImageEditVersionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditVersionManager.d.ts","sourceRoot":"","sources":["../../src/imageEdit/ImageEditVersionManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAChC,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,8BAA8B;IAC7C,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEvC,SAAS,EAAE,gBAAgB,EAAE,OAAO,GAAE,8BAAmC;IAMrF,WAAW,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAQ3F,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIlC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIpE,eAAe,CACb,OAAO,EAAE,OAAO,GAAG,MAAM,EACzB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IAO9D,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAItD,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAGpE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience wrapper around the image-edit version operations that
|
|
3
|
+
* captures a {@link ContentContainer} reference and an optional basename
|
|
4
|
+
* override. Mirrors `DocumentVersionManager` in shape.
|
|
5
|
+
*/
|
|
6
|
+
import { coalesceImageEditVersions, listImageEditVersions, pruneImageEditVersions, readImageEditVersion, revertToImageEditVersion, saveImageEditVersion, } from './versions.js';
|
|
7
|
+
export class ImageEditVersionManager {
|
|
8
|
+
constructor(container, options = {}) {
|
|
9
|
+
this.container = container;
|
|
10
|
+
this.basename = options.basename;
|
|
11
|
+
this.stateFilename = options.stateFilename;
|
|
12
|
+
}
|
|
13
|
+
saveVersion(options = {}) {
|
|
14
|
+
return saveImageEditVersion(this.container, {
|
|
15
|
+
basename: this.basename,
|
|
16
|
+
stateFilename: this.stateFilename,
|
|
17
|
+
...options,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
listVersions() {
|
|
21
|
+
return listImageEditVersions(this.container, this.basename);
|
|
22
|
+
}
|
|
23
|
+
readVersion(version) {
|
|
24
|
+
return readImageEditVersion(this.container, version);
|
|
25
|
+
}
|
|
26
|
+
revertToVersion(version, options = {}) {
|
|
27
|
+
return revertToImageEditVersion(this.container, version, {
|
|
28
|
+
stateFilename: this.stateFilename,
|
|
29
|
+
...options,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
pruneVersions(policy) {
|
|
33
|
+
return pruneImageEditVersions(this.container, policy, this.basename);
|
|
34
|
+
}
|
|
35
|
+
coalesceVersions(options = {}) {
|
|
36
|
+
return coalesceImageEditVersions(this.container, options, this.basename);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ImageEditVersionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditVersionManager.js","sourceRoot":"","sources":["../../src/imageEdit/ImageEditVersionManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,GAIrB,MAAM,eAAe,CAAC;AAUvB,MAAM,OAAO,uBAAuB;IAKlC,YAAY,SAA2B,EAAE,UAA0C,EAAE;QACnF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,UAAuC,EAAE;QACnD,OAAO,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE;YAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,OAAO,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,WAAW,CAAC,OAAyB;QACnC,OAAO,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,eAAe,CACb,OAAyB,EACzB,UAAkC,EAAE;QAEpC,OAAO,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;YACvD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,MAAmB;QAC/B,OAAO,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,gBAAgB,CAAC,UAA2B,EAAE;QAC5C,OAAO,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rasterize an {@link ImageEditDoc} to a PNG / JPEG / WebP {@link Blob}.
|
|
3
|
+
*
|
|
4
|
+
* The pipeline:
|
|
5
|
+
* 1. Build an SVG string mirroring the canvas + layers, with image
|
|
6
|
+
* hrefs inlined as `data:` URLs (so the canvas isn't tainted).
|
|
7
|
+
* 2. Wrap the SVG in a `Blob` and load it through an `Image`.
|
|
8
|
+
* 3. Draw it onto a canvas (`OffscreenCanvas` when available,
|
|
9
|
+
* otherwise a detached `HTMLCanvasElement`).
|
|
10
|
+
* 4. Convert the canvas to the requested format.
|
|
11
|
+
*
|
|
12
|
+
* Browser-only — calls `Image`, `URL.createObjectURL`, and canvas APIs.
|
|
13
|
+
* Returns a Promise that rejects on SVG parse / load failures.
|
|
14
|
+
*/
|
|
15
|
+
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
16
|
+
import type { ImageEditDoc } from '../schemas/ImageEditDoc.js';
|
|
17
|
+
/** Supported export formats. */
|
|
18
|
+
export type ImageEditExportFormat = 'png' | 'jpeg' | 'webp';
|
|
19
|
+
/** Options for {@link exportImageEditDoc}. */
|
|
20
|
+
export interface ImageEditExportOptions {
|
|
21
|
+
/** Output format. Defaults to `'png'`. */
|
|
22
|
+
format?: ImageEditExportFormat;
|
|
23
|
+
/** JPEG/WebP quality 0..1. Defaults to `0.92`. Ignored for PNG. */
|
|
24
|
+
quality?: number;
|
|
25
|
+
/** Resolution scale factor. Defaults to `1` (canvas pixels = output pixels). */
|
|
26
|
+
scale?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Export the doc to a raster {@link Blob}. Asset bytes referenced by image
|
|
30
|
+
* layers are read from `container` and inlined as data URLs.
|
|
31
|
+
*/
|
|
32
|
+
export declare function exportImageEditDoc(doc: ImageEditDoc, container: ContentContainer, options?: ImageEditExportOptions): Promise<Blob>;
|
|
33
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/imageEdit/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAmB,YAAY,EAAkB,MAAM,4BAA4B,CAAC;AAGhG,gCAAgC;AAChC,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5D,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rasterize an {@link ImageEditDoc} to a PNG / JPEG / WebP {@link Blob}.
|
|
3
|
+
*
|
|
4
|
+
* The pipeline:
|
|
5
|
+
* 1. Build an SVG string mirroring the canvas + layers, with image
|
|
6
|
+
* hrefs inlined as `data:` URLs (so the canvas isn't tainted).
|
|
7
|
+
* 2. Wrap the SVG in a `Blob` and load it through an `Image`.
|
|
8
|
+
* 3. Draw it onto a canvas (`OffscreenCanvas` when available,
|
|
9
|
+
* otherwise a detached `HTMLCanvasElement`).
|
|
10
|
+
* 4. Convert the canvas to the requested format.
|
|
11
|
+
*
|
|
12
|
+
* Browser-only — calls `Image`, `URL.createObjectURL`, and canvas APIs.
|
|
13
|
+
* Returns a Promise that rejects on SVG parse / load failures.
|
|
14
|
+
*/
|
|
15
|
+
const FORMAT_MIME = {
|
|
16
|
+
png: 'image/png',
|
|
17
|
+
jpeg: 'image/jpeg',
|
|
18
|
+
webp: 'image/webp',
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Export the doc to a raster {@link Blob}. Asset bytes referenced by image
|
|
22
|
+
* layers are read from `container` and inlined as data URLs.
|
|
23
|
+
*/
|
|
24
|
+
export async function exportImageEditDoc(doc, container, options = {}) {
|
|
25
|
+
const format = options.format ?? 'png';
|
|
26
|
+
const quality = options.quality ?? 0.92;
|
|
27
|
+
const scale = options.scale ?? 1;
|
|
28
|
+
const mime = FORMAT_MIME[format];
|
|
29
|
+
const svg = await buildSvgString(doc, container);
|
|
30
|
+
const outW = Math.max(1, Math.round(doc.canvas.width * scale));
|
|
31
|
+
const outH = Math.max(1, Math.round(doc.canvas.height * scale));
|
|
32
|
+
const img = await loadSvgImage(svg);
|
|
33
|
+
const canvas = createRasterCanvas(outW, outH);
|
|
34
|
+
const ctx = canvas.getContext('2d');
|
|
35
|
+
if (!ctx)
|
|
36
|
+
throw new Error('exportImageEditDoc: 2D canvas context unavailable');
|
|
37
|
+
// For JPEG (no alpha), pre-fill with the canvas background or white so
|
|
38
|
+
// transparent regions aren't rendered as black.
|
|
39
|
+
if (format === 'jpeg') {
|
|
40
|
+
const bg = doc.canvas.background && doc.canvas.background !== 'transparent'
|
|
41
|
+
? doc.canvas.background
|
|
42
|
+
: '#ffffff';
|
|
43
|
+
ctx.fillStyle = bg;
|
|
44
|
+
ctx.fillRect(0, 0, outW, outH);
|
|
45
|
+
}
|
|
46
|
+
ctx.drawImage(img, 0, 0, outW, outH);
|
|
47
|
+
return canvasToBlob(canvas, mime, quality);
|
|
48
|
+
}
|
|
49
|
+
// ============================================
|
|
50
|
+
// SVG construction
|
|
51
|
+
// ============================================
|
|
52
|
+
async function buildSvgString(doc, container) {
|
|
53
|
+
const { width, height, background } = doc.canvas;
|
|
54
|
+
const bgRect = background && background !== 'transparent'
|
|
55
|
+
? `<rect width="${width}" height="${height}" fill="${escapeAttr(background)}"/>`
|
|
56
|
+
: '';
|
|
57
|
+
const layerXml = [];
|
|
58
|
+
for (const layer of doc.layers) {
|
|
59
|
+
if (layer.visible === false)
|
|
60
|
+
continue;
|
|
61
|
+
layerXml.push(await renderLayerToSvg(layer, doc.canvas, container));
|
|
62
|
+
}
|
|
63
|
+
return (`<?xml version="1.0" encoding="UTF-8"?>` +
|
|
64
|
+
`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"` +
|
|
65
|
+
` width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">` +
|
|
66
|
+
bgRect +
|
|
67
|
+
layerXml.join('') +
|
|
68
|
+
`</svg>`);
|
|
69
|
+
}
|
|
70
|
+
async function renderLayerToSvg(layer, canvas, container) {
|
|
71
|
+
const opacity = layer.opacity ?? 1;
|
|
72
|
+
const opacityAttr = opacity < 1 ? ` opacity="${opacity}"` : '';
|
|
73
|
+
const inner = await renderLayerInner(layer, canvas, container);
|
|
74
|
+
return `<g data-layer-id="${escapeAttr(layer.id)}"${opacityAttr}>${inner}</g>`;
|
|
75
|
+
}
|
|
76
|
+
async function renderLayerInner(layer, canvas, container) {
|
|
77
|
+
const { x, y, w, h } = resolveBox(layer.position, canvas);
|
|
78
|
+
if (layer.type === 'image') {
|
|
79
|
+
const dataUrl = await loadAssetAsDataUrl(container, layer.content.src);
|
|
80
|
+
return (`<image x="${x}" y="${y}" width="${w}" height="${h}"` +
|
|
81
|
+
` preserveAspectRatio="${preserveAspectRatioFor(layer.content.fit)}"` +
|
|
82
|
+
` xlink:href="${escapeAttr(dataUrl)}"/>`);
|
|
83
|
+
}
|
|
84
|
+
if (layer.type === 'shape') {
|
|
85
|
+
const c = layer.content;
|
|
86
|
+
const fill = c.fill ?? 'none';
|
|
87
|
+
const stroke = c.stroke ? ` stroke="${escapeAttr(c.stroke)}"` : '';
|
|
88
|
+
const strokeWidth = c.strokeWidth ? ` stroke-width="${c.strokeWidth}"` : '';
|
|
89
|
+
if (c.shape === 'rect') {
|
|
90
|
+
const rx = c.borderRadius ? ` rx="${c.borderRadius}" ry="${c.borderRadius}"` : '';
|
|
91
|
+
return `<rect x="${x}" y="${y}" width="${w}" height="${h}" fill="${escapeAttr(fill)}"${stroke}${strokeWidth}${rx}/>`;
|
|
92
|
+
}
|
|
93
|
+
if (c.shape === 'circle') {
|
|
94
|
+
const r = Math.min(w, h) / 2;
|
|
95
|
+
return `<circle cx="${x + w / 2}" cy="${y + h / 2}" r="${r}" fill="${escapeAttr(fill)}"${stroke}${strokeWidth}/>`;
|
|
96
|
+
}
|
|
97
|
+
// line
|
|
98
|
+
return `<line x1="${x}" y1="${y}" x2="${x + w}" y2="${y + h}"${stroke}${strokeWidth}/>`;
|
|
99
|
+
}
|
|
100
|
+
// text
|
|
101
|
+
const c = layer.content;
|
|
102
|
+
const style = c.style;
|
|
103
|
+
const lineHeight = style.lineHeight ?? 1.4;
|
|
104
|
+
const lineHeightPx = style.fontSize * lineHeight;
|
|
105
|
+
const lines = (c.text ?? '').split('\n');
|
|
106
|
+
const tspans = lines
|
|
107
|
+
.map((line, i) => `<tspan x="${x}" dy="${i === 0 ? 0 : lineHeightPx}">${escapeText(line)}</tspan>`)
|
|
108
|
+
.join('');
|
|
109
|
+
const fontFamily = style.fontFamily ?? 'sans-serif';
|
|
110
|
+
const fontWeight = style.fontWeight ?? 'normal';
|
|
111
|
+
const textAnchor = style.textAlign === 'center' ? 'middle' : style.textAlign === 'right' ? 'end' : 'start';
|
|
112
|
+
return (`<text x="${x}" y="${y + style.fontSize}" font-family="${escapeAttr(fontFamily)}"` +
|
|
113
|
+
` font-size="${style.fontSize}" font-weight="${fontWeight}"` +
|
|
114
|
+
` fill="${escapeAttr(style.color)}" text-anchor="${textAnchor}">` +
|
|
115
|
+
tspans +
|
|
116
|
+
`</text>`);
|
|
117
|
+
}
|
|
118
|
+
function preserveAspectRatioFor(fit) {
|
|
119
|
+
if (fit === 'cover')
|
|
120
|
+
return 'xMidYMid slice';
|
|
121
|
+
if (fit === 'fill')
|
|
122
|
+
return 'none';
|
|
123
|
+
return 'xMidYMid meet'; // contain (default)
|
|
124
|
+
}
|
|
125
|
+
function resolveBox(position, canvas) {
|
|
126
|
+
const x = resolveValue(position.x, canvas.width);
|
|
127
|
+
const y = resolveValue(position.y, canvas.height);
|
|
128
|
+
const w = position.width !== undefined ? resolveValue(position.width, canvas.width) : canvas.width;
|
|
129
|
+
const h = position.height !== undefined ? resolveValue(position.height, canvas.height) : canvas.height;
|
|
130
|
+
const offset = anchorOffset(position.anchor, w, h);
|
|
131
|
+
return { x: x + offset.x, y: y + offset.y, w, h };
|
|
132
|
+
}
|
|
133
|
+
function resolveValue(v, base) {
|
|
134
|
+
if (typeof v === 'number')
|
|
135
|
+
return v;
|
|
136
|
+
if (v.endsWith('%'))
|
|
137
|
+
return (parseFloat(v) / 100) * base;
|
|
138
|
+
return parseFloat(v) || 0;
|
|
139
|
+
}
|
|
140
|
+
function anchorOffset(anchor, w, h) {
|
|
141
|
+
switch (anchor) {
|
|
142
|
+
case 'center':
|
|
143
|
+
return { x: -w / 2, y: -h / 2 };
|
|
144
|
+
case 'top-right':
|
|
145
|
+
return { x: -w, y: 0 };
|
|
146
|
+
case 'bottom-left':
|
|
147
|
+
return { x: 0, y: -h };
|
|
148
|
+
case 'bottom-right':
|
|
149
|
+
return { x: -w, y: -h };
|
|
150
|
+
case 'top-left':
|
|
151
|
+
default:
|
|
152
|
+
return { x: 0, y: 0 };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ============================================
|
|
156
|
+
// Asset inlining
|
|
157
|
+
// ============================================
|
|
158
|
+
async function loadAssetAsDataUrl(container, src) {
|
|
159
|
+
// Already a data: or absolute URL — pass through.
|
|
160
|
+
if (/^(data:|https?:|blob:)/.test(src))
|
|
161
|
+
return src;
|
|
162
|
+
const data = await container.readFile(src);
|
|
163
|
+
if (!data)
|
|
164
|
+
throw new Error(`exportImageEditDoc: missing asset "${src}"`);
|
|
165
|
+
const list = await container.listFiles(src);
|
|
166
|
+
const mime = list.find((e) => e.path === src)?.mimeType ?? guessMime(src);
|
|
167
|
+
return arrayBufferToDataUrl(data, mime);
|
|
168
|
+
}
|
|
169
|
+
function arrayBufferToDataUrl(data, mime) {
|
|
170
|
+
const bytes = new Uint8Array(data);
|
|
171
|
+
let binary = '';
|
|
172
|
+
// chunk to avoid call-stack limits with large images
|
|
173
|
+
const CHUNK = 0x8000;
|
|
174
|
+
for (let i = 0; i < bytes.length; i += CHUNK) {
|
|
175
|
+
binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + CHUNK)));
|
|
176
|
+
}
|
|
177
|
+
// btoa exists in browsers and modern Node (>= 16); fall back to Buffer for older runtimes.
|
|
178
|
+
const b64 = typeof btoa === 'function' ? btoa(binary) : Buffer.from(bytes).toString('base64');
|
|
179
|
+
return `data:${mime};base64,${b64}`;
|
|
180
|
+
}
|
|
181
|
+
function guessMime(path) {
|
|
182
|
+
const dot = path.lastIndexOf('.');
|
|
183
|
+
const ext = dot >= 0 ? path.slice(dot).toLowerCase() : '';
|
|
184
|
+
switch (ext) {
|
|
185
|
+
case '.png':
|
|
186
|
+
return 'image/png';
|
|
187
|
+
case '.jpg':
|
|
188
|
+
case '.jpeg':
|
|
189
|
+
return 'image/jpeg';
|
|
190
|
+
case '.webp':
|
|
191
|
+
return 'image/webp';
|
|
192
|
+
case '.gif':
|
|
193
|
+
return 'image/gif';
|
|
194
|
+
case '.svg':
|
|
195
|
+
return 'image/svg+xml';
|
|
196
|
+
default:
|
|
197
|
+
return 'application/octet-stream';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// ============================================
|
|
201
|
+
// SVG → Image → Canvas → Blob
|
|
202
|
+
// ============================================
|
|
203
|
+
async function loadSvgImage(svg) {
|
|
204
|
+
const blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });
|
|
205
|
+
const url = URL.createObjectURL(blob);
|
|
206
|
+
try {
|
|
207
|
+
return await new Promise((resolve, reject) => {
|
|
208
|
+
const img = new Image();
|
|
209
|
+
img.onload = () => resolve(img);
|
|
210
|
+
img.onerror = () => reject(new Error('exportImageEditDoc: SVG image failed to load'));
|
|
211
|
+
img.src = url;
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
URL.revokeObjectURL(url);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function createRasterCanvas(width, height) {
|
|
219
|
+
if (typeof OffscreenCanvas !== 'undefined') {
|
|
220
|
+
return new OffscreenCanvas(width, height);
|
|
221
|
+
}
|
|
222
|
+
const c = document.createElement('canvas');
|
|
223
|
+
c.width = width;
|
|
224
|
+
c.height = height;
|
|
225
|
+
return c;
|
|
226
|
+
}
|
|
227
|
+
async function canvasToBlob(canvas, mime, quality) {
|
|
228
|
+
if ('convertToBlob' in canvas) {
|
|
229
|
+
return canvas.convertToBlob({ type: mime, quality });
|
|
230
|
+
}
|
|
231
|
+
return new Promise((resolve, reject) => {
|
|
232
|
+
canvas.toBlob((blob) => {
|
|
233
|
+
if (blob)
|
|
234
|
+
resolve(blob);
|
|
235
|
+
else
|
|
236
|
+
reject(new Error('exportImageEditDoc: canvas.toBlob returned null'));
|
|
237
|
+
}, mime, quality);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
// ============================================
|
|
241
|
+
// XML escaping
|
|
242
|
+
// ============================================
|
|
243
|
+
function escapeAttr(s) {
|
|
244
|
+
return s
|
|
245
|
+
.replace(/&/g, '&')
|
|
246
|
+
.replace(/"/g, '"')
|
|
247
|
+
.replace(/</g, '<')
|
|
248
|
+
.replace(/>/g, '>');
|
|
249
|
+
}
|
|
250
|
+
function escapeText(s) {
|
|
251
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/imageEdit/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image-editor primitives: schema re-exports, state helpers, persistence,
|
|
3
|
+
* version history, and SVG → raster export.
|
|
4
|
+
*
|
|
5
|
+
* See `@bendyline/squisq/imageEdit` for the public subpath entry.
|
|
6
|
+
*/
|
|
7
|
+
export type { ImageEditDoc, ImageEditLayer, ImageEditLayerKind, ImageEditCanvas, ImageEditMeta, EditorLayerMeta, } from '../schemas/ImageEditDoc.js';
|
|
8
|
+
export { IMAGE_EDIT_STATE_FILENAME, IMAGE_EDIT_ASSETS_PREFIX, createEmptyImageEditDoc, addLayer, removeLayer, reorderLayer, updateLayer, setCanvas, touch, } from './state.js';
|
|
9
|
+
export { readImageEditDoc, writeImageEditDoc } from './persistence.js';
|
|
10
|
+
export { IMAGE_EDIT_VERSIONS_PREFIX, IMAGE_EDIT_DEFAULT_BASENAME, buildImageEditVersionPath, parseImageEditVersionPath, } from './versionPaths.js';
|
|
11
|
+
export { saveImageEditVersion, listImageEditVersions, readImageEditVersion, readImageEditVersionText, revertToImageEditVersion, pruneImageEditVersions, coalesceImageEditVersions, type SaveImageEditVersionOptions, type SaveImageEditVersionResult, type RevertImageEditOptions, } from './versions.js';
|
|
12
|
+
export { ImageEditVersionManager, type ImageEditVersionManagerOptions, } from './ImageEditVersionManager.js';
|
|
13
|
+
export { exportImageEditDoc, type ImageEditExportFormat, type ImageEditExportOptions, } from './export.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|