@bendyline/squisq 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +24 -0
  3. package/README.md +8 -8
  4. package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
  5. package/dist/{Doc-DynJleo-.d.ts → Doc-COe-rPQB.d.ts} +7 -5
  6. package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-dtKahVyD.d.ts} +1 -1
  7. package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
  8. package/dist/{chunk-VWCJ2WXC.js → chunk-2ZWIXGAC.js} +0 -1
  9. package/dist/{chunk-VYFRI7R6.js → chunk-32R2RZAO.js} +72 -3
  10. package/dist/chunk-3IGPAPQ7.js +645 -0
  11. package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
  12. package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
  13. package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
  14. package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
  15. package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
  16. package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
  17. package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
  18. package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
  19. package/dist/chunk-BCCXTMN5.js +699 -0
  20. package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
  21. package/dist/{chunk-XNLB57UD.js → chunk-EK446BUE.js} +18 -2
  22. package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
  23. package/dist/{chunk-JI77MGAK.js → chunk-GIIOY6XR.js} +2178 -1291
  24. package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
  25. package/dist/chunk-OPO5K4DZ.js +241 -0
  26. package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
  27. package/dist/{chunk-OTKVFVL6.js → chunk-QNTQIEIV.js} +130 -47
  28. package/dist/{chunk-5UYI3RJB.js → chunk-QWCFK5FN.js} +55 -40
  29. package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
  30. package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
  31. package/dist/{chunk-QUUPYOSP.js → chunk-SPTY4C6F.js} +136 -5
  32. package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
  33. package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
  34. package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
  35. package/dist/doc/index.d.ts +311 -13
  36. package/dist/doc/index.js +25 -17
  37. package/dist/generate/index.d.ts +2 -2
  38. package/dist/generate/index.js +1 -3
  39. package/dist/icons/index.js +2 -4
  40. package/dist/icons/inlineIconMarker.js +1 -2
  41. package/dist/imageEdit/index.d.ts +48 -17
  42. package/dist/imageEdit/index.js +3 -4
  43. package/dist/index.d.ts +13 -13
  44. package/dist/index.js +67 -33
  45. package/dist/jsonForm/index.d.ts +10 -3
  46. package/dist/jsonForm/index.js +8 -7
  47. package/dist/markdown/index.d.ts +75 -11
  48. package/dist/markdown/index.js +32 -7
  49. package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-BSMOocve.d.ts} +2 -2
  50. package/dist/narration/index.d.ts +16 -3
  51. package/dist/narration/index.js +12 -14
  52. package/dist/random/index.d.ts +11 -2
  53. package/dist/random/index.js +1 -3
  54. package/dist/recommend/index.d.ts +1 -1
  55. package/dist/recommend/index.js +2 -4
  56. package/dist/schemas/index.d.ts +18 -6
  57. package/dist/schemas/index.js +7 -6
  58. package/dist/spatial/index.d.ts +2 -1
  59. package/dist/spatial/index.js +1 -2
  60. package/dist/storage/index.d.ts +4 -2
  61. package/dist/storage/index.js +1 -2
  62. package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-BUTWjufL.d.ts} +1 -1
  63. package/dist/timing/index.js +2 -4
  64. package/dist/transform/index.d.ts +3 -3
  65. package/dist/transform/index.js +6 -7
  66. package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
  67. package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
  68. package/dist/versions/index.d.ts +14 -11
  69. package/dist/versions/index.js +2 -3
  70. package/package.json +8 -3
  71. package/dist/chunk-2UQOHYE2.js.map +0 -1
  72. package/dist/chunk-3E5F2XMR.js.map +0 -1
  73. package/dist/chunk-4X3JQXNM.js.map +0 -1
  74. package/dist/chunk-5DKBFXPY.js.map +0 -1
  75. package/dist/chunk-5J4HKRJF.js.map +0 -1
  76. package/dist/chunk-5UYI3RJB.js.map +0 -1
  77. package/dist/chunk-66QO7XFB.js.map +0 -1
  78. package/dist/chunk-AMIR72JP.js +0 -380
  79. package/dist/chunk-AMIR72JP.js.map +0 -1
  80. package/dist/chunk-DBS6RIFL.js.map +0 -1
  81. package/dist/chunk-DNJKBAI7.js +0 -1
  82. package/dist/chunk-DNJKBAI7.js.map +0 -1
  83. package/dist/chunk-ET53IIEP.js +0 -1
  84. package/dist/chunk-ET53IIEP.js.map +0 -1
  85. package/dist/chunk-FVTQSNR7.js.map +0 -1
  86. package/dist/chunk-GZY66SDN.js.map +0 -1
  87. package/dist/chunk-ILWDXLUK.js.map +0 -1
  88. package/dist/chunk-JHZWYRSW.js.map +0 -1
  89. package/dist/chunk-JI77MGAK.js.map +0 -1
  90. package/dist/chunk-JOQYPRDZ.js.map +0 -1
  91. package/dist/chunk-OTKVFVL6.js.map +0 -1
  92. package/dist/chunk-PGGGKYWG.js +0 -1
  93. package/dist/chunk-PGGGKYWG.js.map +0 -1
  94. package/dist/chunk-Q7LROV2H.js.map +0 -1
  95. package/dist/chunk-QE7TWGVT.js.map +0 -1
  96. package/dist/chunk-QUUPYOSP.js.map +0 -1
  97. package/dist/chunk-R2GC6RLD.js +0 -344
  98. package/dist/chunk-R2GC6RLD.js.map +0 -1
  99. package/dist/chunk-R2YZTCLO.js.map +0 -1
  100. package/dist/chunk-S7A5D7ZJ.js +0 -174
  101. package/dist/chunk-S7A5D7ZJ.js.map +0 -1
  102. package/dist/chunk-TUWMK62B.js.map +0 -1
  103. package/dist/chunk-V543AI2F.js +0 -1
  104. package/dist/chunk-V543AI2F.js.map +0 -1
  105. package/dist/chunk-VR7UPJ7C.js.map +0 -1
  106. package/dist/chunk-VWCJ2WXC.js.map +0 -1
  107. package/dist/chunk-VYFRI7R6.js.map +0 -1
  108. package/dist/chunk-XNLB57UD.js.map +0 -1
  109. package/dist/chunk-ZLQKNOZQ.js +0 -1
  110. package/dist/chunk-ZLQKNOZQ.js.map +0 -1
  111. package/dist/doc/index.js.map +0 -1
  112. package/dist/generate/index.js.map +0 -1
  113. package/dist/icons/index.js.map +0 -1
  114. package/dist/icons/inlineIconMarker.js.map +0 -1
  115. package/dist/imageEdit/index.js.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/jsonForm/index.js.map +0 -1
  118. package/dist/markdown/index.js.map +0 -1
  119. package/dist/narration/index.js.map +0 -1
  120. package/dist/random/index.js.map +0 -1
  121. package/dist/recommend/index.js.map +0 -1
  122. package/dist/schemas/index.js.map +0 -1
  123. package/dist/spatial/index.js.map +0 -1
  124. package/dist/storage/index.js.map +0 -1
  125. package/dist/timing/index.js.map +0 -1
  126. package/dist/transform/index.js.map +0 -1
  127. package/dist/versions/index.js.map +0 -1
  128. package/src/__tests__/animationUtils.test.ts +0 -117
  129. package/src/__tests__/annotationCoercion.test.ts +0 -243
  130. package/src/__tests__/applyNarrationTiming.test.ts +0 -190
  131. package/src/__tests__/applyRenderStyle.test.ts +0 -146
  132. package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
  133. package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
  134. package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
  135. package/src/__tests__/asciiDiagramParse.test.ts +0 -233
  136. package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
  137. package/src/__tests__/asciiDiagramRender.test.ts +0 -162
  138. package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
  139. package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
  140. package/src/__tests__/asciiTimelineParse.test.ts +0 -205
  141. package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
  142. package/src/__tests__/asciiTimelineRender.test.ts +0 -376
  143. package/src/__tests__/atmosphereLayers.test.ts +0 -108
  144. package/src/__tests__/attrTokens.test.ts +0 -167
  145. package/src/__tests__/colorUtils.test.ts +0 -112
  146. package/src/__tests__/contentContainer.test.ts +0 -325
  147. package/src/__tests__/contentExtractor.test.ts +0 -243
  148. package/src/__tests__/coverBlock.test.ts +0 -310
  149. package/src/__tests__/customTemplateSample.test.ts +0 -144
  150. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
  151. package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
  152. package/src/__tests__/dataTable.test.ts +0 -145
  153. package/src/__tests__/diagramBlock.test.ts +0 -122
  154. package/src/__tests__/diagramLayout.test.ts +0 -134
  155. package/src/__tests__/diagramText.test.ts +0 -26
  156. package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
  157. package/src/__tests__/drawing.test.ts +0 -109
  158. package/src/__tests__/drawingBlock.test.ts +0 -124
  159. package/src/__tests__/drawingLayout.test.ts +0 -171
  160. package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
  161. package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
  162. package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
  163. package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
  164. package/src/__tests__/geohash.test.ts +0 -110
  165. package/src/__tests__/getLayers.test.ts +0 -243
  166. package/src/__tests__/getLayersFallback.test.ts +0 -103
  167. package/src/__tests__/haversine.test.ts +0 -63
  168. package/src/__tests__/iconResolve.test.ts +0 -122
  169. package/src/__tests__/imageEditExportSvg.test.ts +0 -70
  170. package/src/__tests__/imageEditState.test.ts +0 -74
  171. package/src/__tests__/imageEditVersions.test.ts +0 -243
  172. package/src/__tests__/inferDocumentTitle.test.ts +0 -50
  173. package/src/__tests__/inlineIconMarker.test.ts +0 -36
  174. package/src/__tests__/inputDescriptors.test.ts +0 -162
  175. package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
  176. package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
  177. package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
  178. package/src/__tests__/jsonForm.pointer.test.ts +0 -149
  179. package/src/__tests__/jsonForm.tokens.test.ts +0 -84
  180. package/src/__tests__/layoutBlock.test.ts +0 -83
  181. package/src/__tests__/layoutLayout.test.ts +0 -169
  182. package/src/__tests__/localForageAdapter.test.ts +0 -155
  183. package/src/__tests__/majorApiTypes.test.ts +0 -18
  184. package/src/__tests__/markdown.test.ts +0 -1009
  185. package/src/__tests__/markdownIcons.test.ts +0 -104
  186. package/src/__tests__/markdownSanitize.test.ts +0 -81
  187. package/src/__tests__/markdownToDoc.test.ts +0 -957
  188. package/src/__tests__/matchFontFamily.test.ts +0 -114
  189. package/src/__tests__/materializeBlockLayers.test.ts +0 -167
  190. package/src/__tests__/materializePageSections.test.ts +0 -404
  191. package/src/__tests__/materializeTestUtils.ts +0 -17
  192. package/src/__tests__/mediaAnnotations.test.ts +0 -91
  193. package/src/__tests__/mediaSchedule.test.ts +0 -118
  194. package/src/__tests__/narrationAlign.test.ts +0 -150
  195. package/src/__tests__/narrationFeatures.test.ts +0 -71
  196. package/src/__tests__/narrationNuclei.test.ts +0 -45
  197. package/src/__tests__/narrationPacing.test.ts +0 -189
  198. package/src/__tests__/narrationScript.test.ts +0 -149
  199. package/src/__tests__/narrationSessionRepro.test.ts +0 -62
  200. package/src/__tests__/narrationSidecar.test.ts +0 -88
  201. package/src/__tests__/narrationSyllables.test.ts +0 -65
  202. package/src/__tests__/narrationTestSignals.ts +0 -167
  203. package/src/__tests__/narrationVad.test.ts +0 -66
  204. package/src/__tests__/pageStyle.test.ts +0 -258
  205. package/src/__tests__/pandocAttrParse.test.ts +0 -187
  206. package/src/__tests__/recommendTemplates.test.ts +0 -183
  207. package/src/__tests__/resolveDocTheme.test.ts +0 -69
  208. package/src/__tests__/rootExports.test.ts +0 -61
  209. package/src/__tests__/scopedContentContainer.test.ts +0 -109
  210. package/src/__tests__/seededRandom.test.ts +0 -142
  211. package/src/__tests__/shapeGeometry.test.ts +0 -138
  212. package/src/__tests__/shapeVocabulary.test.ts +0 -133
  213. package/src/__tests__/storage.test.ts +0 -60
  214. package/src/__tests__/structuredData.test.ts +0 -249
  215. package/src/__tests__/surface.test.ts +0 -68
  216. package/src/__tests__/templateAnnotationParse.test.ts +0 -173
  217. package/src/__tests__/templateInputs.test.ts +0 -69
  218. package/src/__tests__/templateMetadata.test.ts +0 -32
  219. package/src/__tests__/templates.test.ts +0 -710
  220. package/src/__tests__/themeCompile.test.ts +0 -225
  221. package/src/__tests__/themeValidator.test.ts +0 -131
  222. package/src/__tests__/timing.test.ts +0 -167
  223. package/src/__tests__/transformProvenance.test.ts +0 -160
  224. package/src/__tests__/transformV2.test.ts +0 -163
  225. package/src/__tests__/transitionNormalize.test.ts +0 -61
  226. package/src/__tests__/treeviewBattle.test.ts +0 -76
  227. package/src/__tests__/treeviewDetect.test.ts +0 -168
  228. package/src/__tests__/treeviewParse.test.ts +0 -118
  229. package/src/__tests__/treeviewPipeline.test.ts +0 -183
  230. package/src/__tests__/treeviewRender.test.ts +0 -91
  231. package/src/__tests__/validateDoc.test.ts +0 -260
  232. package/src/__tests__/versions.test.ts +0 -459
  233. package/src/doc/annotationBlocks.ts +0 -117
  234. package/src/doc/applyNarrationTiming.ts +0 -244
  235. package/src/doc/asciiDiagram/chars.ts +0 -210
  236. package/src/doc/asciiDiagram/detect.ts +0 -175
  237. package/src/doc/asciiDiagram/index.ts +0 -38
  238. package/src/doc/asciiDiagram/mapping.ts +0 -225
  239. package/src/doc/asciiDiagram/parse.ts +0 -1095
  240. package/src/doc/asciiDiagram/render.ts +0 -963
  241. package/src/doc/asciiDiagram/repair.ts +0 -400
  242. package/src/doc/asciiDiagram/types.ts +0 -65
  243. package/src/doc/asciiTimeline/detect.ts +0 -138
  244. package/src/doc/asciiTimeline/index.ts +0 -26
  245. package/src/doc/asciiTimeline/mapping.ts +0 -43
  246. package/src/doc/asciiTimeline/parse.ts +0 -870
  247. package/src/doc/asciiTimeline/render.ts +0 -427
  248. package/src/doc/asciiTimeline/types.ts +0 -73
  249. package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
  250. package/src/doc/audioMapping.ts +0 -442
  251. package/src/doc/customTemplatesFrontmatter.ts +0 -273
  252. package/src/doc/customThemesFrontmatter.ts +0 -95
  253. package/src/doc/docToMarkdown.ts +0 -284
  254. package/src/doc/index.ts +0 -161
  255. package/src/doc/markdownToDoc.ts +0 -1054
  256. package/src/doc/materializeBlockLayers.ts +0 -465
  257. package/src/doc/mediaAnnotations.ts +0 -120
  258. package/src/doc/page/PageSection.ts +0 -174
  259. package/src/doc/page/materializePageSection.ts +0 -616
  260. package/src/doc/page/resolvePageBlock.ts +0 -108
  261. package/src/doc/page/sectionExtractors.ts +0 -466
  262. package/src/doc/pageCss.ts +0 -628
  263. package/src/doc/resolveDocTheme.ts +0 -56
  264. package/src/doc/standaloneAnnotation.ts +0 -58
  265. package/src/doc/structuredData.ts +0 -301
  266. package/src/doc/templateInputs.ts +0 -424
  267. package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
  268. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
  269. package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
  270. package/src/doc/templates/accentImage.ts +0 -362
  271. package/src/doc/templates/captionUtils.ts +0 -56
  272. package/src/doc/templates/comparisonBar.ts +0 -173
  273. package/src/doc/templates/coverBlock.ts +0 -255
  274. package/src/doc/templates/customTemplate.ts +0 -51
  275. package/src/doc/templates/dataTable.ts +0 -102
  276. package/src/doc/templates/dateEvent.ts +0 -147
  277. package/src/doc/templates/definitionCard.ts +0 -140
  278. package/src/doc/templates/diagramBlock.ts +0 -403
  279. package/src/doc/templates/diagramLayout.ts +0 -159
  280. package/src/doc/templates/drawingBlock.ts +0 -325
  281. package/src/doc/templates/drawingLayout.ts +0 -539
  282. package/src/doc/templates/factCard.ts +0 -146
  283. package/src/doc/templates/fallbackBlock.ts +0 -123
  284. package/src/doc/templates/featureBlock.ts +0 -209
  285. package/src/doc/templates/fullBleedQuote.ts +0 -83
  286. package/src/doc/templates/imageWithCaption.ts +0 -186
  287. package/src/doc/templates/index.ts +0 -642
  288. package/src/doc/templates/inputDescriptors.ts +0 -451
  289. package/src/doc/templates/layoutBlock.ts +0 -43
  290. package/src/doc/templates/layoutLayout.ts +0 -243
  291. package/src/doc/templates/listBlock.ts +0 -207
  292. package/src/doc/templates/mapBlock.ts +0 -138
  293. package/src/doc/templates/metadata.ts +0 -130
  294. package/src/doc/templates/persistentLayers.ts +0 -526
  295. package/src/doc/templates/photoGrid.ts +0 -190
  296. package/src/doc/templates/pullQuote.ts +0 -141
  297. package/src/doc/templates/quoteBlock.ts +0 -141
  298. package/src/doc/templates/registry.ts +0 -88
  299. package/src/doc/templates/sectionHeader.ts +0 -120
  300. package/src/doc/templates/statHighlight.ts +0 -146
  301. package/src/doc/templates/templateNames.ts +0 -22
  302. package/src/doc/templates/timelineBlock.ts +0 -613
  303. package/src/doc/templates/titleBlock.ts +0 -150
  304. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
  305. package/src/doc/templates/tokens/resolveTokens.ts +0 -453
  306. package/src/doc/templates/treeBlock.ts +0 -131
  307. package/src/doc/templates/twoColumn.ts +0 -263
  308. package/src/doc/templates/videoPullQuote.ts +0 -142
  309. package/src/doc/templates/videoWithCaption.ts +0 -135
  310. package/src/doc/treeview/chars.ts +0 -72
  311. package/src/doc/treeview/detect.ts +0 -145
  312. package/src/doc/treeview/index.ts +0 -30
  313. package/src/doc/treeview/mapping.ts +0 -95
  314. package/src/doc/treeview/parse.ts +0 -201
  315. package/src/doc/treeview/render.ts +0 -41
  316. package/src/doc/treeview/types.ts +0 -43
  317. package/src/doc/utils/animationUtils.ts +0 -399
  318. package/src/doc/utils/applyRenderStyle.ts +0 -106
  319. package/src/doc/utils/diagramText.ts +0 -78
  320. package/src/doc/utils/imageTreatment.ts +0 -70
  321. package/src/doc/utils/nearest.ts +0 -59
  322. package/src/doc/utils/shapeGeometry.ts +0 -614
  323. package/src/doc/utils/themeUtils.ts +0 -243
  324. package/src/doc/validate.ts +0 -575
  325. package/src/generate/contentExtractor.ts +0 -921
  326. package/src/generate/index.ts +0 -18
  327. package/src/generate/templateMapper.ts +0 -177
  328. package/src/icons/iconData.ts +0 -31
  329. package/src/icons/index.ts +0 -26
  330. package/src/icons/inlineIconMarker.ts +0 -73
  331. package/src/icons/resolve.ts +0 -139
  332. package/src/imageEdit/ImageEditVersionManager.ts +0 -73
  333. package/src/imageEdit/export.ts +0 -410
  334. package/src/imageEdit/index.ts +0 -72
  335. package/src/imageEdit/persistence.ts +0 -113
  336. package/src/imageEdit/state.ts +0 -112
  337. package/src/imageEdit/versionPaths.ts +0 -44
  338. package/src/imageEdit/versions.ts +0 -152
  339. package/src/index.ts +0 -15
  340. package/src/internal/immutable.ts +0 -58
  341. package/src/jsonForm/chooseControl.ts +0 -88
  342. package/src/jsonForm/evaluateWhen.ts +0 -59
  343. package/src/jsonForm/index.ts +0 -32
  344. package/src/jsonForm/inferSchema.ts +0 -25
  345. package/src/jsonForm/pointer.ts +0 -154
  346. package/src/jsonForm/tokens.ts +0 -78
  347. package/src/jsonForm/types.ts +0 -167
  348. package/src/markdown/annotationCoercion.ts +0 -295
  349. package/src/markdown/attrTokens.ts +0 -243
  350. package/src/markdown/convert.ts +0 -1353
  351. package/src/markdown/htmlParse.ts +0 -212
  352. package/src/markdown/index.ts +0 -152
  353. package/src/markdown/parse.ts +0 -103
  354. package/src/markdown/sanitize.ts +0 -318
  355. package/src/markdown/stringify.ts +0 -207
  356. package/src/markdown/types.ts +0 -710
  357. package/src/markdown/utils.ts +0 -459
  358. package/src/narration/align.ts +0 -514
  359. package/src/narration/features.ts +0 -231
  360. package/src/narration/index.ts +0 -86
  361. package/src/narration/nuclei.ts +0 -118
  362. package/src/narration/pacing.ts +0 -211
  363. package/src/narration/script.ts +0 -239
  364. package/src/narration/session.ts +0 -100
  365. package/src/narration/sidecar.ts +0 -187
  366. package/src/narration/syllables.ts +0 -85
  367. package/src/narration/trace.ts +0 -50
  368. package/src/narration/types.ts +0 -299
  369. package/src/narration/vad.ts +0 -131
  370. package/src/ngeohash.d.ts +0 -11
  371. package/src/random/SeededRandom.ts +0 -127
  372. package/src/random/index.ts +0 -1
  373. package/src/recommend/index.ts +0 -16
  374. package/src/recommend/numberHighlight.ts +0 -25
  375. package/src/recommend/templates.ts +0 -393
  376. package/src/schemas/BlockTemplates.ts +0 -1046
  377. package/src/schemas/CustomTemplates.ts +0 -126
  378. package/src/schemas/Doc.ts +0 -1073
  379. package/src/schemas/ImageEditDoc.ts +0 -102
  380. package/src/schemas/LayoutStrategy.ts +0 -178
  381. package/src/schemas/Media.ts +0 -179
  382. package/src/schemas/MediaProvider.ts +0 -70
  383. package/src/schemas/PageStyle.ts +0 -213
  384. package/src/schemas/Theme.ts +0 -413
  385. package/src/schemas/Transitions.ts +0 -224
  386. package/src/schemas/Types.ts +0 -15
  387. package/src/schemas/Viewport.ts +0 -91
  388. package/src/schemas/colorUtils.ts +0 -219
  389. package/src/schemas/fontStacks.ts +0 -339
  390. package/src/schemas/index.ts +0 -31
  391. package/src/schemas/pageStyleDefaults.ts +0 -204
  392. package/src/schemas/themeCompile.ts +0 -244
  393. package/src/schemas/themeConstants.ts +0 -2
  394. package/src/schemas/themeLibrary.ts +0 -60
  395. package/src/schemas/themeValidator.ts +0 -609
  396. package/src/schemas/themes/bold.json +0 -77
  397. package/src/schemas/themes/cinematic.json +0 -143
  398. package/src/schemas/themes/documentary.json +0 -125
  399. package/src/schemas/themes/gezellig.json +0 -123
  400. package/src/schemas/themes/index.ts +0 -53
  401. package/src/schemas/themes/magazine.json +0 -126
  402. package/src/schemas/themes/minimalist.json +0 -74
  403. package/src/schemas/themes/morning-light.json +0 -117
  404. package/src/schemas/themes/standard-dark.json +0 -109
  405. package/src/schemas/themes/standard.json +0 -98
  406. package/src/schemas/themes/tech-dark.json +0 -143
  407. package/src/schemas/themes/warm-earth.json +0 -74
  408. package/src/spatial/Geohash.ts +0 -196
  409. package/src/spatial/Haversine.ts +0 -59
  410. package/src/spatial/index.ts +0 -2
  411. package/src/storage/ContentContainer.ts +0 -220
  412. package/src/storage/LocalForageAdapter.ts +0 -103
  413. package/src/storage/LocalStorageAdapter.ts +0 -57
  414. package/src/storage/MediaProviderFromContainer.ts +0 -92
  415. package/src/storage/MemoryStorageAdapter.ts +0 -37
  416. package/src/storage/ScopedContentContainer.ts +0 -143
  417. package/src/storage/Storage.ts +0 -28
  418. package/src/storage/index.ts +0 -9
  419. package/src/timing/index.ts +0 -17
  420. package/src/timing/narrationTiming.ts +0 -220
  421. package/src/timing/readingTime.ts +0 -94
  422. package/src/transform/applyTransform.ts +0 -122
  423. package/src/transform/blockAnalyzer.ts +0 -181
  424. package/src/transform/index.ts +0 -23
  425. package/src/transform/registry.ts +0 -217
  426. package/src/transform/styles/dataDriven.ts +0 -18
  427. package/src/transform/styles/documentary.ts +0 -18
  428. package/src/transform/styles/index.ts +0 -5
  429. package/src/transform/styles/magazine.ts +0 -19
  430. package/src/transform/styles/minimal.ts +0 -18
  431. package/src/transform/styles/narrative.ts +0 -19
  432. package/src/transform/templateSelector.ts +0 -389
  433. package/src/transform/timingAllocator.ts +0 -257
  434. package/src/transform/types.ts +0 -158
  435. package/src/versions/DocumentVersionManager.ts +0 -70
  436. package/src/versions/gitignore.ts +0 -34
  437. package/src/versions/index.ts +0 -56
  438. package/src/versions/operations.ts +0 -144
  439. package/src/versions/paths.ts +0 -51
  440. package/src/versions/snapshotStore.ts +0 -202
  441. package/src/versions/timestamp.ts +0 -48
  442. package/src/versions/types.ts +0 -93
@@ -1,213 +0,0 @@
1
- /**
2
- * Page Style — the theme's art-direction layer for Page (linear) mode.
3
- *
4
- * Slides render through fixed-viewport SVG templates; pages render through
5
- * a small closed vocabulary of variable-height HTML section layouts
6
- * (`PageSectionKind`). A `ThemePageStyle` is how a theme art-directs that
7
- * page rendition: it picks a design family, sets page-wide tokens
8
- * (column widths, spacing, dividers, hero treatment, image framing …),
9
- * and can override how individual section kinds or block templates map
10
- * onto the section vocabulary.
11
- *
12
- * Design principles (mirrors the rest of the Theme schema):
13
- * - Fully JSON-serializable — rides the `squisq-custom-themes` frontmatter
14
- * codec unchanged.
15
- * - Closed enums everywhere so renderers can switch exhaustively and the
16
- * validator can reject typos.
17
- * - Optional on `Theme`; `resolvePageStyle`/`defaultPageStyle` derive a
18
- * complete style from existing theme fields when absent, so legacy and
19
- * customizer themes keep working without edits.
20
- */
21
-
22
- // ============================================
23
- // Section vocabulary
24
- // ============================================
25
-
26
- /**
27
- * The closed set of page section layouts. Every block template maps onto
28
- * one of these kinds (see `doc/page/sectionExtractors.ts`); themes may
29
- * remap via `ThemePageStyle.sections` / `.templates`.
30
- */
31
- export const PAGE_SECTION_KINDS = [
32
- 'hero',
33
- 'banner',
34
- 'stat-band',
35
- 'quote-band',
36
- 'feature-split',
37
- 'media-figure',
38
- 'gallery',
39
- 'callout',
40
- 'card-grid',
41
- 'item-list',
42
- 'timeline-rail',
43
- 'table-section',
44
- 'canvas-embed',
45
- 'prose',
46
- 'footer',
47
- ] as const;
48
-
49
- export type PageSectionKind = (typeof PAGE_SECTION_KINDS)[number];
50
-
51
- /** Relative visual weight of a section within the page. */
52
- export type PageEmphasis = 'lead' | 'strong' | 'standard' | 'quiet';
53
-
54
- /** Which background treatment a section sits on. */
55
- export type PageBackground = 'base' | 'alternate' | 'accent' | 'media';
56
-
57
- // ============================================
58
- // Design families + tokens
59
- // ============================================
60
-
61
- /**
62
- * Broad page design personalities. A family selects the structural
63
- * skeleton (how sections compose); tokens parameterize it per theme.
64
- */
65
- export const PAGE_DESIGN_FAMILIES = [
66
- 'clean',
67
- 'editorial',
68
- 'brutalist',
69
- 'terminal',
70
- 'cinematic',
71
- 'documentary',
72
- 'organic',
73
- 'soft',
74
- ] as const;
75
-
76
- export type PageDesignFamily = (typeof PAGE_DESIGN_FAMILIES)[number];
77
-
78
- /** How headings announce themselves across the page. */
79
- export interface PageHeadingTreatment {
80
- /** Small label above headings: none, plain kicker, "01 —" numbering, or a mono tag. */
81
- eyebrow: 'none' | 'kicker' | 'numbered' | 'mono-tag';
82
- /** Overall heading size register. */
83
- scale: 'regular' | 'display' | 'oversized';
84
- /** Optional case transform for headings/eyebrows. */
85
- case?: 'none' | 'uppercase';
86
- /** Optional decoration under headings. */
87
- underline?: 'none' | 'accent-bar' | 'full-rule';
88
- }
89
-
90
- /**
91
- * Page-wide design tokens. Structural CSS reads these via
92
- * `--squisq-page-*` custom properties (see `doc/pageCss.ts`).
93
- */
94
- export interface PageTokens {
95
- /** Reading-column max width in px (prose, callouts, quotes). */
96
- contentMaxWidth: number;
97
- /** Wide-band inner max width in px (figures, tables, feature splits). */
98
- wideMaxWidth: number;
99
- /** Vertical rhythm between sections. */
100
- sectionSpacing: 'compact' | 'comfortable' | 'generous';
101
- /** Corner radius for cards, media frames, panels (px). */
102
- cornerRadius: number;
103
- /** Divider treatment between sections. */
104
- divider: 'none' | 'gap-only' | 'hairline' | 'thick-rule' | 'double-rule' | 'dotted';
105
- /** How section backgrounds vary down the page. */
106
- backgroundRhythm: 'flat' | 'alternate' | 'accent-bands' | 'tinted-panels';
107
- /** Hero (cover/title) composition. */
108
- heroStyle: 'stacked' | 'split' | 'full-bleed' | 'letterbox' | 'oversized-type';
109
- /** Heading voice across the page. */
110
- headingTreatment: PageHeadingTreatment;
111
- /** Frame treatment for photographic media. */
112
- imageFraming: 'flush' | 'rounded' | 'bordered' | 'polaroid' | 'letterboxed' | 'circle-accent';
113
- /** Shadow language for elevated elements. */
114
- shadow: 'none' | 'soft' | 'crisp' | 'heavy';
115
- /** Decoration on quote sections. */
116
- quoteMark: 'none' | 'oversized-glyph' | 'accent-bar';
117
- /** Treatment of large stat numerals. */
118
- numeralStyle: 'plain' | 'oversized' | 'boxed' | 'mono';
119
- /** Optional page background pattern. */
120
- pattern?: 'none' | 'dots' | 'grid' | 'diagonal' | 'noise';
121
- }
122
-
123
- // ============================================
124
- // Overrides + accent rotation
125
- // ============================================
126
-
127
- /**
128
- * A theme's override for one section kind or one block template —
129
- * remap the kind, force a variant, adjust emphasis/background, or pass
130
- * freeform scalar hints the section renderer understands.
131
- */
132
- export interface PageSectionOverride {
133
- kind?: PageSectionKind;
134
- variant?: string;
135
- emphasis?: PageEmphasis;
136
- background?: PageBackground;
137
- /** Freeform scalar hints (e.g. `dropCap: true`, `frame: "terminal"`). */
138
- hints?: Record<string, string | number | boolean>;
139
- }
140
-
141
- /** How named color schemes rotate across accent-bearing sections. */
142
- export interface PageAccentRotation {
143
- strategy: 'primary-only' | 'cycle' | 'alternate-two' | 'none';
144
- /**
145
- * ColorScheme names (keys of `theme.colorSchemes`) to rotate through.
146
- * Defaults to all schemes in insertion order.
147
- */
148
- schemes?: string[];
149
- }
150
-
151
- // ============================================
152
- // ThemePageStyle
153
- // ============================================
154
-
155
- /**
156
- * The complete page art direction for a theme. Optional on `Theme`;
157
- * `defaultPageStyle(theme)` derives one from existing theme fields.
158
- */
159
- export interface ThemePageStyle {
160
- family: PageDesignFamily;
161
- tokens: PageTokens;
162
- /** Per-section-kind overrides. */
163
- sections?: Partial<Record<PageSectionKind, PageSectionOverride>>;
164
- /** Per-template overrides (canonical template ids); win over `sections`. */
165
- templates?: Record<string, PageSectionOverride>;
166
- accentRotation: PageAccentRotation;
167
- }
168
-
169
- // ============================================
170
- // Enum sets (shared by the validator + defaults)
171
- // ============================================
172
-
173
- export const PAGE_SECTION_SPACINGS = ['compact', 'comfortable', 'generous'] as const;
174
- export const PAGE_DIVIDERS = [
175
- 'none',
176
- 'gap-only',
177
- 'hairline',
178
- 'thick-rule',
179
- 'double-rule',
180
- 'dotted',
181
- ] as const;
182
- export const PAGE_BACKGROUND_RHYTHMS = [
183
- 'flat',
184
- 'alternate',
185
- 'accent-bands',
186
- 'tinted-panels',
187
- ] as const;
188
- export const PAGE_HERO_STYLES = [
189
- 'stacked',
190
- 'split',
191
- 'full-bleed',
192
- 'letterbox',
193
- 'oversized-type',
194
- ] as const;
195
- export const PAGE_EYEBROWS = ['none', 'kicker', 'numbered', 'mono-tag'] as const;
196
- export const PAGE_HEADING_SCALES = ['regular', 'display', 'oversized'] as const;
197
- export const PAGE_HEADING_CASES = ['none', 'uppercase'] as const;
198
- export const PAGE_HEADING_UNDERLINES = ['none', 'accent-bar', 'full-rule'] as const;
199
- export const PAGE_IMAGE_FRAMINGS = [
200
- 'flush',
201
- 'rounded',
202
- 'bordered',
203
- 'polaroid',
204
- 'letterboxed',
205
- 'circle-accent',
206
- ] as const;
207
- export const PAGE_SHADOWS = ['none', 'soft', 'crisp', 'heavy'] as const;
208
- export const PAGE_QUOTE_MARKS = ['none', 'oversized-glyph', 'accent-bar'] as const;
209
- export const PAGE_NUMERAL_STYLES = ['plain', 'oversized', 'boxed', 'mono'] as const;
210
- export const PAGE_PATTERNS = ['none', 'dots', 'grid', 'diagonal', 'noise'] as const;
211
- export const PAGE_EMPHASES = ['lead', 'strong', 'standard', 'quiet'] as const;
212
- export const PAGE_BACKGROUNDS = ['base', 'alternate', 'accent', 'media'] as const;
213
- export const PAGE_ACCENT_STRATEGIES = ['primary-only', 'cycle', 'alternate-two', 'none'] as const;
@@ -1,413 +0,0 @@
1
- /**
2
- * Theme System
3
- *
4
- * A Theme bundles color palette, typography, visual style, render-style
5
- * algorithm, and per-block color schemes into one JSON-serializable object.
6
- *
7
- * Built-in themes and customizer-authored themes share this exact schema.
8
- * Customizer-authored themes additionally specify `seedColors` so the few
9
- * fields the user picked can be re-edited later; built-ins typically omit
10
- * `seedColors` and ship with explicit `colors` already filled in.
11
- *
12
- * Design principles:
13
- * - Fully JSON-serializable. No functions; no raw CSS font strings.
14
- * - Font families are structured `FontFamily` references resolved by
15
- * `resolveFontFamily()` at render time.
16
- * - Doc carries an optional `themeId`; resolution happens at render time
17
- * via `resolveTheme(id)`.
18
- * - `createTheme` deep-merges a base theme with partial overrides;
19
- * `compileTheme` fills in defaults and derives missing color slots from
20
- * `seedColors`; both produce a complete `Theme`.
21
- */
22
-
23
- import type { LayoutHints } from './LayoutStrategy.js';
24
- import type { AnimationType, ImageTreatment, TransitionType } from './Doc.js';
25
- import type { PersistentLayerConfig } from './BlockTemplates.js';
26
- import type { ThemePageStyle } from './PageStyle.js';
27
- import { THEME_SCHEMA_VERSION } from './themeConstants.js';
28
- import { validateTheme } from './themeValidator.js';
29
- import { cloneAndFreezeData } from '../internal/immutable.js';
30
-
31
- // ============================================
32
- // Schema version
33
- // ============================================
34
-
35
- export { THEME_SCHEMA_VERSION } from './themeConstants.js';
36
- export type ThemeSchemaVersion = typeof THEME_SCHEMA_VERSION;
37
-
38
- /**
39
- * Frontmatter key under which a document inlines its custom Theme
40
- * definitions. The theme analog of `FRONTMATTER_CUSTOM_TEMPLATES_KEY`
41
- * (custom block templates). See `doc/customThemesFrontmatter.ts` for the
42
- * codec and `doc/resolveDocTheme.ts` for doc-scoped resolution.
43
- */
44
- export const FRONTMATTER_CUSTOM_THEMES_KEY = 'squisq-custom-themes';
45
-
46
- // ============================================
47
- // Color Palette
48
- // ============================================
49
-
50
- /**
51
- * Core color palette for a theme. Every color is a `#rrggbb` hex string.
52
- */
53
- export interface ThemeColorPalette {
54
- /** Primary accent color */
55
- primary: string;
56
- /** Secondary accent color */
57
- secondary: string;
58
- /** Background color (typically dark) */
59
- background: string;
60
- /** Lighter background for contrast panels */
61
- backgroundLight: string;
62
- /** Main text color */
63
- text: string;
64
- /** Muted/secondary text color */
65
- textMuted: string;
66
- /** Highlight/emphasis color */
67
- highlight: string;
68
- /** Warning/alert color */
69
- warning: string;
70
- }
71
-
72
- /**
73
- * A named color scheme used by templates for per-block color variation
74
- * (e.g., statHighlight or sectionHeader).
75
- */
76
- export interface ThemeColorScheme {
77
- /** Background fill */
78
- bg: string;
79
- /** Primary text tint */
80
- text: string;
81
- /** Accent / secondary tint */
82
- accent: string;
83
- }
84
-
85
- /**
86
- * Optional authoring metadata. When present and `colors` is partial,
87
- * `compileTheme` derives missing color slots from these seeds via OKLCh
88
- * lightening / darkening. Round-trips a customizer-authored theme back
89
- * into editable form.
90
- */
91
- export interface ThemeSeedColors {
92
- primary: string;
93
- secondary?: string;
94
- accent?: string;
95
- background?: string;
96
- text?: string;
97
- }
98
-
99
- // ============================================
100
- // Typography
101
- // ============================================
102
-
103
- /** Categorical bucket for a font family — drives default fallback. */
104
- export type FontFamilyKind = 'sans' | 'serif' | 'mono' | 'display';
105
-
106
- /**
107
- * Structured reference to a font family. Either a curated stack id (looked
108
- * up in `AVAILABLE_FONT_STACKS`) or a custom user-supplied name with a
109
- * structured fallback bucket. Themes never carry raw CSS family strings.
110
- */
111
- export type FontFamily =
112
- | { stackId: string }
113
- | {
114
- custom: {
115
- name: string;
116
- fallback: 'serif' | 'sans-serif' | 'monospace' | 'system-ui';
117
- };
118
- };
119
-
120
- /**
121
- * Typography settings for a theme.
122
- */
123
- export interface ThemeTypography {
124
- /** Font family for body / description text */
125
- bodyFont: FontFamily;
126
- /** Font family for titles and headings */
127
- titleFont: FontFamily;
128
- /** Font family for code / monospaced text (optional) */
129
- monoFont?: FontFamily;
130
- /** Multiplier applied to LayoutHints.titleScale (default 1.0) */
131
- titleScale?: number;
132
- /** Multiplier applied to LayoutHints.bodyScale (default 1.0) */
133
- bodyScale?: number;
134
- /** Default body line height (default 1.4) */
135
- lineHeight?: number;
136
- /** Default title line height */
137
- titleLineHeight?: number;
138
- /** Default title font weight */
139
- titleWeight?: 'normal' | 'bold';
140
- }
141
-
142
- // ============================================
143
- // Visual Style
144
- // ============================================
145
-
146
- /**
147
- * Global visual-style knobs that templates consult.
148
- */
149
- export interface ThemeStyle {
150
- /** Default border radius for cards / shapes (px) */
151
- borderRadius?: number;
152
- /** Whether templates should default to text shadows */
153
- textShadow?: boolean;
154
- /** Darkness of overlay on image-backed blocks (0–1) */
155
- overlayOpacity?: number;
156
- /** Multiplier on all animation durations (1.0 = normal, <1 faster, >1 slower) */
157
- animationSpeed?: number;
158
- /** Default horizontal padding for text (percentage string, e.g. "5%") */
159
- blockPadding?: string;
160
- /**
161
- * Photographic grade applied to template imagery (full-bleed photos,
162
- * feature halves, accent strips) so photos look native to the theme.
163
- * Duotone tints default to the theme primary. Blocks opt out per
164
- * template via `imageTreatment: 'none'`.
165
- */
166
- imageTreatment?: ImageTreatment;
167
- }
168
-
169
- // ============================================
170
- // Render Style
171
- // ============================================
172
-
173
- /**
174
- * Render-style algorithm preset. Controls layout tweaks, default animations,
175
- * transitions, and per-template behavioral hints.
176
- */
177
- export interface RenderStyle {
178
- /** Identifier for this algorithmic approach (e.g. "documentary", "magazine") */
179
- name: string;
180
- /** Partial overrides merged onto the orientation-based LayoutHints */
181
- layoutOverrides?: Partial<LayoutHints>;
182
- /** Default entrance animation for text layers */
183
- defaultTextAnimation?: AnimationType;
184
- /** Default animation for background / image layers */
185
- defaultImageAnimation?: AnimationType;
186
- /** Whether to apply Ken Burns ambient motion to images by default */
187
- ambientMotion?: boolean;
188
- /** Default block-to-block transition */
189
- defaultTransition?: { type: TransitionType; duration?: number };
190
- /**
191
- * Per-template behavioral hints. Keys are template names, values are
192
- * string/number/boolean maps that templates can read to vary their output.
193
- * Templates that consume hints publish a `hintSchema` export documenting
194
- * the keys they recognise.
195
- */
196
- templateHints?: Record<string, Record<string, string | number | boolean>>;
197
- }
198
-
199
- // ============================================
200
- // Theme
201
- // ============================================
202
-
203
- /**
204
- * A complete, JSON-serializable theme definition. Built-in and customizer-
205
- * authored themes share this exact shape.
206
- */
207
- export interface Theme {
208
- /** Schema version. Always '1' for now. */
209
- schemaVersion: ThemeSchemaVersion;
210
- /** Unique identifier (e.g. "documentary") */
211
- id: string;
212
- /** Human-readable display name */
213
- name: string;
214
- /** Short description for theme pickers */
215
- description?: string;
216
- /**
217
- * Id of the theme this custom theme was derived from, if any. Recorded
218
- * by `compileTheme({ base })` so a customizer can re-open the theme and
219
- * re-inherit the base's render style / color schemes / typography.
220
- * Absent on built-ins.
221
- */
222
- basedOn?: string;
223
- /** Optional authoring seeds (customizer fills these; built-ins typically omit) */
224
- seedColors?: ThemeSeedColors;
225
- /** Color palette */
226
- colors: ThemeColorPalette;
227
- /** Typography settings */
228
- typography: ThemeTypography;
229
- /** Global visual-style knobs */
230
- style: ThemeStyle;
231
- /** Algorithmic render-style preset */
232
- renderStyle: RenderStyle;
233
- /**
234
- * Named color schemes for per-block color variation.
235
- * Templates reference these by name (e.g. "blue", "warm").
236
- */
237
- colorSchemes: Record<string, ThemeColorScheme>;
238
- /** Optional persistent layers baked into the theme */
239
- persistentLayers?: PersistentLayerConfig;
240
- /**
241
- * Optional page art direction for Page (linear) mode. When absent,
242
- * `resolvePageStyle`/`defaultPageStyle` derive one from the fields above,
243
- * so legacy themes render pages without declaring this.
244
- */
245
- pageStyle?: ThemePageStyle;
246
- }
247
-
248
- // ============================================
249
- // Deep-Partial helper type
250
- // ============================================
251
-
252
- /**
253
- * Recursively makes every property optional.
254
- */
255
- export type DeepPartial<T> = {
256
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
257
- };
258
-
259
- // ============================================
260
- // Helpers
261
- // ============================================
262
-
263
- /**
264
- * Deep-merge `source` into `target`, returning a new object.
265
- * Arrays are replaced wholesale (not concatenated).
266
- */
267
- function deepMerge<T extends Record<string, unknown>>(target: T, source: DeepPartial<T>): T {
268
- const result = { ...target } as Record<string, unknown>;
269
- for (const key of Object.keys(source)) {
270
- const srcVal = (source as Record<string, unknown>)[key];
271
- const tgtVal = (target as Record<string, unknown>)[key];
272
- if (
273
- srcVal !== null &&
274
- srcVal !== undefined &&
275
- typeof srcVal === 'object' &&
276
- !Array.isArray(srcVal) &&
277
- tgtVal !== null &&
278
- tgtVal !== undefined &&
279
- typeof tgtVal === 'object' &&
280
- !Array.isArray(tgtVal)
281
- ) {
282
- result[key] = deepMerge(
283
- tgtVal as Record<string, unknown>,
284
- srcVal as DeepPartial<Record<string, unknown>>,
285
- );
286
- } else if (srcVal !== undefined) {
287
- result[key] = srcVal;
288
- }
289
- }
290
- return result as T;
291
- }
292
-
293
- /**
294
- * Create a new theme by deep-merging overrides onto a base theme.
295
- * The returned theme gets its own `id` if one is provided in overrides,
296
- * otherwise keeps the base theme's `id` suffixed with "-custom".
297
- */
298
- export function createTheme(base: Theme, overrides: DeepPartial<Theme>): Theme {
299
- const merged = deepMerge(
300
- base as unknown as Record<string, unknown>,
301
- overrides as DeepPartial<Record<string, unknown>>,
302
- ) as unknown as Theme;
303
- if (!overrides.id && merged.id === base.id) {
304
- merged.id = `${base.id}-custom`;
305
- }
306
- if (!merged.schemaVersion) merged.schemaVersion = THEME_SCHEMA_VERSION;
307
- return merged;
308
- }
309
-
310
- // ============================================
311
- // Surface Schemes — orthogonal to Theme
312
- // ============================================
313
-
314
- /**
315
- * A Surface Scheme is the light/dark axis, orthogonal to the editorial
316
- * identity of a Theme. A Theme chooses voice (serif vs sans, muted vs
317
- * bold, documentary vs magazine); a SurfaceScheme chooses what the paper
318
- * looks like. Any theme can render on either surface.
319
- */
320
- export interface SurfaceScheme {
321
- /** Identifier — 'light', 'dark', or a custom id. */
322
- id: string;
323
- background: string;
324
- backgroundLight: string;
325
- text: string;
326
- textMuted: string;
327
- }
328
-
329
- /** Near-white paper with dark text — standard light mode. */
330
- export const LIGHT_SURFACE: SurfaceScheme = {
331
- id: 'light',
332
- background: '#ffffff',
333
- backgroundLight: '#f5f5f5',
334
- text: '#1a1a1a',
335
- textMuted: '#666666',
336
- };
337
-
338
- /** Dark charcoal paper with light text — standard dark mode. */
339
- export const DARK_SURFACE: SurfaceScheme = {
340
- id: 'dark',
341
- background: '#1a202c',
342
- backgroundLight: '#2d3748',
343
- text: '#f0f0f0',
344
- textMuted: '#a0aec0',
345
- };
346
-
347
- /**
348
- * Overlay a SurfaceScheme's surface colors onto a Theme's palette,
349
- * leaving everything else (primary, highlight, warning, typography,
350
- * style, renderStyle, colorSchemes) untouched.
351
- */
352
- export function applySurface(theme: Theme, surface: SurfaceScheme): Theme {
353
- return {
354
- ...theme,
355
- colors: {
356
- ...theme.colors,
357
- background: surface.background,
358
- backgroundLight: surface.backgroundLight,
359
- text: surface.text,
360
- textMuted: surface.textMuted,
361
- },
362
- };
363
- }
364
-
365
- // ============================================
366
- // Caller-owned registry — for custom themes
367
- // ============================================
368
-
369
- /** A caller-owned custom-theme registry for SSR tenants, tests, and embedders. */
370
- export interface ThemeRegistry {
371
- register(theme: Theme): void;
372
- unregister(id: string): boolean;
373
- get(id: string): Theme | undefined;
374
- list(): Theme[];
375
- }
376
-
377
- function validatedThemeSnapshot(theme: Theme): Theme {
378
- const result = validateTheme(theme);
379
- if (!result.valid || !result.theme) {
380
- const details = result.errors
381
- .slice(0, 5)
382
- .map((error) => `${error.path || '<root>'}: ${error.message}`)
383
- .join('; ');
384
- throw new TypeError(`Cannot register invalid theme: ${details}`);
385
- }
386
- return cloneAndFreezeData(result.theme);
387
- }
388
-
389
- /**
390
- * Create a registry whose state is owned by the caller rather than the
391
- * process. Registered values are validated and stored as deeply frozen
392
- * snapshots, so later caller mutation cannot alter resolution behavior.
393
- */
394
- export function createThemeRegistry(initialThemes: readonly Theme[] = []): ThemeRegistry {
395
- const themes = new Map<string, Theme>();
396
- const registry: ThemeRegistry = {
397
- register(theme): void {
398
- const snapshot = validatedThemeSnapshot(theme);
399
- themes.set(snapshot.id, snapshot);
400
- },
401
- unregister(id): boolean {
402
- return themes.delete(id);
403
- },
404
- get(id): Theme | undefined {
405
- return themes.get(id);
406
- },
407
- list(): Theme[] {
408
- return Array.from(themes.values());
409
- },
410
- };
411
- for (const theme of initialThemes) registry.register(theme);
412
- return Object.freeze(registry);
413
- }