@bendyline/squisq 2.1.0 → 2.2.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 (446) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +24 -0
  3. package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
  4. package/dist/{Doc-DynJleo-.d.ts → Doc-BubIpWsp.d.ts} +1 -1
  5. package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-CGxk5CHc.d.ts} +1 -1
  6. package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
  7. package/dist/chunk-2L55443L.js +0 -0
  8. package/dist/{chunk-VWCJ2WXC.js → chunk-2ZWIXGAC.js} +0 -1
  9. package/dist/{chunk-VYFRI7R6.js → chunk-32R2RZAO.js} +72 -3
  10. package/dist/chunk-3IGPAPQ7.js +645 -0
  11. package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
  12. package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
  13. package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
  14. package/dist/{chunk-JI77MGAK.js → chunk-7ARJZYQY.js} +159 -120
  15. package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
  16. package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
  17. package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
  18. package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
  19. package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
  20. package/dist/chunk-BCCXTMN5.js +699 -0
  21. package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
  22. package/dist/{chunk-QUUPYOSP.js → chunk-CB45YGAM.js} +2 -3
  23. package/dist/{chunk-XNLB57UD.js → chunk-DYPMOPIW.js} +18 -2
  24. package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
  25. package/dist/{chunk-5UYI3RJB.js → chunk-FDYDYL77.js} +54 -40
  26. package/dist/{chunk-OTKVFVL6.js → chunk-I2O6W7DX.js} +116 -44
  27. package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
  28. package/dist/chunk-OPO5K4DZ.js +241 -0
  29. package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
  30. package/dist/chunk-QKPXHDLR.js +0 -0
  31. package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
  32. package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
  33. package/dist/chunk-WV5ARNDA.js +0 -0
  34. package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
  35. package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
  36. package/dist/chunk-XWNNA3KE.js +0 -0
  37. package/dist/chunk-YZNGMV3G.js +0 -0
  38. package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
  39. package/dist/doc/index.d.ts +27 -12
  40. package/dist/doc/index.js +16 -17
  41. package/dist/generate/index.d.ts +2 -2
  42. package/dist/generate/index.js +2 -3
  43. package/dist/icons/index.js +3 -4
  44. package/dist/icons/inlineIconMarker.js +1 -2
  45. package/dist/imageEdit/index.d.ts +48 -17
  46. package/dist/imageEdit/index.js +3 -4
  47. package/dist/index.d.ts +11 -11
  48. package/dist/index.js +60 -33
  49. package/dist/jsonForm/index.d.ts +10 -3
  50. package/dist/jsonForm/index.js +8 -7
  51. package/dist/markdown/index.d.ts +75 -11
  52. package/dist/markdown/index.js +32 -7
  53. package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-wSLA2A1g.d.ts} +2 -2
  54. package/dist/narration/index.d.ts +16 -3
  55. package/dist/narration/index.js +13 -14
  56. package/dist/random/index.d.ts +11 -2
  57. package/dist/random/index.js +2 -3
  58. package/dist/recommend/index.d.ts +1 -1
  59. package/dist/recommend/index.js +3 -4
  60. package/dist/schemas/index.d.ts +5 -5
  61. package/dist/schemas/index.js +5 -6
  62. package/dist/spatial/index.d.ts +2 -1
  63. package/dist/spatial/index.js +1 -2
  64. package/dist/storage/index.d.ts +4 -2
  65. package/dist/storage/index.js +1 -2
  66. package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
  67. package/dist/timing/index.js +3 -4
  68. package/dist/transform/index.d.ts +3 -3
  69. package/dist/transform/index.js +6 -7
  70. package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
  71. package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
  72. package/dist/versions/index.d.ts +14 -11
  73. package/dist/versions/index.js +2 -3
  74. package/package.json +4 -2
  75. package/dist/chunk-2UQOHYE2.js.map +0 -1
  76. package/dist/chunk-3E5F2XMR.js.map +0 -1
  77. package/dist/chunk-4X3JQXNM.js.map +0 -1
  78. package/dist/chunk-5DKBFXPY.js.map +0 -1
  79. package/dist/chunk-5J4HKRJF.js.map +0 -1
  80. package/dist/chunk-5UYI3RJB.js.map +0 -1
  81. package/dist/chunk-66QO7XFB.js.map +0 -1
  82. package/dist/chunk-AMIR72JP.js +0 -380
  83. package/dist/chunk-AMIR72JP.js.map +0 -1
  84. package/dist/chunk-DBS6RIFL.js.map +0 -1
  85. package/dist/chunk-DNJKBAI7.js +0 -1
  86. package/dist/chunk-DNJKBAI7.js.map +0 -1
  87. package/dist/chunk-ET53IIEP.js +0 -1
  88. package/dist/chunk-ET53IIEP.js.map +0 -1
  89. package/dist/chunk-FVTQSNR7.js.map +0 -1
  90. package/dist/chunk-GZY66SDN.js.map +0 -1
  91. package/dist/chunk-ILWDXLUK.js.map +0 -1
  92. package/dist/chunk-JHZWYRSW.js.map +0 -1
  93. package/dist/chunk-JI77MGAK.js.map +0 -1
  94. package/dist/chunk-JOQYPRDZ.js.map +0 -1
  95. package/dist/chunk-OTKVFVL6.js.map +0 -1
  96. package/dist/chunk-PGGGKYWG.js +0 -1
  97. package/dist/chunk-PGGGKYWG.js.map +0 -1
  98. package/dist/chunk-Q7LROV2H.js.map +0 -1
  99. package/dist/chunk-QE7TWGVT.js.map +0 -1
  100. package/dist/chunk-QUUPYOSP.js.map +0 -1
  101. package/dist/chunk-R2GC6RLD.js +0 -344
  102. package/dist/chunk-R2GC6RLD.js.map +0 -1
  103. package/dist/chunk-R2YZTCLO.js.map +0 -1
  104. package/dist/chunk-S7A5D7ZJ.js +0 -174
  105. package/dist/chunk-S7A5D7ZJ.js.map +0 -1
  106. package/dist/chunk-TUWMK62B.js.map +0 -1
  107. package/dist/chunk-V543AI2F.js +0 -1
  108. package/dist/chunk-V543AI2F.js.map +0 -1
  109. package/dist/chunk-VR7UPJ7C.js.map +0 -1
  110. package/dist/chunk-VWCJ2WXC.js.map +0 -1
  111. package/dist/chunk-VYFRI7R6.js.map +0 -1
  112. package/dist/chunk-XNLB57UD.js.map +0 -1
  113. package/dist/chunk-ZLQKNOZQ.js +0 -1
  114. package/dist/chunk-ZLQKNOZQ.js.map +0 -1
  115. package/dist/doc/index.js.map +0 -1
  116. package/dist/generate/index.js.map +0 -1
  117. package/dist/icons/index.js.map +0 -1
  118. package/dist/icons/inlineIconMarker.js.map +0 -1
  119. package/dist/imageEdit/index.js.map +0 -1
  120. package/dist/index.js.map +0 -1
  121. package/dist/jsonForm/index.js.map +0 -1
  122. package/dist/markdown/index.js.map +0 -1
  123. package/dist/narration/index.js.map +0 -1
  124. package/dist/random/index.js.map +0 -1
  125. package/dist/recommend/index.js.map +0 -1
  126. package/dist/schemas/index.js.map +0 -1
  127. package/dist/spatial/index.js.map +0 -1
  128. package/dist/storage/index.js.map +0 -1
  129. package/dist/timing/index.js.map +0 -1
  130. package/dist/transform/index.js.map +0 -1
  131. package/dist/versions/index.js.map +0 -1
  132. package/src/__tests__/animationUtils.test.ts +0 -117
  133. package/src/__tests__/annotationCoercion.test.ts +0 -243
  134. package/src/__tests__/applyNarrationTiming.test.ts +0 -190
  135. package/src/__tests__/applyRenderStyle.test.ts +0 -146
  136. package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
  137. package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
  138. package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
  139. package/src/__tests__/asciiDiagramParse.test.ts +0 -233
  140. package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
  141. package/src/__tests__/asciiDiagramRender.test.ts +0 -162
  142. package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
  143. package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
  144. package/src/__tests__/asciiTimelineParse.test.ts +0 -205
  145. package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
  146. package/src/__tests__/asciiTimelineRender.test.ts +0 -376
  147. package/src/__tests__/atmosphereLayers.test.ts +0 -108
  148. package/src/__tests__/attrTokens.test.ts +0 -167
  149. package/src/__tests__/colorUtils.test.ts +0 -112
  150. package/src/__tests__/contentContainer.test.ts +0 -325
  151. package/src/__tests__/contentExtractor.test.ts +0 -243
  152. package/src/__tests__/coverBlock.test.ts +0 -310
  153. package/src/__tests__/customTemplateSample.test.ts +0 -144
  154. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
  155. package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
  156. package/src/__tests__/dataTable.test.ts +0 -145
  157. package/src/__tests__/diagramBlock.test.ts +0 -122
  158. package/src/__tests__/diagramLayout.test.ts +0 -134
  159. package/src/__tests__/diagramText.test.ts +0 -26
  160. package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
  161. package/src/__tests__/drawing.test.ts +0 -109
  162. package/src/__tests__/drawingBlock.test.ts +0 -124
  163. package/src/__tests__/drawingLayout.test.ts +0 -171
  164. package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
  165. package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
  166. package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
  167. package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
  168. package/src/__tests__/geohash.test.ts +0 -110
  169. package/src/__tests__/getLayers.test.ts +0 -243
  170. package/src/__tests__/getLayersFallback.test.ts +0 -103
  171. package/src/__tests__/haversine.test.ts +0 -63
  172. package/src/__tests__/iconResolve.test.ts +0 -122
  173. package/src/__tests__/imageEditExportSvg.test.ts +0 -70
  174. package/src/__tests__/imageEditState.test.ts +0 -74
  175. package/src/__tests__/imageEditVersions.test.ts +0 -243
  176. package/src/__tests__/inferDocumentTitle.test.ts +0 -50
  177. package/src/__tests__/inlineIconMarker.test.ts +0 -36
  178. package/src/__tests__/inputDescriptors.test.ts +0 -162
  179. package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
  180. package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
  181. package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
  182. package/src/__tests__/jsonForm.pointer.test.ts +0 -149
  183. package/src/__tests__/jsonForm.tokens.test.ts +0 -84
  184. package/src/__tests__/layoutBlock.test.ts +0 -83
  185. package/src/__tests__/layoutLayout.test.ts +0 -169
  186. package/src/__tests__/localForageAdapter.test.ts +0 -155
  187. package/src/__tests__/majorApiTypes.test.ts +0 -18
  188. package/src/__tests__/markdown.test.ts +0 -1009
  189. package/src/__tests__/markdownIcons.test.ts +0 -104
  190. package/src/__tests__/markdownSanitize.test.ts +0 -81
  191. package/src/__tests__/markdownToDoc.test.ts +0 -957
  192. package/src/__tests__/matchFontFamily.test.ts +0 -114
  193. package/src/__tests__/materializeBlockLayers.test.ts +0 -167
  194. package/src/__tests__/materializePageSections.test.ts +0 -404
  195. package/src/__tests__/materializeTestUtils.ts +0 -17
  196. package/src/__tests__/mediaAnnotations.test.ts +0 -91
  197. package/src/__tests__/mediaSchedule.test.ts +0 -118
  198. package/src/__tests__/narrationAlign.test.ts +0 -150
  199. package/src/__tests__/narrationFeatures.test.ts +0 -71
  200. package/src/__tests__/narrationNuclei.test.ts +0 -45
  201. package/src/__tests__/narrationPacing.test.ts +0 -189
  202. package/src/__tests__/narrationScript.test.ts +0 -149
  203. package/src/__tests__/narrationSessionRepro.test.ts +0 -62
  204. package/src/__tests__/narrationSidecar.test.ts +0 -88
  205. package/src/__tests__/narrationSyllables.test.ts +0 -65
  206. package/src/__tests__/narrationTestSignals.ts +0 -167
  207. package/src/__tests__/narrationVad.test.ts +0 -66
  208. package/src/__tests__/pageStyle.test.ts +0 -258
  209. package/src/__tests__/pandocAttrParse.test.ts +0 -187
  210. package/src/__tests__/recommendTemplates.test.ts +0 -183
  211. package/src/__tests__/resolveDocTheme.test.ts +0 -69
  212. package/src/__tests__/rootExports.test.ts +0 -61
  213. package/src/__tests__/scopedContentContainer.test.ts +0 -109
  214. package/src/__tests__/seededRandom.test.ts +0 -142
  215. package/src/__tests__/shapeGeometry.test.ts +0 -138
  216. package/src/__tests__/shapeVocabulary.test.ts +0 -133
  217. package/src/__tests__/storage.test.ts +0 -60
  218. package/src/__tests__/structuredData.test.ts +0 -249
  219. package/src/__tests__/surface.test.ts +0 -68
  220. package/src/__tests__/templateAnnotationParse.test.ts +0 -173
  221. package/src/__tests__/templateInputs.test.ts +0 -69
  222. package/src/__tests__/templateMetadata.test.ts +0 -32
  223. package/src/__tests__/templates.test.ts +0 -710
  224. package/src/__tests__/themeCompile.test.ts +0 -225
  225. package/src/__tests__/themeValidator.test.ts +0 -131
  226. package/src/__tests__/timing.test.ts +0 -167
  227. package/src/__tests__/transformProvenance.test.ts +0 -160
  228. package/src/__tests__/transformV2.test.ts +0 -163
  229. package/src/__tests__/transitionNormalize.test.ts +0 -61
  230. package/src/__tests__/treeviewBattle.test.ts +0 -76
  231. package/src/__tests__/treeviewDetect.test.ts +0 -168
  232. package/src/__tests__/treeviewParse.test.ts +0 -118
  233. package/src/__tests__/treeviewPipeline.test.ts +0 -183
  234. package/src/__tests__/treeviewRender.test.ts +0 -91
  235. package/src/__tests__/validateDoc.test.ts +0 -260
  236. package/src/__tests__/versions.test.ts +0 -459
  237. package/src/doc/annotationBlocks.ts +0 -117
  238. package/src/doc/applyNarrationTiming.ts +0 -244
  239. package/src/doc/asciiDiagram/chars.ts +0 -210
  240. package/src/doc/asciiDiagram/detect.ts +0 -175
  241. package/src/doc/asciiDiagram/index.ts +0 -38
  242. package/src/doc/asciiDiagram/mapping.ts +0 -225
  243. package/src/doc/asciiDiagram/parse.ts +0 -1095
  244. package/src/doc/asciiDiagram/render.ts +0 -963
  245. package/src/doc/asciiDiagram/repair.ts +0 -400
  246. package/src/doc/asciiDiagram/types.ts +0 -65
  247. package/src/doc/asciiTimeline/detect.ts +0 -138
  248. package/src/doc/asciiTimeline/index.ts +0 -26
  249. package/src/doc/asciiTimeline/mapping.ts +0 -43
  250. package/src/doc/asciiTimeline/parse.ts +0 -870
  251. package/src/doc/asciiTimeline/render.ts +0 -427
  252. package/src/doc/asciiTimeline/types.ts +0 -73
  253. package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
  254. package/src/doc/audioMapping.ts +0 -442
  255. package/src/doc/customTemplatesFrontmatter.ts +0 -273
  256. package/src/doc/customThemesFrontmatter.ts +0 -95
  257. package/src/doc/docToMarkdown.ts +0 -284
  258. package/src/doc/index.ts +0 -161
  259. package/src/doc/markdownToDoc.ts +0 -1054
  260. package/src/doc/materializeBlockLayers.ts +0 -465
  261. package/src/doc/mediaAnnotations.ts +0 -120
  262. package/src/doc/page/PageSection.ts +0 -174
  263. package/src/doc/page/materializePageSection.ts +0 -616
  264. package/src/doc/page/resolvePageBlock.ts +0 -108
  265. package/src/doc/page/sectionExtractors.ts +0 -466
  266. package/src/doc/pageCss.ts +0 -628
  267. package/src/doc/resolveDocTheme.ts +0 -56
  268. package/src/doc/standaloneAnnotation.ts +0 -58
  269. package/src/doc/structuredData.ts +0 -301
  270. package/src/doc/templateInputs.ts +0 -424
  271. package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
  272. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
  273. package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
  274. package/src/doc/templates/accentImage.ts +0 -362
  275. package/src/doc/templates/captionUtils.ts +0 -56
  276. package/src/doc/templates/comparisonBar.ts +0 -173
  277. package/src/doc/templates/coverBlock.ts +0 -255
  278. package/src/doc/templates/customTemplate.ts +0 -51
  279. package/src/doc/templates/dataTable.ts +0 -102
  280. package/src/doc/templates/dateEvent.ts +0 -147
  281. package/src/doc/templates/definitionCard.ts +0 -140
  282. package/src/doc/templates/diagramBlock.ts +0 -403
  283. package/src/doc/templates/diagramLayout.ts +0 -159
  284. package/src/doc/templates/drawingBlock.ts +0 -325
  285. package/src/doc/templates/drawingLayout.ts +0 -539
  286. package/src/doc/templates/factCard.ts +0 -146
  287. package/src/doc/templates/fallbackBlock.ts +0 -123
  288. package/src/doc/templates/featureBlock.ts +0 -209
  289. package/src/doc/templates/fullBleedQuote.ts +0 -83
  290. package/src/doc/templates/imageWithCaption.ts +0 -186
  291. package/src/doc/templates/index.ts +0 -642
  292. package/src/doc/templates/inputDescriptors.ts +0 -451
  293. package/src/doc/templates/layoutBlock.ts +0 -43
  294. package/src/doc/templates/layoutLayout.ts +0 -243
  295. package/src/doc/templates/listBlock.ts +0 -207
  296. package/src/doc/templates/mapBlock.ts +0 -138
  297. package/src/doc/templates/metadata.ts +0 -130
  298. package/src/doc/templates/persistentLayers.ts +0 -526
  299. package/src/doc/templates/photoGrid.ts +0 -190
  300. package/src/doc/templates/pullQuote.ts +0 -141
  301. package/src/doc/templates/quoteBlock.ts +0 -141
  302. package/src/doc/templates/registry.ts +0 -88
  303. package/src/doc/templates/sectionHeader.ts +0 -120
  304. package/src/doc/templates/statHighlight.ts +0 -146
  305. package/src/doc/templates/templateNames.ts +0 -22
  306. package/src/doc/templates/timelineBlock.ts +0 -613
  307. package/src/doc/templates/titleBlock.ts +0 -150
  308. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
  309. package/src/doc/templates/tokens/resolveTokens.ts +0 -453
  310. package/src/doc/templates/treeBlock.ts +0 -131
  311. package/src/doc/templates/twoColumn.ts +0 -263
  312. package/src/doc/templates/videoPullQuote.ts +0 -142
  313. package/src/doc/templates/videoWithCaption.ts +0 -135
  314. package/src/doc/treeview/chars.ts +0 -72
  315. package/src/doc/treeview/detect.ts +0 -145
  316. package/src/doc/treeview/index.ts +0 -30
  317. package/src/doc/treeview/mapping.ts +0 -95
  318. package/src/doc/treeview/parse.ts +0 -201
  319. package/src/doc/treeview/render.ts +0 -41
  320. package/src/doc/treeview/types.ts +0 -43
  321. package/src/doc/utils/animationUtils.ts +0 -399
  322. package/src/doc/utils/applyRenderStyle.ts +0 -106
  323. package/src/doc/utils/diagramText.ts +0 -78
  324. package/src/doc/utils/imageTreatment.ts +0 -70
  325. package/src/doc/utils/nearest.ts +0 -59
  326. package/src/doc/utils/shapeGeometry.ts +0 -614
  327. package/src/doc/utils/themeUtils.ts +0 -243
  328. package/src/doc/validate.ts +0 -575
  329. package/src/generate/contentExtractor.ts +0 -921
  330. package/src/generate/index.ts +0 -18
  331. package/src/generate/templateMapper.ts +0 -177
  332. package/src/icons/iconData.ts +0 -31
  333. package/src/icons/index.ts +0 -26
  334. package/src/icons/inlineIconMarker.ts +0 -73
  335. package/src/icons/resolve.ts +0 -139
  336. package/src/imageEdit/ImageEditVersionManager.ts +0 -73
  337. package/src/imageEdit/export.ts +0 -410
  338. package/src/imageEdit/index.ts +0 -72
  339. package/src/imageEdit/persistence.ts +0 -113
  340. package/src/imageEdit/state.ts +0 -112
  341. package/src/imageEdit/versionPaths.ts +0 -44
  342. package/src/imageEdit/versions.ts +0 -152
  343. package/src/index.ts +0 -15
  344. package/src/internal/immutable.ts +0 -58
  345. package/src/jsonForm/chooseControl.ts +0 -88
  346. package/src/jsonForm/evaluateWhen.ts +0 -59
  347. package/src/jsonForm/index.ts +0 -32
  348. package/src/jsonForm/inferSchema.ts +0 -25
  349. package/src/jsonForm/pointer.ts +0 -154
  350. package/src/jsonForm/tokens.ts +0 -78
  351. package/src/jsonForm/types.ts +0 -167
  352. package/src/markdown/annotationCoercion.ts +0 -295
  353. package/src/markdown/attrTokens.ts +0 -243
  354. package/src/markdown/convert.ts +0 -1353
  355. package/src/markdown/htmlParse.ts +0 -212
  356. package/src/markdown/index.ts +0 -152
  357. package/src/markdown/parse.ts +0 -103
  358. package/src/markdown/sanitize.ts +0 -318
  359. package/src/markdown/stringify.ts +0 -207
  360. package/src/markdown/types.ts +0 -710
  361. package/src/markdown/utils.ts +0 -459
  362. package/src/narration/align.ts +0 -514
  363. package/src/narration/features.ts +0 -231
  364. package/src/narration/index.ts +0 -86
  365. package/src/narration/nuclei.ts +0 -118
  366. package/src/narration/pacing.ts +0 -211
  367. package/src/narration/script.ts +0 -239
  368. package/src/narration/session.ts +0 -100
  369. package/src/narration/sidecar.ts +0 -187
  370. package/src/narration/syllables.ts +0 -85
  371. package/src/narration/trace.ts +0 -50
  372. package/src/narration/types.ts +0 -299
  373. package/src/narration/vad.ts +0 -131
  374. package/src/ngeohash.d.ts +0 -11
  375. package/src/random/SeededRandom.ts +0 -127
  376. package/src/random/index.ts +0 -1
  377. package/src/recommend/index.ts +0 -16
  378. package/src/recommend/numberHighlight.ts +0 -25
  379. package/src/recommend/templates.ts +0 -393
  380. package/src/schemas/BlockTemplates.ts +0 -1046
  381. package/src/schemas/CustomTemplates.ts +0 -126
  382. package/src/schemas/Doc.ts +0 -1073
  383. package/src/schemas/ImageEditDoc.ts +0 -102
  384. package/src/schemas/LayoutStrategy.ts +0 -178
  385. package/src/schemas/Media.ts +0 -179
  386. package/src/schemas/MediaProvider.ts +0 -70
  387. package/src/schemas/PageStyle.ts +0 -213
  388. package/src/schemas/Theme.ts +0 -413
  389. package/src/schemas/Transitions.ts +0 -224
  390. package/src/schemas/Types.ts +0 -15
  391. package/src/schemas/Viewport.ts +0 -91
  392. package/src/schemas/colorUtils.ts +0 -219
  393. package/src/schemas/fontStacks.ts +0 -339
  394. package/src/schemas/index.ts +0 -31
  395. package/src/schemas/pageStyleDefaults.ts +0 -204
  396. package/src/schemas/themeCompile.ts +0 -244
  397. package/src/schemas/themeConstants.ts +0 -2
  398. package/src/schemas/themeLibrary.ts +0 -60
  399. package/src/schemas/themeValidator.ts +0 -609
  400. package/src/schemas/themes/bold.json +0 -77
  401. package/src/schemas/themes/cinematic.json +0 -143
  402. package/src/schemas/themes/documentary.json +0 -125
  403. package/src/schemas/themes/gezellig.json +0 -123
  404. package/src/schemas/themes/index.ts +0 -53
  405. package/src/schemas/themes/magazine.json +0 -126
  406. package/src/schemas/themes/minimalist.json +0 -74
  407. package/src/schemas/themes/morning-light.json +0 -117
  408. package/src/schemas/themes/standard-dark.json +0 -109
  409. package/src/schemas/themes/standard.json +0 -98
  410. package/src/schemas/themes/tech-dark.json +0 -143
  411. package/src/schemas/themes/warm-earth.json +0 -74
  412. package/src/spatial/Geohash.ts +0 -196
  413. package/src/spatial/Haversine.ts +0 -59
  414. package/src/spatial/index.ts +0 -2
  415. package/src/storage/ContentContainer.ts +0 -220
  416. package/src/storage/LocalForageAdapter.ts +0 -103
  417. package/src/storage/LocalStorageAdapter.ts +0 -57
  418. package/src/storage/MediaProviderFromContainer.ts +0 -92
  419. package/src/storage/MemoryStorageAdapter.ts +0 -37
  420. package/src/storage/ScopedContentContainer.ts +0 -143
  421. package/src/storage/Storage.ts +0 -28
  422. package/src/storage/index.ts +0 -9
  423. package/src/timing/index.ts +0 -17
  424. package/src/timing/narrationTiming.ts +0 -220
  425. package/src/timing/readingTime.ts +0 -94
  426. package/src/transform/applyTransform.ts +0 -122
  427. package/src/transform/blockAnalyzer.ts +0 -181
  428. package/src/transform/index.ts +0 -23
  429. package/src/transform/registry.ts +0 -217
  430. package/src/transform/styles/dataDriven.ts +0 -18
  431. package/src/transform/styles/documentary.ts +0 -18
  432. package/src/transform/styles/index.ts +0 -5
  433. package/src/transform/styles/magazine.ts +0 -19
  434. package/src/transform/styles/minimal.ts +0 -18
  435. package/src/transform/styles/narrative.ts +0 -19
  436. package/src/transform/templateSelector.ts +0 -389
  437. package/src/transform/timingAllocator.ts +0 -257
  438. package/src/transform/types.ts +0 -158
  439. package/src/versions/DocumentVersionManager.ts +0 -70
  440. package/src/versions/gitignore.ts +0 -34
  441. package/src/versions/index.ts +0 -56
  442. package/src/versions/operations.ts +0 -144
  443. package/src/versions/paths.ts +0 -51
  444. package/src/versions/snapshotStore.ts +0 -202
  445. package/src/versions/timestamp.ts +0 -48
  446. package/src/versions/types.ts +0 -93
@@ -24,24 +24,27 @@ import {
24
24
  templateRegistry,
25
25
  writeCustomTemplatesToFrontmatter,
26
26
  writeCustomThemesToFrontmatter
27
- } from "./chunk-JI77MGAK.js";
27
+ } from "./chunk-7ARJZYQY.js";
28
28
  import {
29
29
  ASCII_TREE_VOCAB,
30
30
  ASCII_VOCAB,
31
+ MAX_BRIDGE_GAP,
31
32
  UNICODE_TREE_VOCAB,
32
33
  UNICODE_VOCAB,
33
34
  arrowDirection,
35
+ cellWidth,
34
36
  detectAsciiDiagram,
35
37
  isHoriz,
36
38
  isJunction,
37
39
  isVert,
40
+ toCells,
38
41
  toGrid,
39
42
  traceBoxes
40
- } from "./chunk-5UYI3RJB.js";
43
+ } from "./chunk-FDYDYL77.js";
41
44
  import {
42
45
  defaultPageStyle,
43
46
  resolveMediaSchedule
44
- } from "./chunk-VWCJ2WXC.js";
47
+ } from "./chunk-2ZWIXGAC.js";
45
48
  import {
46
49
  DEFAULT_THEME,
47
50
  FRONTMATTER_CUSTOM_TEMPLATES_KEY,
@@ -49,27 +52,27 @@ import {
49
52
  hexHueDegrees,
50
53
  resolveFontFamily,
51
54
  resolveTheme
52
- } from "./chunk-JHZWYRSW.js";
55
+ } from "./chunk-C33GTPUZ.js";
53
56
  import {
54
57
  VIEWPORT_PRESETS,
55
58
  isTemplateBlock
56
- } from "./chunk-5J4HKRJF.js";
59
+ } from "./chunk-BAOV476U.js";
57
60
  import {
58
61
  parseMarkdown
59
- } from "./chunk-66QO7XFB.js";
62
+ } from "./chunk-ACZOVWX3.js";
60
63
  import {
61
64
  KNOWN_BLOCK_META_KEYS,
62
65
  coerceAnnotationValues,
63
66
  serializeAnnotation
64
- } from "./chunk-R2YZTCLO.js";
67
+ } from "./chunk-ZQKZSJAX.js";
65
68
  import {
66
69
  extractPlainText,
67
70
  getChildren,
68
71
  readFrontmatterThemeId
69
- } from "./chunk-AMIR72JP.js";
72
+ } from "./chunk-BCCXTMN5.js";
70
73
  import {
71
74
  estimateTimeFromText
72
- } from "./chunk-3E5F2XMR.js";
75
+ } from "./chunk-67L6WRJN.js";
73
76
 
74
77
  // src/doc/utils/animationUtils.ts
75
78
  function getAnimationStyle(animation, _currentTime = 0) {
@@ -330,7 +333,9 @@ function cssFilterForTreatment(treatment, blur) {
330
333
 
331
334
  // src/doc/docToMarkdown.ts
332
335
  var TRANSITION_PARAM_KEYS = ["transition", "transitionDuration", "transitionDirection"];
333
- function docToMarkdown(doc) {
336
+ var DEFAULT_TEMPLATE = "sectionHeader";
337
+ function docToMarkdown(doc, options = {}) {
338
+ const defaultTemplate = resolveTemplateName(options.defaultTemplate ?? DEFAULT_TEMPLATE);
334
339
  const children = [];
335
340
  const blockIds = new Set(flattenBlocks(doc.blocks).map((b) => b.id));
336
341
  const docMediaByBlock = /* @__PURE__ */ new Map();
@@ -349,7 +354,7 @@ function docToMarkdown(doc) {
349
354
  }
350
355
  function emitBlock(block) {
351
356
  if (block.sourceHeading) {
352
- const heading = ensureAnnotation(block, block.sourceHeading);
357
+ const heading = ensureAnnotation(block, block.sourceHeading, defaultTemplate);
353
358
  children.push(heading);
354
359
  } else if (block.standaloneAnnotation) {
355
360
  children.push(synthesizeAnnotationParagraph(block));
@@ -423,15 +428,16 @@ function synthesizeMediaParagraph(clip) {
423
428
  children: [{ type: "text", value: serializeAnnotation(clip.kind, params) }]
424
429
  };
425
430
  }
426
- function ensureAnnotation(block, heading) {
431
+ function ensureAnnotation(block, heading, defaultTemplate) {
427
432
  const { attributes, transitionParams } = ensureTransitionMetadata(block, heading);
428
- const hasExplicitTemplate = block.template && block.template !== "sectionHeader" && block.autoTemplate !== true;
429
- const hasOverrides = block.templateOverrides && Object.keys(block.templateOverrides).length > 0;
430
- let templateAnnotation = heading.templateAnnotation;
431
- if (!templateAnnotation && (hasExplicitTemplate || hasOverrides || transitionParams)) {
433
+ const existing = heading.templateAnnotation;
434
+ const template = resolveAnnotationTemplate(block, existing, defaultTemplate);
435
+ const overrides = block.templateOverrides && Object.keys(block.templateOverrides).length > 0 ? block.templateOverrides : void 0;
436
+ let templateAnnotation;
437
+ if (template !== void 0 || overrides !== void 0) {
432
438
  templateAnnotation = {
433
- ...hasExplicitTemplate ? { template: block.template ?? "sectionHeader" } : {},
434
- ...hasOverrides ? { params: block.templateOverrides } : {}
439
+ ...template !== void 0 ? { template } : {},
440
+ ...overrides ? { params: overrides } : {}
435
441
  };
436
442
  }
437
443
  if (transitionParams) {
@@ -443,11 +449,33 @@ function ensureAnnotation(block, heading) {
443
449
  }
444
450
  };
445
451
  }
452
+ if (annotationsEqual(existing, templateAnnotation)) templateAnnotation = existing;
446
453
  if (attributes === heading.attributes && templateAnnotation === heading.templateAnnotation) {
447
454
  return heading;
448
455
  }
449
456
  return { ...heading, children: [...heading.children], attributes, templateAnnotation };
450
457
  }
458
+ function resolveAnnotationTemplate(block, existing, defaultTemplate) {
459
+ if (!block.template || block.autoTemplate === true) return existing?.template;
460
+ const template = resolveTemplateName(block.template);
461
+ if (existing?.template && resolveTemplateName(existing.template) === template) {
462
+ return existing.template;
463
+ }
464
+ if (template === defaultTemplate) return void 0;
465
+ return block.template;
466
+ }
467
+ function annotationsEqual(a, b) {
468
+ if (a === b) return true;
469
+ if (!a || !b) return false;
470
+ return a.template === b.template && paramsEqual(a.params, b.params);
471
+ }
472
+ function paramsEqual(a, b) {
473
+ if (a === b) return true;
474
+ if (!a || !b) return false;
475
+ const keys = Object.keys(a);
476
+ if (keys.length !== Object.keys(b).length) return false;
477
+ return keys.every((key) => Object.prototype.hasOwnProperty.call(b, key) && a[key] === b[key]);
478
+ }
451
479
  function ensureTransitionMetadata(block, heading) {
452
480
  const transition = block.transition;
453
481
  if (!transition) {
@@ -2068,10 +2096,11 @@ async function discoverNarrationAudio(container) {
2068
2096
  let timing = null;
2069
2097
  if (consolidatedSections) {
2070
2098
  const audioBase = stripAudioExtension(filename);
2099
+ let matchedName = "";
2071
2100
  for (const [sectionName, sectionTiming] of Object.entries(consolidatedSections)) {
2072
- if (audioBase.endsWith(`-${sectionName}`)) {
2101
+ if (audioBase.endsWith(`-${sectionName}`) && sectionName.length > matchedName.length) {
2102
+ matchedName = sectionName;
2073
2103
  timing = sectionTiming;
2074
- break;
2075
2104
  }
2076
2105
  }
2077
2106
  }
@@ -2508,6 +2537,17 @@ function truncate(text, max = 40) {
2508
2537
  }
2509
2538
 
2510
2539
  // src/doc/asciiDiagram/render.ts
2540
+ function normalizeLabelLines(label) {
2541
+ return label.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
2542
+ }
2543
+ function normalizeEdgeLabel(label) {
2544
+ if (label === void 0) return void 0;
2545
+ const collapsed = label.replace(/\s+/gu, " ").trim();
2546
+ return collapsed.length > 0 ? collapsed : void 0;
2547
+ }
2548
+ function edgeLabelFitsBridge(text) {
2549
+ return text.length <= MAX_BRIDGE_GAP;
2550
+ }
2511
2551
  var SIDE_MARGIN = 1;
2512
2552
  function renderAsciiDiagram(diagram2, options = {}) {
2513
2553
  const vocab = (options.style ?? diagram2.style) === "ascii" ? ASCII_VOCAB : UNICODE_VOCAB;
@@ -2591,10 +2631,10 @@ function layoutNodes(nodes, edges) {
2591
2631
  };
2592
2632
  const layoutSubtree = (id, depth) => {
2593
2633
  const node = byId.get(id);
2594
- const labelLines = node.label.length > 0 ? node.label.split("\n") : [];
2634
+ const labelLines = normalizeLabelLines(node.label);
2595
2635
  const children = childIds.get(id) ?? [];
2596
2636
  if (children.length === 0) {
2597
- const innerW = labelLines.reduce((w, l) => Math.max(w, l.length), 0);
2637
+ const innerW = labelLines.reduce((w, l) => Math.max(w, cellWidth(l)), 0);
2598
2638
  const deg = sideDeg.get(id) ?? { top: 0, bottom: 0, left: 0, right: 0 };
2599
2639
  const horizDeg = Math.max(deg.top, deg.bottom);
2600
2640
  const vertDeg = Math.max(deg.left, deg.right);
@@ -2617,14 +2657,15 @@ function layoutNodes(nodes, edges) {
2617
2657
  const childRects = placeSiblings(children, (childId) => layoutSubtree(childId, depth + 1));
2618
2658
  const bbox = unionRects(childRects);
2619
2659
  const extraRows = Math.max(0, labelLines.length - 1);
2620
- const titleLen = (labelLines[0] ?? "").length;
2660
+ const titleLen = cellWidth(labelLines[0] ?? "");
2621
2661
  const rect = {
2622
2662
  r0: bbox.r0 - 2 - extraRows,
2623
2663
  c0: bbox.c0 - 2,
2624
2664
  r1: bbox.r1 + 2,
2625
2665
  c1: bbox.c1 + 2
2626
2666
  };
2627
- const minW = titleLen > 0 ? titleLen + 6 : 3;
2667
+ const innerLinesW = labelLines.slice(1).reduce((w, l) => Math.max(w, cellWidth(l)), 0);
2668
+ const minW = Math.max(titleLen > 0 ? titleLen + 6 : 3, innerLinesW > 0 ? innerLinesW + 4 : 3);
2628
2669
  if (rect.c1 - rect.c0 + 1 < minW) rect.c1 = rect.c0 + minW - 1;
2629
2670
  if (rect.c1 - rect.c0 + 1 < node.wCols) rect.c1 = rect.c0 + node.wCols - 1;
2630
2671
  placed.set(id, { node, rect, labelLines, isContainer: true, depth });
@@ -2718,7 +2759,7 @@ function drawBox(canvas, p, vocab) {
2718
2759
  const innerW = rect.c1 - rect.c0 - 1;
2719
2760
  canvas.set(rect.r0, rect.c0, vocab.tl, "border");
2720
2761
  canvas.set(rect.r0, rect.c1, vocab.tr, "border");
2721
- const title2 = isContainer && labelLines.length > 0 ? ` ${labelLines[0]} ` : null;
2762
+ const title2 = isContainer && labelLines.length > 0 ? toCells(` ${labelLines[0]} `) : null;
2722
2763
  if (title2 && title2.length <= innerW - 2) {
2723
2764
  const left = Math.floor((innerW - title2.length) / 2);
2724
2765
  for (let i = 0; i < innerW; i++) {
@@ -2741,9 +2782,10 @@ function drawBox(canvas, p, vocab) {
2741
2782
  const innerH = rect.r1 - rect.r0 - 1;
2742
2783
  const startRow = isContainer ? rect.r0 + 1 : rect.r0 + 1 + Math.max(0, Math.floor((innerH - interiorLines.length) / 2));
2743
2784
  interiorLines.forEach((line, i) => {
2744
- const pad = Math.max(0, Math.floor((innerW - line.length) / 2));
2745
- for (let j = 0; j < line.length && pad + j < innerW; j++) {
2746
- canvas.set(startRow + i, rect.c0 + 1 + pad + j, line[j], "label");
2785
+ const cells = toCells(line);
2786
+ const pad = Math.max(0, Math.floor((innerW - cells.length) / 2));
2787
+ for (let j = 0; j < cells.length && pad + j < innerW; j++) {
2788
+ canvas.set(startRow + i, rect.c0 + 1 + pad + j, cells[j], "label");
2747
2789
  }
2748
2790
  });
2749
2791
  }
@@ -2795,24 +2837,25 @@ function drawEdges(canvas, edges, placed, vocab) {
2795
2837
  )
2796
2838
  );
2797
2839
  for (const req of sideLabelRequests) {
2840
+ const cells = toCells(req.label);
2798
2841
  let done = false;
2799
2842
  for (const side of ["right", "left"]) {
2800
2843
  if (done) break;
2801
2844
  for (const { row, col } of req.candidates) {
2802
2845
  if (canvas.kindAt(row, col) !== "line-v") continue;
2803
- const startCol = side === "right" ? col + 2 : col - 1 - req.label.length;
2846
+ const startCol = side === "right" ? col + 2 : col - 1 - cells.length;
2804
2847
  if (startCol < 0) continue;
2805
2848
  const gapCol = side === "right" ? col + 1 : col - 1;
2806
2849
  let free = canvas.kindAt(row, gapCol) === "empty";
2807
- for (let i = 0; free && i < req.label.length; i++) {
2850
+ for (let i = 0; free && i < cells.length; i++) {
2808
2851
  if (canvas.kindAt(row, startCol + i) !== "empty") free = false;
2809
2852
  }
2810
2853
  if (free && side === "left" && startCol > 0) {
2811
2854
  free = canvas.kindAt(row, startCol - 1) === "empty";
2812
2855
  }
2813
2856
  if (!free) continue;
2814
- for (let i = 0; i < req.label.length; i++) {
2815
- canvas.set(row, startCol + i, req.label[i], "label");
2857
+ for (let i = 0; i < cells.length; i++) {
2858
+ canvas.set(row, startCol + i, cells[i], "label");
2816
2859
  }
2817
2860
  done = true;
2818
2861
  break;
@@ -2891,7 +2934,7 @@ function routeEdge(canvas, plan, planIdx, placed, attachment, vocab, deferSideLa
2891
2934
  canvas,
2892
2935
  directed: plan.edge.directed,
2893
2936
  biDir: plan.biDir,
2894
- label: plan.edge.label,
2937
+ label: normalizeEdgeLabel(plan.edge.label),
2895
2938
  vocab,
2896
2939
  junction,
2897
2940
  stagger,
@@ -2989,8 +3032,8 @@ function drawVertical(args, s, t, exitCol, enterCol, dir) {
2989
3032
  const hi = Math.max(exitCol, enterCol);
2990
3033
  let segment = [];
2991
3034
  for (let c = lo + 1; c <= hi - 1; c++) segment.push(vocab.h);
2992
- if (label && segment.length >= label.length + 4) {
2993
- const text = ` ${label} `;
3035
+ const text = label ? toCells(` ${label} `) : null;
3036
+ if (text && edgeLabelFitsBridge(text) && segment.length >= text.length + 2) {
2994
3037
  const left = Math.floor((segment.length - text.length) / 2);
2995
3038
  segment = segment.map((ch, i) => i >= left && i < left + text.length ? text[i - left] : ch);
2996
3039
  labelEmbedded = true;
@@ -3045,15 +3088,22 @@ function drawHorizontal(args, s, t, exitRow, enterRow, dir) {
3045
3088
  const firstFree = exitCol + dir;
3046
3089
  const lastFree = enterCol - dir;
3047
3090
  const gap = (lastFree - firstFree) * dir + 1;
3048
- const drawH = (row, cA, cB, hostLabel) => {
3091
+ const drawH = (row, cA, cB, hostLabel, reserveLo = 0, reserveHi = 0) => {
3049
3092
  const lo = Math.min(cA, cB);
3050
3093
  const hi = Math.max(cA, cB);
3051
3094
  let segment = [];
3052
3095
  for (let c = lo; c <= hi; c++) segment.push(vocab.h);
3053
- if (hostLabel && label && segment.length >= label.length + 4) {
3054
- const text = ` ${label} `;
3055
- const left = Math.floor((segment.length - text.length) / 2);
3056
- segment = segment.map((ch, i) => i >= left && i < left + text.length ? text[i - left] : ch);
3096
+ const text = hostLabel && label ? toCells(` ${label} `) : null;
3097
+ if (text && edgeLabelFitsBridge(text)) {
3098
+ const from = reserveLo;
3099
+ const to = segment.length - 1 - reserveHi;
3100
+ const room = to - from + 1;
3101
+ if (room >= text.length + 2) {
3102
+ const left = from + Math.floor((room - text.length) / 2);
3103
+ segment = segment.map(
3104
+ (ch, i) => i >= left && i < left + text.length ? text[i - left] : ch
3105
+ );
3106
+ }
3057
3107
  }
3058
3108
  segment.forEach((ch, i) => {
3059
3109
  canvas.drawEdgeCell(row, lo + i, ch, ch === vocab.h ? "line-h" : "label", vocab);
@@ -3066,7 +3116,14 @@ function drawHorizontal(args, s, t, exitRow, enterRow, dir) {
3066
3116
  junction(sRow, exitCol, dir === 1 ? "right" : "left");
3067
3117
  junction(tRow, enterCol, dir === 1 ? "left" : "right");
3068
3118
  if (sRow === tRow && gap >= 1) {
3069
- drawH(sRow, firstFree, lastFree, true);
3119
+ drawH(
3120
+ sRow,
3121
+ firstFree,
3122
+ lastFree,
3123
+ true,
3124
+ (dir === 1 ? biDir : directed) ? 1 : 0,
3125
+ (dir === 1 ? directed : biDir) ? 1 : 0
3126
+ );
3070
3127
  if (directed) {
3071
3128
  canvas.drawEdgeCell(
3072
3129
  sRow,
@@ -3095,7 +3152,16 @@ function drawHorizontal(args, s, t, exitRow, enterRow, dir) {
3095
3152
  );
3096
3153
  junction(exitRow, exitCol, dir === 1 ? "right" : "left");
3097
3154
  junction(enterRow, enterCol, dir === 1 ? "left" : "right");
3098
- if (Math.abs(midCol - exitCol) >= 2) drawH(exitRow, firstFree, midCol - dir, true);
3155
+ if (Math.abs(midCol - exitCol) >= 2) {
3156
+ drawH(
3157
+ exitRow,
3158
+ firstFree,
3159
+ midCol - dir,
3160
+ true,
3161
+ dir === 1 && biDir ? 1 : 0,
3162
+ dir === -1 && biDir ? 1 : 0
3163
+ );
3164
+ }
3099
3165
  if (Math.abs(enterCol - midCol) >= 2) drawH(enterRow, midCol + dir, lastFree, false);
3100
3166
  if (exitRow === enterRow) {
3101
3167
  canvas.drawEdgeCell(exitRow, midCol, vocab.h, "line-h", vocab);
@@ -3670,10 +3736,17 @@ function formatCoordinate(value) {
3670
3736
  }
3671
3737
 
3672
3738
  // src/doc/treeview/render.ts
3739
+ function normalizeText(text) {
3740
+ return text.replace(/\s+/gu, " ").trim();
3741
+ }
3673
3742
  function renderTree(tree2, options = {}) {
3674
3743
  const vocab = (options.style ?? tree2.style) === "ascii" ? ASCII_TREE_VOCAB : UNICODE_TREE_VOCAB;
3675
3744
  const lines = [];
3676
- const label = (node) => node.comment ? `${node.label} # ${node.comment}` : node.label;
3745
+ const label = (node) => {
3746
+ const text = normalizeText(node.label);
3747
+ const comment = node.comment ? normalizeText(node.comment) : "";
3748
+ return comment ? `${text} # ${comment}` : text;
3749
+ };
3677
3750
  const walk = (nodes, prefix) => {
3678
3751
  nodes.forEach((node, i) => {
3679
3752
  const last = i === nodes.length - 1;
@@ -3717,4 +3790,3 @@ export {
3717
3790
  renderAsciiTimeline,
3718
3791
  renderTree
3719
3792
  };
3720
- //# sourceMappingURL=chunk-OTKVFVL6.js.map
@@ -720,4 +720,3 @@ export {
720
720
  stripMarkdown,
721
721
  mapElementToBlock
722
722
  };
723
- //# sourceMappingURL=chunk-Q7LROV2H.js.map
@@ -0,0 +1,241 @@
1
+ // src/versions/timestamp.ts
2
+ var TIMESTAMP_RE = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/;
3
+ function pad2(n) {
4
+ return n < 10 ? `0${n}` : String(n);
5
+ }
6
+ function formatVersionTimestamp(date) {
7
+ return String(date.getUTCFullYear()).padStart(4, "0") + pad2(date.getUTCMonth() + 1) + pad2(date.getUTCDate()) + "T" + pad2(date.getUTCHours()) + pad2(date.getUTCMinutes()) + pad2(date.getUTCSeconds()) + "Z";
8
+ }
9
+ function parseVersionTimestamp(stamp) {
10
+ const m = TIMESTAMP_RE.exec(stamp);
11
+ if (!m) return null;
12
+ const [, y, mo, d, h, mi, s] = m;
13
+ const ms = Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(s));
14
+ if (Number.isNaN(ms)) return null;
15
+ return new Date(ms);
16
+ }
17
+ var VERSION_TIMESTAMP_PATTERN = TIMESTAMP_RE;
18
+
19
+ // src/versions/gitignore.ts
20
+ var decoder = new TextDecoder();
21
+ var encoder = new TextEncoder();
22
+ var GITIGNORE_PATH = ".gitignore";
23
+ var VERSIONS_IGNORE_RULE = ".versions/";
24
+ var EQUIVALENT_VERSIONS_RULE = /^(!?)\/?\.versions\/?$/;
25
+ async function ensureVersionsGitIgnored(container) {
26
+ const data = await container.readFile(GITIGNORE_PATH);
27
+ const existing = data ? decoder.decode(data) : "";
28
+ for (const line of existing.split(/\r?\n/)) {
29
+ if (EQUIVALENT_VERSIONS_RULE.test(line.trim())) return;
30
+ }
31
+ const newline = existing.includes("\r\n") ? "\r\n" : "\n";
32
+ const separator = existing.length > 0 && !existing.endsWith("\n") ? newline : "";
33
+ const next = `${existing}${separator}${VERSIONS_IGNORE_RULE}${newline}`;
34
+ await container.writeFile(GITIGNORE_PATH, encoder.encode(next), "text/plain");
35
+ }
36
+
37
+ // src/versions/snapshotStore.ts
38
+ var decoder2 = new TextDecoder();
39
+ var encoder2 = new TextEncoder();
40
+ var INVALID_BASENAME_CHARS = /[<>:"/\\|?*]/;
41
+ var WINDOWS_DEVICE_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i;
42
+ var mutationQueues = /* @__PURE__ */ new WeakMap();
43
+ function assertSafeBasename(basename) {
44
+ if (basename.length === 0 || basename.length > 200 || basename === "." || basename === ".." || basename.endsWith(".") || basename.endsWith(" ") || INVALID_BASENAME_CHARS.test(basename) || [...basename].some((char) => {
45
+ const code = char.codePointAt(0);
46
+ return code < 32 || code === 127;
47
+ }) || WINDOWS_DEVICE_NAME.test(basename)) {
48
+ throw new TypeError(`Invalid snapshot basename: ${JSON.stringify(basename)}`);
49
+ }
50
+ }
51
+ function buildSnapshotPath(strategy, basename, date, collision = 0) {
52
+ assertSafeBasename(basename);
53
+ if (!Number.isFinite(date.getTime())) throw new TypeError("Snapshot date must be valid");
54
+ if (!Number.isInteger(collision) || collision < 0) {
55
+ throw new RangeError("Snapshot collision must be a non-negative integer");
56
+ }
57
+ const stamp = formatVersionTimestamp(date);
58
+ const suffix = collision > 0 ? `-${collision + 1}` : "";
59
+ return `${strategy.prefix}${basename}.${stamp}${suffix}.${strategy.extension}`;
60
+ }
61
+ function parseSnapshotPath(strategy, path) {
62
+ if (!path.startsWith(strategy.prefix)) return null;
63
+ const extension = `.${strategy.extension}`;
64
+ const rest = path.slice(strategy.prefix.length);
65
+ if (!rest.endsWith(extension)) return null;
66
+ const stem = rest.slice(0, -extension.length);
67
+ const lastDot = stem.lastIndexOf(".");
68
+ if (lastDot <= 0) return null;
69
+ const basename = stem.slice(0, lastDot);
70
+ const tail = stem.slice(lastDot + 1);
71
+ const dash = tail.indexOf("-");
72
+ let stamp = tail;
73
+ let collision = 0;
74
+ if (dash >= 0) {
75
+ stamp = tail.slice(0, dash);
76
+ const suffix = Number(tail.slice(dash + 1));
77
+ if (!Number.isInteger(suffix) || suffix < 2) return null;
78
+ collision = suffix - 1;
79
+ }
80
+ const timestamp = parseVersionTimestamp(stamp);
81
+ return timestamp ? { basename, timestamp, collision } : null;
82
+ }
83
+ async function listSnapshots(container, strategy, basename) {
84
+ const entries = await container.listFiles(strategy.prefix);
85
+ const versions = [];
86
+ for (const entry of entries) {
87
+ const parsed = parseSnapshotPath(strategy, entry.path);
88
+ if (!parsed || basename !== void 0 && parsed.basename !== basename) continue;
89
+ versions.push({
90
+ path: entry.path,
91
+ basename: parsed.basename,
92
+ timestamp: parsed.timestamp,
93
+ size: entry.size,
94
+ collision: parsed.collision
95
+ });
96
+ }
97
+ versions.sort((a, b) => {
98
+ const timestampDelta = b.timestamp.getTime() - a.timestamp.getTime();
99
+ return timestampDelta || b.collision - a.collision;
100
+ });
101
+ return versions;
102
+ }
103
+ async function readTextSnapshot(container, version) {
104
+ const path = typeof version === "string" ? version : version.path;
105
+ const data = await container.readFile(path);
106
+ return data ? decoder2.decode(data) : null;
107
+ }
108
+ async function saveTextSnapshot(container, strategy, options) {
109
+ return withContainerMutationLock(container, async () => {
110
+ const versions = await listSnapshots(container, strategy, options.basename);
111
+ if (!options.force && versions.length > 0) {
112
+ const existing = await readTextSnapshot(container, versions[0]);
113
+ if (existing === options.content) {
114
+ await ensureVersionsGitIgnored(container);
115
+ return { saved: false, version: null, reason: "unchanged" };
116
+ }
117
+ }
118
+ const now = options.now ?? /* @__PURE__ */ new Date();
119
+ const data = encoder2.encode(options.content);
120
+ await ensureVersionsGitIgnored(container);
121
+ let collision = 0;
122
+ let path = buildSnapshotPath(strategy, options.basename, now, collision);
123
+ if (container.writeFileExclusive) {
124
+ while (!await container.writeFileExclusive(path, data, options.mimeType)) {
125
+ collision += 1;
126
+ path = buildSnapshotPath(strategy, options.basename, now, collision);
127
+ }
128
+ } else {
129
+ while (await container.exists(path)) {
130
+ collision += 1;
131
+ path = buildSnapshotPath(strategy, options.basename, now, collision);
132
+ }
133
+ await container.writeFile(path, data, options.mimeType);
134
+ }
135
+ return {
136
+ saved: true,
137
+ version: {
138
+ path,
139
+ basename: options.basename,
140
+ timestamp: now,
141
+ size: data.byteLength,
142
+ collision
143
+ },
144
+ reason: "saved"
145
+ };
146
+ });
147
+ }
148
+ async function withContainerMutationLock(container, operation) {
149
+ const key = container.mutationLock ?? container;
150
+ const previous = mutationQueues.get(key) ?? Promise.resolve();
151
+ let release;
152
+ const gate = new Promise((resolve) => {
153
+ release = resolve;
154
+ });
155
+ const queued = previous.catch(() => void 0).then(() => gate);
156
+ mutationQueues.set(key, queued);
157
+ await previous.catch(() => void 0);
158
+ try {
159
+ return await operation();
160
+ } finally {
161
+ release();
162
+ if (mutationQueues.get(key) === queued) mutationQueues.delete(key);
163
+ }
164
+ }
165
+ function groupByBasename(versions) {
166
+ const groups = /* @__PURE__ */ new Map();
167
+ for (const version of versions) {
168
+ const group = groups.get(version.basename);
169
+ if (group) group.push(version);
170
+ else groups.set(version.basename, [version]);
171
+ }
172
+ return groups;
173
+ }
174
+ function inListOrder(versions, toDelete) {
175
+ return versions.filter((version) => toDelete.has(version));
176
+ }
177
+ async function pruneSnapshots(container, strategy, policy, basename) {
178
+ if (policy.type === "keep-last-n" && (!Number.isSafeInteger(policy.n) || policy.n < 0)) {
179
+ throw new RangeError("keep-last-n requires a non-negative safe integer");
180
+ }
181
+ if (policy.type === "older-than" && !Number.isFinite(policy.date.getTime())) {
182
+ throw new TypeError("older-than requires a valid date");
183
+ }
184
+ const versions = await listSnapshots(container, strategy, basename);
185
+ const toDelete = /* @__PURE__ */ new Set();
186
+ for (const group of groupByBasename(versions).values()) {
187
+ if (policy.type === "keep-last-n") {
188
+ for (const version of group.slice(policy.n)) toDelete.add(version);
189
+ } else if (policy.type === "older-than") {
190
+ const cutoff = policy.date.getTime();
191
+ for (const version of group) {
192
+ if (version.timestamp.getTime() < cutoff) toDelete.add(version);
193
+ }
194
+ } else {
195
+ for (const version of group) {
196
+ if (!policy.keep(version, group)) toDelete.add(version);
197
+ }
198
+ }
199
+ }
200
+ const deleted = inListOrder(versions, toDelete);
201
+ await removeSnapshots(container, deleted);
202
+ return deleted;
203
+ }
204
+ async function coalesceSnapshots(container, strategy, options = {}, basename) {
205
+ const windowMs = options.windowMs ?? 6e4;
206
+ if (!Number.isFinite(windowMs) || windowMs < 0) {
207
+ throw new RangeError("windowMs must be a non-negative finite number");
208
+ }
209
+ const versions = await listSnapshots(container, strategy, basename);
210
+ const toDelete = /* @__PURE__ */ new Set();
211
+ for (const group of groupByBasename(versions).values()) {
212
+ let anchor = group[0];
213
+ for (let index = 1; index < group.length; index++) {
214
+ const candidate = group[index];
215
+ if (anchor.timestamp.getTime() - candidate.timestamp.getTime() <= windowMs) {
216
+ toDelete.add(candidate);
217
+ } else {
218
+ anchor = candidate;
219
+ }
220
+ }
221
+ }
222
+ const deleted = inListOrder(versions, toDelete);
223
+ await removeSnapshots(container, deleted);
224
+ return deleted;
225
+ }
226
+ async function removeSnapshots(container, versions) {
227
+ for (const version of versions) await container.removeFile(version.path);
228
+ }
229
+
230
+ export {
231
+ formatVersionTimestamp,
232
+ parseVersionTimestamp,
233
+ VERSION_TIMESTAMP_PATTERN,
234
+ buildSnapshotPath,
235
+ parseSnapshotPath,
236
+ listSnapshots,
237
+ readTextSnapshot,
238
+ saveTextSnapshot,
239
+ pruneSnapshots,
240
+ coalesceSnapshots
241
+ };
@@ -435,6 +435,48 @@ function lineStyleDasharray(style) {
435
435
  }
436
436
  }
437
437
 
438
+ // src/base64.ts
439
+ var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
440
+ function bytesToBase64(bytes) {
441
+ let output = "";
442
+ for (let index = 0; index < bytes.length; index += 3) {
443
+ const first = bytes[index];
444
+ const hasSecond = index + 1 < bytes.length;
445
+ const hasThird = index + 2 < bytes.length;
446
+ const second = hasSecond ? bytes[index + 1] : 0;
447
+ const third = hasThird ? bytes[index + 2] : 0;
448
+ const value = first << 16 | second << 8 | third;
449
+ output += ALPHABET[value >>> 18 & 63];
450
+ output += ALPHABET[value >>> 12 & 63];
451
+ output += hasSecond ? ALPHABET[value >>> 6 & 63] : "=";
452
+ output += hasThird ? ALPHABET[value & 63] : "=";
453
+ }
454
+ return output;
455
+ }
456
+ function base64ToBytes(value) {
457
+ const normalized = value.replace(/[\t\n\r ]/g, "");
458
+ if (normalized.length % 4 !== 0 || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(normalized)) {
459
+ throw new TypeError("Invalid base64 data");
460
+ }
461
+ const padding = normalized.endsWith("==") ? 2 : normalized.endsWith("=") ? 1 : 0;
462
+ const output = new Uint8Array(normalized.length / 4 * 3 - padding);
463
+ let outputIndex = 0;
464
+ for (let index = 0; index < normalized.length; index += 4) {
465
+ const a = ALPHABET.indexOf(normalized[index]);
466
+ const b = ALPHABET.indexOf(normalized[index + 1]);
467
+ const c = normalized[index + 2] === "=" ? 0 : ALPHABET.indexOf(normalized[index + 2]);
468
+ const d = normalized[index + 3] === "=" ? 0 : ALPHABET.indexOf(normalized[index + 3]);
469
+ const packed = a << 18 | b << 12 | c << 6 | d;
470
+ if (outputIndex < output.length) output[outputIndex++] = packed >>> 16 & 255;
471
+ if (outputIndex < output.length) output[outputIndex++] = packed >>> 8 & 255;
472
+ if (outputIndex < output.length) output[outputIndex++] = packed & 255;
473
+ }
474
+ return output;
475
+ }
476
+ function base64ToUtf8(value) {
477
+ return new TextDecoder().decode(base64ToBytes(value));
478
+ }
479
+
438
480
  export {
439
481
  PATH_SHAPE_KINDS,
440
482
  shapePath,
@@ -446,6 +488,7 @@ export {
446
488
  nearestSnapPoint,
447
489
  snapEndpoints,
448
490
  connectorPath,
449
- lineStyleDasharray
491
+ lineStyleDasharray,
492
+ bytesToBase64,
493
+ base64ToUtf8
450
494
  };
451
- //# sourceMappingURL=chunk-TUWMK62B.js.map
File without changes
@@ -121,4 +121,3 @@ export {
121
121
  getGeohashPath,
122
122
  geohashOverlapsBounds
123
123
  };
124
- //# sourceMappingURL=chunk-GZY66SDN.js.map