@bendyline/squisq 1.4.0 → 1.5.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.
Files changed (782) hide show
  1. package/dist/{Doc-BeSeH2iX.d.ts → Doc-BsMkmzH8.d.ts} +838 -268
  2. package/dist/{ImageEditDoc-BTIvw0oq.d.ts → ImageEditDoc-DvoeHMP9.d.ts} +11 -4
  3. package/dist/{chunk-ZTX4PFFT.js → chunk-2OIBZYKP.js} +75 -2
  4. package/dist/chunk-2OIBZYKP.js.map +1 -0
  5. package/dist/chunk-2UQOHYE2.js +45 -0
  6. package/dist/chunk-2UQOHYE2.js.map +1 -0
  7. package/dist/{chunk-B4EEON3N.js → chunk-4AKUQPEE.js} +536 -103
  8. package/dist/chunk-4AKUQPEE.js.map +1 -0
  9. package/dist/chunk-4ZFRZBU2.js +6582 -0
  10. package/dist/chunk-4ZFRZBU2.js.map +1 -0
  11. package/dist/{chunk-57CVQCFX.js → chunk-7MQGNR76.js} +79 -3
  12. package/dist/chunk-7MQGNR76.js.map +1 -0
  13. package/dist/{chunk-5WFRKURX.js → chunk-DLXZMS5K.js} +4 -2
  14. package/dist/chunk-DLXZMS5K.js.map +1 -0
  15. package/dist/{chunk-MYIH7FWD.js → chunk-FBKP5CAO.js} +1 -1
  16. package/dist/chunk-FBKP5CAO.js.map +1 -0
  17. package/dist/chunk-KZNXZ5SM.js +333 -0
  18. package/dist/chunk-KZNXZ5SM.js.map +1 -0
  19. package/dist/{chunk-WMOI7FN3.js → chunk-LRCV7N7F.js} +12 -2
  20. package/dist/{chunk-WMOI7FN3.js.map → chunk-LRCV7N7F.js.map} +1 -1
  21. package/dist/{chunk-3K5OG6KI.js → chunk-OH43RPTP.js} +403 -187
  22. package/dist/chunk-OH43RPTP.js.map +1 -0
  23. package/dist/{chunk-H3AXU4MJ.js → chunk-OKJOQXK4.js} +149 -2
  24. package/dist/chunk-OKJOQXK4.js.map +1 -0
  25. package/dist/chunk-PGGGKYWG.js +1 -0
  26. package/dist/chunk-PGGGKYWG.js.map +1 -0
  27. package/dist/{chunk-7UDSRZKG.js → chunk-Q3ROPT5H.js} +35 -14
  28. package/dist/chunk-Q3ROPT5H.js.map +1 -0
  29. package/dist/chunk-QE7TWGVT.js +178 -0
  30. package/dist/chunk-QE7TWGVT.js.map +1 -0
  31. package/dist/chunk-RUDYOTA6.js +345 -0
  32. package/dist/chunk-RUDYOTA6.js.map +1 -0
  33. package/dist/chunk-TVSGLUID.js +596 -0
  34. package/dist/chunk-TVSGLUID.js.map +1 -0
  35. package/dist/chunk-ZLQKNOZQ.js +1 -0
  36. package/dist/chunk-ZLQKNOZQ.js.map +1 -0
  37. package/dist/doc/index.d.ts +5 -10
  38. package/dist/doc/index.js +263 -7
  39. package/dist/doc/index.js.map +1 -1
  40. package/dist/generate/index.d.ts +106 -7
  41. package/dist/generate/index.js +16 -3
  42. package/dist/generate/index.js.map +1 -1
  43. package/dist/icons/index.d.ts +62 -10
  44. package/dist/icons/index.js +29 -9
  45. package/dist/icons/index.js.map +1 -1
  46. package/dist/icons/inlineIconMarker.d.ts +1 -0
  47. package/dist/icons/inlineIconMarker.js +15 -0
  48. package/dist/icons/inlineIconMarker.js.map +1 -0
  49. package/dist/imageEdit/index.d.ts +219 -11
  50. package/dist/imageEdit/index.js +56 -21
  51. package/dist/imageEdit/index.js.map +1 -1
  52. package/dist/index.d.ts +24 -13
  53. package/dist/index.js +680 -12
  54. package/dist/index.js.map +1 -1
  55. package/dist/inlineIconMarker-CiE8Hlvz.d.ts +59 -0
  56. package/dist/jsonForm/index.d.ts +189 -12
  57. package/dist/jsonForm/index.js +26 -11
  58. package/dist/jsonForm/index.js.map +1 -1
  59. package/dist/markdown/index.d.ts +474 -19
  60. package/dist/markdown/index.js +72 -33
  61. package/dist/markdown/index.js.map +1 -1
  62. package/dist/random/index.d.ts +51 -2
  63. package/dist/random/index.js +9 -1
  64. package/dist/random/index.js.map +1 -1
  65. package/dist/recommend/index.d.ts +39 -13
  66. package/dist/recommend/index.js +10 -14
  67. package/dist/recommend/index.js.map +1 -1
  68. package/dist/schemas/index.d.ts +208 -15
  69. package/dist/schemas/index.js +150 -11
  70. package/dist/schemas/index.js.map +1 -1
  71. package/dist/spatial/index.d.ts +116 -3
  72. package/dist/spatial/index.js +24 -2
  73. package/dist/spatial/index.js.map +1 -1
  74. package/dist/storage/index.d.ts +159 -10
  75. package/dist/storage/index.js +20 -6
  76. package/dist/storage/index.js.map +1 -1
  77. package/dist/story/index.d.ts +906 -40
  78. package/dist/story/index.js +124 -6
  79. package/dist/{themeLibrary-BHjJ0Qx6.d.ts → themeLibrary-DQQKuRMx.d.ts} +1 -1
  80. package/dist/timing/index.d.ts +109 -4
  81. package/dist/timing/index.js +23 -2
  82. package/dist/timing/index.js.map +1 -1
  83. package/dist/transform/index.d.ts +213 -6
  84. package/dist/transform/index.js +26 -3
  85. package/dist/transform/index.js.map +1 -1
  86. package/dist/{types-BdZkdJ3z.d.ts → types-DlAZ7MW4.d.ts} +115 -1
  87. package/dist/versions/index.d.ts +123 -24
  88. package/dist/versions/index.js +34 -27
  89. package/dist/versions/index.js.map +1 -1
  90. package/package.json +6 -1
  91. package/src/__tests__/animationUtils.test.ts +40 -0
  92. package/src/__tests__/annotationCoercion.test.ts +243 -0
  93. package/src/__tests__/applyRenderStyle.test.ts +146 -0
  94. package/src/__tests__/atmosphereLayers.test.ts +108 -0
  95. package/src/__tests__/attrTokens.test.ts +162 -0
  96. package/src/__tests__/customTemplateSample.test.ts +83 -0
  97. package/src/__tests__/customTemplatesFrontmatter.test.ts +205 -0
  98. package/src/__tests__/customThemesFrontmatter.test.ts +118 -0
  99. package/src/__tests__/diagramBlock.test.ts +122 -0
  100. package/src/__tests__/diagramLayout.test.ts +134 -0
  101. package/src/__tests__/drawing.test.ts +109 -0
  102. package/src/__tests__/drawingBlock.test.ts +124 -0
  103. package/src/__tests__/drawingLayout.test.ts +171 -0
  104. package/src/__tests__/geohash.test.ts +6 -5
  105. package/src/__tests__/getLayers.test.ts +6 -2
  106. package/src/__tests__/getLayersFallback.test.ts +103 -0
  107. package/src/__tests__/imageEditExportSvg.test.ts +70 -0
  108. package/src/__tests__/imageEditVersions.test.ts +72 -0
  109. package/src/__tests__/inlineIconMarker.test.ts +36 -0
  110. package/src/__tests__/layoutBlock.test.ts +83 -0
  111. package/src/__tests__/layoutLayout.test.ts +169 -0
  112. package/src/__tests__/markdown.test.ts +23 -0
  113. package/src/__tests__/markdownSanitize.test.ts +64 -0
  114. package/src/__tests__/markdownToDoc.test.ts +223 -2
  115. package/src/__tests__/mediaAnnotations.test.ts +64 -0
  116. package/src/__tests__/mediaSchedule.test.ts +118 -0
  117. package/src/__tests__/pandocAttrParse.test.ts +187 -0
  118. package/src/__tests__/resolveDocTheme.test.ts +55 -0
  119. package/src/__tests__/rootExports.test.ts +43 -0
  120. package/src/__tests__/shapeGeometry.test.ts +89 -0
  121. package/src/__tests__/shapeVocabulary.test.ts +133 -0
  122. package/src/__tests__/structuredData.test.ts +179 -0
  123. package/src/__tests__/templateAnnotationParse.test.ts +108 -0
  124. package/src/__tests__/templateMetadata.test.ts +21 -0
  125. package/src/__tests__/templates.test.ts +145 -4
  126. package/src/__tests__/themeCompile.test.ts +42 -0
  127. package/src/__tests__/themeValidator.test.ts +6 -0
  128. package/src/__tests__/transformV2.test.ts +137 -0
  129. package/src/__tests__/transitionNormalize.test.ts +61 -0
  130. package/src/__tests__/validateDoc.test.ts +100 -0
  131. package/src/doc/customTemplatesFrontmatter.ts +308 -0
  132. package/src/doc/customThemesFrontmatter.ts +90 -0
  133. package/src/doc/docToMarkdown.ts +73 -4
  134. package/src/doc/getLayers.ts +40 -17
  135. package/src/doc/index.ts +35 -1
  136. package/src/doc/markdownToDoc.ts +333 -12
  137. package/src/doc/mediaAnnotations.ts +118 -0
  138. package/src/doc/resolveDocTheme.ts +55 -0
  139. package/src/doc/structuredData.ts +230 -0
  140. package/src/doc/templateInputs.ts +240 -0
  141. package/src/doc/templates/__tests__/customTemplate.test.ts +151 -0
  142. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +110 -0
  143. package/src/doc/templates/accentImage.ts +30 -6
  144. package/src/doc/templates/captionUtils.ts +23 -0
  145. package/src/doc/templates/comparisonBar.ts +26 -18
  146. package/src/doc/templates/coverBlock.ts +7 -4
  147. package/src/doc/templates/customTemplate.ts +45 -0
  148. package/src/doc/templates/dataTable.ts +37 -19
  149. package/src/doc/templates/dateEvent.ts +41 -20
  150. package/src/doc/templates/definitionCard.ts +26 -18
  151. package/src/doc/templates/diagramBlock.ts +204 -0
  152. package/src/doc/templates/diagramLayout.ts +159 -0
  153. package/src/doc/templates/drawingBlock.ts +325 -0
  154. package/src/doc/templates/drawingLayout.ts +539 -0
  155. package/src/doc/templates/factCard.ts +51 -25
  156. package/src/doc/templates/fallbackBlock.ts +123 -0
  157. package/src/doc/templates/featureBlock.ts +20 -13
  158. package/src/doc/templates/fullBleedQuote.ts +18 -8
  159. package/src/doc/templates/imageWithCaption.ts +22 -9
  160. package/src/doc/templates/index.ts +215 -46
  161. package/src/doc/templates/layoutBlock.ts +43 -0
  162. package/src/doc/templates/layoutLayout.ts +243 -0
  163. package/src/doc/templates/listBlock.ts +56 -30
  164. package/src/doc/templates/mapBlock.ts +15 -12
  165. package/src/doc/templates/metadata.ts +120 -0
  166. package/src/doc/templates/persistentLayers.ts +129 -11
  167. package/src/doc/templates/photoGrid.ts +23 -12
  168. package/src/doc/templates/pullQuote.ts +30 -12
  169. package/src/doc/templates/quoteBlock.ts +54 -29
  170. package/src/doc/templates/sectionHeader.ts +25 -11
  171. package/src/doc/templates/statHighlight.ts +39 -22
  172. package/src/doc/templates/titleBlock.ts +59 -21
  173. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +221 -0
  174. package/src/doc/templates/tokens/resolveTokens.ts +0 -0
  175. package/src/doc/templates/twoColumn.ts +48 -30
  176. package/src/doc/templates/videoPullQuote.ts +22 -12
  177. package/src/doc/templates/videoWithCaption.ts +13 -8
  178. package/src/doc/utils/animationUtils.ts +267 -3
  179. package/src/doc/utils/applyRenderStyle.ts +113 -0
  180. package/src/doc/utils/imageTreatment.ts +70 -0
  181. package/src/doc/utils/shapeGeometry.ts +464 -0
  182. package/src/doc/utils/themeUtils.ts +75 -1
  183. package/src/doc/validate.ts +476 -0
  184. package/src/generate/slideshowGenerator.ts +7 -0
  185. package/src/icons/index.ts +8 -0
  186. package/src/icons/inlineIconMarker.ts +73 -0
  187. package/src/imageEdit/export.ts +85 -2
  188. package/src/imageEdit/index.ts +1 -0
  189. package/src/imageEdit/persistence.ts +51 -0
  190. package/src/index.ts +2 -0
  191. package/src/markdown/annotationCoercion.ts +295 -0
  192. package/src/markdown/attrTokens.ts +222 -0
  193. package/src/markdown/convert.ts +229 -26
  194. package/src/markdown/index.ts +36 -0
  195. package/src/markdown/sanitize.ts +298 -0
  196. package/src/markdown/stringify.ts +84 -3
  197. package/src/markdown/types.ts +66 -0
  198. package/src/markdown/utils.ts +49 -1
  199. package/src/recommend/templates.ts +24 -0
  200. package/src/schemas/BlockTemplates.ts +133 -4
  201. package/src/schemas/CustomTemplates.ts +74 -0
  202. package/src/schemas/Doc.ts +353 -29
  203. package/src/schemas/ImageEditDoc.ts +11 -4
  204. package/src/schemas/Media.ts +169 -0
  205. package/src/schemas/Theme.ts +23 -1
  206. package/src/schemas/Transitions.ts +224 -0
  207. package/src/schemas/colorUtils.ts +33 -0
  208. package/src/schemas/fontStacks.ts +5 -2
  209. package/src/schemas/index.ts +3 -0
  210. package/src/schemas/themeCompile.ts +23 -4
  211. package/src/schemas/themeValidator.ts +49 -11
  212. package/src/schemas/themes/cinematic.json +69 -12
  213. package/src/schemas/themes/documentary.json +58 -11
  214. package/src/schemas/themes/gezellig.json +60 -11
  215. package/src/schemas/themes/magazine.json +54 -9
  216. package/src/schemas/themes/morning-light.json +52 -9
  217. package/src/schemas/themes/standard-dark.json +48 -13
  218. package/src/schemas/themes/standard.json +44 -12
  219. package/src/schemas/themes/tech-dark.json +65 -12
  220. package/src/spatial/Geohash.ts +52 -21
  221. package/src/transform/applyTransform.ts +43 -4
  222. package/src/transform/index.ts +1 -0
  223. package/src/transform/registry.ts +44 -13
  224. package/src/transform/styles/dataDriven.ts +2 -1
  225. package/src/transform/styles/documentary.ts +2 -1
  226. package/src/transform/styles/magazine.ts +3 -1
  227. package/src/transform/styles/minimal.ts +2 -1
  228. package/src/transform/styles/narrative.ts +3 -1
  229. package/src/transform/templateSelector.ts +87 -11
  230. package/src/transform/types.ts +35 -2
  231. package/dist/__tests__/animationUtils.test.d.ts +0 -2
  232. package/dist/__tests__/animationUtils.test.d.ts.map +0 -1
  233. package/dist/__tests__/animationUtils.test.js +0 -60
  234. package/dist/__tests__/animationUtils.test.js.map +0 -1
  235. package/dist/__tests__/colorUtils.test.d.ts +0 -2
  236. package/dist/__tests__/colorUtils.test.d.ts.map +0 -1
  237. package/dist/__tests__/colorUtils.test.js +0 -94
  238. package/dist/__tests__/colorUtils.test.js.map +0 -1
  239. package/dist/__tests__/contentContainer.test.d.ts +0 -2
  240. package/dist/__tests__/contentContainer.test.d.ts.map +0 -1
  241. package/dist/__tests__/contentContainer.test.js +0 -234
  242. package/dist/__tests__/contentContainer.test.js.map +0 -1
  243. package/dist/__tests__/contentExtractor.test.d.ts +0 -2
  244. package/dist/__tests__/contentExtractor.test.d.ts.map +0 -1
  245. package/dist/__tests__/contentExtractor.test.js +0 -151
  246. package/dist/__tests__/contentExtractor.test.js.map +0 -1
  247. package/dist/__tests__/coverBlock.test.d.ts +0 -2
  248. package/dist/__tests__/coverBlock.test.d.ts.map +0 -1
  249. package/dist/__tests__/coverBlock.test.js +0 -197
  250. package/dist/__tests__/coverBlock.test.js.map +0 -1
  251. package/dist/__tests__/dataTable.test.d.ts +0 -2
  252. package/dist/__tests__/dataTable.test.d.ts.map +0 -1
  253. package/dist/__tests__/dataTable.test.js +0 -110
  254. package/dist/__tests__/dataTable.test.js.map +0 -1
  255. package/dist/__tests__/geohash.test.d.ts +0 -2
  256. package/dist/__tests__/geohash.test.d.ts.map +0 -1
  257. package/dist/__tests__/geohash.test.js +0 -87
  258. package/dist/__tests__/geohash.test.js.map +0 -1
  259. package/dist/__tests__/getLayers.test.d.ts +0 -2
  260. package/dist/__tests__/getLayers.test.d.ts.map +0 -1
  261. package/dist/__tests__/getLayers.test.js +0 -191
  262. package/dist/__tests__/getLayers.test.js.map +0 -1
  263. package/dist/__tests__/haversine.test.d.ts +0 -2
  264. package/dist/__tests__/haversine.test.d.ts.map +0 -1
  265. package/dist/__tests__/haversine.test.js +0 -56
  266. package/dist/__tests__/haversine.test.js.map +0 -1
  267. package/dist/__tests__/iconResolve.test.d.ts +0 -2
  268. package/dist/__tests__/iconResolve.test.d.ts.map +0 -1
  269. package/dist/__tests__/iconResolve.test.js +0 -99
  270. package/dist/__tests__/iconResolve.test.js.map +0 -1
  271. package/dist/__tests__/imageEditState.test.d.ts +0 -2
  272. package/dist/__tests__/imageEditState.test.d.ts.map +0 -1
  273. package/dist/__tests__/imageEditState.test.js +0 -61
  274. package/dist/__tests__/imageEditState.test.js.map +0 -1
  275. package/dist/__tests__/imageEditVersions.test.d.ts +0 -2
  276. package/dist/__tests__/imageEditVersions.test.d.ts.map +0 -1
  277. package/dist/__tests__/imageEditVersions.test.js +0 -141
  278. package/dist/__tests__/imageEditVersions.test.js.map +0 -1
  279. package/dist/__tests__/inferDocumentTitle.test.d.ts +0 -2
  280. package/dist/__tests__/inferDocumentTitle.test.d.ts.map +0 -1
  281. package/dist/__tests__/inferDocumentTitle.test.js +0 -42
  282. package/dist/__tests__/inferDocumentTitle.test.js.map +0 -1
  283. package/dist/__tests__/jsonForm.chooseControl.test.d.ts +0 -2
  284. package/dist/__tests__/jsonForm.chooseControl.test.d.ts.map +0 -1
  285. package/dist/__tests__/jsonForm.chooseControl.test.js +0 -74
  286. package/dist/__tests__/jsonForm.chooseControl.test.js.map +0 -1
  287. package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts +0 -2
  288. package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts.map +0 -1
  289. package/dist/__tests__/jsonForm.evaluateWhen.test.js +0 -51
  290. package/dist/__tests__/jsonForm.evaluateWhen.test.js.map +0 -1
  291. package/dist/__tests__/jsonForm.inferSchema.test.d.ts +0 -2
  292. package/dist/__tests__/jsonForm.inferSchema.test.d.ts.map +0 -1
  293. package/dist/__tests__/jsonForm.inferSchema.test.js +0 -23
  294. package/dist/__tests__/jsonForm.inferSchema.test.js.map +0 -1
  295. package/dist/__tests__/jsonForm.pointer.test.d.ts +0 -2
  296. package/dist/__tests__/jsonForm.pointer.test.d.ts.map +0 -1
  297. package/dist/__tests__/jsonForm.pointer.test.js +0 -94
  298. package/dist/__tests__/jsonForm.pointer.test.js.map +0 -1
  299. package/dist/__tests__/localForageAdapter.test.d.ts +0 -8
  300. package/dist/__tests__/localForageAdapter.test.d.ts.map +0 -1
  301. package/dist/__tests__/localForageAdapter.test.js +0 -130
  302. package/dist/__tests__/localForageAdapter.test.js.map +0 -1
  303. package/dist/__tests__/markdown.test.d.ts +0 -2
  304. package/dist/__tests__/markdown.test.d.ts.map +0 -1
  305. package/dist/__tests__/markdown.test.js +0 -715
  306. package/dist/__tests__/markdown.test.js.map +0 -1
  307. package/dist/__tests__/markdownIcons.test.d.ts +0 -2
  308. package/dist/__tests__/markdownIcons.test.d.ts.map +0 -1
  309. package/dist/__tests__/markdownIcons.test.js +0 -93
  310. package/dist/__tests__/markdownIcons.test.js.map +0 -1
  311. package/dist/__tests__/markdownToDoc.test.d.ts +0 -2
  312. package/dist/__tests__/markdownToDoc.test.d.ts.map +0 -1
  313. package/dist/__tests__/markdownToDoc.test.js +0 -458
  314. package/dist/__tests__/markdownToDoc.test.js.map +0 -1
  315. package/dist/__tests__/recommendTemplates.test.d.ts +0 -2
  316. package/dist/__tests__/recommendTemplates.test.d.ts.map +0 -1
  317. package/dist/__tests__/recommendTemplates.test.js +0 -158
  318. package/dist/__tests__/recommendTemplates.test.js.map +0 -1
  319. package/dist/__tests__/scopedContentContainer.test.d.ts +0 -2
  320. package/dist/__tests__/scopedContentContainer.test.d.ts.map +0 -1
  321. package/dist/__tests__/scopedContentContainer.test.js +0 -74
  322. package/dist/__tests__/scopedContentContainer.test.js.map +0 -1
  323. package/dist/__tests__/seededRandom.test.d.ts +0 -2
  324. package/dist/__tests__/seededRandom.test.d.ts.map +0 -1
  325. package/dist/__tests__/seededRandom.test.js +0 -125
  326. package/dist/__tests__/seededRandom.test.js.map +0 -1
  327. package/dist/__tests__/slideshowGenerator.test.d.ts +0 -2
  328. package/dist/__tests__/slideshowGenerator.test.d.ts.map +0 -1
  329. package/dist/__tests__/slideshowGenerator.test.js +0 -114
  330. package/dist/__tests__/slideshowGenerator.test.js.map +0 -1
  331. package/dist/__tests__/storage.test.d.ts +0 -2
  332. package/dist/__tests__/storage.test.d.ts.map +0 -1
  333. package/dist/__tests__/storage.test.js +0 -51
  334. package/dist/__tests__/storage.test.js.map +0 -1
  335. package/dist/__tests__/surface.test.d.ts +0 -2
  336. package/dist/__tests__/surface.test.d.ts.map +0 -1
  337. package/dist/__tests__/surface.test.js +0 -57
  338. package/dist/__tests__/surface.test.js.map +0 -1
  339. package/dist/__tests__/templateAnnotationParse.test.d.ts +0 -2
  340. package/dist/__tests__/templateAnnotationParse.test.d.ts.map +0 -1
  341. package/dist/__tests__/templateAnnotationParse.test.js +0 -42
  342. package/dist/__tests__/templateAnnotationParse.test.js.map +0 -1
  343. package/dist/__tests__/templates.test.d.ts +0 -2
  344. package/dist/__tests__/templates.test.d.ts.map +0 -1
  345. package/dist/__tests__/templates.test.js +0 -298
  346. package/dist/__tests__/templates.test.js.map +0 -1
  347. package/dist/__tests__/themeCompile.test.d.ts +0 -2
  348. package/dist/__tests__/themeCompile.test.d.ts.map +0 -1
  349. package/dist/__tests__/themeCompile.test.js +0 -134
  350. package/dist/__tests__/themeCompile.test.js.map +0 -1
  351. package/dist/__tests__/themeValidator.test.d.ts +0 -2
  352. package/dist/__tests__/themeValidator.test.d.ts.map +0 -1
  353. package/dist/__tests__/themeValidator.test.js +0 -107
  354. package/dist/__tests__/themeValidator.test.js.map +0 -1
  355. package/dist/__tests__/timing.test.d.ts +0 -2
  356. package/dist/__tests__/timing.test.d.ts.map +0 -1
  357. package/dist/__tests__/timing.test.js +0 -131
  358. package/dist/__tests__/timing.test.js.map +0 -1
  359. package/dist/__tests__/versions.test.d.ts +0 -2
  360. package/dist/__tests__/versions.test.d.ts.map +0 -1
  361. package/dist/__tests__/versions.test.js +0 -339
  362. package/dist/__tests__/versions.test.js.map +0 -1
  363. package/dist/chunk-3K5OG6KI.js.map +0 -1
  364. package/dist/chunk-57CVQCFX.js.map +0 -1
  365. package/dist/chunk-5WFRKURX.js.map +0 -1
  366. package/dist/chunk-7UDSRZKG.js.map +0 -1
  367. package/dist/chunk-B4EEON3N.js.map +0 -1
  368. package/dist/chunk-H3AXU4MJ.js.map +0 -1
  369. package/dist/chunk-KSWJR66U.js +0 -3706
  370. package/dist/chunk-KSWJR66U.js.map +0 -1
  371. package/dist/chunk-MYIH7FWD.js.map +0 -1
  372. package/dist/chunk-ZTX4PFFT.js.map +0 -1
  373. package/dist/doc/audioMapping.d.ts +0 -36
  374. package/dist/doc/audioMapping.d.ts.map +0 -1
  375. package/dist/doc/audioMapping.js +0 -350
  376. package/dist/doc/audioMapping.js.map +0 -1
  377. package/dist/doc/docToMarkdown.d.ts +0 -41
  378. package/dist/doc/docToMarkdown.d.ts.map +0 -1
  379. package/dist/doc/docToMarkdown.js +0 -88
  380. package/dist/doc/docToMarkdown.js.map +0 -1
  381. package/dist/doc/getLayers.d.ts +0 -65
  382. package/dist/doc/getLayers.d.ts.map +0 -1
  383. package/dist/doc/getLayers.js +0 -114
  384. package/dist/doc/getLayers.js.map +0 -1
  385. package/dist/doc/index.d.ts.map +0 -1
  386. package/dist/doc/markdownToDoc.d.ts +0 -75
  387. package/dist/doc/markdownToDoc.d.ts.map +0 -1
  388. package/dist/doc/markdownToDoc.js +0 -432
  389. package/dist/doc/markdownToDoc.js.map +0 -1
  390. package/dist/doc/templates/accentImage.d.ts +0 -59
  391. package/dist/doc/templates/accentImage.d.ts.map +0 -1
  392. package/dist/doc/templates/accentImage.js +0 -275
  393. package/dist/doc/templates/accentImage.js.map +0 -1
  394. package/dist/doc/templates/captionUtils.d.ts +0 -20
  395. package/dist/doc/templates/captionUtils.d.ts.map +0 -1
  396. package/dist/doc/templates/captionUtils.js +0 -29
  397. package/dist/doc/templates/captionUtils.js.map +0 -1
  398. package/dist/doc/templates/comparisonBar.d.ts +0 -13
  399. package/dist/doc/templates/comparisonBar.d.ts.map +0 -1
  400. package/dist/doc/templates/comparisonBar.js +0 -145
  401. package/dist/doc/templates/comparisonBar.js.map +0 -1
  402. package/dist/doc/templates/coverBlock.d.ts +0 -51
  403. package/dist/doc/templates/coverBlock.d.ts.map +0 -1
  404. package/dist/doc/templates/coverBlock.js +0 -153
  405. package/dist/doc/templates/coverBlock.js.map +0 -1
  406. package/dist/doc/templates/dataTable.d.ts +0 -14
  407. package/dist/doc/templates/dataTable.d.ts.map +0 -1
  408. package/dist/doc/templates/dataTable.js +0 -73
  409. package/dist/doc/templates/dataTable.js.map +0 -1
  410. package/dist/doc/templates/dateEvent.d.ts +0 -15
  411. package/dist/doc/templates/dateEvent.d.ts.map +0 -1
  412. package/dist/doc/templates/dateEvent.js +0 -114
  413. package/dist/doc/templates/dateEvent.js.map +0 -1
  414. package/dist/doc/templates/definitionCard.d.ts +0 -13
  415. package/dist/doc/templates/definitionCard.d.ts.map +0 -1
  416. package/dist/doc/templates/definitionCard.js +0 -117
  417. package/dist/doc/templates/definitionCard.js.map +0 -1
  418. package/dist/doc/templates/factCard.d.ts +0 -15
  419. package/dist/doc/templates/factCard.d.ts.map +0 -1
  420. package/dist/doc/templates/factCard.js +0 -104
  421. package/dist/doc/templates/factCard.js.map +0 -1
  422. package/dist/doc/templates/featureBlock.d.ts +0 -18
  423. package/dist/doc/templates/featureBlock.d.ts.map +0 -1
  424. package/dist/doc/templates/featureBlock.js +0 -180
  425. package/dist/doc/templates/featureBlock.js.map +0 -1
  426. package/dist/doc/templates/fullBleedQuote.d.ts +0 -25
  427. package/dist/doc/templates/fullBleedQuote.d.ts.map +0 -1
  428. package/dist/doc/templates/fullBleedQuote.js +0 -67
  429. package/dist/doc/templates/fullBleedQuote.js.map +0 -1
  430. package/dist/doc/templates/imageWithCaption.d.ts +0 -13
  431. package/dist/doc/templates/imageWithCaption.d.ts.map +0 -1
  432. package/dist/doc/templates/imageWithCaption.js +0 -146
  433. package/dist/doc/templates/imageWithCaption.js.map +0 -1
  434. package/dist/doc/templates/index.d.ts +0 -129
  435. package/dist/doc/templates/index.d.ts.map +0 -1
  436. package/dist/doc/templates/index.js +0 -478
  437. package/dist/doc/templates/index.js.map +0 -1
  438. package/dist/doc/templates/listBlock.d.ts +0 -13
  439. package/dist/doc/templates/listBlock.d.ts.map +0 -1
  440. package/dist/doc/templates/listBlock.js +0 -109
  441. package/dist/doc/templates/listBlock.js.map +0 -1
  442. package/dist/doc/templates/mapBlock.d.ts +0 -17
  443. package/dist/doc/templates/mapBlock.d.ts.map +0 -1
  444. package/dist/doc/templates/mapBlock.js +0 -115
  445. package/dist/doc/templates/mapBlock.js.map +0 -1
  446. package/dist/doc/templates/persistentLayers.d.ts +0 -39
  447. package/dist/doc/templates/persistentLayers.d.ts.map +0 -1
  448. package/dist/doc/templates/persistentLayers.js +0 -447
  449. package/dist/doc/templates/persistentLayers.js.map +0 -1
  450. package/dist/doc/templates/photoGrid.d.ts +0 -20
  451. package/dist/doc/templates/photoGrid.d.ts.map +0 -1
  452. package/dist/doc/templates/photoGrid.js +0 -175
  453. package/dist/doc/templates/photoGrid.js.map +0 -1
  454. package/dist/doc/templates/pullQuote.d.ts +0 -13
  455. package/dist/doc/templates/pullQuote.d.ts.map +0 -1
  456. package/dist/doc/templates/pullQuote.js +0 -113
  457. package/dist/doc/templates/pullQuote.js.map +0 -1
  458. package/dist/doc/templates/quoteBlock.d.ts +0 -15
  459. package/dist/doc/templates/quoteBlock.d.ts.map +0 -1
  460. package/dist/doc/templates/quoteBlock.js +0 -101
  461. package/dist/doc/templates/quoteBlock.js.map +0 -1
  462. package/dist/doc/templates/sectionHeader.d.ts +0 -14
  463. package/dist/doc/templates/sectionHeader.d.ts.map +0 -1
  464. package/dist/doc/templates/sectionHeader.js +0 -97
  465. package/dist/doc/templates/sectionHeader.js.map +0 -1
  466. package/dist/doc/templates/statHighlight.d.ts +0 -27
  467. package/dist/doc/templates/statHighlight.d.ts.map +0 -1
  468. package/dist/doc/templates/statHighlight.js +0 -114
  469. package/dist/doc/templates/statHighlight.js.map +0 -1
  470. package/dist/doc/templates/titleBlock.d.ts +0 -24
  471. package/dist/doc/templates/titleBlock.d.ts.map +0 -1
  472. package/dist/doc/templates/titleBlock.js +0 -103
  473. package/dist/doc/templates/titleBlock.js.map +0 -1
  474. package/dist/doc/templates/twoColumn.d.ts +0 -15
  475. package/dist/doc/templates/twoColumn.d.ts.map +0 -1
  476. package/dist/doc/templates/twoColumn.js +0 -225
  477. package/dist/doc/templates/twoColumn.js.map +0 -1
  478. package/dist/doc/templates/videoPullQuote.d.ts +0 -20
  479. package/dist/doc/templates/videoPullQuote.d.ts.map +0 -1
  480. package/dist/doc/templates/videoPullQuote.js +0 -122
  481. package/dist/doc/templates/videoPullQuote.js.map +0 -1
  482. package/dist/doc/templates/videoWithCaption.d.ts +0 -20
  483. package/dist/doc/templates/videoWithCaption.d.ts.map +0 -1
  484. package/dist/doc/templates/videoWithCaption.js +0 -107
  485. package/dist/doc/templates/videoWithCaption.js.map +0 -1
  486. package/dist/doc/utils/animationUtils.d.ts +0 -34
  487. package/dist/doc/utils/animationUtils.d.ts.map +0 -1
  488. package/dist/doc/utils/animationUtils.js +0 -110
  489. package/dist/doc/utils/animationUtils.js.map +0 -1
  490. package/dist/doc/utils/themeUtils.d.ts +0 -64
  491. package/dist/doc/utils/themeUtils.d.ts.map +0 -1
  492. package/dist/doc/utils/themeUtils.js +0 -136
  493. package/dist/doc/utils/themeUtils.js.map +0 -1
  494. package/dist/generate/contentExtractor.d.ts +0 -112
  495. package/dist/generate/contentExtractor.d.ts.map +0 -1
  496. package/dist/generate/contentExtractor.js +0 -638
  497. package/dist/generate/contentExtractor.js.map +0 -1
  498. package/dist/generate/index.d.ts.map +0 -1
  499. package/dist/generate/slideshowGenerator.d.ts +0 -72
  500. package/dist/generate/slideshowGenerator.d.ts.map +0 -1
  501. package/dist/generate/slideshowGenerator.js +0 -159
  502. package/dist/generate/slideshowGenerator.js.map +0 -1
  503. package/dist/generate/templateMapper.d.ts +0 -23
  504. package/dist/generate/templateMapper.d.ts.map +0 -1
  505. package/dist/generate/templateMapper.js +0 -114
  506. package/dist/generate/templateMapper.js.map +0 -1
  507. package/dist/icons/iconData.d.ts +0 -26
  508. package/dist/icons/iconData.d.ts.map +0 -1
  509. package/dist/icons/iconData.js +0 -12
  510. package/dist/icons/iconData.js.map +0 -1
  511. package/dist/icons/index.d.ts.map +0 -1
  512. package/dist/icons/resolve.d.ts +0 -61
  513. package/dist/icons/resolve.d.ts.map +0 -1
  514. package/dist/icons/resolve.js +0 -130
  515. package/dist/icons/resolve.js.map +0 -1
  516. package/dist/imageEdit/ImageEditVersionManager.d.ts +0 -31
  517. package/dist/imageEdit/ImageEditVersionManager.d.ts.map +0 -1
  518. package/dist/imageEdit/ImageEditVersionManager.js +0 -39
  519. package/dist/imageEdit/ImageEditVersionManager.js.map +0 -1
  520. package/dist/imageEdit/export.d.ts +0 -33
  521. package/dist/imageEdit/export.d.ts.map +0 -1
  522. package/dist/imageEdit/export.js +0 -253
  523. package/dist/imageEdit/export.js.map +0 -1
  524. package/dist/imageEdit/index.d.ts.map +0 -1
  525. package/dist/imageEdit/persistence.d.ts +0 -15
  526. package/dist/imageEdit/persistence.d.ts.map +0 -1
  527. package/dist/imageEdit/persistence.js +0 -49
  528. package/dist/imageEdit/persistence.js.map +0 -1
  529. package/dist/imageEdit/state.d.ts +0 -42
  530. package/dist/imageEdit/state.d.ts.map +0 -1
  531. package/dist/imageEdit/state.js +0 -98
  532. package/dist/imageEdit/state.js.map +0 -1
  533. package/dist/imageEdit/versionPaths.d.ts +0 -27
  534. package/dist/imageEdit/versionPaths.d.ts.map +0 -1
  535. package/dist/imageEdit/versionPaths.js +0 -57
  536. package/dist/imageEdit/versionPaths.js.map +0 -1
  537. package/dist/imageEdit/versions.d.ts +0 -67
  538. package/dist/imageEdit/versions.d.ts.map +0 -1
  539. package/dist/imageEdit/versions.js +0 -161
  540. package/dist/imageEdit/versions.js.map +0 -1
  541. package/dist/index.d.ts.map +0 -1
  542. package/dist/jsonForm/chooseControl.d.ts +0 -20
  543. package/dist/jsonForm/chooseControl.d.ts.map +0 -1
  544. package/dist/jsonForm/chooseControl.js +0 -82
  545. package/dist/jsonForm/chooseControl.js.map +0 -1
  546. package/dist/jsonForm/evaluateWhen.d.ts +0 -12
  547. package/dist/jsonForm/evaluateWhen.d.ts.map +0 -1
  548. package/dist/jsonForm/evaluateWhen.js +0 -65
  549. package/dist/jsonForm/evaluateWhen.js.map +0 -1
  550. package/dist/jsonForm/index.d.ts.map +0 -1
  551. package/dist/jsonForm/inferSchema.d.ts +0 -12
  552. package/dist/jsonForm/inferSchema.d.ts.map +0 -1
  553. package/dist/jsonForm/inferSchema.js +0 -15
  554. package/dist/jsonForm/inferSchema.js.map +0 -1
  555. package/dist/jsonForm/pointer.d.ts +0 -26
  556. package/dist/jsonForm/pointer.d.ts.map +0 -1
  557. package/dist/jsonForm/pointer.js +0 -102
  558. package/dist/jsonForm/pointer.js.map +0 -1
  559. package/dist/jsonForm/types.d.ts +0 -120
  560. package/dist/jsonForm/types.d.ts.map +0 -1
  561. package/dist/jsonForm/types.js +0 -10
  562. package/dist/jsonForm/types.js.map +0 -1
  563. package/dist/markdown/convert.d.ts +0 -81
  564. package/dist/markdown/convert.d.ts.map +0 -1
  565. package/dist/markdown/convert.js +0 -975
  566. package/dist/markdown/convert.js.map +0 -1
  567. package/dist/markdown/htmlParse.d.ts +0 -26
  568. package/dist/markdown/htmlParse.d.ts.map +0 -1
  569. package/dist/markdown/htmlParse.js +0 -195
  570. package/dist/markdown/htmlParse.js.map +0 -1
  571. package/dist/markdown/index.d.ts.map +0 -1
  572. package/dist/markdown/parse.d.ts +0 -27
  573. package/dist/markdown/parse.d.ts.map +0 -1
  574. package/dist/markdown/parse.js +0 -90
  575. package/dist/markdown/parse.js.map +0 -1
  576. package/dist/markdown/stringify.d.ts +0 -32
  577. package/dist/markdown/stringify.d.ts.map +0 -1
  578. package/dist/markdown/stringify.js +0 -108
  579. package/dist/markdown/stringify.js.map +0 -1
  580. package/dist/markdown/types.d.ts +0 -531
  581. package/dist/markdown/types.d.ts.map +0 -1
  582. package/dist/markdown/types.js +0 -17
  583. package/dist/markdown/types.js.map +0 -1
  584. package/dist/markdown/utils.d.ts +0 -118
  585. package/dist/markdown/utils.d.ts.map +0 -1
  586. package/dist/markdown/utils.js +0 -308
  587. package/dist/markdown/utils.js.map +0 -1
  588. package/dist/random/SeededRandom.d.ts +0 -50
  589. package/dist/random/SeededRandom.d.ts.map +0 -1
  590. package/dist/random/SeededRandom.js +0 -115
  591. package/dist/random/SeededRandom.js.map +0 -1
  592. package/dist/random/index.d.ts.map +0 -1
  593. package/dist/recommend/index.d.ts.map +0 -1
  594. package/dist/recommend/templates.d.ts +0 -39
  595. package/dist/recommend/templates.d.ts.map +0 -1
  596. package/dist/recommend/templates.js +0 -235
  597. package/dist/recommend/templates.js.map +0 -1
  598. package/dist/schemas/BlockTemplates.d.ts +0 -638
  599. package/dist/schemas/BlockTemplates.d.ts.map +0 -1
  600. package/dist/schemas/BlockTemplates.js +0 -72
  601. package/dist/schemas/BlockTemplates.js.map +0 -1
  602. package/dist/schemas/Doc.d.ts +0 -503
  603. package/dist/schemas/Doc.d.ts.map +0 -1
  604. package/dist/schemas/Doc.js +0 -90
  605. package/dist/schemas/Doc.js.map +0 -1
  606. package/dist/schemas/ImageEditDoc.d.ts +0 -81
  607. package/dist/schemas/ImageEditDoc.d.ts.map +0 -1
  608. package/dist/schemas/ImageEditDoc.js +0 -20
  609. package/dist/schemas/ImageEditDoc.js.map +0 -1
  610. package/dist/schemas/LayoutStrategy.d.ts +0 -84
  611. package/dist/schemas/LayoutStrategy.d.ts.map +0 -1
  612. package/dist/schemas/LayoutStrategy.js +0 -123
  613. package/dist/schemas/LayoutStrategy.js.map +0 -1
  614. package/dist/schemas/MediaProvider.d.ts +0 -65
  615. package/dist/schemas/MediaProvider.d.ts.map +0 -1
  616. package/dist/schemas/MediaProvider.js +0 -13
  617. package/dist/schemas/MediaProvider.js.map +0 -1
  618. package/dist/schemas/Theme.d.ts +0 -233
  619. package/dist/schemas/Theme.d.ts.map +0 -1
  620. package/dist/schemas/Theme.js +0 -129
  621. package/dist/schemas/Theme.js.map +0 -1
  622. package/dist/schemas/Types.d.ts +0 -14
  623. package/dist/schemas/Types.d.ts.map +0 -1
  624. package/dist/schemas/Types.js +0 -5
  625. package/dist/schemas/Types.js.map +0 -1
  626. package/dist/schemas/Viewport.d.ts +0 -74
  627. package/dist/schemas/Viewport.d.ts.map +0 -1
  628. package/dist/schemas/Viewport.js +0 -63
  629. package/dist/schemas/Viewport.js.map +0 -1
  630. package/dist/schemas/colorUtils.d.ts +0 -51
  631. package/dist/schemas/colorUtils.d.ts.map +0 -1
  632. package/dist/schemas/colorUtils.js +0 -154
  633. package/dist/schemas/colorUtils.js.map +0 -1
  634. package/dist/schemas/fontStacks.d.ts +0 -57
  635. package/dist/schemas/fontStacks.d.ts.map +0 -1
  636. package/dist/schemas/fontStacks.js +0 -227
  637. package/dist/schemas/fontStacks.js.map +0 -1
  638. package/dist/schemas/index.d.ts.map +0 -1
  639. package/dist/schemas/themeCompile.d.ts +0 -45
  640. package/dist/schemas/themeCompile.d.ts.map +0 -1
  641. package/dist/schemas/themeCompile.js +0 -160
  642. package/dist/schemas/themeCompile.js.map +0 -1
  643. package/dist/schemas/themeLibrary.d.ts +0 -37
  644. package/dist/schemas/themeLibrary.d.ts.map +0 -1
  645. package/dist/schemas/themeLibrary.js +0 -49
  646. package/dist/schemas/themeLibrary.js.map +0 -1
  647. package/dist/schemas/themeValidator.d.ts +0 -26
  648. package/dist/schemas/themeValidator.d.ts.map +0 -1
  649. package/dist/schemas/themeValidator.js +0 -352
  650. package/dist/schemas/themeValidator.js.map +0 -1
  651. package/dist/schemas/themes/bold.json +0 -48
  652. package/dist/schemas/themes/cinematic.json +0 -54
  653. package/dist/schemas/themes/documentary.json +0 -49
  654. package/dist/schemas/themes/gezellig.json +0 -44
  655. package/dist/schemas/themes/index.d.ts +0 -26
  656. package/dist/schemas/themes/index.d.ts.map +0 -1
  657. package/dist/schemas/themes/index.js +0 -49
  658. package/dist/schemas/themes/index.js.map +0 -1
  659. package/dist/schemas/themes/magazine.json +0 -44
  660. package/dist/schemas/themes/minimalist.json +0 -45
  661. package/dist/schemas/themes/morning-light.json +0 -42
  662. package/dist/schemas/themes/standard-dark.json +0 -50
  663. package/dist/schemas/themes/standard.json +0 -42
  664. package/dist/schemas/themes/tech-dark.json +0 -48
  665. package/dist/schemas/themes/warm-earth.json +0 -50
  666. package/dist/spatial/Geohash.d.ts +0 -85
  667. package/dist/spatial/Geohash.d.ts.map +0 -1
  668. package/dist/spatial/Geohash.js +0 -142
  669. package/dist/spatial/Geohash.js.map +0 -1
  670. package/dist/spatial/Haversine.d.ts +0 -24
  671. package/dist/spatial/Haversine.d.ts.map +0 -1
  672. package/dist/spatial/Haversine.js +0 -48
  673. package/dist/spatial/Haversine.js.map +0 -1
  674. package/dist/spatial/index.d.ts.map +0 -1
  675. package/dist/storage/ContentContainer.d.ts +0 -87
  676. package/dist/storage/ContentContainer.d.ts.map +0 -1
  677. package/dist/storage/ContentContainer.js +0 -131
  678. package/dist/storage/ContentContainer.js.map +0 -1
  679. package/dist/storage/LocalForageAdapter.d.ts +0 -36
  680. package/dist/storage/LocalForageAdapter.d.ts.map +0 -1
  681. package/dist/storage/LocalForageAdapter.js +0 -82
  682. package/dist/storage/LocalForageAdapter.js.map +0 -1
  683. package/dist/storage/LocalStorageAdapter.d.ts +0 -16
  684. package/dist/storage/LocalStorageAdapter.d.ts.map +0 -1
  685. package/dist/storage/LocalStorageAdapter.js +0 -50
  686. package/dist/storage/LocalStorageAdapter.js.map +0 -1
  687. package/dist/storage/MediaProviderFromContainer.d.ts +0 -21
  688. package/dist/storage/MediaProviderFromContainer.d.ts.map +0 -1
  689. package/dist/storage/MediaProviderFromContainer.js +0 -79
  690. package/dist/storage/MediaProviderFromContainer.js.map +0 -1
  691. package/dist/storage/MemoryStorageAdapter.d.ts +0 -15
  692. package/dist/storage/MemoryStorageAdapter.d.ts.map +0 -1
  693. package/dist/storage/MemoryStorageAdapter.js +0 -34
  694. package/dist/storage/MemoryStorageAdapter.js.map +0 -1
  695. package/dist/storage/ScopedContentContainer.d.ts +0 -44
  696. package/dist/storage/ScopedContentContainer.d.ts.map +0 -1
  697. package/dist/storage/ScopedContentContainer.js +0 -94
  698. package/dist/storage/ScopedContentContainer.js.map +0 -1
  699. package/dist/storage/Storage.d.ts +0 -23
  700. package/dist/storage/Storage.d.ts.map +0 -1
  701. package/dist/storage/Storage.js +0 -9
  702. package/dist/storage/Storage.js.map +0 -1
  703. package/dist/storage/index.d.ts.map +0 -1
  704. package/dist/timing/index.d.ts.map +0 -1
  705. package/dist/timing/narrationTiming.d.ts +0 -54
  706. package/dist/timing/narrationTiming.d.ts.map +0 -1
  707. package/dist/timing/narrationTiming.js +0 -190
  708. package/dist/timing/narrationTiming.js.map +0 -1
  709. package/dist/timing/readingTime.d.ts +0 -54
  710. package/dist/timing/readingTime.d.ts.map +0 -1
  711. package/dist/timing/readingTime.js +0 -49
  712. package/dist/timing/readingTime.js.map +0 -1
  713. package/dist/transform/applyTransform.d.ts +0 -22
  714. package/dist/transform/applyTransform.d.ts.map +0 -1
  715. package/dist/transform/applyTransform.js +0 -68
  716. package/dist/transform/applyTransform.js.map +0 -1
  717. package/dist/transform/blockAnalyzer.d.ts +0 -48
  718. package/dist/transform/blockAnalyzer.d.ts.map +0 -1
  719. package/dist/transform/blockAnalyzer.js +0 -135
  720. package/dist/transform/blockAnalyzer.js.map +0 -1
  721. package/dist/transform/index.d.ts.map +0 -1
  722. package/dist/transform/registry.d.ts +0 -19
  723. package/dist/transform/registry.d.ts.map +0 -1
  724. package/dist/transform/registry.js +0 -41
  725. package/dist/transform/registry.js.map +0 -1
  726. package/dist/transform/styles/dataDriven.d.ts +0 -4
  727. package/dist/transform/styles/dataDriven.d.ts.map +0 -1
  728. package/dist/transform/styles/dataDriven.js +0 -15
  729. package/dist/transform/styles/dataDriven.js.map +0 -1
  730. package/dist/transform/styles/documentary.d.ts +0 -4
  731. package/dist/transform/styles/documentary.d.ts.map +0 -1
  732. package/dist/transform/styles/documentary.js +0 -15
  733. package/dist/transform/styles/documentary.js.map +0 -1
  734. package/dist/transform/styles/index.d.ts +0 -6
  735. package/dist/transform/styles/index.d.ts.map +0 -1
  736. package/dist/transform/styles/index.js +0 -6
  737. package/dist/transform/styles/index.js.map +0 -1
  738. package/dist/transform/styles/magazine.d.ts +0 -4
  739. package/dist/transform/styles/magazine.d.ts.map +0 -1
  740. package/dist/transform/styles/magazine.js +0 -15
  741. package/dist/transform/styles/magazine.js.map +0 -1
  742. package/dist/transform/styles/minimal.d.ts +0 -4
  743. package/dist/transform/styles/minimal.d.ts.map +0 -1
  744. package/dist/transform/styles/minimal.js +0 -15
  745. package/dist/transform/styles/minimal.js.map +0 -1
  746. package/dist/transform/styles/narrative.d.ts +0 -4
  747. package/dist/transform/styles/narrative.d.ts.map +0 -1
  748. package/dist/transform/styles/narrative.js +0 -15
  749. package/dist/transform/styles/narrative.js.map +0 -1
  750. package/dist/transform/templateSelector.d.ts +0 -30
  751. package/dist/transform/templateSelector.d.ts.map +0 -1
  752. package/dist/transform/templateSelector.js +0 -218
  753. package/dist/transform/templateSelector.js.map +0 -1
  754. package/dist/transform/timingAllocator.d.ts +0 -21
  755. package/dist/transform/timingAllocator.d.ts.map +0 -1
  756. package/dist/transform/timingAllocator.js +0 -111
  757. package/dist/transform/timingAllocator.js.map +0 -1
  758. package/dist/transform/types.d.ts +0 -86
  759. package/dist/transform/types.d.ts.map +0 -1
  760. package/dist/transform/types.js +0 -9
  761. package/dist/transform/types.js.map +0 -1
  762. package/dist/versions/DocumentVersionManager.d.ts +0 -31
  763. package/dist/versions/DocumentVersionManager.d.ts.map +0 -1
  764. package/dist/versions/DocumentVersionManager.js +0 -33
  765. package/dist/versions/DocumentVersionManager.js.map +0 -1
  766. package/dist/versions/index.d.ts.map +0 -1
  767. package/dist/versions/operations.d.ts +0 -44
  768. package/dist/versions/operations.d.ts.map +0 -1
  769. package/dist/versions/operations.js +0 -190
  770. package/dist/versions/operations.js.map +0 -1
  771. package/dist/versions/paths.d.ts +0 -29
  772. package/dist/versions/paths.d.ts.map +0 -1
  773. package/dist/versions/paths.js +0 -66
  774. package/dist/versions/paths.js.map +0 -1
  775. package/dist/versions/timestamp.d.ts +0 -22
  776. package/dist/versions/timestamp.d.ts.map +0 -1
  777. package/dist/versions/timestamp.js +0 -44
  778. package/dist/versions/timestamp.js.map +0 -1
  779. package/dist/versions/types.d.ts +0 -92
  780. package/dist/versions/types.d.ts.map +0 -1
  781. package/dist/versions/types.js +0 -11
  782. package/dist/versions/types.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { x as ImageLayer, ad as TextLayer, a1 as ShapeLayer } from './Doc-BeSeH2iX.js';
1
+ import { N as ImageLayer, av as TextLayer, ai as ShapeLayer, a0 as PathLayer } from './Doc-BsMkmzH8.js';
2
2
 
3
3
  /**
4
4
  * ImageEditDoc — JSON document describing a layered, editable image.
@@ -9,7 +9,7 @@ import { x as ImageLayer, ad as TextLayer, a1 as ShapeLayer } from './Doc-BeSeH2
9
9
  * bytes in `assets/` and version snapshots in `.versions/`.
10
10
  *
11
11
  * Layers compose the existing core {@link Layer} types (image / text /
12
- * shape) so renderers can share infrastructure with the doc system.
12
+ * shape / path) so renderers can share infrastructure with the doc system.
13
13
  * Editor-specific metadata (name, visibility, lock, opacity, blendMode)
14
14
  * lives in {@link EditorLayerMeta} and is merged onto each layer. The
15
15
  * {@link Layer.animation} field is permitted but ignored by the image
@@ -39,8 +39,15 @@ interface EditorLayerMeta {
39
39
  */
40
40
  blendMode?: GlobalCompositeOperation;
41
41
  }
42
- /** A layer in an {@link ImageEditDoc}. */
43
- type ImageEditLayer = (ImageLayer | TextLayer | ShapeLayer) & EditorLayerMeta;
42
+ /**
43
+ * A layer in an {@link ImageEditDoc}.
44
+ *
45
+ * `path` layers carry the full drawing-shape vocabulary: when
46
+ * `content.shapeKind` is set (e.g. `'diamond'`, `'star'`, `'arrow-right'`),
47
+ * the renderer re-derives the SVG `d` from the layer's `position` box via
48
+ * `shapePath`, so the shape moves/resizes like the native rect/circle/line.
49
+ */
50
+ type ImageEditLayer = (ImageLayer | TextLayer | ShapeLayer | PathLayer) & EditorLayerMeta;
44
51
  /** The layer kinds the image editor supports. */
45
52
  type ImageEditLayerKind = ImageEditLayer['type'];
46
53
  /** Canvas dimensions and background. */
@@ -2,6 +2,10 @@ import {
2
2
  formatVersionTimestamp,
3
3
  parseVersionTimestamp
4
4
  } from "./chunk-JELIRVDP.js";
5
+ import {
6
+ markerPath,
7
+ shapePath
8
+ } from "./chunk-RUDYOTA6.js";
5
9
 
6
10
  // src/imageEdit/state.ts
7
11
  var IMAGE_EDIT_STATE_FILENAME = "state.json";
@@ -106,6 +110,44 @@ function assertImageEditDoc(value, filename) {
106
110
  if (!Array.isArray(v.layers)) {
107
111
  throw new Error(`readImageEditDoc: ${filename} layers must be an array`);
108
112
  }
113
+ v.layers.forEach((layer, i) => assertLayer(layer, i, filename));
114
+ }
115
+ var VALID_LAYER_TYPES = /* @__PURE__ */ new Set(["image", "text", "shape", "path"]);
116
+ function assertLayer(value, index, filename) {
117
+ const ctx = `${filename} layers[${index}]`;
118
+ if (!value || typeof value !== "object") {
119
+ throw new Error(`readImageEditDoc: ${ctx} must be an object`);
120
+ }
121
+ const layer = value;
122
+ if (typeof layer["id"] !== "string") {
123
+ throw new Error(`readImageEditDoc: ${ctx} must have a string id`);
124
+ }
125
+ if (typeof layer["type"] !== "string" || !VALID_LAYER_TYPES.has(layer["type"])) {
126
+ throw new Error(
127
+ `readImageEditDoc: ${ctx} type must be one of image|text|shape, got ${String(layer["type"])}`
128
+ );
129
+ }
130
+ const pos = layer["position"];
131
+ if (!pos || typeof pos !== "object" || typeof pos["x"] !== "number" && typeof pos["x"] !== "string" || typeof pos["y"] !== "number" && typeof pos["y"] !== "string") {
132
+ throw new Error(`readImageEditDoc: ${ctx} position must have numeric or string x and y`);
133
+ }
134
+ const content = layer["content"];
135
+ if (!content || typeof content !== "object") {
136
+ throw new Error(`readImageEditDoc: ${ctx} content must be an object`);
137
+ }
138
+ const c = content;
139
+ if (layer["type"] === "image" && typeof c["src"] !== "string") {
140
+ throw new Error(`readImageEditDoc: ${ctx} (image) content.src must be a string`);
141
+ }
142
+ if (layer["type"] === "text" && typeof c["text"] !== "string") {
143
+ throw new Error(`readImageEditDoc: ${ctx} (text) content.text must be a string`);
144
+ }
145
+ if (layer["type"] === "shape" && typeof c["shape"] !== "string") {
146
+ throw new Error(`readImageEditDoc: ${ctx} (shape) content.shape must be a string`);
147
+ }
148
+ if (layer["type"] === "path" && typeof c["d"] !== "string") {
149
+ throw new Error(`readImageEditDoc: ${ctx} (path) content.d must be a string`);
150
+ }
109
151
  }
110
152
 
111
153
  // src/imageEdit/versionPaths.ts
@@ -363,6 +405,9 @@ async function renderLayerInner(layer, canvas, container) {
363
405
  }
364
406
  return `<line x1="${x}" y1="${y}" x2="${x + w}" y2="${y + h}"${stroke}${strokeWidth}/>`;
365
407
  }
408
+ if (layer.type === "path") {
409
+ return renderPathToSvg(layer, x, y, w, h);
410
+ }
366
411
  const c = layer.content;
367
412
  const style = c.style;
368
413
  const lineHeight = style.lineHeight ?? 1.4;
@@ -376,6 +421,33 @@ async function renderLayerInner(layer, canvas, container) {
376
421
  const textAnchor = style.textAlign === "center" ? "middle" : style.textAlign === "right" ? "end" : "start";
377
422
  return `<text x="${x}" y="${y + style.fontSize}" font-family="${escapeAttr(fontFamily)}" font-size="${style.fontSize}" font-weight="${fontWeight}" fill="${escapeAttr(style.color)}" text-anchor="${textAnchor}">` + tspans + `</text>`;
378
423
  }
424
+ function renderPathToSvg(layer, x, y, w, h) {
425
+ const c = layer.content;
426
+ const d = c.shapeKind ? shapePath(c.shapeKind, x, y, w, h) ?? c.d : c.d;
427
+ const stroke = c.stroke ?? "#1e293b";
428
+ const strokeWidth = c.strokeWidth ?? 2;
429
+ const fill = c.fill ?? "none";
430
+ const dash = c.dasharray ? ` stroke-dasharray="${escapeAttr(c.dasharray)}"` : "";
431
+ const startStyle = effectiveExportMarker(c.startMarker, c.arrow, "start");
432
+ const endStyle = effectiveExportMarker(c.endMarker, c.arrow, "end");
433
+ const start = markerPath(startStyle, "start");
434
+ const end = markerPath(endStyle, "end");
435
+ const startId = `marker-start-${layer.id}`;
436
+ const endId = `marker-end-${layer.id}`;
437
+ const defs = start || end ? `<defs>${start ? markerDefSvg(startId, "start", start, stroke) : ""}${end ? markerDefSvg(endId, "end", end, stroke) : ""}</defs>` : "";
438
+ const markerStart = start ? ` marker-start="url(#${startId})"` : "";
439
+ const markerEnd = end ? ` marker-end="url(#${endId})"` : "";
440
+ return defs + `<path d="${escapeAttr(d)}" fill="${escapeAttr(fill)}" stroke="${escapeAttr(stroke)}" stroke-width="${strokeWidth}"${dash}${markerStart}${markerEnd}/>`;
441
+ }
442
+ function effectiveExportMarker(explicit, arrow, end) {
443
+ if (explicit) return explicit;
444
+ return arrow === "both" || arrow === end ? "arrow" : "none";
445
+ }
446
+ function markerDefSvg(id, dir, marker, stroke) {
447
+ const refX = dir === "end" ? 9 : 1;
448
+ const paint = marker.filled ? `fill="${escapeAttr(stroke)}"` : `fill="none" stroke="${escapeAttr(stroke)}" stroke-width="1.5"`;
449
+ return `<marker id="${escapeAttr(id)}" viewBox="0 0 10 10" refX="${refX}" refY="5" markerWidth="4" markerHeight="4" orient="auto-start-reverse" markerUnits="strokeWidth"><path d="${escapeAttr(marker.d)}" ${paint}/></marker>`;
450
+ }
379
451
  function preserveAspectRatioFor(fit) {
380
452
  if (fit === "cover") return "xMidYMid slice";
381
453
  if (fit === "fill") return "none";
@@ -515,6 +587,7 @@ export {
515
587
  pruneImageEditVersions,
516
588
  coalesceImageEditVersions,
517
589
  ImageEditVersionManager,
518
- exportImageEditDoc
590
+ exportImageEditDoc,
591
+ buildSvgString
519
592
  };
520
- //# sourceMappingURL=chunk-ZTX4PFFT.js.map
593
+ //# sourceMappingURL=chunk-2OIBZYKP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/imageEdit/state.ts","../src/imageEdit/persistence.ts","../src/imageEdit/versionPaths.ts","../src/imageEdit/versions.ts","../src/imageEdit/ImageEditVersionManager.ts","../src/imageEdit/export.ts"],"sourcesContent":["/**\n * Pure helpers for constructing and mutating {@link ImageEditDoc} values.\n *\n * All functions are side-effect free and return new doc objects rather\n * than mutating their inputs, so they're safe to use from a reducer.\n */\n\nimport type { ImageEditDoc, ImageEditLayer } from '../schemas/ImageEditDoc.js';\n\n/** Filename used for the persisted editor state inside the sidecar. */\nexport const IMAGE_EDIT_STATE_FILENAME = 'state.json';\n\n/** Subfolder (inside the sidecar) for embedded asset bytes. */\nexport const IMAGE_EDIT_ASSETS_PREFIX = 'assets/';\n\n/** Generate a short random layer id. */\nfunction nextLayerId(): string {\n return `layer-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Create an empty doc with the given canvas size and no layers.\n *\n * `meta.createdAt` and `meta.updatedAt` are set to the current time so\n * the doc has a complete metadata footprint from the start.\n */\nexport function createEmptyImageEditDoc(\n width: number,\n height: number,\n options: { background?: string; sourcePath?: string; now?: Date } = {},\n): ImageEditDoc {\n const now = (options.now ?? new Date()).toISOString();\n return {\n version: 1,\n canvas: {\n width,\n height,\n background: options.background ?? 'transparent',\n },\n layers: [],\n meta: {\n sourcePath: options.sourcePath,\n createdAt: now,\n updatedAt: now,\n },\n };\n}\n\n/** Append a layer (top of stack). Assigns an id when missing. */\nexport function addLayer(doc: ImageEditDoc, layer: ImageEditLayer): ImageEditDoc {\n const withId: ImageEditLayer = layer.id ? layer : { ...layer, id: nextLayerId() };\n return touch({ ...doc, layers: [...doc.layers, withId] });\n}\n\n/** Remove the layer with the given id. No-op if not found. */\nexport function removeLayer(doc: ImageEditDoc, layerId: string): ImageEditDoc {\n const next = doc.layers.filter((l) => l.id !== layerId);\n if (next.length === doc.layers.length) return doc;\n return touch({ ...doc, layers: next });\n}\n\n/**\n * Reorder a layer to a new index in the stack. The index is clamped to\n * the valid range; out-of-range / missing layers are no-ops.\n */\nexport function reorderLayer(doc: ImageEditDoc, layerId: string, toIndex: number): ImageEditDoc {\n const fromIndex = doc.layers.findIndex((l) => l.id === layerId);\n if (fromIndex < 0) return doc;\n const clamped = Math.max(0, Math.min(doc.layers.length - 1, Math.floor(toIndex)));\n if (clamped === fromIndex) return doc;\n const next = doc.layers.slice();\n const [layer] = next.splice(fromIndex, 1);\n next.splice(clamped, 0, layer!);\n return touch({ ...doc, layers: next });\n}\n\n/**\n * Replace the layer with the given id by applying a partial update.\n * The patch is shallow-merged at the top level; callers updating\n * `content`, `position`, etc. must spread those sub-objects themselves.\n */\nexport function updateLayer(\n doc: ImageEditDoc,\n layerId: string,\n patch: Partial<ImageEditLayer>,\n): ImageEditDoc {\n let changed = false;\n const next = doc.layers.map((l) => {\n if (l.id !== layerId) return l;\n changed = true;\n return { ...l, ...patch } as ImageEditLayer;\n });\n if (!changed) return doc;\n return touch({ ...doc, layers: next });\n}\n\n/** Replace the canvas configuration. */\nexport function setCanvas(doc: ImageEditDoc, canvas: ImageEditDoc['canvas']): ImageEditDoc {\n return touch({ ...doc, canvas });\n}\n\n/** Bump `meta.updatedAt`. Pure: returns a new doc. */\nexport function touch(doc: ImageEditDoc, now: Date = new Date()): ImageEditDoc {\n return {\n ...doc,\n meta: {\n ...doc.meta,\n createdAt: doc.meta?.createdAt ?? now.toISOString(),\n updatedAt: now.toISOString(),\n },\n };\n}\n","/**\n * Load and save {@link ImageEditDoc} JSON to a sidecar\n * {@link ContentContainer} (typically a {@link ScopedContentContainer}\n * rooted at `<basename>_files/`).\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { ImageEditDoc } from '../schemas/ImageEditDoc.js';\nimport { IMAGE_EDIT_STATE_FILENAME } from './state.js';\n\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\n/**\n * Read `state.json` from the sidecar and parse it. Returns `null` when\n * the file does not exist; throws on parse / shape errors.\n */\nexport async function readImageEditDoc(\n container: ContentContainer,\n filename: string = IMAGE_EDIT_STATE_FILENAME,\n): Promise<ImageEditDoc | null> {\n const data = await container.readFile(filename);\n if (!data) return null;\n const text = decoder.decode(data);\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`readImageEditDoc: ${filename} is not valid JSON: ${msg}`);\n }\n assertImageEditDoc(parsed, filename);\n return parsed;\n}\n\n/** Serialize `doc` to JSON and write it to the sidecar. */\nexport async function writeImageEditDoc(\n container: ContentContainer,\n doc: ImageEditDoc,\n filename: string = IMAGE_EDIT_STATE_FILENAME,\n): Promise<void> {\n const text = JSON.stringify(doc, null, 2);\n await container.writeFile(filename, encoder.encode(text), 'application/json');\n}\n\nfunction assertImageEditDoc(value: unknown, filename: string): asserts value is ImageEditDoc {\n if (!value || typeof value !== 'object') {\n throw new Error(`readImageEditDoc: ${filename} root must be an object`);\n }\n const v = value as Partial<ImageEditDoc>;\n if (v.version !== 1) {\n throw new Error(\n `readImageEditDoc: ${filename} has unsupported schema version ${String(v.version)} (expected 1)`,\n );\n }\n if (!v.canvas || typeof v.canvas.width !== 'number' || typeof v.canvas.height !== 'number') {\n throw new Error(`readImageEditDoc: ${filename} canvas.width/height must be numbers`);\n }\n if (!Array.isArray(v.layers)) {\n throw new Error(`readImageEditDoc: ${filename} layers must be an array`);\n }\n v.layers.forEach((layer, i) => assertLayer(layer, i, filename));\n}\n\nconst VALID_LAYER_TYPES = new Set(['image', 'text', 'shape', 'path']);\n\nfunction assertLayer(value: unknown, index: number, filename: string): void {\n const ctx = `${filename} layers[${index}]`;\n if (!value || typeof value !== 'object') {\n throw new Error(`readImageEditDoc: ${ctx} must be an object`);\n }\n const layer = value as Record<string, unknown>;\n\n if (typeof layer['id'] !== 'string') {\n throw new Error(`readImageEditDoc: ${ctx} must have a string id`);\n }\n if (typeof layer['type'] !== 'string' || !VALID_LAYER_TYPES.has(layer['type'])) {\n throw new Error(\n `readImageEditDoc: ${ctx} type must be one of image|text|shape, got ${String(layer['type'])}`,\n );\n }\n\n const pos = layer['position'];\n if (\n !pos ||\n typeof pos !== 'object' ||\n (typeof (pos as Record<string, unknown>)['x'] !== 'number' &&\n typeof (pos as Record<string, unknown>)['x'] !== 'string') ||\n (typeof (pos as Record<string, unknown>)['y'] !== 'number' &&\n typeof (pos as Record<string, unknown>)['y'] !== 'string')\n ) {\n throw new Error(`readImageEditDoc: ${ctx} position must have numeric or string x and y`);\n }\n\n const content = layer['content'];\n if (!content || typeof content !== 'object') {\n throw new Error(`readImageEditDoc: ${ctx} content must be an object`);\n }\n const c = content as Record<string, unknown>;\n\n if (layer['type'] === 'image' && typeof c['src'] !== 'string') {\n throw new Error(`readImageEditDoc: ${ctx} (image) content.src must be a string`);\n }\n if (layer['type'] === 'text' && typeof c['text'] !== 'string') {\n throw new Error(`readImageEditDoc: ${ctx} (text) content.text must be a string`);\n }\n if (layer['type'] === 'shape' && typeof c['shape'] !== 'string') {\n throw new Error(`readImageEditDoc: ${ctx} (shape) content.shape must be a string`);\n }\n if (layer['type'] === 'path' && typeof c['d'] !== 'string') {\n throw new Error(`readImageEditDoc: ${ctx} (path) content.d must be a string`);\n }\n}\n","/**\n * Path conventions for image-editor version snapshots.\n *\n * Snapshots live inside the sidecar at\n * `.versions/<basename>.<timestamp>[<-suffix>].json`. The collision\n * suffix (`-2`, `-3`, ...) is appended only when two snapshots land on\n * the same UTC second.\n *\n * Mirrors `core/src/versions/paths.ts` but keyed on `.json` instead of\n * `.md` so the two histories live side-by-side without colliding.\n */\n\nimport { formatVersionTimestamp, parseVersionTimestamp } from '../versions/timestamp.js';\n\n/** Subfolder (inside the sidecar) that holds image-editor snapshots. */\nexport const IMAGE_EDIT_VERSIONS_PREFIX = '.versions/';\n\n/** Default basename when none is supplied. Matches `IMAGE_EDIT_STATE_FILENAME` stem. */\nexport const IMAGE_EDIT_DEFAULT_BASENAME = 'state';\n\n/** Build a snapshot path. Optionally append a collision suffix. */\nexport function buildImageEditVersionPath(basename: string, date: Date, collision = 0): string {\n const stamp = formatVersionTimestamp(date);\n const suffix = collision > 0 ? `-${collision + 1}` : '';\n return `${IMAGE_EDIT_VERSIONS_PREFIX}${basename}.${stamp}${suffix}.json`;\n}\n\n/**\n * Parse a snapshot path. Returns `null` when the path doesn't match the\n * convention (so unrelated `.versions/*.json` files are ignored).\n */\nexport function parseImageEditVersionPath(\n path: string,\n): { basename: string; timestamp: Date; collision: number } | null {\n if (!path.startsWith(IMAGE_EDIT_VERSIONS_PREFIX)) return null;\n const rest = path.slice(IMAGE_EDIT_VERSIONS_PREFIX.length);\n if (!rest.endsWith('.json')) return null;\n const stem = rest.slice(0, -'.json'.length);\n const lastDot = stem.lastIndexOf('.');\n if (lastDot <= 0) return null;\n const basename = stem.slice(0, lastDot);\n const tail = stem.slice(lastDot + 1);\n const dash = tail.indexOf('-');\n let stamp: string;\n let collision = 0;\n if (dash >= 0) {\n stamp = tail.slice(0, dash);\n const n = Number(tail.slice(dash + 1));\n if (!Number.isInteger(n) || n < 2) return null;\n collision = n - 1;\n } else {\n stamp = tail;\n }\n const timestamp = parseVersionTimestamp(stamp);\n if (!timestamp) return null;\n return { basename, timestamp, collision };\n}\n","/**\n * Image-editor version operations against a sidecar\n * {@link ContentContainer}.\n *\n * Mirrors `core/src/versions/operations.ts` but operates on\n * {@link ImageEditDoc} JSON state at `.versions/<basename>.<timestamp>.json`\n * instead of the markdown document. Reuses {@link PrunePolicy} so hosts\n * can share their pruning configuration between the two histories.\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { ImageEditDoc } from '../schemas/ImageEditDoc.js';\nimport type { CoalesceOptions, PrunePolicy, Version } from '../versions/types.js';\nimport { readImageEditDoc, writeImageEditDoc } from './persistence.js';\nimport { IMAGE_EDIT_STATE_FILENAME } from './state.js';\nimport {\n IMAGE_EDIT_VERSIONS_PREFIX,\n IMAGE_EDIT_DEFAULT_BASENAME,\n buildImageEditVersionPath,\n parseImageEditVersionPath,\n} from './versionPaths.js';\n\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\n/** Options for {@link saveImageEditVersion}. */\nexport interface SaveImageEditVersionOptions {\n /** Override the doc to snapshot; otherwise `state.json` is read from the sidecar. */\n doc?: ImageEditDoc;\n /** Override the snapshot timestamp. Defaults to `new Date()`. */\n now?: Date;\n /** Skip the diff-vs-latest check and force a write. */\n force?: boolean;\n /** Override the basename used in version filenames. Defaults to `'state'`. */\n basename?: string;\n /** Override the source filename inside the sidecar. Defaults to `state.json`. */\n stateFilename?: string;\n}\n\n/** Result of a {@link saveImageEditVersion} call. */\nexport interface SaveImageEditVersionResult {\n saved: boolean;\n version: Version | null;\n /** `'saved' | 'unchanged' | 'no-state'` — `'no-state'` means there was nothing to snapshot. */\n reason: 'saved' | 'unchanged' | 'no-state';\n}\n\n/** Options for {@link revertToImageEditVersion}. */\nexport interface RevertImageEditOptions {\n /**\n * Whether to snapshot the *current* state before replacing it. Defaults to `true`.\n */\n snapshotCurrent?: boolean;\n /** Override the source filename. Defaults to `state.json`. */\n stateFilename?: string;\n}\n\n/** List image-edit snapshots in the sidecar, newest-first. */\nexport async function listImageEditVersions(\n container: ContentContainer,\n basename?: string,\n): Promise<Version[]> {\n const entries = await container.listFiles(IMAGE_EDIT_VERSIONS_PREFIX);\n const versions: Version[] = [];\n for (const entry of entries) {\n const parsed = parseImageEditVersionPath(entry.path);\n if (!parsed) continue;\n if (basename !== undefined && parsed.basename !== basename) continue;\n versions.push({\n path: entry.path,\n basename: parsed.basename,\n timestamp: parsed.timestamp,\n size: entry.size,\n collision: parsed.collision,\n });\n }\n versions.sort((a, b) => {\n const dt = b.timestamp.getTime() - a.timestamp.getTime();\n if (dt !== 0) return dt;\n return b.collision - a.collision;\n });\n return versions;\n}\n\n/** Read a snapshot's JSON text. Returns `null` if the snapshot is missing. */\nexport async function readImageEditVersionText(\n container: ContentContainer,\n version: Version | string,\n): Promise<string | null> {\n const path = typeof version === 'string' ? version : version.path;\n const data = await container.readFile(path);\n if (!data) return null;\n return decoder.decode(data);\n}\n\n/** Read and parse a snapshot. Returns `null` if missing. */\nexport async function readImageEditVersion(\n container: ContentContainer,\n version: Version | string,\n): Promise<ImageEditDoc | null> {\n const text = await readImageEditVersionText(container, version);\n if (text === null) return null;\n return JSON.parse(text) as ImageEditDoc;\n}\n\n/**\n * Snapshot the current image-editor state if it differs from the latest\n * existing snapshot.\n *\n * Diff is computed on the *serialized* JSON (with stable 2-space\n * indentation) so semantically-equal states with different key order\n * still snapshot — accept the over-snapshot rather than running a deep\n * structural compare.\n */\nexport async function saveImageEditVersion(\n container: ContentContainer,\n options: SaveImageEditVersionOptions = {},\n): Promise<SaveImageEditVersionResult> {\n const stateFilename = options.stateFilename ?? IMAGE_EDIT_STATE_FILENAME;\n const doc = options.doc ?? (await readImageEditDoc(container, stateFilename));\n if (!doc) {\n return { saved: false, version: null, reason: 'no-state' };\n }\n const basename = options.basename ?? IMAGE_EDIT_DEFAULT_BASENAME;\n const serialized = JSON.stringify(doc, null, 2);\n\n const versions = await listImageEditVersions(container, basename);\n if (!options.force && versions.length > 0) {\n const latest = versions[0]!;\n const existing = await readImageEditVersionText(container, latest);\n if (existing === serialized) {\n return { saved: false, version: null, reason: 'unchanged' };\n }\n }\n\n const now = options.now ?? new Date();\n let collision = 0;\n let path = buildImageEditVersionPath(basename, now, collision);\n while (await container.exists(path)) {\n collision += 1;\n path = buildImageEditVersionPath(basename, now, collision);\n }\n\n const data = encoder.encode(serialized);\n await container.writeFile(path, data, 'application/json');\n\n const version: Version = {\n path,\n basename,\n timestamp: now,\n size: data.byteLength,\n collision,\n };\n return { saved: true, version, reason: 'saved' };\n}\n\n/** Revert `state.json` to a prior snapshot. Snapshots the current state first by default. */\nexport async function revertToImageEditVersion(\n container: ContentContainer,\n version: Version | string,\n options: RevertImageEditOptions = {},\n): Promise<{ reverted: boolean; snapshotted: Version | null }> {\n const doc = await readImageEditVersion(container, version);\n if (!doc) {\n return { reverted: false, snapshotted: null };\n }\n\n let snapshotted: Version | null = null;\n if (options.snapshotCurrent !== false) {\n const result = await saveImageEditVersion(container, { stateFilename: options.stateFilename });\n snapshotted = result.version;\n }\n\n await writeImageEditDoc(container, doc, options.stateFilename);\n return { reverted: true, snapshotted };\n}\n\n/** Delete snapshots that don't satisfy the policy. */\nexport async function pruneImageEditVersions(\n container: ContentContainer,\n policy: PrunePolicy,\n basename?: string,\n): Promise<Version[]> {\n const versions = await listImageEditVersions(container, basename);\n const toDelete: Version[] = [];\n\n if (policy.type === 'keep-last-n') {\n const n = Math.max(0, Math.floor(policy.n));\n toDelete.push(...versions.slice(n));\n } else if (policy.type === 'older-than') {\n const cutoff = policy.date.getTime();\n for (const v of versions) {\n if (v.timestamp.getTime() < cutoff) toDelete.push(v);\n }\n } else {\n for (const v of versions) {\n if (!policy.keep(v, versions)) toDelete.push(v);\n }\n }\n\n for (const v of toDelete) {\n await container.removeFile(v.path);\n }\n return toDelete;\n}\n\n/** Collapse adjacent snapshots within `windowMs`, keeping the newer of each pair. */\nexport async function coalesceImageEditVersions(\n container: ContentContainer,\n options: CoalesceOptions = {},\n basename?: string,\n): Promise<Version[]> {\n const windowMs = options.windowMs ?? 60_000;\n const versions = await listImageEditVersions(container, basename);\n const toDelete: Version[] = [];\n if (versions.length > 0) {\n let anchor = versions[0]!;\n for (let i = 1; i < versions.length; i++) {\n const candidate = versions[i]!;\n if (anchor.timestamp.getTime() - candidate.timestamp.getTime() <= windowMs) {\n toDelete.push(candidate);\n } else {\n anchor = candidate;\n }\n }\n }\n for (const v of toDelete) {\n await container.removeFile(v.path);\n }\n return toDelete;\n}\n","/**\n * Convenience wrapper around the image-edit version operations that\n * captures a {@link ContentContainer} reference and an optional basename\n * override. Mirrors `DocumentVersionManager` in shape.\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { CoalesceOptions, PrunePolicy, Version } from '../versions/types.js';\nimport {\n coalesceImageEditVersions,\n listImageEditVersions,\n pruneImageEditVersions,\n readImageEditVersion,\n revertToImageEditVersion,\n saveImageEditVersion,\n type RevertImageEditOptions,\n type SaveImageEditVersionOptions,\n type SaveImageEditVersionResult,\n} from './versions.js';\nimport type { ImageEditDoc } from '../schemas/ImageEditDoc.js';\n\nexport interface ImageEditVersionManagerOptions {\n /** Override the basename used in version filenames. Defaults to `'state'`. */\n basename?: string;\n /** Override the source filename inside the sidecar. Defaults to `state.json`. */\n stateFilename?: string;\n}\n\nexport class ImageEditVersionManager {\n private readonly container: ContentContainer;\n private readonly basename: string | undefined;\n private readonly stateFilename: string | undefined;\n\n constructor(container: ContentContainer, options: ImageEditVersionManagerOptions = {}) {\n this.container = container;\n this.basename = options.basename;\n this.stateFilename = options.stateFilename;\n }\n\n saveVersion(options: SaveImageEditVersionOptions = {}): Promise<SaveImageEditVersionResult> {\n return saveImageEditVersion(this.container, {\n basename: this.basename,\n stateFilename: this.stateFilename,\n ...options,\n });\n }\n\n listVersions(): Promise<Version[]> {\n return listImageEditVersions(this.container, this.basename);\n }\n\n readVersion(version: Version | string): Promise<ImageEditDoc | null> {\n return readImageEditVersion(this.container, version);\n }\n\n revertToVersion(\n version: Version | string,\n options: RevertImageEditOptions = {},\n ): Promise<{ reverted: boolean; snapshotted: Version | null }> {\n return revertToImageEditVersion(this.container, version, {\n stateFilename: this.stateFilename,\n ...options,\n });\n }\n\n pruneVersions(policy: PrunePolicy): Promise<Version[]> {\n return pruneImageEditVersions(this.container, policy, this.basename);\n }\n\n coalesceVersions(options: CoalesceOptions = {}): Promise<Version[]> {\n return coalesceImageEditVersions(this.container, options, this.basename);\n }\n}\n","/**\n * Rasterize an {@link ImageEditDoc} to a PNG / JPEG / WebP {@link Blob}.\n *\n * The pipeline:\n * 1. Build an SVG string mirroring the canvas + layers, with image\n * hrefs inlined as `data:` URLs (so the canvas isn't tainted).\n * 2. Wrap the SVG in a `Blob` and load it through an `Image`.\n * 3. Draw it onto a canvas (`OffscreenCanvas` when available,\n * otherwise a detached `HTMLCanvasElement`).\n * 4. Convert the canvas to the requested format.\n *\n * Browser-only — calls `Image`, `URL.createObjectURL`, and canvas APIs.\n * Returns a Promise that rejects on SVG parse / load failures.\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { ImageEditCanvas, ImageEditDoc, ImageEditLayer } from '../schemas/ImageEditDoc.js';\nimport type { MarkerStyle, Position } from '../schemas/Doc.js';\nimport { markerPath, shapePath } from '../doc/utils/shapeGeometry.js';\n\n/** Supported export formats. */\nexport type ImageEditExportFormat = 'png' | 'jpeg' | 'webp';\n\n/** Options for {@link exportImageEditDoc}. */\nexport interface ImageEditExportOptions {\n /** Output format. Defaults to `'png'`. */\n format?: ImageEditExportFormat;\n /** JPEG/WebP quality 0..1. Defaults to `0.92`. Ignored for PNG. */\n quality?: number;\n /** Resolution scale factor. Defaults to `1` (canvas pixels = output pixels). */\n scale?: number;\n}\n\nconst FORMAT_MIME: Record<ImageEditExportFormat, string> = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n};\n\n/**\n * Export the doc to a raster {@link Blob}. Asset bytes referenced by image\n * layers are read from `container` and inlined as data URLs.\n */\nexport async function exportImageEditDoc(\n doc: ImageEditDoc,\n container: ContentContainer,\n options: ImageEditExportOptions = {},\n): Promise<Blob> {\n const format: ImageEditExportFormat = options.format ?? 'png';\n const quality = options.quality ?? 0.92;\n const scale = options.scale ?? 1;\n const mime = FORMAT_MIME[format];\n\n const svg = await buildSvgString(doc, container);\n const outW = Math.max(1, Math.round(doc.canvas.width * scale));\n const outH = Math.max(1, Math.round(doc.canvas.height * scale));\n\n const img = await loadSvgImage(svg);\n const canvas = createRasterCanvas(outW, outH);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('exportImageEditDoc: 2D canvas context unavailable');\n\n // For JPEG (no alpha), pre-fill with the canvas background or white so\n // transparent regions aren't rendered as black.\n if (format === 'jpeg') {\n const bg =\n doc.canvas.background && doc.canvas.background !== 'transparent'\n ? doc.canvas.background\n : '#ffffff';\n ctx.fillStyle = bg;\n ctx.fillRect(0, 0, outW, outH);\n }\n\n ctx.drawImage(img as CanvasImageSource, 0, 0, outW, outH);\n return canvasToBlob(canvas, mime, quality);\n}\n\n// ============================================\n// SVG construction\n// ============================================\n\n/**\n * Build the standalone SVG string that mirrors the canvas + layers. Exposed\n * for tests (the raster step needs a browser); shape/text/path layers don't\n * touch `container`, only image layers do (to inline asset bytes).\n */\nexport async function buildSvgString(\n doc: ImageEditDoc,\n container: ContentContainer,\n): Promise<string> {\n const { width, height, background } = doc.canvas;\n const bgRect =\n background && background !== 'transparent'\n ? `<rect width=\"${width}\" height=\"${height}\" fill=\"${escapeAttr(background)}\"/>`\n : '';\n\n const layerXml: string[] = [];\n for (const layer of doc.layers) {\n if (layer.visible === false) continue;\n layerXml.push(await renderLayerToSvg(layer, doc.canvas, container));\n }\n\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"` +\n ` width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">` +\n bgRect +\n layerXml.join('') +\n `</svg>`\n );\n}\n\nasync function renderLayerToSvg(\n layer: ImageEditLayer,\n canvas: ImageEditCanvas,\n container: ContentContainer,\n): Promise<string> {\n const opacity = layer.opacity ?? 1;\n const opacityAttr = opacity < 1 ? ` opacity=\"${opacity}\"` : '';\n const inner = await renderLayerInner(layer, canvas, container);\n return `<g data-layer-id=\"${escapeAttr(layer.id)}\"${opacityAttr}>${inner}</g>`;\n}\n\nasync function renderLayerInner(\n layer: ImageEditLayer,\n canvas: ImageEditCanvas,\n container: ContentContainer,\n): Promise<string> {\n const { x, y, w, h } = resolveBox(layer.position, canvas);\n\n if (layer.type === 'image') {\n const dataUrl = await loadAssetAsDataUrl(container, layer.content.src);\n return (\n `<image x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"` +\n ` preserveAspectRatio=\"${preserveAspectRatioFor(layer.content.fit)}\"` +\n ` xlink:href=\"${escapeAttr(dataUrl)}\"/>`\n );\n }\n\n if (layer.type === 'shape') {\n const c = layer.content;\n const fill = c.fill ?? 'none';\n const stroke = c.stroke ? ` stroke=\"${escapeAttr(c.stroke)}\"` : '';\n const strokeWidth = c.strokeWidth ? ` stroke-width=\"${c.strokeWidth}\"` : '';\n if (c.shape === 'rect') {\n const rx = c.borderRadius ? ` rx=\"${c.borderRadius}\" ry=\"${c.borderRadius}\"` : '';\n return `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" fill=\"${escapeAttr(fill)}\"${stroke}${strokeWidth}${rx}/>`;\n }\n if (c.shape === 'circle') {\n const r = Math.min(w, h) / 2;\n return `<circle cx=\"${x + w / 2}\" cy=\"${y + h / 2}\" r=\"${r}\" fill=\"${escapeAttr(fill)}\"${stroke}${strokeWidth}/>`;\n }\n // line\n return `<line x1=\"${x}\" y1=\"${y}\" x2=\"${x + w}\" y2=\"${y + h}\"${stroke}${strokeWidth}/>`;\n }\n\n if (layer.type === 'path') {\n return renderPathToSvg(layer, x, y, w, h);\n }\n\n // text\n const c = layer.content;\n const style = c.style;\n const lineHeight = style.lineHeight ?? 1.4;\n const lineHeightPx = style.fontSize * lineHeight;\n const lines = (c.text ?? '').split('\\n');\n const tspans = lines\n .map(\n (line, i) => `<tspan x=\"${x}\" dy=\"${i === 0 ? 0 : lineHeightPx}\">${escapeText(line)}</tspan>`,\n )\n .join('');\n const fontFamily = style.fontFamily ?? 'sans-serif';\n const fontWeight = style.fontWeight ?? 'normal';\n const textAnchor =\n style.textAlign === 'center' ? 'middle' : style.textAlign === 'right' ? 'end' : 'start';\n return (\n `<text x=\"${x}\" y=\"${y + style.fontSize}\" font-family=\"${escapeAttr(fontFamily)}\"` +\n ` font-size=\"${style.fontSize}\" font-weight=\"${fontWeight}\"` +\n ` fill=\"${escapeAttr(style.color)}\" text-anchor=\"${textAnchor}\">` +\n tspans +\n `</text>`\n );\n}\n\n/**\n * Serialize a `path` layer to SVG. Mirrors the runtime\n * `react/src/layers/PathLayer.tsx`: when `shapeKind` is set, `d` is\n * re-derived from the position box via `shapePath` (so named shapes scale);\n * otherwise the stored absolute `d` is used. Start/end markers are emitted\n * as `<marker>` defs scoped to the layer id, matching `markerPath` geometry.\n */\nfunction renderPathToSvg(\n layer: ImageEditLayer & { type: 'path' },\n x: number,\n y: number,\n w: number,\n h: number,\n): string {\n const c = layer.content;\n const d = c.shapeKind ? (shapePath(c.shapeKind, x, y, w, h) ?? c.d) : c.d;\n const stroke = c.stroke ?? '#1e293b';\n const strokeWidth = c.strokeWidth ?? 2;\n const fill = c.fill ?? 'none';\n const dash = c.dasharray ? ` stroke-dasharray=\"${escapeAttr(c.dasharray)}\"` : '';\n\n // Markers: explicit start/end win; otherwise derive from the legacy `arrow` flag.\n const startStyle = effectiveExportMarker(c.startMarker, c.arrow, 'start');\n const endStyle = effectiveExportMarker(c.endMarker, c.arrow, 'end');\n const start = markerPath(startStyle, 'start');\n const end = markerPath(endStyle, 'end');\n const startId = `marker-start-${layer.id}`;\n const endId = `marker-end-${layer.id}`;\n const defs =\n start || end\n ? `<defs>${start ? markerDefSvg(startId, 'start', start, stroke) : ''}${\n end ? markerDefSvg(endId, 'end', end, stroke) : ''\n }</defs>`\n : '';\n const markerStart = start ? ` marker-start=\"url(#${startId})\"` : '';\n const markerEnd = end ? ` marker-end=\"url(#${endId})\"` : '';\n\n return (\n defs +\n `<path d=\"${escapeAttr(d)}\" fill=\"${escapeAttr(fill)}\"` +\n ` stroke=\"${escapeAttr(stroke)}\" stroke-width=\"${strokeWidth}\"${dash}${markerStart}${markerEnd}/>`\n );\n}\n\nfunction effectiveExportMarker(\n explicit: MarkerStyle | undefined,\n arrow: (ImageEditLayer & { type: 'path' })['content']['arrow'],\n end: 'start' | 'end',\n): MarkerStyle {\n if (explicit) return explicit;\n return arrow === 'both' || arrow === end ? 'arrow' : 'none';\n}\n\nfunction markerDefSvg(\n id: string,\n dir: 'start' | 'end',\n marker: { d: string; filled: boolean },\n stroke: string,\n): string {\n const refX = dir === 'end' ? 9 : 1;\n const paint = marker.filled\n ? `fill=\"${escapeAttr(stroke)}\"`\n : `fill=\"none\" stroke=\"${escapeAttr(stroke)}\" stroke-width=\"1.5\"`;\n return (\n `<marker id=\"${escapeAttr(id)}\" viewBox=\"0 0 10 10\" refX=\"${refX}\" refY=\"5\"` +\n ` markerWidth=\"4\" markerHeight=\"4\" orient=\"auto-start-reverse\" markerUnits=\"strokeWidth\">` +\n `<path d=\"${escapeAttr(marker.d)}\" ${paint}/></marker>`\n );\n}\n\nfunction preserveAspectRatioFor(fit?: 'cover' | 'contain' | 'fill'): string {\n if (fit === 'cover') return 'xMidYMid slice';\n if (fit === 'fill') return 'none';\n return 'xMidYMid meet'; // contain (default)\n}\n\nfunction resolveBox(\n position: Position,\n canvas: ImageEditCanvas,\n): { x: number; y: number; w: number; h: number } {\n const x = resolveValue(position.x, canvas.width);\n const y = resolveValue(position.y, canvas.height);\n const w =\n position.width !== undefined ? resolveValue(position.width, canvas.width) : canvas.width;\n const h =\n position.height !== undefined ? resolveValue(position.height, canvas.height) : canvas.height;\n const offset = anchorOffset(position.anchor, w, h);\n return { x: x + offset.x, y: y + offset.y, w, h };\n}\n\nfunction resolveValue(v: number | string, base: number): number {\n if (typeof v === 'number') return v;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * base;\n return parseFloat(v) || 0;\n}\n\nfunction anchorOffset(\n anchor: Position['anchor'] | undefined,\n w: number,\n h: number,\n): { x: number; y: number } {\n switch (anchor) {\n case 'center':\n return { x: -w / 2, y: -h / 2 };\n case 'top-right':\n return { x: -w, y: 0 };\n case 'bottom-left':\n return { x: 0, y: -h };\n case 'bottom-right':\n return { x: -w, y: -h };\n case 'top-left':\n default:\n return { x: 0, y: 0 };\n }\n}\n\n// ============================================\n// Asset inlining\n// ============================================\n\nasync function loadAssetAsDataUrl(container: ContentContainer, src: string): Promise<string> {\n // Already a data: or absolute URL — pass through.\n if (/^(data:|https?:|blob:)/.test(src)) return src;\n const data = await container.readFile(src);\n if (!data) throw new Error(`exportImageEditDoc: missing asset \"${src}\"`);\n const list = await container.listFiles(src);\n const mime = list.find((e) => e.path === src)?.mimeType ?? guessMime(src);\n return arrayBufferToDataUrl(data, mime);\n}\n\nfunction arrayBufferToDataUrl(data: ArrayBuffer, mime: string): string {\n const bytes = new Uint8Array(data);\n let binary = '';\n // chunk to avoid call-stack limits with large images\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + CHUNK)));\n }\n // btoa exists in browsers and modern Node (>= 16); fall back to Buffer for older runtimes.\n const b64 = typeof btoa === 'function' ? btoa(binary) : Buffer.from(bytes).toString('base64');\n return `data:${mime};base64,${b64}`;\n}\n\nfunction guessMime(path: string): string {\n const dot = path.lastIndexOf('.');\n const ext = dot >= 0 ? path.slice(dot).toLowerCase() : '';\n switch (ext) {\n case '.png':\n return 'image/png';\n case '.jpg':\n case '.jpeg':\n return 'image/jpeg';\n case '.webp':\n return 'image/webp';\n case '.gif':\n return 'image/gif';\n case '.svg':\n return 'image/svg+xml';\n default:\n return 'application/octet-stream';\n }\n}\n\n// ============================================\n// SVG → Image → Canvas → Blob\n// ============================================\n\nasync function loadSvgImage(svg: string): Promise<HTMLImageElement> {\n const blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n return await new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('exportImageEditDoc: SVG image failed to load'));\n img.src = url;\n });\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\ntype RasterCanvas = HTMLCanvasElement | OffscreenCanvas;\n\nfunction createRasterCanvas(width: number, height: number): RasterCanvas {\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(width, height);\n }\n const c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n return c;\n}\n\nasync function canvasToBlob(canvas: RasterCanvas, mime: string, quality: number): Promise<Blob> {\n if ('convertToBlob' in canvas) {\n return canvas.convertToBlob({ type: mime, quality });\n }\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error('exportImageEditDoc: canvas.toBlob returned null'));\n },\n mime,\n quality,\n );\n });\n}\n\n// ============================================\n// XML escaping\n// ============================================\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n"],"mappings":"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","names":["decoder","encoder","c"]}
@@ -0,0 +1,45 @@
1
+ // src/icons/inlineIconMarker.ts
2
+ var SENTINEL = "\uE000";
3
+ var MARKER_RE = new RegExp(`${SENTINEL}([a-z]+):([a-zA-Z0-9-]+)${SENTINEL}`, "g");
4
+ function iconMarker(family, name) {
5
+ return `${SENTINEL}${family}:${name}${SENTINEL}`;
6
+ }
7
+ function hasIconMarker(value) {
8
+ return value.includes(SENTINEL);
9
+ }
10
+ function stripIconMarkers(value) {
11
+ return value.replace(MARKER_RE, "");
12
+ }
13
+ function splitIconMarkers(value) {
14
+ const runs = [];
15
+ let lastIndex = 0;
16
+ MARKER_RE.lastIndex = 0;
17
+ let match;
18
+ while ((match = MARKER_RE.exec(value)) !== null) {
19
+ if (match.index > lastIndex) {
20
+ runs.push({ type: "text", text: value.slice(lastIndex, match.index) });
21
+ }
22
+ runs.push({
23
+ type: "icon",
24
+ family: match[1],
25
+ name: match[2]
26
+ });
27
+ lastIndex = match.index + match[0].length;
28
+ }
29
+ if (lastIndex < value.length) {
30
+ runs.push({ type: "text", text: value.slice(lastIndex) });
31
+ }
32
+ return runs;
33
+ }
34
+ function iconClass(family, name) {
35
+ return `fa-${family} fa-${name}`;
36
+ }
37
+
38
+ export {
39
+ iconMarker,
40
+ hasIconMarker,
41
+ stripIconMarkers,
42
+ splitIconMarkers,
43
+ iconClass
44
+ };
45
+ //# sourceMappingURL=chunk-2UQOHYE2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/icons/inlineIconMarker.ts"],"sourcesContent":["/**\n * Inline-icon markers for template text.\n *\n * Slide templates flatten rich markdown body content into strings before\n * rendering. Inline icons need to survive that flattening step, so we encode\n * them as sentinel-delimited text markers and let `TextLayer` turn them back\n * into FontAwesome glyphs when rendering.\n */\n\nimport type { IconFamily } from './iconData.js';\n\n/**\n * Private-Use-Area sentinel that brackets an encoded icon.\n * Kept as an escape sequence so the source remains valid TypeScript text.\n */\nconst SENTINEL = '\\uE000';\n\n/** Matches one encoded marker: `<sentinel><family>:<name><sentinel>`. */\nconst MARKER_RE = new RegExp(`${SENTINEL}([a-z]+):([a-zA-Z0-9-]+)${SENTINEL}`, 'g');\n\n/** Encode a resolved icon (family + name) as an embeddable text marker. */\nexport function iconMarker(family: IconFamily, name: string): string {\n return `${SENTINEL}${family}:${name}${SENTINEL}`;\n}\n\n/** True when a string contains at least one encoded icon marker. */\nexport function hasIconMarker(value: string): boolean {\n return value.includes(SENTINEL);\n}\n\n/** Remove every icon marker, leaving a clean plain-text projection. */\nexport function stripIconMarkers(value: string): string {\n return value.replace(MARKER_RE, '');\n}\n\n/** A run of a marker-bearing string: literal text or a resolved icon. */\nexport type IconTextRun =\n | { type: 'text'; text: string }\n | { type: 'icon'; family: IconFamily; name: string };\n\n/**\n * Split a string into ordered text/icon runs. Text between markers is\n * preserved verbatim, including whitespace; each marker becomes an icon run.\n */\nexport function splitIconMarkers(value: string): IconTextRun[] {\n const runs: IconTextRun[] = [];\n let lastIndex = 0;\n MARKER_RE.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = MARKER_RE.exec(value)) !== null) {\n if (match.index > lastIndex) {\n runs.push({ type: 'text', text: value.slice(lastIndex, match.index) });\n }\n runs.push({\n type: 'icon',\n family: match[1] as IconFamily,\n name: match[2],\n });\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < value.length) {\n runs.push({ type: 'text', text: value.slice(lastIndex) });\n }\n\n return runs;\n}\n\n/** FontAwesome CSS class for a resolved icon, e.g. `fa-solid fa-rocket`. */\nexport function iconClass(family: IconFamily, name: string): string {\n return `fa-${family} fa-${name}`;\n}\n"],"mappings":";AAeA,IAAM,WAAW;AAGjB,IAAM,YAAY,IAAI,OAAO,GAAG,QAAQ,2BAA2B,QAAQ,IAAI,GAAG;AAG3E,SAAS,WAAW,QAAoB,MAAsB;AACnE,SAAO,GAAG,QAAQ,GAAG,MAAM,IAAI,IAAI,GAAG,QAAQ;AAChD;AAGO,SAAS,cAAc,OAAwB;AACpD,SAAO,MAAM,SAAS,QAAQ;AAChC;AAGO,SAAS,iBAAiB,OAAuB;AACtD,SAAO,MAAM,QAAQ,WAAW,EAAE;AACpC;AAWO,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,OAAsB,CAAC;AAC7B,MAAI,YAAY;AAChB,YAAU,YAAY;AAEtB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,KAAK,OAAO,MAAM;AAC/C,QAAI,MAAM,QAAQ,WAAW;AAC3B,WAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM,WAAW,MAAM,KAAK,EAAE,CAAC;AAAA,IACvE;AACA,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,QAAQ,MAAM,CAAC;AAAA,MACf,MAAM,MAAM,CAAC;AAAA,IACf,CAAC;AACD,gBAAY,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,EACrC;AAEA,MAAI,YAAY,MAAM,QAAQ;AAC5B,SAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,EAAE,CAAC;AAAA,EAC1D;AAEA,SAAO;AACT;AAGO,SAAS,UAAU,QAAoB,MAAsB;AAClE,SAAO,MAAM,MAAM,OAAO,IAAI;AAChC;","names":[]}