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
@@ -1,17 +1,27 @@
1
1
  import { Dialog, DialogBody } from '@blueprintjs/core';
2
2
 
3
+ import { Prose } from '../../i18n/ui/Prose.tsx';
4
+ import { useChromeT } from '../../i18n/ui/useT.ts';
3
5
  import { TOKEN } from '../../tokens/core/familyTokens.ts';
4
6
  import type { IrCommand, IrCommandId } from '../core/irCommands.ts';
5
- import { irCommands } from '../core/irCommands.ts';
6
7
  import { IR_MODE_RULES } from '../core/irMode.ts';
8
+ import type { IrTechnique } from '../core/irTechnique.ts';
9
+ import { irCommandsFor } from '../core/irTechniqueCommands.ts';
7
10
 
8
11
  import { IrLogo } from './IrLogo.tsx';
12
+ import { useIrText } from './useIrText.ts';
9
13
 
10
14
  export interface IrDocumentationDialogProps {
11
15
  /** Whether the dialog is open. */
12
16
  isOpen: boolean;
13
17
  /** Close it. */
14
18
  onClose: () => void;
19
+ /**
20
+ * What the spectra were measured with, which decides what the guide says:
21
+ * only what is true of the technique, and only the commands it offers.
22
+ * @default 'infrared'
23
+ */
24
+ technique?: IrTechnique;
15
25
  }
16
26
 
17
27
  /**
@@ -19,73 +29,36 @@ export interface IrDocumentationDialogProps {
19
29
  *
20
30
  * In the component rather than on a site, so there is nowhere to leave for and
21
31
  * nothing to keep in step: every key in the table below is read out of the same
22
- * `irCommands` the toolbar and the key handler read, so a shortcut cannot be
32
+ * command table the toolbar and the key handler read, so a shortcut cannot be
23
33
  * documented as one thing and bound as another.
24
34
  * @param props - Component props.
25
35
  * @returns The dialog.
26
36
  */
27
37
  export function IrDocumentationDialog(props: IrDocumentationDialogProps) {
28
- const { isOpen, onClose } = props;
38
+ const { isOpen, onClose, technique = 'infrared' } = props;
39
+ const text = useIrText(technique);
40
+ const ids = Object.keys(irCommandsFor(technique)) as IrCommandId[];
29
41
 
30
42
  return (
31
43
  <Dialog
32
44
  isOpen={isOpen}
33
45
  onClose={onClose}
34
- title="Using the infrared viewer"
35
- icon={<IrLogo size={20} />}
46
+ title={text.documentation}
47
+ icon={<IrLogo size={20} technique={technique} />}
36
48
  style={dialogStyle}
37
49
  >
38
50
  <DialogBody>
39
- <h4 style={headingStyle}>Opening a spectrum</h4>
40
- <p style={paragraphStyle}>
41
- JCAMP-DX (<code>.jdx</code>, <code>.dx</code>) and Thermo Galactic SPC
42
- (<code>.spc</code>) are read. A file holding several blocks — a sample
43
- beside its background, or an infrared spectrum beside a Raman one —
44
- gives one spectrum per infrared block; the others are left to their
45
- own viewers. Two columns of numbers are not read yet.
46
- </p>
47
-
48
- <h4 style={headingStyle}>The axis runs backwards</h4>
49
- <p style={paragraphStyle}>
50
- Wavenumber decreases to the right, from 4000 cm⁻¹ down to 400, which
51
- is how infrared spectra have been printed since the instruments
52
- scanned that way. Every window is still stated low end first.
53
- </p>
54
-
55
- <h4 style={headingStyle}>Absorbance or transmittance</h4>
56
- <p style={paragraphStyle}>
57
- The same measurement, read the other way up — the file carries both,
58
- whichever it was written in. In{' '}
59
- <strong>{IR_MODE_RULES.transmittance.title}</strong> the bands hang
60
- down from a baseline near 100; in{' '}
61
- <strong>{IR_MODE_RULES.absorbance.title}</strong> they stand up out of
62
- zero. The labels and the marks follow, so the pair reads the same way
63
- up in either.
64
- </p>
65
-
66
- <h4 style={headingStyle}>Reading the bands</h4>
67
- <p style={paragraphStyle}>
68
- The bands of the <em>selected</em> spectrum are picked, marked on the
69
- chart, and listed in the bands panel with{' '}
70
- <strong>every vibration whose range contains them</strong> — narrowest
71
- claim first. That is deliberate: a band at 1715 cm⁻¹ really is a
72
- ketone, an aldehyde and a carboxylic acid until something else decides
73
- between them, and the note on each candidate is what tells them apart.
74
- Hovering a row marks the band on the chart, and hovering the chart
75
- lights the row.
76
- </p>
77
- <p style={paragraphStyle}>
78
- A band is reported at the sampled point it peaked on, so on a 4 cm⁻¹
79
- grid a carbonyl centred at 1710 reads 1708 or 1712. Do not quote one
80
- as though it were measured to the wavenumber.
81
- </p>
51
+ {technique === 'raman' ? <RamanGuide /> : <InfraredGuide />}
82
52
 
83
53
  <h4 style={headingStyle}>Gestures and keys</h4>
84
54
  <table style={tableStyle}>
85
55
  <tbody>
86
- {(Object.keys(irCommands) as IrCommandId[]).map((id) => (
87
- <CommandRow key={id} id={id} />
88
- ))}
56
+ {ids.map((id) => {
57
+ const entry = text.command(id);
58
+ return entry === undefined ? null : (
59
+ <CommandRow key={id} entry={entry} />
60
+ );
61
+ })}
89
62
  </tbody>
90
63
  </table>
91
64
  </DialogBody>
@@ -93,9 +66,81 @@ export function IrDocumentationDialog(props: IrDocumentationDialogProps) {
93
66
  );
94
67
  }
95
68
 
69
+ /**
70
+ * What is true of reading an infrared spectrum here.
71
+ * @returns The sections.
72
+ */
73
+ function InfraredGuide() {
74
+ return (
75
+ <>
76
+ <h4 style={headingStyle}>Opening a spectrum</h4>
77
+ <p style={paragraphStyle}>
78
+ JCAMP-DX (<code>.jdx</code>, <code>.dx</code>) and Thermo Galactic SPC (
79
+ <code>.spc</code>) are read. A file holding several blocks — a sample
80
+ beside its background, or an infrared spectrum beside a Raman one —
81
+ gives one spectrum per infrared block; the others are left to their own
82
+ viewers. Two columns of numbers are not read yet.
83
+ </p>
84
+
85
+ <h4 style={headingStyle}>The axis runs backwards</h4>
86
+ <p style={paragraphStyle}>
87
+ Wavenumber decreases to the right, from 4000 cm⁻¹ down to 400, which is
88
+ how infrared spectra have been printed since the instruments scanned
89
+ that way. Every window is still stated low end first.
90
+ </p>
91
+
92
+ <h4 style={headingStyle}>Absorbance or transmittance</h4>
93
+ <p style={paragraphStyle}>
94
+ The same measurement, read the other way up — the file carries both,
95
+ whichever it was written in. In{' '}
96
+ <strong>{IR_MODE_RULES.transmittance.title}</strong> the bands hang down
97
+ from a baseline near 100; in{' '}
98
+ <strong>{IR_MODE_RULES.absorbance.title}</strong> they stand up out of
99
+ zero. The labels and the marks follow, so the pair reads the same way up
100
+ in either.
101
+ </p>
102
+
103
+ <h4 style={headingStyle}>Reading the bands</h4>
104
+ <p style={paragraphStyle}>
105
+ The bands of the <em>selected</em> spectrum are picked, marked on the
106
+ chart, and listed in the bands panel with{' '}
107
+ <strong>every vibration whose range contains them</strong> — narrowest
108
+ claim first. That is deliberate: a band at 1715 cm⁻¹ really is a ketone,
109
+ an aldehyde and a carboxylic acid until something else decides between
110
+ them, and the note on each candidate is what tells them apart. Hovering
111
+ a row marks the band on the chart, and hovering the chart lights the
112
+ row.
113
+ </p>
114
+ <p style={paragraphStyle}>
115
+ A band is reported at the sampled point it peaked on, so on a 4 cm⁻¹
116
+ grid a carbonyl centred at 1710 reads 1708 or 1712. Do not quote one as
117
+ though it were measured to the wavenumber.
118
+ </p>
119
+ </>
120
+ );
121
+ }
122
+
123
+ /**
124
+ * What is true of reading a Raman spectrum here: only the bands, since it has
125
+ * one value axis, runs the usual way, and is not assigned.
126
+ * @returns The section.
127
+ */
128
+ function RamanGuide() {
129
+ const t = useChromeT();
130
+ return (
131
+ <>
132
+ <h4 style={headingStyle}>Reading the bands</h4>
133
+ <p style={paragraphStyle}>
134
+ <Prose text={t('ir.raman.doc.bands')} />
135
+ </p>
136
+ <p style={paragraphStyle}>{t('ir.raman.doc.sampled')}</p>
137
+ </>
138
+ );
139
+ }
140
+
96
141
  interface CommandRowProps {
97
- /** Which command the row is about. */
98
- id: IrCommandId;
142
+ /** The command, as the viewer words it. */
143
+ entry: IrCommand;
99
144
  }
100
145
 
101
146
  /**
@@ -104,8 +149,7 @@ interface CommandRowProps {
104
149
  * @returns The row.
105
150
  */
106
151
  function CommandRow(props: CommandRowProps) {
107
- const { id } = props;
108
- const entry = irCommands[id] as IrCommand;
152
+ const { entry } = props;
109
153
  const keys = entry.shortcut?.label ?? entry.shortcut?.keys;
110
154
 
111
155
  return (
@@ -1,13 +1,10 @@
1
1
  import type { Ref } from 'react';
2
- import { RootLayout } from 'react-science/ui';
3
2
 
4
3
  import type { IrEditorHandle } from '../core/irEditorApi.ts';
5
4
  import type { IrSidePanelId } from '../core/irSidePanels.ts';
6
5
  import type { IrMode, IrSpectrum } from '../core/irSpectrum.ts';
7
6
 
8
- import { IrShell } from './IrShell.tsx';
9
- import { IrStateProvider } from './IrStateProvider.tsx';
10
- import { useIrEditor } from './useIrEditor.ts';
7
+ import { VibrationalEditor } from './VibrationalEditor.tsx';
11
8
 
12
9
  export interface IrEditorProps {
13
10
  /**
@@ -29,7 +26,8 @@ export interface IrEditorProps {
29
26
  */
30
27
  onChange?: (spectra: IrSpectrum[]) => void;
31
28
  /**
32
- * Which value axis to open in.
29
+ * Which value axis to open in: transmittance or absorbance. Intensity, which
30
+ * infrared does not offer, opens transmittance instead.
33
31
  * @default 'transmittance'
34
32
  */
35
33
  mode?: IrMode;
@@ -49,6 +47,7 @@ export interface IrEditorProps {
49
47
  /**
50
48
  * An infrared spectrum viewer: a header across the top, the chart in the middle,
51
49
  * the tools down the left, and the panels that interrogate it down the right.
50
+ * `RamanEditor`, from `react-cheminfo/raman`, is the same viewer for Raman.
52
51
  *
53
52
  * The same shape as the mass viewer, deliberately — a page may well hold both,
54
53
  * and a chemist who has learned one should not have to learn the other. The chart
@@ -65,35 +64,5 @@ export interface IrEditorProps {
65
64
  * @returns The viewer.
66
65
  */
67
66
  export function IrEditor(props: IrEditorProps) {
68
- const { data = NO_SPECTRA, onChange, mode, defaultPanelIds, ref } = props;
69
-
70
- const editor = useIrEditor({
71
- spectra: data,
72
- settings: mode === undefined ? undefined : { mode },
73
- panelIds: defaultPanelIds,
74
- onChange,
75
- });
76
-
77
- return (
78
- <IrStateProvider editor={editor}>
79
- {/* `react-science`'s own root: it holds the element the browser is asked
80
- to show full screen, points Blueprint's portals at that element so
81
- dialogs and tooltips are not left behind in `document.body`, and paints
82
- the backdrop white. Above the shell rather than inside it, so the shell
83
- can ask whether it is full screen and offer the way out. */}
84
- <RootLayout style={rootLayoutStyle}>
85
- <IrShell handle={ref} />
86
- </RootLayout>
87
- </IrStateProvider>
88
- );
67
+ return <VibrationalEditor technique="infrared" {...props} />;
89
68
  }
90
-
91
- /**
92
- * The viewer fills what it is given, and its own children scroll rather than
93
- * push: `react-science` lays its root out as a column of full width and height,
94
- * and a flex column with no `minHeight` grows past its parent instead.
95
- */
96
- const rootLayoutStyle = { minHeight: 0 } as const;
97
-
98
- /** What a viewer opens on when it is handed nothing, kept stable for the memo. */
99
- const NO_SPECTRA: IrSpectrum[] = [];
@@ -2,6 +2,8 @@ import { Header, Toolbar, useFullscreen } from 'react-science/ui';
2
2
 
3
3
  import { IrLogo } from './IrLogo.tsx';
4
4
  import { useIrCommandProps } from './irCommandContext.tsx';
5
+ import { useIrEditorState } from './irStateContext.ts';
6
+ import { useIrText } from './useIrText.ts';
5
7
 
6
8
  /**
7
9
  * The bar across the top: the mark on the left, the viewer on the right.
@@ -17,13 +19,18 @@ import { useIrCommandProps } from './irCommandContext.tsx';
17
19
  export function IrHeader() {
18
20
  const command = useIrCommandProps();
19
21
  const { isFullScreen } = useFullscreen();
22
+ const { technique } = useIrEditorState().state.settings;
23
+ const text = useIrText(technique);
20
24
 
21
25
  return (
22
26
  <Header>
23
- <Toolbar aria-label="Infrared spectrum viewer">
24
- <Toolbar.Item icon={<IrLogo size={16} />} {...command('about')} />
27
+ <Toolbar aria-label={text.viewer}>
28
+ <Toolbar.Item
29
+ icon={<IrLogo size={16} technique={technique} />}
30
+ {...command('about')}
31
+ />
25
32
  </Toolbar>
26
- <Toolbar aria-label="Infrared spectrum viewer help">
33
+ <Toolbar aria-label={text.viewerHelp}>
27
34
  <Toolbar.Item icon="help" {...command('documentation')} />
28
35
  {/* Always the last thing in the bar, hard against the right edge: the
29
36
  corner a window is made bigger from is the corner it is looked for
@@ -1,24 +1,37 @@
1
+ import type { IrTechnique } from '../core/irTechnique.ts';
2
+
3
+ import { useIrText } from './useIrText.ts';
4
+
1
5
  export interface IrLogoProps {
2
6
  /**
3
7
  * How big to draw it, in pixels.
4
8
  * @default 16
5
9
  */
6
10
  size?: number;
11
+ /**
12
+ * What the spectra were measured with, which decides which way the bands
13
+ * point.
14
+ * @default 'infrared'
15
+ */
16
+ technique?: IrTechnique;
7
17
  }
8
18
 
9
19
  /**
10
- * The viewer's mark: three bands hanging from a baseline.
20
+ * The viewer's mark: three bands meeting a baseline.
11
21
  *
12
22
  * Drawn from the domain's own primitives rather than being a picture of a chart —
13
23
  * a transmittance baseline near the top with a strong band, a medium one and a
14
24
  * weak one dropping out of it, which is what an infrared spectrum looks like at a
15
- * glance and what nothing else looks like. Three elements, because that is what
16
- * survives 16 pixels.
25
+ * glance and what nothing else looks like. A Raman spectrum's bands stand up from
26
+ * a baseline near the foot instead, so its mark is the same three bands rising.
27
+ * Three elements, because that is what survives 16 pixels.
17
28
  * @param props - Component props.
18
29
  * @returns The mark, as SVG.
19
30
  */
20
31
  export function IrLogo(props: IrLogoProps) {
21
- const { size = 16 } = props;
32
+ const { size = 16, technique = 'infrared' } = props;
33
+ const { mark } = useIrText(technique);
34
+ const { baseline, bands } = MARKS[technique];
22
35
 
23
36
  return (
24
37
  <svg
@@ -26,19 +39,19 @@ export function IrLogo(props: IrLogoProps) {
26
39
  height={size}
27
40
  viewBox="0 0 16 16"
28
41
  role="img"
29
- aria-label="Infrared viewer"
42
+ aria-label={mark}
30
43
  >
31
- {/* The baseline, high up, where 100 % transmittance runs. */}
44
+ {/* The baseline: high up where 100 % transmittance runs, low for Raman. */}
32
45
  <path
33
- d="M1 3H15"
46
+ d={baseline}
34
47
  fill="none"
35
48
  stroke="#94a3b8"
36
49
  strokeWidth={1}
37
50
  strokeLinecap="round"
38
51
  />
39
- {/* Three bands dropping out of it, strong, medium, weak. */}
52
+ {/* Three bands meeting it, strong, medium, weak. */}
40
53
  <path
41
- d="M3 3V13M8 3V8.5M12.5 3V6"
54
+ d={bands}
42
55
  fill="none"
43
56
  stroke="#0072b2"
44
57
  strokeWidth={2}
@@ -47,3 +60,9 @@ export function IrLogo(props: IrLogoProps) {
47
60
  </svg>
48
61
  );
49
62
  }
63
+
64
+ /** The two strokes of each technique's mark. */
65
+ const MARKS: Record<IrTechnique, { baseline: string; bands: string }> = {
66
+ infrared: { baseline: 'M1 3H15', bands: 'M3 3V13M8 3V8.5M12.5 3V6' },
67
+ raman: { baseline: 'M1 13H15', bands: 'M3 13V3M8 13V7.5M12.5 13V10' },
68
+ };
@@ -1,11 +1,5 @@
1
1
  import type { Ref } from 'react';
2
- import {
3
- useCallback,
4
- useId,
5
- useImperativeHandle,
6
- useMemo,
7
- useState,
8
- } from 'react';
2
+ import { useId, useMemo, useState } from 'react';
9
3
  import { SplitPane, useFullscreen } from 'react-science/ui';
10
4
 
11
5
  import { sanitizeFileName } from '../../download/core/sanitizeFileName.ts';
@@ -13,12 +7,12 @@ import { useFigureDownload } from '../../download/ui/useFigureDownload.tsx';
13
7
  import { PanelRail } from '../../panel/ui/PanelRail.tsx';
14
8
  import type { IrBand } from '../core/irBand.ts';
15
9
  import type { IrCommandHandlers } from '../core/irCommands.ts';
16
- import { fullDomain } from '../core/irDomain.ts';
17
- import type { IrEditorHandle, ZoomToBandOptions } from '../core/irEditorApi.ts';
18
- import { otherIrMode, yAxisRules } from '../core/irMode.ts';
10
+ import type { IrEditorHandle } from '../core/irEditorApi.ts';
11
+ import { otherIrMode } from '../core/irMode.ts';
19
12
  import { irSidePanels } from '../core/irSidePanels.ts';
20
- import type { IrDomain, IrSpectrum } from '../core/irSpectrum.ts';
13
+ import type { IrSpectrum } from '../core/irSpectrum.ts';
21
14
  import { DEFAULT_SIDE_PANEL } from '../core/irState.ts';
15
+ import { irCommandOffered } from '../core/irTechniqueCommands.ts';
22
16
 
23
17
  import { IrAboutDialog } from './IrAboutDialog.tsx';
24
18
  import { IrCanvas } from './IrCanvas.tsx';
@@ -28,7 +22,9 @@ import { IrHeader } from './IrHeader.tsx';
28
22
  import { IrSidePanel } from './IrSidePanel.tsx';
29
23
  import { IrToolbar } from './IrToolbar.tsx';
30
24
  import { useIrActions, useIrEditorState } from './irStateContext.ts';
25
+ import { useIrHandle } from './useIrHandle.ts';
31
26
  import { useIrShortcuts } from './useIrShortcuts.ts';
27
+ import { useValueAxisZoom } from './useValueAxisZoom.ts';
32
28
 
33
29
  export interface IrShellProps {
34
30
  /**
@@ -58,8 +54,8 @@ export function IrShell(props: IrShellProps) {
58
54
  const { state, visibleSpectra, selectedSpectrum } = useIrEditorState();
59
55
  const actions = useIrActions();
60
56
  const { toggle: toggleFullScreen } = useFullscreen();
61
- const { openPanelIds, tool, domain } = state.view;
62
- const { mode, pickBands, showAssignments } = state.settings;
57
+ const { openPanelIds, tool } = state.view;
58
+ const { mode, pickBands, showAssignments, technique } = state.settings;
63
59
 
64
60
  const [isAboutOpen, setIsAboutOpen] = useState(false);
65
61
  const [isDocumentationOpen, setIsDocumentationOpen] = useState(false);
@@ -79,27 +75,7 @@ export function IrShell(props: IrShellProps) {
79
75
  // times a second.
80
76
  const [highlight, setHighlight] = useState<IrBand | null>(null);
81
77
 
82
- /**
83
- * ChartScale the value axis by a factor, about the baseline the mode hangs from.
84
- * @param factor - Above one to zoom out.
85
- */
86
- const scaleValueAxis = useCallback(
87
- (factor: number) => {
88
- const shown = domain ?? fullDomain(visibleSpectra, mode);
89
- // Asked of the mode rather than written out again here: the baseline a
90
- // value axis is scaled about is `irMode`'s to know, and a second copy of
91
- // it is a second thing to get wrong.
92
- const { baseline = 0 } = yAxisRules(mode);
93
- actions.setDomain({
94
- x: shown.x,
95
- y: [
96
- baseline + (shown.y[0] - baseline) * factor,
97
- baseline + (shown.y[1] - baseline) * factor,
98
- ],
99
- });
100
- },
101
- [actions, domain, visibleSpectra, mode],
102
- );
78
+ const { zoomIn, zoomOut } = useValueAxisZoom();
103
79
 
104
80
  const commands = useMemo<IrCommandHandlers>(
105
81
  () => ({
@@ -108,13 +84,18 @@ export function IrShell(props: IrShellProps) {
108
84
  fullScreen: toggleFullScreen,
109
85
  readTool: () => actions.setTool('read'),
110
86
  boxTool: () => actions.setTool(tool === 'box' ? 'read' : 'box'),
111
- zoomIn: () => scaleValueAxis(1 / ZOOM_STEP),
112
- zoomOut: () => scaleValueAxis(ZOOM_STEP),
87
+ zoomIn,
88
+ zoomOut,
113
89
  resetZoom: () => actions.resetDomain(),
114
- toggleMode: () => actions.setSettings({ mode: otherIrMode(mode) }),
90
+ // A command the technique does not offer has no handler, so its key
91
+ // stays with the page.
92
+ toggleMode: irCommandOffered(technique, 'toggleMode')
93
+ ? () => actions.setSettings({ mode: otherIrMode(mode, technique) })
94
+ : undefined,
115
95
  togglePicking: () => actions.setSettings({ pickBands: !pickBands }),
116
- toggleAssignments: () =>
117
- actions.setSettings({ showAssignments: !showAssignments }),
96
+ toggleAssignments: irCommandOffered(technique, 'toggleAssignments')
97
+ ? () => actions.setSettings({ showAssignments: !showAssignments })
98
+ : undefined,
118
99
  exportImage: () => setFigureOpen(!isFigureOpen),
119
100
  clear: () => actions.clear(),
120
101
  }),
@@ -122,9 +103,11 @@ export function IrShell(props: IrShellProps) {
122
103
  actions,
123
104
  tool,
124
105
  mode,
106
+ technique,
125
107
  pickBands,
126
108
  showAssignments,
127
- scaleValueAxis,
109
+ zoomIn,
110
+ zoomOut,
128
111
  toggleFullScreen,
129
112
  isFigureOpen,
130
113
  setFigureOpen,
@@ -137,28 +120,7 @@ export function IrShell(props: IrShellProps) {
137
120
  // again.
138
121
  const [root, setRoot] = useState<HTMLElement | null>(null);
139
122
  useIrShortcuts(root, commands);
140
-
141
- useImperativeHandle(
142
- handle,
143
- (): IrEditorHandle => ({
144
- getSpectra: () => state.data.spectra,
145
- setSpectra: (spectra) => actions.setSpectra(spectra),
146
- addSpectra: (spectra) => actions.addSpectra(spectra),
147
- clear: () => actions.clear(),
148
- setDomain: (next) => actions.setDomain(next),
149
- resetDomain: () => actions.resetDomain(),
150
- zoomToWavenumber: (wavenumber, options: ZoomToBandOptions = {}) => {
151
- const { width = DEFAULT_FRAME_WIDTH } = options;
152
- const shown: IrDomain = domain ?? fullDomain(visibleSpectra, mode);
153
- actions.setDomain({
154
- x: [wavenumber - width / 2, wavenumber + width / 2],
155
- y: shown.y,
156
- });
157
- },
158
- selectSpectrum: (id) => actions.selectSpectrum(id),
159
- }),
160
- [state.data.spectra, actions, domain, visibleSpectra, mode],
161
- );
123
+ useIrHandle(handle);
162
124
 
163
125
  /**
164
126
  * Open or close the side, as the splitter is dragged shut and back open.
@@ -175,7 +137,7 @@ export function IrShell(props: IrShellProps) {
175
137
  }
176
138
 
177
139
  return (
178
- <IrCommandProvider handlers={commands}>
140
+ <IrCommandProvider handlers={commands} technique={technique}>
179
141
  {/* `tabIndex` so a click anywhere in the viewer makes this the target the
180
142
  shortcuts are heard on: keys are delivered to whatever holds the caret,
181
143
  and an SVG never does. */}
@@ -221,27 +183,17 @@ export function IrShell(props: IrShellProps) {
221
183
  <IrAboutDialog
222
184
  isOpen={isAboutOpen}
223
185
  onClose={() => setIsAboutOpen(false)}
186
+ technique={technique}
224
187
  />
225
188
  <IrDocumentationDialog
226
189
  isOpen={isDocumentationOpen}
227
190
  onClose={() => setIsDocumentationOpen(false)}
191
+ technique={technique}
228
192
  />
229
193
  </IrCommandProvider>
230
194
  );
231
195
  }
232
196
 
233
- /**
234
- * What one press of zoom in or out is worth.
235
- *
236
- * A fifth, which is about what one notch of a mouse wheel does — so the button
237
- * and the wheel feel like the same gesture at two speeds rather than two
238
- * different ones.
239
- */
240
- const ZOOM_STEP = 1.2;
241
-
242
- /** How wide a window a host gets when it asks to frame a band without saying. */
243
- const DEFAULT_FRAME_WIDTH = 200;
244
-
245
197
  /**
246
198
  * What a picture of the chart is called.
247
199
  *
@@ -8,18 +8,21 @@ import {
8
8
  statusSpacerStyle as spacerStyle,
9
9
  } from '../../panel/core/statusBar.ts';
10
10
  import { countAssigned } from '../core/assignBands.ts';
11
- import { formatWavenumber } from '../core/irFormat.ts';
12
- import { boxZoomOnly, yAxisTitle } from '../core/irMode.ts';
11
+ import { formatWavenumberRange } from '../core/irFormat.ts';
12
+ import { boxZoomOnly } from '../core/irMode.ts';
13
+ import { IR_TECHNIQUE_RULES } from '../core/irTechnique.ts';
13
14
 
14
15
  import { useIrEditorState } from './irStateContext.ts';
16
+ import { useIrText } from './useIrText.ts';
15
17
 
16
18
  /**
17
19
  * The one line under the chart: what is drawn, what was found, what went wrong.
18
20
  *
19
21
  * Everything in it is derived, so it is the cheapest place in the viewer to
20
22
  * answer "did that work" — how many spectra are drawn of those open, how many
21
- * bands the picking found and how many the table had something to say about, and
22
- * the range the selected spectrum covers.
23
+ * bands the picking found and how many the table had something to say about
24
+ * (where the table covers the technique), and the range the selected spectrum
25
+ * covers, in the order its axis is read.
23
26
  *
24
27
  * The refusal is last and is the only red in the shell, so the eye that has just
25
28
  * pressed something and seen nothing happen lands on the reason.
@@ -30,12 +33,14 @@ export function IrStatusBar() {
30
33
  useIrEditorState();
31
34
  const { spectra } = state.data;
32
35
  const { error, tool } = state.view;
33
- const { mode, pickBands } = state.settings;
36
+ const { mode, pickBands, technique } = state.settings;
37
+ const { reverseX, assignments } = IR_TECHNIQUE_RULES[technique];
38
+ const text = useIrText(technique);
34
39
 
35
40
  const range =
36
- selectedSpectrum === null || selectedSpectrum.wavenumber.length === 0
37
- ? null
38
- : `${formatWavenumber(selectedSpectrum.wavenumber.at(-1) as number)}–${formatWavenumber(selectedSpectrum.wavenumber[0] as number)} cm⁻¹`;
41
+ selectedSpectrum === null
42
+ ? ''
43
+ : formatWavenumberRange(selectedSpectrum.wavenumber, reverseX);
39
44
 
40
45
  return (
41
46
  <div style={barStyle}>
@@ -45,7 +50,7 @@ export function IrStatusBar() {
45
50
  : `${countLabel(visibleSpectra.length, 'spectrum', 'spectra')} drawn of ${spectra.length}`}
46
51
  </span>
47
52
 
48
- <span style={itemStyle}>{yAxisTitle(mode)}</span>
53
+ <span style={itemStyle}>{text.yTitle(mode)}</span>
49
54
 
50
55
  {selectedSpectrum === null ? null : (
51
56
  <span style={nameStyle} title={selectedSpectrum.name}>
@@ -53,12 +58,12 @@ export function IrStatusBar() {
53
58
  </span>
54
59
  )}
55
60
 
56
- {range === null ? null : <span style={mutedStyle}>{range}</span>}
61
+ {range === '' ? null : <span style={mutedStyle}>{range}</span>}
57
62
 
58
63
  {pickBands && assigned.length > 0 ? (
59
64
  <span style={itemStyle}>
60
- {countLabel(assigned.length, 'band', 'bands')},{' '}
61
- {countAssigned(assigned)} assigned
65
+ {countLabel(assigned.length, 'band', 'bands')}
66
+ {assignments ? `, ${countAssigned(assigned)} assigned` : null}
62
67
  </span>
63
68
  ) : null}
64
69