@bendyline/squisq 2.0.1 → 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 (438) 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-ylqWKDc_.d.ts → Doc-BubIpWsp.d.ts} +160 -3
  5. package/dist/{ImageEditDoc-D828IXJ1.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-2ZWIXGAC.js +214 -0
  9. package/dist/{chunk-2PWOO4ZE.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-X6DUONGT.js → chunk-7ARJZYQY.js} +280 -128
  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-W4O2TX5I.js → chunk-C33GTPUZ.js} +579 -4
  22. package/dist/{chunk-MMPBOUK7.js → chunk-CB45YGAM.js} +7 -2
  23. package/dist/{chunk-CY2R2VPR.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-TFJVXUHH.js → chunk-I2O6W7DX.js} +1513 -79
  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-PXLVXTLW.js → chunk-RS5AP3J4.js} +72 -15
  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 +166 -12
  40. package/dist/doc/index.js +36 -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 +13 -12
  48. package/dist/index.js +118 -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-wSLA2A1g.d.ts +223 -0
  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 +31 -6
  61. package/dist/schemas/index.js +43 -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-RjVgLpUi.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
  67. package/dist/timing/index.js +3 -4
  68. package/dist/transform/index.d.ts +9 -10
  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-2PWOO4ZE.js.map +0 -1
  76. package/dist/chunk-2UQOHYE2.js.map +0 -1
  77. package/dist/chunk-3E5F2XMR.js.map +0 -1
  78. package/dist/chunk-4X3JQXNM.js.map +0 -1
  79. package/dist/chunk-5DKBFXPY.js.map +0 -1
  80. package/dist/chunk-5J4HKRJF.js.map +0 -1
  81. package/dist/chunk-5UYI3RJB.js.map +0 -1
  82. package/dist/chunk-66QO7XFB.js.map +0 -1
  83. package/dist/chunk-AMIR72JP.js +0 -380
  84. package/dist/chunk-AMIR72JP.js.map +0 -1
  85. package/dist/chunk-CY2R2VPR.js.map +0 -1
  86. package/dist/chunk-DBS6RIFL.js.map +0 -1
  87. package/dist/chunk-DNJKBAI7.js +0 -1
  88. package/dist/chunk-DNJKBAI7.js.map +0 -1
  89. package/dist/chunk-ET53IIEP.js +0 -1
  90. package/dist/chunk-ET53IIEP.js.map +0 -1
  91. package/dist/chunk-FVJUUTEM.js +0 -74
  92. package/dist/chunk-FVJUUTEM.js.map +0 -1
  93. package/dist/chunk-FVTQSNR7.js.map +0 -1
  94. package/dist/chunk-GZY66SDN.js.map +0 -1
  95. package/dist/chunk-JOQYPRDZ.js.map +0 -1
  96. package/dist/chunk-MMPBOUK7.js.map +0 -1
  97. package/dist/chunk-PGGGKYWG.js +0 -1
  98. package/dist/chunk-PGGGKYWG.js.map +0 -1
  99. package/dist/chunk-PXLVXTLW.js.map +0 -1
  100. package/dist/chunk-Q7LROV2H.js.map +0 -1
  101. package/dist/chunk-QE7TWGVT.js.map +0 -1
  102. package/dist/chunk-R2GC6RLD.js +0 -344
  103. package/dist/chunk-R2GC6RLD.js.map +0 -1
  104. package/dist/chunk-R2YZTCLO.js.map +0 -1
  105. package/dist/chunk-S7A5D7ZJ.js +0 -174
  106. package/dist/chunk-S7A5D7ZJ.js.map +0 -1
  107. package/dist/chunk-TFJVXUHH.js.map +0 -1
  108. package/dist/chunk-TUWMK62B.js.map +0 -1
  109. package/dist/chunk-V543AI2F.js +0 -1
  110. package/dist/chunk-V543AI2F.js.map +0 -1
  111. package/dist/chunk-VR7UPJ7C.js.map +0 -1
  112. package/dist/chunk-W4O2TX5I.js.map +0 -1
  113. package/dist/chunk-X6DUONGT.js.map +0 -1
  114. package/dist/chunk-ZLQKNOZQ.js +0 -1
  115. package/dist/chunk-ZLQKNOZQ.js.map +0 -1
  116. package/dist/doc/index.js.map +0 -1
  117. package/dist/generate/index.js.map +0 -1
  118. package/dist/icons/index.js.map +0 -1
  119. package/dist/icons/inlineIconMarker.js.map +0 -1
  120. package/dist/imageEdit/index.js.map +0 -1
  121. package/dist/index.js.map +0 -1
  122. package/dist/jsonForm/index.js.map +0 -1
  123. package/dist/markdown/index.js.map +0 -1
  124. package/dist/narration/index.js.map +0 -1
  125. package/dist/random/index.js.map +0 -1
  126. package/dist/recommend/index.js.map +0 -1
  127. package/dist/schemas/index.js.map +0 -1
  128. package/dist/spatial/index.js.map +0 -1
  129. package/dist/storage/index.js.map +0 -1
  130. package/dist/timing/index.js.map +0 -1
  131. package/dist/transform/index.js.map +0 -1
  132. package/dist/versions/index.js.map +0 -1
  133. package/src/__tests__/animationUtils.test.ts +0 -117
  134. package/src/__tests__/annotationCoercion.test.ts +0 -243
  135. package/src/__tests__/applyNarrationTiming.test.ts +0 -190
  136. package/src/__tests__/applyRenderStyle.test.ts +0 -146
  137. package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
  138. package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
  139. package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
  140. package/src/__tests__/asciiDiagramParse.test.ts +0 -233
  141. package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
  142. package/src/__tests__/asciiDiagramRender.test.ts +0 -162
  143. package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
  144. package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
  145. package/src/__tests__/asciiTimelineParse.test.ts +0 -205
  146. package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
  147. package/src/__tests__/asciiTimelineRender.test.ts +0 -376
  148. package/src/__tests__/atmosphereLayers.test.ts +0 -108
  149. package/src/__tests__/attrTokens.test.ts +0 -167
  150. package/src/__tests__/colorUtils.test.ts +0 -112
  151. package/src/__tests__/contentContainer.test.ts +0 -325
  152. package/src/__tests__/contentExtractor.test.ts +0 -243
  153. package/src/__tests__/coverBlock.test.ts +0 -310
  154. package/src/__tests__/customTemplateSample.test.ts +0 -144
  155. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
  156. package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
  157. package/src/__tests__/dataTable.test.ts +0 -145
  158. package/src/__tests__/diagramBlock.test.ts +0 -122
  159. package/src/__tests__/diagramLayout.test.ts +0 -134
  160. package/src/__tests__/diagramText.test.ts +0 -26
  161. package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
  162. package/src/__tests__/drawing.test.ts +0 -109
  163. package/src/__tests__/drawingBlock.test.ts +0 -124
  164. package/src/__tests__/drawingLayout.test.ts +0 -171
  165. package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
  166. package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
  167. package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
  168. package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
  169. package/src/__tests__/geohash.test.ts +0 -110
  170. package/src/__tests__/getLayers.test.ts +0 -243
  171. package/src/__tests__/getLayersFallback.test.ts +0 -103
  172. package/src/__tests__/haversine.test.ts +0 -63
  173. package/src/__tests__/iconResolve.test.ts +0 -122
  174. package/src/__tests__/imageEditExportSvg.test.ts +0 -70
  175. package/src/__tests__/imageEditState.test.ts +0 -74
  176. package/src/__tests__/imageEditVersions.test.ts +0 -243
  177. package/src/__tests__/inferDocumentTitle.test.ts +0 -50
  178. package/src/__tests__/inlineIconMarker.test.ts +0 -36
  179. package/src/__tests__/inputDescriptors.test.ts +0 -162
  180. package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
  181. package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
  182. package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
  183. package/src/__tests__/jsonForm.pointer.test.ts +0 -149
  184. package/src/__tests__/jsonForm.tokens.test.ts +0 -84
  185. package/src/__tests__/layoutBlock.test.ts +0 -83
  186. package/src/__tests__/layoutLayout.test.ts +0 -169
  187. package/src/__tests__/localForageAdapter.test.ts +0 -155
  188. package/src/__tests__/majorApiTypes.test.ts +0 -18
  189. package/src/__tests__/markdown.test.ts +0 -1009
  190. package/src/__tests__/markdownIcons.test.ts +0 -104
  191. package/src/__tests__/markdownSanitize.test.ts +0 -81
  192. package/src/__tests__/markdownToDoc.test.ts +0 -957
  193. package/src/__tests__/matchFontFamily.test.ts +0 -114
  194. package/src/__tests__/materializeBlockLayers.test.ts +0 -135
  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__/pandocAttrParse.test.ts +0 -187
  209. package/src/__tests__/recommendTemplates.test.ts +0 -183
  210. package/src/__tests__/resolveDocTheme.test.ts +0 -69
  211. package/src/__tests__/rootExports.test.ts +0 -61
  212. package/src/__tests__/scopedContentContainer.test.ts +0 -109
  213. package/src/__tests__/seededRandom.test.ts +0 -142
  214. package/src/__tests__/shapeGeometry.test.ts +0 -138
  215. package/src/__tests__/shapeVocabulary.test.ts +0 -133
  216. package/src/__tests__/storage.test.ts +0 -60
  217. package/src/__tests__/structuredData.test.ts +0 -249
  218. package/src/__tests__/surface.test.ts +0 -68
  219. package/src/__tests__/templateAnnotationParse.test.ts +0 -160
  220. package/src/__tests__/templateInputs.test.ts +0 -69
  221. package/src/__tests__/templateMetadata.test.ts +0 -32
  222. package/src/__tests__/templates.test.ts +0 -710
  223. package/src/__tests__/themeCompile.test.ts +0 -225
  224. package/src/__tests__/themeValidator.test.ts +0 -131
  225. package/src/__tests__/timing.test.ts +0 -167
  226. package/src/__tests__/transformProvenance.test.ts +0 -160
  227. package/src/__tests__/transformV2.test.ts +0 -163
  228. package/src/__tests__/transitionNormalize.test.ts +0 -61
  229. package/src/__tests__/treeviewBattle.test.ts +0 -76
  230. package/src/__tests__/treeviewDetect.test.ts +0 -168
  231. package/src/__tests__/treeviewParse.test.ts +0 -118
  232. package/src/__tests__/treeviewPipeline.test.ts +0 -183
  233. package/src/__tests__/treeviewRender.test.ts +0 -91
  234. package/src/__tests__/validateDoc.test.ts +0 -260
  235. package/src/__tests__/versions.test.ts +0 -459
  236. package/src/doc/annotationBlocks.ts +0 -117
  237. package/src/doc/applyNarrationTiming.ts +0 -244
  238. package/src/doc/asciiDiagram/chars.ts +0 -210
  239. package/src/doc/asciiDiagram/detect.ts +0 -175
  240. package/src/doc/asciiDiagram/index.ts +0 -38
  241. package/src/doc/asciiDiagram/mapping.ts +0 -225
  242. package/src/doc/asciiDiagram/parse.ts +0 -1095
  243. package/src/doc/asciiDiagram/render.ts +0 -963
  244. package/src/doc/asciiDiagram/repair.ts +0 -400
  245. package/src/doc/asciiDiagram/types.ts +0 -65
  246. package/src/doc/asciiTimeline/detect.ts +0 -138
  247. package/src/doc/asciiTimeline/index.ts +0 -26
  248. package/src/doc/asciiTimeline/mapping.ts +0 -43
  249. package/src/doc/asciiTimeline/parse.ts +0 -870
  250. package/src/doc/asciiTimeline/render.ts +0 -427
  251. package/src/doc/asciiTimeline/types.ts +0 -73
  252. package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
  253. package/src/doc/audioMapping.ts +0 -442
  254. package/src/doc/customTemplatesFrontmatter.ts +0 -273
  255. package/src/doc/customThemesFrontmatter.ts +0 -95
  256. package/src/doc/docToMarkdown.ts +0 -284
  257. package/src/doc/index.ts +0 -127
  258. package/src/doc/markdownToDoc.ts +0 -1054
  259. package/src/doc/materializeBlockLayers.ts +0 -304
  260. package/src/doc/mediaAnnotations.ts +0 -120
  261. package/src/doc/resolveDocTheme.ts +0 -56
  262. package/src/doc/standaloneAnnotation.ts +0 -58
  263. package/src/doc/structuredData.ts +0 -301
  264. package/src/doc/templateInputs.ts +0 -423
  265. package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
  266. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
  267. package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
  268. package/src/doc/templates/accentImage.ts +0 -362
  269. package/src/doc/templates/captionUtils.ts +0 -56
  270. package/src/doc/templates/comparisonBar.ts +0 -173
  271. package/src/doc/templates/coverBlock.ts +0 -255
  272. package/src/doc/templates/customTemplate.ts +0 -51
  273. package/src/doc/templates/dataTable.ts +0 -102
  274. package/src/doc/templates/dateEvent.ts +0 -147
  275. package/src/doc/templates/definitionCard.ts +0 -140
  276. package/src/doc/templates/diagramBlock.ts +0 -403
  277. package/src/doc/templates/diagramLayout.ts +0 -159
  278. package/src/doc/templates/drawingBlock.ts +0 -325
  279. package/src/doc/templates/drawingLayout.ts +0 -539
  280. package/src/doc/templates/factCard.ts +0 -146
  281. package/src/doc/templates/fallbackBlock.ts +0 -123
  282. package/src/doc/templates/featureBlock.ts +0 -209
  283. package/src/doc/templates/fullBleedQuote.ts +0 -83
  284. package/src/doc/templates/imageWithCaption.ts +0 -186
  285. package/src/doc/templates/index.ts +0 -642
  286. package/src/doc/templates/inputDescriptors.ts +0 -451
  287. package/src/doc/templates/layoutBlock.ts +0 -43
  288. package/src/doc/templates/layoutLayout.ts +0 -243
  289. package/src/doc/templates/listBlock.ts +0 -207
  290. package/src/doc/templates/mapBlock.ts +0 -138
  291. package/src/doc/templates/metadata.ts +0 -130
  292. package/src/doc/templates/persistentLayers.ts +0 -526
  293. package/src/doc/templates/photoGrid.ts +0 -190
  294. package/src/doc/templates/pullQuote.ts +0 -141
  295. package/src/doc/templates/quoteBlock.ts +0 -141
  296. package/src/doc/templates/registry.ts +0 -88
  297. package/src/doc/templates/sectionHeader.ts +0 -120
  298. package/src/doc/templates/statHighlight.ts +0 -146
  299. package/src/doc/templates/templateNames.ts +0 -22
  300. package/src/doc/templates/timelineBlock.ts +0 -613
  301. package/src/doc/templates/titleBlock.ts +0 -150
  302. package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
  303. package/src/doc/templates/tokens/resolveTokens.ts +0 -453
  304. package/src/doc/templates/treeBlock.ts +0 -131
  305. package/src/doc/templates/twoColumn.ts +0 -263
  306. package/src/doc/templates/videoPullQuote.ts +0 -142
  307. package/src/doc/templates/videoWithCaption.ts +0 -135
  308. package/src/doc/treeview/chars.ts +0 -72
  309. package/src/doc/treeview/detect.ts +0 -145
  310. package/src/doc/treeview/index.ts +0 -30
  311. package/src/doc/treeview/mapping.ts +0 -95
  312. package/src/doc/treeview/parse.ts +0 -201
  313. package/src/doc/treeview/render.ts +0 -41
  314. package/src/doc/treeview/types.ts +0 -43
  315. package/src/doc/utils/animationUtils.ts +0 -399
  316. package/src/doc/utils/applyRenderStyle.ts +0 -106
  317. package/src/doc/utils/diagramText.ts +0 -78
  318. package/src/doc/utils/imageTreatment.ts +0 -70
  319. package/src/doc/utils/nearest.ts +0 -59
  320. package/src/doc/utils/shapeGeometry.ts +0 -614
  321. package/src/doc/utils/themeUtils.ts +0 -243
  322. package/src/doc/validate.ts +0 -575
  323. package/src/generate/contentExtractor.ts +0 -921
  324. package/src/generate/index.ts +0 -18
  325. package/src/generate/templateMapper.ts +0 -177
  326. package/src/icons/iconData.ts +0 -31
  327. package/src/icons/index.ts +0 -26
  328. package/src/icons/inlineIconMarker.ts +0 -73
  329. package/src/icons/resolve.ts +0 -139
  330. package/src/imageEdit/ImageEditVersionManager.ts +0 -73
  331. package/src/imageEdit/export.ts +0 -410
  332. package/src/imageEdit/index.ts +0 -72
  333. package/src/imageEdit/persistence.ts +0 -113
  334. package/src/imageEdit/state.ts +0 -112
  335. package/src/imageEdit/versionPaths.ts +0 -44
  336. package/src/imageEdit/versions.ts +0 -152
  337. package/src/index.ts +0 -15
  338. package/src/internal/immutable.ts +0 -58
  339. package/src/jsonForm/chooseControl.ts +0 -88
  340. package/src/jsonForm/evaluateWhen.ts +0 -59
  341. package/src/jsonForm/index.ts +0 -32
  342. package/src/jsonForm/inferSchema.ts +0 -25
  343. package/src/jsonForm/pointer.ts +0 -154
  344. package/src/jsonForm/tokens.ts +0 -78
  345. package/src/jsonForm/types.ts +0 -167
  346. package/src/markdown/annotationCoercion.ts +0 -295
  347. package/src/markdown/attrTokens.ts +0 -243
  348. package/src/markdown/convert.ts +0 -1353
  349. package/src/markdown/htmlParse.ts +0 -212
  350. package/src/markdown/index.ts +0 -152
  351. package/src/markdown/parse.ts +0 -103
  352. package/src/markdown/sanitize.ts +0 -318
  353. package/src/markdown/stringify.ts +0 -207
  354. package/src/markdown/types.ts +0 -710
  355. package/src/markdown/utils.ts +0 -459
  356. package/src/narration/align.ts +0 -514
  357. package/src/narration/features.ts +0 -231
  358. package/src/narration/index.ts +0 -86
  359. package/src/narration/nuclei.ts +0 -118
  360. package/src/narration/pacing.ts +0 -211
  361. package/src/narration/script.ts +0 -239
  362. package/src/narration/session.ts +0 -100
  363. package/src/narration/sidecar.ts +0 -187
  364. package/src/narration/syllables.ts +0 -85
  365. package/src/narration/trace.ts +0 -50
  366. package/src/narration/types.ts +0 -299
  367. package/src/narration/vad.ts +0 -131
  368. package/src/ngeohash.d.ts +0 -11
  369. package/src/random/SeededRandom.ts +0 -127
  370. package/src/random/index.ts +0 -1
  371. package/src/recommend/index.ts +0 -16
  372. package/src/recommend/numberHighlight.ts +0 -25
  373. package/src/recommend/templates.ts +0 -393
  374. package/src/schemas/BlockTemplates.ts +0 -1046
  375. package/src/schemas/CustomTemplates.ts +0 -126
  376. package/src/schemas/Doc.ts +0 -1052
  377. package/src/schemas/ImageEditDoc.ts +0 -102
  378. package/src/schemas/LayoutStrategy.ts +0 -178
  379. package/src/schemas/Media.ts +0 -179
  380. package/src/schemas/MediaProvider.ts +0 -70
  381. package/src/schemas/Theme.ts +0 -406
  382. package/src/schemas/Transitions.ts +0 -224
  383. package/src/schemas/Types.ts +0 -15
  384. package/src/schemas/Viewport.ts +0 -91
  385. package/src/schemas/colorUtils.ts +0 -219
  386. package/src/schemas/fontStacks.ts +0 -339
  387. package/src/schemas/index.ts +0 -29
  388. package/src/schemas/themeCompile.ts +0 -237
  389. package/src/schemas/themeConstants.ts +0 -2
  390. package/src/schemas/themeLibrary.ts +0 -60
  391. package/src/schemas/themeValidator.ts +0 -426
  392. package/src/schemas/themes/bold.json +0 -48
  393. package/src/schemas/themes/cinematic.json +0 -111
  394. package/src/schemas/themes/documentary.json +0 -96
  395. package/src/schemas/themes/gezellig.json +0 -93
  396. package/src/schemas/themes/index.ts +0 -53
  397. package/src/schemas/themes/magazine.json +0 -89
  398. package/src/schemas/themes/minimalist.json +0 -45
  399. package/src/schemas/themes/morning-light.json +0 -85
  400. package/src/schemas/themes/standard-dark.json +0 -85
  401. package/src/schemas/themes/standard.json +0 -74
  402. package/src/schemas/themes/tech-dark.json +0 -101
  403. package/src/schemas/themes/warm-earth.json +0 -50
  404. package/src/spatial/Geohash.ts +0 -196
  405. package/src/spatial/Haversine.ts +0 -59
  406. package/src/spatial/index.ts +0 -2
  407. package/src/storage/ContentContainer.ts +0 -220
  408. package/src/storage/LocalForageAdapter.ts +0 -103
  409. package/src/storage/LocalStorageAdapter.ts +0 -57
  410. package/src/storage/MediaProviderFromContainer.ts +0 -92
  411. package/src/storage/MemoryStorageAdapter.ts +0 -37
  412. package/src/storage/ScopedContentContainer.ts +0 -143
  413. package/src/storage/Storage.ts +0 -28
  414. package/src/storage/index.ts +0 -9
  415. package/src/timing/index.ts +0 -17
  416. package/src/timing/narrationTiming.ts +0 -220
  417. package/src/timing/readingTime.ts +0 -94
  418. package/src/transform/applyTransform.ts +0 -122
  419. package/src/transform/blockAnalyzer.ts +0 -181
  420. package/src/transform/index.ts +0 -23
  421. package/src/transform/registry.ts +0 -198
  422. package/src/transform/styles/dataDriven.ts +0 -17
  423. package/src/transform/styles/documentary.ts +0 -17
  424. package/src/transform/styles/index.ts +0 -5
  425. package/src/transform/styles/magazine.ts +0 -18
  426. package/src/transform/styles/minimal.ts +0 -17
  427. package/src/transform/styles/narrative.ts +0 -18
  428. package/src/transform/templateSelector.ts +0 -389
  429. package/src/transform/timingAllocator.ts +0 -257
  430. package/src/transform/types.ts +0 -151
  431. package/src/versions/DocumentVersionManager.ts +0 -70
  432. package/src/versions/gitignore.ts +0 -34
  433. package/src/versions/index.ts +0 -56
  434. package/src/versions/operations.ts +0 -144
  435. package/src/versions/paths.ts +0 -51
  436. package/src/versions/snapshotStore.ts +0 -202
  437. package/src/versions/timestamp.ts +0 -48
  438. package/src/versions/types.ts +0 -93
@@ -1,91 +0,0 @@
1
- /**
2
- * Viewport Configuration
3
- *
4
- * Defines viewport dimensions for doc rendering across different aspect ratios.
5
- * Templates use this configuration to adapt their layouts appropriately.
6
- *
7
- * Supported aspect ratios:
8
- * - landscape (16:9) - Default, standard video/presentation format
9
- * - portrait (9:16) - Vertical video, mobile stories
10
- * - square (1:1) - Social media posts
11
- * - standard (4:3) - Classic presentation format
12
- */
13
-
14
- /**
15
- * Viewport configuration for doc rendering.
16
- */
17
- export interface ViewportConfig {
18
- /** Canonical width in virtual pixels */
19
- width: number;
20
- /** Canonical height in virtual pixels */
21
- height: number;
22
- /** Human-readable name for debugging/display */
23
- name: string;
24
- }
25
-
26
- /**
27
- * Standard viewport presets for common aspect ratios.
28
- */
29
- export const VIEWPORT_PRESETS = {
30
- /** 16:9 landscape (default, 1080p) */
31
- landscape: { width: 1920, height: 1080, name: '16:9 Landscape' },
32
- /** 9:16 portrait (vertical video, stories) */
33
- portrait: { width: 1080, height: 1920, name: '9:16 Portrait' },
34
- /** 1:1 square (social media) */
35
- square: { width: 1080, height: 1080, name: '1:1 Square' },
36
- /** 4:3 standard */
37
- standard: { width: 1440, height: 1080, name: '4:3 Standard' },
38
- } as const;
39
-
40
- /**
41
- * Viewport preset name.
42
- */
43
- export type ViewportPreset = keyof typeof VIEWPORT_PRESETS;
44
-
45
- /**
46
- * Viewport orientation derived from aspect ratio.
47
- */
48
- export type ViewportOrientation = 'landscape' | 'portrait' | 'square';
49
-
50
- /**
51
- * Get a viewport configuration from a preset name or return the config if already a ViewportConfig.
52
- */
53
- export function getViewport(viewport: ViewportPreset | ViewportConfig): ViewportConfig {
54
- if (typeof viewport === 'string') {
55
- return VIEWPORT_PRESETS[viewport];
56
- }
57
- return viewport;
58
- }
59
-
60
- /**
61
- * Calculate font scale factor for a viewport.
62
- * Based on diagonal pixels relative to 1080p landscape reference.
63
- * This ensures text remains readable across different viewport sizes.
64
- */
65
- const REFERENCE_DIAGONAL = Math.sqrt(1920 * 1920 + 1080 * 1080); // ~2203
66
-
67
- export function calculateFontScale(viewport: ViewportConfig): number {
68
- const currentDiagonal = Math.sqrt(
69
- viewport.width * viewport.width + viewport.height * viewport.height,
70
- );
71
- return currentDiagonal / REFERENCE_DIAGONAL;
72
- }
73
-
74
- /**
75
- * Determine if viewport is landscape, portrait, or square.
76
- */
77
- export function getViewportOrientation(viewport: ViewportConfig): ViewportOrientation {
78
- const ratio = viewport.width / viewport.height;
79
- // Allow small tolerance for "square" classification
80
- if (Math.abs(ratio - 1) < 0.05) return 'square';
81
- return ratio > 1 ? 'landscape' : 'portrait';
82
- }
83
-
84
- /**
85
- * Get aspect ratio as a string (e.g., "16:9", "9:16", "1:1").
86
- */
87
- export function getAspectRatioString(viewport: ViewportConfig): string {
88
- const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));
89
- const divisor = gcd(viewport.width, viewport.height);
90
- return `${viewport.width / divisor}:${viewport.height / divisor}`;
91
- }
@@ -1,219 +0,0 @@
1
- /**
2
- * Color Utilities
3
- *
4
- * Pure-JS color math used by theme compilation and contrast checks.
5
- * No dependencies. Operates on `#rrggbb` hex strings.
6
- *
7
- * Internally uses OKLCh — perceptually uniform, so lightening by 0.1
8
- * looks like the same change at any starting point. Out-of-gamut
9
- * results are clamped to sRGB.
10
- */
11
-
12
- const HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
13
-
14
- /** Test whether a string is a valid `#rgb` or `#rrggbb` hex color. */
15
- export function isHex(value: string): boolean {
16
- return HEX_RE.test(value);
17
- }
18
-
19
- /** Parse `#rgb` or `#rrggbb` into 0..1 sRGB triplet. Returns null on failure. */
20
- function parseHex(hex: string): [number, number, number] | null {
21
- if (!HEX_RE.test(hex)) return null;
22
- let body = hex.slice(1);
23
- if (body.length === 3)
24
- body = body
25
- .split('')
26
- .map((c) => c + c)
27
- .join('');
28
- return [
29
- parseInt(body.slice(0, 2), 16) / 255,
30
- parseInt(body.slice(2, 4), 16) / 255,
31
- parseInt(body.slice(4, 6), 16) / 255,
32
- ];
33
- }
34
-
35
- function toHex(rgb: [number, number, number]): string {
36
- const ch = (v: number) => {
37
- const c = Math.max(0, Math.min(255, Math.round(v * 255)));
38
- return c.toString(16).padStart(2, '0');
39
- };
40
- return '#' + ch(rgb[0]) + ch(rgb[1]) + ch(rgb[2]);
41
- }
42
-
43
- function srgbToLinear(c: number): number {
44
- return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
45
- }
46
-
47
- function linearToSrgb(c: number): number {
48
- return c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
49
- }
50
-
51
- interface OKLCh {
52
- L: number;
53
- C: number;
54
- h: number;
55
- }
56
-
57
- function rgbToOklch(rgb: [number, number, number]): OKLCh {
58
- const [sr, sg, sb] = rgb;
59
- const r = srgbToLinear(sr);
60
- const g = srgbToLinear(sg);
61
- const b = srgbToLinear(sb);
62
-
63
- const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;
64
- const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;
65
- const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;
66
-
67
- const l_ = Math.cbrt(l);
68
- const m_ = Math.cbrt(m);
69
- const s_ = Math.cbrt(s);
70
-
71
- const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
72
- const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
73
- const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
74
-
75
- const C = Math.sqrt(a * a + bb * bb);
76
- let h = (Math.atan2(bb, a) * 180) / Math.PI;
77
- if (h < 0) h += 360;
78
- return { L, C, h };
79
- }
80
-
81
- function oklchToRgb({ L, C, h }: OKLCh): [number, number, number] {
82
- const hr = (h * Math.PI) / 180;
83
- const a = C * Math.cos(hr);
84
- const bb = C * Math.sin(hr);
85
-
86
- const l_ = L + 0.3963377774 * a + 0.2158037573 * bb;
87
- const m_ = L - 0.1055613458 * a - 0.0638541728 * bb;
88
- const s_ = L - 0.0894841775 * a - 1.291485548 * bb;
89
-
90
- const l = l_ * l_ * l_;
91
- const m = m_ * m_ * m_;
92
- const s = s_ * s_ * s_;
93
-
94
- const r = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;
95
- const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;
96
- const b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;
97
-
98
- return [
99
- Math.max(0, Math.min(1, linearToSrgb(r))),
100
- Math.max(0, Math.min(1, linearToSrgb(g))),
101
- Math.max(0, Math.min(1, linearToSrgb(b))),
102
- ];
103
- }
104
-
105
- /**
106
- * Lighten a color by `amount` (0..1) in OKLCh L space.
107
- * Falls back to the input on parse failure.
108
- */
109
- export function oklchLighten(hex: string, amount: number): string {
110
- const rgb = parseHex(hex);
111
- if (!rgb) return hex;
112
- const lch = rgbToOklch(rgb);
113
- lch.L = Math.max(0, Math.min(1, lch.L + amount));
114
- return toHex(oklchToRgb(lch));
115
- }
116
-
117
- /**
118
- * Darken a color by `amount` (0..1) in OKLCh L space.
119
- * Falls back to the input on parse failure.
120
- */
121
- export function oklchDarken(hex: string, amount: number): string {
122
- return oklchLighten(hex, -amount);
123
- }
124
-
125
- /**
126
- * Adjust the OKLCh chroma of a color by a multiplier (e.g. 0.7 to mute).
127
- */
128
- export function oklchSetChroma(hex: string, multiplier: number): string {
129
- const rgb = parseHex(hex);
130
- if (!rgb) return hex;
131
- const lch = rgbToOklch(rgb);
132
- lch.C = Math.max(0, lch.C * multiplier);
133
- return toHex(oklchToRgb(lch));
134
- }
135
-
136
- /**
137
- * WCAG relative luminance of a hex color, returned as 0..1.
138
- */
139
- export function relativeLuminance(hex: string): number {
140
- const rgb = parseHex(hex);
141
- if (!rgb) return 0;
142
- const [r, g, b] = rgb.map(srgbToLinear) as [number, number, number];
143
- return 0.2126 * r + 0.7152 * g + 0.0722 * b;
144
- }
145
-
146
- /**
147
- * Hue of a hex color in HSL degrees (0..360). Returns 0 for pure grays
148
- * and on parse failure. Used by the duotone image treatment to aim its
149
- * `hue-rotate()` at the theme's tint color.
150
- */
151
- export function hexHueDegrees(hex: string): number {
152
- const rgb = parseHex(hex);
153
- if (!rgb) return 0;
154
- const [r, g, b] = rgb;
155
- const max = Math.max(r, g, b);
156
- const min = Math.min(r, g, b);
157
- if (max === min) return 0;
158
- const d = max - min;
159
- let h: number;
160
- if (max === r) h = ((g - b) / d) % 6;
161
- else if (max === g) h = (b - r) / d + 2;
162
- else h = (r - g) / d + 4;
163
- return Math.round((h * 60 + 360) % 360);
164
- }
165
-
166
- /**
167
- * Convert a hex color + alpha (0..1) to an `rgba()` string.
168
- * Falls back to the input on parse failure (e.g. a value that is
169
- * already an rgba()/gradient string).
170
- */
171
- export function withAlpha(hex: string, alpha: number): string {
172
- const rgb = parseHex(hex);
173
- if (!rgb) return hex;
174
- const a = Math.max(0, Math.min(1, alpha));
175
- const ch = (v: number) => Math.round(v * 255);
176
- return `rgba(${ch(rgb[0])}, ${ch(rgb[1])}, ${ch(rgb[2])}, ${a})`;
177
- }
178
-
179
- /**
180
- * WCAG contrast ratio between two hex colors. Returns 1..21.
181
- */
182
- export function contrastRatio(a: string, b: string): number {
183
- const la = relativeLuminance(a);
184
- const lb = relativeLuminance(b);
185
- const lighter = Math.max(la, lb);
186
- const darker = Math.min(la, lb);
187
- return (lighter + 0.05) / (darker + 0.05);
188
- }
189
-
190
- /**
191
- * Pick a near-white or near-black text color that contrasts well against `bg`.
192
- */
193
- export function pickContrastingText(bg: string, light = '#f7fafc', dark = '#1a202c'): string {
194
- return contrastRatio(bg, dark) >= contrastRatio(bg, light) ? dark : light;
195
- }
196
-
197
- /**
198
- * Derive a 5-step lighter→darker scale from a seed color.
199
- * Stops are evenly spaced in OKLCh L space around the seed.
200
- * `spread` controls amplitude (0.05 = subtle, 0.15 = balanced, 0.22 = high).
201
- */
202
- export function deriveScale(
203
- seedHex: string,
204
- spread = 0.15,
205
- ): {
206
- lighter2: string;
207
- lighter1: string;
208
- base: string;
209
- darker1: string;
210
- darker2: string;
211
- } {
212
- return {
213
- lighter2: oklchLighten(seedHex, spread),
214
- lighter1: oklchLighten(seedHex, spread / 2),
215
- base: seedHex,
216
- darker1: oklchDarken(seedHex, spread / 2),
217
- darker2: oklchDarken(seedHex, spread),
218
- };
219
- }
@@ -1,339 +0,0 @@
1
- /**
2
- * Font Stacks
3
- *
4
- * Curated registry of font families used by built-in themes and offered in
5
- * the theme customizer. Each stack has a stable `id` (referenced by JSON
6
- * theme files via `{ stackId }`) and a CSS `family` string that resolves
7
- * to the actual font when rendered.
8
- *
9
- * Themes never carry raw CSS font strings — they reference a `stackId` or
10
- * specify a `{ custom: { name, fallback } }` form, both of which resolve
11
- * here at render time.
12
- */
13
-
14
- import type { FontFamily, FontFamilyKind } from './Theme.js';
15
-
16
- export interface FontStack {
17
- /** Stable identifier referenced by Theme JSON. */
18
- id: string;
19
- /** Display label for pickers. */
20
- label: string;
21
- /** Full CSS font-family string with safe fallbacks. */
22
- family: string;
23
- /** Categorical bucket for the picker UI. */
24
- kind: FontFamilyKind;
25
- /**
26
- * Google Fonts family name, when this stack is served by Google Fonts.
27
- * Used by exports that bundle a `<link>` to fonts.googleapis.com so the
28
- * face renders correctly even when the host page doesn't preload it.
29
- * Omit (or set to undefined) for purely system stacks.
30
- */
31
- googleFontFamily?: string;
32
- }
33
-
34
- /** All curated stacks, in the order they should appear in pickers. */
35
- export const AVAILABLE_FONT_STACKS: FontStack[] = [
36
- // System defaults
37
- {
38
- id: 'system-sans',
39
- label: 'System Sans',
40
- family: 'system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
41
- kind: 'sans',
42
- },
43
- {
44
- id: 'system-serif',
45
- label: 'System Serif',
46
- family: 'Georgia, "Times New Roman", serif',
47
- kind: 'serif',
48
- },
49
- {
50
- id: 'system-mono',
51
- label: 'System Mono',
52
- family: 'Consolas, "Courier New", monospace',
53
- kind: 'mono',
54
- },
55
- // Curated Google Fonts. `googleFontFamily` is the canonical family
56
- // name Google serves the face under (used by exports that emit a
57
- // `<link rel="stylesheet" href="https://fonts.googleapis.com/...">`
58
- // so the face renders even when the host doesn't preload it).
59
- {
60
- id: 'inter',
61
- label: 'Inter',
62
- family: '"Inter", "Segoe UI", Roboto, sans-serif',
63
- kind: 'sans',
64
- googleFontFamily: 'Inter',
65
- },
66
- {
67
- id: 'ibm-plex-sans',
68
- label: 'IBM Plex Sans',
69
- family: '"IBM Plex Sans", "Segoe UI", Roboto, sans-serif',
70
- kind: 'sans',
71
- googleFontFamily: 'IBM Plex Sans',
72
- },
73
- {
74
- id: 'roboto',
75
- label: 'Roboto',
76
- family: '"Roboto", "Segoe UI", Arial, sans-serif',
77
- kind: 'sans',
78
- googleFontFamily: 'Roboto',
79
- },
80
- {
81
- id: 'dm-sans',
82
- label: 'DM Sans',
83
- family: '"DM Sans", "Segoe UI", Roboto, sans-serif',
84
- kind: 'sans',
85
- googleFontFamily: 'DM Sans',
86
- },
87
- {
88
- id: 'oswald',
89
- label: 'Oswald',
90
- // Condensed grotesques make a far better stand-in for Oswald than
91
- // Impact/Arial Black, whose extreme weight distorts every layout
92
- // tuned for the real face.
93
- family: '"Oswald", "Arial Narrow", "Helvetica Neue Condensed", "Roboto Condensed", sans-serif',
94
- kind: 'display',
95
- googleFontFamily: 'Oswald',
96
- },
97
- {
98
- id: 'playfair',
99
- label: 'Playfair Display',
100
- family: '"Playfair Display", Georgia, serif',
101
- kind: 'serif',
102
- googleFontFamily: 'Playfair Display',
103
- },
104
- {
105
- id: 'source-serif',
106
- label: 'Source Serif',
107
- family: '"Source Serif 4", "PT Serif", Georgia, serif',
108
- kind: 'serif',
109
- googleFontFamily: 'Source Serif 4',
110
- },
111
- {
112
- id: 'merriweather',
113
- label: 'Merriweather',
114
- family: '"Merriweather", Georgia, serif',
115
- kind: 'serif',
116
- googleFontFamily: 'Merriweather',
117
- },
118
- {
119
- id: 'lora',
120
- label: 'Lora',
121
- family: '"Lora", "Merriweather", Georgia, serif',
122
- kind: 'serif',
123
- googleFontFamily: 'Lora',
124
- },
125
- {
126
- id: 'pt-serif',
127
- label: 'PT Serif',
128
- family: '"PT Serif", Georgia, serif',
129
- kind: 'serif',
130
- googleFontFamily: 'PT Serif',
131
- },
132
- {
133
- id: 'crimson',
134
- label: 'Crimson Text',
135
- family: '"Crimson Text", Georgia, serif',
136
- kind: 'serif',
137
- googleFontFamily: 'Crimson Text',
138
- },
139
- {
140
- id: 'cormorant',
141
- label: 'Cormorant Garamond',
142
- family: '"Cormorant Garamond", Garamond, Georgia, serif',
143
- kind: 'serif',
144
- googleFontFamily: 'Cormorant Garamond',
145
- },
146
- {
147
- id: 'dm-serif',
148
- label: 'DM Serif Display',
149
- family: '"DM Serif Display", Georgia, serif',
150
- kind: 'display',
151
- googleFontFamily: 'DM Serif Display',
152
- },
153
- {
154
- id: 'jetbrains-mono',
155
- label: 'JetBrains Mono',
156
- family: '"JetBrains Mono", "Fira Code", Consolas, monospace',
157
- kind: 'mono',
158
- googleFontFamily: 'JetBrains Mono',
159
- },
160
- // Themed system stacks with emoji fallbacks (used by gezellig)
161
- {
162
- id: 'system-sans-emoji',
163
- label: 'System Sans + Emoji',
164
- family:
165
- 'system-ui, -apple-system, "Segoe UI", Roboto, "OpenMoji Color", "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif',
166
- kind: 'sans',
167
- },
168
- {
169
- id: 'system-serif-emoji',
170
- label: 'System Serif + Emoji',
171
- family:
172
- 'Georgia, "Times New Roman", "OpenMoji Color", "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", serif',
173
- kind: 'serif',
174
- },
175
- ];
176
-
177
- const STACKS_BY_ID: Record<string, FontStack> = Object.fromEntries(
178
- AVAILABLE_FONT_STACKS.map((s) => [s.id, s]),
179
- );
180
-
181
- /** Look up a stack by id. Returns undefined if not registered. */
182
- export function getFontStack(id: string): FontStack | undefined {
183
- return STACKS_BY_ID[id];
184
- }
185
-
186
- /** Default fallback CSS family per kind, used when a custom font has no fallback specified. */
187
- const FALLBACK_BY_KIND: Record<FontFamilyKind, string> = {
188
- sans: 'system-ui, sans-serif',
189
- serif: 'Georgia, serif',
190
- mono: 'Consolas, monospace',
191
- display: '"Arial Narrow", "Helvetica Neue", Arial, sans-serif',
192
- };
193
-
194
- /**
195
- * Resolve a `FontFamily` reference (or legacy raw string) to a CSS family string.
196
- * Used by `getThemeFont` at render time. Never returns an empty string —
197
- * unrecognized stackIds fall back to the requested role's default.
198
- */
199
- export function resolveFontFamily(
200
- family: FontFamily | string | undefined,
201
- roleFallback: string,
202
- ): string {
203
- if (!family) return roleFallback;
204
- if (typeof family === 'string') return family;
205
- if ('stackId' in family) {
206
- const stack = STACKS_BY_ID[family.stackId];
207
- return stack ? stack.family : roleFallback;
208
- }
209
- if ('custom' in family) {
210
- const { name, fallback } = family.custom;
211
- const fb =
212
- fallback === 'system-ui'
213
- ? 'system-ui, sans-serif'
214
- : fallback === 'serif'
215
- ? 'Georgia, serif'
216
- : fallback === 'monospace'
217
- ? 'Consolas, monospace'
218
- : 'system-ui, sans-serif';
219
- const safeName = name.includes(' ') || name.includes(',') ? `"${name}"` : name;
220
- return `${safeName}, ${fb}`;
221
- }
222
- return roleFallback;
223
- }
224
-
225
- /** Convenience: quick `{ stackId }` factory for code that constructs themes. */
226
- export function fontStack(id: string): FontFamily {
227
- return { stackId: id };
228
- }
229
-
230
- /**
231
- * Build a `https://fonts.googleapis.com/css2?...` URL that loads the
232
- * subset of supplied `FontFamily` references that are served by Google
233
- * Fonts. Returns `null` when nothing in the list needs Google hosting
234
- * (system stacks, custom fonts, or unknown stack ids) — callers can use
235
- * that to skip emitting a `<link>` entirely.
236
- *
237
- * The URL requests regular + bold (400/700) for each family, which is
238
- * what the templates use. `display=swap` keeps the fallback visible
239
- * while the web font streams in.
240
- */
241
- export function buildGoogleFontsUrl(families: Array<FontFamily | undefined>): string | null {
242
- const names = new Set<string>();
243
- for (const f of families) {
244
- if (!f || typeof f === 'string') continue;
245
- if ('stackId' in f) {
246
- const stack = STACKS_BY_ID[f.stackId];
247
- if (stack?.googleFontFamily) names.add(stack.googleFontFamily);
248
- }
249
- }
250
- if (names.size === 0) return null;
251
- // css2 syntax: ?family=Name+With+Spaces:wght@400;700&family=Other:wght@400;700&display=swap
252
- const params = Array.from(names)
253
- .sort()
254
- .map((name) => `family=${encodeURIComponent(name).replace(/%20/g, '+')}:wght@400;700`)
255
- .join('&');
256
- return `https://fonts.googleapis.com/css2?${params}&display=swap`;
257
- }
258
-
259
- /** Default fallback families exposed for tools that need them. */
260
- export const FONT_FALLBACKS = FALLBACK_BY_KIND;
261
-
262
- // ── Arbitrary font-name matching ─────────────────────────────────────
263
- //
264
- // Used by file-import theme inference (OOXML fontScheme → FontFamily):
265
- // a typeface name from an office document either matches a curated stack
266
- // or becomes a `{ custom }` reference that preserves the original face.
267
-
268
- /** Normalize a raw typeface name for lookup: trim, unquote, lowercase, collapse whitespace. */
269
- function normalizeFontName(name: string): string {
270
- return name
271
- .trim()
272
- .replace(/^["']+|["']+$/g, '')
273
- .replace(/\s+/g, ' ')
274
- .toLowerCase();
275
- }
276
-
277
- /**
278
- * Normalized name → stackId. Seeded from every stack's label and Google
279
- * Fonts family name, plus explicit aliases for common variants and the
280
- * web-safe faces that already anchor the system stacks' CSS families.
281
- */
282
- const STACK_NAME_ALIASES: Record<string, string> = (() => {
283
- const aliases: Record<string, string> = {};
284
- for (const stack of AVAILABLE_FONT_STACKS) {
285
- aliases[normalizeFontName(stack.label)] = stack.id;
286
- if (stack.googleFontFamily) aliases[normalizeFontName(stack.googleFontFamily)] = stack.id;
287
- }
288
- Object.assign(aliases, {
289
- playfair: 'playfair',
290
- 'source serif': 'source-serif',
291
- 'source serif pro': 'source-serif',
292
- 'crimson pro': 'crimson',
293
- cormorant: 'cormorant',
294
- georgia: 'system-serif',
295
- 'times new roman': 'system-serif',
296
- times: 'system-serif',
297
- consolas: 'system-mono',
298
- 'courier new': 'system-mono',
299
- courier: 'system-mono',
300
- 'segoe ui': 'system-sans',
301
- 'system-ui': 'system-sans',
302
- });
303
- return aliases;
304
- })();
305
-
306
- const MONO_NAME_RE =
307
- /\b(mono|monospace|consolas|courier|menlo|inconsolata|cascadia|fira code|source code|code)\b/;
308
- const SERIF_NAME_RE =
309
- /\b(georgia|times|garamond|cambria|caslon|baskerville|bodoni|didot|palatino|book antiqua|goudy|minion|charter|constantia|century schoolbook|antiqua|roman)\b/;
310
-
311
- /**
312
- * Guess the structured fallback bucket for an arbitrary typeface name.
313
- * Deliberately never guesses `system-ui` — a wrong serif/sans guess is
314
- * recoverable in the customizer; `system-ui` erases the signal entirely.
315
- */
316
- export function guessFontFallback(
317
- name: string,
318
- ): 'serif' | 'sans-serif' | 'monospace' | 'system-ui' {
319
- const n = normalizeFontName(name);
320
- if (MONO_NAME_RE.test(n)) return 'monospace';
321
- if ((n.includes('serif') && !n.includes('sans')) || SERIF_NAME_RE.test(n)) return 'serif';
322
- return 'sans-serif';
323
- }
324
-
325
- /**
326
- * Map an arbitrary typeface name (e.g. from an imported office document's
327
- * fontScheme) to a `FontFamily`: a curated `{ stackId }` when the name
328
- * matches a known stack, else `{ custom }` preserving the original name
329
- * (original casing, quotes stripped) with a heuristic fallback bucket.
330
- * Empty/blank names resolve to the system sans stack.
331
- */
332
- export function matchFontFamily(name: string): FontFamily {
333
- const normalized = normalizeFontName(name);
334
- if (!normalized) return { stackId: 'system-sans' };
335
- const stackId = STACK_NAME_ALIASES[normalized];
336
- if (stackId) return { stackId };
337
- const displayName = name.trim().replace(/^["']+|["']+$/g, '');
338
- return { custom: { name: displayName, fallback: guessFontFallback(name) } };
339
- }
@@ -1,29 +0,0 @@
1
- export * from './Types.js';
2
- export * from './Doc.js';
3
- export * from './Transitions.js';
4
- export * from './Media.js';
5
- export * from './BlockTemplates.js';
6
- export * from './CustomTemplates.js';
7
- export * from './Theme.js';
8
- export * from './themeLibrary.js';
9
- export * from './themeValidator.js';
10
- export * from './themeCompile.js';
11
- export * from './fontStacks.js';
12
- export * from './colorUtils.js';
13
- export * from './Viewport.js';
14
- export {
15
- getLayoutHints,
16
- getTwoColumnPositions,
17
- getSafeTextBounds,
18
- scaledFontSize as layoutScaledFontSize,
19
- } from './LayoutStrategy.js';
20
- export type { LayoutHints } from './LayoutStrategy.js';
21
- export type { MediaProvider, MediaEntry } from './MediaProvider.js';
22
- export type {
23
- ImageEditDoc,
24
- ImageEditLayer,
25
- ImageEditLayerKind,
26
- ImageEditCanvas,
27
- ImageEditMeta,
28
- EditorLayerMeta,
29
- } from './ImageEditDoc.js';