@bendyline/squisq 0.1.2 → 1.0.1

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 (328) hide show
  1. package/dist/{themeLibrary-DySHPcgj.d.ts → Doc-1hmT1LZl.d.ts} +1 -42
  2. package/dist/__tests__/animationUtils.test.d.ts +2 -0
  3. package/dist/__tests__/animationUtils.test.d.ts.map +1 -0
  4. package/dist/__tests__/animationUtils.test.js +60 -0
  5. package/dist/__tests__/animationUtils.test.js.map +1 -0
  6. package/dist/__tests__/contentExtractor.test.d.ts +2 -0
  7. package/dist/__tests__/contentExtractor.test.d.ts.map +1 -0
  8. package/dist/__tests__/contentExtractor.test.js +151 -0
  9. package/dist/__tests__/contentExtractor.test.js.map +1 -0
  10. package/dist/__tests__/geohash.test.d.ts +2 -0
  11. package/dist/__tests__/geohash.test.d.ts.map +1 -0
  12. package/dist/__tests__/geohash.test.js +87 -0
  13. package/dist/__tests__/geohash.test.js.map +1 -0
  14. package/dist/__tests__/getLayers.test.d.ts +2 -0
  15. package/dist/__tests__/getLayers.test.d.ts.map +1 -0
  16. package/dist/__tests__/getLayers.test.js +167 -0
  17. package/dist/__tests__/getLayers.test.js.map +1 -0
  18. package/dist/__tests__/haversine.test.d.ts +2 -0
  19. package/dist/__tests__/haversine.test.d.ts.map +1 -0
  20. package/dist/__tests__/haversine.test.js +56 -0
  21. package/dist/__tests__/haversine.test.js.map +1 -0
  22. package/dist/__tests__/localForageAdapter.test.d.ts +8 -0
  23. package/dist/__tests__/localForageAdapter.test.d.ts.map +1 -0
  24. package/dist/__tests__/localForageAdapter.test.js +130 -0
  25. package/dist/__tests__/localForageAdapter.test.js.map +1 -0
  26. package/dist/__tests__/markdown.test.d.ts +2 -0
  27. package/dist/__tests__/markdown.test.d.ts.map +1 -0
  28. package/dist/__tests__/markdown.test.js +654 -0
  29. package/dist/__tests__/markdown.test.js.map +1 -0
  30. package/dist/__tests__/markdownToDoc.test.d.ts +2 -0
  31. package/dist/__tests__/markdownToDoc.test.d.ts.map +1 -0
  32. package/dist/__tests__/markdownToDoc.test.js +313 -0
  33. package/dist/__tests__/markdownToDoc.test.js.map +1 -0
  34. package/dist/__tests__/seededRandom.test.d.ts +2 -0
  35. package/dist/__tests__/seededRandom.test.d.ts.map +1 -0
  36. package/dist/__tests__/seededRandom.test.js +125 -0
  37. package/dist/__tests__/seededRandom.test.js.map +1 -0
  38. package/dist/__tests__/slideshowGenerator.test.d.ts +2 -0
  39. package/dist/__tests__/slideshowGenerator.test.d.ts.map +1 -0
  40. package/dist/__tests__/slideshowGenerator.test.js +114 -0
  41. package/dist/__tests__/slideshowGenerator.test.js.map +1 -0
  42. package/dist/__tests__/storage.test.d.ts +2 -0
  43. package/dist/__tests__/storage.test.d.ts.map +1 -0
  44. package/dist/__tests__/storage.test.js +51 -0
  45. package/dist/__tests__/storage.test.js.map +1 -0
  46. package/dist/__tests__/templates.test.d.ts +2 -0
  47. package/dist/__tests__/templates.test.d.ts.map +1 -0
  48. package/dist/__tests__/templates.test.js +217 -0
  49. package/dist/__tests__/templates.test.js.map +1 -0
  50. package/dist/__tests__/timing.test.d.ts +2 -0
  51. package/dist/__tests__/timing.test.d.ts.map +1 -0
  52. package/dist/__tests__/timing.test.js +131 -0
  53. package/dist/__tests__/timing.test.js.map +1 -0
  54. package/dist/chunk-3E5F2XMR.js +129 -0
  55. package/dist/chunk-3E5F2XMR.js.map +1 -0
  56. package/dist/chunk-6YJPI6VI.js +35 -0
  57. package/dist/chunk-6YJPI6VI.js.map +1 -0
  58. package/dist/chunk-FVTQSNR7.js +100 -0
  59. package/dist/chunk-FVTQSNR7.js.map +1 -0
  60. package/dist/chunk-V543AI2F.js +1 -0
  61. package/dist/chunk-V543AI2F.js.map +1 -0
  62. package/dist/chunk-VP5SZTZ2.js +792 -0
  63. package/dist/chunk-VP5SZTZ2.js.map +1 -0
  64. package/dist/doc/docToMarkdown.d.ts +41 -0
  65. package/dist/doc/docToMarkdown.d.ts.map +1 -0
  66. package/dist/doc/docToMarkdown.js +88 -0
  67. package/dist/doc/docToMarkdown.js.map +1 -0
  68. package/dist/doc/getLayers.d.ts +65 -0
  69. package/dist/doc/getLayers.d.ts.map +1 -0
  70. package/dist/doc/getLayers.js +103 -0
  71. package/dist/doc/getLayers.js.map +1 -0
  72. package/dist/doc/index.d.ts +9 -3
  73. package/dist/doc/index.d.ts.map +1 -0
  74. package/dist/doc/index.js +6 -125
  75. package/dist/doc/index.js.map +1 -1
  76. package/dist/doc/markdownToDoc.d.ts +68 -0
  77. package/dist/doc/markdownToDoc.d.ts.map +1 -0
  78. package/dist/doc/markdownToDoc.js +225 -0
  79. package/dist/doc/markdownToDoc.js.map +1 -0
  80. package/dist/doc/templates/accentImage.d.ts +59 -0
  81. package/dist/doc/templates/accentImage.d.ts.map +1 -0
  82. package/dist/doc/templates/accentImage.js +275 -0
  83. package/dist/doc/templates/accentImage.js.map +1 -0
  84. package/dist/doc/templates/captionUtils.d.ts +20 -0
  85. package/dist/doc/templates/captionUtils.d.ts.map +1 -0
  86. package/dist/doc/templates/captionUtils.js +29 -0
  87. package/dist/doc/templates/captionUtils.js.map +1 -0
  88. package/dist/doc/templates/comparisonBar.d.ts +13 -0
  89. package/dist/doc/templates/comparisonBar.d.ts.map +1 -0
  90. package/dist/doc/templates/comparisonBar.js +127 -0
  91. package/dist/doc/templates/comparisonBar.js.map +1 -0
  92. package/dist/doc/templates/coverBlock.d.ts +51 -0
  93. package/dist/doc/templates/coverBlock.d.ts.map +1 -0
  94. package/dist/doc/templates/coverBlock.js +125 -0
  95. package/dist/doc/templates/coverBlock.js.map +1 -0
  96. package/dist/doc/templates/dateEvent.d.ts +15 -0
  97. package/dist/doc/templates/dateEvent.d.ts.map +1 -0
  98. package/dist/doc/templates/dateEvent.js +110 -0
  99. package/dist/doc/templates/dateEvent.js.map +1 -0
  100. package/dist/doc/templates/definitionCard.d.ts +13 -0
  101. package/dist/doc/templates/definitionCard.d.ts.map +1 -0
  102. package/dist/doc/templates/definitionCard.js +114 -0
  103. package/dist/doc/templates/definitionCard.js.map +1 -0
  104. package/dist/doc/templates/factCard.d.ts +15 -0
  105. package/dist/doc/templates/factCard.d.ts.map +1 -0
  106. package/dist/doc/templates/factCard.js +100 -0
  107. package/dist/doc/templates/factCard.js.map +1 -0
  108. package/dist/doc/templates/fullBleedQuote.d.ts +13 -0
  109. package/dist/doc/templates/fullBleedQuote.d.ts.map +1 -0
  110. package/dist/doc/templates/fullBleedQuote.js +54 -0
  111. package/dist/doc/templates/fullBleedQuote.js.map +1 -0
  112. package/dist/doc/templates/imageWithCaption.d.ts +13 -0
  113. package/dist/doc/templates/imageWithCaption.d.ts.map +1 -0
  114. package/dist/doc/templates/imageWithCaption.js +142 -0
  115. package/dist/doc/templates/imageWithCaption.js.map +1 -0
  116. package/dist/doc/templates/index.d.ts +104 -0
  117. package/dist/doc/templates/index.d.ts.map +1 -0
  118. package/dist/doc/templates/index.js +442 -0
  119. package/dist/doc/templates/index.js.map +1 -0
  120. package/dist/doc/templates/listBlock.d.ts +13 -0
  121. package/dist/doc/templates/listBlock.d.ts.map +1 -0
  122. package/dist/doc/templates/listBlock.js +89 -0
  123. package/dist/doc/templates/listBlock.js.map +1 -0
  124. package/dist/doc/templates/mapBlock.d.ts +17 -0
  125. package/dist/doc/templates/mapBlock.d.ts.map +1 -0
  126. package/dist/doc/templates/mapBlock.js +112 -0
  127. package/dist/doc/templates/mapBlock.js.map +1 -0
  128. package/dist/doc/templates/persistentLayers.d.ts +39 -0
  129. package/dist/doc/templates/persistentLayers.d.ts.map +1 -0
  130. package/dist/doc/templates/persistentLayers.js +447 -0
  131. package/dist/doc/templates/persistentLayers.js.map +1 -0
  132. package/dist/doc/templates/photoGrid.d.ts +20 -0
  133. package/dist/doc/templates/photoGrid.d.ts.map +1 -0
  134. package/dist/doc/templates/photoGrid.js +172 -0
  135. package/dist/doc/templates/photoGrid.js.map +1 -0
  136. package/dist/doc/templates/pullQuote.d.ts +13 -0
  137. package/dist/doc/templates/pullQuote.d.ts.map +1 -0
  138. package/dist/doc/templates/pullQuote.js +109 -0
  139. package/dist/doc/templates/pullQuote.js.map +1 -0
  140. package/dist/doc/templates/quoteBlock.d.ts +15 -0
  141. package/dist/doc/templates/quoteBlock.d.ts.map +1 -0
  142. package/dist/doc/templates/quoteBlock.js +97 -0
  143. package/dist/doc/templates/quoteBlock.js.map +1 -0
  144. package/dist/doc/templates/sectionHeader.d.ts +14 -0
  145. package/dist/doc/templates/sectionHeader.d.ts.map +1 -0
  146. package/dist/doc/templates/sectionHeader.js +96 -0
  147. package/dist/doc/templates/sectionHeader.js.map +1 -0
  148. package/dist/doc/templates/statHighlight.d.ts +15 -0
  149. package/dist/doc/templates/statHighlight.d.ts.map +1 -0
  150. package/dist/doc/templates/statHighlight.js +99 -0
  151. package/dist/doc/templates/statHighlight.js.map +1 -0
  152. package/dist/doc/templates/titleBlock.d.ts +13 -0
  153. package/dist/doc/templates/titleBlock.d.ts.map +1 -0
  154. package/dist/doc/templates/titleBlock.js +92 -0
  155. package/dist/doc/templates/titleBlock.js.map +1 -0
  156. package/dist/doc/templates/twoColumn.d.ts +15 -0
  157. package/dist/doc/templates/twoColumn.d.ts.map +1 -0
  158. package/dist/doc/templates/twoColumn.js +219 -0
  159. package/dist/doc/templates/twoColumn.js.map +1 -0
  160. package/dist/doc/templates/videoPullQuote.d.ts +20 -0
  161. package/dist/doc/templates/videoPullQuote.d.ts.map +1 -0
  162. package/dist/doc/templates/videoPullQuote.js +118 -0
  163. package/dist/doc/templates/videoPullQuote.js.map +1 -0
  164. package/dist/doc/templates/videoWithCaption.d.ts +20 -0
  165. package/dist/doc/templates/videoWithCaption.d.ts.map +1 -0
  166. package/dist/doc/templates/videoWithCaption.js +104 -0
  167. package/dist/doc/templates/videoWithCaption.js.map +1 -0
  168. package/dist/doc/utils/animationUtils.d.ts +34 -0
  169. package/dist/doc/utils/animationUtils.d.ts.map +1 -0
  170. package/dist/doc/utils/animationUtils.js +110 -0
  171. package/dist/doc/utils/animationUtils.js.map +1 -0
  172. package/dist/doc/utils/themeUtils.d.ts +55 -0
  173. package/dist/doc/utils/themeUtils.d.ts.map +1 -0
  174. package/dist/doc/utils/themeUtils.js +109 -0
  175. package/dist/doc/utils/themeUtils.js.map +1 -0
  176. package/dist/generate/contentExtractor.d.ts +112 -0
  177. package/dist/generate/contentExtractor.d.ts.map +1 -0
  178. package/dist/generate/contentExtractor.js +638 -0
  179. package/dist/generate/contentExtractor.js.map +1 -0
  180. package/dist/generate/index.d.ts +7 -0
  181. package/dist/generate/index.d.ts.map +1 -0
  182. package/dist/generate/index.js +4 -0
  183. package/dist/generate/index.js.map +1 -0
  184. package/dist/generate/slideshowGenerator.d.ts +72 -0
  185. package/dist/generate/slideshowGenerator.d.ts.map +1 -0
  186. package/dist/generate/slideshowGenerator.js +159 -0
  187. package/dist/generate/slideshowGenerator.js.map +1 -0
  188. package/dist/generate/templateMapper.d.ts +23 -0
  189. package/dist/generate/templateMapper.d.ts.map +1 -0
  190. package/dist/generate/templateMapper.js +114 -0
  191. package/dist/generate/templateMapper.js.map +1 -0
  192. package/dist/index.d.ts +9 -8
  193. package/dist/index.d.ts.map +1 -0
  194. package/dist/index.js +8 -216
  195. package/dist/index.js.map +1 -1
  196. package/dist/markdown/convert.d.ts +71 -0
  197. package/dist/markdown/convert.d.ts.map +1 -0
  198. package/dist/markdown/convert.js +746 -0
  199. package/dist/markdown/convert.js.map +1 -0
  200. package/dist/markdown/htmlParse.d.ts +26 -0
  201. package/dist/markdown/htmlParse.d.ts.map +1 -0
  202. package/dist/markdown/htmlParse.js +195 -0
  203. package/dist/markdown/htmlParse.js.map +1 -0
  204. package/dist/markdown/index.d.ts +19 -225
  205. package/dist/markdown/index.d.ts.map +1 -0
  206. package/dist/markdown/index.js +33 -32
  207. package/dist/markdown/index.js.map +1 -1
  208. package/dist/markdown/parse.d.ts +27 -0
  209. package/dist/markdown/parse.d.ts.map +1 -0
  210. package/dist/markdown/parse.js +90 -0
  211. package/dist/markdown/parse.js.map +1 -0
  212. package/dist/markdown/stringify.d.ts +32 -0
  213. package/dist/markdown/stringify.d.ts.map +1 -0
  214. package/dist/markdown/stringify.js +108 -0
  215. package/dist/markdown/stringify.js.map +1 -0
  216. package/dist/markdown/types.d.ts +496 -0
  217. package/dist/markdown/types.d.ts.map +1 -0
  218. package/dist/markdown/types.js +17 -0
  219. package/dist/markdown/types.js.map +1 -0
  220. package/dist/markdown/utils.d.ts +78 -0
  221. package/dist/markdown/utils.d.ts.map +1 -0
  222. package/dist/markdown/utils.js +149 -0
  223. package/dist/markdown/utils.js.map +1 -0
  224. package/dist/random/SeededRandom.d.ts +50 -0
  225. package/dist/random/SeededRandom.d.ts.map +1 -0
  226. package/dist/random/SeededRandom.js +115 -0
  227. package/dist/random/SeededRandom.js.map +1 -0
  228. package/dist/random/index.d.ts +2 -0
  229. package/dist/random/index.d.ts.map +1 -0
  230. package/dist/random/index.js +2 -0
  231. package/dist/random/index.js.map +1 -0
  232. package/dist/schemas/BlockTemplates.d.ts +583 -0
  233. package/dist/schemas/BlockTemplates.d.ts.map +1 -0
  234. package/dist/schemas/BlockTemplates.js +72 -0
  235. package/dist/schemas/BlockTemplates.js.map +1 -0
  236. package/dist/schemas/Doc.d.ts +411 -0
  237. package/dist/schemas/Doc.d.ts.map +1 -0
  238. package/dist/schemas/Doc.js +90 -0
  239. package/dist/schemas/Doc.js.map +1 -0
  240. package/dist/schemas/LayoutStrategy.d.ts +84 -0
  241. package/dist/schemas/LayoutStrategy.d.ts.map +1 -0
  242. package/dist/schemas/LayoutStrategy.js +123 -0
  243. package/dist/schemas/LayoutStrategy.js.map +1 -0
  244. package/dist/schemas/MediaProvider.d.ts +65 -0
  245. package/dist/schemas/MediaProvider.d.ts.map +1 -0
  246. package/dist/schemas/MediaProvider.js +13 -0
  247. package/dist/schemas/MediaProvider.js.map +1 -0
  248. package/dist/schemas/Theme.d.ts +163 -0
  249. package/dist/schemas/Theme.d.ts.map +1 -0
  250. package/dist/schemas/Theme.js +62 -0
  251. package/dist/schemas/Theme.js.map +1 -0
  252. package/dist/schemas/Types.d.ts +14 -0
  253. package/dist/schemas/Types.d.ts.map +1 -0
  254. package/dist/schemas/Types.js +5 -0
  255. package/dist/schemas/Types.js.map +1 -0
  256. package/dist/schemas/Viewport.d.ts +74 -0
  257. package/dist/schemas/Viewport.d.ts.map +1 -0
  258. package/dist/schemas/Viewport.js +63 -0
  259. package/dist/schemas/Viewport.js.map +1 -0
  260. package/dist/schemas/index.d.ts +10 -70
  261. package/dist/schemas/index.d.ts.map +1 -0
  262. package/dist/schemas/index.js +7 -60
  263. package/dist/schemas/index.js.map +1 -1
  264. package/dist/schemas/themeLibrary.d.ts +41 -0
  265. package/dist/schemas/themeLibrary.d.ts.map +1 -0
  266. package/dist/schemas/themeLibrary.js +466 -0
  267. package/dist/schemas/themeLibrary.js.map +1 -0
  268. package/dist/spatial/Geohash.d.ts +85 -0
  269. package/dist/spatial/Geohash.d.ts.map +1 -0
  270. package/dist/spatial/Geohash.js +142 -0
  271. package/dist/spatial/Geohash.js.map +1 -0
  272. package/dist/spatial/Haversine.d.ts +24 -0
  273. package/dist/spatial/Haversine.d.ts.map +1 -0
  274. package/dist/spatial/Haversine.js +48 -0
  275. package/dist/spatial/Haversine.js.map +1 -0
  276. package/dist/spatial/index.d.ts +3 -111
  277. package/dist/spatial/index.d.ts.map +1 -0
  278. package/dist/spatial/index.js +2 -24
  279. package/dist/spatial/index.js.map +1 -1
  280. package/dist/storage/LocalForageAdapter.d.ts +36 -0
  281. package/dist/storage/LocalForageAdapter.d.ts.map +1 -0
  282. package/dist/storage/LocalForageAdapter.js +82 -0
  283. package/dist/storage/LocalForageAdapter.js.map +1 -0
  284. package/dist/storage/LocalStorageAdapter.d.ts +16 -0
  285. package/dist/storage/LocalStorageAdapter.d.ts.map +1 -0
  286. package/dist/storage/LocalStorageAdapter.js +50 -0
  287. package/dist/storage/LocalStorageAdapter.js.map +1 -0
  288. package/dist/storage/MemoryStorageAdapter.d.ts +15 -0
  289. package/dist/storage/MemoryStorageAdapter.d.ts.map +1 -0
  290. package/dist/storage/MemoryStorageAdapter.js +34 -0
  291. package/dist/storage/MemoryStorageAdapter.js.map +1 -0
  292. package/dist/storage/Storage.d.ts +23 -0
  293. package/dist/storage/Storage.d.ts.map +1 -0
  294. package/dist/storage/Storage.js +9 -0
  295. package/dist/storage/Storage.js.map +1 -0
  296. package/dist/storage/index.d.ts +6 -91
  297. package/dist/storage/index.d.ts.map +1 -0
  298. package/dist/storage/index.js +3 -10
  299. package/dist/storage/index.js.map +1 -1
  300. package/dist/story/index.d.ts +3 -2
  301. package/dist/themeLibrary-DR1VRo-8.d.ts +44 -0
  302. package/dist/timing/index.d.ts +4 -0
  303. package/dist/timing/index.d.ts.map +1 -0
  304. package/dist/timing/index.js +3 -0
  305. package/dist/timing/index.js.map +1 -0
  306. package/dist/timing/narrationTiming.d.ts +54 -0
  307. package/dist/timing/narrationTiming.d.ts.map +1 -0
  308. package/dist/timing/narrationTiming.js +190 -0
  309. package/dist/timing/narrationTiming.js.map +1 -0
  310. package/dist/timing/readingTime.d.ts +54 -0
  311. package/dist/timing/readingTime.d.ts.map +1 -0
  312. package/dist/timing/readingTime.js +49 -0
  313. package/dist/timing/readingTime.js.map +1 -0
  314. package/package.json +17 -3
  315. package/src/__tests__/contentExtractor.test.ts +183 -0
  316. package/src/__tests__/seededRandom.test.ts +142 -0
  317. package/src/__tests__/slideshowGenerator.test.ts +128 -0
  318. package/src/__tests__/timing.test.ts +167 -0
  319. package/src/generate/contentExtractor.ts +808 -0
  320. package/src/generate/index.ts +21 -0
  321. package/src/generate/slideshowGenerator.ts +273 -0
  322. package/src/generate/templateMapper.ts +170 -0
  323. package/src/index.ts +3 -0
  324. package/src/random/SeededRandom.ts +127 -0
  325. package/src/random/index.ts +1 -0
  326. package/src/timing/index.ts +17 -0
  327. package/src/timing/narrationTiming.ts +220 -0
  328. package/src/timing/readingTime.ts +94 -0
@@ -0,0 +1,442 @@
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
+ import { isTemplateBlock, createTemplateContext } from '../../schemas/BlockTemplates.js';
14
+ import { DEFAULT_THEME as defaultTheme } from '../../schemas/themeLibrary.js';
15
+ import { expandPersistentLayers } from './persistentLayers.js';
16
+ import { VIEWPORT_PRESETS } from '../../schemas/Viewport.js';
17
+ // Import all template functions
18
+ import { titleBlock } from './titleBlock.js';
19
+ import { sectionHeader } from './sectionHeader.js';
20
+ import { statHighlight } from './statHighlight.js';
21
+ import { quoteBlock } from './quoteBlock.js';
22
+ import { factCard } from './factCard.js';
23
+ import { twoColumn } from './twoColumn.js';
24
+ import { dateEvent } from './dateEvent.js';
25
+ import { imageWithCaption } from './imageWithCaption.js';
26
+ import { mapBlock } from './mapBlock.js';
27
+ import { fullBleedQuote } from './fullBleedQuote.js';
28
+ import { listBlock } from './listBlock.js';
29
+ import { photoGrid } from './photoGrid.js';
30
+ import { definitionCard } from './definitionCard.js';
31
+ import { comparisonBar } from './comparisonBar.js';
32
+ import { pullQuote } from './pullQuote.js';
33
+ import { videoWithCaption } from './videoWithCaption.js';
34
+ import { videoPullQuote } from './videoPullQuote.js';
35
+ /**
36
+ * Registry mapping template names to their implementation functions.
37
+ * Note: coverBlock is not in the registry as it's used directly for start blocks,
38
+ * not as a regular template in the block sequence.
39
+ */
40
+ export const templateRegistry = {
41
+ titleBlock,
42
+ sectionHeader,
43
+ statHighlight,
44
+ quoteBlock,
45
+ factCard,
46
+ twoColumn,
47
+ dateEvent,
48
+ imageWithCaption,
49
+ mapBlock,
50
+ fullBleedQuote,
51
+ listBlock,
52
+ photoGrid,
53
+ definitionCard,
54
+ comparisonBar,
55
+ pullQuote,
56
+ videoWithCaption,
57
+ videoPullQuote,
58
+ };
59
+ /**
60
+ * Expand a template block into a full Block with layers.
61
+ */
62
+ export function expandTemplateBlock(templateBlock, context) {
63
+ const templateFn = templateRegistry[templateBlock.template];
64
+ if (!templateFn) {
65
+ console.warn(`Unknown template: ${templateBlock.template}`);
66
+ // Return block with no layers
67
+ return {
68
+ id: templateBlock.id,
69
+ startTime: 0,
70
+ duration: templateBlock.duration,
71
+ audioSegment: templateBlock.audioSegment,
72
+ transition: templateBlock.transition,
73
+ template: templateBlock.template, // Preserve for debugging
74
+ };
75
+ }
76
+ // Generate layers from template with error handling
77
+ let layers;
78
+ try {
79
+ // Each registry entry accepts its specific TemplateBlock variant; the
80
+ // discriminated union guarantees the shapes match at runtime.
81
+ layers = templateFn(templateBlock, context);
82
+ if (!Array.isArray(layers)) {
83
+ console.error(`Template ${templateBlock.template} did not return an array, got:`, typeof layers);
84
+ layers = [];
85
+ }
86
+ }
87
+ catch (err) {
88
+ console.error(`Error expanding template ${templateBlock.template}:`, err);
89
+ layers = [];
90
+ }
91
+ return {
92
+ id: templateBlock.id,
93
+ startTime: 0, // Will be calculated later
94
+ duration: templateBlock.duration,
95
+ audioSegment: templateBlock.audioSegment,
96
+ ...(layers.length > 0 ? { layers } : {}),
97
+ transition: templateBlock.transition,
98
+ template: templateBlock.template, // Preserve for debugging
99
+ };
100
+ }
101
+ /**
102
+ * Expand all template blocks in a doc, calculating start times.
103
+ * Injects persistent layers (bottom/top) based on per-block flags.
104
+ *
105
+ * When audioSegments is provided, blocks are timed relative to their audio segment's
106
+ * start time, ensuring blocks appear when their audio is playing. Blocks within each
107
+ * segment are distributed proportionally across the segment duration.
108
+ *
109
+ * @param blocks - Array of template or raw blocks
110
+ * @param options - Expansion options including theme, viewport, and persistent layers
111
+ */
112
+ export function expandDocBlocks(blocks, options = {}) {
113
+ const opts = options;
114
+ const theme = opts.theme ?? defaultTheme;
115
+ const viewport = opts.viewport ?? VIEWPORT_PRESETS.landscape;
116
+ const { persistentLayers, audioSegments } = opts;
117
+ const totalBlocks = blocks.length;
118
+ // Pre-expand persistent layers once
119
+ const bottomLayers = expandPersistentLayers(persistentLayers?.bottomLayers);
120
+ const topLayers = expandPersistentLayers(persistentLayers?.topLayers);
121
+ // If no audio segments provided, use simple cumulative timing
122
+ if (!audioSegments || audioSegments.length === 0) {
123
+ let currentTime = 0;
124
+ return blocks.map((block, index) => {
125
+ const context = createTemplateContext(theme, index, totalBlocks, viewport);
126
+ const expandedBlock = isTemplateBlock(block)
127
+ ? expandTemplateBlock(block, context)
128
+ : block;
129
+ // Inject persistent layers
130
+ const templateBlock = block;
131
+ const useBottom = templateBlock.useBottomLayer !== false;
132
+ const useTop = templateBlock.useTopLayer !== false;
133
+ if (bottomLayers.length > 0 || topLayers.length > 0) {
134
+ expandedBlock.layers = [
135
+ ...(useBottom ? bottomLayers : []),
136
+ ...(expandedBlock.layers ?? []),
137
+ ...(useTop ? topLayers : []),
138
+ ];
139
+ }
140
+ expandedBlock.startTime = currentTime;
141
+ currentTime += expandedBlock.duration;
142
+ return expandedBlock;
143
+ });
144
+ }
145
+ // Group blocks by their audioSegment index
146
+ const blocksBySegment = new Map();
147
+ blocks.forEach((block, index) => {
148
+ const segmentIndex = block.audioSegment ?? 0;
149
+ if (!blocksBySegment.has(segmentIndex)) {
150
+ blocksBySegment.set(segmentIndex, []);
151
+ }
152
+ blocksBySegment.get(segmentIndex).push({ block, originalIndex: index });
153
+ });
154
+ // Expand blocks, timing them relative to their audio segment
155
+ const expandedBlocks = new Array(blocks.length);
156
+ for (const [segmentIndex, segmentBlocks] of blocksBySegment) {
157
+ const audioSegment = audioSegments[segmentIndex];
158
+ if (!audioSegment) {
159
+ // No audio segment info - use simple sequential timing within the segment
160
+ let offsetTime = 0;
161
+ for (const { block, originalIndex } of segmentBlocks) {
162
+ const context = createTemplateContext(theme, originalIndex, totalBlocks, viewport);
163
+ const expandedBlock = isTemplateBlock(block)
164
+ ? expandTemplateBlock(block, context)
165
+ : block;
166
+ const templateBlock = block;
167
+ const useBottom = templateBlock.useBottomLayer !== false;
168
+ const useTop = templateBlock.useTopLayer !== false;
169
+ if (bottomLayers.length > 0 || topLayers.length > 0) {
170
+ expandedBlock.layers = [
171
+ ...(useBottom ? bottomLayers : []),
172
+ ...(expandedBlock.layers ?? []),
173
+ ...(useTop ? topLayers : []),
174
+ ];
175
+ }
176
+ expandedBlock.startTime = offsetTime;
177
+ offsetTime += expandedBlock.duration;
178
+ expandedBlocks[originalIndex] = expandedBlock;
179
+ }
180
+ continue;
181
+ }
182
+ // Section headers (sectionHeader template) get their original duration since
183
+ // the title is spoken at the start of the segment. Other blocks are scaled
184
+ // to fill the remaining time.
185
+ const sectionHeaderBlocks = [];
186
+ const contentBlocks = [];
187
+ for (const item of segmentBlocks) {
188
+ const templateBlock = item.block;
189
+ if (templateBlock.template === 'sectionHeader') {
190
+ sectionHeaderBlocks.push(item);
191
+ }
192
+ else {
193
+ contentBlocks.push(item);
194
+ }
195
+ }
196
+ // Calculate fixed duration (section headers) and scalable duration (content)
197
+ const fixedDuration = sectionHeaderBlocks.reduce((sum, { block }) => {
198
+ return sum + (block.duration ?? 0);
199
+ }, 0);
200
+ const contentBlockDuration = contentBlocks.reduce((sum, { block }) => {
201
+ return sum + (block.duration ?? 0);
202
+ }, 0);
203
+ // Remaining time after section header(s) for content blocks
204
+ const remainingDuration = audioSegment.duration - fixedDuration;
205
+ // Scale factor only applies to content blocks
206
+ const scaleFactor = contentBlockDuration > 0 && remainingDuration > 0
207
+ ? remainingDuration / contentBlockDuration
208
+ : 1;
209
+ const expandedInfos = [];
210
+ for (const { block, originalIndex } of segmentBlocks) {
211
+ const context = createTemplateContext(theme, originalIndex, totalBlocks, viewport);
212
+ const expandedBlock = isTemplateBlock(block)
213
+ ? expandTemplateBlock(block, context)
214
+ : block;
215
+ const templateBlock = block;
216
+ const useBottom = templateBlock.useBottomLayer !== false;
217
+ const useTop = templateBlock.useTopLayer !== false;
218
+ if (bottomLayers.length > 0 || topLayers.length > 0) {
219
+ expandedBlock.layers = [
220
+ ...(useBottom ? bottomLayers : []),
221
+ ...(expandedBlock.layers ?? []),
222
+ ...(useTop ? topLayers : []),
223
+ ];
224
+ }
225
+ expandedInfos.push({
226
+ block: expandedBlock,
227
+ originalIndex,
228
+ templateBlock,
229
+ hasSourceTiming: typeof templateBlock.sourceStartTime === 'number',
230
+ });
231
+ }
232
+ // Sort blocks within this segment.
233
+ // When ANY block has source timing (from audio analysis), section headers
234
+ // are placed first since they are intro cards for the segment. When there
235
+ // is no source timing (e.g., preview/synthetic mode), keep original
236
+ // document order so the slideshow matches what the author wrote.
237
+ const hasAnySourceTiming = expandedInfos.some((info) => info.hasSourceTiming);
238
+ expandedInfos.sort((a, b) => {
239
+ if (hasAnySourceTiming) {
240
+ const aIsHeader = a.templateBlock.template === 'sectionHeader';
241
+ const bIsHeader = b.templateBlock.template === 'sectionHeader';
242
+ // Section headers come first when we have audio-based timing
243
+ if (aIsHeader && !bIsHeader)
244
+ return -1;
245
+ if (!aIsHeader && bIsHeader)
246
+ return 1;
247
+ // Both have source timing - sort by time
248
+ if (a.hasSourceTiming && b.hasSourceTiming) {
249
+ return a.templateBlock.sourceStartTime - b.templateBlock.sourceStartTime;
250
+ }
251
+ // One has timing, one doesn't - timing comes first
252
+ if (a.hasSourceTiming && !b.hasSourceTiming)
253
+ return -1;
254
+ if (!a.hasSourceTiming && b.hasSourceTiming)
255
+ return 1;
256
+ }
257
+ // Keep original document order
258
+ return a.originalIndex - b.originalIndex;
259
+ });
260
+ // Second pass: assign start times
261
+ // Slides with sourceStartTime use that; others fill gaps
262
+ let offsetWithinSegment = 0;
263
+ for (let i = 0; i < expandedInfos.length; i++) {
264
+ const info = expandedInfos[i];
265
+ const { block: expandedBlock, templateBlock } = info;
266
+ // Use source timing if available, otherwise use sequential offset
267
+ if (info.hasSourceTiming) {
268
+ // Use the source timing - this is when the content is spoken
269
+ const sourceStart = templateBlock.sourceStartTime;
270
+ expandedBlock.startTime = audioSegment.startTime + sourceStart;
271
+ // Use source duration if available, otherwise use block duration
272
+ if (typeof templateBlock.sourceDuration === 'number') {
273
+ expandedBlock.duration = Math.max(5, templateBlock.sourceDuration);
274
+ }
275
+ // Update offset for next block
276
+ offsetWithinSegment = sourceStart + expandedBlock.duration;
277
+ }
278
+ else if (templateBlock.template === 'sectionHeader') {
279
+ // Section headers start at the beginning of the segment
280
+ expandedBlock.startTime = audioSegment.startTime + offsetWithinSegment;
281
+ offsetWithinSegment += expandedBlock.duration;
282
+ }
283
+ else {
284
+ // No source timing - place after previous block
285
+ expandedBlock.startTime = audioSegment.startTime + offsetWithinSegment;
286
+ // Scale content block duration to fit
287
+ const scaledDuration = expandedBlock.duration * scaleFactor;
288
+ expandedBlock.duration = scaledDuration;
289
+ offsetWithinSegment += scaledDuration;
290
+ }
291
+ expandedBlocks[info.originalIndex] = expandedBlock;
292
+ }
293
+ // Third pass: fix overlaps and gaps by adjusting durations
294
+ // Sort by startTime for overlap detection
295
+ const segmentExpandedBlocks = expandedInfos
296
+ .map((info) => expandedBlocks[info.originalIndex])
297
+ .sort((a, b) => a.startTime - b.startTime);
298
+ for (let i = 0; i < segmentExpandedBlocks.length - 1; i++) {
299
+ const current = segmentExpandedBlocks[i];
300
+ const next = segmentExpandedBlocks[i + 1];
301
+ const currentEnd = current.startTime + current.duration;
302
+ if (currentEnd > next.startTime) {
303
+ // Overlap - shorten current block to end when next begins
304
+ current.duration = next.startTime - current.startTime;
305
+ }
306
+ else if (currentEnd < next.startTime - 0.5) {
307
+ // Gap > 0.5s - extend current block to fill (visual continuity)
308
+ // Same formula as overlap: snap to next block start
309
+ current.duration = Math.max(0.1, next.startTime - current.startTime);
310
+ }
311
+ }
312
+ // Minimum gap between any two transitions (including section boundaries).
313
+ // No block should be visible for less than this before a transition occurs.
314
+ const MIN_TRANSITION_GAP = 5;
315
+ const segmentEnd = audioSegment.startTime + audioSegment.duration;
316
+ // Fourth pass: enforce minimum transition gap at section boundary.
317
+ // Eliminate blocks from the end that would start within MIN_TRANSITION_GAP
318
+ // of the section end (creating a jarring transition right before the next
319
+ // section header). Loop to handle cascading eliminations.
320
+ while (segmentExpandedBlocks.length > 1) {
321
+ const lastBlock = segmentExpandedBlocks[segmentExpandedBlocks.length - 1];
322
+ const timeFromLastToEnd = segmentEnd - lastBlock.startTime;
323
+ if (timeFromLastToEnd < MIN_TRANSITION_GAP && lastBlock.template !== 'sectionHeader') {
324
+ const prevBlock = segmentExpandedBlocks[segmentExpandedBlocks.length - 2];
325
+ prevBlock.duration = segmentEnd - prevBlock.startTime;
326
+ lastBlock.duration = 0;
327
+ lastBlock.startTime = segmentEnd;
328
+ segmentExpandedBlocks.pop();
329
+ }
330
+ else {
331
+ // Extend last block to fill to segment end
332
+ if (lastBlock.startTime + lastBlock.duration < segmentEnd) {
333
+ lastBlock.duration = segmentEnd - lastBlock.startTime;
334
+ }
335
+ break;
336
+ }
337
+ }
338
+ // Handle single-block segment
339
+ if (segmentExpandedBlocks.length === 1) {
340
+ const onlyBlock = segmentExpandedBlocks[0];
341
+ if (onlyBlock.startTime + onlyBlock.duration < segmentEnd) {
342
+ onlyBlock.duration = segmentEnd - onlyBlock.startTime;
343
+ }
344
+ }
345
+ // Fifth pass: eliminate any remaining blocks shorter than MIN_TRANSITION_GAP.
346
+ // Walk backwards and merge short blocks into their predecessor.
347
+ // Skip index 0 (first block, typically section header) to preserve segment start.
348
+ let changed = true;
349
+ while (changed) {
350
+ changed = false;
351
+ for (let i = segmentExpandedBlocks.length - 1; i >= 1; i--) {
352
+ const block = segmentExpandedBlocks[i];
353
+ if (block.duration > 0 && block.duration < MIN_TRANSITION_GAP) {
354
+ const prev = segmentExpandedBlocks[i - 1];
355
+ const blockEnd = block.startTime + block.duration;
356
+ prev.duration = blockEnd - prev.startTime;
357
+ block.duration = 0;
358
+ block.startTime = segmentEnd;
359
+ segmentExpandedBlocks.splice(i, 1);
360
+ changed = true;
361
+ break; // Restart loop after modification
362
+ }
363
+ }
364
+ }
365
+ // Sixth pass: split blocks that are too long (>20s)
366
+ // This ensures no single block lingers for too long
367
+ const MAX_BLOCK_DURATION = 20;
368
+ for (let i = 0; i < segmentExpandedBlocks.length; i++) {
369
+ const block = segmentExpandedBlocks[i];
370
+ if (block.duration > MAX_BLOCK_DURATION) {
371
+ // Calculate how many parts we need
372
+ const numParts = Math.ceil(block.duration / MAX_BLOCK_DURATION);
373
+ const partDuration = block.duration / numParts;
374
+ // Only split if each part would meet minimum transition gap
375
+ if (partDuration >= MIN_TRANSITION_GAP) {
376
+ // Shorten original block to first part
377
+ block.duration = partDuration;
378
+ // Create additional blocks for remaining parts
379
+ for (let p = 1; p < numParts; p++) {
380
+ const splitBlock = {
381
+ id: `${block.id}-split-${p}`,
382
+ startTime: block.startTime + p * partDuration,
383
+ duration: partDuration,
384
+ audioSegment: block.audioSegment,
385
+ layers: (block.layers ?? []).map((layer) => ({
386
+ ...layer,
387
+ id: `${layer.id}-split-${p}`,
388
+ })),
389
+ transition: { type: 'dissolve', duration: 1.0 },
390
+ template: block.template,
391
+ };
392
+ // Insert into expanded blocks array
393
+ expandedBlocks.push(splitBlock);
394
+ }
395
+ }
396
+ }
397
+ }
398
+ }
399
+ // Filter out zero-duration blocks (eliminated in earlier passes)
400
+ return expandedBlocks.filter((block) => block && block.duration > 0);
401
+ }
402
+ /**
403
+ * Get list of available template names.
404
+ */
405
+ export function getAvailableTemplates() {
406
+ return Object.keys(templateRegistry);
407
+ }
408
+ /**
409
+ * Check if a template exists.
410
+ */
411
+ export function hasTemplate(name) {
412
+ return name in templateRegistry;
413
+ }
414
+ // Re-export types and utilities from schemas
415
+ export { isTemplateBlock, createTemplateContext, scaledFontSize, } from '../../schemas/BlockTemplates.js';
416
+ export { DEFAULT_THEME, resolveTheme, getAvailableThemes, getThemeSummaries, } from '../../schemas/themeLibrary.js';
417
+ // Re-export timing types (AudioSegmentTiming and ExpandDocBlocksOptions are already exported above)
418
+ export { VIEWPORT_PRESETS, getViewport, getViewportOrientation } from '../../schemas/Viewport.js';
419
+ export { getLayoutHints, getTwoColumnPositions } from '../../schemas/LayoutStrategy.js';
420
+ export { expandPersistentLayers, getDocStyleConfig } from './persistentLayers.js';
421
+ // Re-export individual templates for direct access
422
+ export { titleBlock } from './titleBlock.js';
423
+ export { sectionHeader } from './sectionHeader.js';
424
+ export { statHighlight } from './statHighlight.js';
425
+ export { quoteBlock } from './quoteBlock.js';
426
+ export { factCard } from './factCard.js';
427
+ export { twoColumn } from './twoColumn.js';
428
+ export { dateEvent } from './dateEvent.js';
429
+ export { imageWithCaption } from './imageWithCaption.js';
430
+ export { mapBlock } from './mapBlock.js';
431
+ export { coverBlock, expandCoverBlock } from './coverBlock.js';
432
+ export { fullBleedQuote } from './fullBleedQuote.js';
433
+ export { listBlock } from './listBlock.js';
434
+ export { photoGrid } from './photoGrid.js';
435
+ export { definitionCard } from './definitionCard.js';
436
+ export { comparisonBar } from './comparisonBar.js';
437
+ export { pullQuote } from './pullQuote.js';
438
+ export { videoWithCaption } from './videoWithCaption.js';
439
+ export { videoPullQuote } from './videoPullQuote.js';
440
+ // Re-export accent image utilities
441
+ export { getAccentLayout, createAccentLayers, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
442
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doc/templates/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * List Block Template
3
+ *
4
+ * Displays 3-5 items in a numbered vertical list with staggered animations.
5
+ * Good for enumerations like "things to see", "key features", or "tips".
6
+ * Supports optional accent images.
7
+ *
8
+ * This is shared code used by both site and efb-app doc renderers.
9
+ */
10
+ import type { Layer } from '../../schemas/Doc.js';
11
+ import type { ListBlockInput, TemplateContext } from '../../schemas/BlockTemplates.js';
12
+ export declare function listBlock(input: ListBlockInput, context: TemplateContext): Layer[];
13
+ //# sourceMappingURL=listBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listBlock.d.ts","sourceRoot":"","sources":["../../../src/doc/templates/listBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,KAAK,EAAE,CAqFlF"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * List Block Template
3
+ *
4
+ * Displays 3-5 items in a numbered vertical list with staggered animations.
5
+ * Good for enumerations like "things to see", "key features", or "tips".
6
+ * Supports optional accent images.
7
+ *
8
+ * This is shared code used by both site and efb-app doc renderers.
9
+ */
10
+ import { scaledFontSize } from '../../schemas/BlockTemplates.js';
11
+ import { createAccentLayers, getAccentLayout, adjustY, DEFAULT_LAYOUT } from './accentImage.js';
12
+ export function listBlock(input, context) {
13
+ const { items, title, accentImage } = input;
14
+ const { theme } = context;
15
+ // Get layout adjustments if accent image is present
16
+ const accentLayout = accentImage ? getAccentLayout(accentImage.position) : DEFAULT_LAYOUT;
17
+ const titleFontSize = scaledFontSize(44, context, true);
18
+ const itemFontSize = scaledFontSize(34, context, false);
19
+ const layers = [
20
+ // Background — gradient
21
+ {
22
+ type: 'shape',
23
+ id: 'bg',
24
+ content: {
25
+ shape: 'rect',
26
+ fill: `linear-gradient(155deg, ${theme.colors.backgroundLight} 0%, ${theme.colors.background} 100%)`,
27
+ },
28
+ position: { x: 0, y: 0, width: '100%', height: '100%' },
29
+ },
30
+ ];
31
+ // Add accent image layers
32
+ if (accentImage) {
33
+ layers.push(...createAccentLayers(accentImage, input.id));
34
+ }
35
+ // Title if provided
36
+ const startY = title ? 30 : 22;
37
+ if (title) {
38
+ layers.push({
39
+ type: 'text',
40
+ id: 'list-title',
41
+ content: {
42
+ text: title,
43
+ style: {
44
+ fontSize: titleFontSize,
45
+ fontWeight: 'bold',
46
+ color: theme.colors.text,
47
+ textAlign: 'center',
48
+ shadow: !!accentImage,
49
+ },
50
+ },
51
+ position: {
52
+ x: accentLayout.textCenterX,
53
+ y: adjustY('16%', accentLayout),
54
+ anchor: 'center',
55
+ },
56
+ animation: { type: 'fadeIn', duration: 1 },
57
+ });
58
+ }
59
+ // Calculate vertical spacing for items
60
+ const endY = 80;
61
+ const spacing = items.length > 1 ? (endY - startY) / (items.length - 1) : 0;
62
+ // List items with staggered animation
63
+ for (let i = 0; i < items.length; i++) {
64
+ const y = startY + spacing * i;
65
+ const itemText = `${i + 1}. ${items[i]}`;
66
+ layers.push({
67
+ type: 'text',
68
+ id: `item-${i}`,
69
+ content: {
70
+ text: itemText,
71
+ style: {
72
+ fontSize: itemFontSize,
73
+ color: theme.colors.text,
74
+ lineHeight: 1.4,
75
+ shadow: !!accentImage,
76
+ },
77
+ },
78
+ position: {
79
+ x: accentLayout.textCenterX,
80
+ y: adjustY(`${y}%`, accentLayout),
81
+ anchor: 'center',
82
+ width: accentLayout.textWidth,
83
+ },
84
+ animation: { type: 'fadeIn', duration: 0.8, delay: 0.3 + 0.3 * i },
85
+ });
86
+ }
87
+ return layers;
88
+ }
89
+ //# sourceMappingURL=listBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listBlock.js","sourceRoot":"","sources":["../../../src/doc/templates/listBlock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Map Block Template
3
+ *
4
+ * Full-screen geographic map with optional title and caption overlays.
5
+ * Great for establishing geographic context at the start of a doc
6
+ * or when discussing location-specific content.
7
+ * Adapts font sizes and positioning for different viewports.
8
+ *
9
+ * Map tiles are fetched from free/open-source providers.
10
+ * See docs/MAP_TILES.md for available styles and attribution requirements.
11
+ *
12
+ * This is shared code used by both site and efb-app doc renderers.
13
+ */
14
+ import type { Layer } from '../../schemas/Doc.js';
15
+ import type { MapBlockInput, TemplateContext } from '../../schemas/BlockTemplates.js';
16
+ export declare function mapBlock(input: MapBlockInput, context: TemplateContext): Layer[];
17
+ //# sourceMappingURL=mapBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapBlock.d.ts","sourceRoot":"","sources":["../../../src/doc/templates/mapBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAItF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,KAAK,EAAE,CAgHhF"}