@bendyline/squisq 2.1.0 → 2.3.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 (442) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +24 -0
  3. package/README.md +8 -8
  4. package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
  5. package/dist/{Doc-DynJleo-.d.ts → Doc-COe-rPQB.d.ts} +7 -5
  6. package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-dtKahVyD.d.ts} +1 -1
  7. package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
  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-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
  15. package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
  16. package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
  17. package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
  18. package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
  19. package/dist/chunk-BCCXTMN5.js +699 -0
  20. package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
  21. package/dist/{chunk-XNLB57UD.js → chunk-EK446BUE.js} +18 -2
  22. package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
  23. package/dist/{chunk-JI77MGAK.js → chunk-GIIOY6XR.js} +2178 -1291
  24. package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
  25. package/dist/chunk-OPO5K4DZ.js +241 -0
  26. package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
  27. package/dist/{chunk-OTKVFVL6.js → chunk-QNTQIEIV.js} +130 -47
  28. package/dist/{chunk-5UYI3RJB.js → chunk-QWCFK5FN.js} +55 -40
  29. package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
  30. package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
  31. package/dist/{chunk-QUUPYOSP.js → chunk-SPTY4C6F.js} +136 -5
  32. package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
  33. package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
  34. package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
  35. package/dist/doc/index.d.ts +311 -13
  36. package/dist/doc/index.js +25 -17
  37. package/dist/generate/index.d.ts +2 -2
  38. package/dist/generate/index.js +1 -3
  39. package/dist/icons/index.js +2 -4
  40. package/dist/icons/inlineIconMarker.js +1 -2
  41. package/dist/imageEdit/index.d.ts +48 -17
  42. package/dist/imageEdit/index.js +3 -4
  43. package/dist/index.d.ts +13 -13
  44. package/dist/index.js +67 -33
  45. package/dist/jsonForm/index.d.ts +10 -3
  46. package/dist/jsonForm/index.js +8 -7
  47. package/dist/markdown/index.d.ts +75 -11
  48. package/dist/markdown/index.js +32 -7
  49. package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-BSMOocve.d.ts} +2 -2
  50. package/dist/narration/index.d.ts +16 -3
  51. package/dist/narration/index.js +12 -14
  52. package/dist/random/index.d.ts +11 -2
  53. package/dist/random/index.js +1 -3
  54. package/dist/recommend/index.d.ts +1 -1
  55. package/dist/recommend/index.js +2 -4
  56. package/dist/schemas/index.d.ts +18 -6
  57. package/dist/schemas/index.js +7 -6
  58. package/dist/spatial/index.d.ts +2 -1
  59. package/dist/spatial/index.js +1 -2
  60. package/dist/storage/index.d.ts +4 -2
  61. package/dist/storage/index.js +1 -2
  62. package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-BUTWjufL.d.ts} +1 -1
  63. package/dist/timing/index.js +2 -4
  64. package/dist/transform/index.d.ts +3 -3
  65. package/dist/transform/index.js +6 -7
  66. package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
  67. package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
  68. package/dist/versions/index.d.ts +14 -11
  69. package/dist/versions/index.js +2 -3
  70. package/package.json +8 -3
  71. package/dist/chunk-2UQOHYE2.js.map +0 -1
  72. package/dist/chunk-3E5F2XMR.js.map +0 -1
  73. package/dist/chunk-4X3JQXNM.js.map +0 -1
  74. package/dist/chunk-5DKBFXPY.js.map +0 -1
  75. package/dist/chunk-5J4HKRJF.js.map +0 -1
  76. package/dist/chunk-5UYI3RJB.js.map +0 -1
  77. package/dist/chunk-66QO7XFB.js.map +0 -1
  78. package/dist/chunk-AMIR72JP.js +0 -380
  79. package/dist/chunk-AMIR72JP.js.map +0 -1
  80. package/dist/chunk-DBS6RIFL.js.map +0 -1
  81. package/dist/chunk-DNJKBAI7.js +0 -1
  82. package/dist/chunk-DNJKBAI7.js.map +0 -1
  83. package/dist/chunk-ET53IIEP.js +0 -1
  84. package/dist/chunk-ET53IIEP.js.map +0 -1
  85. package/dist/chunk-FVTQSNR7.js.map +0 -1
  86. package/dist/chunk-GZY66SDN.js.map +0 -1
  87. package/dist/chunk-ILWDXLUK.js.map +0 -1
  88. package/dist/chunk-JHZWYRSW.js.map +0 -1
  89. package/dist/chunk-JI77MGAK.js.map +0 -1
  90. package/dist/chunk-JOQYPRDZ.js.map +0 -1
  91. package/dist/chunk-OTKVFVL6.js.map +0 -1
  92. package/dist/chunk-PGGGKYWG.js +0 -1
  93. package/dist/chunk-PGGGKYWG.js.map +0 -1
  94. package/dist/chunk-Q7LROV2H.js.map +0 -1
  95. package/dist/chunk-QE7TWGVT.js.map +0 -1
  96. package/dist/chunk-QUUPYOSP.js.map +0 -1
  97. package/dist/chunk-R2GC6RLD.js +0 -344
  98. package/dist/chunk-R2GC6RLD.js.map +0 -1
  99. package/dist/chunk-R2YZTCLO.js.map +0 -1
  100. package/dist/chunk-S7A5D7ZJ.js +0 -174
  101. package/dist/chunk-S7A5D7ZJ.js.map +0 -1
  102. package/dist/chunk-TUWMK62B.js.map +0 -1
  103. package/dist/chunk-V543AI2F.js +0 -1
  104. package/dist/chunk-V543AI2F.js.map +0 -1
  105. package/dist/chunk-VR7UPJ7C.js.map +0 -1
  106. package/dist/chunk-VWCJ2WXC.js.map +0 -1
  107. package/dist/chunk-VYFRI7R6.js.map +0 -1
  108. package/dist/chunk-XNLB57UD.js.map +0 -1
  109. package/dist/chunk-ZLQKNOZQ.js +0 -1
  110. package/dist/chunk-ZLQKNOZQ.js.map +0 -1
  111. package/dist/doc/index.js.map +0 -1
  112. package/dist/generate/index.js.map +0 -1
  113. package/dist/icons/index.js.map +0 -1
  114. package/dist/icons/inlineIconMarker.js.map +0 -1
  115. package/dist/imageEdit/index.js.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/jsonForm/index.js.map +0 -1
  118. package/dist/markdown/index.js.map +0 -1
  119. package/dist/narration/index.js.map +0 -1
  120. package/dist/random/index.js.map +0 -1
  121. package/dist/recommend/index.js.map +0 -1
  122. package/dist/schemas/index.js.map +0 -1
  123. package/dist/spatial/index.js.map +0 -1
  124. package/dist/storage/index.js.map +0 -1
  125. package/dist/timing/index.js.map +0 -1
  126. package/dist/transform/index.js.map +0 -1
  127. package/dist/versions/index.js.map +0 -1
  128. package/src/__tests__/animationUtils.test.ts +0 -117
  129. package/src/__tests__/annotationCoercion.test.ts +0 -243
  130. package/src/__tests__/applyNarrationTiming.test.ts +0 -190
  131. package/src/__tests__/applyRenderStyle.test.ts +0 -146
  132. package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
  133. package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
  134. package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
  135. package/src/__tests__/asciiDiagramParse.test.ts +0 -233
  136. package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
  137. package/src/__tests__/asciiDiagramRender.test.ts +0 -162
  138. package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
  139. package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
  140. package/src/__tests__/asciiTimelineParse.test.ts +0 -205
  141. package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
  142. package/src/__tests__/asciiTimelineRender.test.ts +0 -376
  143. package/src/__tests__/atmosphereLayers.test.ts +0 -108
  144. package/src/__tests__/attrTokens.test.ts +0 -167
  145. package/src/__tests__/colorUtils.test.ts +0 -112
  146. package/src/__tests__/contentContainer.test.ts +0 -325
  147. package/src/__tests__/contentExtractor.test.ts +0 -243
  148. package/src/__tests__/coverBlock.test.ts +0 -310
  149. package/src/__tests__/customTemplateSample.test.ts +0 -144
  150. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
  151. package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
  152. package/src/__tests__/dataTable.test.ts +0 -145
  153. package/src/__tests__/diagramBlock.test.ts +0 -122
  154. package/src/__tests__/diagramLayout.test.ts +0 -134
  155. package/src/__tests__/diagramText.test.ts +0 -26
  156. package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
  157. package/src/__tests__/drawing.test.ts +0 -109
  158. package/src/__tests__/drawingBlock.test.ts +0 -124
  159. package/src/__tests__/drawingLayout.test.ts +0 -171
  160. package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
  161. package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
  162. package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
  163. package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
  164. package/src/__tests__/geohash.test.ts +0 -110
  165. package/src/__tests__/getLayers.test.ts +0 -243
  166. package/src/__tests__/getLayersFallback.test.ts +0 -103
  167. package/src/__tests__/haversine.test.ts +0 -63
  168. package/src/__tests__/iconResolve.test.ts +0 -122
  169. package/src/__tests__/imageEditExportSvg.test.ts +0 -70
  170. package/src/__tests__/imageEditState.test.ts +0 -74
  171. package/src/__tests__/imageEditVersions.test.ts +0 -243
  172. package/src/__tests__/inferDocumentTitle.test.ts +0 -50
  173. package/src/__tests__/inlineIconMarker.test.ts +0 -36
  174. package/src/__tests__/inputDescriptors.test.ts +0 -162
  175. package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
  176. package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
  177. package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
  178. package/src/__tests__/jsonForm.pointer.test.ts +0 -149
  179. package/src/__tests__/jsonForm.tokens.test.ts +0 -84
  180. package/src/__tests__/layoutBlock.test.ts +0 -83
  181. package/src/__tests__/layoutLayout.test.ts +0 -169
  182. package/src/__tests__/localForageAdapter.test.ts +0 -155
  183. package/src/__tests__/majorApiTypes.test.ts +0 -18
  184. package/src/__tests__/markdown.test.ts +0 -1009
  185. package/src/__tests__/markdownIcons.test.ts +0 -104
  186. package/src/__tests__/markdownSanitize.test.ts +0 -81
  187. package/src/__tests__/markdownToDoc.test.ts +0 -957
  188. package/src/__tests__/matchFontFamily.test.ts +0 -114
  189. package/src/__tests__/materializeBlockLayers.test.ts +0 -167
  190. package/src/__tests__/materializePageSections.test.ts +0 -404
  191. package/src/__tests__/materializeTestUtils.ts +0 -17
  192. package/src/__tests__/mediaAnnotations.test.ts +0 -91
  193. package/src/__tests__/mediaSchedule.test.ts +0 -118
  194. package/src/__tests__/narrationAlign.test.ts +0 -150
  195. package/src/__tests__/narrationFeatures.test.ts +0 -71
  196. package/src/__tests__/narrationNuclei.test.ts +0 -45
  197. package/src/__tests__/narrationPacing.test.ts +0 -189
  198. package/src/__tests__/narrationScript.test.ts +0 -149
  199. package/src/__tests__/narrationSessionRepro.test.ts +0 -62
  200. package/src/__tests__/narrationSidecar.test.ts +0 -88
  201. package/src/__tests__/narrationSyllables.test.ts +0 -65
  202. package/src/__tests__/narrationTestSignals.ts +0 -167
  203. package/src/__tests__/narrationVad.test.ts +0 -66
  204. package/src/__tests__/pageStyle.test.ts +0 -258
  205. package/src/__tests__/pandocAttrParse.test.ts +0 -187
  206. package/src/__tests__/recommendTemplates.test.ts +0 -183
  207. package/src/__tests__/resolveDocTheme.test.ts +0 -69
  208. package/src/__tests__/rootExports.test.ts +0 -61
  209. package/src/__tests__/scopedContentContainer.test.ts +0 -109
  210. package/src/__tests__/seededRandom.test.ts +0 -142
  211. package/src/__tests__/shapeGeometry.test.ts +0 -138
  212. package/src/__tests__/shapeVocabulary.test.ts +0 -133
  213. package/src/__tests__/storage.test.ts +0 -60
  214. package/src/__tests__/structuredData.test.ts +0 -249
  215. package/src/__tests__/surface.test.ts +0 -68
  216. package/src/__tests__/templateAnnotationParse.test.ts +0 -173
  217. package/src/__tests__/templateInputs.test.ts +0 -69
  218. package/src/__tests__/templateMetadata.test.ts +0 -32
  219. package/src/__tests__/templates.test.ts +0 -710
  220. package/src/__tests__/themeCompile.test.ts +0 -225
  221. package/src/__tests__/themeValidator.test.ts +0 -131
  222. package/src/__tests__/timing.test.ts +0 -167
  223. package/src/__tests__/transformProvenance.test.ts +0 -160
  224. package/src/__tests__/transformV2.test.ts +0 -163
  225. package/src/__tests__/transitionNormalize.test.ts +0 -61
  226. package/src/__tests__/treeviewBattle.test.ts +0 -76
  227. package/src/__tests__/treeviewDetect.test.ts +0 -168
  228. package/src/__tests__/treeviewParse.test.ts +0 -118
  229. package/src/__tests__/treeviewPipeline.test.ts +0 -183
  230. package/src/__tests__/treeviewRender.test.ts +0 -91
  231. package/src/__tests__/validateDoc.test.ts +0 -260
  232. package/src/__tests__/versions.test.ts +0 -459
  233. package/src/doc/annotationBlocks.ts +0 -117
  234. package/src/doc/applyNarrationTiming.ts +0 -244
  235. package/src/doc/asciiDiagram/chars.ts +0 -210
  236. package/src/doc/asciiDiagram/detect.ts +0 -175
  237. package/src/doc/asciiDiagram/index.ts +0 -38
  238. package/src/doc/asciiDiagram/mapping.ts +0 -225
  239. package/src/doc/asciiDiagram/parse.ts +0 -1095
  240. package/src/doc/asciiDiagram/render.ts +0 -963
  241. package/src/doc/asciiDiagram/repair.ts +0 -400
  242. package/src/doc/asciiDiagram/types.ts +0 -65
  243. package/src/doc/asciiTimeline/detect.ts +0 -138
  244. package/src/doc/asciiTimeline/index.ts +0 -26
  245. package/src/doc/asciiTimeline/mapping.ts +0 -43
  246. package/src/doc/asciiTimeline/parse.ts +0 -870
  247. package/src/doc/asciiTimeline/render.ts +0 -427
  248. package/src/doc/asciiTimeline/types.ts +0 -73
  249. package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
  250. package/src/doc/audioMapping.ts +0 -442
  251. package/src/doc/customTemplatesFrontmatter.ts +0 -273
  252. package/src/doc/customThemesFrontmatter.ts +0 -95
  253. package/src/doc/docToMarkdown.ts +0 -284
  254. package/src/doc/index.ts +0 -161
  255. package/src/doc/markdownToDoc.ts +0 -1054
  256. package/src/doc/materializeBlockLayers.ts +0 -465
  257. package/src/doc/mediaAnnotations.ts +0 -120
  258. package/src/doc/page/PageSection.ts +0 -174
  259. package/src/doc/page/materializePageSection.ts +0 -616
  260. package/src/doc/page/resolvePageBlock.ts +0 -108
  261. package/src/doc/page/sectionExtractors.ts +0 -466
  262. package/src/doc/pageCss.ts +0 -628
  263. package/src/doc/resolveDocTheme.ts +0 -56
  264. package/src/doc/standaloneAnnotation.ts +0 -58
  265. package/src/doc/structuredData.ts +0 -301
  266. package/src/doc/templateInputs.ts +0 -424
  267. package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
  268. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
  269. package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
  270. package/src/doc/templates/accentImage.ts +0 -362
  271. package/src/doc/templates/captionUtils.ts +0 -56
  272. package/src/doc/templates/comparisonBar.ts +0 -173
  273. package/src/doc/templates/coverBlock.ts +0 -255
  274. package/src/doc/templates/customTemplate.ts +0 -51
  275. package/src/doc/templates/dataTable.ts +0 -102
  276. package/src/doc/templates/dateEvent.ts +0 -147
  277. package/src/doc/templates/definitionCard.ts +0 -140
  278. package/src/doc/templates/diagramBlock.ts +0 -403
  279. package/src/doc/templates/diagramLayout.ts +0 -159
  280. package/src/doc/templates/drawingBlock.ts +0 -325
  281. package/src/doc/templates/drawingLayout.ts +0 -539
  282. package/src/doc/templates/factCard.ts +0 -146
  283. package/src/doc/templates/fallbackBlock.ts +0 -123
  284. package/src/doc/templates/featureBlock.ts +0 -209
  285. package/src/doc/templates/fullBleedQuote.ts +0 -83
  286. package/src/doc/templates/imageWithCaption.ts +0 -186
  287. package/src/doc/templates/index.ts +0 -642
  288. package/src/doc/templates/inputDescriptors.ts +0 -451
  289. package/src/doc/templates/layoutBlock.ts +0 -43
  290. package/src/doc/templates/layoutLayout.ts +0 -243
  291. package/src/doc/templates/listBlock.ts +0 -207
  292. package/src/doc/templates/mapBlock.ts +0 -138
  293. package/src/doc/templates/metadata.ts +0 -130
  294. package/src/doc/templates/persistentLayers.ts +0 -526
  295. package/src/doc/templates/photoGrid.ts +0 -190
  296. package/src/doc/templates/pullQuote.ts +0 -141
  297. package/src/doc/templates/quoteBlock.ts +0 -141
  298. package/src/doc/templates/registry.ts +0 -88
  299. package/src/doc/templates/sectionHeader.ts +0 -120
  300. package/src/doc/templates/statHighlight.ts +0 -146
  301. package/src/doc/templates/templateNames.ts +0 -22
  302. package/src/doc/templates/timelineBlock.ts +0 -613
  303. package/src/doc/templates/titleBlock.ts +0 -150
  304. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
  305. package/src/doc/templates/tokens/resolveTokens.ts +0 -453
  306. package/src/doc/templates/treeBlock.ts +0 -131
  307. package/src/doc/templates/twoColumn.ts +0 -263
  308. package/src/doc/templates/videoPullQuote.ts +0 -142
  309. package/src/doc/templates/videoWithCaption.ts +0 -135
  310. package/src/doc/treeview/chars.ts +0 -72
  311. package/src/doc/treeview/detect.ts +0 -145
  312. package/src/doc/treeview/index.ts +0 -30
  313. package/src/doc/treeview/mapping.ts +0 -95
  314. package/src/doc/treeview/parse.ts +0 -201
  315. package/src/doc/treeview/render.ts +0 -41
  316. package/src/doc/treeview/types.ts +0 -43
  317. package/src/doc/utils/animationUtils.ts +0 -399
  318. package/src/doc/utils/applyRenderStyle.ts +0 -106
  319. package/src/doc/utils/diagramText.ts +0 -78
  320. package/src/doc/utils/imageTreatment.ts +0 -70
  321. package/src/doc/utils/nearest.ts +0 -59
  322. package/src/doc/utils/shapeGeometry.ts +0 -614
  323. package/src/doc/utils/themeUtils.ts +0 -243
  324. package/src/doc/validate.ts +0 -575
  325. package/src/generate/contentExtractor.ts +0 -921
  326. package/src/generate/index.ts +0 -18
  327. package/src/generate/templateMapper.ts +0 -177
  328. package/src/icons/iconData.ts +0 -31
  329. package/src/icons/index.ts +0 -26
  330. package/src/icons/inlineIconMarker.ts +0 -73
  331. package/src/icons/resolve.ts +0 -139
  332. package/src/imageEdit/ImageEditVersionManager.ts +0 -73
  333. package/src/imageEdit/export.ts +0 -410
  334. package/src/imageEdit/index.ts +0 -72
  335. package/src/imageEdit/persistence.ts +0 -113
  336. package/src/imageEdit/state.ts +0 -112
  337. package/src/imageEdit/versionPaths.ts +0 -44
  338. package/src/imageEdit/versions.ts +0 -152
  339. package/src/index.ts +0 -15
  340. package/src/internal/immutable.ts +0 -58
  341. package/src/jsonForm/chooseControl.ts +0 -88
  342. package/src/jsonForm/evaluateWhen.ts +0 -59
  343. package/src/jsonForm/index.ts +0 -32
  344. package/src/jsonForm/inferSchema.ts +0 -25
  345. package/src/jsonForm/pointer.ts +0 -154
  346. package/src/jsonForm/tokens.ts +0 -78
  347. package/src/jsonForm/types.ts +0 -167
  348. package/src/markdown/annotationCoercion.ts +0 -295
  349. package/src/markdown/attrTokens.ts +0 -243
  350. package/src/markdown/convert.ts +0 -1353
  351. package/src/markdown/htmlParse.ts +0 -212
  352. package/src/markdown/index.ts +0 -152
  353. package/src/markdown/parse.ts +0 -103
  354. package/src/markdown/sanitize.ts +0 -318
  355. package/src/markdown/stringify.ts +0 -207
  356. package/src/markdown/types.ts +0 -710
  357. package/src/markdown/utils.ts +0 -459
  358. package/src/narration/align.ts +0 -514
  359. package/src/narration/features.ts +0 -231
  360. package/src/narration/index.ts +0 -86
  361. package/src/narration/nuclei.ts +0 -118
  362. package/src/narration/pacing.ts +0 -211
  363. package/src/narration/script.ts +0 -239
  364. package/src/narration/session.ts +0 -100
  365. package/src/narration/sidecar.ts +0 -187
  366. package/src/narration/syllables.ts +0 -85
  367. package/src/narration/trace.ts +0 -50
  368. package/src/narration/types.ts +0 -299
  369. package/src/narration/vad.ts +0 -131
  370. package/src/ngeohash.d.ts +0 -11
  371. package/src/random/SeededRandom.ts +0 -127
  372. package/src/random/index.ts +0 -1
  373. package/src/recommend/index.ts +0 -16
  374. package/src/recommend/numberHighlight.ts +0 -25
  375. package/src/recommend/templates.ts +0 -393
  376. package/src/schemas/BlockTemplates.ts +0 -1046
  377. package/src/schemas/CustomTemplates.ts +0 -126
  378. package/src/schemas/Doc.ts +0 -1073
  379. package/src/schemas/ImageEditDoc.ts +0 -102
  380. package/src/schemas/LayoutStrategy.ts +0 -178
  381. package/src/schemas/Media.ts +0 -179
  382. package/src/schemas/MediaProvider.ts +0 -70
  383. package/src/schemas/PageStyle.ts +0 -213
  384. package/src/schemas/Theme.ts +0 -413
  385. package/src/schemas/Transitions.ts +0 -224
  386. package/src/schemas/Types.ts +0 -15
  387. package/src/schemas/Viewport.ts +0 -91
  388. package/src/schemas/colorUtils.ts +0 -219
  389. package/src/schemas/fontStacks.ts +0 -339
  390. package/src/schemas/index.ts +0 -31
  391. package/src/schemas/pageStyleDefaults.ts +0 -204
  392. package/src/schemas/themeCompile.ts +0 -244
  393. package/src/schemas/themeConstants.ts +0 -2
  394. package/src/schemas/themeLibrary.ts +0 -60
  395. package/src/schemas/themeValidator.ts +0 -609
  396. package/src/schemas/themes/bold.json +0 -77
  397. package/src/schemas/themes/cinematic.json +0 -143
  398. package/src/schemas/themes/documentary.json +0 -125
  399. package/src/schemas/themes/gezellig.json +0 -123
  400. package/src/schemas/themes/index.ts +0 -53
  401. package/src/schemas/themes/magazine.json +0 -126
  402. package/src/schemas/themes/minimalist.json +0 -74
  403. package/src/schemas/themes/morning-light.json +0 -117
  404. package/src/schemas/themes/standard-dark.json +0 -109
  405. package/src/schemas/themes/standard.json +0 -98
  406. package/src/schemas/themes/tech-dark.json +0 -143
  407. package/src/schemas/themes/warm-earth.json +0 -74
  408. package/src/spatial/Geohash.ts +0 -196
  409. package/src/spatial/Haversine.ts +0 -59
  410. package/src/spatial/index.ts +0 -2
  411. package/src/storage/ContentContainer.ts +0 -220
  412. package/src/storage/LocalForageAdapter.ts +0 -103
  413. package/src/storage/LocalStorageAdapter.ts +0 -57
  414. package/src/storage/MediaProviderFromContainer.ts +0 -92
  415. package/src/storage/MemoryStorageAdapter.ts +0 -37
  416. package/src/storage/ScopedContentContainer.ts +0 -143
  417. package/src/storage/Storage.ts +0 -28
  418. package/src/storage/index.ts +0 -9
  419. package/src/timing/index.ts +0 -17
  420. package/src/timing/narrationTiming.ts +0 -220
  421. package/src/timing/readingTime.ts +0 -94
  422. package/src/transform/applyTransform.ts +0 -122
  423. package/src/transform/blockAnalyzer.ts +0 -181
  424. package/src/transform/index.ts +0 -23
  425. package/src/transform/registry.ts +0 -217
  426. package/src/transform/styles/dataDriven.ts +0 -18
  427. package/src/transform/styles/documentary.ts +0 -18
  428. package/src/transform/styles/index.ts +0 -5
  429. package/src/transform/styles/magazine.ts +0 -19
  430. package/src/transform/styles/minimal.ts +0 -18
  431. package/src/transform/styles/narrative.ts +0 -19
  432. package/src/transform/templateSelector.ts +0 -389
  433. package/src/transform/timingAllocator.ts +0 -257
  434. package/src/transform/types.ts +0 -158
  435. package/src/versions/DocumentVersionManager.ts +0 -70
  436. package/src/versions/gitignore.ts +0 -34
  437. package/src/versions/index.ts +0 -56
  438. package/src/versions/operations.ts +0 -144
  439. package/src/versions/paths.ts +0 -51
  440. package/src/versions/snapshotStore.ts +0 -202
  441. package/src/versions/timestamp.ts +0 -48
  442. package/src/versions/types.ts +0 -93
@@ -1,147 +0,0 @@
1
- /**
2
- * Date Event Template
3
- *
4
- * Timeline-style slide with prominent date and description.
5
- * Supports different moods: neutral, somber, celebratory.
6
- * Adapts font sizes and positioning for different viewports.
7
- *
8
- * Supports optional accent images that appear as tasteful side/bottom strips.
9
- *
10
- * This is shared code used by both site and efb-app doc renderers.
11
- */
12
-
13
- import type { Layer } from '../../schemas/Doc.js';
14
- import type { DateEventInput, TemplateContext } from '../../schemas/BlockTemplates.js';
15
- import {
16
- getThemeFont,
17
- shouldUseShadow,
18
- themedFontSize,
19
- themedSurfaceGradient,
20
- themedImageTreatment,
21
- } from '../utils/themeUtils.js';
22
- import { oklchDarken, relativeLuminance } from '../../schemas/colorUtils.js';
23
- import { createAccentLayers, getAccentLayout, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
24
-
25
- /**
26
- * Mood accents tint the hero date, not the surface — the surface always
27
- * comes from the theme. (Hard-coded dark mood panels used to turn light
28
- * and warm themes into a cold navy slide.)
29
- */
30
- const MOOD_ACCENTS = {
31
- neutral: '#63b3ed',
32
- somber: '#e53e3e',
33
- celebratory: '#68d391',
34
- };
35
-
36
- export function dateEvent(input: DateEventInput, context: TemplateContext): Layer[] {
37
- const { date, description, footer, mood = 'neutral', accentImage } = input;
38
- const { theme } = context;
39
- // Deepen the mood accent on light surfaces so the hero date keeps contrast.
40
- const moodAccent = MOOD_ACCENTS[mood];
41
- const dateColor =
42
- relativeLuminance(theme.colors.background) > 0.5 ? oklchDarken(moodAccent, 0.25) : moodAccent;
43
-
44
- // Get layout adjustments if accent image is present
45
- const accentLayout = accentImage ? getAccentLayout(accentImage.position) : DEFAULT_LAYOUT;
46
-
47
- // Scale font sizes — date is the hero element
48
- const dateFontSize = themedFontSize(96, context, true);
49
- const descFontSize = themedFontSize(30, context, false);
50
- const footerFontSize = themedFontSize(26, context, false);
51
-
52
- const layers: Layer[] = [
53
- // Background — theme surface gradient (diagonal to differentiate
54
- // from other text templates)
55
- {
56
- type: 'shape',
57
- id: 'bg',
58
- content: {
59
- shape: 'rect',
60
- fill: themedSurfaceGradient(context, 135),
61
- },
62
- position: { x: 0, y: 0, width: '100%', height: '100%' },
63
- },
64
- ];
65
-
66
- // Add accent image layers (behind text, after background)
67
- if (accentImage) {
68
- layers.push(
69
- ...createAccentLayers(
70
- accentImage,
71
- input.id,
72
- themedImageTreatment(context, input.imageTreatment),
73
- ),
74
- );
75
- }
76
-
77
- // Date — hero element, much larger
78
- layers.push({
79
- type: 'text',
80
- id: 'date',
81
- content: {
82
- text: date,
83
- style: {
84
- fontSize: dateFontSize,
85
- fontFamily: getThemeFont(context, 'title'),
86
- fontWeight: 'bold',
87
- color: dateColor,
88
- shadow: shouldUseShadow(context),
89
- },
90
- },
91
- position: {
92
- x: accentLayout.textCenterX,
93
- y: adjustY('35%', accentLayout),
94
- anchor: 'center',
95
- },
96
- animation: { type: 'fadeIn', duration: 1.5 },
97
- });
98
-
99
- // Description - constrained width for proper text wrapping
100
- layers.push({
101
- type: 'text',
102
- id: 'description',
103
- content: {
104
- text: description,
105
- style: {
106
- fontSize: descFontSize,
107
- fontFamily: getThemeFont(context, 'body'),
108
- color: theme.colors.text,
109
- textAlign: 'center',
110
- lineHeight: 1.6,
111
- shadow: shouldUseShadow(context),
112
- },
113
- },
114
- position: {
115
- x: accentLayout.textCenterX,
116
- y: adjustY('58%', accentLayout),
117
- width: accentLayout.textWidth,
118
- anchor: 'center',
119
- },
120
- animation: { type: 'fadeIn', duration: 2, delay: 1 },
121
- });
122
-
123
- // Add footer if provided
124
- if (footer) {
125
- layers.push({
126
- type: 'text',
127
- id: 'footer',
128
- content: {
129
- text: footer,
130
- style: {
131
- fontSize: footerFontSize,
132
- fontFamily: getThemeFont(context, 'body'),
133
- color: theme.colors.textMuted,
134
- shadow: shouldUseShadow(context),
135
- },
136
- },
137
- position: {
138
- x: accentLayout.textCenterX,
139
- y: adjustY('72%', accentLayout),
140
- anchor: 'center',
141
- },
142
- animation: { type: 'fadeIn', duration: 1, delay: 3 },
143
- });
144
- }
145
-
146
- return layers;
147
- }
@@ -1,140 +0,0 @@
1
- /**
2
- * Definition Card Template
3
- *
4
- * Dictionary-style slide with a large term and its definition.
5
- * Good for explaining local words, place names, or cultural concepts.
6
- * Supports optional accent images.
7
- *
8
- * This is shared code used by both site and efb-app doc renderers.
9
- */
10
-
11
- import type { Layer } from '../../schemas/Doc.js';
12
- import type { DefinitionCardInput, TemplateContext } from '../../schemas/BlockTemplates.js';
13
- import {
14
- resolveColorScheme,
15
- getThemeFont,
16
- shouldUseShadow,
17
- themedEntrance,
18
- themedFontSize,
19
- themedSurfaceGradient,
20
- themedImageTreatment,
21
- } from '../utils/themeUtils.js';
22
- import { createAccentLayers, getAccentLayout, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
23
- import { createBackgroundLayer } from './captionUtils.js';
24
-
25
- export function definitionCard(input: DefinitionCardInput, context: TemplateContext): Layer[] {
26
- const { term, definition, origin, colorScheme = 'blue', accentImage } = input;
27
- const { theme } = context;
28
- const colors = resolveColorScheme(context, colorScheme);
29
-
30
- // Get layout adjustments if accent image is present
31
- const accentLayout = accentImage ? getAccentLayout(accentImage.position) : DEFAULT_LAYOUT;
32
-
33
- const termFontSize = themedFontSize(72, context, true);
34
- const defFontSize = themedFontSize(32, context, false);
35
- const originFontSize = themedFontSize(22, context, false);
36
-
37
- const layers: Layer[] = [createBackgroundLayer('bg', themedSurfaceGradient(context, 145))];
38
-
39
- // Add accent image layers
40
- if (accentImage) {
41
- layers.push(
42
- ...createAccentLayers(
43
- accentImage,
44
- input.id,
45
- themedImageTreatment(context, input.imageTreatment),
46
- ),
47
- );
48
- }
49
-
50
- // Term — large, accent-colored
51
- layers.push({
52
- type: 'text',
53
- id: 'term',
54
- content: {
55
- text: term,
56
- style: {
57
- fontSize: termFontSize,
58
- fontFamily: getThemeFont(context, 'title'),
59
- fontWeight: 'bold',
60
- color: colors.text,
61
- textAlign: 'center',
62
- shadow: shouldUseShadow(context),
63
- },
64
- },
65
- position: {
66
- x: accentLayout.textCenterX,
67
- y: adjustY('30%', accentLayout),
68
- anchor: 'center',
69
- },
70
- animation: themedEntrance(context, 'text', { type: 'fadeIn', duration: 1.5 }),
71
- });
72
-
73
- // Horizontal separator line
74
- layers.push({
75
- type: 'shape',
76
- id: 'separator',
77
- content: {
78
- shape: 'rect',
79
- fill: `${colors.text}33`, // accent color at 20% opacity
80
- },
81
- position: {
82
- x: accentLayout.textCenterX,
83
- y: adjustY('42%', accentLayout),
84
- width: '30%',
85
- height: '2px',
86
- anchor: 'center',
87
- },
88
- });
89
-
90
- // Definition text
91
- layers.push({
92
- type: 'text',
93
- id: 'definition',
94
- content: {
95
- text: definition,
96
- style: {
97
- fontSize: defFontSize,
98
- fontFamily: getThemeFont(context, 'body'),
99
- color: theme.colors.text,
100
- textAlign: 'center',
101
- lineHeight: 1.6,
102
- maxLines: 4,
103
- shadow: shouldUseShadow(context),
104
- },
105
- },
106
- position: {
107
- x: accentLayout.textCenterX,
108
- y: adjustY('55%', accentLayout),
109
- width: accentLayout.textWidth,
110
- anchor: 'center',
111
- },
112
- animation: themedEntrance(context, 'text', { type: 'fadeIn', duration: 1, delay: 0.8 }),
113
- });
114
-
115
- // Origin if provided
116
- if (origin) {
117
- layers.push({
118
- type: 'text',
119
- id: 'origin',
120
- content: {
121
- text: origin,
122
- style: {
123
- fontSize: originFontSize,
124
- fontFamily: getThemeFont(context, 'body'),
125
- color: theme.colors.textMuted,
126
- textAlign: 'center',
127
- shadow: shouldUseShadow(context),
128
- },
129
- },
130
- position: {
131
- x: accentLayout.textCenterX,
132
- y: adjustY('70%', accentLayout),
133
- anchor: 'center',
134
- },
135
- animation: { type: 'fadeIn', duration: 0.8, delay: 1.5 },
136
- });
137
- }
138
-
139
- return layers;
140
- }
@@ -1,403 +0,0 @@
1
- /**
2
- * Diagram block template.
3
- *
4
- * Renders a node-and-edge diagram from one of two data sources:
5
- * 1. Child headings (`context.children`) — the legacy authored form; each
6
- * child becomes a node positioned by `x`/`y` and connected by
7
- * `connectsTo` (see `diagramLayout.ts` for auto-placement rules).
8
- * 2. `input.nodes`/`input.edges` (usually via `templateData`) — the
9
- * data-driven form derived from an ASCII-art diagram fence. Nodes may
10
- * carry per-node sizes and a `container` reference; containers draw
11
- * behind their children as translucent grouping cards.
12
- *
13
- * Layout coordinates are author-defined units. The template computes a
14
- * bounding box of all nodes and scales it to fit the block's viewport
15
- * with padding, so users don't have to think about absolute pixel ranges.
16
- */
17
-
18
- import type { Layer, ShapeLayer, TextLayer, PathLayer, MarkerStyle } from '../../schemas/Doc.js';
19
- import type {
20
- DiagramBlockInput,
21
- DiagramEdgeAnchor,
22
- DiagramTemplateEdge,
23
- DiagramTemplateNode,
24
- TemplateContext,
25
- } from '../../schemas/BlockTemplates.js';
26
- import { resolveColorScheme, getThemeFont, themedFontSize } from '../utils/themeUtils.js';
27
- import { DIAGRAM_LABEL_LINE_HEIGHT, fitDiagramLabel } from '../utils/diagramText.js';
28
- import {
29
- anchorPoint,
30
- connectorPath,
31
- lineStyleDasharray,
32
- snapEndpoints,
33
- type ConnectorRouting,
34
- } from '../utils/shapeGeometry.js';
35
- import { computeDiagramLayout } from './diagramLayout.js';
36
-
37
- const NODE_WIDTH = 180;
38
- const NODE_HEIGHT = 64;
39
- const PADDING = 80;
40
-
41
- interface ResolvedDiagramNode {
42
- id: string;
43
- label: string;
44
- x: number;
45
- y: number;
46
- w: number;
47
- h: number;
48
- /** Containment depth (0 = top level); containers draw depth-ascending. */
49
- depth: number;
50
- isContainer: boolean;
51
- }
52
-
53
- interface ResolvedDiagramEdge {
54
- id: string;
55
- source: string;
56
- target: string;
57
- label?: string;
58
- directed: boolean;
59
- sourceAnchor?: DiagramEdgeAnchor;
60
- targetAnchor?: DiagramEdgeAnchor;
61
- routing?: ConnectorRouting;
62
- }
63
-
64
- interface ResolvedDiagram {
65
- nodes: ResolvedDiagramNode[];
66
- edges: ResolvedDiagramEdge[];
67
- }
68
-
69
- function nodesFromChildren(context: TemplateContext): ResolvedDiagram {
70
- const layout = computeDiagramLayout(context.children ?? []);
71
- return {
72
- nodes: layout.nodes.map((n) => ({
73
- id: n.id,
74
- label: n.label,
75
- x: n.x,
76
- y: n.y,
77
- w: NODE_WIDTH,
78
- h: NODE_HEIGHT,
79
- depth: 0,
80
- isContainer: false,
81
- })),
82
- edges: layout.edges.map((e) => ({
83
- id: e.id,
84
- source: e.source,
85
- target: e.target,
86
- ...(e.type ? { label: e.type } : {}),
87
- directed: true,
88
- })),
89
- };
90
- }
91
-
92
- /**
93
- * Defensive resolution of `templateData`-supplied nodes/edges: the data is
94
- * untyped at runtime (it can come from a hand-written `json data` fence),
95
- * so malformed entries are dropped rather than crashing the template.
96
- */
97
- function nodesFromTemplateData(input: DiagramBlockInput): ResolvedDiagram {
98
- const rawNodes = Array.isArray(input.nodes) ? input.nodes : [];
99
- const valid = rawNodes.filter(
100
- (n): n is DiagramTemplateNode =>
101
- typeof n === 'object' &&
102
- n !== null &&
103
- typeof n.id === 'string' &&
104
- n.id.length > 0 &&
105
- typeof n.label === 'string' &&
106
- typeof n.x === 'number' &&
107
- Number.isFinite(n.x) &&
108
- typeof n.y === 'number' &&
109
- Number.isFinite(n.y),
110
- );
111
- const ids = new Set(valid.map((n) => n.id));
112
- const containerIds = new Set(
113
- valid.map((n) => n.container).filter((c): c is string => typeof c === 'string' && ids.has(c)),
114
- );
115
- const depthOf = (node: DiagramTemplateNode): number => {
116
- let depth = 0;
117
- let current: DiagramTemplateNode | undefined = node;
118
- const seen = new Set<string>();
119
- while (current?.container && ids.has(current.container) && !seen.has(current.id)) {
120
- seen.add(current.id);
121
- depth++;
122
- current = valid.find((n) => n.id === current?.container);
123
- }
124
- return depth;
125
- };
126
- const nodes: ResolvedDiagramNode[] = valid.map((n) => ({
127
- id: n.id,
128
- label: n.label,
129
- x: n.x,
130
- y: n.y,
131
- w: typeof n.w === 'number' && Number.isFinite(n.w) && n.w > 0 ? n.w : NODE_WIDTH,
132
- h: typeof n.h === 'number' && Number.isFinite(n.h) && n.h > 0 ? n.h : NODE_HEIGHT,
133
- depth: depthOf(n),
134
- isContainer: containerIds.has(n.id),
135
- }));
136
-
137
- const rawEdges = Array.isArray(input.edges) ? input.edges : [];
138
- const edges: ResolvedDiagramEdge[] = rawEdges
139
- .filter(
140
- (e): e is DiagramTemplateEdge =>
141
- typeof e === 'object' &&
142
- e !== null &&
143
- typeof e.source === 'string' &&
144
- typeof e.target === 'string' &&
145
- ids.has(e.source) &&
146
- ids.has(e.target),
147
- )
148
- .map((e, i) => ({
149
- id: e.label ? `${e.source}->${e.target}:${e.label}` : `${e.source}->${e.target}-${i}`,
150
- source: e.source,
151
- target: e.target,
152
- ...(e.label ? { label: e.label } : {}),
153
- directed: e.directed !== false,
154
- ...(e.sourceAnchor ? { sourceAnchor: e.sourceAnchor } : {}),
155
- ...(e.targetAnchor ? { targetAnchor: e.targetAnchor } : {}),
156
- ...(e.routing ? { routing: e.routing } : {}),
157
- }));
158
- return { nodes, edges };
159
- }
160
-
161
- export function diagramBlock(input: DiagramBlockInput, context: TemplateContext): Layer[] {
162
- const { theme, viewport, children = [] } = context;
163
- const colors = resolveColorScheme(context, input.colorScheme ?? 'blue');
164
-
165
- const resolved =
166
- children.length > 0
167
- ? nodesFromChildren(context)
168
- : input.nodes && input.nodes.length > 0
169
- ? nodesFromTemplateData(input)
170
- : { nodes: [], edges: [] };
171
-
172
- if (resolved.nodes.length === 0) {
173
- // Empty diagram — render a single hint label so the block has visible content.
174
- return [
175
- {
176
- type: 'text',
177
- id: 'diagram-empty',
178
- content: {
179
- text: input.title ?? 'Empty diagram',
180
- style: {
181
- fontSize: themedFontSize(36, context, true),
182
- fontFamily: getThemeFont(context, 'title'),
183
- color: theme.colors.textMuted,
184
- textAlign: 'center',
185
- },
186
- },
187
- position: { x: '50%', y: '50%', anchor: 'center' },
188
- },
189
- ];
190
- }
191
-
192
- // Compute the bounding box of all nodes in author coordinates.
193
- const minX = Math.min(...resolved.nodes.map((n) => n.x));
194
- const maxX = Math.max(...resolved.nodes.map((n) => n.x + n.w));
195
- const minY = Math.min(...resolved.nodes.map((n) => n.y));
196
- const maxY = Math.max(...resolved.nodes.map((n) => n.y + n.h));
197
-
198
- // Available area in viewport pixels (after reserving space for the title, if any).
199
- const titleHeight = input.title ? 120 : 0;
200
- const availW = Math.max(1, viewport.width - PADDING * 2);
201
- const availH = Math.max(1, viewport.height - PADDING * 2 - titleHeight);
202
- const contentW = Math.max(1, maxX - minX);
203
- const contentH = Math.max(1, maxY - minY);
204
-
205
- // Uniform scale so the diagram fits both dimensions. Small diagrams are
206
- // allowed to grow (everything here is vector) up to 1.8× so a three-node
207
- // flow doesn't render as a tiny cluster in an empty canvas; label fonts
208
- // and strokes scale with the nodes, clamped so text never balloons.
209
- const scale = Math.min(availW / contentW, availH / contentH, 1.8);
210
- const fontAdj = Math.min(Math.max(scale, 1), 1.5);
211
- const strokeW = Math.round(2 * fontAdj);
212
-
213
- // Compute viewport-pixel coordinates of each node's top-left corner.
214
- // The title and the scaled diagram are centered together as one group —
215
- // a top-pinned title over a center-floated diagram split the block into
216
- // two stranded pieces.
217
- const scaledW = contentW * scale;
218
- const scaledH = contentH * scale;
219
- const groupTop = Math.max(PADDING / 2, (viewport.height - titleHeight - scaledH) / 2);
220
- const offsetX = PADDING + (availW - scaledW) / 2;
221
- const offsetY = groupTop + titleHeight;
222
- const transform = (n: ResolvedDiagramNode): { x: number; y: number; w: number; h: number } => ({
223
- x: offsetX + (n.x - minX) * scale,
224
- y: offsetY + (n.y - minY) * scale,
225
- w: n.w * scale,
226
- h: n.h * scale,
227
- });
228
-
229
- const layers: Layer[] = [];
230
-
231
- // Optional title above the diagram.
232
- if (input.title) {
233
- layers.push({
234
- type: 'text',
235
- id: 'diagram-title',
236
- content: {
237
- text: input.title,
238
- style: {
239
- fontSize: themedFontSize(40, context, true),
240
- fontFamily: getThemeFont(context, 'title'),
241
- fontWeight: 'bold',
242
- color: theme.colors.text,
243
- textAlign: 'center',
244
- },
245
- },
246
- position: { x: '50%', y: groupTop + titleHeight / 2 - 16, anchor: 'center' },
247
- });
248
- }
249
-
250
- const containers = resolved.nodes
251
- .filter((n) => n.isContainer)
252
- .sort((a, b) => a.depth - b.depth || a.y - b.y || a.x - b.x);
253
- const leaves = resolved.nodes.filter((n) => !n.isContainer);
254
-
255
- // Container cards first — translucent grouping surfaces behind everything.
256
- for (const node of containers) {
257
- const t = transform(node);
258
- const card: ShapeLayer = {
259
- type: 'shape',
260
- id: `node-card-${node.id}`,
261
- content: {
262
- shape: 'rect',
263
- fill: colors.bg ?? theme.colors.backgroundLight,
264
- fillOpacity: 0.25,
265
- stroke: colors.text ?? theme.colors.primary,
266
- strokeWidth: Math.max(1, strokeW - 1),
267
- borderRadius: 10,
268
- },
269
- position: { x: t.x, y: t.y, width: t.w, height: t.h },
270
- };
271
- layers.push(card);
272
- }
273
-
274
- // Position lookup by id for edge routing (containers included — edges may
275
- // attach to them, e.g. a through-border split from a parsed fence).
276
- const positions = new Map<string, { cx: number; cy: number; rx: number; ry: number }>();
277
- for (const node of resolved.nodes) {
278
- const t = transform(node);
279
- positions.set(node.id, { cx: t.x + t.w / 2, cy: t.y + t.h / 2, rx: t.w / 2, ry: t.h / 2 });
280
- }
281
-
282
- // Edge styling (applies to all edges; direction comes per-edge).
283
- const startMarker: MarkerStyle = input.startStyle ?? 'none';
284
- const configuredEnd: MarkerStyle = input.endStyle ?? 'arrow';
285
- const edgeDash = lineStyleDasharray(input.lineStyle);
286
-
287
- // Edges above containers, behind leaf nodes.
288
- for (const edge of resolved.edges) {
289
- const a = positions.get(edge.source);
290
- const b = positions.get(edge.target);
291
- if (!a || !b) continue;
292
- const endMarker: MarkerStyle = edge.directed ? configuredEnd : 'none';
293
- const snapped = snapEndpoints(a, b);
294
- const start = edge.sourceAnchor ? anchorPoint(a, edge.sourceAnchor) : snapped.start;
295
- const end = edge.targetAnchor ? anchorPoint(b, edge.targetAnchor) : snapped.end;
296
- const pathLayer: PathLayer = {
297
- type: 'path',
298
- id: `edge-${edge.id}`,
299
- content: {
300
- d: connectorPath(edge.routing ?? input.edgeStyle ?? 'curved', start, end),
301
- stroke: colors.text ?? theme.colors.primary,
302
- strokeWidth: strokeW,
303
- fill: 'none',
304
- ...(edgeDash ? { dasharray: edgeDash } : {}),
305
- ...(startMarker !== 'none' ? { startMarker } : {}),
306
- ...(endMarker !== 'none' ? { endMarker } : {}),
307
- },
308
- position: { x: 0, y: 0, width: '100%', height: '100%' },
309
- };
310
- layers.push(pathLayer);
311
-
312
- if (edge.label) {
313
- // Edge label, floated just above the edge midpoint so the line never
314
- // strikes through the text.
315
- const mx = (a.cx + b.cx) / 2;
316
- const my = (a.cy + b.cy) / 2;
317
- const labelFontSize = themedFontSize(Math.round(18 * fontAdj), context, false);
318
- const labelLayer: TextLayer = {
319
- type: 'text',
320
- id: `edge-label-${edge.id}`,
321
- content: {
322
- text: edge.label,
323
- style: {
324
- fontSize: labelFontSize,
325
- fontFamily: getThemeFont(context, 'body'),
326
- color: theme.colors.textMuted,
327
- textAlign: 'center',
328
- },
329
- },
330
- position: { x: mx, y: my - labelFontSize * 0.9, anchor: 'center' },
331
- };
332
- layers.push(labelLayer);
333
- }
334
- }
335
-
336
- // Leaf nodes (card + label) on top of edges.
337
- for (const node of leaves) {
338
- const t = transform(node);
339
- const card: ShapeLayer = {
340
- type: 'shape',
341
- id: `node-card-${node.id}`,
342
- content: {
343
- shape: 'rect',
344
- fill: colors.bg ?? theme.colors.backgroundLight,
345
- stroke: colors.text ?? theme.colors.primary,
346
- strokeWidth: strokeW,
347
- borderRadius: input.nodeShape === 'pill' ? t.h / 2 : 10,
348
- },
349
- position: { x: t.x, y: t.y, width: t.w, height: t.h },
350
- };
351
- layers.push(card);
352
-
353
- const preferredFontSize = themedFontSize(Math.round(22 * fontAdj), context, false);
354
- const fit = fitDiagramLabel(node.label, t.w, t.h, preferredFontSize);
355
- const label: TextLayer = {
356
- type: 'text',
357
- id: `node-label-${node.id}`,
358
- content: {
359
- text: node.label,
360
- style: {
361
- fontSize: fit.fontSize,
362
- fontFamily: getThemeFont(context, 'body'),
363
- fontWeight: 'bold',
364
- color: colors.text ?? theme.colors.text,
365
- textAlign: 'center',
366
- lineHeight: DIAGRAM_LABEL_LINE_HEIGHT,
367
- },
368
- },
369
- position: {
370
- x: t.x + t.w / 2,
371
- y: t.y + t.h / 2 + fit.firstLineOffset,
372
- anchor: 'center',
373
- width: fit.textWidth,
374
- },
375
- };
376
- layers.push(label);
377
- }
378
-
379
- // Container titles last — anchored near the container's top edge, above
380
- // any child content that could otherwise overprint them.
381
- for (const node of containers) {
382
- const t = transform(node);
383
- const fontSize = themedFontSize(Math.round(20 * fontAdj), context, false);
384
- const label: TextLayer = {
385
- type: 'text',
386
- id: `node-label-${node.id}`,
387
- content: {
388
- text: node.label.split('\n')[0] ?? '',
389
- style: {
390
- fontSize,
391
- fontFamily: getThemeFont(context, 'body'),
392
- fontWeight: 'bold',
393
- color: theme.colors.textMuted,
394
- textAlign: 'center',
395
- },
396
- },
397
- position: { x: t.x + t.w / 2, y: t.y + fontSize, anchor: 'center', width: t.w },
398
- };
399
- layers.push(label);
400
- }
401
-
402
- return layers;
403
- }