@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 @@
1
+ {"version":3,"sources":["../src/generate/contentExtractor.ts","../src/generate/templateMapper.ts","../src/generate/slideshowGenerator.ts"],"sourcesContent":["/**\n * Content Extractor\n *\n * Pattern-based extraction of compelling content from plain text.\n * Identifies statistics, dates, quotes, comparisons, facts, impact lines,\n * lists, and definitions that can be turned into slideshow slides.\n *\n * Extraction is purely regex-based — no AI calls, no runtime costs,\n * deterministic and reproducible.\n */\n\n// ── Types ──────────────────────────────────────────────────────────\n\n/** Kinds of content the extractor recognises. */\nexport type ExtractionType =\n | 'stat'\n | 'date'\n | 'quote'\n | 'comparison'\n | 'fact'\n | 'impactLine'\n | 'list'\n | 'definition';\n\n/** An extracted content element with source position. */\nexport interface ExtractedElement {\n type: ExtractionType;\n /** Full extracted text (usually the surrounding sentence). */\n text: string;\n /** Confidence score 0–1. */\n confidence: number;\n /** Character offset in the source text. */\n sourcePosition: number;\n /** Character offset where element ends. */\n endPosition: number;\n /** Type-specific structured payload. */\n data:\n | StatData\n | DateData\n | QuoteData\n | ComparisonData\n | FactData\n | ImpactLineData\n | ListData\n | DefinitionData;\n}\n\nexport interface StatData {\n type: 'stat';\n value: string;\n unit?: string;\n description: string;\n}\n\nexport interface DateData {\n type: 'date';\n date: string;\n description: string;\n mood?: 'neutral' | 'somber' | 'celebratory';\n}\n\nexport interface QuoteData {\n type: 'quote';\n quote: string;\n attribution?: string;\n}\n\nexport interface ComparisonData {\n type: 'comparison';\n left: { label: string; sublabel?: string };\n right: { label: string; sublabel?: string };\n header?: string;\n}\n\nexport interface FactData {\n type: 'fact';\n fact: string;\n explanation?: string;\n}\n\nexport interface ImpactLineData {\n type: 'impactLine';\n text: string;\n}\n\nexport interface ListData {\n type: 'list';\n items: string[];\n title?: string;\n}\n\nexport interface DefinitionData {\n type: 'definition';\n term: string;\n definition: string;\n origin?: string;\n}\n\n/** Options for `extractContent`. */\nexport interface ExtractionOptions {\n /** Minimum confidence threshold (default: 0.3). */\n minConfidence?: number;\n /** Which types to extract (default: all). */\n types?: ExtractionType[];\n /** Maximum extractions per type (default: unlimited). */\n maxPerType?: number;\n}\n\n/** Result of `extractContent`. */\nexport interface ExtractionResult {\n elements: ExtractedElement[];\n sourceLength: number;\n stats: {\n statCount: number;\n dateCount: number;\n quoteCount: number;\n comparisonCount: number;\n factCount: number;\n impactLineCount: number;\n listCount: number;\n definitionCount: number;\n totalCount: number;\n };\n}\n\n// ── Patterns ───────────────────────────────────────────────────────\n\nconst STAT_PATTERNS = [\n /\\b(roughly |about |approximately |nearly |over |under |more than |less than )?([\\d,]+(?:\\.\\d+)?)\\s*%/gi,\n /\\b([\\d,]+(?:\\.\\d+)?)\\s*(million|billion|trillion|thousand|hundred)\\b/gi,\n /\\b([\\d,]+(?:\\.\\d+)?)\\s*(miles?|feet|ft|meters?|m|kilometers?|km|acres?|square miles?|sq mi|hectares?)\\b/gi,\n /\\b([\\d,]+(?:\\.\\d+)?)\\s*(x|times)\\b/gi,\n /\\b([$€£¥])\\s*([\\d,]+(?:\\.\\d+)?)\\s*(million|billion|thousand)?\\b/gi,\n /\\b(\\d+)(st|nd|rd|th)\\s+(largest|smallest|oldest|newest|most|least)/gi,\n];\n\nconst DATE_PATTERNS = [\n /\\b(January|February|March|April|May|June|July|August|September|October|November|December)\\s+(\\d{1,2},?\\s+)?(\\d{4})\\b/gi,\n /\\b(\\d{4})s\\b|\\b(\\d{1,2})(st|nd|rd|th)\\s+century\\b/gi,\n /\\b(from\\s+)?(\\d{4})\\s*(to|–|-|through)\\s*(\\d{4})\\b/gi,\n /\\b(in|by|since|after|before|during)\\s+(\\d{4})\\b/gi,\n];\n\nconst QUOTE_PATTERNS = [\n /\"([^\"]{15,200})\"/g,\n /\\u201c([^\\u201d]{15,200})\\u201d/g,\n /(\\w+(?:\\s+\\w+)?)\\s+(?:said|stated|wrote|noted|observed|commented),?\\s*\"([^\"]+)\"/gi,\n];\n\nconst COMPARISON_PATTERNS = [\n /from\\s+(.{2,30})\\s+to\\s+(.{2,30})/gi,\n /(.{2,30})\\s+(?:vs\\.?|versus)\\s+(.{2,30})/gi,\n /(.{2,30})\\s+compared\\s+to\\s+(.{2,30})/gi,\n];\n\nconst FACT_INDICATORS = [\n 'largest',\n 'smallest',\n 'oldest',\n 'newest',\n 'first',\n 'last',\n 'most',\n 'least',\n 'only',\n 'unique',\n 'rare',\n 'famous',\n 'important',\n 'significant',\n 'notable',\n 'remarkable',\n 'extraordinary',\n 'crucial',\n 'essential',\n 'critical',\n 'major',\n 'key',\n 'discovered',\n 'founded',\n 'established',\n 'created',\n 'built',\n 'invented',\n 'developed',\n 'introduced',\n 'pioneered',\n 'transformed',\n 'revolutionized',\n 'changed',\n 'shaped',\n];\n\nconst SOMBER_INDICATORS = [\n 'disaster',\n 'tragedy',\n 'death',\n 'died',\n 'killed',\n 'destroyed',\n 'devastated',\n 'collapsed',\n 'lost',\n 'abandoned',\n 'declined',\n 'war',\n 'battle',\n 'conflict',\n 'earthquake',\n 'fire',\n 'flood',\n];\n\nconst CELEBRATORY_INDICATORS = [\n 'celebration',\n 'victory',\n 'success',\n 'achievement',\n 'triumph',\n 'opened',\n 'completed',\n 'inaugurated',\n 'launched',\n 'won',\n 'record',\n 'breakthrough',\n 'milestone',\n 'golden',\n 'grand',\n];\n\nconst IMPACT_VERBS = [\n 'check',\n 'watch',\n 'stop',\n 'prepare',\n 'imagine',\n 'consider',\n 'look',\n 'listen',\n 'notice',\n 'remember',\n 'discover',\n 'explore',\n 'visit',\n 'try',\n 'experience',\n 'avoid',\n 'beware',\n 'enjoy',\n];\n\nconst LIST_PATTERNS = [\n /(?:including|such as|namely|like|features?|offers?)\\s+([^.]{10,150})/gi,\n /(?:three|four|five|six|several|many|various)\\s+(?:main|key|primary|notable|popular|important)?\\s*\\w+(?:\\s+\\w+)?:\\s*([^.]{10,150})/gi,\n];\n\nconst DEFINITION_PATTERNS = [\n /\\b([A-Z][a-z]+(?:\\s+[A-Z]?[a-z]+){0,3})\\s+is\\s+(?:a|an|the)\\s+([^.]{10,120})/g,\n /known\\s+as\\s+([A-Z][a-z]+(?:\\s+[A-Z]?[a-z]+){0,3}),\\s+([^.]{10,120})/gi,\n /\\b([A-Z][a-z]+(?:\\s+[A-Z]?[a-z]+){0,3})\\s+refers?\\s+to\\s+([^.]{10,120})/g,\n /called\\s+([A-Z][a-z]+(?:\\s+[A-Z]?[a-z]+){0,3}),?\\s+(?:which|meaning|a)\\s+([^.]{10,120})/gi,\n];\n\n// ── Main ───────────────────────────────────────────────────────────\n\n/**\n * Extract compelling content from plain text.\n *\n * Call `stripMarkdown(text)` first if the input contains markdown.\n */\nexport function extractContent(text: string, options: ExtractionOptions = {}): ExtractionResult {\n const {\n minConfidence = 0.3,\n types = ['stat', 'date', 'quote', 'comparison', 'fact', 'impactLine', 'list', 'definition'],\n maxPerType,\n } = options;\n\n const elements: ExtractedElement[] = [];\n\n if (types.includes('stat')) elements.push(...extractStats(text));\n if (types.includes('date')) elements.push(...extractDates(text));\n if (types.includes('quote')) elements.push(...extractQuotes(text));\n if (types.includes('comparison')) elements.push(...extractComparisons(text));\n if (types.includes('fact')) elements.push(...extractFacts(text));\n if (types.includes('impactLine')) elements.push(...extractImpactLines(text));\n if (types.includes('list')) elements.push(...extractLists(text));\n if (types.includes('definition')) elements.push(...extractDefinitions(text));\n\n let filtered = elements.filter((e) => e.confidence >= minConfidence);\n\n if (maxPerType !== undefined) {\n const byType = new Map<ExtractionType, ExtractedElement[]>();\n for (const elem of filtered) {\n const list = byType.get(elem.type) || [];\n list.push(elem);\n byType.set(elem.type, list);\n }\n filtered = [];\n for (const [, list] of byType) {\n list.sort((a, b) => b.confidence - a.confidence);\n filtered.push(...list.slice(0, maxPerType));\n }\n }\n\n filtered.sort((a, b) => a.sourcePosition - b.sourcePosition);\n filtered = deduplicateOverlapping(filtered);\n\n return {\n elements: filtered,\n sourceLength: text.length,\n stats: {\n statCount: filtered.filter((e) => e.type === 'stat').length,\n dateCount: filtered.filter((e) => e.type === 'date').length,\n quoteCount: filtered.filter((e) => e.type === 'quote').length,\n comparisonCount: filtered.filter((e) => e.type === 'comparison').length,\n factCount: filtered.filter((e) => e.type === 'fact').length,\n impactLineCount: filtered.filter((e) => e.type === 'impactLine').length,\n listCount: filtered.filter((e) => e.type === 'list').length,\n definitionCount: filtered.filter((e) => e.type === 'definition').length,\n totalCount: filtered.length,\n },\n };\n}\n\n// ── Per-type extractors ────────────────────────────────────────────\n\nfunction extractStats(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n const seen = new Set<number>();\n\n for (const pattern of STAT_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const position = match.index;\n if (seen.has(position)) continue;\n seen.add(position);\n\n const context = getSentenceContext(text, position, match[0].length);\n const value = match[0].trim();\n\n elements.push({\n type: 'stat',\n text: context.sentence,\n confidence: calculateStatConfidence(value, context.sentence),\n sourcePosition: context.start,\n endPosition: context.end,\n data: { type: 'stat', value, description: cleanDescription(context.sentence, value) },\n });\n }\n }\n return elements;\n}\n\nfunction extractDates(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n const seen = new Set<number>();\n\n for (const pattern of DATE_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const position = match.index;\n if (seen.has(position)) continue;\n seen.add(position);\n\n const context = getSentenceContext(text, position, match[0].length);\n const dateStr = match[0].trim();\n\n elements.push({\n type: 'date',\n text: context.sentence,\n confidence: calculateDateConfidence(dateStr, context.sentence),\n sourcePosition: context.start,\n endPosition: context.end,\n data: {\n type: 'date',\n date: dateStr,\n description: cleanDescription(context.sentence, dateStr),\n mood: detectMood(context.sentence),\n },\n });\n }\n }\n return elements;\n}\n\nfunction extractQuotes(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n const seen = new Set<number>();\n\n for (const pattern of QUOTE_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const position = match.index;\n if (seen.has(position)) continue;\n seen.add(position);\n\n const quote = match.length > 2 ? match[2] : match[1];\n const attribution = match.length > 2 ? match[1] : undefined;\n if (quote.length < 15 || quote.length > 200) continue;\n\n elements.push({\n type: 'quote',\n text: match[0],\n confidence: calculateQuoteConfidence(quote),\n sourcePosition: position,\n endPosition: position + match[0].length,\n data: { type: 'quote', quote: quote.trim(), attribution: attribution?.trim() },\n });\n }\n }\n return elements;\n}\n\nfunction extractComparisons(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n const seen = new Set<number>();\n\n for (const pattern of COMPARISON_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const position = match.index;\n if (seen.has(position)) continue;\n seen.add(position);\n\n const left = match[1].trim();\n const right = match[2].trim();\n if (left.length < 2 || left.length > 30) continue;\n if (right.length < 2 || right.length > 30) continue;\n\n const context = getSentenceContext(text, position, match[0].length);\n\n elements.push({\n type: 'comparison',\n text: context.sentence,\n confidence: 0.6,\n sourcePosition: context.start,\n endPosition: context.end,\n data: { type: 'comparison', left: { label: left }, right: { label: right } },\n });\n }\n }\n return elements;\n}\n\n/**\n * Iterate over sentence-like spans in the text, yielding trimmed text and\n * accurate start/end indices within the original string.\n *\n * Sentences are approximated as runs of non-[.!?] characters optionally\n * followed by [.!?] delimiters. Leading/trailing whitespace is excluded.\n */\nfunction forEachSentenceSpan(\n text: string,\n callback: (trimmed: string, start: number, end: number) => void,\n): void {\n const sentenceRegex = /[^.!?]+[.!?]*/g;\n let match: RegExpExecArray | null;\n\n while ((match = sentenceRegex.exec(text)) !== null) {\n const raw = match[0];\n const rawStart = match.index;\n const rawEnd = rawStart + raw.length;\n\n // Compute leading whitespace to exclude\n let leading = 0;\n while (leading < raw.length && /\\s/.test(raw[leading])) {\n leading++;\n }\n\n // Compute trailing whitespace or sentence-ending punctuation to exclude\n let trailing = 0;\n while (trailing < raw.length - leading && /[\\s.!?]/.test(raw[raw.length - 1 - trailing])) {\n trailing++;\n }\n\n const start = rawStart + leading;\n const end = rawEnd - trailing;\n if (end <= start) continue;\n\n const trimmed = text.slice(start, end);\n if (!trimmed) continue;\n\n callback(trimmed, start, end);\n }\n}\n\nfunction extractFacts(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n\n forEachSentenceSpan(text, (trimmed, start, end) => {\n if (trimmed.length <= 20) return;\n\n const score = scoreSentenceAsFact(trimmed);\n if (score < 0.4) return;\n\n elements.push({\n type: 'fact',\n text: trimmed,\n confidence: score,\n sourcePosition: start,\n endPosition: end,\n data: { type: 'fact', fact: trimmed },\n });\n });\n\n return elements;\n}\n\nfunction extractImpactLines(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n\n forEachSentenceSpan(text, (trimmed, start, end) => {\n if (trimmed.length < 8 || trimmed.length > 60) return;\n\n let score = 0.3;\n const lower = trimmed.toLowerCase();\n\n for (const verb of IMPACT_VERBS) {\n if (lower.startsWith(verb)) {\n score += 0.25;\n break;\n }\n }\n\n if (end < text.length && text[end] === '!') score += 0.15;\n if (trimmed.length < 30) score += 0.1;\n if (trimmed.includes(',')) score -= 0.1;\n if (/^(and|but|or|the|a|an)\\b/i.test(trimmed)) score -= 0.15;\n if (score < 0.5) return;\n\n elements.push({\n type: 'impactLine',\n text: trimmed,\n confidence: Math.min(1, score),\n sourcePosition: start,\n endPosition: end,\n data: { type: 'impactLine', text: trimmed },\n });\n });\n\n return elements;\n}\n\nfunction extractLists(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n const seen = new Set<number>();\n\n for (const pattern of LIST_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const position = match.index;\n if (seen.has(position)) continue;\n seen.add(position);\n\n const listContent = match[1].trim();\n const items = listContent\n .split(/,\\s*(?:and|or)\\s+|,\\s+|\\s+and\\s+|\\s+or\\s+/)\n .map((item) => item.trim())\n .filter((item) => item.length >= 2 && item.length <= 60);\n\n if (items.length < 3 || items.length > 5) continue;\n\n const context = getSentenceContext(text, position, match[0].length);\n\n elements.push({\n type: 'list',\n text: context.sentence,\n confidence: 0.65,\n sourcePosition: context.start,\n endPosition: context.end,\n data: { type: 'list', items },\n });\n }\n }\n return elements;\n}\n\nfunction extractDefinitions(text: string): ExtractedElement[] {\n const elements: ExtractedElement[] = [];\n const seen = new Set<number>();\n\n for (const pattern of DEFINITION_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const position = match.index;\n if (seen.has(position)) continue;\n seen.add(position);\n\n const term = match[1].trim();\n const definition = match[2].trim();\n if (term.length < 3 || term.length > 30) continue;\n if (definition.length < 10 || definition.length > 120) continue;\n\n const context = getSentenceContext(text, position, match[0].length);\n\n elements.push({\n type: 'definition',\n text: context.sentence,\n confidence: 0.6,\n sourcePosition: context.start,\n endPosition: context.end,\n data: { type: 'definition', term, definition },\n });\n }\n }\n return elements;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction getSentenceContext(\n text: string,\n matchStart: number,\n matchLength: number,\n): { sentence: string; start: number; end: number } {\n let start = matchStart;\n while (start > 0 && !/[.!?]/.test(text[start - 1])) start--;\n while (start < matchStart && /\\s/.test(text[start])) start++;\n\n let end = matchStart + matchLength;\n while (end < text.length && !/[.!?]/.test(text[end])) end++;\n if (end < text.length) end++;\n\n return { sentence: text.slice(start, end).trim(), start, end };\n}\n\nfunction calculateStatConfidence(value: string, context: string): number {\n let score = 0.5;\n if (value.includes('%')) score += 0.2;\n if (/million|billion|trillion/i.test(value)) score += 0.15;\n if (/increased|decreased|grew|dropped|rose|fell/i.test(context)) score += 0.15;\n if (context.length < 30) score -= 0.2;\n return Math.min(1, Math.max(0, score));\n}\n\nfunction calculateDateConfidence(date: string, context: string): number {\n let score = 0.5;\n if (\n /January|February|March|April|May|June|July|August|September|October|November|December/i.test(\n date,\n )\n )\n score += 0.2;\n if (/founded|established|built|opened|discovered|created/i.test(context)) score += 0.2;\n if (/happened|occurred|took place|began|ended/i.test(context)) score += 0.15;\n return Math.min(1, Math.max(0, score));\n}\n\nfunction calculateQuoteConfidence(quote: string): number {\n let score = 0.5;\n if (quote.length >= 30 && quote.length <= 150) score += 0.2;\n if (/\\b(I|we|our|my)\\b/i.test(quote)) score += 0.1;\n if (!/[.!?]$/.test(quote)) score -= 0.1;\n return Math.min(1, Math.max(0, score));\n}\n\nfunction scoreSentenceAsFact(sentence: string): number {\n let score = 0.3;\n const lower = sentence.toLowerCase();\n for (const indicator of FACT_INDICATORS) {\n if (lower.includes(indicator)) {\n score += 0.1;\n break;\n }\n }\n const properNouns = sentence.match(/\\b[A-Z][a-z]+\\b/g);\n if (properNouns && properNouns.length >= 2) score += 0.15;\n if (/\\d/.test(sentence)) score += 0.1;\n if (sentence.endsWith('?')) score -= 0.3;\n if (sentence.length > 200) score -= 0.15;\n return Math.min(1, Math.max(0, score));\n}\n\nfunction detectMood(sentence: string): 'neutral' | 'somber' | 'celebratory' {\n const lower = sentence.toLowerCase();\n for (const word of SOMBER_INDICATORS) {\n if (lower.includes(word)) return 'somber';\n }\n for (const word of CELEBRATORY_INDICATORS) {\n if (lower.includes(word)) return 'celebratory';\n }\n return 'neutral';\n}\n\nfunction cleanDescription(sentence: string, value: string): string {\n const prepositionPatterns = [\n new RegExp(`\\\\b[Ii]n\\\\s+${escapeRegex(value)}[,.]?\\\\s*`, 'g'),\n new RegExp(`\\\\b[Oo]n\\\\s+${escapeRegex(value)}[,.]?\\\\s*`, 'g'),\n new RegExp(`\\\\b[Dd]uring\\\\s+${escapeRegex(value)}[,.]?\\\\s*`, 'g'),\n new RegExp(`\\\\b[Bb]y\\\\s+${escapeRegex(value)}[,.]?\\\\s*`, 'g'),\n new RegExp(`\\\\b[Ss]ince\\\\s+${escapeRegex(value)}[,.]?\\\\s*`, 'g'),\n new RegExp(`\\\\b[Ff]rom\\\\s+${escapeRegex(value)}[,.]?\\\\s*`, 'g'),\n ];\n\n let desc = sentence;\n for (const pattern of prepositionPatterns) {\n desc = desc.replace(pattern, '');\n }\n if (desc === sentence) {\n desc = sentence.replace(value, '').trim();\n }\n\n desc = desc.replace(/^[,:\\-–—]+\\s*/, '').replace(/\\s*[,:\\-–—]+$/, '');\n desc = desc.replace(\n /\\s+(?:of|on|in|at|by|to|for|from|with|about|over|under|between|than|into|onto|upon)\\s*([,.])/gi,\n '$1',\n );\n desc = desc.replace(\n /\\s+(?:for|of|to|in|at|by|with|from|about|over|under|between|than|into|onto|upon)\\s*[.!?]?\\s*$/i,\n '.',\n );\n desc = desc.replace(/\\s{2,}/g, ' ').replace(/\\s+([,.])/g, '$1');\n desc = desc.charAt(0).toUpperCase() + desc.slice(1);\n return desc.trim();\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nconst TYPE_SPECIFICITY: Record<ExtractionType, number> = {\n stat: 5,\n date: 4,\n quote: 3,\n definition: 3,\n comparison: 2,\n list: 2,\n impactLine: 2,\n fact: 1,\n};\n\nfunction deduplicateOverlapping(elements: ExtractedElement[]): ExtractedElement[] {\n if (elements.length <= 1) return elements;\n\n const toRemove = new Set<number>();\n\n for (let i = 0; i < elements.length; i++) {\n if (toRemove.has(i)) continue;\n const a = elements[i];\n\n for (let j = i + 1; j < elements.length; j++) {\n if (toRemove.has(j)) continue;\n const b = elements[j];\n\n if (elementsOverlap(a, b)) {\n const aSpec = TYPE_SPECIFICITY[a.type];\n const bSpec = TYPE_SPECIFICITY[b.type];\n if (aSpec >= bSpec) {\n toRemove.add(j);\n } else {\n toRemove.add(i);\n break;\n }\n }\n }\n }\n\n return elements.filter((_, index) => !toRemove.has(index));\n}\n\nfunction elementsOverlap(a: ExtractedElement, b: ExtractedElement): boolean {\n if (a.sourcePosition === b.sourcePosition) return true;\n if (a.sourcePosition <= b.sourcePosition && a.endPosition >= b.endPosition) return true;\n if (b.sourcePosition <= a.sourcePosition && b.endPosition >= a.endPosition) return true;\n\n const overlapStart = Math.max(a.sourcePosition, b.sourcePosition);\n const overlapEnd = Math.min(a.endPosition, b.endPosition);\n if (overlapEnd > overlapStart) {\n const overlapLength = overlapEnd - overlapStart;\n const minLength = Math.min(a.endPosition - a.sourcePosition, b.endPosition - b.sourcePosition);\n if (overlapLength > minLength * 0.5) return true;\n }\n\n return false;\n}\n\n/**\n * Strip markdown formatting from text, returning plain prose.\n * Call this before `extractContent` if the input is markdown.\n */\nexport function stripMarkdown(markdown: string): string {\n return (\n markdown\n // Remove code blocks (before inline code)\n .replace(/```[\\s\\S]*?```/g, '')\n // Remove images (before links — `![` prefix distinguishes them)\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '')\n // Remove links, keeping text\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/__([^_]+)__/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n .replace(/`([^`]+)`/g, '$1')\n .replace(/^>\\s+/gm, '')\n .replace(/^[-*_]{3,}$/gm, '')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n );\n}\n","/**\n * Template Mapper\n *\n * Converts extracted content elements into squisq TemplateBlock inputs.\n * Each ExtractionType maps to a specific template from BlockTemplates.\n */\n\nimport type {\n ExtractedElement,\n StatData,\n DateData,\n QuoteData,\n ComparisonData,\n FactData,\n ImpactLineData,\n ListData,\n DefinitionData,\n} from './contentExtractor.js';\n\nimport type {\n StatHighlightInput,\n QuoteBlockInput,\n FactCardInput,\n TwoColumnInput,\n DateEventInput,\n FullBleedQuoteInput,\n ListBlockInput,\n DefinitionCardInput,\n TemplateBlock,\n ColorScheme,\n AccentImage,\n} from '../schemas/BlockTemplates.js';\n\n/** Options for mapping an element to a template block. */\nexport interface MapOptions {\n id: string;\n duration: number;\n audioSegment: number;\n colorScheme?: ColorScheme;\n accentImage?: AccentImage;\n sourceStartTime?: number;\n sourceDuration?: number;\n}\n\n/**\n * Convert an extracted element into the matching squisq TemplateBlock.\n */\nexport function mapElementToBlock(element: ExtractedElement, options: MapOptions): TemplateBlock {\n const base = {\n id: options.id,\n duration: options.duration,\n audioSegment: options.audioSegment,\n sourceStartTime: options.sourceStartTime,\n sourceDuration: options.sourceDuration,\n };\n\n switch (element.data.type) {\n case 'stat':\n return mapStat(element.data, base, options);\n case 'date':\n return mapDate(element.data, base, options);\n case 'quote':\n return mapQuote(element.data, base, options);\n case 'comparison':\n return mapComparison(element.data, base, options);\n case 'fact':\n return mapFact(element.data, base, options);\n case 'impactLine':\n return mapImpactLine(element.data, base, options);\n case 'list':\n return mapList(element.data, base, options);\n case 'definition':\n return mapDefinition(element.data, base, options);\n }\n}\n\n// ── Per-type mappers ───────────────────────────────────────────────\n\ntype Base = {\n id: string;\n duration: number;\n audioSegment: number;\n sourceStartTime?: number;\n sourceDuration?: number;\n};\n\nfunction mapStat(data: StatData, base: Base, opts: MapOptions): StatHighlightInput {\n return {\n ...base,\n template: 'statHighlight',\n stat: data.value,\n description: data.description,\n colorScheme: opts.colorScheme,\n accentImage: opts.accentImage,\n };\n}\n\nfunction mapDate(data: DateData, base: Base, opts: MapOptions): DateEventInput {\n return {\n ...base,\n template: 'dateEvent',\n date: data.date,\n description: data.description,\n mood: data.mood,\n accentImage: opts.accentImage,\n };\n}\n\nfunction mapQuote(data: QuoteData, base: Base, opts: MapOptions): QuoteBlockInput {\n return {\n ...base,\n template: 'quoteBlock',\n quote: data.quote,\n attribution: data.attribution,\n accentImage: opts.accentImage,\n };\n}\n\nfunction mapComparison(data: ComparisonData, base: Base, opts: MapOptions): TwoColumnInput {\n return {\n ...base,\n template: 'twoColumn',\n left: data.left,\n right: data.right,\n header: data.header,\n leftColor: opts.colorScheme,\n };\n}\n\nfunction mapFact(data: FactData, base: Base, opts: MapOptions): FactCardInput {\n return {\n ...base,\n template: 'factCard',\n fact: data.fact,\n explanation: data.explanation ?? '',\n accentImage: opts.accentImage,\n };\n}\n\nfunction mapImpactLine(data: ImpactLineData, base: Base, opts: MapOptions): FullBleedQuoteInput {\n return {\n ...base,\n template: 'fullBleedQuote',\n text: data.text,\n colorScheme: opts.colorScheme,\n };\n}\n\nfunction mapList(data: ListData, base: Base, opts: MapOptions): ListBlockInput {\n return {\n ...base,\n template: 'listBlock',\n items: data.items,\n title: data.title,\n colorScheme: opts.colorScheme,\n accentImage: opts.accentImage,\n };\n}\n\nfunction mapDefinition(data: DefinitionData, base: Base, opts: MapOptions): DefinitionCardInput {\n return {\n ...base,\n template: 'definitionCard',\n term: data.term,\n definition: data.definition,\n origin: data.origin,\n colorScheme: opts.colorScheme,\n accentImage: opts.accentImage,\n };\n}\n","/**\n * Slideshow Generator\n *\n * Turns plain text + optional images into a complete squisq `Doc`.\n *\n * Pipeline:\n * 1. Strip markdown (if needed)\n * 2. Extract compelling content (stats, dates, quotes, …)\n * 3. Estimate narration timing\n * 4. Map extractions → template blocks\n * 5. Interleave image slides\n * 6. Return a ready-to-render `Doc`\n */\n\nimport type { Doc } from '../schemas/Doc.js';\nimport type {\n TemplateBlock,\n ImageWithCaptionInput,\n TitleBlockInput,\n ColorScheme,\n AccentImage,\n AccentPosition,\n} from '../schemas/BlockTemplates.js';\nimport { extractContent, stripMarkdown } from './contentExtractor.js';\nimport { mapElementToBlock } from './templateMapper.js';\nimport { estimateNarrationDuration } from '../timing/narrationTiming.js';\nimport { SeededRandom, hashString } from '../random/SeededRandom.js';\n\n// ── Public types ───────────────────────────────────────────────────\n\n/** A Doc variant whose blocks are TemplateBlocks (no startTime required). */\nexport type SlideshowDoc = Omit<Doc, 'blocks'> & {\n blocks: TemplateBlock[];\n};\n\n/** Image metadata passed to the generator. */\nexport interface SlideshowImage {\n /** Image source path or URL. */\n src: string;\n /** Alt text for accessibility. */\n alt?: string;\n /** Photo credit. */\n credit?: string;\n /** License identifier. */\n license?: string;\n}\n\n/** Options for `generateSlideshow`. */\nexport interface SlideshowOptions {\n /** Deterministic seed (default: hash of the text). */\n seed?: number;\n /** Title slide text. Omit to skip the title slide. */\n title?: string;\n /** Subtitle for the title slide. */\n subtitle?: string;\n /** Explicit total duration in seconds. When omitted, estimated from text. */\n duration?: number;\n /** Target number of content slides (default: 5–8, auto-scaled). */\n targetSlides?: number;\n /** Color schemes to rotate (default: ['blue','green','purple','orange','red']). */\n colorSchemes?: ColorScheme[];\n /** Ambient motions to rotate on images. */\n ambientMotions?: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'>;\n /** Accent positions to rotate on text slides. */\n accentPositions?: AccentPosition[];\n /** Minimum slide duration in seconds (default: 4). */\n minSlideDuration?: number;\n /** Maximum slide duration in seconds (default: 15). */\n maxSlideDuration?: number;\n /** Theme identifier to embed in the Doc. */\n themeId?: string;\n /** Whether the input text is markdown (default: false). */\n isMarkdown?: boolean;\n /** Minimum extraction confidence (default: 0.3). */\n minConfidence?: number;\n}\n\nconst DEFAULT_COLOR_SCHEMES: ColorScheme[] = ['blue', 'green', 'purple', 'orange', 'red'];\nconst DEFAULT_AMBIENT_MOTIONS: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'> = [\n 'zoomIn',\n 'zoomOut',\n 'panLeft',\n 'panRight',\n];\nconst DEFAULT_ACCENT_POSITIONS: AccentPosition[] = ['left-strip', 'right-strip', 'bottom-strip'];\n\n// ── Main ───────────────────────────────────────────────────────────\n\n/**\n * Generate a slideshow `Doc` from text and optional images.\n *\n * ```ts\n * const doc = generateSlideshow(articleText, myImages, {\n * title: 'Mount Rainier',\n * themeId: 'documentary',\n * });\n * // doc is a complete Doc ready for DocPlayer / LinearDocView\n * ```\n */\nexport function generateSlideshow(\n text: string,\n images: SlideshowImage[] = [],\n options: SlideshowOptions = {},\n): SlideshowDoc {\n const {\n seed,\n title,\n subtitle,\n duration: explicitDuration,\n targetSlides,\n colorSchemes = DEFAULT_COLOR_SCHEMES,\n ambientMotions = DEFAULT_AMBIENT_MOTIONS,\n accentPositions = DEFAULT_ACCENT_POSITIONS,\n minSlideDuration = 4,\n maxSlideDuration = 15,\n themeId,\n isMarkdown = false,\n minConfidence = 0.3,\n } = options;\n\n const plainText = isMarkdown ? stripMarkdown(text) : text;\n const rng = new SeededRandom(seed ?? hashString(plainText));\n\n // 1. Estimate total duration\n const totalDuration = explicitDuration ?? estimateNarrationDuration(plainText);\n\n // 2. Extract compelling content\n const extraction = extractContent(plainText, { minConfidence });\n const allElements = extraction.elements;\n\n // 3. Decide slide budget\n const slideBudget = targetSlides ?? computeSlideBudget(totalDuration, allElements.length);\n\n // Allocate slots between content and images\n const imageSlotCount = images.length > 0 ? Math.max(1, Math.round(slideBudget * 0.4)) : 0;\n const contentSlotCount = Math.max(0, slideBudget - imageSlotCount - (title ? 1 : 0));\n\n // Select top elements by confidence, then restore source order\n const sorted = [...allElements].sort((a, b) => b.confidence - a.confidence);\n const selected = sorted.slice(0, contentSlotCount);\n selected.sort((a, b) => a.sourcePosition - b.sourcePosition);\n\n // 4. Build slides\n const blocks: TemplateBlock[] = [];\n let slideIndex = 0;\n let colorIdx = 0;\n let accentIdx = 0;\n\n // Determine per-slide duration\n const totalSlideCount =\n (title ? 1 : 0) + selected.length + Math.min(imageSlotCount, images.length);\n const perSlide =\n totalSlideCount > 0\n ? Math.min(maxSlideDuration, Math.max(minSlideDuration, totalDuration / totalSlideCount))\n : minSlideDuration;\n\n // Title slide\n if (title) {\n const titleBlock: TitleBlockInput = {\n id: `slide-${slideIndex++}`,\n template: 'titleBlock',\n title,\n subtitle,\n duration: Math.min(perSlide, 6),\n audioSegment: 0,\n };\n blocks.push(titleBlock);\n }\n\n // Prepare image pool for standalone + accent images\n const standaloneImages = images.slice(0, Math.min(imageSlotCount, images.length));\n const accentPool =\n images.length > standaloneImages.length ? images.slice(standaloneImages.length) : [...images]; // reuse if not enough\n\n // Interleave pattern: insert an image slide every N content slides\n const imageInterval =\n standaloneImages.length > 0\n ? Math.max(1, Math.floor(selected.length / (standaloneImages.length + 1)))\n : Infinity;\n let imgIdx = 0;\n let sinceImage = 0;\n\n for (let i = 0; i < selected.length; i++) {\n // Maybe insert a standalone image slide before this content slide\n if (sinceImage >= imageInterval && imgIdx < standaloneImages.length) {\n blocks.push(\n createImageSlide(standaloneImages[imgIdx], slideIndex++, perSlide, rng, ambientMotions),\n );\n imgIdx++;\n sinceImage = 0;\n }\n\n const element = selected[i];\n\n // Optional accent image\n let accentImage: AccentImage | undefined;\n if (accentPool.length > 0) {\n const img = accentPool[i % accentPool.length];\n accentImage = {\n src: img.src,\n alt: img.alt ?? '',\n position: accentPositions[accentIdx % accentPositions.length],\n ambientMotion: rng.pickRequired(ambientMotions),\n credit: img.credit,\n license: img.license,\n };\n accentIdx++;\n }\n\n const block = mapElementToBlock(element, {\n id: `slide-${slideIndex++}`,\n duration: perSlide,\n audioSegment: 0,\n colorScheme: colorSchemes[colorIdx % colorSchemes.length],\n accentImage,\n });\n blocks.push(block);\n colorIdx++;\n sinceImage++;\n }\n\n // Append any remaining standalone images\n while (imgIdx < standaloneImages.length) {\n blocks.push(\n createImageSlide(standaloneImages[imgIdx], slideIndex++, perSlide, rng, ambientMotions),\n );\n imgIdx++;\n }\n\n // 5. Assemble Doc\n const doc: SlideshowDoc = {\n articleId: title ?? 'slideshow',\n duration: totalDuration,\n blocks,\n audio: {\n segments: [{ src: '', name: 'main', duration: totalDuration, startTime: 0 }],\n },\n themeId,\n };\n\n return doc;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction computeSlideBudget(duration: number, elementCount: number): number {\n // Aim for ~5 slides per minute of content, clamped 3–12\n const byDuration = Math.round((duration / 60) * 5);\n // But don't exceed available elements + a few image slots\n const budget = Math.min(byDuration, elementCount + 4);\n return Math.max(3, Math.min(12, budget));\n}\n\nfunction createImageSlide(\n img: SlideshowImage,\n index: number,\n duration: number,\n rng: SeededRandom,\n motions: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'>,\n): ImageWithCaptionInput {\n return {\n id: `slide-${index}`,\n template: 'imageWithCaption',\n imageSrc: img.src,\n imageAlt: img.alt ?? '',\n caption: img.alt,\n duration,\n audioSegment: 0,\n ambientMotion: rng.pickRequired(motions),\n imageCredit: img.credit,\n imageLicense: img.license,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Doc → Markdown Conversion
3
+ *
4
+ * Converts a Doc with a heading-driven Block hierarchy back into a
5
+ * MarkdownDocument. This is the reverse of markdownToDoc() and enables
6
+ * round-tripping: edit a Doc's block tree, then serialize back to markdown.
7
+ *
8
+ * **Algorithm:**
9
+ * Walk the block tree depth-first. For each block:
10
+ * 1. If it has a `sourceHeading`, emit that heading node
11
+ * 2. Emit all nodes in `contents`
12
+ * 3. Recurse into `children`
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { markdownToDoc, docToMarkdown } from '@bendyline/squisq/doc';
17
+ * import { parseMarkdown, stringifyMarkdown } from '@bendyline/squisq/markdown';
18
+ *
19
+ * const md = '# Hello\n\nWorld\n';
20
+ * const doc = markdownToDoc(parseMarkdown(md));
21
+ * const roundTripped = stringifyMarkdown(docToMarkdown(doc));
22
+ * ```
23
+ */
24
+ import type { Doc } from '../schemas/Doc.js';
25
+ import type { MarkdownDocument } from '../markdown/types.js';
26
+ /**
27
+ * Convert a Doc with heading-driven blocks back to a MarkdownDocument.
28
+ *
29
+ * Walks the block tree depth-first, emitting heading nodes and contents
30
+ * in document order. Blocks without a `sourceHeading` (preamble blocks)
31
+ * emit only their contents.
32
+ *
33
+ * If a block has a `template` or `templateOverrides` that aren't already
34
+ * reflected in the heading's `templateAnnotation`, the annotation is
35
+ * injected so the round-trip preserves template assignments.
36
+ *
37
+ * @param doc - A Doc whose blocks may have `sourceHeading`, `contents`, and `children`
38
+ * @returns A MarkdownDocument that can be stringified back to markdown
39
+ */
40
+ export declare function docToMarkdown(doc: Doc): MarkdownDocument;
41
+ //# sourceMappingURL=docToMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docToMarkdown.d.ts","sourceRoot":"","sources":["../../src/doc/docToMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAS,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,sBAAsB,CAAC;AAEjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB,CA+BxD"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Doc → Markdown Conversion
3
+ *
4
+ * Converts a Doc with a heading-driven Block hierarchy back into a
5
+ * MarkdownDocument. This is the reverse of markdownToDoc() and enables
6
+ * round-tripping: edit a Doc's block tree, then serialize back to markdown.
7
+ *
8
+ * **Algorithm:**
9
+ * Walk the block tree depth-first. For each block:
10
+ * 1. If it has a `sourceHeading`, emit that heading node
11
+ * 2. Emit all nodes in `contents`
12
+ * 3. Recurse into `children`
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { markdownToDoc, docToMarkdown } from '@bendyline/squisq/doc';
17
+ * import { parseMarkdown, stringifyMarkdown } from '@bendyline/squisq/markdown';
18
+ *
19
+ * const md = '# Hello\n\nWorld\n';
20
+ * const doc = markdownToDoc(parseMarkdown(md));
21
+ * const roundTripped = stringifyMarkdown(docToMarkdown(doc));
22
+ * ```
23
+ */
24
+ /**
25
+ * Convert a Doc with heading-driven blocks back to a MarkdownDocument.
26
+ *
27
+ * Walks the block tree depth-first, emitting heading nodes and contents
28
+ * in document order. Blocks without a `sourceHeading` (preamble blocks)
29
+ * emit only their contents.
30
+ *
31
+ * If a block has a `template` or `templateOverrides` that aren't already
32
+ * reflected in the heading's `templateAnnotation`, the annotation is
33
+ * injected so the round-trip preserves template assignments.
34
+ *
35
+ * @param doc - A Doc whose blocks may have `sourceHeading`, `contents`, and `children`
36
+ * @returns A MarkdownDocument that can be stringified back to markdown
37
+ */
38
+ export function docToMarkdown(doc) {
39
+ const children = [];
40
+ function emitBlock(block) {
41
+ // Emit the heading node if present
42
+ if (block.sourceHeading) {
43
+ const heading = ensureAnnotation(block, block.sourceHeading);
44
+ children.push(heading);
45
+ }
46
+ // Emit body content
47
+ if (block.contents) {
48
+ children.push(...block.contents);
49
+ }
50
+ // Recurse into children (sub-headings)
51
+ if (block.children) {
52
+ for (const child of block.children) {
53
+ emitBlock(child);
54
+ }
55
+ }
56
+ }
57
+ for (const block of doc.blocks) {
58
+ emitBlock(block);
59
+ }
60
+ return {
61
+ type: 'document',
62
+ children,
63
+ };
64
+ }
65
+ /**
66
+ * Ensure the heading's `templateAnnotation` reflects the block's
67
+ * template and templateOverrides. Returns a (possibly cloned) heading.
68
+ */
69
+ function ensureAnnotation(block, heading) {
70
+ // If the heading already has an annotation, trust it (it came from parsing)
71
+ if (heading.templateAnnotation)
72
+ return heading;
73
+ // If the block has a non-default template or overrides, inject an annotation
74
+ const hasExplicitTemplate = block.template && block.template !== 'sectionHeader';
75
+ const hasOverrides = block.templateOverrides && Object.keys(block.templateOverrides).length > 0;
76
+ if (!hasExplicitTemplate && !hasOverrides)
77
+ return heading;
78
+ // Clone to avoid mutating the original
79
+ return {
80
+ ...heading,
81
+ children: [...heading.children],
82
+ templateAnnotation: {
83
+ template: block.template ?? 'sectionHeader',
84
+ ...(hasOverrides ? { params: block.templateOverrides } : {}),
85
+ },
86
+ };
87
+ }
88
+ //# sourceMappingURL=docToMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docToMarkdown.js","sourceRoot":"","sources":["../../src/doc/docToMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,SAAS,SAAS,CAAC,KAAY;QAC7B,mCAAmC;QACnC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,oBAAoB;QACpB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,uCAAuC;QACvC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAY,EAAE,OAAwB;IAC9D,4EAA4E;IAC5E,IAAI,OAAO,CAAC,kBAAkB;QAAE,OAAO,OAAO,CAAC;IAE/C,6EAA6E;IAC7E,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,eAAe,CAAC;IACjF,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhG,IAAI,CAAC,mBAAmB,IAAI,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC;IAE1D,uCAAuC;IACvC,OAAO;QACL,GAAG,OAAO;QACV,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC/B,kBAAkB,EAAE;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,eAAe;YAC3C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * getLayers — Compute visual layers for a block on demand.
3
+ *
4
+ * This is the preferred way to obtain renderable layers for a block.
5
+ * Instead of storing pre-computed layers on the Block object, call
6
+ * `getLayers(block, context)` to derive them from the block's template
7
+ * name, content, and the current render context (theme, viewport, etc.).
8
+ *
9
+ * For raw blocks that already carry a `layers` array, those layers are
10
+ * returned directly (with optional persistent layer injection).
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { getLayers } from '@bendyline/squisq/doc';
15
+ *
16
+ * const layers = getLayers(block, {
17
+ * theme: DEFAULT_THEME,
18
+ * viewport: VIEWPORT_PRESETS.landscape,
19
+ * blockIndex: 0,
20
+ * totalBlocks: 10,
21
+ * });
22
+ * ```
23
+ */
24
+ import type { Layer } from '../schemas/Doc.js';
25
+ import type { PersistentLayerConfig, DocBlock } from '../schemas/BlockTemplates.js';
26
+ import type { Theme } from '../schemas/Theme.js';
27
+ import type { ViewportConfig } from '../schemas/Viewport.js';
28
+ /**
29
+ * Context needed to compute layers for a block.
30
+ *
31
+ * Captures the visual rendering parameters: theme colors, viewport
32
+ * configuration, persistent layers, and the block's position within
33
+ * the doc (for template functions that vary output by index).
34
+ */
35
+ export interface RenderContext {
36
+ /** Theme for template rendering. Defaults to DEFAULT_THEME (documentary). */
37
+ theme?: Theme;
38
+ /** Target viewport configuration. Defaults to 16:9 landscape. */
39
+ viewport?: ViewportConfig;
40
+ /** Persistent layers injected behind and/or on top of all block content. */
41
+ persistentLayers?: PersistentLayerConfig;
42
+ /** 0-based index of this block in the sequence. Defaults to 0. */
43
+ blockIndex?: number;
44
+ /** Total number of blocks in the doc. Defaults to 1. */
45
+ totalBlocks?: number;
46
+ }
47
+ /**
48
+ * Compute the visual layers for a block.
49
+ *
50
+ * Resolution order:
51
+ * 1. If the block already has a non-empty `layers` array, use it (raw block).
52
+ * 2. If the block has a `template` name that exists in the registry,
53
+ * call the template function to generate layers.
54
+ * 3. Otherwise return an empty array.
55
+ *
56
+ * Persistent layers (bottom/top) from the render context are injected
57
+ * around the result unless the block opts out via `useBottomLayer: false`
58
+ * or `useTopLayer: false`.
59
+ *
60
+ * @param block A Block or TemplateBlock to render.
61
+ * @param context Render context (theme, viewport, persistent layers, position).
62
+ * @returns The computed Layer[] for the block, ready for BlockRenderer.
63
+ */
64
+ export declare function getLayers(block: DocBlock, context?: RenderContext): Layer[];
65
+ //# sourceMappingURL=getLayers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLayers.d.ts","sourceRoot":"","sources":["../../src/doc/getLayers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAS,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAGV,qBAAqB,EACrB,QAAQ,EACT,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAW7D;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IAEzC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,aAAkB,GAAG,KAAK,EAAE,CAuC/E"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * getLayers — Compute visual layers for a block on demand.
3
+ *
4
+ * This is the preferred way to obtain renderable layers for a block.
5
+ * Instead of storing pre-computed layers on the Block object, call
6
+ * `getLayers(block, context)` to derive them from the block's template
7
+ * name, content, and the current render context (theme, viewport, etc.).
8
+ *
9
+ * For raw blocks that already carry a `layers` array, those layers are
10
+ * returned directly (with optional persistent layer injection).
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { getLayers } from '@bendyline/squisq/doc';
15
+ *
16
+ * const layers = getLayers(block, {
17
+ * theme: DEFAULT_THEME,
18
+ * viewport: VIEWPORT_PRESETS.landscape,
19
+ * blockIndex: 0,
20
+ * totalBlocks: 10,
21
+ * });
22
+ * ```
23
+ */
24
+ import { VIEWPORT_PRESETS } from '../schemas/Viewport.js';
25
+ import { createTemplateContext, isTemplateBlock } from '../schemas/BlockTemplates.js';
26
+ import { DEFAULT_THEME } from '../schemas/themeLibrary.js';
27
+ import { templateRegistry } from './templates/index.js';
28
+ import { expandPersistentLayers } from './templates/persistentLayers.js';
29
+ // ============================================
30
+ // getLayers
31
+ // ============================================
32
+ /**
33
+ * Compute the visual layers for a block.
34
+ *
35
+ * Resolution order:
36
+ * 1. If the block already has a non-empty `layers` array, use it (raw block).
37
+ * 2. If the block has a `template` name that exists in the registry,
38
+ * call the template function to generate layers.
39
+ * 3. Otherwise return an empty array.
40
+ *
41
+ * Persistent layers (bottom/top) from the render context are injected
42
+ * around the result unless the block opts out via `useBottomLayer: false`
43
+ * or `useTopLayer: false`.
44
+ *
45
+ * @param block A Block or TemplateBlock to render.
46
+ * @param context Render context (theme, viewport, persistent layers, position).
47
+ * @returns The computed Layer[] for the block, ready for BlockRenderer.
48
+ */
49
+ export function getLayers(block, context = {}) {
50
+ const theme = context.theme ?? DEFAULT_THEME;
51
+ const viewport = context.viewport ?? VIEWPORT_PRESETS.landscape;
52
+ const blockIndex = context.blockIndex ?? 0;
53
+ const totalBlocks = context.totalBlocks ?? 1;
54
+ // 1. Raw block path: block already has pre-computed layers
55
+ const existingLayers = block.layers;
56
+ if (existingLayers && existingLayers.length > 0 && !isTemplateBlock(block)) {
57
+ return injectPersistentLayers(existingLayers, block, context);
58
+ }
59
+ // 2. Template path: look up and call the template function
60
+ if (isTemplateBlock(block) && block.template in templateRegistry) {
61
+ const templateName = block.template;
62
+ const templateCtx = createTemplateContext(theme, blockIndex, totalBlocks, viewport);
63
+ let layers;
64
+ try {
65
+ // Each registry entry accepts its specific TemplateBlock variant; the
66
+ // discriminated union guarantees the shapes match at runtime.
67
+ const templateFn = templateRegistry[templateName];
68
+ layers = templateFn(block, templateCtx);
69
+ if (!Array.isArray(layers)) {
70
+ console.error(`Template ${templateName} did not return an array, got:`, typeof layers);
71
+ layers = [];
72
+ }
73
+ }
74
+ catch (err) {
75
+ console.error(`Error expanding template ${templateName}:`, err);
76
+ layers = [];
77
+ }
78
+ return injectPersistentLayers(layers, block, context);
79
+ }
80
+ // 3. Fallback: no layers and no known template
81
+ return injectPersistentLayers([], block, context);
82
+ }
83
+ // ============================================
84
+ // Internal helpers
85
+ // ============================================
86
+ /**
87
+ * Inject persistent bottom/top layers around the block's own layers,
88
+ * respecting per-block opt-out flags.
89
+ */
90
+ function injectPersistentLayers(layers, block, context) {
91
+ const { persistentLayers } = context;
92
+ if (!persistentLayers)
93
+ return layers;
94
+ const bottomLayers = expandPersistentLayers(persistentLayers.bottomLayers);
95
+ const topLayers = expandPersistentLayers(persistentLayers.topLayers);
96
+ if (bottomLayers.length === 0 && topLayers.length === 0)
97
+ return layers;
98
+ const templateBlock = block;
99
+ const useBottom = templateBlock.useBottomLayer !== false;
100
+ const useTop = templateBlock.useTopLayer !== false;
101
+ return [...(useBottom ? bottomLayers : []), ...layers, ...(useTop ? topLayers : [])];
102
+ }
103
+ //# sourceMappingURL=getLayers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLayers.js","sourceRoot":"","sources":["../../src/doc/getLayers.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
- export { AccentLayout, AudioSegmentTiming, CoverBlockInput, DEFAULT_LAYOUT, DocStylePreset, ExpandDocBlocksOptions, MarkdownToDocOptions, RenderContext, adjustY, comparisonBar, countBlocks, coverBlock, createAccentLayers, dateEvent, definitionCard, docToMarkdown, expandCoverBlock, expandDocBlocks, expandPersistentLayers, expandTemplateBlock, factCard, flattenBlocks, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockDepth, getDefaultAnimation, getDefaultAnimationDuration, getDocStyleConfig, getLayers, getOverlayOpacity, getTemplateHint, getTransitionClass, hasTemplate, imageWithCaption, listBlock, mapBlock, markdownToDoc, photoGrid, pullQuote, quoteBlock, resolveColorScheme, scaleAnimationDuration, sectionHeader, shouldUseShadow, statHighlight, templateRegistry, themedFontSize, titleBlock, twoColumn, videoPullQuote, videoWithCaption } from '../story/index.js';
2
- export { j as DEFAULT_THEME, q as DocBlock, u as LayoutHints, E as PersistentLayerConfig, T as RenderStyle, _ as TemplateBlock, $ as TemplateContext, a4 as Theme, a5 as ThemeColorPalette, a6 as ThemeColorScheme, a7 as ThemeStyle, a8 as ThemeTypography, ae as VIEWPORT_PRESETS, ai as ViewportConfig, aj as ViewportOrientation, ak as ViewportPreset, an as createTemplateContext, aq as getAvailableThemes, at as getLayoutHints, aw as getThemeSummaries, ax as getTwoColumnPositions, ay as getViewport, az as getViewportOrientation, aB as isTemplateBlock, aD as resolveTheme, aE as scaledFontSize } from '../themeLibrary-DySHPcgj.js';
3
- import '../types-DHiv_Pnm.js';
1
+ export * from './templates/index.js';
2
+ export * from './utils/animationUtils.js';
3
+ export * from './utils/themeUtils.js';
4
+ export { markdownToDoc, flattenBlocks, countBlocks, getBlockDepth } from './markdownToDoc.js';
5
+ export type { MarkdownToDocOptions } from './markdownToDoc.js';
6
+ export { docToMarkdown } from './docToMarkdown.js';
7
+ export { getLayers } from './getLayers.js';
8
+ export type { RenderContext } from './getLayers.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doc/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/doc/index.js CHANGED
@@ -1,126 +1,7 @@
1
- import {
2
- DEFAULT_LAYOUT,
3
- adjustY,
4
- comparisonBar,
5
- countBlocks,
6
- coverBlock,
7
- createAccentLayers,
8
- dateEvent,
9
- definitionCard,
10
- docToMarkdown,
11
- expandCoverBlock,
12
- expandDocBlocks,
13
- expandPersistentLayers,
14
- expandTemplateBlock,
15
- factCard,
16
- flattenBlocks,
17
- fullBleedQuote,
18
- getAccentLayout,
19
- getAnimationProgress,
20
- getAnimationStyle,
21
- getAvailableTemplates,
22
- getBlockDepth,
23
- getDefaultAnimation,
24
- getDefaultAnimationDuration,
25
- getDocStyleConfig,
26
- getLayers,
27
- getOverlayOpacity,
28
- getTemplateHint,
29
- getTransitionClass,
30
- hasTemplate,
31
- imageWithCaption,
32
- listBlock,
33
- mapBlock,
34
- markdownToDoc,
35
- photoGrid,
36
- pullQuote,
37
- quoteBlock,
38
- resolveColorScheme,
39
- scaleAnimationDuration,
40
- sectionHeader,
41
- shouldUseShadow,
42
- statHighlight,
43
- templateRegistry,
44
- themedFontSize,
45
- titleBlock,
46
- twoColumn,
47
- videoPullQuote,
48
- videoWithCaption
49
- } from "../chunk-PJ7AODIM.js";
50
- import {
51
- DEFAULT_THEME,
52
- VIEWPORT_PRESETS,
53
- createTemplateContext,
54
- getAvailableThemes,
55
- getLayoutHints,
56
- getThemeSummaries,
57
- getTwoColumnPositions,
58
- getViewport,
59
- getViewportOrientation,
60
- isTemplateBlock,
61
- resolveTheme,
62
- scaledFontSize2 as scaledFontSize
63
- } from "../chunk-O5HCIUAD.js";
64
- import "../chunk-QWVRN6I4.js";
65
- export {
66
- DEFAULT_LAYOUT,
67
- DEFAULT_THEME,
68
- VIEWPORT_PRESETS,
69
- adjustY,
70
- comparisonBar,
71
- countBlocks,
72
- coverBlock,
73
- createAccentLayers,
74
- createTemplateContext,
75
- dateEvent,
76
- definitionCard,
77
- docToMarkdown,
78
- expandCoverBlock,
79
- expandDocBlocks,
80
- expandPersistentLayers,
81
- expandTemplateBlock,
82
- factCard,
83
- flattenBlocks,
84
- fullBleedQuote,
85
- getAccentLayout,
86
- getAnimationProgress,
87
- getAnimationStyle,
88
- getAvailableTemplates,
89
- getAvailableThemes,
90
- getBlockDepth,
91
- getDefaultAnimation,
92
- getDefaultAnimationDuration,
93
- getDocStyleConfig,
94
- getLayers,
95
- getLayoutHints,
96
- getOverlayOpacity,
97
- getTemplateHint,
98
- getThemeSummaries,
99
- getTransitionClass,
100
- getTwoColumnPositions,
101
- getViewport,
102
- getViewportOrientation,
103
- hasTemplate,
104
- imageWithCaption,
105
- isTemplateBlock,
106
- listBlock,
107
- mapBlock,
108
- markdownToDoc,
109
- photoGrid,
110
- pullQuote,
111
- quoteBlock,
112
- resolveColorScheme,
113
- resolveTheme,
114
- scaleAnimationDuration,
115
- scaledFontSize,
116
- sectionHeader,
117
- shouldUseShadow,
118
- statHighlight,
119
- templateRegistry,
120
- themedFontSize,
121
- titleBlock,
122
- twoColumn,
123
- videoPullQuote,
124
- videoWithCaption
125
- };
1
+ export * from './templates/index.js';
2
+ export * from './utils/animationUtils.js';
3
+ export * from './utils/themeUtils.js';
4
+ export { markdownToDoc, flattenBlocks, countBlocks, getBlockDepth } from './markdownToDoc.js';
5
+ export { docToMarkdown } from './docToMarkdown.js';
6
+ export { getLayers } from './getLayers.js';
126
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doc/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}