@bendyline/squisq 2.1.0 → 2.2.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 (446) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +24 -0
  3. package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
  4. package/dist/{Doc-DynJleo-.d.ts → Doc-BubIpWsp.d.ts} +1 -1
  5. package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-CGxk5CHc.d.ts} +1 -1
  6. package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
  7. package/dist/chunk-2L55443L.js +0 -0
  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-JI77MGAK.js → chunk-7ARJZYQY.js} +159 -120
  15. package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
  16. package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
  17. package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
  18. package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
  19. package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
  20. package/dist/chunk-BCCXTMN5.js +699 -0
  21. package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
  22. package/dist/{chunk-QUUPYOSP.js → chunk-CB45YGAM.js} +2 -3
  23. package/dist/{chunk-XNLB57UD.js → chunk-DYPMOPIW.js} +18 -2
  24. package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
  25. package/dist/{chunk-5UYI3RJB.js → chunk-FDYDYL77.js} +54 -40
  26. package/dist/{chunk-OTKVFVL6.js → chunk-I2O6W7DX.js} +116 -44
  27. package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
  28. package/dist/chunk-OPO5K4DZ.js +241 -0
  29. package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
  30. package/dist/chunk-QKPXHDLR.js +0 -0
  31. package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
  32. package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
  33. package/dist/chunk-WV5ARNDA.js +0 -0
  34. package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
  35. package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
  36. package/dist/chunk-XWNNA3KE.js +0 -0
  37. package/dist/chunk-YZNGMV3G.js +0 -0
  38. package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
  39. package/dist/doc/index.d.ts +27 -12
  40. package/dist/doc/index.js +16 -17
  41. package/dist/generate/index.d.ts +2 -2
  42. package/dist/generate/index.js +2 -3
  43. package/dist/icons/index.js +3 -4
  44. package/dist/icons/inlineIconMarker.js +1 -2
  45. package/dist/imageEdit/index.d.ts +48 -17
  46. package/dist/imageEdit/index.js +3 -4
  47. package/dist/index.d.ts +11 -11
  48. package/dist/index.js +60 -33
  49. package/dist/jsonForm/index.d.ts +10 -3
  50. package/dist/jsonForm/index.js +8 -7
  51. package/dist/markdown/index.d.ts +75 -11
  52. package/dist/markdown/index.js +32 -7
  53. package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-wSLA2A1g.d.ts} +2 -2
  54. package/dist/narration/index.d.ts +16 -3
  55. package/dist/narration/index.js +13 -14
  56. package/dist/random/index.d.ts +11 -2
  57. package/dist/random/index.js +2 -3
  58. package/dist/recommend/index.d.ts +1 -1
  59. package/dist/recommend/index.js +3 -4
  60. package/dist/schemas/index.d.ts +5 -5
  61. package/dist/schemas/index.js +5 -6
  62. package/dist/spatial/index.d.ts +2 -1
  63. package/dist/spatial/index.js +1 -2
  64. package/dist/storage/index.d.ts +4 -2
  65. package/dist/storage/index.js +1 -2
  66. package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
  67. package/dist/timing/index.js +3 -4
  68. package/dist/transform/index.d.ts +3 -3
  69. package/dist/transform/index.js +6 -7
  70. package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
  71. package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
  72. package/dist/versions/index.d.ts +14 -11
  73. package/dist/versions/index.js +2 -3
  74. package/package.json +4 -2
  75. package/dist/chunk-2UQOHYE2.js.map +0 -1
  76. package/dist/chunk-3E5F2XMR.js.map +0 -1
  77. package/dist/chunk-4X3JQXNM.js.map +0 -1
  78. package/dist/chunk-5DKBFXPY.js.map +0 -1
  79. package/dist/chunk-5J4HKRJF.js.map +0 -1
  80. package/dist/chunk-5UYI3RJB.js.map +0 -1
  81. package/dist/chunk-66QO7XFB.js.map +0 -1
  82. package/dist/chunk-AMIR72JP.js +0 -380
  83. package/dist/chunk-AMIR72JP.js.map +0 -1
  84. package/dist/chunk-DBS6RIFL.js.map +0 -1
  85. package/dist/chunk-DNJKBAI7.js +0 -1
  86. package/dist/chunk-DNJKBAI7.js.map +0 -1
  87. package/dist/chunk-ET53IIEP.js +0 -1
  88. package/dist/chunk-ET53IIEP.js.map +0 -1
  89. package/dist/chunk-FVTQSNR7.js.map +0 -1
  90. package/dist/chunk-GZY66SDN.js.map +0 -1
  91. package/dist/chunk-ILWDXLUK.js.map +0 -1
  92. package/dist/chunk-JHZWYRSW.js.map +0 -1
  93. package/dist/chunk-JI77MGAK.js.map +0 -1
  94. package/dist/chunk-JOQYPRDZ.js.map +0 -1
  95. package/dist/chunk-OTKVFVL6.js.map +0 -1
  96. package/dist/chunk-PGGGKYWG.js +0 -1
  97. package/dist/chunk-PGGGKYWG.js.map +0 -1
  98. package/dist/chunk-Q7LROV2H.js.map +0 -1
  99. package/dist/chunk-QE7TWGVT.js.map +0 -1
  100. package/dist/chunk-QUUPYOSP.js.map +0 -1
  101. package/dist/chunk-R2GC6RLD.js +0 -344
  102. package/dist/chunk-R2GC6RLD.js.map +0 -1
  103. package/dist/chunk-R2YZTCLO.js.map +0 -1
  104. package/dist/chunk-S7A5D7ZJ.js +0 -174
  105. package/dist/chunk-S7A5D7ZJ.js.map +0 -1
  106. package/dist/chunk-TUWMK62B.js.map +0 -1
  107. package/dist/chunk-V543AI2F.js +0 -1
  108. package/dist/chunk-V543AI2F.js.map +0 -1
  109. package/dist/chunk-VR7UPJ7C.js.map +0 -1
  110. package/dist/chunk-VWCJ2WXC.js.map +0 -1
  111. package/dist/chunk-VYFRI7R6.js.map +0 -1
  112. package/dist/chunk-XNLB57UD.js.map +0 -1
  113. package/dist/chunk-ZLQKNOZQ.js +0 -1
  114. package/dist/chunk-ZLQKNOZQ.js.map +0 -1
  115. package/dist/doc/index.js.map +0 -1
  116. package/dist/generate/index.js.map +0 -1
  117. package/dist/icons/index.js.map +0 -1
  118. package/dist/icons/inlineIconMarker.js.map +0 -1
  119. package/dist/imageEdit/index.js.map +0 -1
  120. package/dist/index.js.map +0 -1
  121. package/dist/jsonForm/index.js.map +0 -1
  122. package/dist/markdown/index.js.map +0 -1
  123. package/dist/narration/index.js.map +0 -1
  124. package/dist/random/index.js.map +0 -1
  125. package/dist/recommend/index.js.map +0 -1
  126. package/dist/schemas/index.js.map +0 -1
  127. package/dist/spatial/index.js.map +0 -1
  128. package/dist/storage/index.js.map +0 -1
  129. package/dist/timing/index.js.map +0 -1
  130. package/dist/transform/index.js.map +0 -1
  131. package/dist/versions/index.js.map +0 -1
  132. package/src/__tests__/animationUtils.test.ts +0 -117
  133. package/src/__tests__/annotationCoercion.test.ts +0 -243
  134. package/src/__tests__/applyNarrationTiming.test.ts +0 -190
  135. package/src/__tests__/applyRenderStyle.test.ts +0 -146
  136. package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
  137. package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
  138. package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
  139. package/src/__tests__/asciiDiagramParse.test.ts +0 -233
  140. package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
  141. package/src/__tests__/asciiDiagramRender.test.ts +0 -162
  142. package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
  143. package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
  144. package/src/__tests__/asciiTimelineParse.test.ts +0 -205
  145. package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
  146. package/src/__tests__/asciiTimelineRender.test.ts +0 -376
  147. package/src/__tests__/atmosphereLayers.test.ts +0 -108
  148. package/src/__tests__/attrTokens.test.ts +0 -167
  149. package/src/__tests__/colorUtils.test.ts +0 -112
  150. package/src/__tests__/contentContainer.test.ts +0 -325
  151. package/src/__tests__/contentExtractor.test.ts +0 -243
  152. package/src/__tests__/coverBlock.test.ts +0 -310
  153. package/src/__tests__/customTemplateSample.test.ts +0 -144
  154. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
  155. package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
  156. package/src/__tests__/dataTable.test.ts +0 -145
  157. package/src/__tests__/diagramBlock.test.ts +0 -122
  158. package/src/__tests__/diagramLayout.test.ts +0 -134
  159. package/src/__tests__/diagramText.test.ts +0 -26
  160. package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
  161. package/src/__tests__/drawing.test.ts +0 -109
  162. package/src/__tests__/drawingBlock.test.ts +0 -124
  163. package/src/__tests__/drawingLayout.test.ts +0 -171
  164. package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
  165. package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
  166. package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
  167. package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
  168. package/src/__tests__/geohash.test.ts +0 -110
  169. package/src/__tests__/getLayers.test.ts +0 -243
  170. package/src/__tests__/getLayersFallback.test.ts +0 -103
  171. package/src/__tests__/haversine.test.ts +0 -63
  172. package/src/__tests__/iconResolve.test.ts +0 -122
  173. package/src/__tests__/imageEditExportSvg.test.ts +0 -70
  174. package/src/__tests__/imageEditState.test.ts +0 -74
  175. package/src/__tests__/imageEditVersions.test.ts +0 -243
  176. package/src/__tests__/inferDocumentTitle.test.ts +0 -50
  177. package/src/__tests__/inlineIconMarker.test.ts +0 -36
  178. package/src/__tests__/inputDescriptors.test.ts +0 -162
  179. package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
  180. package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
  181. package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
  182. package/src/__tests__/jsonForm.pointer.test.ts +0 -149
  183. package/src/__tests__/jsonForm.tokens.test.ts +0 -84
  184. package/src/__tests__/layoutBlock.test.ts +0 -83
  185. package/src/__tests__/layoutLayout.test.ts +0 -169
  186. package/src/__tests__/localForageAdapter.test.ts +0 -155
  187. package/src/__tests__/majorApiTypes.test.ts +0 -18
  188. package/src/__tests__/markdown.test.ts +0 -1009
  189. package/src/__tests__/markdownIcons.test.ts +0 -104
  190. package/src/__tests__/markdownSanitize.test.ts +0 -81
  191. package/src/__tests__/markdownToDoc.test.ts +0 -957
  192. package/src/__tests__/matchFontFamily.test.ts +0 -114
  193. package/src/__tests__/materializeBlockLayers.test.ts +0 -167
  194. package/src/__tests__/materializePageSections.test.ts +0 -404
  195. package/src/__tests__/materializeTestUtils.ts +0 -17
  196. package/src/__tests__/mediaAnnotations.test.ts +0 -91
  197. package/src/__tests__/mediaSchedule.test.ts +0 -118
  198. package/src/__tests__/narrationAlign.test.ts +0 -150
  199. package/src/__tests__/narrationFeatures.test.ts +0 -71
  200. package/src/__tests__/narrationNuclei.test.ts +0 -45
  201. package/src/__tests__/narrationPacing.test.ts +0 -189
  202. package/src/__tests__/narrationScript.test.ts +0 -149
  203. package/src/__tests__/narrationSessionRepro.test.ts +0 -62
  204. package/src/__tests__/narrationSidecar.test.ts +0 -88
  205. package/src/__tests__/narrationSyllables.test.ts +0 -65
  206. package/src/__tests__/narrationTestSignals.ts +0 -167
  207. package/src/__tests__/narrationVad.test.ts +0 -66
  208. package/src/__tests__/pageStyle.test.ts +0 -258
  209. package/src/__tests__/pandocAttrParse.test.ts +0 -187
  210. package/src/__tests__/recommendTemplates.test.ts +0 -183
  211. package/src/__tests__/resolveDocTheme.test.ts +0 -69
  212. package/src/__tests__/rootExports.test.ts +0 -61
  213. package/src/__tests__/scopedContentContainer.test.ts +0 -109
  214. package/src/__tests__/seededRandom.test.ts +0 -142
  215. package/src/__tests__/shapeGeometry.test.ts +0 -138
  216. package/src/__tests__/shapeVocabulary.test.ts +0 -133
  217. package/src/__tests__/storage.test.ts +0 -60
  218. package/src/__tests__/structuredData.test.ts +0 -249
  219. package/src/__tests__/surface.test.ts +0 -68
  220. package/src/__tests__/templateAnnotationParse.test.ts +0 -173
  221. package/src/__tests__/templateInputs.test.ts +0 -69
  222. package/src/__tests__/templateMetadata.test.ts +0 -32
  223. package/src/__tests__/templates.test.ts +0 -710
  224. package/src/__tests__/themeCompile.test.ts +0 -225
  225. package/src/__tests__/themeValidator.test.ts +0 -131
  226. package/src/__tests__/timing.test.ts +0 -167
  227. package/src/__tests__/transformProvenance.test.ts +0 -160
  228. package/src/__tests__/transformV2.test.ts +0 -163
  229. package/src/__tests__/transitionNormalize.test.ts +0 -61
  230. package/src/__tests__/treeviewBattle.test.ts +0 -76
  231. package/src/__tests__/treeviewDetect.test.ts +0 -168
  232. package/src/__tests__/treeviewParse.test.ts +0 -118
  233. package/src/__tests__/treeviewPipeline.test.ts +0 -183
  234. package/src/__tests__/treeviewRender.test.ts +0 -91
  235. package/src/__tests__/validateDoc.test.ts +0 -260
  236. package/src/__tests__/versions.test.ts +0 -459
  237. package/src/doc/annotationBlocks.ts +0 -117
  238. package/src/doc/applyNarrationTiming.ts +0 -244
  239. package/src/doc/asciiDiagram/chars.ts +0 -210
  240. package/src/doc/asciiDiagram/detect.ts +0 -175
  241. package/src/doc/asciiDiagram/index.ts +0 -38
  242. package/src/doc/asciiDiagram/mapping.ts +0 -225
  243. package/src/doc/asciiDiagram/parse.ts +0 -1095
  244. package/src/doc/asciiDiagram/render.ts +0 -963
  245. package/src/doc/asciiDiagram/repair.ts +0 -400
  246. package/src/doc/asciiDiagram/types.ts +0 -65
  247. package/src/doc/asciiTimeline/detect.ts +0 -138
  248. package/src/doc/asciiTimeline/index.ts +0 -26
  249. package/src/doc/asciiTimeline/mapping.ts +0 -43
  250. package/src/doc/asciiTimeline/parse.ts +0 -870
  251. package/src/doc/asciiTimeline/render.ts +0 -427
  252. package/src/doc/asciiTimeline/types.ts +0 -73
  253. package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
  254. package/src/doc/audioMapping.ts +0 -442
  255. package/src/doc/customTemplatesFrontmatter.ts +0 -273
  256. package/src/doc/customThemesFrontmatter.ts +0 -95
  257. package/src/doc/docToMarkdown.ts +0 -284
  258. package/src/doc/index.ts +0 -161
  259. package/src/doc/markdownToDoc.ts +0 -1054
  260. package/src/doc/materializeBlockLayers.ts +0 -465
  261. package/src/doc/mediaAnnotations.ts +0 -120
  262. package/src/doc/page/PageSection.ts +0 -174
  263. package/src/doc/page/materializePageSection.ts +0 -616
  264. package/src/doc/page/resolvePageBlock.ts +0 -108
  265. package/src/doc/page/sectionExtractors.ts +0 -466
  266. package/src/doc/pageCss.ts +0 -628
  267. package/src/doc/resolveDocTheme.ts +0 -56
  268. package/src/doc/standaloneAnnotation.ts +0 -58
  269. package/src/doc/structuredData.ts +0 -301
  270. package/src/doc/templateInputs.ts +0 -424
  271. package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
  272. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
  273. package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
  274. package/src/doc/templates/accentImage.ts +0 -362
  275. package/src/doc/templates/captionUtils.ts +0 -56
  276. package/src/doc/templates/comparisonBar.ts +0 -173
  277. package/src/doc/templates/coverBlock.ts +0 -255
  278. package/src/doc/templates/customTemplate.ts +0 -51
  279. package/src/doc/templates/dataTable.ts +0 -102
  280. package/src/doc/templates/dateEvent.ts +0 -147
  281. package/src/doc/templates/definitionCard.ts +0 -140
  282. package/src/doc/templates/diagramBlock.ts +0 -403
  283. package/src/doc/templates/diagramLayout.ts +0 -159
  284. package/src/doc/templates/drawingBlock.ts +0 -325
  285. package/src/doc/templates/drawingLayout.ts +0 -539
  286. package/src/doc/templates/factCard.ts +0 -146
  287. package/src/doc/templates/fallbackBlock.ts +0 -123
  288. package/src/doc/templates/featureBlock.ts +0 -209
  289. package/src/doc/templates/fullBleedQuote.ts +0 -83
  290. package/src/doc/templates/imageWithCaption.ts +0 -186
  291. package/src/doc/templates/index.ts +0 -642
  292. package/src/doc/templates/inputDescriptors.ts +0 -451
  293. package/src/doc/templates/layoutBlock.ts +0 -43
  294. package/src/doc/templates/layoutLayout.ts +0 -243
  295. package/src/doc/templates/listBlock.ts +0 -207
  296. package/src/doc/templates/mapBlock.ts +0 -138
  297. package/src/doc/templates/metadata.ts +0 -130
  298. package/src/doc/templates/persistentLayers.ts +0 -526
  299. package/src/doc/templates/photoGrid.ts +0 -190
  300. package/src/doc/templates/pullQuote.ts +0 -141
  301. package/src/doc/templates/quoteBlock.ts +0 -141
  302. package/src/doc/templates/registry.ts +0 -88
  303. package/src/doc/templates/sectionHeader.ts +0 -120
  304. package/src/doc/templates/statHighlight.ts +0 -146
  305. package/src/doc/templates/templateNames.ts +0 -22
  306. package/src/doc/templates/timelineBlock.ts +0 -613
  307. package/src/doc/templates/titleBlock.ts +0 -150
  308. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
  309. package/src/doc/templates/tokens/resolveTokens.ts +0 -453
  310. package/src/doc/templates/treeBlock.ts +0 -131
  311. package/src/doc/templates/twoColumn.ts +0 -263
  312. package/src/doc/templates/videoPullQuote.ts +0 -142
  313. package/src/doc/templates/videoWithCaption.ts +0 -135
  314. package/src/doc/treeview/chars.ts +0 -72
  315. package/src/doc/treeview/detect.ts +0 -145
  316. package/src/doc/treeview/index.ts +0 -30
  317. package/src/doc/treeview/mapping.ts +0 -95
  318. package/src/doc/treeview/parse.ts +0 -201
  319. package/src/doc/treeview/render.ts +0 -41
  320. package/src/doc/treeview/types.ts +0 -43
  321. package/src/doc/utils/animationUtils.ts +0 -399
  322. package/src/doc/utils/applyRenderStyle.ts +0 -106
  323. package/src/doc/utils/diagramText.ts +0 -78
  324. package/src/doc/utils/imageTreatment.ts +0 -70
  325. package/src/doc/utils/nearest.ts +0 -59
  326. package/src/doc/utils/shapeGeometry.ts +0 -614
  327. package/src/doc/utils/themeUtils.ts +0 -243
  328. package/src/doc/validate.ts +0 -575
  329. package/src/generate/contentExtractor.ts +0 -921
  330. package/src/generate/index.ts +0 -18
  331. package/src/generate/templateMapper.ts +0 -177
  332. package/src/icons/iconData.ts +0 -31
  333. package/src/icons/index.ts +0 -26
  334. package/src/icons/inlineIconMarker.ts +0 -73
  335. package/src/icons/resolve.ts +0 -139
  336. package/src/imageEdit/ImageEditVersionManager.ts +0 -73
  337. package/src/imageEdit/export.ts +0 -410
  338. package/src/imageEdit/index.ts +0 -72
  339. package/src/imageEdit/persistence.ts +0 -113
  340. package/src/imageEdit/state.ts +0 -112
  341. package/src/imageEdit/versionPaths.ts +0 -44
  342. package/src/imageEdit/versions.ts +0 -152
  343. package/src/index.ts +0 -15
  344. package/src/internal/immutable.ts +0 -58
  345. package/src/jsonForm/chooseControl.ts +0 -88
  346. package/src/jsonForm/evaluateWhen.ts +0 -59
  347. package/src/jsonForm/index.ts +0 -32
  348. package/src/jsonForm/inferSchema.ts +0 -25
  349. package/src/jsonForm/pointer.ts +0 -154
  350. package/src/jsonForm/tokens.ts +0 -78
  351. package/src/jsonForm/types.ts +0 -167
  352. package/src/markdown/annotationCoercion.ts +0 -295
  353. package/src/markdown/attrTokens.ts +0 -243
  354. package/src/markdown/convert.ts +0 -1353
  355. package/src/markdown/htmlParse.ts +0 -212
  356. package/src/markdown/index.ts +0 -152
  357. package/src/markdown/parse.ts +0 -103
  358. package/src/markdown/sanitize.ts +0 -318
  359. package/src/markdown/stringify.ts +0 -207
  360. package/src/markdown/types.ts +0 -710
  361. package/src/markdown/utils.ts +0 -459
  362. package/src/narration/align.ts +0 -514
  363. package/src/narration/features.ts +0 -231
  364. package/src/narration/index.ts +0 -86
  365. package/src/narration/nuclei.ts +0 -118
  366. package/src/narration/pacing.ts +0 -211
  367. package/src/narration/script.ts +0 -239
  368. package/src/narration/session.ts +0 -100
  369. package/src/narration/sidecar.ts +0 -187
  370. package/src/narration/syllables.ts +0 -85
  371. package/src/narration/trace.ts +0 -50
  372. package/src/narration/types.ts +0 -299
  373. package/src/narration/vad.ts +0 -131
  374. package/src/ngeohash.d.ts +0 -11
  375. package/src/random/SeededRandom.ts +0 -127
  376. package/src/random/index.ts +0 -1
  377. package/src/recommend/index.ts +0 -16
  378. package/src/recommend/numberHighlight.ts +0 -25
  379. package/src/recommend/templates.ts +0 -393
  380. package/src/schemas/BlockTemplates.ts +0 -1046
  381. package/src/schemas/CustomTemplates.ts +0 -126
  382. package/src/schemas/Doc.ts +0 -1073
  383. package/src/schemas/ImageEditDoc.ts +0 -102
  384. package/src/schemas/LayoutStrategy.ts +0 -178
  385. package/src/schemas/Media.ts +0 -179
  386. package/src/schemas/MediaProvider.ts +0 -70
  387. package/src/schemas/PageStyle.ts +0 -213
  388. package/src/schemas/Theme.ts +0 -413
  389. package/src/schemas/Transitions.ts +0 -224
  390. package/src/schemas/Types.ts +0 -15
  391. package/src/schemas/Viewport.ts +0 -91
  392. package/src/schemas/colorUtils.ts +0 -219
  393. package/src/schemas/fontStacks.ts +0 -339
  394. package/src/schemas/index.ts +0 -31
  395. package/src/schemas/pageStyleDefaults.ts +0 -204
  396. package/src/schemas/themeCompile.ts +0 -244
  397. package/src/schemas/themeConstants.ts +0 -2
  398. package/src/schemas/themeLibrary.ts +0 -60
  399. package/src/schemas/themeValidator.ts +0 -609
  400. package/src/schemas/themes/bold.json +0 -77
  401. package/src/schemas/themes/cinematic.json +0 -143
  402. package/src/schemas/themes/documentary.json +0 -125
  403. package/src/schemas/themes/gezellig.json +0 -123
  404. package/src/schemas/themes/index.ts +0 -53
  405. package/src/schemas/themes/magazine.json +0 -126
  406. package/src/schemas/themes/minimalist.json +0 -74
  407. package/src/schemas/themes/morning-light.json +0 -117
  408. package/src/schemas/themes/standard-dark.json +0 -109
  409. package/src/schemas/themes/standard.json +0 -98
  410. package/src/schemas/themes/tech-dark.json +0 -143
  411. package/src/schemas/themes/warm-earth.json +0 -74
  412. package/src/spatial/Geohash.ts +0 -196
  413. package/src/spatial/Haversine.ts +0 -59
  414. package/src/spatial/index.ts +0 -2
  415. package/src/storage/ContentContainer.ts +0 -220
  416. package/src/storage/LocalForageAdapter.ts +0 -103
  417. package/src/storage/LocalStorageAdapter.ts +0 -57
  418. package/src/storage/MediaProviderFromContainer.ts +0 -92
  419. package/src/storage/MemoryStorageAdapter.ts +0 -37
  420. package/src/storage/ScopedContentContainer.ts +0 -143
  421. package/src/storage/Storage.ts +0 -28
  422. package/src/storage/index.ts +0 -9
  423. package/src/timing/index.ts +0 -17
  424. package/src/timing/narrationTiming.ts +0 -220
  425. package/src/timing/readingTime.ts +0 -94
  426. package/src/transform/applyTransform.ts +0 -122
  427. package/src/transform/blockAnalyzer.ts +0 -181
  428. package/src/transform/index.ts +0 -23
  429. package/src/transform/registry.ts +0 -217
  430. package/src/transform/styles/dataDriven.ts +0 -18
  431. package/src/transform/styles/documentary.ts +0 -18
  432. package/src/transform/styles/index.ts +0 -5
  433. package/src/transform/styles/magazine.ts +0 -19
  434. package/src/transform/styles/minimal.ts +0 -18
  435. package/src/transform/styles/narrative.ts +0 -19
  436. package/src/transform/templateSelector.ts +0 -389
  437. package/src/transform/timingAllocator.ts +0 -257
  438. package/src/transform/types.ts +0 -158
  439. package/src/versions/DocumentVersionManager.ts +0 -70
  440. package/src/versions/gitignore.ts +0 -34
  441. package/src/versions/index.ts +0 -56
  442. package/src/versions/operations.ts +0 -144
  443. package/src/versions/paths.ts +0 -51
  444. package/src/versions/snapshotStore.ts +0 -202
  445. package/src/versions/timestamp.ts +0 -48
  446. 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
- }