@bendyline/squisq 1.5.2 → 2.0.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 (263) hide show
  1. package/README.md +63 -10
  2. package/dist/{Doc-BBVGq1_9.d.ts → Doc-ylqWKDc_.d.ts} +248 -37
  3. package/dist/{ImageEditDoc-FuyGtt6o.d.ts → ImageEditDoc-D828IXJ1.d.ts} +1 -1
  4. package/dist/annotationCoercion-Dr_DY9Hx.d.ts +86 -0
  5. package/dist/{chunk-VWUFZ6ZG.js → chunk-3E5F2XMR.js} +2 -29
  6. package/dist/chunk-3E5F2XMR.js.map +1 -0
  7. package/dist/chunk-4X3JQXNM.js +35 -0
  8. package/dist/chunk-4X3JQXNM.js.map +1 -0
  9. package/dist/{chunk-P3K7NLHF.js → chunk-5DKBFXPY.js} +31 -121
  10. package/dist/chunk-5DKBFXPY.js.map +1 -0
  11. package/dist/{chunk-DLXZMS5K.js → chunk-5J4HKRJF.js} +51 -3
  12. package/dist/chunk-5J4HKRJF.js.map +1 -0
  13. package/dist/chunk-5UYI3RJB.js +2503 -0
  14. package/dist/chunk-5UYI3RJB.js.map +1 -0
  15. package/dist/{chunk-BEQODJWV.js → chunk-66QO7XFB.js} +11 -291
  16. package/dist/chunk-66QO7XFB.js.map +1 -0
  17. package/dist/{chunk-KKNUBQ6Y.js → chunk-6PJRB2CF.js} +156 -91
  18. package/dist/chunk-6PJRB2CF.js.map +1 -0
  19. package/dist/{chunk-HWVFJAAH.js → chunk-AMIR72JP.js} +28 -10
  20. package/dist/chunk-AMIR72JP.js.map +1 -0
  21. package/dist/chunk-FVJUUTEM.js +74 -0
  22. package/dist/chunk-FVJUUTEM.js.map +1 -0
  23. package/dist/{chunk-5TYS5V3G.js → chunk-GF3BVNLU.js} +4127 -3538
  24. package/dist/chunk-GF3BVNLU.js.map +1 -0
  25. package/dist/{chunk-Q3ROPT5H.js → chunk-GZY66SDN.js} +1 -1
  26. package/dist/{chunk-Q3ROPT5H.js.map → chunk-GZY66SDN.js.map} +1 -1
  27. package/dist/chunk-JOQYPRDZ.js +127 -0
  28. package/dist/chunk-JOQYPRDZ.js.map +1 -0
  29. package/dist/{chunk-A4O7GIWE.js → chunk-LYNJEOAC.js} +10 -73
  30. package/dist/chunk-LYNJEOAC.js.map +1 -0
  31. package/dist/{chunk-LDQ2HJIX.js → chunk-PXLVXTLW.js} +252 -54
  32. package/dist/chunk-PXLVXTLW.js.map +1 -0
  33. package/dist/{chunk-TQWLI6S2.js → chunk-Q7LROV2H.js} +4 -2
  34. package/dist/{chunk-TQWLI6S2.js.map → chunk-Q7LROV2H.js.map} +1 -1
  35. package/dist/{chunk-T5UK6YOB.js → chunk-QTSJOY54.js} +60 -17
  36. package/dist/chunk-QTSJOY54.js.map +1 -0
  37. package/dist/chunk-QVANWDPH.js +2358 -0
  38. package/dist/chunk-QVANWDPH.js.map +1 -0
  39. package/dist/{chunk-GPLTCSXO.js → chunk-R2GC6RLD.js} +7 -7
  40. package/dist/chunk-R2GC6RLD.js.map +1 -0
  41. package/dist/chunk-R2YZTCLO.js +292 -0
  42. package/dist/chunk-R2YZTCLO.js.map +1 -0
  43. package/dist/chunk-S7A5D7ZJ.js +174 -0
  44. package/dist/chunk-S7A5D7ZJ.js.map +1 -0
  45. package/dist/chunk-T3TI7GSZ.js +884 -0
  46. package/dist/chunk-T3TI7GSZ.js.map +1 -0
  47. package/dist/{chunk-LTN6I7QW.js → chunk-TUWMK62B.js} +55 -4
  48. package/dist/chunk-TUWMK62B.js.map +1 -0
  49. package/dist/{chunk-IMSCRLLV.js → chunk-VR7UPJ7C.js} +35 -25
  50. package/dist/chunk-VR7UPJ7C.js.map +1 -0
  51. package/dist/doc/index.d.ts +2334 -5
  52. package/dist/doc/index.js +127 -33
  53. package/dist/generate/index.d.ts +7 -2
  54. package/dist/generate/index.js +1 -1
  55. package/dist/imageEdit/index.d.ts +9 -6
  56. package/dist/imageEdit/index.js +3 -3
  57. package/dist/index.d.ts +12 -10
  58. package/dist/index.js +246 -80
  59. package/dist/jsonForm/index.d.ts +7 -3
  60. package/dist/jsonForm/index.js +9 -4
  61. package/dist/markdown/index.d.ts +6 -70
  62. package/dist/markdown/index.js +13 -9
  63. package/dist/narration/index.d.ts +618 -0
  64. package/dist/narration/index.js +82 -0
  65. package/dist/recommend/index.d.ts +15 -1
  66. package/dist/recommend/index.js +2 -2
  67. package/dist/schemas/index.d.ts +28 -6
  68. package/dist/schemas/index.js +15 -13
  69. package/dist/spatial/index.d.ts +0 -1
  70. package/dist/spatial/index.js +1 -1
  71. package/dist/storage/index.js +1 -1
  72. package/dist/{themeLibrary-CehcJhzz.d.ts → themeLibrary-RjVgLpUi.d.ts} +10 -11
  73. package/dist/timing/index.js +5 -3
  74. package/dist/transform/index.d.ts +35 -24
  75. package/dist/transform/index.js +9 -10
  76. package/dist/{types-DlAZ7MW4.d.ts → types-BwMPl2CB.d.ts} +1 -1
  77. package/dist/{types-D98li1gV.d.ts → types-C4kiRn_k.d.ts} +3 -1
  78. package/dist/versions/index.d.ts +2 -1
  79. package/dist/versions/index.js +2 -2
  80. package/package.json +6 -6
  81. package/src/__tests__/applyNarrationTiming.test.ts +190 -0
  82. package/src/__tests__/applyRenderStyle.test.ts +3 -3
  83. package/src/__tests__/asciiDiagramBattle.test.ts +246 -0
  84. package/src/__tests__/asciiDiagramDetect.test.ts +162 -0
  85. package/src/__tests__/asciiDiagramMapping.test.ts +38 -0
  86. package/src/__tests__/asciiDiagramParse.test.ts +233 -0
  87. package/src/__tests__/asciiDiagramPipeline.test.ts +273 -0
  88. package/src/__tests__/asciiDiagramRender.test.ts +162 -0
  89. package/src/__tests__/asciiDiagramRepair.test.ts +84 -0
  90. package/src/__tests__/asciiTimelineDetect.test.ts +157 -0
  91. package/src/__tests__/asciiTimelineParse.test.ts +205 -0
  92. package/src/__tests__/asciiTimelinePipeline.test.ts +349 -0
  93. package/src/__tests__/asciiTimelineRender.test.ts +376 -0
  94. package/src/__tests__/attrTokens.test.ts +5 -0
  95. package/src/__tests__/contentContainer.test.ts +43 -0
  96. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -15
  97. package/src/__tests__/dataTable.test.ts +25 -15
  98. package/src/__tests__/diagramBlock.test.ts +3 -3
  99. package/src/__tests__/diagramText.test.ts +26 -0
  100. package/src/__tests__/docToMarkdownMedia.test.ts +83 -0
  101. package/src/__tests__/drawingBlock.test.ts +3 -3
  102. package/src/__tests__/fixtures/asciiDiagramBattle.ts +512 -0
  103. package/src/__tests__/fixtures/asciiDiagrams.ts +287 -0
  104. package/src/__tests__/fixtures/asciiTimelines.ts +35 -0
  105. package/src/__tests__/fixtures/treeviewFixtures.ts +243 -0
  106. package/src/__tests__/getLayers.test.ts +32 -18
  107. package/src/__tests__/getLayersFallback.test.ts +8 -8
  108. package/src/__tests__/imageEditVersions.test.ts +2 -0
  109. package/src/__tests__/jsonForm.pointer.test.ts +47 -1
  110. package/src/__tests__/layoutBlock.test.ts +3 -3
  111. package/src/__tests__/majorApiTypes.test.ts +18 -0
  112. package/src/__tests__/markdown.test.ts +41 -0
  113. package/src/__tests__/matchFontFamily.test.ts +114 -0
  114. package/src/__tests__/materializeBlockLayers.test.ts +135 -0
  115. package/src/__tests__/materializeTestUtils.ts +17 -0
  116. package/src/__tests__/narrationAlign.test.ts +150 -0
  117. package/src/__tests__/narrationFeatures.test.ts +71 -0
  118. package/src/__tests__/narrationNuclei.test.ts +45 -0
  119. package/src/__tests__/narrationPacing.test.ts +189 -0
  120. package/src/__tests__/narrationScript.test.ts +149 -0
  121. package/src/__tests__/narrationSessionRepro.test.ts +62 -0
  122. package/src/__tests__/narrationSidecar.test.ts +88 -0
  123. package/src/__tests__/narrationSyllables.test.ts +65 -0
  124. package/src/__tests__/narrationTestSignals.ts +167 -0
  125. package/src/__tests__/narrationVad.test.ts +66 -0
  126. package/src/__tests__/resolveDocTheme.test.ts +16 -2
  127. package/src/__tests__/rootExports.test.ts +18 -0
  128. package/src/__tests__/scopedContentContainer.test.ts +20 -0
  129. package/src/__tests__/shapeGeometry.test.ts +12 -0
  130. package/src/__tests__/templateAnnotationParse.test.ts +10 -0
  131. package/src/__tests__/templateInputs.test.ts +69 -0
  132. package/src/__tests__/templateMetadata.test.ts +2 -1
  133. package/src/__tests__/templates.test.ts +143 -17
  134. package/src/__tests__/themeCompile.test.ts +49 -22
  135. package/src/__tests__/transformProvenance.test.ts +160 -0
  136. package/src/__tests__/transformV2.test.ts +40 -14
  137. package/src/__tests__/treeviewBattle.test.ts +76 -0
  138. package/src/__tests__/treeviewDetect.test.ts +168 -0
  139. package/src/__tests__/treeviewParse.test.ts +118 -0
  140. package/src/__tests__/treeviewPipeline.test.ts +183 -0
  141. package/src/__tests__/treeviewRender.test.ts +91 -0
  142. package/src/__tests__/versions.test.ts +44 -0
  143. package/src/doc/applyNarrationTiming.ts +244 -0
  144. package/src/doc/asciiDiagram/chars.ts +210 -0
  145. package/src/doc/asciiDiagram/detect.ts +175 -0
  146. package/src/doc/asciiDiagram/index.ts +38 -0
  147. package/src/doc/asciiDiagram/mapping.ts +225 -0
  148. package/src/doc/asciiDiagram/parse.ts +1095 -0
  149. package/src/doc/asciiDiagram/render.ts +963 -0
  150. package/src/doc/asciiDiagram/repair.ts +400 -0
  151. package/src/doc/asciiDiagram/types.ts +65 -0
  152. package/src/doc/asciiTimeline/detect.ts +138 -0
  153. package/src/doc/asciiTimeline/index.ts +26 -0
  154. package/src/doc/asciiTimeline/mapping.ts +43 -0
  155. package/src/doc/asciiTimeline/parse.ts +870 -0
  156. package/src/doc/asciiTimeline/render.ts +427 -0
  157. package/src/doc/asciiTimeline/types.ts +73 -0
  158. package/src/doc/asciiTimeline/wrappedFlow.ts +427 -0
  159. package/src/doc/audioMapping.ts +60 -46
  160. package/src/doc/customTemplatesFrontmatter.ts +0 -41
  161. package/src/doc/docToMarkdown.ts +70 -2
  162. package/src/doc/index.ts +76 -4
  163. package/src/doc/markdownToDoc.ts +135 -1
  164. package/src/doc/materializeBlockLayers.ts +304 -0
  165. package/src/doc/mediaAnnotations.ts +20 -0
  166. package/src/doc/resolveDocTheme.ts +8 -7
  167. package/src/doc/templateInputs.ts +185 -2
  168. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +22 -8
  169. package/src/doc/templates/diagramBlock.ts +237 -38
  170. package/src/doc/templates/fallbackBlock.ts +1 -1
  171. package/src/doc/templates/index.ts +134 -279
  172. package/src/doc/templates/inputDescriptors.ts +20 -1
  173. package/src/doc/templates/metadata.ts +10 -0
  174. package/src/doc/templates/persistentLayers.ts +12 -126
  175. package/src/doc/templates/registry.ts +88 -0
  176. package/src/doc/templates/templateNames.ts +22 -0
  177. package/src/doc/templates/timelineBlock.ts +613 -0
  178. package/src/doc/templates/treeBlock.ts +131 -0
  179. package/src/doc/treeview/chars.ts +72 -0
  180. package/src/doc/treeview/detect.ts +145 -0
  181. package/src/doc/treeview/index.ts +30 -0
  182. package/src/doc/treeview/mapping.ts +95 -0
  183. package/src/doc/treeview/parse.ts +201 -0
  184. package/src/doc/treeview/render.ts +41 -0
  185. package/src/doc/treeview/types.ts +43 -0
  186. package/src/doc/utils/applyRenderStyle.ts +2 -9
  187. package/src/doc/utils/diagramText.ts +78 -0
  188. package/src/doc/utils/shapeGeometry.ts +67 -5
  189. package/src/doc/validate.ts +1 -1
  190. package/src/generate/templateMapper.ts +7 -0
  191. package/src/imageEdit/export.ts +6 -5
  192. package/src/imageEdit/versionPaths.ts +13 -26
  193. package/src/imageEdit/versions.ts +21 -100
  194. package/src/index.ts +1 -0
  195. package/src/internal/immutable.ts +58 -0
  196. package/src/jsonForm/index.ts +9 -1
  197. package/src/jsonForm/pointer.ts +68 -23
  198. package/src/markdown/attrTokens.ts +7 -5
  199. package/src/markdown/index.ts +1 -0
  200. package/src/markdown/stringify.ts +4 -9
  201. package/src/markdown/utils.ts +36 -14
  202. package/src/narration/align.ts +514 -0
  203. package/src/narration/features.ts +231 -0
  204. package/src/narration/index.ts +86 -0
  205. package/src/narration/nuclei.ts +118 -0
  206. package/src/narration/pacing.ts +211 -0
  207. package/src/narration/script.ts +239 -0
  208. package/src/narration/session.ts +100 -0
  209. package/src/narration/sidecar.ts +187 -0
  210. package/src/narration/syllables.ts +85 -0
  211. package/src/narration/trace.ts +50 -0
  212. package/src/narration/types.ts +299 -0
  213. package/src/narration/vad.ts +131 -0
  214. package/src/recommend/numberHighlight.ts +25 -0
  215. package/src/recommend/templates.ts +108 -12
  216. package/src/schemas/BlockTemplates.ts +156 -7
  217. package/src/schemas/Doc.ts +72 -9
  218. package/src/schemas/Media.ts +12 -2
  219. package/src/schemas/Theme.ts +45 -25
  220. package/src/schemas/Viewport.ts +2 -2
  221. package/src/schemas/fontStacks.ts +79 -0
  222. package/src/schemas/themeCompile.ts +15 -0
  223. package/src/schemas/themeConstants.ts +2 -0
  224. package/src/schemas/themeLibrary.ts +25 -19
  225. package/src/schemas/themeValidator.ts +1 -1
  226. package/src/spatial/Geohash.ts +0 -3
  227. package/src/storage/ContentContainer.ts +17 -9
  228. package/src/storage/ScopedContentContainer.ts +45 -15
  229. package/src/transform/applyTransform.ts +5 -5
  230. package/src/transform/index.ts +3 -1
  231. package/src/transform/registry.ts +169 -49
  232. package/src/transform/templateSelector.ts +21 -2
  233. package/src/transform/timingAllocator.ts +152 -21
  234. package/src/transform/types.ts +14 -1
  235. package/src/versions/gitignore.ts +34 -0
  236. package/src/versions/index.ts +2 -0
  237. package/src/versions/operations.ts +18 -104
  238. package/src/versions/paths.ts +13 -28
  239. package/src/versions/snapshotStore.ts +202 -0
  240. package/src/versions/types.ts +3 -1
  241. package/dist/chunk-5TYS5V3G.js.map +0 -1
  242. package/dist/chunk-A4O7GIWE.js.map +0 -1
  243. package/dist/chunk-BEQODJWV.js.map +0 -1
  244. package/dist/chunk-DLXZMS5K.js.map +0 -1
  245. package/dist/chunk-GPLTCSXO.js.map +0 -1
  246. package/dist/chunk-HWVFJAAH.js.map +0 -1
  247. package/dist/chunk-IMSCRLLV.js.map +0 -1
  248. package/dist/chunk-JELIRVDP.js +0 -24
  249. package/dist/chunk-JELIRVDP.js.map +0 -1
  250. package/dist/chunk-KKNUBQ6Y.js.map +0 -1
  251. package/dist/chunk-LDQ2HJIX.js.map +0 -1
  252. package/dist/chunk-LTN6I7QW.js.map +0 -1
  253. package/dist/chunk-P3K7NLHF.js.map +0 -1
  254. package/dist/chunk-T5UK6YOB.js.map +0 -1
  255. package/dist/chunk-UY7KGQ5R.js +0 -192
  256. package/dist/chunk-UY7KGQ5R.js.map +0 -1
  257. package/dist/chunk-VLJJHDAC.js +0 -218
  258. package/dist/chunk-VLJJHDAC.js.map +0 -1
  259. package/dist/chunk-VWUFZ6ZG.js.map +0 -1
  260. package/dist/story/index.d.ts +0 -1801
  261. package/dist/story/index.js +0 -279
  262. package/src/doc/getLayers.ts +0 -195
  263. /package/dist/{story → narration}/index.js.map +0 -0
@@ -27,6 +27,7 @@ import type {
27
27
  ProgressIndicatorConfig,
28
28
  } from '../../schemas/BlockTemplates.js';
29
29
  import type { Theme } from '../../schemas/Theme.js';
30
+ import { cloneData } from '../../internal/immutable.js';
30
31
  import { isPersistentLayerTemplate } from '../../schemas/BlockTemplates.js';
31
32
  import { oklchDarken, withAlpha } from '../../schemas/colorUtils.js';
32
33
 
@@ -415,9 +416,9 @@ function expandProgressIndicator(config: ProgressIndicatorConfig): Layer {
415
416
  * Expand a single persistent layer (template or raw) to raw Layer(s).
416
417
  */
417
418
  export function expandPersistentLayer(layer: PersistentLayer, theme?: Theme): Layer[] {
418
- // If already a raw Layer, return as-is
419
+ // If already a raw Layer, return an owned copy.
419
420
  if (!isPersistentLayerTemplate(layer)) {
420
- return [layer as Layer];
421
+ return [cloneData(layer as Layer)];
421
422
  }
422
423
 
423
424
  const template = layer as PersistentLayerTemplate;
@@ -466,128 +467,6 @@ export function expandPersistentLayers(
466
467
  );
467
468
  }
468
469
 
469
- // ============================================
470
- // Style Presets (legacy helper — prefer theme.persistentLayers)
471
- // ============================================
472
-
473
- /** Legacy style preset names. Prefer using `Theme.persistentLayers` directly. */
474
- export type DocStylePreset = 'minimal' | 'documentary' | 'branded' | 'cinematic' | 'clean';
475
-
476
- /**
477
- * Get a PersistentLayerConfig from a style preset.
478
- *
479
- * @param preset - Style preset name
480
- * @param articleTitle - Article title for title caption
481
- * @param heroSrc - Optional hero image for cinematic style
482
- */
483
- export function getDocStyleConfig(
484
- preset: DocStylePreset,
485
- articleTitle: string,
486
- heroSrc?: string,
487
- subtitle?: string,
488
- ): PersistentLayerConfig {
489
- switch (preset) {
490
- case 'minimal':
491
- return {};
492
-
493
- case 'documentary':
494
- return {
495
- bottomLayers: [
496
- {
497
- template: 'gradientBackground',
498
- config: { type: 'gradientBackground', preset: 'dark-vignette' },
499
- },
500
- ],
501
- topLayers: [
502
- {
503
- template: 'titleCaption',
504
- config: {
505
- type: 'titleCaption',
506
- title: articleTitle,
507
- subtitle,
508
- position: 'bottom-left',
509
- fontSize: 24,
510
- showThumbnail: !!heroSrc,
511
- thumbnailSrc: heroSrc,
512
- },
513
- },
514
- ],
515
- };
516
-
517
- case 'branded':
518
- return {
519
- bottomLayers: [
520
- {
521
- template: 'gradientBackground',
522
- config: { type: 'gradientBackground', preset: 'cool-blue' },
523
- },
524
- ],
525
- topLayers: [
526
- {
527
- template: 'titleCaption',
528
- config: {
529
- type: 'titleCaption',
530
- title: articleTitle,
531
- subtitle,
532
- position: 'bottom-left',
533
- fontSize: 26,
534
- showThumbnail: !!heroSrc,
535
- thumbnailSrc: heroSrc,
536
- },
537
- },
538
- ],
539
- };
540
-
541
- case 'cinematic':
542
- return {
543
- bottomLayers: heroSrc
544
- ? [
545
- {
546
- template: 'imageBackground',
547
- config: {
548
- type: 'imageBackground',
549
- src: heroSrc,
550
- blur: 12,
551
- opacity: 0.3,
552
- ambientMotion: 'zoomIn',
553
- },
554
- },
555
- ]
556
- : [
557
- {
558
- template: 'gradientBackground',
559
- config: { type: 'gradientBackground', preset: 'radial-dark' },
560
- },
561
- ],
562
- topLayers: [
563
- {
564
- template: 'titleCaption',
565
- config: {
566
- type: 'titleCaption',
567
- title: articleTitle,
568
- subtitle,
569
- position: 'bottom-right',
570
- fontSize: 22,
571
- },
572
- },
573
- ],
574
- };
575
-
576
- case 'clean':
577
- return {
578
- bottomLayers: [
579
- {
580
- template: 'solidBackground',
581
- config: { type: 'solidBackground', color: '#1a202c' },
582
- },
583
- ],
584
- };
585
-
586
- default:
587
- return {};
588
- }
589
- }
590
-
591
470
  /**
592
471
  * Get persistent layers from a Theme. Returns the theme's baked-in
593
472
  * persistentLayers config, or an empty config when the theme has none.
@@ -625,7 +504,7 @@ export function resolvePersistentLayers(
625
504
  /**
626
505
  * Compose a block's layers between pre-expanded persistent bottom/top
627
506
  * layers, honoring the per-block `useBottomLayer` / `useTopLayer` opt-outs.
628
- * Single shared implementation for `expandDocBlocks` and `getLayers`.
507
+ * Shared persistent-layer primitive used by `materializeBlockLayers`.
629
508
  */
630
509
  export function wrapWithPersistentLayers(
631
510
  layers: Layer[],
@@ -636,5 +515,12 @@ export function wrapWithPersistentLayers(
636
515
  if (bottomLayers.length === 0 && topLayers.length === 0) return layers;
637
516
  const useBottom = block.useBottomLayer !== false;
638
517
  const useTop = block.useTopLayer !== false;
639
- return [...(useBottom ? bottomLayers : []), ...layers, ...(useTop ? topLayers : [])];
518
+ // Each expanded block owns its persistent layers. This prevents a renderer
519
+ // (or a later timing/style pass) from mutating the caller's config or a
520
+ // sibling block through a shared layer reference.
521
+ return [
522
+ ...(useBottom ? bottomLayers.map((layer) => cloneData(layer)) : []),
523
+ ...layers,
524
+ ...(useTop ? topLayers.map((layer) => cloneData(layer)) : []),
525
+ ];
640
526
  }
@@ -0,0 +1,88 @@
1
+ /** Runtime registry composition for built-in and document-scoped templates. */
2
+
3
+ import type { Layer } from '../../schemas/Doc.js';
4
+ import type {
5
+ TemplateBlock,
6
+ TemplateContext,
7
+ TemplateRegistry,
8
+ } from '../../schemas/BlockTemplates.js';
9
+ import type { CustomTemplateDefinition } from '../../schemas/CustomTemplates.js';
10
+ import { makeCustomTemplateFn } from './customTemplate.js';
11
+
12
+ import { titleBlock } from './titleBlock.js';
13
+ import { sectionHeader } from './sectionHeader.js';
14
+ import { statHighlight } from './statHighlight.js';
15
+ import { quoteBlock } from './quoteBlock.js';
16
+ import { factCard } from './factCard.js';
17
+ import { twoColumn } from './twoColumn.js';
18
+ import { dateEvent } from './dateEvent.js';
19
+ import { imageWithCaption } from './imageWithCaption.js';
20
+ import { leftFeature, rightFeature } from './featureBlock.js';
21
+ import { mapBlock } from './mapBlock.js';
22
+ import { fullBleedQuote } from './fullBleedQuote.js';
23
+ import { listBlock } from './listBlock.js';
24
+ import { photoGrid } from './photoGrid.js';
25
+ import { definitionCard } from './definitionCard.js';
26
+ import { comparisonBar } from './comparisonBar.js';
27
+ import { pullQuote } from './pullQuote.js';
28
+ import { videoWithCaption } from './videoWithCaption.js';
29
+ import { videoPullQuote } from './videoPullQuote.js';
30
+ import { dataTable } from './dataTable.js';
31
+ import { diagramBlock } from './diagramBlock.js';
32
+ import { treeBlock } from './treeBlock.js';
33
+ import { timelineBlock } from './timelineBlock.js';
34
+ import { drawingBlock } from './drawingBlock.js';
35
+ import { layoutBlock } from './layoutBlock.js';
36
+
37
+ /** Built-in templates keyed by the ids used in document annotations. */
38
+ export const templateRegistry: TemplateRegistry = {
39
+ title: titleBlock,
40
+ sectionHeader,
41
+ statHighlight,
42
+ quote: quoteBlock,
43
+ factCard,
44
+ twoColumn,
45
+ dateEvent,
46
+ imageWithCaption,
47
+ leftFeature,
48
+ rightFeature,
49
+ map: mapBlock,
50
+ fullBleedQuote,
51
+ list: listBlock,
52
+ photoGrid,
53
+ definitionCard,
54
+ comparisonBar,
55
+ pullQuote,
56
+ videoWithCaption,
57
+ videoPullQuote,
58
+ dataTable,
59
+ diagram: diagramBlock,
60
+ tree: treeBlock,
61
+ timeline: timelineBlock,
62
+ layout: layoutBlock,
63
+ drawing: drawingBlock,
64
+ };
65
+
66
+ /** Broad runtime view used after a template name has selected its function. */
67
+ export type RuntimeTemplateRegistry = Record<
68
+ string,
69
+ (input: TemplateBlock, context: TemplateContext) => Layer[]
70
+ >;
71
+
72
+ /** Merge document-scoped templates without mutating the built-in registry. */
73
+ export function buildRegistry(
74
+ custom?: readonly CustomTemplateDefinition[],
75
+ ): RuntimeTemplateRegistry {
76
+ const merged: RuntimeTemplateRegistry = {
77
+ ...(templateRegistry as unknown as RuntimeTemplateRegistry),
78
+ };
79
+ if (custom) {
80
+ for (const definition of custom) {
81
+ if (merged[definition.name]) continue;
82
+ merged[definition.name] = makeCustomTemplateFn(
83
+ definition,
84
+ ) as unknown as RuntimeTemplateRegistry[string];
85
+ }
86
+ }
87
+ return merged;
88
+ }
@@ -0,0 +1,22 @@
1
+ /** Canonical aliases for historical template ids. Kept dependency-free. */
2
+ export const TEMPLATE_ALIASES: Readonly<Record<string, string>> = Object.freeze({
3
+ titleBlock: 'title',
4
+ quoteBlock: 'quote',
5
+ mapBlock: 'map',
6
+ listBlock: 'list',
7
+ diagramBlock: 'diagram',
8
+ diagramNode: 'diagram',
9
+ });
10
+
11
+ /** Resolve a historical template id to its canonical registry key. */
12
+ export function resolveTemplateName(name: string): string {
13
+ return TEMPLATE_ALIASES[name] ?? name;
14
+ }
15
+
16
+ /** Templates that consume their child headings rather than rendering them. */
17
+ export const CONTAINER_TEMPLATES: ReadonlySet<string> = new Set(['diagram', 'drawing', 'layout']);
18
+
19
+ /** True when `name` (or its alias) consumes child blocks. */
20
+ export function isContainerTemplate(name: string | undefined): boolean {
21
+ return !!name && CONTAINER_TEMPLATES.has(resolveTemplateName(name));
22
+ }