@bendyline/squisq 2.0.1 → 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 (438) 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-ylqWKDc_.d.ts → Doc-BubIpWsp.d.ts} +160 -3
  5. package/dist/{ImageEditDoc-D828IXJ1.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-2ZWIXGAC.js +214 -0
  9. package/dist/{chunk-2PWOO4ZE.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-X6DUONGT.js → chunk-7ARJZYQY.js} +280 -128
  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-W4O2TX5I.js → chunk-C33GTPUZ.js} +579 -4
  22. package/dist/{chunk-MMPBOUK7.js → chunk-CB45YGAM.js} +7 -2
  23. package/dist/{chunk-CY2R2VPR.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-TFJVXUHH.js → chunk-I2O6W7DX.js} +1513 -79
  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-PXLVXTLW.js → chunk-RS5AP3J4.js} +72 -15
  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 +166 -12
  40. package/dist/doc/index.js +36 -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 +13 -12
  48. package/dist/index.js +118 -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-wSLA2A1g.d.ts +223 -0
  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 +31 -6
  61. package/dist/schemas/index.js +43 -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-RjVgLpUi.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
  67. package/dist/timing/index.js +3 -4
  68. package/dist/transform/index.d.ts +9 -10
  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-2PWOO4ZE.js.map +0 -1
  76. package/dist/chunk-2UQOHYE2.js.map +0 -1
  77. package/dist/chunk-3E5F2XMR.js.map +0 -1
  78. package/dist/chunk-4X3JQXNM.js.map +0 -1
  79. package/dist/chunk-5DKBFXPY.js.map +0 -1
  80. package/dist/chunk-5J4HKRJF.js.map +0 -1
  81. package/dist/chunk-5UYI3RJB.js.map +0 -1
  82. package/dist/chunk-66QO7XFB.js.map +0 -1
  83. package/dist/chunk-AMIR72JP.js +0 -380
  84. package/dist/chunk-AMIR72JP.js.map +0 -1
  85. package/dist/chunk-CY2R2VPR.js.map +0 -1
  86. package/dist/chunk-DBS6RIFL.js.map +0 -1
  87. package/dist/chunk-DNJKBAI7.js +0 -1
  88. package/dist/chunk-DNJKBAI7.js.map +0 -1
  89. package/dist/chunk-ET53IIEP.js +0 -1
  90. package/dist/chunk-ET53IIEP.js.map +0 -1
  91. package/dist/chunk-FVJUUTEM.js +0 -74
  92. package/dist/chunk-FVJUUTEM.js.map +0 -1
  93. package/dist/chunk-FVTQSNR7.js.map +0 -1
  94. package/dist/chunk-GZY66SDN.js.map +0 -1
  95. package/dist/chunk-JOQYPRDZ.js.map +0 -1
  96. package/dist/chunk-MMPBOUK7.js.map +0 -1
  97. package/dist/chunk-PGGGKYWG.js +0 -1
  98. package/dist/chunk-PGGGKYWG.js.map +0 -1
  99. package/dist/chunk-PXLVXTLW.js.map +0 -1
  100. package/dist/chunk-Q7LROV2H.js.map +0 -1
  101. package/dist/chunk-QE7TWGVT.js.map +0 -1
  102. package/dist/chunk-R2GC6RLD.js +0 -344
  103. package/dist/chunk-R2GC6RLD.js.map +0 -1
  104. package/dist/chunk-R2YZTCLO.js.map +0 -1
  105. package/dist/chunk-S7A5D7ZJ.js +0 -174
  106. package/dist/chunk-S7A5D7ZJ.js.map +0 -1
  107. package/dist/chunk-TFJVXUHH.js.map +0 -1
  108. package/dist/chunk-TUWMK62B.js.map +0 -1
  109. package/dist/chunk-V543AI2F.js +0 -1
  110. package/dist/chunk-V543AI2F.js.map +0 -1
  111. package/dist/chunk-VR7UPJ7C.js.map +0 -1
  112. package/dist/chunk-W4O2TX5I.js.map +0 -1
  113. package/dist/chunk-X6DUONGT.js.map +0 -1
  114. package/dist/chunk-ZLQKNOZQ.js +0 -1
  115. package/dist/chunk-ZLQKNOZQ.js.map +0 -1
  116. package/dist/doc/index.js.map +0 -1
  117. package/dist/generate/index.js.map +0 -1
  118. package/dist/icons/index.js.map +0 -1
  119. package/dist/icons/inlineIconMarker.js.map +0 -1
  120. package/dist/imageEdit/index.js.map +0 -1
  121. package/dist/index.js.map +0 -1
  122. package/dist/jsonForm/index.js.map +0 -1
  123. package/dist/markdown/index.js.map +0 -1
  124. package/dist/narration/index.js.map +0 -1
  125. package/dist/random/index.js.map +0 -1
  126. package/dist/recommend/index.js.map +0 -1
  127. package/dist/schemas/index.js.map +0 -1
  128. package/dist/spatial/index.js.map +0 -1
  129. package/dist/storage/index.js.map +0 -1
  130. package/dist/timing/index.js.map +0 -1
  131. package/dist/transform/index.js.map +0 -1
  132. package/dist/versions/index.js.map +0 -1
  133. package/src/__tests__/animationUtils.test.ts +0 -117
  134. package/src/__tests__/annotationCoercion.test.ts +0 -243
  135. package/src/__tests__/applyNarrationTiming.test.ts +0 -190
  136. package/src/__tests__/applyRenderStyle.test.ts +0 -146
  137. package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
  138. package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
  139. package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
  140. package/src/__tests__/asciiDiagramParse.test.ts +0 -233
  141. package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
  142. package/src/__tests__/asciiDiagramRender.test.ts +0 -162
  143. package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
  144. package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
  145. package/src/__tests__/asciiTimelineParse.test.ts +0 -205
  146. package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
  147. package/src/__tests__/asciiTimelineRender.test.ts +0 -376
  148. package/src/__tests__/atmosphereLayers.test.ts +0 -108
  149. package/src/__tests__/attrTokens.test.ts +0 -167
  150. package/src/__tests__/colorUtils.test.ts +0 -112
  151. package/src/__tests__/contentContainer.test.ts +0 -325
  152. package/src/__tests__/contentExtractor.test.ts +0 -243
  153. package/src/__tests__/coverBlock.test.ts +0 -310
  154. package/src/__tests__/customTemplateSample.test.ts +0 -144
  155. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
  156. package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
  157. package/src/__tests__/dataTable.test.ts +0 -145
  158. package/src/__tests__/diagramBlock.test.ts +0 -122
  159. package/src/__tests__/diagramLayout.test.ts +0 -134
  160. package/src/__tests__/diagramText.test.ts +0 -26
  161. package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
  162. package/src/__tests__/drawing.test.ts +0 -109
  163. package/src/__tests__/drawingBlock.test.ts +0 -124
  164. package/src/__tests__/drawingLayout.test.ts +0 -171
  165. package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
  166. package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
  167. package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
  168. package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
  169. package/src/__tests__/geohash.test.ts +0 -110
  170. package/src/__tests__/getLayers.test.ts +0 -243
  171. package/src/__tests__/getLayersFallback.test.ts +0 -103
  172. package/src/__tests__/haversine.test.ts +0 -63
  173. package/src/__tests__/iconResolve.test.ts +0 -122
  174. package/src/__tests__/imageEditExportSvg.test.ts +0 -70
  175. package/src/__tests__/imageEditState.test.ts +0 -74
  176. package/src/__tests__/imageEditVersions.test.ts +0 -243
  177. package/src/__tests__/inferDocumentTitle.test.ts +0 -50
  178. package/src/__tests__/inlineIconMarker.test.ts +0 -36
  179. package/src/__tests__/inputDescriptors.test.ts +0 -162
  180. package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
  181. package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
  182. package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
  183. package/src/__tests__/jsonForm.pointer.test.ts +0 -149
  184. package/src/__tests__/jsonForm.tokens.test.ts +0 -84
  185. package/src/__tests__/layoutBlock.test.ts +0 -83
  186. package/src/__tests__/layoutLayout.test.ts +0 -169
  187. package/src/__tests__/localForageAdapter.test.ts +0 -155
  188. package/src/__tests__/majorApiTypes.test.ts +0 -18
  189. package/src/__tests__/markdown.test.ts +0 -1009
  190. package/src/__tests__/markdownIcons.test.ts +0 -104
  191. package/src/__tests__/markdownSanitize.test.ts +0 -81
  192. package/src/__tests__/markdownToDoc.test.ts +0 -957
  193. package/src/__tests__/matchFontFamily.test.ts +0 -114
  194. package/src/__tests__/materializeBlockLayers.test.ts +0 -135
  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__/pandocAttrParse.test.ts +0 -187
  209. package/src/__tests__/recommendTemplates.test.ts +0 -183
  210. package/src/__tests__/resolveDocTheme.test.ts +0 -69
  211. package/src/__tests__/rootExports.test.ts +0 -61
  212. package/src/__tests__/scopedContentContainer.test.ts +0 -109
  213. package/src/__tests__/seededRandom.test.ts +0 -142
  214. package/src/__tests__/shapeGeometry.test.ts +0 -138
  215. package/src/__tests__/shapeVocabulary.test.ts +0 -133
  216. package/src/__tests__/storage.test.ts +0 -60
  217. package/src/__tests__/structuredData.test.ts +0 -249
  218. package/src/__tests__/surface.test.ts +0 -68
  219. package/src/__tests__/templateAnnotationParse.test.ts +0 -160
  220. package/src/__tests__/templateInputs.test.ts +0 -69
  221. package/src/__tests__/templateMetadata.test.ts +0 -32
  222. package/src/__tests__/templates.test.ts +0 -710
  223. package/src/__tests__/themeCompile.test.ts +0 -225
  224. package/src/__tests__/themeValidator.test.ts +0 -131
  225. package/src/__tests__/timing.test.ts +0 -167
  226. package/src/__tests__/transformProvenance.test.ts +0 -160
  227. package/src/__tests__/transformV2.test.ts +0 -163
  228. package/src/__tests__/transitionNormalize.test.ts +0 -61
  229. package/src/__tests__/treeviewBattle.test.ts +0 -76
  230. package/src/__tests__/treeviewDetect.test.ts +0 -168
  231. package/src/__tests__/treeviewParse.test.ts +0 -118
  232. package/src/__tests__/treeviewPipeline.test.ts +0 -183
  233. package/src/__tests__/treeviewRender.test.ts +0 -91
  234. package/src/__tests__/validateDoc.test.ts +0 -260
  235. package/src/__tests__/versions.test.ts +0 -459
  236. package/src/doc/annotationBlocks.ts +0 -117
  237. package/src/doc/applyNarrationTiming.ts +0 -244
  238. package/src/doc/asciiDiagram/chars.ts +0 -210
  239. package/src/doc/asciiDiagram/detect.ts +0 -175
  240. package/src/doc/asciiDiagram/index.ts +0 -38
  241. package/src/doc/asciiDiagram/mapping.ts +0 -225
  242. package/src/doc/asciiDiagram/parse.ts +0 -1095
  243. package/src/doc/asciiDiagram/render.ts +0 -963
  244. package/src/doc/asciiDiagram/repair.ts +0 -400
  245. package/src/doc/asciiDiagram/types.ts +0 -65
  246. package/src/doc/asciiTimeline/detect.ts +0 -138
  247. package/src/doc/asciiTimeline/index.ts +0 -26
  248. package/src/doc/asciiTimeline/mapping.ts +0 -43
  249. package/src/doc/asciiTimeline/parse.ts +0 -870
  250. package/src/doc/asciiTimeline/render.ts +0 -427
  251. package/src/doc/asciiTimeline/types.ts +0 -73
  252. package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
  253. package/src/doc/audioMapping.ts +0 -442
  254. package/src/doc/customTemplatesFrontmatter.ts +0 -273
  255. package/src/doc/customThemesFrontmatter.ts +0 -95
  256. package/src/doc/docToMarkdown.ts +0 -284
  257. package/src/doc/index.ts +0 -127
  258. package/src/doc/markdownToDoc.ts +0 -1054
  259. package/src/doc/materializeBlockLayers.ts +0 -304
  260. package/src/doc/mediaAnnotations.ts +0 -120
  261. package/src/doc/resolveDocTheme.ts +0 -56
  262. package/src/doc/standaloneAnnotation.ts +0 -58
  263. package/src/doc/structuredData.ts +0 -301
  264. package/src/doc/templateInputs.ts +0 -423
  265. package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
  266. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
  267. package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
  268. package/src/doc/templates/accentImage.ts +0 -362
  269. package/src/doc/templates/captionUtils.ts +0 -56
  270. package/src/doc/templates/comparisonBar.ts +0 -173
  271. package/src/doc/templates/coverBlock.ts +0 -255
  272. package/src/doc/templates/customTemplate.ts +0 -51
  273. package/src/doc/templates/dataTable.ts +0 -102
  274. package/src/doc/templates/dateEvent.ts +0 -147
  275. package/src/doc/templates/definitionCard.ts +0 -140
  276. package/src/doc/templates/diagramBlock.ts +0 -403
  277. package/src/doc/templates/diagramLayout.ts +0 -159
  278. package/src/doc/templates/drawingBlock.ts +0 -325
  279. package/src/doc/templates/drawingLayout.ts +0 -539
  280. package/src/doc/templates/factCard.ts +0 -146
  281. package/src/doc/templates/fallbackBlock.ts +0 -123
  282. package/src/doc/templates/featureBlock.ts +0 -209
  283. package/src/doc/templates/fullBleedQuote.ts +0 -83
  284. package/src/doc/templates/imageWithCaption.ts +0 -186
  285. package/src/doc/templates/index.ts +0 -642
  286. package/src/doc/templates/inputDescriptors.ts +0 -451
  287. package/src/doc/templates/layoutBlock.ts +0 -43
  288. package/src/doc/templates/layoutLayout.ts +0 -243
  289. package/src/doc/templates/listBlock.ts +0 -207
  290. package/src/doc/templates/mapBlock.ts +0 -138
  291. package/src/doc/templates/metadata.ts +0 -130
  292. package/src/doc/templates/persistentLayers.ts +0 -526
  293. package/src/doc/templates/photoGrid.ts +0 -190
  294. package/src/doc/templates/pullQuote.ts +0 -141
  295. package/src/doc/templates/quoteBlock.ts +0 -141
  296. package/src/doc/templates/registry.ts +0 -88
  297. package/src/doc/templates/sectionHeader.ts +0 -120
  298. package/src/doc/templates/statHighlight.ts +0 -146
  299. package/src/doc/templates/templateNames.ts +0 -22
  300. package/src/doc/templates/timelineBlock.ts +0 -613
  301. package/src/doc/templates/titleBlock.ts +0 -150
  302. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
  303. package/src/doc/templates/tokens/resolveTokens.ts +0 -453
  304. package/src/doc/templates/treeBlock.ts +0 -131
  305. package/src/doc/templates/twoColumn.ts +0 -263
  306. package/src/doc/templates/videoPullQuote.ts +0 -142
  307. package/src/doc/templates/videoWithCaption.ts +0 -135
  308. package/src/doc/treeview/chars.ts +0 -72
  309. package/src/doc/treeview/detect.ts +0 -145
  310. package/src/doc/treeview/index.ts +0 -30
  311. package/src/doc/treeview/mapping.ts +0 -95
  312. package/src/doc/treeview/parse.ts +0 -201
  313. package/src/doc/treeview/render.ts +0 -41
  314. package/src/doc/treeview/types.ts +0 -43
  315. package/src/doc/utils/animationUtils.ts +0 -399
  316. package/src/doc/utils/applyRenderStyle.ts +0 -106
  317. package/src/doc/utils/diagramText.ts +0 -78
  318. package/src/doc/utils/imageTreatment.ts +0 -70
  319. package/src/doc/utils/nearest.ts +0 -59
  320. package/src/doc/utils/shapeGeometry.ts +0 -614
  321. package/src/doc/utils/themeUtils.ts +0 -243
  322. package/src/doc/validate.ts +0 -575
  323. package/src/generate/contentExtractor.ts +0 -921
  324. package/src/generate/index.ts +0 -18
  325. package/src/generate/templateMapper.ts +0 -177
  326. package/src/icons/iconData.ts +0 -31
  327. package/src/icons/index.ts +0 -26
  328. package/src/icons/inlineIconMarker.ts +0 -73
  329. package/src/icons/resolve.ts +0 -139
  330. package/src/imageEdit/ImageEditVersionManager.ts +0 -73
  331. package/src/imageEdit/export.ts +0 -410
  332. package/src/imageEdit/index.ts +0 -72
  333. package/src/imageEdit/persistence.ts +0 -113
  334. package/src/imageEdit/state.ts +0 -112
  335. package/src/imageEdit/versionPaths.ts +0 -44
  336. package/src/imageEdit/versions.ts +0 -152
  337. package/src/index.ts +0 -15
  338. package/src/internal/immutable.ts +0 -58
  339. package/src/jsonForm/chooseControl.ts +0 -88
  340. package/src/jsonForm/evaluateWhen.ts +0 -59
  341. package/src/jsonForm/index.ts +0 -32
  342. package/src/jsonForm/inferSchema.ts +0 -25
  343. package/src/jsonForm/pointer.ts +0 -154
  344. package/src/jsonForm/tokens.ts +0 -78
  345. package/src/jsonForm/types.ts +0 -167
  346. package/src/markdown/annotationCoercion.ts +0 -295
  347. package/src/markdown/attrTokens.ts +0 -243
  348. package/src/markdown/convert.ts +0 -1353
  349. package/src/markdown/htmlParse.ts +0 -212
  350. package/src/markdown/index.ts +0 -152
  351. package/src/markdown/parse.ts +0 -103
  352. package/src/markdown/sanitize.ts +0 -318
  353. package/src/markdown/stringify.ts +0 -207
  354. package/src/markdown/types.ts +0 -710
  355. package/src/markdown/utils.ts +0 -459
  356. package/src/narration/align.ts +0 -514
  357. package/src/narration/features.ts +0 -231
  358. package/src/narration/index.ts +0 -86
  359. package/src/narration/nuclei.ts +0 -118
  360. package/src/narration/pacing.ts +0 -211
  361. package/src/narration/script.ts +0 -239
  362. package/src/narration/session.ts +0 -100
  363. package/src/narration/sidecar.ts +0 -187
  364. package/src/narration/syllables.ts +0 -85
  365. package/src/narration/trace.ts +0 -50
  366. package/src/narration/types.ts +0 -299
  367. package/src/narration/vad.ts +0 -131
  368. package/src/ngeohash.d.ts +0 -11
  369. package/src/random/SeededRandom.ts +0 -127
  370. package/src/random/index.ts +0 -1
  371. package/src/recommend/index.ts +0 -16
  372. package/src/recommend/numberHighlight.ts +0 -25
  373. package/src/recommend/templates.ts +0 -393
  374. package/src/schemas/BlockTemplates.ts +0 -1046
  375. package/src/schemas/CustomTemplates.ts +0 -126
  376. package/src/schemas/Doc.ts +0 -1052
  377. package/src/schemas/ImageEditDoc.ts +0 -102
  378. package/src/schemas/LayoutStrategy.ts +0 -178
  379. package/src/schemas/Media.ts +0 -179
  380. package/src/schemas/MediaProvider.ts +0 -70
  381. package/src/schemas/Theme.ts +0 -406
  382. package/src/schemas/Transitions.ts +0 -224
  383. package/src/schemas/Types.ts +0 -15
  384. package/src/schemas/Viewport.ts +0 -91
  385. package/src/schemas/colorUtils.ts +0 -219
  386. package/src/schemas/fontStacks.ts +0 -339
  387. package/src/schemas/index.ts +0 -29
  388. package/src/schemas/themeCompile.ts +0 -237
  389. package/src/schemas/themeConstants.ts +0 -2
  390. package/src/schemas/themeLibrary.ts +0 -60
  391. package/src/schemas/themeValidator.ts +0 -426
  392. package/src/schemas/themes/bold.json +0 -48
  393. package/src/schemas/themes/cinematic.json +0 -111
  394. package/src/schemas/themes/documentary.json +0 -96
  395. package/src/schemas/themes/gezellig.json +0 -93
  396. package/src/schemas/themes/index.ts +0 -53
  397. package/src/schemas/themes/magazine.json +0 -89
  398. package/src/schemas/themes/minimalist.json +0 -45
  399. package/src/schemas/themes/morning-light.json +0 -85
  400. package/src/schemas/themes/standard-dark.json +0 -85
  401. package/src/schemas/themes/standard.json +0 -74
  402. package/src/schemas/themes/tech-dark.json +0 -101
  403. package/src/schemas/themes/warm-earth.json +0 -50
  404. package/src/spatial/Geohash.ts +0 -196
  405. package/src/spatial/Haversine.ts +0 -59
  406. package/src/spatial/index.ts +0 -2
  407. package/src/storage/ContentContainer.ts +0 -220
  408. package/src/storage/LocalForageAdapter.ts +0 -103
  409. package/src/storage/LocalStorageAdapter.ts +0 -57
  410. package/src/storage/MediaProviderFromContainer.ts +0 -92
  411. package/src/storage/MemoryStorageAdapter.ts +0 -37
  412. package/src/storage/ScopedContentContainer.ts +0 -143
  413. package/src/storage/Storage.ts +0 -28
  414. package/src/storage/index.ts +0 -9
  415. package/src/timing/index.ts +0 -17
  416. package/src/timing/narrationTiming.ts +0 -220
  417. package/src/timing/readingTime.ts +0 -94
  418. package/src/transform/applyTransform.ts +0 -122
  419. package/src/transform/blockAnalyzer.ts +0 -181
  420. package/src/transform/index.ts +0 -23
  421. package/src/transform/registry.ts +0 -198
  422. package/src/transform/styles/dataDriven.ts +0 -17
  423. package/src/transform/styles/documentary.ts +0 -17
  424. package/src/transform/styles/index.ts +0 -5
  425. package/src/transform/styles/magazine.ts +0 -18
  426. package/src/transform/styles/minimal.ts +0 -17
  427. package/src/transform/styles/narrative.ts +0 -18
  428. package/src/transform/templateSelector.ts +0 -389
  429. package/src/transform/timingAllocator.ts +0 -257
  430. package/src/transform/types.ts +0 -151
  431. package/src/versions/DocumentVersionManager.ts +0 -70
  432. package/src/versions/gitignore.ts +0 -34
  433. package/src/versions/index.ts +0 -56
  434. package/src/versions/operations.ts +0 -144
  435. package/src/versions/paths.ts +0 -51
  436. package/src/versions/snapshotStore.ts +0 -202
  437. package/src/versions/timestamp.ts +0 -48
  438. package/src/versions/types.ts +0 -93
@@ -1,400 +0,0 @@
1
- /**
2
- * ASCII diagram REPAIR — an opt-in, best-effort pass that reconstructs a
3
- * clean, well-formed diagram from broken box-and-line art.
4
- *
5
- * The motivating case: hand-drawn architecture art whose labels overflow
6
- * their boxes and shove every following column out of alignment row-to-row
7
- * (e.g. a rename widened the labels). Conservative detection correctly
8
- * declines such art (`garbled-labels`) so it renders as a faithful code
9
- * block — but a user can then ask to "repair" it. This is that repair.
10
- *
11
- * It is deliberately AGGRESSIVE and lossy — never on the auto-detection path
12
- * (a mistake there would hide real code). It is only invoked when the user
13
- * explicitly opts in, and the result is a fully editable diagram, so an
14
- * imperfect edge or two is fine (the canvas lets the user fix them).
15
- *
16
- * Pipeline:
17
- * 1. Aggressive box tracing (walls may cross edge routing).
18
- * 2. Row-band label recovery — the key trick: even when a box's columns are
19
- * desynced from its borders, each label ROW is internally consistent, so
20
- * its `│…│` segments map to the band's boxes by reading order.
21
- * 3. Best-effort edge recovery (facing-border adjacency + arrowhead
22
- * direction).
23
- * 4. Re-render clean via `renderAsciiDiagram` — the output re-parses cleanly.
24
- */
25
-
26
- import { isHoriz, isVert, isJunction, arrowDirection } from './chars.js';
27
- import { toGrid, traceBoxes, type TracedRect } from './parse.js';
28
- import { renderAsciiDiagram } from './render.js';
29
- import { detectAsciiDiagram } from './detect.js';
30
- import type { AsciiDiagram, AsciiDiagramEdge, AsciiDiagramNode } from './types.js';
31
-
32
- export interface RepairResult {
33
- /** The reconstructed diagram model (grid-native coordinates). */
34
- diagram: AsciiDiagram;
35
- /** Clean, re-rendered box-and-line art — re-parses to `diagram`. */
36
- art: string;
37
- }
38
-
39
- /** Minimum boxes for a repair to be worthwhile. */
40
- const MIN_REPAIR_BOXES = 2;
41
- /** Max vertical gap (rows) between two boxes to infer a connecting edge. */
42
- const MAX_EDGE_ROW_GAP = 8;
43
- /** Max horizontal gap (cols) between two boxes to infer a connecting edge. */
44
- const MAX_EDGE_COL_GAP = 12;
45
- /** Blank rows inserted between stacked bands so edges route without overlap. */
46
- const BAND_ROW_GAP = 4;
47
- /** Blank cols inserted between boxes in a band so edges route without overlap. */
48
- const BAND_COL_GAP = 4;
49
-
50
- /**
51
- * True when a fence is a box diagram too broken for clean detection but worth
52
- * offering to repair: it has box corners and aggressively traces ≥2 boxes,
53
- * yet conservative detection declines it. Clean diagrams (already detected)
54
- * and non-box art both return false, so the three states partition cleanly.
55
- */
56
- export function isRepairableDiagram(text: string): boolean {
57
- // Already a clean diagram → not a repair candidate (the canvas handles it).
58
- if (detectAsciiDiagram(text).isDiagram) return false;
59
- const grid = toGrid(text);
60
- const rects = traceBoxes(grid, true);
61
- return dedupeRects(rects).length >= MIN_REPAIR_BOXES;
62
- }
63
-
64
- /**
65
- * Reconstruct a clean diagram from broken art. Returns `null` when fewer than
66
- * two boxes can be recovered (nothing worth repairing).
67
- */
68
- export function repairAsciiDiagram(text: string): RepairResult | null {
69
- const grid = toGrid(text);
70
- const rects = dedupeRects(traceBoxes(grid, true));
71
- if (rects.length < MIN_REPAIR_BOXES) return null;
72
-
73
- const nodes = buildNodes(grid, rects);
74
- const edges = recoverEdges(grid, rects, nodes);
75
- const style = detectGridStyle(grid);
76
- const diagram: AsciiDiagram = { nodes, edges, style, warnings: ['repaired'] };
77
- return { diagram, art: renderAsciiDiagram(diagram) };
78
- }
79
-
80
- // ---------------------------------------------------------------------------
81
- // Box de-duplication (aggressive tracing can emit the same rect twice, and
82
- // nested duplicates where a container and a decomposed cell coincide).
83
- // ---------------------------------------------------------------------------
84
-
85
- function dedupeRects(rects: TracedRect[]): TracedRect[] {
86
- const seen = new Set<string>();
87
- const out: TracedRect[] = [];
88
- for (const r of rects) {
89
- const key = `${r.r0},${r.c0},${r.r1},${r.c1}`;
90
- if (seen.has(key)) continue;
91
- seen.add(key);
92
- out.push(r);
93
- }
94
- // Reading order (row, then col).
95
- return out.sort((a, b) => a.r0 - b.r0 || a.c0 - b.c0);
96
- }
97
-
98
- // ---------------------------------------------------------------------------
99
- // Label recovery (row-band segment matching)
100
- // ---------------------------------------------------------------------------
101
-
102
- function buildNodes(grid: string[][], rects: TracedRect[]): AsciiDiagramNode[] {
103
- const W = grid[0]?.length ?? 0;
104
- const labels = rects.map(() => [] as string[]);
105
- const index = new Map(rects.map((r, i) => [r, i] as const));
106
-
107
- // Group boxes into horizontal bands (row ranges overlap).
108
- const bands: TracedRect[][] = [];
109
- for (const r of rects) {
110
- let band = bands.find((bd) => bd.some((x) => x.r0 <= r.r1 && r.r0 <= x.r1));
111
- if (!band) {
112
- band = [];
113
- bands.push(band);
114
- }
115
- band.push(r);
116
- }
117
-
118
- for (const band of bands) {
119
- band.sort((a, b) => a.c0 - b.c0);
120
- const minR = Math.min(...band.map((b) => b.r0 + 1));
121
- const maxR = Math.max(...band.map((b) => b.r1 - 1));
122
- for (let r = minR; r <= maxR; r++) {
123
- const inRow = band.filter((b) => r > b.r0 && r < b.r1);
124
- if (inRow.length === 0) continue;
125
- const rowText = grid[r].join('');
126
- // Split the row into `│`-delimited segments; a clean band row yields one
127
- // non-empty segment per box, matched by reading order.
128
- const segs = rowText
129
- .split(/[│┃║]/)
130
- .map(cleanLabelText)
131
- .filter((s) => s.length > 0);
132
- if (segs.length === inRow.length) {
133
- inRow.forEach((b, i) => {
134
- const idx = index.get(b);
135
- if (idx !== undefined && segs[i]) labels[idx].push(segs[i]);
136
- });
137
- } else {
138
- // Fallback: slice each box's own columns (works when its border cols
139
- // still line up — isolated boxes, or when the band-split is ambiguous).
140
- for (const b of inRow) {
141
- const idx = index.get(b);
142
- if (idx === undefined) continue;
143
- const t = cleanLabelText(grid[r].slice(b.c0 + 1, Math.min(b.c1, W)).join(''));
144
- if (t) labels[idx].push(t);
145
- }
146
- }
147
- }
148
- }
149
-
150
- // Normalize rows onto well-spaced band offsets. Preserving the original
151
- // (tight, broken) row positions makes the renderer route edges THROUGH
152
- // boxes; stacking bands with a routing gap gives every band-to-band edge
153
- // clean vertical space so the rendered art re-parses losslessly. Columns
154
- // keep their original relative order (the horizontal layout was fine).
155
- const bandRow = new Map<TracedRect[], number>();
156
- const orderedBands = [...bands].sort(
157
- (a, b) => Math.min(...a.map((x) => x.r0)) - Math.min(...b.map((x) => x.r0)),
158
- );
159
- let rowCursor = 0;
160
- for (const band of orderedBands) {
161
- bandRow.set(band, rowCursor);
162
- const bandHeight = Math.max(...band.map((b) => b.r1 - b.r0 + 1));
163
- rowCursor += bandHeight + BAND_ROW_GAP;
164
- }
165
- const rectBand = new Map<TracedRect, TracedRect[]>();
166
- for (const band of bands) for (const r of band) rectBand.set(r, band);
167
-
168
- // Normalize columns within each band by the boxes' FITTED widths. Recovered
169
- // labels are usually wider than the broken art's boxes, so the original
170
- // column spacing would make fitted boxes overlap — the renderer would then
171
- // shove a box into the wrong band and route edges through it. Laying each
172
- // band out left-to-right by fitted width + a routing gap keeps bands intact.
173
- const fittedW = rects.map((rect, i) =>
174
- Math.max(rect.c1 - rect.c0 + 1, ...labels[i].map((l) => l.length + 4), 3),
175
- );
176
- const rectIndex = new Map(rects.map((r, i) => [r, i] as const));
177
- const bandCol = new Map<TracedRect, number>();
178
- for (const band of bands) {
179
- const ordered = [...band].sort((a, b) => a.c0 - b.c0);
180
- let colCursor = Math.min(...band.map((b) => b.c0));
181
- for (const r of ordered) {
182
- bandCol.set(r, colCursor);
183
- colCursor += (fittedW[rectIndex.get(r) ?? 0] ?? 3) + BAND_COL_GAP;
184
- }
185
- }
186
-
187
- // Assign ids (slug of the first label line, deduped), then resolve
188
- // containment (a box strictly inside another becomes its child).
189
- const parentIdx = rects.map((_, i) => smallestContainer(rects, i));
190
- const usedIds = new Map<string, number>();
191
- const nodes: AsciiDiagramNode[] = rects.map((rect, i) => {
192
- let id = slugify(labels[i][0] ?? '');
193
- const n = usedIds.get(id) ?? 0;
194
- usedIds.set(id, n + 1);
195
- if (n > 0) id = `${id}-${n + 1}`;
196
- const band = rectBand.get(rect);
197
- const nested = parentIdx[i] >= 0;
198
- const row = band && !nested ? (bandRow.get(band) ?? rect.r0) : rect.r0;
199
- const col = !nested ? (bandCol.get(rect) ?? rect.c0) : rect.c0;
200
- return {
201
- id,
202
- label: labels[i].join('\n'),
203
- col,
204
- row,
205
- wCols: rect.c1 - rect.c0 + 1,
206
- hRows: rect.r1 - rect.r0 + 1,
207
- };
208
- });
209
- nodes.forEach((node, i) => {
210
- if (parentIdx[i] >= 0) node.containerId = nodes[parentIdx[i]].id;
211
- });
212
- return nodes;
213
- }
214
-
215
- /**
216
- * Strip UNICODE box-drawing chars and arrowheads (edge routing that bled into
217
- * a label). ASCII `-`/`|`/`+` are kept — they're common in real label text
218
- * (`molen-tooling`, `read-only`, `stdin | stdout`), and a unicode diagram
219
- * (the common case) never uses them as borders anyway.
220
- */
221
- function cleanLabelText(seg: string): string {
222
- let out = '';
223
- for (const ch of seg) {
224
- const code = ch.codePointAt(0) ?? 0;
225
- const box = code >= 0x2500 && code <= 0x257f; // Box Drawing block
226
- if (box || arrowDirection(ch) !== null) out += ' ';
227
- else out += ch;
228
- }
229
- return out.replace(/\s+/g, ' ').trim();
230
- }
231
-
232
- function smallestContainer(rects: TracedRect[], i: number): number {
233
- const child = rects[i];
234
- let best = -1;
235
- let bestArea = Infinity;
236
- for (let j = 0; j < rects.length; j++) {
237
- if (j === i) continue;
238
- const p = rects[j];
239
- if (p.r0 < child.r0 && p.c0 < child.c0 && p.r1 > child.r1 && p.c1 > child.c1) {
240
- const a = (p.r1 - p.r0) * (p.c1 - p.c0);
241
- if (a < bestArea) {
242
- bestArea = a;
243
- best = j;
244
- }
245
- }
246
- }
247
- return best;
248
- }
249
-
250
- function slugify(s: string): string {
251
- const slug = s
252
- .toLowerCase()
253
- .replace(/[^a-z0-9]+/g, '-')
254
- .replace(/^-+|-+$/g, '');
255
- return slug || 'node';
256
- }
257
-
258
- // ---------------------------------------------------------------------------
259
- // Edge recovery (facing-border adjacency + arrowhead direction)
260
- // ---------------------------------------------------------------------------
261
-
262
- function recoverEdges(
263
- grid: string[][],
264
- rects: TracedRect[],
265
- nodes: AsciiDiagramNode[],
266
- ): AsciiDiagramEdge[] {
267
- const H = grid.length;
268
- const W = grid[0]?.length ?? 0;
269
- const at = (r: number, c: number): string =>
270
- r >= 0 && r < H && c >= 0 && c < W ? grid[r][c] : ' ';
271
- const isConnector = (ch: string): boolean =>
272
- isVert(ch) || isHoriz(ch) || isJunction(ch) || arrowDirection(ch) !== null;
273
-
274
- const colOverlap = (a: TracedRect, b: TracedRect): boolean =>
275
- Math.max(a.c0, b.c0) <= Math.min(a.c1, b.c1);
276
- const rowOverlap = (a: TracedRect, b: TracedRect): boolean =>
277
- Math.max(a.r0, b.r0) <= Math.min(a.r1, b.r1);
278
-
279
- const edges: AsciiDiagramEdge[] = [];
280
- const seen = new Set<string>();
281
- const push = (s: number, t: number, directed: boolean) => {
282
- if (s === t) return;
283
- const key = `${nodes[s].id}|${nodes[t].id}`;
284
- if (seen.has(key)) return;
285
- seen.add(key);
286
- edges.push({ source: nodes[s].id, target: nodes[t].id, directed });
287
- };
288
-
289
- for (let i = 0; i < rects.length; i++) {
290
- for (let j = 0; j < rects.length; j++) {
291
- if (i === j) continue;
292
- const A = rects[i];
293
- const B = rects[j];
294
-
295
- // Vertical: A above B, columns overlap, a connector spans the gap, and
296
- // no third box sits directly between them in that column band.
297
- if (A.r1 < B.r0 && B.r0 - A.r1 <= MAX_EDGE_ROW_GAP && colOverlap(A, B)) {
298
- const lo = Math.max(A.c0, B.c0);
299
- const hi = Math.min(A.c1, B.c1);
300
- if (
301
- gapHasConnector(at, A.r1 + 1, B.r0 - 1, lo - 1, hi + 1, isConnector) &&
302
- !boxBetweenVert(rects, i, j, lo, hi)
303
- ) {
304
- const directed = gapHasArrow(at, A.r1 + 1, B.r0, lo - 1, hi + 1, 'down');
305
- push(i, j, directed);
306
- }
307
- }
308
-
309
- // Horizontal: A left of B, rows overlap. Require an actual arrowhead in
310
- // the gap — a label that overflowed its box leaks `│`/text into the gap
311
- // between horizontally-adjacent boxes, which a plain-connector test
312
- // would read as a phantom edge. A real horizontal edge carries `►`/`◄`.
313
- if (A.c1 < B.c0 && B.c0 - A.c1 <= MAX_EDGE_COL_GAP && rowOverlap(A, B) && i < j) {
314
- const lo = Math.max(A.r0, B.r0);
315
- const hi = Math.min(A.r1, B.r1);
316
- const rightArrow = gapHasArrow(at, lo - 1, hi + 1, A.c1 + 1, B.c0, 'right');
317
- const leftArrow = gapHasArrow(at, lo - 1, hi + 1, A.c1 + 1, B.c0, 'left');
318
- if ((rightArrow || leftArrow) && !boxBetweenHoriz(rects, i, j, lo, hi)) {
319
- if (leftArrow && !rightArrow) push(j, i, true);
320
- else push(i, j, true);
321
- }
322
- }
323
- }
324
- }
325
- return edges;
326
- }
327
-
328
- function gapHasConnector(
329
- at: (r: number, c: number) => string,
330
- r0: number,
331
- r1: number,
332
- c0: number,
333
- c1: number,
334
- isConnector: (ch: string) => boolean,
335
- ): boolean {
336
- for (let r = r0; r <= r1; r++)
337
- for (let c = c0; c <= c1; c++) if (isConnector(at(r, c))) return true;
338
- return false;
339
- }
340
-
341
- function gapHasArrow(
342
- at: (r: number, c: number) => string,
343
- r0: number,
344
- r1: number,
345
- c0: number,
346
- c1: number,
347
- dir: 'down' | 'up' | 'left' | 'right',
348
- ): boolean {
349
- for (let r = r0; r <= r1; r++) {
350
- for (let c = c0; c <= c1; c++) {
351
- if (arrowDirection(at(r, c)) === dir) return true;
352
- }
353
- }
354
- return false;
355
- }
356
-
357
- function boxBetweenVert(
358
- rects: TracedRect[],
359
- i: number,
360
- j: number,
361
- lo: number,
362
- hi: number,
363
- ): boolean {
364
- const A = rects[i];
365
- const B = rects[j];
366
- return rects.some((k, ki) => {
367
- if (ki === i || ki === j) return false;
368
- return k.r0 > A.r1 && k.r1 < B.r0 && Math.max(k.c0, lo) <= Math.min(k.c1, hi);
369
- });
370
- }
371
-
372
- function boxBetweenHoriz(
373
- rects: TracedRect[],
374
- i: number,
375
- j: number,
376
- lo: number,
377
- hi: number,
378
- ): boolean {
379
- const A = rects[i];
380
- const B = rects[j];
381
- return rects.some((k, ki) => {
382
- if (ki === i || ki === j) return false;
383
- return k.c0 > A.c1 && k.c1 < B.c0 && Math.max(k.r0, lo) <= Math.min(k.r1, hi);
384
- });
385
- }
386
-
387
- // ---------------------------------------------------------------------------
388
-
389
- function detectGridStyle(grid: string[][]): 'unicode' | 'ascii' {
390
- let unicode = 0;
391
- let ascii = 0;
392
- for (const row of grid) {
393
- for (const ch of row) {
394
- const code = ch.codePointAt(0) ?? 0;
395
- if (code >= 0x2500 && code <= 0x257f) unicode++;
396
- else if (ch === '+' || ch === '|' || ch === '-') ascii++;
397
- }
398
- }
399
- return ascii > unicode ? 'ascii' : 'unicode';
400
- }
@@ -1,65 +0,0 @@
1
- /**
2
- * Public types for the ASCII diagram codec.
3
- *
4
- * Coordinates are grid-native: `col`/`row` count character cells from the
5
- * top-left of the art (0-based), `wCols`/`hRows` include the borders. The
6
- * mapping helpers in `mapping.ts` convert to/from diagram canvas units
7
- * via {@link ASCII_CHAR_W} / {@link ASCII_CHAR_H}.
8
- */
9
-
10
- export interface AsciiDiagramNode {
11
- /**
12
- * Stable id: slug of the first label line, deduplicated with `-2`/`-3`
13
- * suffixes in reading order. Identical art always re-parses to
14
- * identical ids (editor selection and edges resolve by id).
15
- */
16
- id: string;
17
- /** Interior text lines joined with `\n` (trimmed, blank lines dropped). May be `''`. */
18
- label: string;
19
- /** Left column of the box (0-based, includes the border). */
20
- col: number;
21
- /** Top row of the box (0-based, includes the border). */
22
- row: number;
23
- /** Full box width in columns, borders included. */
24
- wCols: number;
25
- /** Full box height in rows, borders included. */
26
- hRows: number;
27
- /** Id of the box that strictly contains this one, when nested. */
28
- containerId?: string;
29
- }
30
-
31
- export interface AsciiDiagramEdge {
32
- source: string;
33
- target: string;
34
- /** Edge label parsed from an embedded horizontal run (`──label──▶`). */
35
- label?: string;
36
- /** False when the line carried no arrowhead. */
37
- directed: boolean;
38
- }
39
-
40
- export interface AsciiDiagram {
41
- /** Nodes in reading order (row, then col). Containers are ordinary nodes with children pointing at them. */
42
- nodes: AsciiDiagramNode[];
43
- /** Deduplicated edges, sorted by (source, target, label). */
44
- edges: AsciiDiagramEdge[];
45
- /** Character vocabulary detected in the source; render emits the same style. */
46
- style: 'unicode' | 'ascii';
47
- /** Non-fatal parse notes (loose text, dropped labels, ambiguous buses, …). */
48
- warnings: string[];
49
- }
50
-
51
- export interface AsciiDiagramDetection {
52
- isDiagram: boolean;
53
- /** Present when `isDiagram` — avoids a second parse in callers. */
54
- diagram?: AsciiDiagram;
55
- /** Machine-greppable accept/reject reasons, e.g. `too-few-boxes(1)`, `loose-ratio(0.41)`. */
56
- reasons: string[];
57
- }
58
-
59
- /**
60
- * Canvas pixels per grid column/row. Sized so a typical 12-col × 3-row
61
- * ASCII box maps close to the native 180×64 diagram card, and a 60–100
62
- * column diagram fits the 1600×900 diagram viewport.
63
- */
64
- export const ASCII_CHAR_W = 14;
65
- export const ASCII_CHAR_H = 28;
@@ -1,138 +0,0 @@
1
- /** Conservative detection for authored ASCII timeline fences. */
2
-
3
- import type { MarkdownCodeBlock } from '../../markdown/types.js';
4
- import { parseAsciiDiagramWithStats } from '../asciiDiagram/parse.js';
5
- import { parseAsciiTimelineWithStats } from './parse.js';
6
- import type { AsciiTimelineDetection } from './types.js';
7
-
8
- export const ASCII_TIMELINE_FENCE_LANGS: ReadonlySet<string> = new Set([
9
- 'text',
10
- 'txt',
11
- 'plaintext',
12
- 'plain',
13
- 'ascii',
14
- 'timeline',
15
- ]);
16
-
17
- const MAX_LINES = 400;
18
- const MAX_CANONICAL_LINES = 2000;
19
- const MAX_COLS = 400;
20
- const MAX_EXPLICIT_COLS = 4096;
21
- const BOX_TOP_EDGE_RE = /[┌┏╔╭].*[┐┓╗╮]/u;
22
- const CANONICAL_TRACK_RE = /\{#[^{}\s]+ start=[^{}\s]+ end=[^{}\s]+\}:\s/u;
23
-
24
- export function isEligibleAsciiTimelineFenceLang(lang: string | null | undefined): boolean {
25
- if (lang === null || lang === undefined) return true;
26
- const normalized = lang.trim().toLowerCase();
27
- return normalized === '' || ASCII_TIMELINE_FENCE_LANGS.has(normalized);
28
- }
29
-
30
- export function isExplicitTimelineLang(lang: string | null | undefined): boolean {
31
- return typeof lang === 'string' && lang.trim().toLowerCase() === 'timeline';
32
- }
33
-
34
- export interface DetectAsciiTimelineOptions {
35
- /** Explicit `timeline` language: allow one-point/ASCII-marker tracks. */
36
- explicit?: boolean;
37
- }
38
-
39
- export function detectAsciiTimeline(
40
- text: string,
41
- options: DetectAsciiTimelineOptions = {},
42
- ): AsciiTimelineDetection {
43
- const explicit = options.explicit === true;
44
- const lines = text.replace(/\r\n?/g, '\n').split('\n');
45
- const canonicalTrackRows = lines.filter((line) => CANONICAL_TRACK_RE.test(line)).length;
46
- const canonicalLineBudget = Math.min(
47
- MAX_CANONICAL_LINES,
48
- canonicalTrackRows * 6 +
49
- lines.filter((line) => /^\s*(?:branch|link)\s*:/iu.test(line)).length +
50
- 2,
51
- );
52
- if (
53
- lines.length > MAX_LINES &&
54
- (canonicalTrackRows === 0 || lines.length > canonicalLineBudget)
55
- ) {
56
- return { isTimeline: false, reasons: [`too-many-lines(${lines.length})`] };
57
- }
58
- const maxCols = Math.max(0, ...lines.map((line) => Array.from(line).length));
59
- // Canonical renderer output carries bounded track metadata on every long
60
- // row. Permit that high-confidence form up to the explicit-fence cap while
61
- // retaining the conservative 400-column limit for arbitrary untagged art.
62
- const canonicalLongForm =
63
- canonicalTrackRows > 0 &&
64
- lines.every((line) => Array.from(line).length <= MAX_COLS || CANONICAL_TRACK_RE.test(line));
65
- const maxAllowedCols = explicit || canonicalLongForm ? MAX_EXPLICIT_COLS : MAX_COLS;
66
- if (maxCols > maxAllowedCols) {
67
- return { isTimeline: false, reasons: [`too-wide(${maxCols})`] };
68
- }
69
-
70
- const nonBlank = lines.filter((line) => line.trim().length > 0);
71
- const pipeRows = nonBlank.filter((line) => /^\s*\|.*\|\s*$/.test(line)).length;
72
- const hasGfmSeparator = nonBlank.some(
73
- (line) => /^\s*\|?[\s:|-]+\|?\s*$/.test(line) && line.includes('-'),
74
- );
75
- if (pipeRows > nonBlank.length / 2 && hasGfmSeparator) {
76
- return { isTimeline: false, reasons: ['markdown-table'] };
77
- }
78
-
79
- if (!explicit && lines.some((line) => BOX_TOP_EDGE_RE.test(line))) {
80
- return { isTimeline: false, reasons: ['has-box-corners'] };
81
- }
82
-
83
- // Closed boxes own the art even if their borders happen to contain dots.
84
- // Untagged detection rejects even one box; the diagram auto-template needs
85
- // two, but silently turning a single boxed callout into a timeline is worse
86
- // than leaving it as authored code. An explicit timeline may use one boxed
87
- // callout, while two or more still belong to the diagram codec.
88
- const boxes = parseAsciiDiagramWithStats(text).diagram.nodes.length;
89
- if (boxes >= (explicit ? 2 : 1)) {
90
- return { isTimeline: false, reasons: [`has-boxes(${boxes})`] };
91
- }
92
-
93
- // A tree item may itself contain a marker rail in its label. Connector
94
- // prefixes (`├── ●──●`, `|-- ●--●`) identify the outer structure as a
95
- // tree, so conservative untagged detection must not claim that row.
96
- if (!explicit && /^[ \t]*(?:[│|][ \t]*)*[├└+|`][─━═-]{1,4}[ \t]+[●○◉◆◇•]/mu.test(text)) {
97
- return { isTimeline: false, reasons: ['tree-connector-prefix'] };
98
- }
99
-
100
- const { timeline, stats } = parseAsciiTimelineWithStats(text);
101
- if (stats.wrappedFlow) {
102
- return {
103
- isTimeline: true,
104
- timeline,
105
- reasons: [`tracks(${stats.axisLines})`, `events(${stats.markerCount})`, 'wrapped-flow'],
106
- };
107
- }
108
- if (stats.axisLines === 0) return { isTimeline: false, reasons: ['no-axis-lines'] };
109
- const explicitCadence = explicit && stats.horizontalChars === 0 && stats.markerCount >= 4;
110
- if (!explicitCadence && stats.horizontalChars < (explicit ? 2 : 8)) {
111
- return { isTimeline: false, reasons: [`too-few-horizontal(${stats.horizontalChars})`] };
112
- }
113
- if (stats.markerCount < (explicit ? 1 : 2)) {
114
- return { isTimeline: false, reasons: [`too-few-markers(${stats.markerCount})`] };
115
- }
116
- // Untagged auto-detection requires unmistakable Unicode point markers.
117
- // `foo * bar *` or `o---o` in real code therefore stays ordinary code.
118
- if (!explicit && stats.strongMarkerCount < 2) {
119
- return { isTimeline: false, reasons: [`too-few-strong-markers(${stats.strongMarkerCount})`] };
120
- }
121
-
122
- return {
123
- isTimeline: true,
124
- timeline,
125
- reasons: [
126
- `tracks(${stats.axisLines})`,
127
- `events(${stats.markerCount + stats.pointerCount})`,
128
- explicit ? 'explicit' : 'strong-markers',
129
- ],
130
- };
131
- }
132
-
133
- export function isAsciiTimelineFence(node: MarkdownCodeBlock): boolean {
134
- if (node.type !== 'code') return false;
135
- if (!isEligibleAsciiTimelineFenceLang(node.lang)) return false;
136
- return detectAsciiTimeline(node.value, { explicit: isExplicitTimelineLang(node.lang) })
137
- .isTimeline;
138
- }
@@ -1,26 +0,0 @@
1
- /** Public authored ASCII timeline codec. */
2
-
3
- export { parseAsciiTimeline, parseAsciiTimelineWithStats } from './parse.js';
4
- export type { AsciiTimelineStats } from './parse.js';
5
- export { renderAsciiTimeline } from './render.js';
6
- export type { RenderAsciiTimelineOptions } from './render.js';
7
- export {
8
- ASCII_TIMELINE_FENCE_LANGS,
9
- detectAsciiTimeline,
10
- isAsciiTimelineFence,
11
- isEligibleAsciiTimelineFenceLang,
12
- isExplicitTimelineLang,
13
- } from './detect.js';
14
- export type { DetectAsciiTimelineOptions } from './detect.js';
15
- export { asciiTimelineToTemplateData } from './mapping.js';
16
- export { isWrappedFlowTimelineSource, parseWrappedFlowTimeline } from './wrappedFlow.js';
17
- export type {
18
- AsciiTimeline,
19
- AsciiTimelineDetection,
20
- AsciiTimelineEvent,
21
- AsciiTimelineLink,
22
- AsciiTimelineMarker,
23
- AsciiTimelineSide,
24
- AsciiTimelineStyle,
25
- AsciiTimelineTrack,
26
- } from './types.js';
@@ -1,43 +0,0 @@
1
- /** Mapping from source-grid timeline data to normalized template inputs. */
2
-
3
- import type {
4
- TimelineTemplateEvent,
5
- TimelineTemplateLink,
6
- TimelineTemplateTrack,
7
- } from '../../schemas/BlockTemplates.js';
8
- import type { AsciiTimeline } from './types.js';
9
-
10
- export function asciiTimelineToTemplateData(timeline: AsciiTimeline): {
11
- tracks: TimelineTemplateTrack[];
12
- links: TimelineTemplateLink[];
13
- } {
14
- const globalStart =
15
- timeline.tracks.length > 0 ? Math.min(...timeline.tracks.map((track) => track.startColumn)) : 0;
16
- const globalEnd =
17
- timeline.tracks.length > 0 ? Math.max(...timeline.tracks.map((track) => track.endColumn)) : 1;
18
- const span = Math.max(1, globalEnd - globalStart);
19
-
20
- const tracks: TimelineTemplateTrack[] = timeline.tracks.map((track) => ({
21
- id: track.id,
22
- ...(track.label ? { label: track.label } : {}),
23
- ...(track.endLabel ? { endLabel: track.endLabel } : {}),
24
- events: track.events.map(
25
- (event): TimelineTemplateEvent => ({
26
- id: event.id,
27
- label: event.label,
28
- ...(event.description ? { description: event.description } : {}),
29
- position: clamp01((event.column - globalStart) / span),
30
- ...(event.side ? { side: event.side } : {}),
31
- ...(event.descriptionSide ? { descriptionSide: event.descriptionSide } : {}),
32
- ...(event.callout === false ? { callout: false } : {}),
33
- ...(event.marker ? { marker: event.marker } : {}),
34
- }),
35
- ),
36
- }));
37
- const links: TimelineTemplateLink[] = timeline.links.map((link) => ({ ...link }));
38
- return { tracks, links };
39
- }
40
-
41
- function clamp01(value: number): number {
42
- return Math.max(0, Math.min(1, value));
43
- }