@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 +0,0 @@
1
- {"version":3,"sources":["../src/generate/slideshowGenerator.ts"],"sourcesContent":["/**\n * Slideshow Generator\n *\n * Turns plain text + optional images into a complete squisq `Doc`.\n *\n * Pipeline:\n * 1. Strip markdown (if needed)\n * 2. Extract compelling content (stats, dates, quotes, …)\n * 3. Estimate narration timing\n * 4. Map extractions → template blocks\n * 5. Interleave image slides\n * 6. Return a ready-to-render `Doc`\n */\n\nimport type { Doc } from '../schemas/Doc.js';\nimport type {\n TemplateBlock,\n ImageWithCaptionInput,\n TitleBlockInput,\n ColorScheme,\n AccentImage,\n AccentPosition,\n} from '../schemas/BlockTemplates.js';\nimport { extractContent, stripMarkdown } from './contentExtractor.js';\nimport { mapElementToBlock } from './templateMapper.js';\nimport { estimateNarrationDuration } from '../timing/narrationTiming.js';\nimport { SeededRandom, hashString } from '../random/SeededRandom.js';\n\n// ── Public types ───────────────────────────────────────────────────\n\n/** A Doc variant whose blocks are TemplateBlocks (no startTime required). */\nexport type SlideshowDoc = Omit<Doc, 'blocks'> & {\n blocks: TemplateBlock[];\n};\n\n/** Image metadata passed to the generator. */\nexport interface SlideshowImage {\n /** Image source path or URL. */\n src: string;\n /** Alt text for accessibility. */\n alt?: string;\n /** Photo credit. */\n credit?: string;\n /** License identifier. */\n license?: string;\n}\n\n/** Options for `generateSlideshow`. */\nexport interface SlideshowOptions {\n /** Deterministic seed (default: hash of the text). */\n seed?: number;\n /** Title slide text. Omit to skip the title slide. */\n title?: string;\n /** Subtitle for the title slide. */\n subtitle?: string;\n /** Explicit total duration in seconds. When omitted, estimated from text. */\n duration?: number;\n /** Target number of content slides (default: 5–8, auto-scaled). */\n targetSlides?: number;\n /** Color schemes to rotate (default: ['blue','green','purple','orange','red']). */\n colorSchemes?: ColorScheme[];\n /** Ambient motions to rotate on images. */\n ambientMotions?: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'>;\n /** Accent positions to rotate on text slides. */\n accentPositions?: AccentPosition[];\n /** Minimum slide duration in seconds (default: 4). */\n minSlideDuration?: number;\n /** Maximum slide duration in seconds (default: 15). */\n maxSlideDuration?: number;\n /** Theme identifier to embed in the Doc. */\n themeId?: string;\n /** Whether the input text is markdown (default: false). */\n isMarkdown?: boolean;\n /** Minimum extraction confidence (default: 0.3). */\n minConfidence?: number;\n}\n\nconst DEFAULT_COLOR_SCHEMES: ColorScheme[] = ['blue', 'green', 'purple', 'orange', 'red'];\nconst DEFAULT_AMBIENT_MOTIONS: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'> = [\n 'zoomIn',\n 'zoomOut',\n 'panLeft',\n 'panRight',\n];\nconst DEFAULT_ACCENT_POSITIONS: AccentPosition[] = ['left-strip', 'right-strip', 'bottom-strip'];\n\n// ── Main ───────────────────────────────────────────────────────────\n\n/**\n * Generate a slideshow `Doc` from text and optional images.\n *\n * ```ts\n * const doc = generateSlideshow(articleText, myImages, {\n * title: 'Mount Rainier',\n * themeId: 'documentary',\n * });\n * // doc is a complete Doc ready for DocPlayer / LinearDocView\n * ```\n */\nexport function generateSlideshow(\n text: string,\n images: SlideshowImage[] = [],\n options: SlideshowOptions = {},\n): SlideshowDoc {\n const {\n seed,\n title,\n subtitle,\n duration: explicitDuration,\n targetSlides,\n colorSchemes = DEFAULT_COLOR_SCHEMES,\n ambientMotions = DEFAULT_AMBIENT_MOTIONS,\n accentPositions = DEFAULT_ACCENT_POSITIONS,\n minSlideDuration = 4,\n maxSlideDuration = 15,\n themeId,\n isMarkdown = false,\n minConfidence = 0.3,\n } = options;\n\n const plainText = isMarkdown ? stripMarkdown(text) : text;\n const rng = new SeededRandom(seed ?? hashString(plainText));\n\n // 1. Estimate total duration\n const totalDuration = explicitDuration ?? estimateNarrationDuration(plainText);\n\n // 2. Extract compelling content\n const extraction = extractContent(plainText, { minConfidence });\n const allElements = extraction.elements;\n\n // 3. Decide slide budget\n const slideBudget = targetSlides ?? computeSlideBudget(totalDuration, allElements.length);\n\n // Allocate slots between content and images\n const imageSlotCount = images.length > 0 ? Math.max(1, Math.round(slideBudget * 0.4)) : 0;\n const contentSlotCount = Math.max(0, slideBudget - imageSlotCount - (title ? 1 : 0));\n\n // Select top elements by confidence, then restore source order\n const sorted = [...allElements].sort((a, b) => b.confidence - a.confidence);\n const selected = sorted.slice(0, contentSlotCount);\n selected.sort((a, b) => a.sourcePosition - b.sourcePosition);\n\n // 4. Build slides\n const blocks: TemplateBlock[] = [];\n let slideIndex = 0;\n let colorIdx = 0;\n let accentIdx = 0;\n\n // Determine per-slide duration\n const totalSlideCount =\n (title ? 1 : 0) + selected.length + Math.min(imageSlotCount, images.length);\n const perSlide =\n totalSlideCount > 0\n ? Math.min(maxSlideDuration, Math.max(minSlideDuration, totalDuration / totalSlideCount))\n : minSlideDuration;\n\n // Title slide\n if (title) {\n const titleBlock: TitleBlockInput = {\n id: `slide-${slideIndex++}`,\n template: 'title',\n title,\n subtitle,\n duration: Math.min(perSlide, 6),\n audioSegment: 0,\n };\n blocks.push(titleBlock);\n }\n\n // Prepare image pool for standalone + accent images\n const standaloneImages = images.slice(0, Math.min(imageSlotCount, images.length));\n const accentPool =\n images.length > standaloneImages.length ? images.slice(standaloneImages.length) : [...images]; // reuse if not enough\n\n // Interleave pattern: insert an image slide every N content slides\n const imageInterval =\n standaloneImages.length > 0\n ? Math.max(1, Math.floor(selected.length / (standaloneImages.length + 1)))\n : Infinity;\n let imgIdx = 0;\n let sinceImage = 0;\n\n for (let i = 0; i < selected.length; i++) {\n // Maybe insert a standalone image slide before this content slide\n if (sinceImage >= imageInterval && imgIdx < standaloneImages.length) {\n blocks.push(\n createImageSlide(standaloneImages[imgIdx], slideIndex++, perSlide, rng, ambientMotions),\n );\n imgIdx++;\n sinceImage = 0;\n }\n\n const element = selected[i];\n\n // Optional accent image\n let accentImage: AccentImage | undefined;\n if (accentPool.length > 0) {\n const img = accentPool[i % accentPool.length];\n accentImage = {\n src: img.src,\n alt: img.alt ?? '',\n position: accentPositions[accentIdx % accentPositions.length],\n ambientMotion: rng.pickRequired(ambientMotions),\n credit: img.credit,\n license: img.license,\n };\n accentIdx++;\n }\n\n const block = mapElementToBlock(element, {\n id: `slide-${slideIndex++}`,\n duration: perSlide,\n audioSegment: 0,\n colorScheme: colorSchemes[colorIdx % colorSchemes.length],\n accentImage,\n });\n blocks.push(block);\n colorIdx++;\n sinceImage++;\n }\n\n // Append any remaining standalone images\n while (imgIdx < standaloneImages.length) {\n blocks.push(\n createImageSlide(standaloneImages[imgIdx], slideIndex++, perSlide, rng, ambientMotions),\n );\n imgIdx++;\n }\n\n // 5. Assemble Doc\n const doc: SlideshowDoc = {\n articleId: title ?? 'slideshow',\n duration: totalDuration,\n blocks,\n audio: {\n segments: [{ src: '', name: 'main', duration: totalDuration, startTime: 0 }],\n },\n themeId,\n };\n\n return doc;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction computeSlideBudget(duration: number, elementCount: number): number {\n // Aim for ~5 slides per minute of content, clamped 3–12\n const byDuration = Math.round((duration / 60) * 5);\n // But don't exceed available elements + a few image slots\n const budget = Math.min(byDuration, elementCount + 4);\n return Math.max(3, Math.min(12, budget));\n}\n\nfunction createImageSlide(\n img: SlideshowImage,\n index: number,\n duration: number,\n rng: SeededRandom,\n motions: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'>,\n): ImageWithCaptionInput {\n return {\n id: `slide-${index}`,\n template: 'imageWithCaption',\n imageSrc: img.src,\n imageAlt: img.alt ?? '',\n caption: img.alt,\n duration,\n audioSegment: 0,\n ambientMotion: rng.pickRequired(motions),\n imageCredit: img.credit,\n imageLicense: img.license,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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}\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 { Position } from '../schemas/Doc.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\nasync function buildSvgString(doc: ImageEditDoc, container: ContentContainer): 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 // 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\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"]}
@@ -1,36 +0,0 @@
1
- /**
2
- * Audio Mapping
3
- *
4
- * Associates audio segments (MP3 files) with document blocks.
5
- * Supports two modes:
6
- *
7
- * 1. **Explicit annotation**: Blocks with `{[audio=filename.mp3]}` in their
8
- * heading annotation are directly mapped to that audio file.
9
- *
10
- * 2. **Auto-matching**: When no annotations exist but the container has MP3s
11
- * with `.timing.json` files, matches MP3s to blocks by comparing the
12
- * timing.json `sourceText` against block text content (word overlap).
13
- * Falls back to filename-based matching (slugified title comparison).
14
- */
15
- import type { Doc } from '../schemas/Doc.js';
16
- import type { ContentContainer } from '../storage/ContentContainer.js';
17
- /**
18
- * Calculate Jaccard similarity between two texts (word overlap).
19
- * Returns 0–1 where 1 = identical word sets.
20
- */
21
- export declare function scoreTextSimilarity(a: string, b: string): number;
22
- /**
23
- * Resolve audio mapping for a Doc using a ContentContainer.
24
- *
25
- * Tries explicit `{[audio=filename.mp3]}` annotations first,
26
- * then falls back to auto-matching by content similarity.
27
- *
28
- * Returns a new Doc with `audio.segments` populated and blocks
29
- * assigned to the correct `audioSegment` indices.
30
- *
31
- * @param doc - The source Doc (not mutated).
32
- * @param container - ContentContainer with MP3 and timing files.
33
- * @returns New Doc with audio segments resolved, or original doc if no matches.
34
- */
35
- export declare function resolveAudioMapping(doc: Doc, container: ContentContainer): Promise<Doc>;
36
- //# sourceMappingURL=audioMapping.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audioMapping.d.ts","sourceRoot":"","sources":["../../src/doc/audioMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAwC,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAqCvE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAYhE;AA2QD;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAqD7F"}
@@ -1,350 +0,0 @@
1
- /**
2
- * Audio Mapping
3
- *
4
- * Associates audio segments (MP3 files) with document blocks.
5
- * Supports two modes:
6
- *
7
- * 1. **Explicit annotation**: Blocks with `{[audio=filename.mp3]}` in their
8
- * heading annotation are directly mapped to that audio file.
9
- *
10
- * 2. **Auto-matching**: When no annotations exist but the container has MP3s
11
- * with `.timing.json` files, matches MP3s to blocks by comparing the
12
- * timing.json `sourceText` against block text content (word overlap).
13
- * Falls back to filename-based matching (slugified title comparison).
14
- */
15
- import { extractPlainText } from '../markdown/utils.js';
16
- // ── Helpers ──────────────────────────────────────────────────────────
17
- /**
18
- * Parse a timing.json file from raw data.
19
- */
20
- function parseTimingJson(data) {
21
- try {
22
- const text = new TextDecoder().decode(data);
23
- const parsed = JSON.parse(text);
24
- if (parsed && typeof parsed.sourceText === 'string' && typeof parsed.duration === 'number') {
25
- return {
26
- sourceText: parsed.sourceText,
27
- bookmarks: Array.isArray(parsed.bookmarks) ? parsed.bookmarks : [],
28
- duration: parsed.duration,
29
- };
30
- }
31
- return null;
32
- }
33
- catch {
34
- return null;
35
- }
36
- }
37
- /**
38
- * Normalize text for comparison: lowercase, strip punctuation, split into word set.
39
- */
40
- function normalizeToWords(text) {
41
- const words = text
42
- .toLowerCase()
43
- .replace(/[^\w\s]/g, ' ')
44
- .split(/\s+/)
45
- .filter((w) => w.length > 2);
46
- return new Set(words);
47
- }
48
- /**
49
- * Calculate Jaccard similarity between two texts (word overlap).
50
- * Returns 0–1 where 1 = identical word sets.
51
- */
52
- export function scoreTextSimilarity(a, b) {
53
- const wordsA = normalizeToWords(a);
54
- const wordsB = normalizeToWords(b);
55
- if (wordsA.size === 0 || wordsB.size === 0)
56
- return 0;
57
- let intersection = 0;
58
- for (const w of wordsA) {
59
- if (wordsB.has(w))
60
- intersection++;
61
- }
62
- const union = new Set([...wordsA, ...wordsB]).size;
63
- return union > 0 ? intersection / union : 0;
64
- }
65
- /**
66
- * Slugify a title for filename comparison.
67
- * "The Behring Gambit" → "the-behring-gambit"
68
- */
69
- function slugify(text) {
70
- return text
71
- .toLowerCase()
72
- .replace(/[^\w\s-]/g, '')
73
- .replace(/\s+/g, '-')
74
- .replace(/-+/g, '-')
75
- .replace(/^-|-$/g, '');
76
- }
77
- /**
78
- * Extract plain text from a block's contents and title.
79
- */
80
- function blockToPlainText(block) {
81
- const parts = [];
82
- if (block.title)
83
- parts.push(block.title);
84
- if (block.contents) {
85
- for (const node of block.contents) {
86
- parts.push(extractPlainText(node));
87
- }
88
- }
89
- return parts.join('\n');
90
- }
91
- /**
92
- * Flatten a block tree into a linear array of leaf blocks
93
- * (blocks that represent actual content sections).
94
- */
95
- function flattenForAudio(blocks) {
96
- const result = [];
97
- for (const block of blocks) {
98
- if (block.children && block.children.length > 0) {
99
- result.push(...flattenForAudio(block.children));
100
- }
101
- else {
102
- result.push(block);
103
- }
104
- }
105
- return result;
106
- }
107
- /**
108
- * File extensions that unambiguously denote audio anywhere in the
109
- * container. These predate the recorder feature.
110
- */
111
- const AUDIO_ONLY_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.m4a'];
112
- /**
113
- * Extensions that could be audio or video — `.webm` and `.mp4` are the
114
- * containers `MediaRecorder` produces for browser-side narration, but
115
- * they're also used for video clips. Only treat them as narration when
116
- * they live under the `audio/` directory the recorder writes to.
117
- */
118
- const AMBIGUOUS_EXTENSIONS = ['.webm', '.mp4'];
119
- function isNarrationAudioPath(path) {
120
- const lower = path.toLowerCase();
121
- if (AUDIO_ONLY_EXTENSIONS.some((ext) => lower.endsWith(ext)))
122
- return true;
123
- if (AMBIGUOUS_EXTENSIONS.some((ext) => lower.endsWith(ext))) {
124
- return lower.startsWith('audio/');
125
- }
126
- return false;
127
- }
128
- /** Strip a known narration audio extension from a filename. */
129
- function stripAudioExtension(filename) {
130
- const lower = filename.toLowerCase();
131
- for (const ext of [...AUDIO_ONLY_EXTENSIONS, ...AMBIGUOUS_EXTENSIONS]) {
132
- if (lower.endsWith(ext))
133
- return filename.slice(0, -ext.length);
134
- }
135
- return filename;
136
- }
137
- // ── Core Functions ───────────────────────────────────────────────────
138
- /**
139
- * Parse a consolidated timing.json (version 2) which contains all section
140
- * timing data in a single file.
141
- */
142
- function parseConsolidatedTiming(data) {
143
- try {
144
- const text = new TextDecoder().decode(data);
145
- const parsed = JSON.parse(text);
146
- if (parsed && parsed.version === 2 && parsed.sections) {
147
- return parsed.sections;
148
- }
149
- return null;
150
- }
151
- catch {
152
- return null;
153
- }
154
- }
155
- /**
156
- * Discover all narration audio files in a container and load their
157
- * timing data. Covers historical `.mp3`/`.wav`/`.ogg`/`.m4a` files
158
- * anywhere in the container plus `.webm`/`.mp4` files under `audio/`
159
- * (the destination the browser recorder writes to).
160
- *
161
- * Checks for a consolidated timing.json first, then falls back to
162
- * per-file `.timing.json` sidecars.
163
- */
164
- async function discoverMp3s(container) {
165
- const files = await container.listFiles();
166
- const audioFiles = files.filter((f) => isNarrationAudioPath(f.path));
167
- const results = [];
168
- // Try to load consolidated timing.json
169
- let consolidatedSections = null;
170
- const consolidatedData = await container.readFile('timing.json');
171
- if (consolidatedData) {
172
- consolidatedSections = parseConsolidatedTiming(consolidatedData);
173
- }
174
- for (const file of audioFiles) {
175
- const filename = file.path.split('/').pop() ?? file.path;
176
- let timing = null;
177
- // Try consolidated timing first: match section name from filename
178
- if (consolidatedSections) {
179
- const audioBase = stripAudioExtension(filename);
180
- for (const [sectionName, sectionTiming] of Object.entries(consolidatedSections)) {
181
- if (audioBase.endsWith(`-${sectionName}`)) {
182
- timing = sectionTiming;
183
- break;
184
- }
185
- }
186
- }
187
- // Fall back to per-file .timing.json
188
- if (!timing) {
189
- const timingPath = `${file.path}.timing.json`;
190
- const timingData = await container.readFile(timingPath);
191
- if (timingData) {
192
- timing = parseTimingJson(timingData);
193
- }
194
- }
195
- results.push({ path: file.path, filename, timing });
196
- }
197
- return results;
198
- }
199
- /**
200
- * Resolve audio from explicit `{[audio=filename.mp3]}` annotations on blocks.
201
- * Returns the matched pairs or an empty array if no annotations found.
202
- */
203
- function resolveFromAnnotations(blocks, mp3s) {
204
- const matches = [];
205
- const flat = flattenForAudio(blocks);
206
- for (const block of flat) {
207
- const audioRef = block.templateOverrides?.audio;
208
- if (!audioRef)
209
- continue;
210
- // Find the MP3 by filename (exact or suffix match)
211
- const mp3 = mp3s.find((m) => m.filename === audioRef || m.path === audioRef || m.path.endsWith(`/${audioRef}`));
212
- if (mp3) {
213
- matches.push({ block, mp3 });
214
- }
215
- }
216
- return matches;
217
- }
218
- /** Minimum similarity score to consider a content match. */
219
- const MIN_CONTENT_SIMILARITY = 0.35;
220
- /** Minimum similarity score for filename-based matching. */
221
- const MIN_FILENAME_SIMILARITY = 0.5;
222
- /**
223
- * Auto-match MP3 files to blocks by content similarity.
224
- * Uses timing.json sourceText when available, falls back to filename matching.
225
- */
226
- function autoMatchBlocks(blocks, mp3s) {
227
- const flat = flattenForAudio(blocks);
228
- if (flat.length === 0 || mp3s.length === 0)
229
- return [];
230
- // Score all (mp3, block) pairs
231
- const scoredPairs = [];
232
- for (let mi = 0; mi < mp3s.length; mi++) {
233
- const mp3 = mp3s[mi];
234
- for (let bi = 0; bi < flat.length; bi++) {
235
- const block = flat[bi];
236
- const blockText = blockToPlainText(block);
237
- if (!blockText.trim())
238
- continue;
239
- let score = 0;
240
- // Primary: content similarity via timing.json sourceText
241
- if (mp3.timing?.sourceText) {
242
- score = scoreTextSimilarity(mp3.timing.sourceText, blockText);
243
- }
244
- // Fallback: filename-based matching
245
- if (score < MIN_CONTENT_SIMILARITY && block.title) {
246
- const titleSlug = slugify(block.title);
247
- const fileSlug = slugify(stripAudioExtension(mp3.filename));
248
- // Check if the title slug appears in the filename slug
249
- if (fileSlug.includes(titleSlug) && titleSlug.length >= 3) {
250
- score = Math.max(score, MIN_FILENAME_SIMILARITY + 0.1);
251
- }
252
- }
253
- if (score >= MIN_CONTENT_SIMILARITY) {
254
- scoredPairs.push({ block, blockIndex: bi, mp3, mp3Index: mi, score });
255
- }
256
- }
257
- }
258
- // Greedy assignment: highest score first, each mp3 and block used at most once
259
- scoredPairs.sort((a, b) => b.score - a.score);
260
- const usedBlocks = new Set();
261
- const usedMp3s = new Set();
262
- const matches = [];
263
- for (const pair of scoredPairs) {
264
- if (usedBlocks.has(pair.blockIndex) || usedMp3s.has(pair.mp3Index))
265
- continue;
266
- usedBlocks.add(pair.blockIndex);
267
- usedMp3s.add(pair.mp3Index);
268
- matches.push({ block: pair.block, mp3: pair.mp3, score: pair.score });
269
- }
270
- return matches;
271
- }
272
- // ── Public API ───────────────────────────────────────────────────────
273
- /**
274
- * Resolve audio mapping for a Doc using a ContentContainer.
275
- *
276
- * Tries explicit `{[audio=filename.mp3]}` annotations first,
277
- * then falls back to auto-matching by content similarity.
278
- *
279
- * Returns a new Doc with `audio.segments` populated and blocks
280
- * assigned to the correct `audioSegment` indices.
281
- *
282
- * @param doc - The source Doc (not mutated).
283
- * @param container - ContentContainer with MP3 and timing files.
284
- * @returns New Doc with audio segments resolved, or original doc if no matches.
285
- */
286
- export async function resolveAudioMapping(doc, container) {
287
- // Discover MP3 files and their timing data
288
- const mp3s = await discoverMp3s(container);
289
- if (mp3s.length === 0)
290
- return doc;
291
- // Try annotations first
292
- let matches = resolveFromAnnotations(doc.blocks, mp3s);
293
- // Fall back to auto-matching if no annotations found
294
- if (matches.length === 0) {
295
- matches = autoMatchBlocks(doc.blocks, mp3s).map((m) => ({
296
- block: m.block,
297
- mp3: m.mp3,
298
- }));
299
- }
300
- if (matches.length === 0)
301
- return doc;
302
- // Build audio segments in document order
303
- // Sort matches by the block's position in the flattened tree
304
- const flat = flattenForAudio(doc.blocks);
305
- const blockOrder = new Map(flat.map((b, i) => [b.id, i]));
306
- matches.sort((a, b) => (blockOrder.get(a.block.id) ?? 0) - (blockOrder.get(b.block.id) ?? 0));
307
- // Build segment list and assign indices
308
- const segments = [];
309
- const blockToSegment = new Map();
310
- let startTime = 0;
311
- for (let i = 0; i < matches.length; i++) {
312
- const { block, mp3 } = matches[i];
313
- const duration = mp3.timing?.duration ?? 30; // Fallback duration if no timing
314
- segments.push({
315
- src: mp3.path,
316
- name: block.title ?? block.id,
317
- duration,
318
- startTime,
319
- });
320
- blockToSegment.set(block.id, i);
321
- startTime += duration;
322
- }
323
- // Deep clone blocks and assign audioSegment indices
324
- const newBlocks = assignSegmentIndices(doc.blocks, blockToSegment);
325
- return {
326
- ...doc,
327
- blocks: newBlocks,
328
- duration: startTime,
329
- audio: { segments },
330
- };
331
- }
332
- /**
333
- * Recursively clone blocks and assign audioSegment indices.
334
- * Blocks not in the map keep their original audioSegment.
335
- * Children of a matched block inherit the parent's segment.
336
- */
337
- function assignSegmentIndices(blocks, blockToSegment, inheritedSegment) {
338
- return blocks.map((block) => {
339
- const segment = blockToSegment.get(block.id) ?? inheritedSegment ?? block.audioSegment;
340
- const newBlock = {
341
- ...block,
342
- audioSegment: segment,
343
- };
344
- if (block.children) {
345
- newBlock.children = assignSegmentIndices(block.children, blockToSegment, segment);
346
- }
347
- return newBlock;
348
- });
349
- }
350
- //# sourceMappingURL=audioMapping.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audioMapping.js","sourceRoot":"","sources":["../../src/doc/audioMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,wEAAwE;AAExE;;GAEG;AACH,SAAS,eAAe,CAAC,IAAiB;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC3F,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;gBAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI;SACf,WAAW,EAAE;SACb,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACtD,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAErD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,YAAY,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAY;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAe;IACtC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAmBD;;;GAGG;AACH,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAE/C,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+DAA+D;AAC/D,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,qBAAqB,EAAE,GAAG,oBAAoB,CAAC,EAAE,CAAC;QACtE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wEAAwE;AAExE;;;GAGG;AACH,SAAS,uBAAuB,CAAC,IAAiB;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtD,OAAO,MAAM,CAAC,QAA2C,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,YAAY,CAAC,SAA2B;IACrD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,uCAAuC;IACvC,IAAI,oBAAoB,GAA2C,IAAI,CAAC;IACxE,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjE,IAAI,gBAAgB,EAAE,CAAC;QACrB,oBAAoB,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC;QACzD,IAAI,MAAM,GAA2B,IAAI,CAAC;QAE1C,kEAAkE;QAClE,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChD,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAChF,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC1C,MAAM,GAAG,aAAa,CAAC;oBACvB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,IAAI,cAAc,CAAC;YAC9C,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,MAAe,EACf,IAAe;IAEf,MAAM,OAAO,GAA0C,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,mDAAmD;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,CACzF,CAAC;QAEF,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4DAA4D;AAC5D,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,4DAA4D;AAC5D,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;GAGG;AACH,SAAS,eAAe,CACtB,MAAe,EACf,IAAe;IAEf,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtD,+BAA+B;IAC/B,MAAM,WAAW,GAMZ,EAAE,CAAC;IAER,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAErB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBAAE,SAAS;YAEhC,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,yDAAyD;YACzD,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;gBAC3B,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAChE,CAAC;YAED,oCAAoC;YACpC,IAAI,KAAK,GAAG,sBAAsB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC5D,uDAAuD;gBACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBAC1D,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,uBAAuB,GAAG,GAAG,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,IAAI,KAAK,IAAI,sBAAsB,EAAE,CAAC;gBACpC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAyD,EAAE,CAAC;IAEzE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC7E,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wEAAwE;AAExE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAQ,EAAE,SAA2B;IAC7E,2CAA2C;IAC3C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAElC,wBAAwB;IACxB,IAAI,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEvD,qDAAqD;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;SACX,CAAC,CAAC,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAErC,yCAAyC;IACzC,6DAA6D;IAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9F,wCAAwC;IACxC,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,iCAAiC;QAE9E,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE;YAC7B,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;QAEH,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAChC,SAAS,IAAI,QAAQ,CAAC;IACxB,CAAC;IAED,oDAAoD;IACpD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEnE,OAAO;QACL,GAAG,GAAG;QACN,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,EAAE,QAAQ,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAC3B,MAAe,EACf,cAAmC,EACnC,gBAAyB;IAEzB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,gBAAgB,IAAI,KAAK,CAAC,YAAY,CAAC;QACvF,MAAM,QAAQ,GAAU;YACtB,GAAG,KAAK;YACR,YAAY,EAAE,OAAO;SACtB,CAAC;QAEF,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,QAAQ,CAAC,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,41 +0,0 @@
1
- /**
2
- * Doc → Markdown Conversion
3
- *
4
- * Converts a Doc with a heading-driven Block hierarchy back into a
5
- * MarkdownDocument. This is the reverse of markdownToDoc() and enables
6
- * round-tripping: edit a Doc's block tree, then serialize back to markdown.
7
- *
8
- * **Algorithm:**
9
- * Walk the block tree depth-first. For each block:
10
- * 1. If it has a `sourceHeading`, emit that heading node
11
- * 2. Emit all nodes in `contents`
12
- * 3. Recurse into `children`
13
- *
14
- * @example
15
- * ```ts
16
- * import { markdownToDoc, docToMarkdown } from '@bendyline/squisq/doc';
17
- * import { parseMarkdown, stringifyMarkdown } from '@bendyline/squisq/markdown';
18
- *
19
- * const md = '# Hello\n\nWorld\n';
20
- * const doc = markdownToDoc(parseMarkdown(md));
21
- * const roundTripped = stringifyMarkdown(docToMarkdown(doc));
22
- * ```
23
- */
24
- import type { Doc } from '../schemas/Doc.js';
25
- import type { MarkdownDocument } from '../markdown/types.js';
26
- /**
27
- * Convert a Doc with heading-driven blocks back to a MarkdownDocument.
28
- *
29
- * Walks the block tree depth-first, emitting heading nodes and contents
30
- * in document order. Blocks without a `sourceHeading` (preamble blocks)
31
- * emit only their contents.
32
- *
33
- * If a block has a `template` or `templateOverrides` that aren't already
34
- * reflected in the heading's `templateAnnotation`, the annotation is
35
- * injected so the round-trip preserves template assignments.
36
- *
37
- * @param doc - A Doc whose blocks may have `sourceHeading`, `contents`, and `children`
38
- * @returns A MarkdownDocument that can be stringified back to markdown
39
- */
40
- export declare function docToMarkdown(doc: Doc): MarkdownDocument;
41
- //# sourceMappingURL=docToMarkdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docToMarkdown.d.ts","sourceRoot":"","sources":["../../src/doc/docToMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAS,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,sBAAsB,CAAC;AAEjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB,CA+BxD"}