@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,642 +0,0 @@
1
- /**
2
- * Block Template Registry
3
- *
4
- * Central registry of all block templates. Provides functions to:
5
- * - Look up templates by name
6
- * - Expand template blocks into full Layer arrays
7
- * - Convert a template-based doc script into a renderable format
8
- *
9
- * Supports multiple viewport configurations for different aspect ratios.
10
- *
11
- * This is shared code used by both site and efb-app doc renderers.
12
- */
13
-
14
- import type { Block } from '../../schemas/Doc.js';
15
- import type {
16
- TemplateBlock,
17
- DocBlock,
18
- PersistentLayerConfig,
19
- } from '../../schemas/BlockTemplates.js';
20
- import type { Theme } from '../../schemas/Theme.js';
21
- import type { CustomTemplateDefinition } from '../../schemas/CustomTemplates.js';
22
- import { isTemplateBlock } from '../../schemas/BlockTemplates.js';
23
- import { DEFAULT_THEME as defaultTheme } from '../../schemas/themeLibrary.js';
24
- import { expandPersistentLayers } from './persistentLayers.js';
25
- import { resolveBlockTransition } from '../../schemas/Transitions.js';
26
- import { resolveTemplateName } from './templateNames.js';
27
- import { cloneData } from '../../internal/immutable.js';
28
- import type { ViewportConfig } from '../../schemas/Viewport.js';
29
- import { VIEWPORT_PRESETS } from '../../schemas/Viewport.js';
30
- import { buildRegistry, templateRegistry, type RuntimeTemplateRegistry } from './registry.js';
31
- import {
32
- materializeBlockLayersWithRuntime,
33
- type ExpandedPersistentLayerSet,
34
- type LayerMaterializationDiagnostic,
35
- type LayerMaterializationFailureMode,
36
- } from '../materializeBlockLayers.js';
37
-
38
- export { TEMPLATE_METADATA } from './metadata.js';
39
- export type { TemplateMetadata } from './metadata.js';
40
-
41
- /**
42
- * Registry mapping template ids (the strings that appear in
43
- * `{[name]}` markdown annotations) to their implementation functions.
44
- *
45
- * Some implementation functions keep historical "Block" suffixes
46
- * (`titleBlock`, `quoteBlock`, `mapBlock`, `listBlock`) for source
47
- * readability — the registry surfaces them under the cleaner short
48
- * ids (`title`, `quote`, `map`, `list`). Internal aliases keep legacy
49
- * document names readable without expanding the public API surface.
50
- *
51
- * Note: coverBlock is not in the registry as it's used directly for
52
- * start blocks, not as a regular template in the block sequence.
53
- */
54
- export { buildRegistry, templateRegistry } from './registry.js';
55
- export type { RuntimeTemplateRegistry } from './registry.js';
56
-
57
- export { materializeBlockLayers } from '../materializeBlockLayers.js';
58
- export type {
59
- BlockLayerMaterialization,
60
- LayerMaterializationDiagnostic,
61
- LayerMaterializationFailureMode,
62
- LayerMaterializationSource,
63
- MaterializeBlockLayersOptions,
64
- } from '../materializeBlockLayers.js';
65
-
66
- /**
67
- * Resolve a template id through the internal compatibility table. Returns
68
- * the input unchanged when no alias is registered.
69
- */
70
- export { resolveTemplateName } from './templateNames.js';
71
-
72
- /**
73
- * Container templates render their parent block by consuming the block's
74
- * child headings (via `context.children`) — `diagram` draws them as nodes,
75
- * `drawing` as shapes, `layout` as absolutely-positioned layers. Those
76
- * children are therefore NOT independently renderable slides/sections;
77
- * render paths use {@link isContainerTemplate} to skip descending into
78
- * them (see `flattenRenderableBlocks`).
79
- */
80
- export { CONTAINER_TEMPLATES } from './templateNames.js';
81
-
82
- /** True when `name` (or its alias) is a children-consuming container template. */
83
- export { isContainerTemplate } from './templateNames.js';
84
-
85
- /**
86
- * Audio segment timing info for aligning blocks with audio.
87
- */
88
- export interface AudioSegmentTiming {
89
- /** Start time of this segment in the overall timeline */
90
- startTime: number;
91
- /** Duration of this segment */
92
- duration: number;
93
- }
94
-
95
- /**
96
- * Options for expanding doc blocks.
97
- */
98
- export interface ExpandDocBlocksOptions {
99
- /** Theme for template rendering (defaults to DEFAULT_THEME) */
100
- theme?: Theme;
101
- /** Viewport configuration (defaults to 16:9 landscape) */
102
- viewport?: ViewportConfig;
103
- /** Persistent layers for visual consistency across blocks */
104
- persistentLayers?: PersistentLayerConfig | false;
105
- /**
106
- * Audio segment timing information.
107
- * When provided, blocks are timed relative to their audio segment's start time,
108
- * ensuring proper synchronization with audio playback.
109
- */
110
- audioSegments?: AudioSegmentTiming[];
111
- /**
112
- * User-defined custom templates to merge onto the built-in registry
113
- * before expanding blocks. Typically passed straight from
114
- * `Doc.customTemplates`. Built-in names take precedence on collision.
115
- */
116
- customTemplates?: readonly CustomTemplateDefinition[];
117
- /** Failed templates render a visible fallback by default. */
118
- failureMode?: LayerMaterializationFailureMode;
119
- /** Receives structured template failures without hidden console output. */
120
- onDiagnostic?: (
121
- diagnostic: LayerMaterializationDiagnostic,
122
- block: DocBlock,
123
- blockIndex: number,
124
- ) => void;
125
- }
126
-
127
- /**
128
- * Expand all template blocks in a doc, calculating start times.
129
- * Injects persistent layers (bottom/top) based on per-block flags.
130
- *
131
- * When audioSegments is provided, blocks are timed relative to their audio segment's
132
- * start time, ensuring blocks appear when their audio is playing. Blocks within each
133
- * segment are distributed proportionally across the segment duration.
134
- *
135
- * @param blocks - Array of template or raw blocks
136
- * @param options - Expansion options including theme, viewport, and persistent layers
137
- */
138
- /**
139
- * Materialize one block through the canonical layer contract, then add its
140
- * timeline envelope and resolved transition.
141
- */
142
- function materializeScheduledBlock(
143
- sourceBlock: DocBlock,
144
- blockIndex: number,
145
- totalBlocks: number,
146
- theme: Theme,
147
- viewport: ViewportConfig,
148
- persistentLayers: PersistentLayerConfig | undefined,
149
- expandedPersistentLayers: ExpandedPersistentLayerSet | undefined,
150
- registry: RuntimeTemplateRegistry,
151
- failureMode: LayerMaterializationFailureMode,
152
- onDiagnostic?: ExpandDocBlocksOptions['onDiagnostic'],
153
- ): Block {
154
- const materialized = materializeBlockLayersWithRuntime(
155
- sourceBlock,
156
- {
157
- theme,
158
- viewport,
159
- persistentLayers: persistentLayers ?? false,
160
- blockIndex,
161
- totalBlocks,
162
- failureMode,
163
- },
164
- { registry, expandedPersistentLayers },
165
- );
166
- if (materialized.diagnostic) {
167
- onDiagnostic?.(materialized.diagnostic, sourceBlock, blockIndex);
168
- }
169
-
170
- const expandedBlock: Block = isTemplateBlock(sourceBlock)
171
- ? {
172
- id: sourceBlock.id,
173
- startTime: 0,
174
- duration: sourceBlock.duration,
175
- audioSegment: sourceBlock.audioSegment,
176
- ...(materialized.layers.length > 0 ? { layers: materialized.layers } : {}),
177
- transition: sourceBlock.transition,
178
- template: sourceBlock.template,
179
- }
180
- : {
181
- ...cloneData(sourceBlock as Block),
182
- ...(materialized.layers.length > 0 ? { layers: materialized.layers } : {}),
183
- };
184
-
185
- const transition = resolveBlockTransition(expandedBlock, theme, blockIndex);
186
- if (transition !== expandedBlock.transition) {
187
- expandedBlock.transition = transition;
188
- }
189
- return expandedBlock;
190
- }
191
-
192
- export function expandDocBlocks(blocks: DocBlock[], options: ExpandDocBlocksOptions = {}): Block[] {
193
- const opts: ExpandDocBlocksOptions = options;
194
-
195
- const theme = opts.theme ?? defaultTheme;
196
- const viewport = opts.viewport ?? VIEWPORT_PRESETS.landscape;
197
- const {
198
- persistentLayers,
199
- audioSegments,
200
- customTemplates,
201
- failureMode = 'fallback',
202
- onDiagnostic,
203
- } = opts;
204
- const totalBlocks = blocks.length;
205
- // Merge user-defined templates once, then share the immutable runtime view.
206
- const registry: RuntimeTemplateRegistry =
207
- customTemplates && customTemplates.length > 0
208
- ? buildRegistry(customTemplates)
209
- : (templateRegistry as unknown as RuntimeTemplateRegistry);
210
-
211
- // Callers that pass no config inherit the theme's atmosphere.
212
- const effectivePersistentLayers =
213
- persistentLayers === false ? undefined : (persistentLayers ?? theme.persistentLayers);
214
- const expandedPersistentLayers = effectivePersistentLayers
215
- ? {
216
- bottomLayers: expandPersistentLayers(effectivePersistentLayers.bottomLayers, theme),
217
- topLayers: expandPersistentLayers(effectivePersistentLayers.topLayers, theme),
218
- }
219
- : undefined;
220
-
221
- // If no audio segments provided, use simple cumulative timing
222
- if (!audioSegments || audioSegments.length === 0) {
223
- let currentTime = 0;
224
- return blocks.map((block, index) => {
225
- const expandedBlock = materializeScheduledBlock(
226
- block,
227
- index,
228
- totalBlocks,
229
- theme,
230
- viewport,
231
- effectivePersistentLayers,
232
- expandedPersistentLayers,
233
- registry,
234
- failureMode,
235
- onDiagnostic,
236
- );
237
- expandedBlock.startTime = currentTime;
238
- currentTime += expandedBlock.duration;
239
- return expandedBlock;
240
- });
241
- }
242
-
243
- // Group blocks by their audioSegment index
244
- const blocksBySegment = new Map<number, { block: DocBlock; originalIndex: number }[]>();
245
- blocks.forEach((block, index) => {
246
- const segmentIndex = (block as TemplateBlock).audioSegment ?? 0;
247
- if (!blocksBySegment.has(segmentIndex)) {
248
- blocksBySegment.set(segmentIndex, []);
249
- }
250
- blocksBySegment.get(segmentIndex)!.push({ block, originalIndex: index });
251
- });
252
-
253
- // Expand blocks, timing them relative to their audio segment
254
- const expandedBlocks: Block[] = new Array(blocks.length);
255
-
256
- for (const [segmentIndex, segmentBlocks] of blocksBySegment) {
257
- const audioSegment = audioSegments[segmentIndex];
258
- if (!audioSegment) {
259
- // No audio segment info - use simple sequential timing within the segment
260
- let offsetTime = 0;
261
- for (const { block, originalIndex } of segmentBlocks) {
262
- const expandedBlock = materializeScheduledBlock(
263
- block,
264
- originalIndex,
265
- totalBlocks,
266
- theme,
267
- viewport,
268
- effectivePersistentLayers,
269
- expandedPersistentLayers,
270
- registry,
271
- failureMode,
272
- onDiagnostic,
273
- );
274
-
275
- expandedBlock.startTime = offsetTime;
276
- offsetTime += expandedBlock.duration;
277
- expandedBlocks[originalIndex] = expandedBlock;
278
- }
279
- continue;
280
- }
281
-
282
- // Section headers (sectionHeader template) get their original duration since
283
- // the title is spoken at the start of the segment. Other blocks are scaled
284
- // to fill the remaining time.
285
- const sectionHeaderBlocks: typeof segmentBlocks = [];
286
- const contentBlocks: typeof segmentBlocks = [];
287
-
288
- for (const item of segmentBlocks) {
289
- const templateBlock = item.block as TemplateBlock;
290
- if (templateBlock.template === 'sectionHeader') {
291
- sectionHeaderBlocks.push(item);
292
- } else {
293
- contentBlocks.push(item);
294
- }
295
- }
296
-
297
- // Calculate fixed duration (section headers) and scalable duration (content)
298
- const fixedDuration = sectionHeaderBlocks.reduce((sum, { block }) => {
299
- return sum + ((block as TemplateBlock).duration ?? 0);
300
- }, 0);
301
-
302
- const contentBlockDuration = contentBlocks.reduce((sum, { block }) => {
303
- return sum + ((block as TemplateBlock).duration ?? 0);
304
- }, 0);
305
-
306
- // Remaining time after section header(s) for content blocks
307
- const remainingDuration = audioSegment.duration - fixedDuration;
308
-
309
- // Scale factor only applies to content blocks
310
- const scaleFactor =
311
- contentBlockDuration > 0 && remainingDuration > 0
312
- ? remainingDuration / contentBlockDuration
313
- : 1;
314
-
315
- // First pass: expand all blocks and track which have source timing
316
- interface ExpandedSlideInfo {
317
- block: Block;
318
- originalIndex: number;
319
- templateBlock: TemplateBlock;
320
- hasSourceTiming: boolean;
321
- }
322
- const expandedInfos: ExpandedSlideInfo[] = [];
323
-
324
- for (const { block, originalIndex } of segmentBlocks) {
325
- const expandedBlock = materializeScheduledBlock(
326
- block,
327
- originalIndex,
328
- totalBlocks,
329
- theme,
330
- viewport,
331
- effectivePersistentLayers,
332
- expandedPersistentLayers,
333
- registry,
334
- failureMode,
335
- onDiagnostic,
336
- );
337
-
338
- const templateBlock = block as TemplateBlock;
339
- expandedInfos.push({
340
- block: expandedBlock,
341
- originalIndex,
342
- templateBlock,
343
- hasSourceTiming: typeof templateBlock.sourceStartTime === 'number',
344
- });
345
- }
346
-
347
- // Sort blocks within this segment.
348
- // When ANY block has source timing (from audio analysis), section headers
349
- // are placed first since they are intro cards for the segment. When there
350
- // is no source timing (e.g., preview/synthetic mode), keep original
351
- // document order so the slideshow matches what the author wrote.
352
- const hasAnySourceTiming = expandedInfos.some((info) => info.hasSourceTiming);
353
-
354
- expandedInfos.sort((a, b) => {
355
- if (hasAnySourceTiming) {
356
- const aIsHeader = a.templateBlock.template === 'sectionHeader';
357
- const bIsHeader = b.templateBlock.template === 'sectionHeader';
358
-
359
- // Section headers come first when we have audio-based timing
360
- if (aIsHeader && !bIsHeader) return -1;
361
- if (!aIsHeader && bIsHeader) return 1;
362
-
363
- // Both have source timing - sort by time
364
- if (a.hasSourceTiming && b.hasSourceTiming) {
365
- return a.templateBlock.sourceStartTime! - b.templateBlock.sourceStartTime!;
366
- }
367
-
368
- // One has timing, one doesn't - timing comes first
369
- if (a.hasSourceTiming && !b.hasSourceTiming) return -1;
370
- if (!a.hasSourceTiming && b.hasSourceTiming) return 1;
371
- }
372
-
373
- // Keep original document order
374
- return a.originalIndex - b.originalIndex;
375
- });
376
-
377
- // Second pass: assign start times
378
- // Slides with sourceStartTime use that; others fill gaps
379
- let offsetWithinSegment = 0;
380
- for (let i = 0; i < expandedInfos.length; i++) {
381
- const info = expandedInfos[i];
382
- const { block: expandedBlock, templateBlock } = info;
383
-
384
- // Use source timing if available, otherwise use sequential offset
385
- if (info.hasSourceTiming) {
386
- // Use the source timing - this is when the content is spoken
387
- const sourceStart = templateBlock.sourceStartTime!;
388
- expandedBlock.startTime = audioSegment.startTime + sourceStart;
389
- // Use source duration if available, otherwise use block duration
390
- if (typeof templateBlock.sourceDuration === 'number') {
391
- expandedBlock.duration = Math.max(5, templateBlock.sourceDuration);
392
- }
393
- // Update offset for next block
394
- offsetWithinSegment = sourceStart + expandedBlock.duration;
395
- } else if (templateBlock.template === 'sectionHeader') {
396
- // Section headers start at the beginning of the segment
397
- expandedBlock.startTime = audioSegment.startTime + offsetWithinSegment;
398
- offsetWithinSegment += expandedBlock.duration;
399
- } else {
400
- // No source timing - place after previous block
401
- expandedBlock.startTime = audioSegment.startTime + offsetWithinSegment;
402
- // Scale content block duration to fit
403
- const scaledDuration = expandedBlock.duration * scaleFactor;
404
- expandedBlock.duration = scaledDuration;
405
- offsetWithinSegment += scaledDuration;
406
- }
407
-
408
- expandedBlocks[info.originalIndex] = expandedBlock;
409
- }
410
-
411
- // Third pass: fix overlaps and gaps by adjusting durations
412
- // Sort by startTime for overlap detection
413
- const segmentExpandedBlocks = expandedInfos
414
- .map((info) => expandedBlocks[info.originalIndex])
415
- .sort((a, b) => a.startTime - b.startTime);
416
-
417
- for (let i = 0; i < segmentExpandedBlocks.length - 1; i++) {
418
- const current = segmentExpandedBlocks[i];
419
- const next = segmentExpandedBlocks[i + 1];
420
- const currentEnd = current.startTime + current.duration;
421
-
422
- if (currentEnd > next.startTime) {
423
- // Overlap - shorten current block to end when next begins
424
- current.duration = next.startTime - current.startTime;
425
- } else if (currentEnd < next.startTime - 0.5) {
426
- // Gap > 0.5s - extend current block to fill (visual continuity)
427
- // Same formula as overlap: snap to next block start
428
- current.duration = Math.max(0.1, next.startTime - current.startTime);
429
- }
430
- }
431
-
432
- // Minimum gap between any two transitions (including section boundaries).
433
- // No block should be visible for less than this before a transition occurs.
434
- const MIN_TRANSITION_GAP = 5;
435
- const segmentEnd = audioSegment.startTime + audioSegment.duration;
436
-
437
- // Fourth pass: enforce minimum transition gap at section boundary.
438
- // Eliminate blocks from the end that would start within MIN_TRANSITION_GAP
439
- // of the section end (creating a jarring transition right before the next
440
- // section header). Loop to handle cascading eliminations.
441
- while (segmentExpandedBlocks.length > 1) {
442
- const lastBlock = segmentExpandedBlocks[segmentExpandedBlocks.length - 1];
443
- const timeFromLastToEnd = segmentEnd - lastBlock.startTime;
444
-
445
- if (timeFromLastToEnd < MIN_TRANSITION_GAP && lastBlock.template !== 'sectionHeader') {
446
- const prevBlock = segmentExpandedBlocks[segmentExpandedBlocks.length - 2];
447
- prevBlock.duration = segmentEnd - prevBlock.startTime;
448
- lastBlock.duration = 0;
449
- lastBlock.startTime = segmentEnd;
450
- segmentExpandedBlocks.pop();
451
- } else {
452
- // Extend last block to fill to segment end
453
- if (lastBlock.startTime + lastBlock.duration < segmentEnd) {
454
- lastBlock.duration = segmentEnd - lastBlock.startTime;
455
- }
456
- break;
457
- }
458
- }
459
-
460
- // Handle single-block segment
461
- if (segmentExpandedBlocks.length === 1) {
462
- const onlyBlock = segmentExpandedBlocks[0];
463
- if (onlyBlock.startTime + onlyBlock.duration < segmentEnd) {
464
- onlyBlock.duration = segmentEnd - onlyBlock.startTime;
465
- }
466
- }
467
-
468
- // Fifth pass: eliminate any remaining blocks shorter than MIN_TRANSITION_GAP.
469
- // Walk backwards and merge short blocks into their predecessor.
470
- // Skip index 0 (first block, typically section header) to preserve segment start.
471
- let changed = true;
472
- while (changed) {
473
- changed = false;
474
- for (let i = segmentExpandedBlocks.length - 1; i >= 1; i--) {
475
- const block = segmentExpandedBlocks[i];
476
- if (block.duration > 0 && block.duration < MIN_TRANSITION_GAP) {
477
- const prev = segmentExpandedBlocks[i - 1];
478
- const blockEnd = block.startTime + block.duration;
479
- prev.duration = blockEnd - prev.startTime;
480
- block.duration = 0;
481
- block.startTime = segmentEnd;
482
- segmentExpandedBlocks.splice(i, 1);
483
- changed = true;
484
- break; // Restart loop after modification
485
- }
486
- }
487
- }
488
-
489
- // Sixth pass: split blocks that are too long (>20s)
490
- // This ensures no single block lingers for too long
491
- const MAX_BLOCK_DURATION = 20;
492
-
493
- for (let i = 0; i < segmentExpandedBlocks.length; i++) {
494
- const block = segmentExpandedBlocks[i];
495
-
496
- if (block.duration > MAX_BLOCK_DURATION) {
497
- // Calculate how many parts we need
498
- const numParts = Math.ceil(block.duration / MAX_BLOCK_DURATION);
499
- const partDuration = block.duration / numParts;
500
-
501
- // Only split if each part would meet minimum transition gap
502
- if (partDuration >= MIN_TRANSITION_GAP) {
503
- // Shorten original block to first part
504
- block.duration = partDuration;
505
-
506
- // Create additional blocks for remaining parts
507
- for (let p = 1; p < numParts; p++) {
508
- const splitBlock: Block = {
509
- id: `${block.id}-split-${p}`,
510
- startTime: block.startTime + p * partDuration,
511
- duration: partDuration,
512
- audioSegment: block.audioSegment,
513
- layers: (block.layers ?? []).map((layer) => ({
514
- ...cloneData(layer),
515
- id: `${layer.id}-split-${p}`,
516
- })),
517
- transition: { type: 'dissolve', duration: 1.0 },
518
- template: block.template,
519
- };
520
- // Insert into expanded blocks array
521
- expandedBlocks.push(splitBlock);
522
- }
523
- }
524
- }
525
- }
526
- }
527
-
528
- // Filter out zero-duration blocks (eliminated in earlier passes)
529
- return expandedBlocks.filter((block) => block && block.duration > 0);
530
- }
531
-
532
- /**
533
- * Get list of available template names.
534
- */
535
- export function getAvailableTemplates(): string[] {
536
- return Object.keys(templateRegistry);
537
- }
538
-
539
- /**
540
- * Check if a template exists. Accepts both the canonical short id
541
- * (`title`, `quote`, `map`, `list`) and legacy aliases
542
- * (`titleBlock`, `quoteBlock`, `mapBlock`, `listBlock`).
543
- */
544
- export function hasTemplate(name: string): boolean {
545
- return resolveTemplateName(name) in templateRegistry;
546
- }
547
-
548
- // Re-export types and utilities from schemas
549
- export {
550
- isTemplateBlock,
551
- createTemplateContext,
552
- scaledFontSize,
553
- } from '../../schemas/BlockTemplates.js';
554
- export type {
555
- TemplateBlock,
556
- DocBlock,
557
- TemplateContext,
558
- PersistentLayerConfig,
559
- } from '../../schemas/BlockTemplates.js';
560
- export {
561
- DEFAULT_THEME,
562
- resolveTheme,
563
- getAvailableThemes,
564
- getThemeSummaries,
565
- } from '../../schemas/themeLibrary.js';
566
- export type {
567
- Theme,
568
- ThemeColorPalette,
569
- ThemeColorScheme,
570
- ThemeTypography,
571
- ThemeStyle,
572
- RenderStyle,
573
- } from '../../schemas/Theme.js';
574
- // Re-export timing types (AudioSegmentTiming and ExpandDocBlocksOptions are already exported above)
575
- export { VIEWPORT_PRESETS, getViewport, getViewportOrientation } from '../../schemas/Viewport.js';
576
- export type {
577
- ViewportConfig,
578
- ViewportPreset,
579
- ViewportOrientation,
580
- } from '../../schemas/Viewport.js';
581
- export { getLayoutHints, getTwoColumnPositions } from '../../schemas/LayoutStrategy.js';
582
- export type { LayoutHints } from '../../schemas/LayoutStrategy.js';
583
- export {
584
- expandPersistentLayers,
585
- getPersistentLayersFromTheme,
586
- resolvePersistentLayers,
587
- wrapWithPersistentLayers,
588
- } from './persistentLayers.js';
589
-
590
- // Re-export individual templates for direct access
591
- export { titleBlock } from './titleBlock.js';
592
- export { sectionHeader } from './sectionHeader.js';
593
- export { statHighlight } from './statHighlight.js';
594
- export { quoteBlock } from './quoteBlock.js';
595
- export { factCard } from './factCard.js';
596
- export { twoColumn } from './twoColumn.js';
597
- export { dateEvent } from './dateEvent.js';
598
- export { imageWithCaption } from './imageWithCaption.js';
599
- export { leftFeature, rightFeature } from './featureBlock.js';
600
- export { mapBlock } from './mapBlock.js';
601
- export { coverBlock, expandCoverBlock } from './coverBlock.js';
602
- export type { CoverBlockInput } from './coverBlock.js';
603
- export { fullBleedQuote } from './fullBleedQuote.js';
604
- export { listBlock } from './listBlock.js';
605
- export { photoGrid } from './photoGrid.js';
606
- export { definitionCard } from './definitionCard.js';
607
- export { comparisonBar } from './comparisonBar.js';
608
- export { pullQuote } from './pullQuote.js';
609
- export { videoWithCaption } from './videoWithCaption.js';
610
- export { videoPullQuote } from './videoPullQuote.js';
611
- export { dataTable } from './dataTable.js';
612
- export { diagramBlock } from './diagramBlock.js';
613
- export { treeBlock } from './treeBlock.js';
614
- export { timelineBlock } from './timelineBlock.js';
615
- export { computeDiagramLayout } from './diagramLayout.js';
616
- export type {
617
- DiagramLayout,
618
- DiagramNodePosition,
619
- DiagramEdge,
620
- DiagramLayoutOptions,
621
- } from './diagramLayout.js';
622
- export { drawingBlock } from './drawingBlock.js';
623
- export {
624
- computeDrawingLayout,
625
- normalizeShapeKind,
626
- isShapeName,
627
- SHAPE_NAMES,
628
- } from './drawingLayout.js';
629
- export type {
630
- DrawingLayout,
631
- DrawingShape,
632
- DrawingShapeKind,
633
- DrawingConnector,
634
- DrawingLayoutOptions,
635
- } from './drawingLayout.js';
636
- export { layoutBlock } from './layoutBlock.js';
637
- export { computeLayoutLayers } from './layoutLayout.js';
638
- export type { LayoutLayersResult, LayoutLayerDefaults } from './layoutLayout.js';
639
-
640
- // Re-export accent image utilities
641
- export { getAccentLayout, createAccentLayers, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
642
- export type { AccentLayout } from './accentImage.js';