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,50 @@
1
+ import { FormGroup, InputGroup } from '@blueprintjs/core';
2
+ import type { ReactElement } from 'react';
3
+ import { useId } from 'react';
4
+
5
+ /** What {@link FormulaInput} needs. */
6
+ export interface FormulaInputProps {
7
+ /** What the box is for, written above it. */
8
+ label: string;
9
+ /** What is in the box. */
10
+ value: string;
11
+ /** Called with the new text on every keystroke. */
12
+ onChange: (value: string) => void;
13
+ /**
14
+ * How to write what the box expects, under it.
15
+ * @default undefined
16
+ */
17
+ helper?: string;
18
+ /**
19
+ * Placeholder written in the empty box.
20
+ * @default undefined
21
+ */
22
+ placeholder?: string;
23
+ }
24
+
25
+ /**
26
+ * A box to type a molecular formula into, set in a monospace face and with
27
+ * every correction a phone or a browser would make switched off: a keyboard
28
+ * that capitalises `co` has written a different compound.
29
+ * @param props - Its label, its value and what to do on a change.
30
+ * @returns The box.
31
+ */
32
+ export function FormulaInput(props: FormulaInputProps): ReactElement {
33
+ const { label, value, onChange, helper, placeholder } = props;
34
+ const id = useId();
35
+ return (
36
+ <FormGroup label={label} labelFor={id} helperText={helper}>
37
+ <InputGroup
38
+ id={id}
39
+ value={value}
40
+ placeholder={placeholder}
41
+ onValueChange={onChange}
42
+ autoComplete="off"
43
+ autoCorrect="off"
44
+ autoCapitalize="off"
45
+ spellCheck={false}
46
+ className="formula-input"
47
+ />
48
+ </FormGroup>
49
+ );
50
+ }
@@ -0,0 +1,20 @@
1
+ import type { ReactElement } from 'react';
2
+ import { MF } from 'react-mf';
3
+
4
+ import { normalizeFormula } from '../core/normalizeFormula.ts';
5
+
6
+ /** What {@link QuestionFormula} draws. */
7
+ export interface QuestionFormulaProps {
8
+ /** The formula, as the data writes it, in whatever notation it gives a charge. */
9
+ formula: string;
10
+ }
11
+
12
+ /**
13
+ * A formula as the list of a series names its question: subscripts and charge
14
+ * drawn, whatever notation the data writes the charge in.
15
+ * @param props - The formula.
16
+ * @returns The formula.
17
+ */
18
+ export function QuestionFormula(props: QuestionFormulaProps): ReactElement {
19
+ return <MF mf={normalizeFormula(props.formula)} />;
20
+ }
@@ -0,0 +1,6 @@
1
+ export type { CopyableFormulaProps } from './CopyableFormula.tsx';
2
+ export { CopyableFormula } from './CopyableFormula.tsx';
3
+ export type { FormulaInputProps } from './FormulaInput.tsx';
4
+ export { FormulaInput } from './FormulaInput.tsx';
5
+ export type { QuestionFormulaProps } from './QuestionFormula.tsx';
6
+ export { QuestionFormula } from './QuestionFormula.tsx';
package/src/formula.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Molecular formulas: read as a student types them, compared, written as HTML
3
+ * and Unicode, and drawn and copied with their subscripts.
4
+ *
5
+ * An entry point of its own, not part of `react-cheminfo/core` or `/ui`,
6
+ * because it is built on `mf-parser` and `react-mf`: a site that never shows a
7
+ * formula must not be made to install either.
8
+ */
9
+
10
+ export * from './formula/core/index.ts';
11
+ export * from './formula/ui/index.ts';
@@ -15,6 +15,7 @@ export { handleListNavigationKey } from './listNavigation.ts';
15
15
  export type { PollingOptions, PollingSnapshot } from './pollingController.ts';
16
16
  export type { ActiveHeadingOptions } from './useActiveHeading.ts';
17
17
  export { useActiveHeading } from './useActiveHeading.ts';
18
+ export type { AsyncResult } from './useAsync.ts';
18
19
  export { useAsync } from './useAsync.ts';
19
20
  export { useContainerSize } from './useContainerSize.ts';
20
21
  export { useDebouncedValue } from './useDebouncedValue.ts';
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Whether a key event is aimed at somewhere the visitor types: a text field, a
3
- * select, an editable region or anything carrying `role="textbox"`. A keyboard
4
- * shortcut listening above it leaves such a key alone.
3
+ * select, an editable region, anything carrying `role="textbox"`, or a canvas
4
+ * holding the focus — a structure editor reads its own keys there, `Delete`
5
+ * and the arrows included. A keyboard shortcut listening above it leaves such
6
+ * a key alone.
5
7
  * @param target - The `target` of the keyboard event.
6
8
  * @returns True when the key belongs to the field.
7
9
  */
@@ -42,7 +44,7 @@ export function isInteractiveTarget(
42
44
  return role !== null && INTERACTIVE_ROLES.has(role);
43
45
  }
44
46
 
45
- const TEXT_ENTRY_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);
47
+ const TEXT_ENTRY_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT', 'CANVAS']);
46
48
  const INTERACTIVE_TAGS = new Set(['BUTTON', 'A', 'SUMMARY']);
47
49
  const INTERACTIVE_ROLES = new Set([
48
50
  'button',
@@ -1,44 +1,80 @@
1
- import { useEffect, useState } from 'react';
1
+ import { useEffect, useMemo, useState } from 'react';
2
2
 
3
3
  import type { AsyncState } from './asyncState.ts';
4
4
  import { ASYNC_LOADING, asyncFailed, asyncSucceeded } from './asyncState.ts';
5
5
 
6
+ /**
7
+ * Where a task stands, and whether what is on screen still answers the
8
+ * question being asked.
9
+ */
10
+ export type AsyncResult<TData> = AsyncState<TData> & {
11
+ /**
12
+ * True from the moment the question changes — a new task, a new
13
+ * `refreshKey` — until its run settles: the data on screen, if any, answers
14
+ * an earlier question. Also true while the very first run is loading.
15
+ */
16
+ pending: boolean;
17
+ };
18
+
6
19
  /**
7
20
  * Run an async task and follow where it stands, as a discriminated union.
8
21
  *
9
22
  * The task runs on mount and again whenever it or `refreshKey` changes. A
10
23
  * re-run does not flip the state back to `loading`: what is on screen stays
11
24
  * until the new answer arrives, and a refresh that fails keeps it rather than
12
- * replacing it with an error. An answer that arrives after the component
13
- * unmounted, or after a newer run started, is ignored.
25
+ * replacing it with an error; `pending` says the answer is stale meanwhile. An
26
+ * answer that arrives after the component unmounted, or after a newer run
27
+ * started, is ignored, and the run's signal is aborted at that moment, so a
28
+ * task that hands it to `fetch` stops asking a question nobody waits for.
14
29
  *
15
30
  * The task is a dependency, so pass a stable function — declared at module
16
31
  * scope, or wrapped in `useCallback` over the values it reads.
17
- * @param task - The async function to run.
32
+ * @param task - The async function to run, handed a signal aborted once its
33
+ * answer is no longer wanted.
18
34
  * @param refreshKey - Changing it runs the task again; only its identity
19
35
  * matters. Defaults to `undefined`.
20
- * @returns Where the latest run stands.
36
+ * @returns Where the latest run stands, and whether it is still running.
21
37
  */
22
38
  export function useAsync<TData>(
23
- task: () => Promise<TData>,
39
+ task: (signal: AbortSignal) => Promise<TData>,
24
40
  refreshKey?: unknown,
25
- ): AsyncState<TData> {
26
- const [state, setState] = useState<AsyncState<TData>>(ASYNC_LOADING);
41
+ ): AsyncResult<TData> {
42
+ const [answer, setAnswer] = useState<Answer<TData>>(UNANSWERED);
27
43
 
28
44
  useEffect(() => {
29
- let cancelled = false;
30
- task().then(
45
+ const controller = new AbortController();
46
+ task(controller.signal).then(
31
47
  (data) => {
32
- if (!cancelled) setState(asyncSucceeded(data));
48
+ if (controller.signal.aborted) return;
49
+ setAnswer({ state: asyncSucceeded(data), task, refreshKey });
33
50
  },
34
51
  (error: unknown) => {
35
- if (!cancelled) setState((previous) => asyncFailed(previous, error));
52
+ if (controller.signal.aborted) return;
53
+ setAnswer((previous) => ({
54
+ state: asyncFailed(previous.state, error),
55
+ task,
56
+ refreshKey,
57
+ }));
36
58
  },
37
59
  );
38
60
  return () => {
39
- cancelled = true;
61
+ controller.abort();
40
62
  };
41
63
  }, [task, refreshKey]);
42
64
 
43
- return state;
65
+ const pending =
66
+ answer.task !== task || !Object.is(answer.refreshKey, refreshKey);
67
+ return useMemo(() => ({ ...answer.state, pending }), [answer.state, pending]);
44
68
  }
69
+
70
+ interface Answer<TData> {
71
+ state: AsyncState<TData>;
72
+ task: unknown;
73
+ refreshKey: unknown;
74
+ }
75
+
76
+ const UNANSWERED: Answer<never> = {
77
+ state: ASYNC_LOADING,
78
+ task: null,
79
+ refreshKey: undefined,
80
+ };
@@ -14,14 +14,31 @@ import { xySortX } from 'ml-spectra-processing';
14
14
 
15
15
  import type { IrMeta, IrMode, IrOrigin } from './irSpectrum.ts';
16
16
 
17
- /** One spectrum as a reader produced it, before it is named and coloured. */
17
+ /**
18
+ * One spectrum as a reader produced it, before it is named and coloured.
19
+ *
20
+ * The readers of this package produce infrared spectra, which carry absorbance
21
+ * and transmittance; a host reading a Raman file builds one carrying its
22
+ * intensity instead.
23
+ */
18
24
  export interface LoadedIrSpectrum {
19
- /** The wavenumbers, ascending. */
25
+ /** The wavenumbers — or, for a Raman spectrum, the Raman shifts — ascending. */
20
26
  wavenumber: Float64Array;
21
- /** Absorbance at each. */
22
- absorbance: Float64Array;
23
- /** Percent transmittance at each. */
24
- transmittance: Float64Array;
27
+ /**
28
+ * Absorbance at each, for an infrared spectrum.
29
+ * @default undefined
30
+ */
31
+ absorbance?: Float64Array;
32
+ /**
33
+ * Percent transmittance at each, for an infrared spectrum.
34
+ * @default undefined
35
+ */
36
+ transmittance?: Float64Array;
37
+ /**
38
+ * Intensity at each, for a Raman spectrum.
39
+ * @default undefined
40
+ */
41
+ intensity?: Float64Array;
25
42
  /** What the file said about the acquisition, `null` when it said nothing. */
26
43
  meta: IrMeta | null;
27
44
  /** Where it came from. */
@@ -96,10 +113,9 @@ export function analysisSpectra(
96
113
  return spectra;
97
114
  }
98
115
 
99
- /** The three arrays of one spectrum, in ascending wavenumber. */
100
- type SortedTraces = Pick<
101
- LoadedIrSpectrum,
102
- 'wavenumber' | 'absorbance' | 'transmittance'
116
+ /** The three arrays of one infrared spectrum, in ascending wavenumber. */
117
+ type SortedTraces = Required<
118
+ Pick<LoadedIrSpectrum, 'wavenumber' | 'absorbance' | 'transmittance'>
103
119
  >;
104
120
 
105
121
  /**
@@ -18,6 +18,7 @@ import { labelStackBaselines } from '../../chart/core/labelStack.ts';
18
18
  import type { AssignedBand } from './assignBands.ts';
19
19
  import { bandLabel } from './assignBands.ts';
20
20
  import type { IrBand } from './irBand.ts';
21
+ import { bandHeight, bandValue } from './irBand.ts';
21
22
  import { formatWavenumber } from './irFormat.ts';
22
23
  import { bandsPointDown } from './irMode.ts';
23
24
  import type { IrMode } from './irSpectrum.ts';
@@ -99,12 +100,15 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
99
100
  limit = 12,
100
101
  } = options;
101
102
 
102
- const inside: AssignedBand[] = [];
103
+ const inside: NamedBand[] = [];
103
104
  for (const entry of assigned) {
105
+ // A band with no value on the axis being read has no tip to hang from.
106
+ const value = bandValue(entry.band, mode);
107
+ if (value === undefined) continue;
104
108
  const pixelX = chartPixel(xScale, entry.band.wavenumber);
105
109
  if (!Number.isFinite(pixelX)) continue;
106
110
  if (pixelX < plot.left || pixelX > plot.right) continue;
107
- inside.push(entry);
111
+ inside.push({ entry, value });
108
112
  }
109
113
 
110
114
  const named =
@@ -112,18 +116,20 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
112
116
  ? inside
113
117
  : inside
114
118
  .toSorted(
115
- (first, second) => second.band.absorbance - first.band.absorbance,
119
+ (first, second) =>
120
+ bandHeight(second.entry.band) - bandHeight(first.entry.band),
116
121
  )
117
122
  .slice(0, limit)
118
123
  .toSorted(
119
- (first, second) => first.band.wavenumber - second.band.wavenumber,
124
+ (first, second) =>
125
+ first.entry.band.wavenumber - second.entry.band.wavenumber,
120
126
  );
121
127
 
122
128
  const centres = new Float64Array(named.length);
123
129
  for (let index = 0; index < named.length; index++) {
124
130
  centres[index] = chartPixel(
125
131
  xScale,
126
- (named[index] as AssignedBand).band.wavenumber,
132
+ (named[index] as NamedBand).entry.band.wavenumber,
127
133
  );
128
134
  }
129
135
  const placed = layoutAnnotationBoxes(
@@ -136,12 +142,9 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
136
142
  const down = bandsPointDown(mode);
137
143
  const plans: BandLabelPlan[] = new Array<BandLabelPlan>(named.length);
138
144
  for (let index = 0; index < named.length; index++) {
139
- const entry = named[index] as AssignedBand;
145
+ const { entry, value } = named[index] as NamedBand;
140
146
  const lines = labelLines(entry, showAssignments);
141
- const tipY = chartPixel(
142
- yScale,
143
- mode === 'absorbance' ? entry.band.absorbance : entry.band.transmittance,
144
- );
147
+ const tipY = chartPixel(yScale, value);
145
148
  plans[index] = {
146
149
  band: entry.band,
147
150
  tipX: centres[index] as number,
@@ -161,6 +164,14 @@ export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
161
164
  return plans;
162
165
  }
163
166
 
167
+ /** A band inside the window, with its value on the axis being read. */
168
+ interface NamedBand {
169
+ /** The band and whatever the table said about it. */
170
+ entry: AssignedBand;
171
+ /** Where its tip is, on the value axis. */
172
+ value: number;
173
+ }
174
+
164
175
  /**
165
176
  * How wide a label is taken to be while it is being spaced out.
166
177
  *
@@ -10,7 +10,8 @@
10
10
  * transmittance and a band points the other way in each, and that a wavenumber
11
11
  * maps to a range of vibrations rather than to one. Nothing here knows what a
12
12
  * glycan is, and nothing should: an infrared spectrum answers for whatever was
13
- * put in the beam.
13
+ * put in the beam. A Raman spectrum is the one other technique held, and what
14
+ * differs for it is in `IR_TECHNIQUE_RULES`.
14
15
  */
15
16
 
16
17
  export type { LoadedIrSpectrum } from './analysisSpectra.ts';
@@ -26,16 +27,22 @@ export { downloadIrSpectra, downloadIrSpectrum } from './downloadSpectra.ts';
26
27
  export type { IrJcampReadOptions } from './fromJcamp.ts';
27
28
  export type { IrSpcReadOptions } from './fromSpc.ts';
28
29
  export type { IrBand, IrBandStrength } from './irBand.ts';
29
- export { sameIrBand } from './irBand.ts';
30
+ export { bandHeight, bandValue, sameIrBand } from './irBand.ts';
30
31
  export type {
31
32
  IrCommand,
32
33
  IrCommandHandlers,
33
34
  IrCommandId,
35
+ IrCommandTable,
34
36
  IrGesture,
35
37
  IrShortcut,
36
38
  RunIrCommand,
37
39
  } from './irCommands.ts';
38
- export { irCommandLabel, irCommands } from './irCommands.ts';
40
+ export {
41
+ irCommandEntryLabel,
42
+ irCommandLabel,
43
+ irCommands,
44
+ } from './irCommands.ts';
45
+ export { irCommandOffered, irCommandsFor } from './irTechniqueCommands.ts';
39
46
  export {
40
47
  LABEL_HEADROOM,
41
48
  X_DOMAIN_PADDING,
@@ -46,9 +53,11 @@ export {
46
53
  export type { IrEditorHandle, ZoomToBandOptions } from './irEditorApi.ts';
47
54
  export {
48
55
  ABSORBANCE_DECIMALS,
56
+ INTENSITY_DIGITS,
49
57
  TRANSMITTANCE_DECIMALS,
50
58
  formatIrValue,
51
59
  formatWavenumber,
60
+ formatWavenumberRange,
52
61
  shortModeLabel,
53
62
  } from './irFormat.ts';
54
63
  export {
@@ -61,8 +70,8 @@ export {
61
70
  yAxisTitle,
62
71
  zoomGestures,
63
72
  } from './irMode.ts';
64
- export type { CreateIrStateOptions, IrAction } from './irReducer.ts';
65
- export { createIrState, irReducer } from './irReducer.ts';
73
+ export type { IrAction } from './irReducer.ts';
74
+ export { irReducer } from './irReducer.ts';
66
75
  export type {
67
76
  IrDomain,
68
77
  IrFormat,
@@ -75,6 +84,7 @@ export type {
75
84
  } from './irSpectrum.ts';
76
85
  export { traceOf } from './irSpectrum.ts';
77
86
  export type {
87
+ CreateIrStateOptions,
78
88
  IrData,
79
89
  IrSettings,
80
90
  IrState,
@@ -89,9 +99,19 @@ export {
89
99
  DEFAULT_SIDE_PANEL,
90
100
  DEFAULT_SIDE_PANELS,
91
101
  MAXIMUM_LABEL_LIMIT,
102
+ createIrState,
92
103
  isIrWindow,
93
104
  mergeIrSettings,
94
105
  } from './irState.ts';
106
+ export type { IrTechnique, IrTechniqueRules } from './irTechnique.ts';
107
+ export {
108
+ IR_TECHNIQUES,
109
+ IR_TECHNIQUE_RULES,
110
+ defaultIrMode,
111
+ irModeFor,
112
+ irModeTechnique,
113
+ offersIrMode,
114
+ } from './irTechnique.ts';
95
115
  export type {
96
116
  LoadIrSpectraOptions,
97
117
  LoadIrSpectraResult,
@@ -1,21 +1,24 @@
1
1
  /**
2
2
  * One band picked out of a spectrum.
3
3
  *
4
- * A band is the infrared analogue of a mass spectrum's peak: the thing a chemist
5
- * points at, names, and reads a functional group off. It carries both value axes
6
- * for the same reason the spectrum does — the band a reader sees at 30 percent
7
- * transmittance and the one a table calls strongly absorbing are one band, and
8
- * making the caller convert to find out would be the conversion this package
9
- * does not do.
4
+ * A band is the vibrational analogue of a mass spectrum's peak: the thing a
5
+ * chemist points at, names, and reads a functional group off. An infrared band
6
+ * carries both value axes for the same reason its spectrum does — the band a
7
+ * reader sees at 30 percent transmittance and the one a table calls strongly
8
+ * absorbing are one band, and making the caller convert to find out would be the
9
+ * conversion this package does not do. A Raman band carries its intensity.
10
10
  */
11
11
 
12
+ import type { IrMode } from './irSpectrum.ts';
13
+
12
14
  /**
13
15
  * How strong a band is, in the letters a correlation table uses.
14
16
  *
15
- * `w` weak, `m` medium, `S` strong — `ir-spectrum` decides which from where the
16
- * band sits between the spectrum's own extremes, so the letters are relative to
17
- * the spectrum in hand rather than to an absolute absorbance. That is what a
18
- * printed table means by them too.
17
+ * `w` weak, `m` medium, `S` strong — decided from where the band sits between
18
+ * the spectrum's own extremes, so the letters are relative to the spectrum in
19
+ * hand rather than to an absolute value. That is what a printed table means by
20
+ * them too. `ir-spectrum` decides it for an infrared band from its
21
+ * transmittance, and the same rule is applied to a Raman band's intensity.
19
22
  */
20
23
  export type IrBandStrength = 'w' | 'm' | 'S';
21
24
 
@@ -25,10 +28,21 @@ export interface IrBand {
25
28
  spectrumId: string;
26
29
  /** Where it sits, in cm⁻¹. */
27
30
  wavenumber: number;
28
- /** Its absorbance, which is what it was picked as a maximum of. */
29
- absorbance: number;
30
- /** Its percent transmittance, the same band read the other way up. */
31
- transmittance: number;
31
+ /**
32
+ * Its absorbance, which an infrared band is picked as a maximum of.
33
+ * @default undefined
34
+ */
35
+ absorbance?: number;
36
+ /**
37
+ * Its percent transmittance, the same infrared band read the other way up.
38
+ * @default undefined
39
+ */
40
+ transmittance?: number;
41
+ /**
42
+ * Its intensity, which a Raman band is picked as a maximum of.
43
+ * @default undefined
44
+ */
45
+ intensity?: number;
32
46
  /** How strong it is, relative to the spectrum it came from. */
33
47
  strength: IrBandStrength;
34
48
  }
@@ -55,3 +69,27 @@ export function sameIrBand(
55
69
  current.wavenumber === next.wavenumber
56
70
  );
57
71
  }
72
+
73
+ /**
74
+ * A band's value on the axis being read.
75
+ * @param band - The band.
76
+ * @param mode - Which value axis is being read.
77
+ * @returns The value, or `undefined` when its spectrum carries no such axis.
78
+ */
79
+ export function bandValue(band: IrBand, mode: IrMode): number | undefined {
80
+ return band[mode];
81
+ }
82
+
83
+ /**
84
+ * How tall a band stands, which is what a cut to the strongest bands ranks by.
85
+ *
86
+ * The value it was picked as a maximum of: its absorbance for an infrared band,
87
+ * its intensity for a Raman one. Never its transmittance, in which a stronger
88
+ * band is a smaller number.
89
+ * @param band - The band.
90
+ * @returns The height, or negative infinity for a band carrying neither, so it
91
+ * ranks last.
92
+ */
93
+ export function bandHeight(band: IrBand): number {
94
+ return band.absorbance ?? band.intensity ?? Number.NEGATIVE_INFINITY;
95
+ }
@@ -10,6 +10,9 @@
10
10
  * this one, because a module that exports a component and a constant together
11
11
  * cannot be hot reloaded — `react-refresh/only-export-components` is the rule
12
12
  * that says so, and the split is the fix rather than the exception.
13
+ *
14
+ * This is the infrared table; `irTechniqueCommands.ts` derives the Raman one
15
+ * from it.
13
16
  */
14
17
 
15
18
  /** The key a command answers to. */
@@ -134,6 +137,9 @@ export const irCommands = {
134
137
  /** Identity of one of the commands the viewer offers. */
135
138
  export type IrCommandId = keyof typeof irCommands;
136
139
 
140
+ /** The commands a viewer offers, in the order they are reached for. */
141
+ export type IrCommandTable = Readonly<Partial<Record<IrCommandId, IrCommand>>>;
142
+
137
143
  /** What to do when each command is run, as the shell wires them. */
138
144
  export type IrCommandHandlers = Partial<
139
145
  Record<IrCommandId, (() => void) | undefined>
@@ -148,7 +154,15 @@ export type RunIrCommand = (id: IrCommandId) => void;
148
154
  * @returns The title, and the key in parentheses when it has one.
149
155
  */
150
156
  export function irCommandLabel(id: IrCommandId): string {
151
- const entry = irCommands[id] as IrCommand;
157
+ return irCommandEntryLabel(irCommands[id]);
158
+ }
159
+
160
+ /**
161
+ * A command's title, with its key in parentheses when it has one.
162
+ * @param entry - The command, as a table words it.
163
+ * @returns The label.
164
+ */
165
+ export function irCommandEntryLabel(entry: IrCommand): string {
152
166
  const key = entry.shortcut?.label?.[0] ?? entry.shortcut?.keys[0];
153
167
  return key === undefined ? entry.title : `${entry.title} (${key})`;
154
168
  }
@@ -5,9 +5,10 @@
5
5
  * something usable when it is handed nothing at all — a chart with no data is
6
6
  * still mounted, still measured, and still builds its scales.
7
7
  *
8
- * The x window is in ascending wavenumbers even though the axis is drawn from
9
- * 4000 down to 400: which way round it is read is the chart's business, and
10
- * every piece of arithmetic that moves a window expects its ends in order.
8
+ * The x window is in ascending wavenumbers even though the infrared axis is
9
+ * drawn from 4000 down to 400: which way round it is read is the chart's
10
+ * business, and every piece of arithmetic that moves a window expects its ends
11
+ * in order.
11
12
  */
12
13
 
13
14
  import { xMaxValue, xMinValue } from 'ml-spectra-processing';
@@ -57,9 +58,8 @@ export function fullDomain(
57
58
  const extent =
58
59
  traceExtent(spectra, mode, false) ?? traceExtent(spectra, mode, true);
59
60
  if (extent === null) {
60
- return mode === 'absorbance'
61
- ? { x: [400, 4000], y: [0, 1] }
62
- : { x: [400, 4000], y: [0, 100] };
61
+ // A percentage runs to 100; absorbance and intensity are open at the top.
62
+ return { x: [400, 4000], y: mode === 'transmittance' ? [0, 100] : [0, 1] };
63
63
  }
64
64
 
65
65
  const { xMinimum, xMaximum, yMinimum, yMaximum } = extent;
@@ -135,7 +135,9 @@ function traceExtent(
135
135
  for (const spectrum of spectra) {
136
136
  if (!spectrum.visible) continue;
137
137
  if (!includeExcluded && spectrum.excludeFromDomain) continue;
138
- const { x, y } = traceOf(spectrum, mode);
138
+ const trace = traceOf(spectrum, mode);
139
+ if (trace === undefined) continue;
140
+ const { x, y } = trace;
139
141
  if (x.length === 0 || y.length === 0) continue;
140
142
  // The wavenumber ends are read off the first and last sample rather than
141
143
  // searched for: the array is ascending by construction, so a scan would walk