@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
@@ -19,11 +19,20 @@ import type {
19
19
  MarkdownTableCell,
20
20
  MarkdownSourcePosition,
21
21
  HeadingTemplateAnnotation,
22
+ HeadingAttributes,
22
23
  MarkdownHeading,
23
24
  MarkdownInlineIcon,
24
25
  } from './types.js';
25
26
  import { parseHtmlToNodes } from './htmlParse.js';
26
27
  import { resolveIcon } from '../icons/resolve.js';
28
+ import { coerceAnnotationValues } from './annotationCoercion.js';
29
+ import {
30
+ matchTrailingTemplateAnnotation,
31
+ matchTrailingPandocAttr,
32
+ tokenizeAttrTokens,
33
+ splitKeyValueToken,
34
+ quoteAttrValue,
35
+ } from './attrTokens.js';
27
36
 
28
37
  // ============================================
29
38
  // Generic mdast node shape
@@ -131,22 +140,16 @@ function extractText(node: MdastNode): string {
131
140
  // Template annotation helpers
132
141
  // ============================================
133
142
 
134
- /**
135
- * Regex matching a trailing `{[templateName key=value …]}` annotation.
136
- * Captures the content between `{[` and `]}`.
137
- *
138
- * The trailing `[\s\]\}]*` tolerates accidental doubled `]}` that users
139
- * sometimes type when learning the syntax (e.g. `{[foo]}]}`). It does
140
- * not allow trailing word characters, so a non-trailing annotation like
141
- * `## The {[chart]} section` still doesn't match.
142
- */
143
- const TEMPLATE_ANNOTATION_RE = /\s*\{\[([^\]]+)\]\}[\s\]}]*$/;
144
-
145
143
  /**
146
144
  * Extract a `{[templateName key=value …]}` annotation from a heading's
147
145
  * inline children. Mutates the children array in-place: strips the
148
146
  * annotation text from the last text node (or removes the node entirely).
149
147
  *
148
+ * Matching is delegated to {@link matchTrailingTemplateAnnotation}: a
149
+ * quote-aware grammar (values may contain `]` when quoted) with a legacy
150
+ * fallback, plus tolerance for an accidental doubled trailing `]}`. A
151
+ * non-trailing annotation like `## The {[chart]} section` doesn't match.
152
+ *
150
153
  * @returns The parsed annotation, or null if none found.
151
154
  */
152
155
  function extractTemplateAnnotation(
@@ -156,13 +159,13 @@ function extractTemplateAnnotation(
156
159
  for (let i = children.length - 1; i >= 0; i--) {
157
160
  const child = children[i];
158
161
  if (child.type === 'text') {
159
- const match = child.value.match(TEMPLATE_ANNOTATION_RE);
162
+ const match = matchTrailingTemplateAnnotation(child.value);
160
163
  if (match) {
161
- const inner = match[1].trim();
164
+ const inner = match.inner.trim();
162
165
  const annotation = parseAnnotationTokens(inner);
163
166
 
164
167
  // Strip the matched portion from the text
165
- const stripped = child.value.slice(0, match.index!).replace(/\s+$/, '');
168
+ const stripped = child.value.slice(0, match.index).replace(/\s+$/, '');
166
169
  if (stripped) {
167
170
  (child as { value: string }).value = stripped;
168
171
  } else {
@@ -183,23 +186,27 @@ function extractTemplateAnnotation(
183
186
  /**
184
187
  * Parse the inner content of a `{[…]}` annotation into template + params.
185
188
  *
186
- * Input: `"chart colorScheme=blue size=large"`
187
- * Output: `{ template: 'chart', params: { colorScheme: 'blue', size: 'large' } }`
189
+ * Input: `"chart colorScheme=blue caption=\"Sales by region\""`
190
+ * Output: `{ template: 'chart', params: { colorScheme: 'blue', caption: 'Sales by region' } }`
191
+ *
192
+ * Tokenization is shared with the Pandoc attribute parser
193
+ * ({@link tokenizeAttrTokens}), so quoting and escaping behave
194
+ * identically in both annotation forms.
188
195
  */
189
196
  function parseAnnotationTokens(inner: string): HeadingTemplateAnnotation {
190
- const tokens = inner.split(/\s+/);
197
+ const tokens = tokenizeAttrTokens(inner);
191
198
  const params: Record<string, string> = {};
192
199
 
193
200
  // If the first token contains '=', there's no template name —
194
201
  // the annotation is purely key-value (e.g., `{[audio=intro.mp3]}`).
195
- const firstIsParam = tokens[0].indexOf('=') > 0;
196
- const template = firstIsParam ? undefined : tokens[0];
202
+ const firstIsParam = tokens.length > 0 && tokens[0].indexOf('=') > 0;
203
+ const template = firstIsParam || tokens.length === 0 ? undefined : tokens[0];
197
204
  const startIdx = firstIsParam ? 0 : 1;
198
205
 
199
206
  for (let i = startIdx; i < tokens.length; i++) {
200
- const eqIdx = tokens[i].indexOf('=');
201
- if (eqIdx > 0) {
202
- params[tokens[i].slice(0, eqIdx)] = tokens[i].slice(eqIdx + 1);
207
+ const kv = splitKeyValueToken(tokens[i]);
208
+ if (kv) {
209
+ params[kv.key] = kv.value;
203
210
  }
204
211
  }
205
212
 
@@ -213,8 +220,166 @@ function parseAnnotationTokens(inner: string): HeadingTemplateAnnotation {
213
220
  return result;
214
221
  }
215
222
 
223
+ // ============================================
224
+ // Pandoc-style heading attribute helpers
225
+ // ============================================
226
+
227
+ /**
228
+ * Extract a trailing Pandoc-style `{…}` attribute block from a heading's
229
+ * inline children. Matching is delegated to {@link matchTrailingPandocAttr}
230
+ * (quote-aware — values may contain `}` when quoted — with a legacy
231
+ * fallback; a `(?!\[)` lookahead keeps it from colliding with the
232
+ * squisq-native `{[…]}` template annotation).
233
+ *
234
+ * Unlike `extractTemplateAnnotation()`, this walks backward through both
235
+ * text nodes AND bare `textDirective` nodes. remark-directive may have
236
+ * fragmented a `{key=val:type,…}` attribute block at colon-prefixed
237
+ * segments like `:type` that look like text directives but are really
238
+ * attribute-value fragments. We virtually re-stitch the trailing run as a
239
+ * single string, match against it, and only physically modify the children
240
+ * array if a match is found — so a heading that legitimately contains a
241
+ * non-bare `:directive` is left alone.
242
+ *
243
+ * Returns the parsed `HeadingAttributes`, or null if no match.
244
+ */
245
+ function extractPandocAttributes(children: MarkdownInlineNode[]): HeadingAttributes | null {
246
+ // Collect the trailing run of [text | bare textDirective] children.
247
+ const trail: { val: string; idx: number; len: number }[] = [];
248
+ for (let i = children.length - 1; i >= 0; i--) {
249
+ const c = children[i];
250
+ if (c.type === 'text') {
251
+ trail.unshift({ val: c.value, idx: i, len: c.value.length });
252
+ } else if (c.type === 'textDirective') {
253
+ const td = c as {
254
+ name?: string;
255
+ children?: unknown[];
256
+ attributes?: Record<string, string>;
257
+ };
258
+ const isBare =
259
+ (!td.children || td.children.length === 0) &&
260
+ (!td.attributes || Object.keys(td.attributes).length === 0);
261
+ if (!isBare) break;
262
+ const synthesized = ':' + (td.name ?? '');
263
+ trail.unshift({ val: synthesized, idx: i, len: synthesized.length });
264
+ } else {
265
+ break;
266
+ }
267
+ }
268
+ if (trail.length === 0) return null;
269
+
270
+ const joined = trail.map((t) => t.val).join('');
271
+ const match = matchTrailingPandocAttr(joined);
272
+ if (!match) return null;
273
+
274
+ const inner = match.inner.trim();
275
+ const attrs = parsePandocAttrTokens(inner);
276
+
277
+ // Strip the matched portion. `match.index` is an offset into `joined`.
278
+ // Walk forward through `trail` until we find the child that straddles
279
+ // the match boundary; trim that child (if text) or drop it (if directive),
280
+ // and remove everything after it from `children`.
281
+ const matchStart = match.index;
282
+ let scannedLen = 0;
283
+ for (let ti = 0; ti < trail.length; ti++) {
284
+ const t = trail[ti];
285
+ if (scannedLen + t.len <= matchStart) {
286
+ scannedLen += t.len;
287
+ continue;
288
+ }
289
+ const firstNode = children[t.idx];
290
+ const keepLen = matchStart - scannedLen;
291
+ if (firstNode.type === 'text') {
292
+ const trimmed = firstNode.value.slice(0, keepLen).replace(/\s+$/, '');
293
+ if (trimmed) {
294
+ (firstNode as { value: string }).value = trimmed;
295
+ children.splice(t.idx + 1);
296
+ } else {
297
+ children.splice(t.idx);
298
+ }
299
+ } else {
300
+ // Match boundary fell inside a textDirective's synthesized ":name"
301
+ // string — drop the directive and everything after.
302
+ children.splice(t.idx);
303
+ }
304
+ return attrs;
305
+ }
306
+ // Match consumes the entire trail.
307
+ children.splice(trail[0].idx);
308
+ return attrs;
309
+ }
310
+
311
+ /**
312
+ * Parse the inner content of a Pandoc-style `{…}` block. Tokens are
313
+ * whitespace-separated, with quoted runs (single or double) treated as
314
+ * single tokens — tokenization is shared with the `{[…]}` template
315
+ * annotation parser via {@link tokenizeAttrTokens}.
316
+ *
317
+ * - `#id` → `attributes.id`
318
+ * - `.class` → push onto `attributes.classes`
319
+ * - `key=value` or `key="quoted value"` → `attributes.params[key] = value`
320
+ *
321
+ * Empty `{}` yields `{}` (preserved as an annotation marker for round-tripping).
322
+ * Duplicate ids and keys: last wins, silent.
323
+ */
324
+ export function parsePandocAttrTokens(inner: string): HeadingAttributes {
325
+ const tokens = tokenizeAttrTokens(inner);
326
+ const attrs: HeadingAttributes = {};
327
+ const params: Record<string, string> = {};
328
+ const classes: string[] = [];
329
+
330
+ for (const token of tokens) {
331
+ if (token.startsWith('#') && !token.includes('=')) {
332
+ attrs.id = token.slice(1);
333
+ } else if (token.startsWith('.') && !token.includes('=')) {
334
+ const cls = token.slice(1);
335
+ if (cls) classes.push(cls);
336
+ } else {
337
+ const kv = splitKeyValueToken(token);
338
+ if (kv) {
339
+ params[kv.key] = kv.value;
340
+ }
341
+ }
342
+ }
343
+
344
+ if (classes.length > 0) attrs.classes = classes;
345
+ if (Object.keys(params).length > 0) {
346
+ attrs.params = params;
347
+ const { blockMeta, metadata } = coerceAnnotationValues(params);
348
+ if (Object.keys(blockMeta).length > 0) attrs.blockMeta = blockMeta;
349
+ if (Object.keys(metadata).length > 0) attrs.metadata = metadata;
350
+ }
351
+ return attrs;
352
+ }
353
+
354
+ /**
355
+ * Serialize a HeadingAttributes object back to a Pandoc `{#id .class key=value}` string.
356
+ * Returns null when the attributes object is entirely empty (nothing to emit).
357
+ *
358
+ * Canonical key order: `#id`, then `.classes` (in original order), then
359
+ * params in their original insertion order. Values are quoted via the
360
+ * shared {@link quoteAttrValue} rule (same as `{[…]}` serialization).
361
+ */
362
+ export function serializePandocAttributes(attrs: HeadingAttributes): string | null {
363
+ const parts: string[] = [];
364
+ if (attrs.id) parts.push(`#${attrs.id}`);
365
+ if (attrs.classes) {
366
+ for (const cls of attrs.classes) parts.push(`.${cls}`);
367
+ }
368
+ if (attrs.params) {
369
+ for (const [key, value] of Object.entries(attrs.params)) {
370
+ parts.push(`${key}=${quoteAttrValue(value)}`);
371
+ }
372
+ }
373
+ // Preserve an empty `{}` annotation marker if it was authored deliberately
374
+ // (e.g., reserved for downstream tooling). Caller decides whether to emit.
375
+ if (parts.length === 0) return '{}';
376
+ return `{${parts.join(' ')}}`;
377
+ }
378
+
216
379
  /**
217
380
  * Serialize a HeadingTemplateAnnotation back to `{[templateName key=value …]}` text.
381
+ * Values are quoted via the shared {@link quoteAttrValue} rule (same as
382
+ * Pandoc attribute serialization).
218
383
  */
219
384
  function serializeTemplateAnnotation(annotation: HeadingTemplateAnnotation): string {
220
385
  const parts: string[] = [];
@@ -223,7 +388,7 @@ function serializeTemplateAnnotation(annotation: HeadingTemplateAnnotation): str
223
388
  }
224
389
  if (annotation.params) {
225
390
  for (const [key, value] of Object.entries(annotation.params)) {
226
- parts.push(`${key}=${value}`);
391
+ parts.push(`${key}=${quoteAttrValue(value)}`);
227
392
  }
228
393
  }
229
394
  return `{[${parts.join(' ')}]}`;
@@ -447,8 +612,33 @@ function convertBlockNode(node: MdastNode, parseHtml: boolean): MarkdownBlockNod
447
612
  // a template annotation. Anything that's NOT the template still
448
613
  // needs to become an icon node, so we run `splitInlineIcons` on
449
614
  // what's left after the template extraction.
615
+ //
616
+ // Both annotation forms ({[…]} and Pandoc {#…}) may appear at the
617
+ // end of the heading in either order. Extract them in a loop so
618
+ // we catch the second-from-last one too. A small bounded retry
619
+ // (max 4) is plenty — authors don't stack more than two trailing
620
+ // brace-blocks in practice.
450
621
  const headingChildren = convertInlineChildren(node.children ?? [], parseHtml, false);
451
- const annotation = extractTemplateAnnotation(headingChildren);
622
+ let annotation: HeadingTemplateAnnotation | null = null;
623
+ let attrs: HeadingAttributes | null = null;
624
+ for (let pass = 0; pass < 4; pass++) {
625
+ let matched = false;
626
+ if (!annotation) {
627
+ const t = extractTemplateAnnotation(headingChildren);
628
+ if (t) {
629
+ annotation = t;
630
+ matched = true;
631
+ }
632
+ }
633
+ if (!attrs) {
634
+ const a = extractPandocAttributes(headingChildren);
635
+ if (a) {
636
+ attrs = a;
637
+ matched = true;
638
+ }
639
+ }
640
+ if (!matched) break;
641
+ }
452
642
  const finalChildren = splitInlineIcons(headingChildren);
453
643
  const result: MarkdownHeading = {
454
644
  type: 'heading',
@@ -459,6 +649,9 @@ function convertBlockNode(node: MdastNode, parseHtml: boolean): MarkdownBlockNod
459
649
  if (annotation) {
460
650
  result.templateAnnotation = annotation;
461
651
  }
652
+ if (attrs) {
653
+ result.attributes = attrs;
654
+ }
462
655
  return result;
463
656
  }
464
657
 
@@ -778,9 +971,19 @@ function blockToMdast(node: MarkdownBlockNode): MdastNode {
778
971
  switch (node.type) {
779
972
  case 'heading': {
780
973
  const mdastChildren = inlineChildrenToMdast(node.children);
974
+ // Canonical trailing order: Pandoc attrs first, then template annotation.
975
+ // Author-supplied order is not preserved across round-trips by design —
976
+ // canonicalization gives stable diffs.
977
+ const suffixes: string[] = [];
978
+ if (node.attributes) {
979
+ const pandoc = serializePandocAttributes(node.attributes);
980
+ if (pandoc != null) suffixes.push(pandoc);
981
+ }
781
982
  if (node.templateAnnotation) {
782
- const suffix = serializeTemplateAnnotation(node.templateAnnotation);
783
- // Append to last text node, or create a new one
983
+ suffixes.push(serializeTemplateAnnotation(node.templateAnnotation));
984
+ }
985
+ if (suffixes.length > 0) {
986
+ const suffix = suffixes.join(' ');
784
987
  const lastChild = mdastChildren[mdastChildren.length - 1];
785
988
  if (lastChild && lastChild.type === 'text') {
786
989
  lastChild.value = (lastChild.value ?? '') + ' ' + suffix;
@@ -32,6 +32,9 @@ export type {
32
32
  // Heading template annotation
33
33
  HeadingTemplateAnnotation,
34
34
 
35
+ // Pandoc-style heading attributes
36
+ HeadingAttributes,
37
+
35
38
  // HTML sub-DOM
36
39
  HtmlElement,
37
40
  HtmlText,
@@ -96,8 +99,40 @@ export { stringifyMarkdown } from './stringify.js';
96
99
  // Conversion layer (for advanced use: working with remark plugins directly)
97
100
  export { fromMdast, toMdast } from './convert.js';
98
101
 
102
+ // Pandoc-style heading attribute helpers — exposed so editor-react can
103
+ // mutate `data-block-attrs` strings without reimplementing the tokenizer.
104
+ export { parsePandocAttrTokens, serializePandocAttributes } from './convert.js';
105
+
106
+ // Shared key=value attribute machinery for both annotation forms
107
+ // (`{[templateName key=value]}` and Pandoc `{#id .class key=value}`) —
108
+ // exposed so editor-react's tiptap bridge tokenizes and matches headings
109
+ // with the exact same grammar as the parser, by import rather than by copy.
110
+ export {
111
+ tokenizeAttrTokens,
112
+ splitKeyValueToken,
113
+ unquoteAttrValue,
114
+ needsQuoting,
115
+ quoteAttrValue,
116
+ matchTrailingTemplateAnnotation,
117
+ matchTrailingPandocAttr,
118
+ } from './attrTokens.js';
119
+ export type { TrailingAnnotationMatch } from './attrTokens.js';
120
+
121
+ // Known `{[name key=value]}` block-meta keys and their editor-facing
122
+ // descriptors — exposed so the markdown editor's attribute autocomplete
123
+ // suggests keys and (where closed) values from the same registry the parser
124
+ // coerces against, rather than a hand-maintained copy.
125
+ export {
126
+ KNOWN_BLOCK_META_KEYS,
127
+ BLOCK_META_KEY_DESCRIPTORS,
128
+ parseTimeSeconds,
129
+ } from './annotationCoercion.js';
130
+ export type { KnownBlockMetaKey, BlockMetaKeyDescriptor } from './annotationCoercion.js';
131
+
99
132
  // HTML sub-DOM utilities
100
133
  export { parseHtmlToNodes, stringifyHtmlNodes } from './htmlParse.js';
134
+ export { sanitizeHtmlNodes, sanitizeUrl } from './sanitize.js';
135
+ export type { HtmlPolicy, UrlKind } from './sanitize.js';
101
136
 
102
137
  // Tree utilities
103
138
  export {
@@ -111,4 +146,5 @@ export {
111
146
  setFrontmatterValues,
112
147
  inferDocumentTitle,
113
148
  readFrontmatterThemeId,
149
+ plainTextFromInlineHtml,
114
150
  } from './utils.js';
@@ -0,0 +1,298 @@
1
+ import type { HtmlElement, HtmlNode } from './types.js';
2
+
3
+ export type HtmlPolicy = 'strip' | 'sanitize' | 'trusted';
4
+
5
+ export type UrlKind = 'link' | 'media';
6
+
7
+ const SAFE_LINK_SCHEMES = new Set(['http', 'https', 'mailto', 'tel']);
8
+ const SAFE_MEDIA_SCHEMES = new Set(['http', 'https', 'blob']);
9
+
10
+ const SAFE_DATA_MEDIA_RE =
11
+ /^data:(?:image\/(?!svg\+xml)[a-z0-9.+-]+|audio\/[a-z0-9.+-]+|video\/[a-z0-9.+-]+);/i;
12
+
13
+ const SAFE_TAGS = new Set([
14
+ 'a',
15
+ 'abbr',
16
+ 'b',
17
+ 'blockquote',
18
+ 'br',
19
+ 'caption',
20
+ 'cite',
21
+ 'code',
22
+ 'col',
23
+ 'colgroup',
24
+ 'data',
25
+ 'dd',
26
+ 'del',
27
+ 'details',
28
+ 'dfn',
29
+ 'div',
30
+ 'dl',
31
+ 'dt',
32
+ 'em',
33
+ 'figcaption',
34
+ 'figure',
35
+ 'h1',
36
+ 'h2',
37
+ 'h3',
38
+ 'h4',
39
+ 'h5',
40
+ 'h6',
41
+ 'hr',
42
+ 'i',
43
+ 'img',
44
+ 'kbd',
45
+ 'li',
46
+ 'mark',
47
+ 'ol',
48
+ 'p',
49
+ 'pre',
50
+ 'q',
51
+ 's',
52
+ 'samp',
53
+ 'small',
54
+ 'source',
55
+ 'span',
56
+ 'strong',
57
+ 'sub',
58
+ 'summary',
59
+ 'sup',
60
+ 'table',
61
+ 'tbody',
62
+ 'td',
63
+ 'tfoot',
64
+ 'th',
65
+ 'thead',
66
+ 'time',
67
+ 'tr',
68
+ 'track',
69
+ 'u',
70
+ 'ul',
71
+ 'var',
72
+ 'video',
73
+ 'audio',
74
+ ]);
75
+
76
+ const DROP_WITH_CONTENT_TAGS = new Set([
77
+ 'base',
78
+ 'button',
79
+ 'embed',
80
+ 'form',
81
+ 'iframe',
82
+ 'input',
83
+ 'link',
84
+ 'meta',
85
+ 'object',
86
+ 'option',
87
+ 'script',
88
+ 'select',
89
+ 'style',
90
+ 'svg',
91
+ 'template',
92
+ 'textarea',
93
+ ]);
94
+
95
+ const GLOBAL_ATTRS = new Set(['class', 'id', 'title', 'role']);
96
+
97
+ const TAG_ATTRS: Record<string, Set<string>> = {
98
+ a: new Set(['href', 'target', 'rel']),
99
+ audio: new Set(['src', 'controls', 'preload', 'muted', 'loop']),
100
+ col: new Set(['span', 'width']),
101
+ colgroup: new Set(['span']),
102
+ data: new Set(['value']),
103
+ img: new Set(['src', 'alt', 'width', 'height', 'loading', 'decoding']),
104
+ li: new Set(['value']),
105
+ ol: new Set(['start', 'type']),
106
+ q: new Set(['cite']),
107
+ source: new Set(['src', 'type', 'media']),
108
+ td: new Set(['colspan', 'rowspan', 'align']),
109
+ th: new Set(['colspan', 'rowspan', 'align', 'scope']),
110
+ time: new Set(['datetime']),
111
+ track: new Set(['src', 'kind', 'label', 'srclang', 'default']),
112
+ video: new Set([
113
+ 'src',
114
+ 'poster',
115
+ 'width',
116
+ 'height',
117
+ 'controls',
118
+ 'preload',
119
+ 'muted',
120
+ 'loop',
121
+ 'playsinline',
122
+ ]),
123
+ };
124
+
125
+ const SAFE_ATTR_NAME_RE = /^[a-z][a-z0-9:_.-]*$/;
126
+ const SAFE_OL_TYPES = new Set(['1', 'a', 'A', 'i', 'I']);
127
+ const SAFE_PRELOAD_VALUES = new Set(['none', 'metadata', 'auto']);
128
+ const SAFE_TRACK_KINDS = new Set(['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']);
129
+
130
+ /**
131
+ * Sanitize a URL for a rendered link or media attribute.
132
+ *
133
+ * Relative URLs are allowed. Absolute URLs are restricted to schemes that
134
+ * cannot execute script in a document context. Media URLs additionally allow
135
+ * `blob:` and image/audio/video `data:` URLs because Squisq uses both for
136
+ * browser-local media previews and self-contained exports.
137
+ */
138
+ export function sanitizeUrl(url: string | null | undefined, kind: UrlKind = 'link'): string | null {
139
+ if (typeof url !== 'string') return null;
140
+
141
+ const trimmed = url.trim();
142
+ if (!trimmed) return null;
143
+
144
+ const compact = stripUrlSchemeNoise(trimmed);
145
+ const colon = compact.indexOf(':');
146
+ const firstPathChar = firstIndexOfAny(compact, ['/', '?', '#']);
147
+ const hasScheme = colon >= 0 && (firstPathChar < 0 || colon < firstPathChar);
148
+
149
+ if (!hasScheme) return trimmed;
150
+
151
+ const scheme = compact.slice(0, colon).toLowerCase();
152
+ if (kind === 'media') {
153
+ if (scheme === 'data') return SAFE_DATA_MEDIA_RE.test(compact) ? trimmed : null;
154
+ return SAFE_MEDIA_SCHEMES.has(scheme) ? trimmed : null;
155
+ }
156
+
157
+ return SAFE_LINK_SCHEMES.has(scheme) ? trimmed : null;
158
+ }
159
+
160
+ /**
161
+ * Return a sanitized copy of an HtmlNode tree. The original parsed tree is left
162
+ * untouched so markdown stringify can still preserve source fidelity.
163
+ */
164
+ export function sanitizeHtmlNodes(nodes: HtmlNode[]): HtmlNode[] {
165
+ const out: HtmlNode[] = [];
166
+ for (const node of nodes) {
167
+ out.push(...sanitizeHtmlNode(node));
168
+ }
169
+ return out;
170
+ }
171
+
172
+ function sanitizeHtmlNode(node: HtmlNode): HtmlNode[] {
173
+ switch (node.type) {
174
+ case 'htmlText':
175
+ return [node];
176
+ case 'htmlComment':
177
+ return [];
178
+ case 'htmlElement':
179
+ return sanitizeHtmlElement(node);
180
+ }
181
+ }
182
+
183
+ function sanitizeHtmlElement(node: HtmlElement): HtmlNode[] {
184
+ const tag = node.tagName.toLowerCase();
185
+
186
+ if (DROP_WITH_CONTENT_TAGS.has(tag)) return [];
187
+
188
+ const children = sanitizeHtmlNodes(node.children);
189
+ if (!SAFE_TAGS.has(tag)) return children;
190
+
191
+ return [
192
+ {
193
+ type: 'htmlElement',
194
+ tagName: tag,
195
+ attributes: sanitizeAttrs(tag, node.attributes),
196
+ children,
197
+ selfClosing: node.selfClosing,
198
+ },
199
+ ];
200
+ }
201
+
202
+ function sanitizeAttrs(tag: string, attrs: Record<string, string>): Record<string, string> {
203
+ const out: Record<string, string> = {};
204
+ for (const [rawName, rawValue] of Object.entries(attrs)) {
205
+ const name = rawName.toLowerCase();
206
+ if (!isAllowedAttr(tag, name)) continue;
207
+
208
+ const value = String(rawValue);
209
+ const safeValue = sanitizeAttrValue(tag, name, value);
210
+ if (safeValue === null) continue;
211
+ out[name] = safeValue;
212
+ }
213
+ if (tag === 'a' && out.target === '_blank') {
214
+ out.rel = ensureRelTokens(out.rel, ['noopener', 'noreferrer']);
215
+ }
216
+ return out;
217
+ }
218
+
219
+ function isAllowedAttr(tag: string, name: string): boolean {
220
+ if (!SAFE_ATTR_NAME_RE.test(name)) return false;
221
+ if (name.startsWith('on')) return false;
222
+ if (name.startsWith('aria-') || name.startsWith('data-')) return true;
223
+ if (GLOBAL_ATTRS.has(name)) return true;
224
+ return TAG_ATTRS[tag]?.has(name) ?? false;
225
+ }
226
+
227
+ function sanitizeAttrValue(tag: string, name: string, value: string): string | null {
228
+ if (name === 'href') return sanitizeUrl(value, 'link');
229
+ if (name === 'src' || name === 'poster') return sanitizeUrl(value, 'media');
230
+ if (
231
+ (name === 'width' ||
232
+ name === 'height' ||
233
+ name === 'span' ||
234
+ name === 'colspan' ||
235
+ name === 'rowspan' ||
236
+ name === 'value') &&
237
+ !isNonNegativeInteger(value)
238
+ ) {
239
+ return null;
240
+ }
241
+ if (name === 'start' && !isInteger(value)) return null;
242
+ if (name === 'type' && tag === 'ol' && !SAFE_OL_TYPES.has(value)) return null;
243
+ if (name === 'preload' && !SAFE_PRELOAD_VALUES.has(value)) return null;
244
+ if (name === 'kind' && tag === 'track' && !SAFE_TRACK_KINDS.has(value)) return null;
245
+ if (name === 'align' && value !== 'left' && value !== 'right' && value !== 'center') return null;
246
+ if (name === 'target')
247
+ return value === '_blank' || value === '_self' || value === '_parent' || value === '_top'
248
+ ? value
249
+ : null;
250
+ if (name === 'rel') return sanitizeRel(value);
251
+ return value;
252
+ }
253
+
254
+ function sanitizeRel(value: string): string {
255
+ return relTokens(value).join(' ');
256
+ }
257
+
258
+ function ensureRelTokens(value: string | undefined, required: string[]): string {
259
+ const tokens = new Set(value ? relTokens(value) : []);
260
+ for (const token of required) tokens.add(token);
261
+ return Array.from(tokens).join(' ');
262
+ }
263
+
264
+ function relTokens(value: string): string[] {
265
+ const tokens = value
266
+ .split(/\s+/)
267
+ .map((token) => token.trim().toLowerCase())
268
+ .filter(Boolean)
269
+ .filter((token) => /^[a-z0-9_-]+$/.test(token));
270
+ return Array.from(new Set(tokens));
271
+ }
272
+
273
+ function isInteger(value: string): boolean {
274
+ return /^-?\d+$/.test(value.trim());
275
+ }
276
+
277
+ function isNonNegativeInteger(value: string): boolean {
278
+ return /^\d+$/.test(value.trim());
279
+ }
280
+
281
+ function firstIndexOfAny(value: string, needles: string[]): number {
282
+ let result = -1;
283
+ for (const needle of needles) {
284
+ const index = value.indexOf(needle);
285
+ if (index >= 0 && (result < 0 || index < result)) result = index;
286
+ }
287
+ return result;
288
+ }
289
+
290
+ function stripUrlSchemeNoise(value: string): string {
291
+ let out = '';
292
+ for (const char of value) {
293
+ const code = char.charCodeAt(0);
294
+ if (code <= 0x20 || code === 0x7f || char.trim() === '') continue;
295
+ out += char;
296
+ }
297
+ return out;
298
+ }