react-cheminfo 0.64.1 → 0.66.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 (827) hide show
  1. package/README.md +293 -6
  2. package/lib/card/core/cardAddress.d.ts +70 -0
  3. package/lib/card/core/cardAddress.d.ts.map +1 -0
  4. package/lib/card/core/cardAddress.js +59 -0
  5. package/lib/card/core/cardAddress.js.map +1 -0
  6. package/lib/card/core/cardPageUrl.d.ts +49 -0
  7. package/lib/card/core/cardPageUrl.d.ts.map +1 -0
  8. package/lib/card/core/cardPageUrl.js +59 -0
  9. package/lib/card/core/cardPageUrl.js.map +1 -0
  10. package/lib/card/core/index.d.ts +7 -0
  11. package/lib/card/core/index.d.ts.map +1 -0
  12. package/lib/card/core/index.js +4 -0
  13. package/lib/card/core/index.js.map +1 -0
  14. package/lib/card/core/panelRoom.d.ts +40 -0
  15. package/lib/card/core/panelRoom.d.ts.map +1 -0
  16. package/lib/card/core/panelRoom.js +40 -0
  17. package/lib/card/core/panelRoom.js.map +1 -0
  18. package/lib/card/ui/CardDetailsButton.d.ts +38 -0
  19. package/lib/card/ui/CardDetailsButton.d.ts.map +1 -0
  20. package/lib/card/ui/CardDetailsButton.js +50 -0
  21. package/lib/card/ui/CardDetailsButton.js.map +1 -0
  22. package/lib/card/ui/CardFigure.d.ts +51 -0
  23. package/lib/card/ui/CardFigure.d.ts.map +1 -0
  24. package/lib/card/ui/CardFigure.js +27 -0
  25. package/lib/card/ui/CardFigure.js.map +1 -0
  26. package/lib/card/ui/CardFrame.d.ts +30 -0
  27. package/lib/card/ui/CardFrame.d.ts.map +1 -0
  28. package/lib/card/ui/CardFrame.js +20 -0
  29. package/lib/card/ui/CardFrame.js.map +1 -0
  30. package/lib/card/ui/CopyTableButton.d.ts +37 -0
  31. package/lib/card/ui/CopyTableButton.d.ts.map +1 -0
  32. package/lib/card/ui/CopyTableButton.js +19 -0
  33. package/lib/card/ui/CopyTableButton.js.map +1 -0
  34. package/lib/card/ui/cardTooltip.d.ts +14 -0
  35. package/lib/card/ui/cardTooltip.d.ts.map +1 -0
  36. package/lib/card/ui/cardTooltip.js +15 -0
  37. package/lib/card/ui/cardTooltip.js.map +1 -0
  38. package/lib/card/ui/embed.d.ts +15 -0
  39. package/lib/card/ui/embed.d.ts.map +1 -0
  40. package/lib/card/ui/embed.js +24 -0
  41. package/lib/card/ui/embed.js.map +1 -0
  42. package/lib/card/ui/fitCardToFrame.d.ts +31 -0
  43. package/lib/card/ui/fitCardToFrame.d.ts.map +1 -0
  44. package/lib/card/ui/fitCardToFrame.js +66 -0
  45. package/lib/card/ui/fitCardToFrame.js.map +1 -0
  46. package/lib/card/ui/holdRoomForPanels.d.ts +16 -0
  47. package/lib/card/ui/holdRoomForPanels.d.ts.map +1 -0
  48. package/lib/card/ui/holdRoomForPanels.js +76 -0
  49. package/lib/card/ui/holdRoomForPanels.js.map +1 -0
  50. package/lib/card/ui/index.d.ts +11 -0
  51. package/lib/card/ui/index.d.ts.map +1 -0
  52. package/lib/card/ui/index.js +7 -0
  53. package/lib/card/ui/index.js.map +1 -0
  54. package/lib/card/ui/openPanels.d.ts +25 -0
  55. package/lib/card/ui/openPanels.d.ts.map +1 -0
  56. package/lib/card/ui/openPanels.js +85 -0
  57. package/lib/card/ui/openPanels.js.map +1 -0
  58. package/lib/card.d.ts +13 -0
  59. package/lib/card.d.ts.map +1 -0
  60. package/lib/card.js +13 -0
  61. package/lib/card.js.map +1 -0
  62. package/lib/conformers.d.ts +1 -0
  63. package/lib/conformers.d.ts.map +1 -1
  64. package/lib/conformers.js +1 -0
  65. package/lib/conformers.js.map +1 -1
  66. package/lib/core.d.ts +4 -0
  67. package/lib/core.d.ts.map +1 -1
  68. package/lib/core.js +5 -0
  69. package/lib/core.js.map +1 -1
  70. package/lib/fetch/core/apiError.d.ts +56 -0
  71. package/lib/fetch/core/apiError.d.ts.map +1 -0
  72. package/lib/fetch/core/apiError.js +43 -0
  73. package/lib/fetch/core/apiError.js.map +1 -0
  74. package/lib/fetch/core/fetchJson.d.ts +47 -0
  75. package/lib/fetch/core/fetchJson.d.ts.map +1 -0
  76. package/lib/fetch/core/fetchJson.js +109 -0
  77. package/lib/fetch/core/fetchJson.js.map +1 -0
  78. package/lib/fetch/core/index.d.ts +5 -0
  79. package/lib/fetch/core/index.d.ts.map +1 -0
  80. package/lib/fetch/core/index.js +3 -0
  81. package/lib/fetch/core/index.js.map +1 -0
  82. package/lib/formula/core/formulaText.d.ts +46 -0
  83. package/lib/formula/core/formulaText.d.ts.map +1 -0
  84. package/lib/formula/core/formulaText.js +74 -0
  85. package/lib/formula/core/formulaText.js.map +1 -0
  86. package/lib/formula/core/index.d.ts +6 -0
  87. package/lib/formula/core/index.d.ts.map +1 -0
  88. package/lib/formula/core/index.js +4 -0
  89. package/lib/formula/core/index.js.map +1 -0
  90. package/lib/formula/core/normalizeFormula.d.ts +22 -0
  91. package/lib/formula/core/normalizeFormula.d.ts.map +1 -0
  92. package/lib/formula/core/normalizeFormula.js +46 -0
  93. package/lib/formula/core/normalizeFormula.js.map +1 -0
  94. package/lib/formula/core/readFormula.d.ts +73 -0
  95. package/lib/formula/core/readFormula.d.ts.map +1 -0
  96. package/lib/formula/core/readFormula.js +132 -0
  97. package/lib/formula/core/readFormula.js.map +1 -0
  98. package/lib/formula/ui/CopyableFormula.d.ts +31 -0
  99. package/lib/formula/ui/CopyableFormula.d.ts.map +1 -0
  100. package/lib/formula/ui/CopyableFormula.js +19 -0
  101. package/lib/formula/ui/CopyableFormula.js.map +1 -0
  102. package/lib/formula/ui/FormulaInput.d.ts +29 -0
  103. package/lib/formula/ui/FormulaInput.d.ts.map +1 -0
  104. package/lib/formula/ui/FormulaInput.js +16 -0
  105. package/lib/formula/ui/FormulaInput.js.map +1 -0
  106. package/lib/formula/ui/QuestionFormula.d.ts +14 -0
  107. package/lib/formula/ui/QuestionFormula.d.ts.map +1 -0
  108. package/lib/formula/ui/QuestionFormula.js +13 -0
  109. package/lib/formula/ui/QuestionFormula.js.map +1 -0
  110. package/lib/formula/ui/index.d.ts +7 -0
  111. package/lib/formula/ui/index.d.ts.map +1 -0
  112. package/lib/formula/ui/index.js +4 -0
  113. package/lib/formula/ui/index.js.map +1 -0
  114. package/lib/formula.d.ts +11 -0
  115. package/lib/formula.d.ts.map +1 -0
  116. package/lib/formula.js +11 -0
  117. package/lib/formula.js.map +1 -0
  118. package/lib/hooks/ui/index.d.ts +1 -0
  119. package/lib/hooks/ui/index.d.ts.map +1 -1
  120. package/lib/hooks/ui/index.js.map +1 -1
  121. package/lib/hooks/ui/keyTargets.d.ts +4 -2
  122. package/lib/hooks/ui/keyTargets.d.ts.map +1 -1
  123. package/lib/hooks/ui/keyTargets.js +5 -3
  124. package/lib/hooks/ui/keyTargets.js.map +1 -1
  125. package/lib/hooks/ui/useAsync.d.ts +20 -5
  126. package/lib/hooks/ui/useAsync.d.ts.map +1 -1
  127. package/lib/hooks/ui/useAsync.js +29 -14
  128. package/lib/hooks/ui/useAsync.js.map +1 -1
  129. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  130. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  131. package/lib/ir/core/analysisSpectra.d.ts +23 -6
  132. package/lib/ir/core/analysisSpectra.d.ts.map +1 -1
  133. package/lib/ir/core/analysisSpectra.js.map +1 -1
  134. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -1
  135. package/lib/ir/core/bandLabelPlan.js +11 -6
  136. package/lib/ir/core/bandLabelPlan.js.map +1 -1
  137. package/lib/ir/core/index.d.ts +13 -9
  138. package/lib/ir/core/index.d.ts.map +1 -1
  139. package/lib/ir/core/index.js +9 -6
  140. package/lib/ir/core/index.js.map +1 -1
  141. package/lib/ir/core/irBand.d.ts +45 -14
  142. package/lib/ir/core/irBand.d.ts.map +1 -1
  143. package/lib/ir/core/irBand.js +28 -6
  144. package/lib/ir/core/irBand.js.map +1 -1
  145. package/lib/ir/core/irCommands.d.ts +11 -0
  146. package/lib/ir/core/irCommands.d.ts.map +1 -1
  147. package/lib/ir/core/irCommands.js +11 -1
  148. package/lib/ir/core/irCommands.js.map +1 -1
  149. package/lib/ir/core/irDomain.d.ts +4 -3
  150. package/lib/ir/core/irDomain.d.ts.map +1 -1
  151. package/lib/ir/core/irDomain.js +10 -7
  152. package/lib/ir/core/irDomain.js.map +1 -1
  153. package/lib/ir/core/irFormat.d.ts +14 -2
  154. package/lib/ir/core/irFormat.d.ts.map +1 -1
  155. package/lib/ir/core/irFormat.js +33 -4
  156. package/lib/ir/core/irFormat.js.map +1 -1
  157. package/lib/ir/core/irMode.d.ts +35 -8
  158. package/lib/ir/core/irMode.d.ts.map +1 -1
  159. package/lib/ir/core/irMode.js +38 -10
  160. package/lib/ir/core/irMode.js.map +1 -1
  161. package/lib/ir/core/irReducer.d.ts +0 -28
  162. package/lib/ir/core/irReducer.d.ts.map +1 -1
  163. package/lib/ir/core/irReducer.js +1 -24
  164. package/lib/ir/core/irReducer.js.map +1 -1
  165. package/lib/ir/core/irSpectrum.d.ts +52 -26
  166. package/lib/ir/core/irSpectrum.d.ts.map +1 -1
  167. package/lib/ir/core/irSpectrum.js +21 -15
  168. package/lib/ir/core/irSpectrum.js.map +1 -1
  169. package/lib/ir/core/irState.d.ts +40 -2
  170. package/lib/ir/core/irState.d.ts.map +1 -1
  171. package/lib/ir/core/irState.js +38 -1
  172. package/lib/ir/core/irState.js.map +1 -1
  173. package/lib/ir/core/irTechnique.d.ts +94 -0
  174. package/lib/ir/core/irTechnique.d.ts.map +1 -0
  175. package/lib/ir/core/irTechnique.js +87 -0
  176. package/lib/ir/core/irTechnique.js.map +1 -0
  177. package/lib/ir/core/irTechniqueCommands.d.ts +26 -0
  178. package/lib/ir/core/irTechniqueCommands.d.ts.map +1 -0
  179. package/lib/ir/core/irTechniqueCommands.js +68 -0
  180. package/lib/ir/core/irTechniqueCommands.js.map +1 -0
  181. package/lib/ir/core/pickBands.d.ts +6 -5
  182. package/lib/ir/core/pickBands.d.ts.map +1 -1
  183. package/lib/ir/core/pickBands.js +49 -26
  184. package/lib/ir/core/pickBands.js.map +1 -1
  185. package/lib/ir/core/ramanBands.d.ts +30 -0
  186. package/lib/ir/core/ramanBands.d.ts.map +1 -0
  187. package/lib/ir/core/ramanBands.js +83 -0
  188. package/lib/ir/core/ramanBands.js.map +1 -0
  189. package/lib/ir/core/spectrumJcamp.d.ts +10 -5
  190. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -1
  191. package/lib/ir/core/spectrumJcamp.js +63 -15
  192. package/lib/ir/core/spectrumJcamp.js.map +1 -1
  193. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -1
  194. package/lib/ir/core/toIrSpectrum.js +17 -2
  195. package/lib/ir/core/toIrSpectrum.js.map +1 -1
  196. package/lib/ir/ui/BandRow.d.ts +30 -0
  197. package/lib/ir/ui/BandRow.d.ts.map +1 -0
  198. package/lib/ir/ui/BandRow.js +42 -0
  199. package/lib/ir/ui/BandRow.js.map +1 -0
  200. package/lib/ir/ui/BandsPanel.d.ts +4 -0
  201. package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
  202. package/lib/ir/ui/BandsPanel.js +14 -59
  203. package/lib/ir/ui/BandsPanel.js.map +1 -1
  204. package/lib/ir/ui/IrAboutDialog.d.ts +7 -0
  205. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -1
  206. package/lib/ir/ui/IrAboutDialog.js +16 -3
  207. package/lib/ir/ui/IrAboutDialog.js.map +1 -1
  208. package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
  209. package/lib/ir/ui/IrCanvas.js +2 -2
  210. package/lib/ir/ui/IrCanvas.js.map +1 -1
  211. package/lib/ir/ui/IrChart.d.ts +2 -1
  212. package/lib/ir/ui/IrChart.d.ts.map +1 -1
  213. package/lib/ir/ui/IrChart.js +18 -21
  214. package/lib/ir/ui/IrChart.js.map +1 -1
  215. package/lib/ir/ui/IrCommandProvider.d.ts +7 -0
  216. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -1
  217. package/lib/ir/ui/IrCommandProvider.js +2 -2
  218. package/lib/ir/ui/IrCommandProvider.js.map +1 -1
  219. package/lib/ir/ui/IrCommandTooltip.d.ts +7 -0
  220. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -1
  221. package/lib/ir/ui/IrCommandTooltip.js +3 -2
  222. package/lib/ir/ui/IrCommandTooltip.js.map +1 -1
  223. package/lib/ir/ui/IrDocumentationDialog.d.ts +8 -1
  224. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -1
  225. package/lib/ir/ui/IrDocumentationDialog.js +30 -7
  226. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
  227. package/lib/ir/ui/IrEditor.d.ts +3 -1
  228. package/lib/ir/ui/IrEditor.d.ts.map +1 -1
  229. package/lib/ir/ui/IrEditor.js +3 -20
  230. package/lib/ir/ui/IrEditor.js.map +1 -1
  231. package/lib/ir/ui/IrHeader.d.ts.map +1 -1
  232. package/lib/ir/ui/IrHeader.js +5 -1
  233. package/lib/ir/ui/IrHeader.js.map +1 -1
  234. package/lib/ir/ui/IrLogo.d.ts +11 -3
  235. package/lib/ir/ui/IrLogo.d.ts.map +1 -1
  236. package/lib/ir/ui/IrLogo.js +14 -5
  237. package/lib/ir/ui/IrLogo.js.map +1 -1
  238. package/lib/ir/ui/IrShell.d.ts.map +1 -1
  239. package/lib/ir/ui/IrShell.js +23 -56
  240. package/lib/ir/ui/IrShell.js.map +1 -1
  241. package/lib/ir/ui/IrStatusBar.d.ts +3 -2
  242. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
  243. package/lib/ir/ui/IrStatusBar.js +14 -9
  244. package/lib/ir/ui/IrStatusBar.js.map +1 -1
  245. package/lib/ir/ui/IrToolbar.d.ts +3 -0
  246. package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
  247. package/lib/ir/ui/IrToolbar.js +10 -3
  248. package/lib/ir/ui/IrToolbar.js.map +1 -1
  249. package/lib/ir/ui/IrTraces.d.ts +4 -1
  250. package/lib/ir/ui/IrTraces.d.ts.map +1 -1
  251. package/lib/ir/ui/IrTraces.js +2 -0
  252. package/lib/ir/ui/IrTraces.js.map +1 -1
  253. package/lib/ir/ui/RamanEditor.d.ts +46 -0
  254. package/lib/ir/ui/RamanEditor.d.ts.map +1 -0
  255. package/lib/ir/ui/RamanEditor.js +17 -0
  256. package/lib/ir/ui/RamanEditor.js.map +1 -0
  257. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -1
  258. package/lib/ir/ui/SpectraPanel.js +2 -2
  259. package/lib/ir/ui/SpectraPanel.js.map +1 -1
  260. package/lib/ir/ui/SpectrumRow.d.ts +7 -0
  261. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -1
  262. package/lib/ir/ui/SpectrumRow.js +4 -5
  263. package/lib/ir/ui/SpectrumRow.js.map +1 -1
  264. package/lib/ir/ui/VibrationalEditor.d.ts +48 -0
  265. package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -0
  266. package/lib/ir/ui/VibrationalEditor.js +31 -0
  267. package/lib/ir/ui/VibrationalEditor.js.map +1 -0
  268. package/lib/ir/ui/bandsTsv.d.ts +19 -0
  269. package/lib/ir/ui/bandsTsv.d.ts.map +1 -0
  270. package/lib/ir/ui/bandsTsv.js +38 -0
  271. package/lib/ir/ui/bandsTsv.js.map +1 -0
  272. package/lib/ir/ui/irChartProps.d.ts +14 -4
  273. package/lib/ir/ui/irChartProps.d.ts.map +1 -1
  274. package/lib/ir/ui/irChartProps.js +3 -2
  275. package/lib/ir/ui/irChartProps.js.map +1 -1
  276. package/lib/ir/ui/irCommandContext.d.ts +8 -0
  277. package/lib/ir/ui/irCommandContext.d.ts.map +1 -1
  278. package/lib/ir/ui/irCommandContext.js +14 -3
  279. package/lib/ir/ui/irCommandContext.js.map +1 -1
  280. package/lib/ir/ui/useIrEditor.d.ts +3 -3
  281. package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
  282. package/lib/ir/ui/useIrEditor.js +13 -4
  283. package/lib/ir/ui/useIrEditor.js.map +1 -1
  284. package/lib/ir/ui/useIrHandle.d.ts +14 -0
  285. package/lib/ir/ui/useIrHandle.d.ts.map +1 -0
  286. package/lib/ir/ui/useIrHandle.js +39 -0
  287. package/lib/ir/ui/useIrHandle.js.map +1 -0
  288. package/lib/ir/ui/useIrText.d.ts +40 -0
  289. package/lib/ir/ui/useIrText.d.ts.map +1 -0
  290. package/lib/ir/ui/useIrText.js +118 -0
  291. package/lib/ir/ui/useIrText.js.map +1 -0
  292. package/lib/ir/ui/useIrZoom.d.ts +7 -0
  293. package/lib/ir/ui/useIrZoom.d.ts.map +1 -1
  294. package/lib/ir/ui/useIrZoom.js +5 -4
  295. package/lib/ir/ui/useIrZoom.js.map +1 -1
  296. package/lib/ir/ui/useValueAxisZoom.d.ts +20 -0
  297. package/lib/ir/ui/useValueAxisZoom.d.ts.map +1 -0
  298. package/lib/ir/ui/useValueAxisZoom.js +54 -0
  299. package/lib/ir/ui/useValueAxisZoom.js.map +1 -0
  300. package/lib/ir.d.ts +3 -0
  301. package/lib/ir.d.ts.map +1 -1
  302. package/lib/ir.js +3 -0
  303. package/lib/ir.js.map +1 -1
  304. package/lib/locales/de.json +57 -1
  305. package/lib/locales/en.json +57 -1
  306. package/lib/locales/es.json +57 -1
  307. package/lib/locales/fr.json +57 -1
  308. package/lib/locales/it.json +57 -1
  309. package/lib/moleculesClient/core/index.d.ts +5 -0
  310. package/lib/moleculesClient/core/index.d.ts.map +1 -0
  311. package/lib/moleculesClient/core/index.js +3 -0
  312. package/lib/moleculesClient/core/index.js.map +1 -0
  313. package/lib/moleculesClient/core/moleculesClient.d.ts +12 -0
  314. package/lib/moleculesClient/core/moleculesClient.d.ts.map +1 -0
  315. package/lib/moleculesClient/core/moleculesClient.js +105 -0
  316. package/lib/moleculesClient/core/moleculesClient.js.map +1 -0
  317. package/lib/moleculesClient/core/moleculesClientApi.d.ts +100 -0
  318. package/lib/moleculesClient/core/moleculesClientApi.d.ts.map +1 -0
  319. package/lib/moleculesClient/core/moleculesClientApi.js +20 -0
  320. package/lib/moleculesClient/core/moleculesClientApi.js.map +1 -0
  321. package/lib/moleculesClient/core/moleculesTypes.d.ts +154 -0
  322. package/lib/moleculesClient/core/moleculesTypes.d.ts.map +1 -0
  323. package/lib/moleculesClient/core/moleculesTypes.js +2 -0
  324. package/lib/moleculesClient/core/moleculesTypes.js.map +1 -0
  325. package/lib/moleculesClient/core/requestRetry.d.ts +50 -0
  326. package/lib/moleculesClient/core/requestRetry.d.ts.map +1 -0
  327. package/lib/moleculesClient/core/requestRetry.js +108 -0
  328. package/lib/moleculesClient/core/requestRetry.js.map +1 -0
  329. package/lib/molstar/core/camera.d.ts +2 -1
  330. package/lib/molstar/core/camera.d.ts.map +1 -1
  331. package/lib/molstar/core/camera.js +3 -2
  332. package/lib/molstar/core/camera.js.map +1 -1
  333. package/lib/molstar/core/framing.d.ts +102 -0
  334. package/lib/molstar/core/framing.d.ts.map +1 -0
  335. package/lib/molstar/core/framing.js +120 -0
  336. package/lib/molstar/core/framing.js.map +1 -0
  337. package/lib/molstar/core/hover.d.ts +16 -0
  338. package/lib/molstar/core/hover.d.ts.map +1 -1
  339. package/lib/molstar/core/hover.js +14 -0
  340. package/lib/molstar/core/hover.js.map +1 -1
  341. package/lib/molstar/core/index.d.ts +4 -1
  342. package/lib/molstar/core/index.d.ts.map +1 -1
  343. package/lib/molstar/core/index.js +2 -1
  344. package/lib/molstar/core/index.js.map +1 -1
  345. package/lib/pedagogy/core/answers.d.ts +46 -0
  346. package/lib/pedagogy/core/answers.d.ts.map +1 -0
  347. package/lib/pedagogy/core/answers.js +77 -0
  348. package/lib/pedagogy/core/answers.js.map +1 -0
  349. package/lib/pedagogy/core/attempts.d.ts +86 -0
  350. package/lib/pedagogy/core/attempts.d.ts.map +1 -0
  351. package/lib/pedagogy/core/attempts.js +117 -0
  352. package/lib/pedagogy/core/attempts.js.map +1 -0
  353. package/lib/pedagogy/core/index.d.ts +8 -0
  354. package/lib/pedagogy/core/index.d.ts.map +1 -1
  355. package/lib/pedagogy/core/index.js +4 -0
  356. package/lib/pedagogy/core/index.js.map +1 -1
  357. package/lib/pedagogy/core/progressController.d.ts +64 -0
  358. package/lib/pedagogy/core/progressController.d.ts.map +1 -0
  359. package/lib/pedagogy/core/progressController.js +56 -0
  360. package/lib/pedagogy/core/progressController.js.map +1 -0
  361. package/lib/pedagogy/core/seed.d.ts +96 -0
  362. package/lib/pedagogy/core/seed.d.ts.map +1 -0
  363. package/lib/pedagogy/core/seed.js +128 -0
  364. package/lib/pedagogy/core/seed.js.map +1 -0
  365. package/lib/pedagogy/core/series.d.ts +77 -0
  366. package/lib/pedagogy/core/series.d.ts.map +1 -0
  367. package/lib/pedagogy/core/series.js +10 -0
  368. package/lib/pedagogy/core/series.js.map +1 -0
  369. package/lib/pedagogy/ui/AnswerFields.d.ts +21 -0
  370. package/lib/pedagogy/ui/AnswerFields.d.ts.map +1 -0
  371. package/lib/pedagogy/ui/AnswerFields.js +24 -0
  372. package/lib/pedagogy/ui/AnswerFields.js.map +1 -0
  373. package/lib/pedagogy/ui/ExerciseList.d.ts +82 -0
  374. package/lib/pedagogy/ui/ExerciseList.d.ts.map +1 -0
  375. package/lib/pedagogy/ui/ExerciseList.js +53 -0
  376. package/lib/pedagogy/ui/ExerciseList.js.map +1 -0
  377. package/lib/pedagogy/ui/ExerciseSeries.d.ts +95 -0
  378. package/lib/pedagogy/ui/ExerciseSeries.d.ts.map +1 -0
  379. package/lib/pedagogy/ui/ExerciseSeries.js +74 -0
  380. package/lib/pedagogy/ui/ExerciseSeries.js.map +1 -0
  381. package/lib/pedagogy/ui/QuestionCard.d.ts +64 -0
  382. package/lib/pedagogy/ui/QuestionCard.d.ts.map +1 -0
  383. package/lib/pedagogy/ui/QuestionCard.js +73 -0
  384. package/lib/pedagogy/ui/QuestionCard.js.map +1 -0
  385. package/lib/pedagogy/ui/index.d.ts +10 -0
  386. package/lib/pedagogy/ui/index.d.ts.map +1 -1
  387. package/lib/pedagogy/ui/index.js +6 -0
  388. package/lib/pedagogy/ui/index.js.map +1 -1
  389. package/lib/pedagogy/ui/seriesCounts.d.ts +17 -0
  390. package/lib/pedagogy/ui/seriesCounts.d.ts.map +1 -0
  391. package/lib/pedagogy/ui/seriesCounts.js +27 -0
  392. package/lib/pedagogy/ui/seriesCounts.js.map +1 -0
  393. package/lib/pedagogy/ui/seriesParts.d.ts +55 -0
  394. package/lib/pedagogy/ui/seriesParts.d.ts.map +1 -0
  395. package/lib/pedagogy/ui/seriesParts.js +38 -0
  396. package/lib/pedagogy/ui/seriesParts.js.map +1 -0
  397. package/lib/pedagogy/ui/useAttemptRecords.d.ts +10 -0
  398. package/lib/pedagogy/ui/useAttemptRecords.d.ts.map +1 -0
  399. package/lib/pedagogy/ui/useAttemptRecords.js +11 -0
  400. package/lib/pedagogy/ui/useAttemptRecords.js.map +1 -0
  401. package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
  402. package/lib/periodic/ui/PeriodicTable.js +6 -3
  403. package/lib/periodic/ui/PeriodicTable.js.map +1 -1
  404. package/lib/property/core/copyableText.d.ts +14 -0
  405. package/lib/property/core/copyableText.d.ts.map +1 -0
  406. package/lib/property/core/copyableText.js +21 -0
  407. package/lib/property/core/copyableText.js.map +1 -0
  408. package/lib/property/core/index.d.ts +2 -0
  409. package/lib/property/core/index.d.ts.map +1 -0
  410. package/lib/property/core/index.js +2 -0
  411. package/lib/property/core/index.js.map +1 -0
  412. package/lib/property/ui/PropertyTable.d.ts +43 -0
  413. package/lib/property/ui/PropertyTable.d.ts.map +1 -0
  414. package/lib/property/ui/PropertyTable.js +19 -0
  415. package/lib/property/ui/PropertyTable.js.map +1 -0
  416. package/lib/property/ui/index.d.ts +3 -0
  417. package/lib/property/ui/index.d.ts.map +1 -0
  418. package/lib/property/ui/index.js +2 -0
  419. package/lib/property/ui/index.js.map +1 -0
  420. package/lib/raman.d.ts +16 -0
  421. package/lib/raman.d.ts.map +1 -0
  422. package/lib/raman.js +12 -0
  423. package/lib/raman.js.map +1 -0
  424. package/lib/router/core/history.d.ts +24 -3
  425. package/lib/router/core/history.d.ts.map +1 -1
  426. package/lib/router/core/history.js +55 -7
  427. package/lib/router/core/history.js.map +1 -1
  428. package/lib/router/core/index.d.ts +3 -3
  429. package/lib/router/core/index.d.ts.map +1 -1
  430. package/lib/router/core/index.js +2 -2
  431. package/lib/router/core/index.js.map +1 -1
  432. package/lib/router/core/languageRoute.d.ts +61 -0
  433. package/lib/router/core/languageRoute.d.ts.map +1 -0
  434. package/lib/router/core/languageRoute.js +96 -0
  435. package/lib/router/core/languageRoute.js.map +1 -0
  436. package/lib/router/core/siteAddresses.d.ts +23 -0
  437. package/lib/router/core/siteAddresses.d.ts.map +1 -1
  438. package/lib/router/core/siteAddresses.js +26 -0
  439. package/lib/router/core/siteAddresses.js.map +1 -1
  440. package/lib/router/core/tabRouter.d.ts +2 -108
  441. package/lib/router/core/tabRouter.d.ts.map +1 -1
  442. package/lib/router/core/tabRouter.js +38 -5
  443. package/lib/router/core/tabRouter.js.map +1 -1
  444. package/lib/router/core/tabRouterTypes.d.ts +154 -0
  445. package/lib/router/core/tabRouterTypes.d.ts.map +1 -0
  446. package/lib/router/core/tabRouterTypes.js +2 -0
  447. package/lib/router/core/tabRouterTypes.js.map +1 -0
  448. package/lib/seo/core/fitDescription.d.ts +40 -0
  449. package/lib/seo/core/fitDescription.d.ts.map +1 -0
  450. package/lib/seo/core/fitDescription.js +45 -0
  451. package/lib/seo/core/fitDescription.js.map +1 -0
  452. package/lib/seo/core/index.d.ts +7 -0
  453. package/lib/seo/core/index.d.ts.map +1 -1
  454. package/lib/seo/core/index.js +4 -0
  455. package/lib/seo/core/index.js.map +1 -1
  456. package/lib/seo/core/limits.d.ts +24 -0
  457. package/lib/seo/core/limits.d.ts.map +1 -0
  458. package/lib/seo/core/limits.js +24 -0
  459. package/lib/seo/core/limits.js.map +1 -0
  460. package/lib/seo/core/pageContent.d.ts +25 -0
  461. package/lib/seo/core/pageContent.d.ts.map +1 -0
  462. package/lib/seo/core/pageContent.js +25 -0
  463. package/lib/seo/core/pageContent.js.map +1 -0
  464. package/lib/seo/core/plainDescription.d.ts.map +1 -1
  465. package/lib/seo/core/plainDescription.js +3 -2
  466. package/lib/seo/core/plainDescription.js.map +1 -1
  467. package/lib/seo/core/routeProblems.d.ts.map +1 -1
  468. package/lib/seo/core/routeProblems.js +1 -6
  469. package/lib/seo/core/routeProblems.js.map +1 -1
  470. package/lib/seo/core/routeTable.d.ts +31 -0
  471. package/lib/seo/core/routeTable.d.ts.map +1 -0
  472. package/lib/seo/core/routeTable.js +96 -0
  473. package/lib/seo/core/routeTable.js.map +1 -0
  474. package/lib/seo/vite/index.d.ts +2 -0
  475. package/lib/seo/vite/index.d.ts.map +1 -1
  476. package/lib/seo/vite/index.js +1 -0
  477. package/lib/seo/vite/index.js.map +1 -1
  478. package/lib/seo/vite/prerender.d.ts +10 -0
  479. package/lib/seo/vite/prerender.d.ts.map +1 -1
  480. package/lib/seo/vite/prerender.js +12 -1
  481. package/lib/seo/vite/prerender.js.map +1 -1
  482. package/lib/seo/vite/routeTable.d.ts +40 -0
  483. package/lib/seo/vite/routeTable.d.ts.map +1 -0
  484. package/lib/seo/vite/routeTable.js +44 -0
  485. package/lib/seo/vite/routeTable.js.map +1 -0
  486. package/lib/server/answerAddresses.d.ts +51 -0
  487. package/lib/server/answerAddresses.d.ts.map +1 -0
  488. package/lib/server/answerAddresses.js +72 -0
  489. package/lib/server/answerAddresses.js.map +1 -0
  490. package/lib/server/cardMeta.d.ts +57 -0
  491. package/lib/server/cardMeta.d.ts.map +1 -0
  492. package/lib/server/cardMeta.js +52 -0
  493. package/lib/server/cardMeta.js.map +1 -0
  494. package/lib/server/config.d.ts +72 -0
  495. package/lib/server/config.d.ts.map +1 -0
  496. package/lib/server/config.js +67 -0
  497. package/lib/server/config.js.map +1 -0
  498. package/lib/server/envNumber.d.ts +35 -0
  499. package/lib/server/envNumber.d.ts.map +1 -0
  500. package/lib/server/envNumber.js +42 -0
  501. package/lib/server/envNumber.js.map +1 -0
  502. package/lib/server/healthRoute.d.ts +26 -0
  503. package/lib/server/healthRoute.d.ts.map +1 -0
  504. package/lib/server/healthRoute.js +22 -0
  505. package/lib/server/healthRoute.js.map +1 -0
  506. package/lib/server/listenSite.d.ts +38 -0
  507. package/lib/server/listenSite.d.ts.map +1 -0
  508. package/lib/server/listenSite.js +60 -0
  509. package/lib/server/listenSite.js.map +1 -0
  510. package/lib/server/mcpServer.d.ts +8 -0
  511. package/lib/server/mcpServer.d.ts.map +1 -0
  512. package/lib/server/mcpServer.js +11 -0
  513. package/lib/server/mcpServer.js.map +1 -0
  514. package/lib/server/repositoryVersion.d.ts +16 -0
  515. package/lib/server/repositoryVersion.d.ts.map +1 -0
  516. package/lib/server/repositoryVersion.js +33 -0
  517. package/lib/server/repositoryVersion.js.map +1 -0
  518. package/lib/server/routeOptions.d.ts +23 -0
  519. package/lib/server/routeOptions.d.ts.map +1 -0
  520. package/lib/server/routeOptions.js +20 -0
  521. package/lib/server/routeOptions.js.map +1 -0
  522. package/lib/server/routeTable.d.ts +14 -0
  523. package/lib/server/routeTable.d.ts.map +1 -0
  524. package/lib/server/routeTable.js +32 -0
  525. package/lib/server/routeTable.js.map +1 -0
  526. package/lib/server/siteView.d.ts +29 -0
  527. package/lib/server/siteView.d.ts.map +1 -0
  528. package/lib/server/siteView.js +21 -0
  529. package/lib/server/siteView.js.map +1 -0
  530. package/lib/server/spaPages.d.ts +32 -0
  531. package/lib/server/spaPages.d.ts.map +1 -0
  532. package/lib/server/spaPages.js +126 -0
  533. package/lib/server/spaPages.js.map +1 -0
  534. package/lib/server/spaSite.d.ts +30 -0
  535. package/lib/server/spaSite.d.ts.map +1 -0
  536. package/lib/server/spaSite.js +170 -0
  537. package/lib/server/spaSite.js.map +1 -0
  538. package/lib/server/spaSiteOptions.d.ts +126 -0
  539. package/lib/server/spaSiteOptions.d.ts.map +1 -0
  540. package/lib/server/spaSiteOptions.js +2 -0
  541. package/lib/server/spaSiteOptions.js.map +1 -0
  542. package/lib/server/staticSite.d.ts +9 -0
  543. package/lib/server/staticSite.d.ts.map +1 -1
  544. package/lib/server/staticSite.js +41 -19
  545. package/lib/server/staticSite.js.map +1 -1
  546. package/lib/server/toolSiteServer.d.ts +77 -0
  547. package/lib/server/toolSiteServer.d.ts.map +1 -0
  548. package/lib/server/toolSiteServer.js +58 -0
  549. package/lib/server/toolSiteServer.js.map +1 -0
  550. package/lib/server/trustProxy.d.ts +20 -0
  551. package/lib/server/trustProxy.d.ts.map +1 -0
  552. package/lib/server/trustProxy.js +32 -0
  553. package/lib/server/trustProxy.js.map +1 -0
  554. package/lib/server/types.d.ts +13 -0
  555. package/lib/server/types.d.ts.map +1 -0
  556. package/lib/server/types.js +2 -0
  557. package/lib/server/types.js.map +1 -0
  558. package/lib/server.d.ts +22 -0
  559. package/lib/server.d.ts.map +1 -1
  560. package/lib/server.js +12 -0
  561. package/lib/server.js.map +1 -1
  562. package/lib/share/core/config.d.ts +18 -0
  563. package/lib/share/core/config.d.ts.map +1 -1
  564. package/lib/share/core/config.js +33 -2
  565. package/lib/share/core/config.js.map +1 -1
  566. package/lib/share/core/index.d.ts +3 -1
  567. package/lib/share/core/index.d.ts.map +1 -1
  568. package/lib/share/core/index.js +2 -1
  569. package/lib/share/core/index.js.map +1 -1
  570. package/lib/share/core/keySetParam.d.ts +40 -0
  571. package/lib/share/core/keySetParam.d.ts.map +1 -0
  572. package/lib/share/core/keySetParam.js +60 -0
  573. package/lib/share/core/keySetParam.js.map +1 -0
  574. package/lib/share/core/vocabulary.d.ts +8 -0
  575. package/lib/share/core/vocabulary.d.ts.map +1 -1
  576. package/lib/shell/ui/ShareControl.d.ts +75 -0
  577. package/lib/shell/ui/ShareControl.d.ts.map +1 -0
  578. package/lib/shell/ui/ShareControl.js +40 -0
  579. package/lib/shell/ui/ShareControl.js.map +1 -0
  580. package/lib/shell/ui/ShellFrame.d.ts +14 -0
  581. package/lib/shell/ui/ShellFrame.d.ts.map +1 -0
  582. package/lib/shell/ui/ShellFrame.js +45 -0
  583. package/lib/shell/ui/ShellFrame.js.map +1 -0
  584. package/lib/shell/ui/SiteShell.d.ts +251 -0
  585. package/lib/shell/ui/SiteShell.d.ts.map +1 -0
  586. package/lib/shell/ui/SiteShell.js +39 -0
  587. package/lib/shell/ui/SiteShell.js.map +1 -0
  588. package/lib/shell/ui/index.d.ts +5 -0
  589. package/lib/shell/ui/index.d.ts.map +1 -0
  590. package/lib/shell/ui/index.js +3 -0
  591. package/lib/shell/ui/index.js.map +1 -0
  592. package/lib/state/core/index.d.ts +1 -0
  593. package/lib/state/core/index.d.ts.map +1 -1
  594. package/lib/state/core/index.js.map +1 -1
  595. package/lib/state/core/legacyEntries.d.ts +30 -0
  596. package/lib/state/core/legacyEntries.d.ts.map +1 -0
  597. package/lib/state/core/legacyEntries.js +51 -0
  598. package/lib/state/core/legacyEntries.js.map +1 -0
  599. package/lib/state/core/persistBucket.d.ts +26 -2
  600. package/lib/state/core/persistBucket.d.ts.map +1 -1
  601. package/lib/state/core/persistBucket.js +26 -9
  602. package/lib/state/core/persistBucket.js.map +1 -1
  603. package/lib/state/core/persistSignalBucket.d.ts +26 -0
  604. package/lib/state/core/persistSignalBucket.d.ts.map +1 -1
  605. package/lib/state/core/persistSignalBucket.js +31 -0
  606. package/lib/state/core/persistSignalBucket.js.map +1 -1
  607. package/lib/state/core/storageEntry.d.ts +15 -0
  608. package/lib/state/core/storageEntry.d.ts.map +1 -1
  609. package/lib/state/core/storageEntry.js +33 -0
  610. package/lib/state/core/storageEntry.js.map +1 -1
  611. package/lib/structure/ui/StructureExportButton.d.ts +27 -0
  612. package/lib/structure/ui/StructureExportButton.d.ts.map +1 -0
  613. package/lib/structure/ui/StructureExportButton.js +21 -0
  614. package/lib/structure/ui/StructureExportButton.js.map +1 -0
  615. package/lib/structure/ui/index.d.ts +4 -0
  616. package/lib/structure/ui/index.d.ts.map +1 -1
  617. package/lib/structure/ui/index.js +2 -0
  618. package/lib/structure/ui/index.js.map +1 -1
  619. package/lib/structure/ui/useStructureDraft.d.ts +32 -0
  620. package/lib/structure/ui/useStructureDraft.d.ts.map +1 -0
  621. package/lib/structure/ui/useStructureDraft.js +20 -0
  622. package/lib/structure/ui/useStructureDraft.js.map +1 -0
  623. package/lib/ui.d.ts +2 -0
  624. package/lib/ui.d.ts.map +1 -1
  625. package/lib/ui.js +2 -0
  626. package/lib/ui.js.map +1 -1
  627. package/lib/worker/core/index.d.ts +1 -1
  628. package/lib/worker/core/index.d.ts.map +1 -1
  629. package/lib/worker/core/messages.d.ts +4 -2
  630. package/lib/worker/core/messages.d.ts.map +1 -1
  631. package/lib/worker/core/messages.js.map +1 -1
  632. package/lib/worker/core/oclResourcesUrl.d.ts +16 -0
  633. package/lib/worker/core/oclResourcesUrl.d.ts.map +1 -0
  634. package/lib/worker/core/oclResourcesUrl.js +19 -0
  635. package/lib/worker/core/oclResourcesUrl.js.map +1 -0
  636. package/lib/worker/core/serveWorkerRequests.d.ts +8 -0
  637. package/lib/worker/core/serveWorkerRequests.d.ts.map +1 -1
  638. package/lib/worker/core/serveWorkerRequests.js +15 -2
  639. package/lib/worker/core/serveWorkerRequests.js.map +1 -1
  640. package/lib/worker/core/workerChannel.d.ts +3 -4
  641. package/lib/worker/core/workerChannel.d.ts.map +1 -1
  642. package/lib/worker/core/workerChannel.js +72 -67
  643. package/lib/worker/core/workerChannel.js.map +1 -1
  644. package/lib/worker/core/workerChannelParts.d.ts +17 -6
  645. package/lib/worker/core/workerChannelParts.d.ts.map +1 -1
  646. package/lib/worker/core/workerChannelParts.js +20 -4
  647. package/lib/worker/core/workerChannelParts.js.map +1 -1
  648. package/lib/worker/core/workerChannelTypes.d.ts +46 -2
  649. package/lib/worker/core/workerChannelTypes.d.ts.map +1 -1
  650. package/lib/worker/core/workerSlot.d.ts +66 -0
  651. package/lib/worker/core/workerSlot.d.ts.map +1 -0
  652. package/lib/worker/core/workerSlot.js +107 -0
  653. package/lib/worker/core/workerSlot.js.map +1 -0
  654. package/package.json +17 -1
  655. package/src/card/core/cardAddress.ts +100 -0
  656. package/src/card/core/cardPageUrl.ts +97 -0
  657. package/src/card/core/index.ts +6 -0
  658. package/src/card/core/panelRoom.ts +66 -0
  659. package/src/card/ui/CardDetailsButton.tsx +104 -0
  660. package/src/card/ui/CardFigure.tsx +86 -0
  661. package/src/card/ui/CardFrame.tsx +46 -0
  662. package/src/card/ui/CopyTableButton.tsx +81 -0
  663. package/src/card/ui/cardTooltip.ts +18 -0
  664. package/src/card/ui/embed.ts +27 -0
  665. package/src/card/ui/fitCardToFrame.ts +76 -0
  666. package/src/card/ui/holdRoomForPanels.ts +83 -0
  667. package/src/card/ui/index.ts +14 -0
  668. package/src/card/ui/openPanels.ts +106 -0
  669. package/src/card.ts +13 -0
  670. package/src/conformers.ts +4 -0
  671. package/src/core.ts +5 -0
  672. package/src/fetch/core/apiError.ts +65 -0
  673. package/src/fetch/core/fetchJson.ts +129 -0
  674. package/src/fetch/core/index.ts +4 -0
  675. package/src/formula/core/formulaText.ts +96 -0
  676. package/src/formula/core/index.ts +20 -0
  677. package/src/formula/core/normalizeFormula.ts +50 -0
  678. package/src/formula/core/readFormula.ts +211 -0
  679. package/src/formula/ui/CopyableFormula.tsx +51 -0
  680. package/src/formula/ui/FormulaInput.tsx +50 -0
  681. package/src/formula/ui/QuestionFormula.tsx +20 -0
  682. package/src/formula/ui/index.ts +6 -0
  683. package/src/formula.ts +11 -0
  684. package/src/hooks/ui/index.ts +1 -0
  685. package/src/hooks/ui/keyTargets.ts +5 -3
  686. package/src/hooks/ui/useAsync.ts +50 -14
  687. package/src/ir/core/analysisSpectra.ts +26 -10
  688. package/src/ir/core/bandLabelPlan.ts +21 -10
  689. package/src/ir/core/index.ts +25 -5
  690. package/src/ir/core/irBand.ts +52 -14
  691. package/src/ir/core/irCommands.ts +15 -1
  692. package/src/ir/core/irDomain.ts +9 -7
  693. package/src/ir/core/irFormat.ts +39 -6
  694. package/src/ir/core/irMode.ts +42 -10
  695. package/src/ir/core/irReducer.ts +1 -49
  696. package/src/ir/core/irSpectrum.ts +59 -30
  697. package/src/ir/core/irState.ts +67 -2
  698. package/src/ir/core/irTechnique.ts +115 -0
  699. package/src/ir/core/irTechniqueCommands.ts +82 -0
  700. package/src/ir/core/pickBands.ts +63 -28
  701. package/src/ir/core/ramanBands.ts +105 -0
  702. package/src/ir/core/spectrumJcamp.ts +65 -16
  703. package/src/ir/core/toIrSpectrum.ts +20 -2
  704. package/src/ir/ui/BandRow.tsx +107 -0
  705. package/src/ir/ui/BandsPanel.tsx +32 -125
  706. package/src/ir/ui/IrAboutDialog.tsx +69 -28
  707. package/src/ir/ui/IrCanvas.tsx +2 -1
  708. package/src/ir/ui/IrChart.tsx +20 -24
  709. package/src/ir/ui/IrCommandProvider.tsx +10 -3
  710. package/src/ir/ui/IrCommandTooltip.tsx +11 -2
  711. package/src/ir/ui/IrDocumentationDialog.tsx +99 -55
  712. package/src/ir/ui/IrEditor.tsx +5 -36
  713. package/src/ir/ui/IrHeader.tsx +10 -3
  714. package/src/ir/ui/IrLogo.tsx +28 -9
  715. package/src/ir/ui/IrShell.tsx +27 -75
  716. package/src/ir/ui/IrStatusBar.tsx +17 -12
  717. package/src/ir/ui/IrToolbar.tsx +26 -15
  718. package/src/ir/ui/IrTraces.tsx +5 -1
  719. package/src/ir/ui/RamanEditor.tsx +53 -0
  720. package/src/ir/ui/SpectraPanel.tsx +2 -1
  721. package/src/ir/ui/SpectrumRow.tsx +14 -5
  722. package/src/ir/ui/VibrationalEditor.tsx +94 -0
  723. package/src/ir/ui/bandsTsv.ts +46 -0
  724. package/src/ir/ui/irChartProps.ts +14 -4
  725. package/src/ir/ui/irCommandContext.tsx +18 -3
  726. package/src/ir/ui/useIrEditor.ts +20 -8
  727. package/src/ir/ui/useIrHandle.ts +51 -0
  728. package/src/ir/ui/useIrText.ts +170 -0
  729. package/src/ir/ui/useIrZoom.ts +12 -3
  730. package/src/ir/ui/useValueAxisZoom.ts +67 -0
  731. package/src/ir.ts +3 -0
  732. package/src/locales/de.json +57 -1
  733. package/src/locales/en.json +57 -1
  734. package/src/locales/es.json +57 -1
  735. package/src/locales/fr.json +57 -1
  736. package/src/locales/it.json +57 -1
  737. package/src/moleculesClient/core/index.ts +19 -0
  738. package/src/moleculesClient/core/moleculesClient.ts +175 -0
  739. package/src/moleculesClient/core/moleculesClientApi.ts +120 -0
  740. package/src/moleculesClient/core/moleculesTypes.ts +163 -0
  741. package/src/moleculesClient/core/requestRetry.ts +118 -0
  742. package/src/molstar/core/camera.ts +3 -2
  743. package/src/molstar/core/framing.ts +200 -0
  744. package/src/molstar/core/hover.ts +26 -0
  745. package/src/molstar/core/index.ts +21 -1
  746. package/src/pedagogy/core/answers.ts +94 -0
  747. package/src/pedagogy/core/attempts.ts +205 -0
  748. package/src/pedagogy/core/index.ts +36 -0
  749. package/src/pedagogy/core/progressController.ts +116 -0
  750. package/src/pedagogy/core/seed.ts +177 -0
  751. package/src/pedagogy/core/series.ts +82 -0
  752. package/src/pedagogy/ui/AnswerFields.tsx +63 -0
  753. package/src/pedagogy/ui/ExerciseList.tsx +202 -0
  754. package/src/pedagogy/ui/ExerciseSeries.tsx +250 -0
  755. package/src/pedagogy/ui/QuestionCard.tsx +231 -0
  756. package/src/pedagogy/ui/index.ts +18 -0
  757. package/src/pedagogy/ui/seriesCounts.ts +34 -0
  758. package/src/pedagogy/ui/seriesParts.tsx +127 -0
  759. package/src/pedagogy/ui/useAttemptRecords.ts +16 -0
  760. package/src/periodic/ui/PeriodicTable.tsx +6 -3
  761. package/src/property/core/copyableText.ts +20 -0
  762. package/src/property/core/index.ts +1 -0
  763. package/src/property/ui/PropertyTable.tsx +83 -0
  764. package/src/property/ui/index.ts +2 -0
  765. package/src/raman.ts +19 -0
  766. package/src/router/core/history.ts +61 -7
  767. package/src/router/core/index.ts +3 -2
  768. package/src/router/core/languageRoute.ts +136 -0
  769. package/src/router/core/siteAddresses.ts +38 -0
  770. package/src/router/core/tabRouter.ts +59 -117
  771. package/src/router/core/tabRouterTypes.ts +158 -0
  772. package/src/seo/core/fitDescription.ts +74 -0
  773. package/src/seo/core/index.ts +17 -0
  774. package/src/seo/core/limits.ts +27 -0
  775. package/src/seo/core/pageContent.ts +42 -0
  776. package/src/seo/core/plainDescription.ts +4 -2
  777. package/src/seo/core/routeProblems.ts +1 -7
  778. package/src/seo/core/routeTable.ts +103 -0
  779. package/src/seo/vite/index.ts +2 -0
  780. package/src/seo/vite/prerender.ts +26 -1
  781. package/src/seo/vite/routeTable.ts +79 -0
  782. package/src/server/answerAddresses.ts +92 -0
  783. package/src/server/cardMeta.ts +88 -0
  784. package/src/server/config.ts +125 -0
  785. package/src/server/envNumber.ts +65 -0
  786. package/src/server/healthRoute.ts +42 -0
  787. package/src/server/listenSite.ts +90 -0
  788. package/src/server/mcpServer.ts +14 -0
  789. package/src/server/repositoryVersion.ts +33 -0
  790. package/src/server/routeOptions.ts +26 -0
  791. package/src/server/routeTable.ts +35 -0
  792. package/src/server/siteView.ts +42 -0
  793. package/src/server/spaPages.ts +179 -0
  794. package/src/server/spaSite.ts +216 -0
  795. package/src/server/spaSiteOptions.ts +133 -0
  796. package/src/server/staticSite.ts +65 -35
  797. package/src/server/toolSiteServer.ts +127 -0
  798. package/src/server/trustProxy.ts +32 -0
  799. package/src/server/types.ts +25 -0
  800. package/src/server.ts +40 -0
  801. package/src/share/core/config.ts +45 -2
  802. package/src/share/core/index.ts +4 -0
  803. package/src/share/core/keySetParam.ts +92 -0
  804. package/src/share/core/vocabulary.ts +8 -0
  805. package/src/shell/ui/ShareControl.tsx +150 -0
  806. package/src/shell/ui/ShellFrame.tsx +180 -0
  807. package/src/shell/ui/SiteShell.tsx +297 -0
  808. package/src/shell/ui/index.ts +9 -0
  809. package/src/state/core/index.ts +1 -0
  810. package/src/state/core/legacyEntries.ts +76 -0
  811. package/src/state/core/persistBucket.ts +50 -10
  812. package/src/state/core/persistSignalBucket.ts +52 -0
  813. package/src/state/core/storageEntry.ts +32 -0
  814. package/src/structure/ui/StructureExportButton.tsx +57 -0
  815. package/src/structure/ui/index.ts +4 -0
  816. package/src/structure/ui/useStructureDraft.ts +47 -0
  817. package/src/ui.ts +2 -0
  818. package/src/worker/core/index.ts +1 -0
  819. package/src/worker/core/messages.ts +4 -3
  820. package/src/worker/core/oclResourcesUrl.ts +21 -0
  821. package/src/worker/core/serveWorkerRequests.ts +30 -2
  822. package/src/worker/core/workerChannel.ts +74 -74
  823. package/src/worker/core/workerChannelParts.ts +33 -13
  824. package/src/worker/core/workerChannelTypes.ts +47 -2
  825. package/src/worker/core/workerSlot.ts +181 -0
  826. package/styles/card.css +145 -0
  827. package/styles/chrome.css +248 -0
@@ -0,0 +1,133 @@
1
+ import type { FastifyReply } from 'fastify';
2
+
3
+ import type { SiteId, SiteRecord } from '../ecosystem/core/sites.ts';
4
+ import type { NoscriptText } from '../seo/core/noscript.ts';
5
+ import type { PageContent } from '../seo/core/pageProse.ts';
6
+ import type { RobotsDisallow } from '../seo/core/robots.ts';
7
+ import type { RouteMeta } from '../seo/core/routes.ts';
8
+ import type { StructuredDataOptions } from '../seo/core/structuredData.ts';
9
+
10
+ import type { HealthRouteOptions } from './healthRoute.ts';
11
+
12
+ /** A page an address names that the route table does not: a compound, a course. */
13
+ export interface SpaPage {
14
+ /** Its title, description and canonical path. */
15
+ meta: RouteMeta;
16
+ /**
17
+ * What it says for itself in the crawl path.
18
+ * @default its title as heading, its description as the paragraph
19
+ */
20
+ content?: PageContent;
21
+ }
22
+
23
+ /** What the structured-data block says beyond the site and its address. */
24
+ export type SpaStructuredData = Omit<
25
+ StructuredDataOptions,
26
+ 'site' | 'routes' | 'origin' | 'languages'
27
+ >;
28
+
29
+ /** Options of `spaSite`. */
30
+ export interface SpaSiteOptions {
31
+ /** The directory holding the built frontend. */
32
+ root: string;
33
+ /** The site, named or passed. */
34
+ site: SiteRecord | SiteId;
35
+ /**
36
+ * Every address the frontend routes itself, each with its title and
37
+ * description.
38
+ * @default the `routes.json` the build wrote beside the page, or the site's
39
+ * home page alone
40
+ */
41
+ routes?: readonly RouteMeta[];
42
+ /**
43
+ * Where the site is served, mount path included, e.g.
44
+ * `https://learn.cheminfo.org/surge`. Every canonical, card and sitemap address
45
+ * is built on it. A blank value is unset, as compose forwards `${SITE_URL:-}`.
46
+ * @default the origin the request arrived on
47
+ */
48
+ siteUrl?: string;
49
+ /**
50
+ * The analytics snippet, put at the end of the head of every page.
51
+ * @default undefined - nothing is loaded
52
+ */
53
+ trackingScript?: string;
54
+ /**
55
+ * Address prefixes another plugin answers, such as the API, which never
56
+ * answer a page: an unknown address there is the API's own 404.
57
+ * @default ['/v1/', '/docs']
58
+ */
59
+ reserved?: readonly string[];
60
+ /**
61
+ * The prose of the crawl path, and the pages it links.
62
+ * @default the site's name and tagline, linking every indexed route
63
+ */
64
+ noscript?: NoscriptText;
65
+ /**
66
+ * The structured-data block of every page: what kind of application the site
67
+ * is, a function writing the whole `<script>` for the origin served (an
68
+ * author, a citation, a search action), or `false` for none.
69
+ * @default {} - a free web application, described by the site's tagline
70
+ */
71
+ structuredData?: false | SpaStructuredData | ((origin: string) => string);
72
+ /**
73
+ * The card a link to a page unfurls into, as an absolute address or a path.
74
+ * @default '/og.png'
75
+ */
76
+ image?: string;
77
+ /**
78
+ * Addresses `robots.txt` keeps out of the index, each optionally with the
79
+ * sentence saying why.
80
+ * @default ['/v1/', '/docs']
81
+ */
82
+ robots?: ReadonlyArray<string | RobotsDisallow>;
83
+ /**
84
+ * More addresses the sitemap lists after the route table: one per compound,
85
+ * per published course.
86
+ * @default undefined - the route table alone
87
+ */
88
+ sitemapPaths?: () => readonly string[] | Promise<readonly string[]>;
89
+ /**
90
+ * The page an address names when the route table does not: read from the
91
+ * database, so `/compound/1234` is indexed under the compound's own name.
92
+ * `undefined` falls back to the table.
93
+ * @default undefined - every address is read from the table
94
+ */
95
+ page?: (url: string) => SpaPage | undefined | Promise<SpaPage | undefined>;
96
+ /**
97
+ * Whether an address is one the app routes, given its path without the query
98
+ * and without the mount.
99
+ * @default whether the route table claims it, or `page` named it
100
+ */
101
+ knownRoute?: (path: string) => boolean;
102
+ /**
103
+ * The status an address the app does not route is answered with. It is
104
+ * still the page, so the app draws its own "not found", but a crawler is not
105
+ * handed a soft 404.
106
+ * @default 200
107
+ */
108
+ notFoundStatus?: number;
109
+ /**
110
+ * Whether search engines may index the site. An admin site sets `false`:
111
+ * every answer then carries `X-Robots-Tag: noindex, nofollow`, `robots.txt`
112
+ * disallows everything, there is no sitemap, and a page without the
113
+ * `<!--cheminfo:head-->` marker is served as it is.
114
+ * @default true
115
+ */
116
+ indexed?: boolean;
117
+ /**
118
+ * How many pages, each with its own crawl path, are kept built.
119
+ * @default 2000
120
+ */
121
+ maxCachedPages?: number;
122
+ /**
123
+ * Whether `/health` is answered here, and with what more.
124
+ * @default true
125
+ */
126
+ health?: boolean | HealthRouteOptions;
127
+ /**
128
+ * Headers for a file of the build, such as a cross-origin opening for the
129
+ * decks another site fetches.
130
+ * @default undefined - the cache headers alone
131
+ */
132
+ setHeaders?: (reply: FastifyReply, file: string) => void;
133
+ }
@@ -1,15 +1,19 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { join, relative, resolve, sep } from 'node:path';
3
3
 
4
- import type {
5
- FastifyInstance,
6
- FastifyReply,
7
- FastifyRequest,
8
- FastifySchema,
9
- } from 'fastify';
4
+ import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
10
5
 
6
+ import { joinBasePath, normalizeBasePath } from '../router/core/basePath.ts';
11
7
  import { injectTrackingScript } from '../seo/core/trackingScript.ts';
12
-
8
+ import { escapeAttribute } from '../share/core/escape.ts';
9
+
10
+ import { healthRoute } from './healthRoute.ts';
11
+ import {
12
+ ALLOW_ORIGIN,
13
+ BUNDLE_CACHE,
14
+ HIDDEN,
15
+ PAGE_CACHE,
16
+ } from './routeOptions.ts';
13
17
  import { isHashedBundle, listSiteFiles, resolveAddress } from './siteFiles.ts';
14
18
 
15
19
  /** Options of {@link staticSite}. */
@@ -35,6 +39,15 @@ export interface StaticSiteOptions {
35
39
  * @default ['/v1/']
36
40
  */
37
41
  reserved?: readonly string[];
42
+ /**
43
+ * The path the deployment is mounted at, `/osiris` for
44
+ * `https://www.cheminfo.org/osiris/`, behind a proxy that takes it off before
45
+ * the request arrives. It is written into the `<base href="/">` of every page
46
+ * when they are read, and in front of every redirect, so one image serves a
47
+ * host of its own and a shared one without a rebuild or a copy of the build.
48
+ * @default '' - the site owns the root of its host
49
+ */
50
+ basePath?: string;
38
51
  }
39
52
 
40
53
  /** A page: the file with the snippet in its head, and the tag a browser checks. */
@@ -43,21 +56,8 @@ interface Page {
43
56
  etag: string;
44
57
  }
45
58
 
46
- /** A page is checked on every visit: it names the bundles of its own build. */
47
- const PAGE_CACHE = 'no-cache';
48
-
49
- /** A bundle is named by its content, so it never changes under its name. */
50
- const BUNDLE_CACHE = 'public, max-age=31536000, immutable';
51
-
52
- /**
53
- * Every file of a build is public, and a page framed by a sandboxed view runs
54
- * under an opaque origin, where everything it fetches from its own site is
55
- * cross-origin: the static hosts open every response, and so does this server.
56
- */
57
- const ALLOW_ORIGIN = 'access-control-allow-origin';
58
-
59
- /** Kept out of the API's documentation (`@fastify/swagger` reads `hide`). */
60
- const HIDDEN: FastifySchema & { hide: boolean } = { hide: true };
59
+ /** The `<base>` a build carries, which a mounted deployment rewrites. */
60
+ const ROOT_BASE = /<base\s+href=(?<quote>["'])\/\k<quote>\s*\/?>/i;
61
61
 
62
62
  /**
63
63
  * Serve a site's build from Node, with the rules every static host of the
@@ -81,19 +81,16 @@ export async function staticSite(
81
81
  ): Promise<void> {
82
82
  const { trackingScript, redirects = {}, reserved = ['/v1/'] } = options;
83
83
  const root = resolve(options.root);
84
+ const basePath = normalizeBasePath(options.basePath ?? '');
84
85
 
85
- fastify.get(
86
- '/health',
87
- { logLevel: 'silent', schema: HIDDEN },
88
- (_request, reply) => reply.header(ALLOW_ORIGIN, '*').send({ status: 'ok' }),
89
- );
86
+ await healthRoute(fastify);
90
87
 
91
88
  const files = await listSiteFiles(root);
92
89
  if (files === undefined) {
93
90
  fastify.log.warn({ root }, 'no built site: serving the API alone');
94
91
  return;
95
92
  }
96
- const pages = await readPages(root, files, trackingScript);
93
+ const pages = await readPages(root, files, { trackingScript, basePath });
97
94
 
98
95
  // An optional peer, installed only by a site that has a server: importing
99
96
  // react-cheminfo/server must not need it.
@@ -121,7 +118,10 @@ export async function staticSite(
121
118
  const destination =
122
119
  redirects[pathname] ?? redirects[pathname.replace(/\/$/, '')];
123
120
  if (destination !== undefined) {
124
- return reply.redirect(`${destination}${search}`, 301);
121
+ return reply.redirect(
122
+ `${mountedAddress(basePath, destination)}${search}`,
123
+ 301,
124
+ );
125
125
  }
126
126
 
127
127
  const file = resolveAddress(files, pathname);
@@ -138,23 +138,29 @@ export async function staticSite(
138
138
  }
139
139
 
140
140
  /**
141
- * Read every page of the build once, with the snippet in its head.
141
+ * Read every page of the build once, with the snippet in its head and the
142
+ * mount in its `<base>`.
142
143
  * @param root - The build.
143
144
  * @param files - Its files.
144
- * @param trackingScript - The snippet, if any.
145
+ * @param stamp - What is written into every page.
146
+ * @param stamp.trackingScript - The snippet, if any.
147
+ * @param stamp.basePath - The mount, `''` for none.
145
148
  * @returns The pages, by file.
146
149
  */
147
150
  async function readPages(
148
151
  root: string,
149
152
  files: ReadonlySet<string>,
150
- trackingScript: string | undefined,
153
+ stamp: { trackingScript: string | undefined; basePath: string },
151
154
  ): Promise<Map<string, Page>> {
152
155
  const htmlFiles = [...files].filter((file) => file.endsWith('.html'));
153
156
  const pages = await Promise.all(
154
157
  htmlFiles.map(async (file) => {
155
- const html = injectTrackingScript(
156
- await readFile(join(root, file), 'utf8'),
157
- trackingScript,
158
+ const html = stampBase(
159
+ injectTrackingScript(
160
+ await readFile(join(root, file), 'utf8'),
161
+ stamp.trackingScript,
162
+ ),
163
+ stamp.basePath,
158
164
  );
159
165
  return [file, { html, etag: await etagOf(html) }] as const;
160
166
  }),
@@ -162,6 +168,30 @@ async function readPages(
162
168
  return new Map(pages);
163
169
  }
164
170
 
171
+ /**
172
+ * Write the mount into the first `<base href="/">` a page carries, as the
173
+ * container entrypoints of a mounted image do.
174
+ * @param html - The page.
175
+ * @param basePath - The mount, `''` for none.
176
+ * @returns The page, its relative addresses resolving under the mount.
177
+ */
178
+ function stampBase(html: string, basePath: string): string {
179
+ if (basePath === '') return html;
180
+ const tag = `<base href="${escapeAttribute(`${basePath}/`)}" />`;
181
+ return html.replace(ROOT_BASE, () => tag);
182
+ }
183
+
184
+ /**
185
+ * Where a redirect sends the browser: under the mount the proxy took off.
186
+ * @param basePath - The mount, `''` for none.
187
+ * @param destination - The address, from the site's own root or absolute.
188
+ * @returns The address the browser is sent to.
189
+ */
190
+ function mountedAddress(basePath: string, destination: string): string {
191
+ if (basePath === '' || !destination.startsWith('/')) return destination;
192
+ return joinBasePath(basePath, destination);
193
+ }
194
+
165
195
  function sendPage(
166
196
  request: FastifyRequest,
167
197
  reply: FastifyReply,
@@ -0,0 +1,127 @@
1
+ import type { FastifyInstance, FastifyServerOptions } from 'fastify';
2
+
3
+ import { siteById } from '../ecosystem/core/lookup.ts';
4
+ import type { SiteId } from '../ecosystem/core/sites.ts';
5
+
6
+ import type { ServerConfig } from './config.ts';
7
+ import type { ListenSiteOptions } from './listenSite.ts';
8
+ import { listenSite } from './listenSite.ts';
9
+ import { readRepositoryVersion } from './repositoryVersion.ts';
10
+ import { DEFAULT_RESERVED } from './routeOptions.ts';
11
+ import { staticSite } from './staticSite.ts';
12
+
13
+ /** What a site's API is registered with. */
14
+ export interface ToolSiteContext {
15
+ /** The site, as `ECOSYSTEM_SITES` names it. */
16
+ siteId: SiteId;
17
+ /** Its host, `osiris.cheminfo.org`: what the tool server and its documentation are called. */
18
+ name: string;
19
+ /** The release the repository is at. */
20
+ version: string;
21
+ /** The configuration the server was built with. */
22
+ config: ServerConfig;
23
+ }
24
+
25
+ /** Options of {@link toolSiteServer}. */
26
+ export interface ToolSiteServerOptions {
27
+ /** The site, as `ECOSYSTEM_SITES` names it. */
28
+ siteId: SiteId;
29
+ /** The configuration, from `readServerConfig`. */
30
+ config: ServerConfig;
31
+ /**
32
+ * Register the API beside the pages: the tool routes of
33
+ * `cheminfo-mcp-server` under `/v1`, their documentation at `/docs`.
34
+ */
35
+ registerApi: (
36
+ app: FastifyInstance,
37
+ context: ToolSiteContext,
38
+ ) => void | Promise<void>;
39
+ /**
40
+ * Addresses the site does not have any more, and the one that does their
41
+ * work; the query is carried over.
42
+ * @default {}
43
+ */
44
+ redirects?: Readonly<Record<string, string>>;
45
+ /**
46
+ * Whether, and how, Fastify logs.
47
+ * @default true
48
+ */
49
+ logger?: FastifyServerOptions['logger'];
50
+ /**
51
+ * Address prefixes the API answers, which never answer a page.
52
+ * @default ['/v1/', '/docs']
53
+ */
54
+ reserved?: readonly string[];
55
+ /**
56
+ * The release the API reports.
57
+ * @default the root `package.json` of the repository the process runs in
58
+ */
59
+ version?: string;
60
+ }
61
+
62
+ /**
63
+ * Build a tool site's server without listening: the API the site registers,
64
+ * then the same build the static host serves, by the static hosts' rules.
65
+ *
66
+ * The page never calls the API — it computes in the browser — so the server only
67
+ * adds: the tools under `/v1` for chats and MCP clients, documented at `/docs`.
68
+ *
69
+ * const app = await toolSiteServer({
70
+ * siteId: 'osiris',
71
+ * config,
72
+ * registerApi: (app, { name, version }) => registerTools(app, name, version),
73
+ * });
74
+ * @param options - The site, its configuration and its API.
75
+ * @returns The server, ready to listen or to be injected in tests.
76
+ */
77
+ export async function toolSiteServer(
78
+ options: ToolSiteServerOptions,
79
+ ): Promise<FastifyInstance> {
80
+ const {
81
+ siteId,
82
+ config,
83
+ registerApi,
84
+ redirects = {},
85
+ logger = true,
86
+ reserved = DEFAULT_RESERVED,
87
+ } = options;
88
+ // An optional peer, installed only by a site that has a server.
89
+ const { fastify } = await import('fastify');
90
+ const app = fastify({ logger, trustProxy: config.trustProxy });
91
+ const version = options.version ?? readRepositoryVersion(process.cwd());
92
+ await registerApi(app, {
93
+ siteId,
94
+ name: siteById(siteId).host,
95
+ version,
96
+ config,
97
+ });
98
+ await app.register(staticSite, {
99
+ root: config.root,
100
+ trackingScript: config.trackingScript,
101
+ redirects,
102
+ reserved,
103
+ basePath: config.basePath,
104
+ });
105
+ return app;
106
+ }
107
+
108
+ /**
109
+ * Build a site's server from its configuration, listen where it says, and close
110
+ * cleanly when the container is stopped — the whole of a `main.ts`:
111
+ *
112
+ * await startToolServer(buildServer, readServerConfig(process.env, SITE));
113
+ * @param build - Builds the server, e.g. with {@link toolSiteServer}.
114
+ * @param config - The configuration, from `readServerConfig`.
115
+ * @param options - What else to stop, and on which signals.
116
+ * @returns The server, listening.
117
+ * @throws {Error} When the server cannot listen, after it has been closed.
118
+ */
119
+ export async function startToolServer(
120
+ build: (config: ServerConfig) => FastifyInstance | Promise<FastifyInstance>,
121
+ config: ServerConfig,
122
+ options: Pick<ListenSiteOptions, 'onClose' | 'signals'> = {},
123
+ ): Promise<FastifyInstance> {
124
+ const app = await build(config);
125
+ await listenSite(app, { ...options, port: config.port, host: config.host });
126
+ return app;
127
+ }
@@ -0,0 +1,32 @@
1
+ /** A value that is only digits: a hop count. */
2
+ const HOP_COUNT = /^\d+$/;
3
+
4
+ /**
5
+ * Read which reverse proxies a deployment names, for Fastify's `trustProxy`.
6
+ *
7
+ * Behind a proxy, `request.ip` is the proxy's address on every request and
8
+ * `request.protocol` reads `http` for an HTTPS client, so the variable names the
9
+ * proxy whose `X-Forwarded-For` is believed: an address, a CIDR range, or a
10
+ * comma-separated list of either. `true` believes any peer, which is only safe
11
+ * when the port is unreachable except through the proxy.
12
+ *
13
+ * A hop count is refused. Fastify 5.12.7 and later trust nothing for a number,
14
+ * since a hop count cannot tell the proxy from a client, so the service would
15
+ * silently log the proxy's address again — and a function over the hop, the
16
+ * usual way around it, believes any peer that sends enough addresses.
17
+ * @param value - `TRUST_PROXY`, as written.
18
+ * @returns The proxies as written, `true` to believe any peer, or `false` when
19
+ * the variable is unset, blank or `false`.
20
+ * @throws {Error} When the value is a hop count.
21
+ */
22
+ export function parseTrustProxy(value: string | undefined): boolean | string {
23
+ const text = value?.trim();
24
+ if (!text || text.toLowerCase() === 'false') return false;
25
+ if (text.toLowerCase() === 'true') return true;
26
+ if (HOP_COUNT.test(text)) {
27
+ throw new Error(
28
+ `TRUST_PROXY=${text} is a hop count, which trusts nothing. Name the proxy's address or CIDR instead.`,
29
+ );
30
+ }
31
+ return text;
32
+ }
@@ -0,0 +1,25 @@
1
+ import type { TypeBoxTypeProvider } from '@fastify/type-provider-typebox';
2
+ import type {
3
+ FastifyBaseLogger,
4
+ FastifyInstance,
5
+ RawReplyDefaultExpression,
6
+ RawRequestDefaultExpression,
7
+ RawServerDefault,
8
+ } from 'fastify';
9
+
10
+ /**
11
+ * A Fastify instance whose routes are typed from their TypeBox schemas: the
12
+ * `body`, `params`, `querystring` and response of a route registered on it are
13
+ * inferred. A route module takes it as its parameter, and the server is built
14
+ * with `fastify(options).withTypeProvider<TypeBoxTypeProvider>()`.
15
+ *
16
+ * Types only: `@fastify/type-provider-typebox` is an optional peer, installed by
17
+ * the backends that type their routes this way.
18
+ */
19
+ export type FastifyTyped = FastifyInstance<
20
+ RawServerDefault,
21
+ RawRequestDefaultExpression,
22
+ RawReplyDefaultExpression,
23
+ FastifyBaseLogger,
24
+ TypeBoxTypeProvider
25
+ >;
package/src/server.ts CHANGED
@@ -5,3 +5,43 @@ export {
5
5
  listSiteFiles,
6
6
  resolveAddress,
7
7
  } from './server/siteFiles.ts';
8
+ export type {
9
+ ServerConfig,
10
+ ServerConfigOptions,
11
+ ServerEnvironment,
12
+ } from './server/config.ts';
13
+ export { readHttpAddress, readServerConfig } from './server/config.ts';
14
+ export type { ReadEnvNumberOptions } from './server/envNumber.ts';
15
+ export { readEnvNumber } from './server/envNumber.ts';
16
+ export type { HealthRouteOptions } from './server/healthRoute.ts';
17
+ export { healthRoute } from './server/healthRoute.ts';
18
+ export type { ListenSiteOptions } from './server/listenSite.ts';
19
+ export { listenSite } from './server/listenSite.ts';
20
+ export { readRepositoryVersion } from './server/repositoryVersion.ts';
21
+ export { readRouteTable } from './server/routeTable.ts';
22
+ export { spaSite } from './server/spaSite.ts';
23
+ export type {
24
+ SpaPage,
25
+ SpaSiteOptions,
26
+ SpaStructuredData,
27
+ } from './server/spaSiteOptions.ts';
28
+ export type {
29
+ ToolSiteContext,
30
+ ToolSiteServerOptions,
31
+ } from './server/toolSiteServer.ts';
32
+ export { startToolServer, toolSiteServer } from './server/toolSiteServer.ts';
33
+ export { parseTrustProxy } from './server/trustProxy.ts';
34
+ export type { FastifyTyped } from './server/types.ts';
35
+ export type {
36
+ AnswerAddresses,
37
+ AnswerAddressesInput,
38
+ } from './server/answerAddresses.ts';
39
+ export {
40
+ answerAddresses,
41
+ joinAddress,
42
+ viewOrigins,
43
+ } from './server/answerAddresses.ts';
44
+ export type { CardMetaOptions, PageAnswer } from './server/cardMeta.ts';
45
+ export { cardMeta, pageAnswer } from './server/cardMeta.ts';
46
+ export type { SiteViewOptions } from './server/siteView.ts';
47
+ export { siteView } from './server/siteView.ts';
@@ -41,9 +41,12 @@ export function parseShareConfig<
41
41
  >(search: string, vocabulary: ShareVocabulary<Codecs>): ShareConfig<Codecs> {
42
42
  const values = firstValues(parseQuery(search));
43
43
  const embed = values.get(EMBED_PARAM);
44
+ const asked = splitHidden(values.get(HIDE_PARAM));
44
45
  return {
45
- embed: embed !== undefined && embed !== '0',
46
- hidden: orderHidden(splitHidden(values.get(HIDE_PARAM)), vocabulary.parts),
46
+ embed:
47
+ (embed !== undefined && embed !== '0') ||
48
+ namesAny(asked, vocabulary.legacyEmbedParts ?? []),
49
+ hidden: orderHidden(asked, vocabulary.parts),
47
50
  params: readParams(values, vocabulary.params) as ShareParamValues<Codecs>,
48
51
  };
49
52
  }
@@ -154,6 +157,46 @@ export function suggestedShareConfig<
154
157
  return { ...parseShareConfig('', vocabulary), embed: true, hidden };
155
158
  }
156
159
 
160
+ /**
161
+ * Read the parts a `?hide=` value switches off, for a page that holds its
162
+ * query decoded rather than as a string.
163
+ * @param raw - The raw value, comma separated; `undefined` when absent.
164
+ * @param parts - The hideable parts, in the vocabulary order.
165
+ * @returns The keys of the parts named, in that order; a key the vocabulary
166
+ * does not list is dropped, so a hand-written link cannot hide what it cannot
167
+ * name.
168
+ */
169
+ export function readHiddenParts(
170
+ raw: string | undefined,
171
+ parts: readonly HideablePart[],
172
+ ): readonly string[] {
173
+ return orderHidden(splitHidden(raw), parts);
174
+ }
175
+
176
+ /**
177
+ * Write a `?hide=` value in the vocabulary order, so one selection always
178
+ * produces one link.
179
+ * @param hidden - The keys switched off, in any order and any collection.
180
+ * @param parts - The hideable parts, in the vocabulary order.
181
+ * @returns The value, empty when nothing the vocabulary lists is switched off.
182
+ */
183
+ export function formatHiddenParts(
184
+ hidden: Iterable<string>,
185
+ parts: readonly HideablePart[],
186
+ ): string {
187
+ return orderHidden(new Set(hidden), parts).join(',');
188
+ }
189
+
190
+ function namesAny(
191
+ asked: ReadonlySet<string>,
192
+ keys: readonly string[],
193
+ ): boolean {
194
+ for (const key of keys) {
195
+ if (asked.has(key)) return true;
196
+ }
197
+ return false;
198
+ }
199
+
157
200
  function splitHidden(raw: string | undefined): ReadonlySet<string> {
158
201
  const asked = new Set<string>();
159
202
  if (raw === undefined) return asked;
@@ -3,9 +3,11 @@ export {
3
3
  EMBED_PARAM,
4
4
  HIDE_PARAM,
5
5
  applyShareConfig,
6
+ formatHiddenParts,
6
7
  isHidden,
7
8
  isShareConfigured,
8
9
  parseShareConfig,
10
+ readHiddenParts,
9
11
  suggestedShareConfig,
10
12
  visibleShareParts,
11
13
  } from './config.ts';
@@ -17,6 +19,8 @@ export {
17
19
  sharePreviewSize,
18
20
  } from './devices.ts';
19
21
  export { escapeAttribute, escapeText } from './escape.ts';
22
+ export type { KeySetParamOptions } from './keySetParam.ts';
23
+ export { keySetParam } from './keySetParam.ts';
20
24
  export type { ShareRegion } from './regions.ts';
21
25
  export {
22
26
  SHARE_REGIONS_MESSAGE,