react-cheminfo 0.69.0 → 0.71.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 (616) hide show
  1. package/README.md +70 -2
  2. package/lib/about/core/providers.d.ts +6 -0
  3. package/lib/about/core/providers.d.ts.map +1 -1
  4. package/lib/about/core/providers.js +7 -0
  5. package/lib/about/core/providers.js.map +1 -1
  6. package/lib/about/ui/AboutProvidedBy.js +34 -0
  7. package/lib/about/ui/AboutProvidedBy.js.map +1 -1
  8. package/lib/chart/ui/useChartPointer.d.ts +9 -1
  9. package/lib/chart/ui/useChartPointer.d.ts.map +1 -1
  10. package/lib/chart/ui/useChartPointer.js +11 -3
  11. package/lib/chart/ui/useChartPointer.js.map +1 -1
  12. package/lib/credits/core/credits.d.ts +41 -0
  13. package/lib/credits/core/credits.d.ts.map +1 -1
  14. package/lib/credits/core/credits.js +50 -0
  15. package/lib/credits/core/credits.js.map +1 -1
  16. package/lib/download/core/drawingMarkup.d.ts +8 -1
  17. package/lib/download/core/drawingMarkup.d.ts.map +1 -1
  18. package/lib/download/core/drawingMarkup.js +13 -1
  19. package/lib/download/core/drawingMarkup.js.map +1 -1
  20. package/lib/download/core/figurePng.d.ts +14 -0
  21. package/lib/download/core/figurePng.d.ts.map +1 -1
  22. package/lib/download/core/figurePng.js +21 -6
  23. package/lib/download/core/figurePng.js.map +1 -1
  24. package/lib/download/core/figureSvg.d.ts.map +1 -1
  25. package/lib/download/core/figureSvg.js +5 -3
  26. package/lib/download/core/figureSvg.js.map +1 -1
  27. package/lib/download/core/figureTarget.d.ts +13 -0
  28. package/lib/download/core/figureTarget.d.ts.map +1 -1
  29. package/lib/download/core/figureTarget.js +25 -5
  30. package/lib/download/core/figureTarget.js.map +1 -1
  31. package/lib/download/core/svgBounds.d.ts +15 -0
  32. package/lib/download/core/svgBounds.d.ts.map +1 -1
  33. package/lib/download/core/svgBounds.js +20 -0
  34. package/lib/download/core/svgBounds.js.map +1 -1
  35. package/lib/download/core/svgToPng.d.ts.map +1 -1
  36. package/lib/download/core/svgToPng.js +4 -2
  37. package/lib/download/core/svgToPng.js.map +1 -1
  38. package/lib/format/core/relativeTime.d.ts +8 -3
  39. package/lib/format/core/relativeTime.d.ts.map +1 -1
  40. package/lib/format/core/relativeTime.js +19 -7
  41. package/lib/format/core/relativeTime.js.map +1 -1
  42. package/lib/host/core/connectHost.d.ts +25 -34
  43. package/lib/host/core/connectHost.d.ts.map +1 -1
  44. package/lib/host/core/connectHost.js +43 -89
  45. package/lib/host/core/connectHost.js.map +1 -1
  46. package/lib/host/core/hostOutputs.d.ts +58 -0
  47. package/lib/host/core/hostOutputs.d.ts.map +1 -0
  48. package/lib/host/core/hostOutputs.js +151 -0
  49. package/lib/host/core/hostOutputs.js.map +1 -0
  50. package/lib/host/core/index.d.ts +9 -3
  51. package/lib/host/core/index.d.ts.map +1 -1
  52. package/lib/host/core/index.js +4 -1
  53. package/lib/host/core/index.js.map +1 -1
  54. package/lib/host/core/irKinds.d.ts +124 -0
  55. package/lib/host/core/irKinds.d.ts.map +1 -0
  56. package/lib/host/core/irKinds.js +46 -0
  57. package/lib/host/core/irKinds.js.map +1 -0
  58. package/lib/host/core/kinds.d.ts +13 -5
  59. package/lib/host/core/kinds.d.ts.map +1 -1
  60. package/lib/host/core/kinds.js +11 -5
  61. package/lib/host/core/kinds.js.map +1 -1
  62. package/lib/host/core/protocol.d.ts +50 -7
  63. package/lib/host/core/protocol.d.ts.map +1 -1
  64. package/lib/host/core/protocol.js +10 -6
  65. package/lib/host/core/protocol.js.map +1 -1
  66. package/lib/host/core/selectInputs.d.ts +37 -0
  67. package/lib/host/core/selectInputs.d.ts.map +1 -0
  68. package/lib/host/core/selectInputs.js +110 -0
  69. package/lib/host/core/selectInputs.js.map +1 -0
  70. package/lib/host/testing/sciPeaks.d.ts +31 -0
  71. package/lib/host/testing/sciPeaks.d.ts.map +1 -1
  72. package/lib/host/testing/sciPeaks.js +73 -0
  73. package/lib/host/testing/sciPeaks.js.map +1 -1
  74. package/lib/host/testing/standInHost.d.ts +9 -1
  75. package/lib/host/testing/standInHost.d.ts.map +1 -1
  76. package/lib/host/testing/standInHost.js +19 -1
  77. package/lib/host/testing/standInHost.js.map +1 -1
  78. package/lib/host/ui/useHostConnection.d.ts +13 -5
  79. package/lib/host/ui/useHostConnection.d.ts.map +1 -1
  80. package/lib/host/ui/useHostConnection.js +4 -3
  81. package/lib/host/ui/useHostConnection.js.map +1 -1
  82. package/lib/host-testing.d.ts +2 -2
  83. package/lib/host-testing.d.ts.map +1 -1
  84. package/lib/host-testing.js +2 -2
  85. package/lib/host-testing.js.map +1 -1
  86. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  87. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  88. package/lib/ir/core/handPicking.d.ts +58 -0
  89. package/lib/ir/core/handPicking.d.ts.map +1 -0
  90. package/lib/ir/core/handPicking.js +130 -0
  91. package/lib/ir/core/handPicking.js.map +1 -0
  92. package/lib/ir/core/index.d.ts +3 -0
  93. package/lib/ir/core/index.d.ts.map +1 -1
  94. package/lib/ir/core/index.js +3 -0
  95. package/lib/ir/core/index.js.map +1 -1
  96. package/lib/ir/core/irBandState.d.ts +57 -0
  97. package/lib/ir/core/irBandState.d.ts.map +1 -0
  98. package/lib/ir/core/irBandState.js +119 -0
  99. package/lib/ir/core/irBandState.js.map +1 -0
  100. package/lib/ir/core/irCommands.d.ts +11 -0
  101. package/lib/ir/core/irCommands.d.ts.map +1 -1
  102. package/lib/ir/core/irCommands.js +6 -0
  103. package/lib/ir/core/irCommands.js.map +1 -1
  104. package/lib/ir/core/irPeaks.d.ts +28 -0
  105. package/lib/ir/core/irPeaks.d.ts.map +1 -0
  106. package/lib/ir/core/irPeaks.js +66 -0
  107. package/lib/ir/core/irPeaks.js.map +1 -0
  108. package/lib/ir/core/irReducer.d.ts +8 -0
  109. package/lib/ir/core/irReducer.d.ts.map +1 -1
  110. package/lib/ir/core/irReducer.js +15 -32
  111. package/lib/ir/core/irReducer.js.map +1 -1
  112. package/lib/ir/core/irSpectrum.d.ts +15 -0
  113. package/lib/ir/core/irSpectrum.d.ts.map +1 -1
  114. package/lib/ir/core/irSpectrum.js.map +1 -1
  115. package/lib/ir/core/irState.d.ts +9 -6
  116. package/lib/ir/core/irState.d.ts.map +1 -1
  117. package/lib/ir/core/irState.js +10 -6
  118. package/lib/ir/core/irState.js.map +1 -1
  119. package/lib/ir/core/pickBands.d.ts +14 -0
  120. package/lib/ir/core/pickBands.d.ts.map +1 -1
  121. package/lib/ir/core/pickBands.js +39 -33
  122. package/lib/ir/core/pickBands.js.map +1 -1
  123. package/lib/ir/core/ramanBands.d.ts +9 -1
  124. package/lib/ir/core/ramanBands.d.ts.map +1 -1
  125. package/lib/ir/core/ramanBands.js +2 -2
  126. package/lib/ir/core/ramanBands.js.map +1 -1
  127. package/lib/ir/core/spectrumBands.d.ts +46 -0
  128. package/lib/ir/core/spectrumBands.d.ts.map +1 -0
  129. package/lib/ir/core/spectrumBands.js +98 -0
  130. package/lib/ir/core/spectrumBands.js.map +1 -0
  131. package/lib/ir/ui/BandRow.d.ts +5 -0
  132. package/lib/ir/ui/BandRow.d.ts.map +1 -1
  133. package/lib/ir/ui/BandRow.js +4 -3
  134. package/lib/ir/ui/BandRow.js.map +1 -1
  135. package/lib/ir/ui/BandsPanel.d.ts +5 -0
  136. package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
  137. package/lib/ir/ui/BandsPanel.js +36 -16
  138. package/lib/ir/ui/BandsPanel.js.map +1 -1
  139. package/lib/ir/ui/BandsToolbar.d.ts +9 -0
  140. package/lib/ir/ui/BandsToolbar.d.ts.map +1 -0
  141. package/lib/ir/ui/BandsToolbar.js +61 -0
  142. package/lib/ir/ui/BandsToolbar.js.map +1 -0
  143. package/lib/ir/ui/IrCanvas.d.ts +2 -1
  144. package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
  145. package/lib/ir/ui/IrCanvas.js +19 -5
  146. package/lib/ir/ui/IrCanvas.js.map +1 -1
  147. package/lib/ir/ui/IrChart.d.ts.map +1 -1
  148. package/lib/ir/ui/IrChart.js +8 -1
  149. package/lib/ir/ui/IrChart.js.map +1 -1
  150. package/lib/ir/ui/IrDocumentationDialog.js +1 -1
  151. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
  152. package/lib/ir/ui/IrEditor.d.ts +4 -2
  153. package/lib/ir/ui/IrEditor.d.ts.map +1 -1
  154. package/lib/ir/ui/IrEditor.js.map +1 -1
  155. package/lib/ir/ui/IrShell.d.ts.map +1 -1
  156. package/lib/ir/ui/IrShell.js +6 -0
  157. package/lib/ir/ui/IrShell.js.map +1 -1
  158. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
  159. package/lib/ir/ui/IrStatusBar.js +1 -1
  160. package/lib/ir/ui/IrStatusBar.js.map +1 -1
  161. package/lib/ir/ui/IrToolbar.d.ts +4 -3
  162. package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
  163. package/lib/ir/ui/IrToolbar.js +5 -4
  164. package/lib/ir/ui/IrToolbar.js.map +1 -1
  165. package/lib/ir/ui/VibrationalEditor.d.ts +2 -1
  166. package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -1
  167. package/lib/ir/ui/VibrationalEditor.js.map +1 -1
  168. package/lib/ir/ui/irActions.d.ts +5 -0
  169. package/lib/ir/ui/irActions.d.ts.map +1 -1
  170. package/lib/ir/ui/irActions.js +6 -0
  171. package/lib/ir/ui/irActions.js.map +1 -1
  172. package/lib/ir/ui/irChartProps.d.ts +4 -1
  173. package/lib/ir/ui/irChartProps.d.ts.map +1 -1
  174. package/lib/ir/ui/useIrEditor.d.ts +5 -11
  175. package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
  176. package/lib/ir/ui/useIrEditor.js +17 -18
  177. package/lib/ir/ui/useIrEditor.js.map +1 -1
  178. package/lib/locales/de.json +63 -0
  179. package/lib/locales/en.json +63 -0
  180. package/lib/locales/es.json +63 -0
  181. package/lib/locales/fr.json +63 -0
  182. package/lib/locales/it.json +63 -0
  183. package/lib/mass/core/analyseSpectrum.d.ts +85 -0
  184. package/lib/mass/core/analyseSpectrum.d.ts.map +1 -0
  185. package/lib/mass/core/analyseSpectrum.js +101 -0
  186. package/lib/mass/core/analyseSpectrum.js.map +1 -0
  187. package/lib/mass/core/ascendingTrace.d.ts +24 -0
  188. package/lib/mass/core/ascendingTrace.d.ts.map +1 -0
  189. package/lib/mass/core/ascendingTrace.js +57 -0
  190. package/lib/mass/core/ascendingTrace.js.map +1 -0
  191. package/lib/mass/core/centroidPeaks.d.ts +77 -0
  192. package/lib/mass/core/centroidPeaks.d.ts.map +1 -0
  193. package/lib/mass/core/centroidPeaks.js +62 -0
  194. package/lib/mass/core/centroidPeaks.js.map +1 -0
  195. package/lib/mass/core/detectMassFormat.d.ts +24 -0
  196. package/lib/mass/core/detectMassFormat.d.ts.map +1 -0
  197. package/lib/mass/core/detectMassFormat.js +105 -0
  198. package/lib/mass/core/detectMassFormat.js.map +1 -0
  199. package/lib/mass/core/downloadSpectra.d.ts +24 -0
  200. package/lib/mass/core/downloadSpectra.d.ts.map +1 -0
  201. package/lib/mass/core/downloadSpectra.js +35 -0
  202. package/lib/mass/core/downloadSpectra.js.map +1 -0
  203. package/lib/mass/core/fromJcamp.d.ts +46 -0
  204. package/lib/mass/core/fromJcamp.d.ts.map +1 -0
  205. package/lib/mass/core/fromJcamp.js +123 -0
  206. package/lib/mass/core/fromJcamp.js.map +1 -0
  207. package/lib/mass/core/fromText.d.ts +30 -0
  208. package/lib/mass/core/fromText.d.ts.map +1 -0
  209. package/lib/mass/core/fromText.js +39 -0
  210. package/lib/mass/core/fromText.js.map +1 -0
  211. package/lib/mass/core/index.d.ts +70 -0
  212. package/lib/mass/core/index.d.ts.map +1 -0
  213. package/lib/mass/core/index.js +42 -0
  214. package/lib/mass/core/index.js.map +1 -0
  215. package/lib/mass/core/jcampTechnique.d.ts +38 -0
  216. package/lib/mass/core/jcampTechnique.d.ts.map +1 -0
  217. package/lib/mass/core/jcampTechnique.js +70 -0
  218. package/lib/mass/core/jcampTechnique.js.map +1 -0
  219. package/lib/mass/core/labelStackBox.d.ts +49 -0
  220. package/lib/mass/core/labelStackBox.d.ts.map +1 -0
  221. package/lib/mass/core/labelStackBox.js +44 -0
  222. package/lib/mass/core/labelStackBox.js.map +1 -0
  223. package/lib/mass/core/labelledPeaks.d.ts +79 -0
  224. package/lib/mass/core/labelledPeaks.d.ts.map +1 -0
  225. package/lib/mass/core/labelledPeaks.js +74 -0
  226. package/lib/mass/core/labelledPeaks.js.map +1 -0
  227. package/lib/mass/core/loadMassSpectra.d.ts +57 -0
  228. package/lib/mass/core/loadMassSpectra.d.ts.map +1 -0
  229. package/lib/mass/core/loadMassSpectra.js +45 -0
  230. package/lib/mass/core/loadMassSpectra.js.map +1 -0
  231. package/lib/mass/core/loadedMassSpectrum.d.ts +42 -0
  232. package/lib/mass/core/loadedMassSpectrum.d.ts.map +1 -0
  233. package/lib/mass/core/loadedMassSpectrum.js +15 -0
  234. package/lib/mass/core/loadedMassSpectrum.js.map +1 -0
  235. package/lib/mass/core/massCommands.d.ts +170 -0
  236. package/lib/mass/core/massCommands.d.ts.map +1 -0
  237. package/lib/mass/core/massCommands.js +95 -0
  238. package/lib/mass/core/massCommands.js.map +1 -0
  239. package/lib/mass/core/massDomain.d.ts +121 -0
  240. package/lib/mass/core/massDomain.d.ts.map +1 -0
  241. package/lib/mass/core/massDomain.js +179 -0
  242. package/lib/mass/core/massDomain.js.map +1 -0
  243. package/lib/mass/core/massEditorApi.d.ts +65 -0
  244. package/lib/mass/core/massEditorApi.d.ts.map +1 -0
  245. package/lib/mass/core/massEditorApi.js +10 -0
  246. package/lib/mass/core/massEditorApi.js.map +1 -0
  247. package/lib/mass/core/massFormat.d.ts +78 -0
  248. package/lib/mass/core/massFormat.d.ts.map +1 -0
  249. package/lib/mass/core/massFormat.js +168 -0
  250. package/lib/mass/core/massFormat.js.map +1 -0
  251. package/lib/mass/core/massMeta.d.ts +85 -0
  252. package/lib/mass/core/massMeta.d.ts.map +1 -0
  253. package/lib/mass/core/massMeta.js +182 -0
  254. package/lib/mass/core/massMeta.js.map +1 -0
  255. package/lib/mass/core/massReducer.d.ts +82 -0
  256. package/lib/mass/core/massReducer.d.ts.map +1 -0
  257. package/lib/mass/core/massReducer.js +163 -0
  258. package/lib/mass/core/massReducer.js.map +1 -0
  259. package/lib/mass/core/massResolution.d.ts +92 -0
  260. package/lib/mass/core/massResolution.d.ts.map +1 -0
  261. package/lib/mass/core/massResolution.js +126 -0
  262. package/lib/mass/core/massResolution.js.map +1 -0
  263. package/lib/mass/core/massSidePanels.d.ts +28 -0
  264. package/lib/mass/core/massSidePanels.d.ts.map +1 -0
  265. package/lib/mass/core/massSidePanels.js +12 -0
  266. package/lib/mass/core/massSidePanels.js.map +1 -0
  267. package/lib/mass/core/massSpectrum.d.ts +206 -0
  268. package/lib/mass/core/massSpectrum.d.ts.map +1 -0
  269. package/lib/mass/core/massSpectrum.js +41 -0
  270. package/lib/mass/core/massSpectrum.js.map +1 -0
  271. package/lib/mass/core/massState.d.ts +145 -0
  272. package/lib/mass/core/massState.d.ts.map +1 -0
  273. package/lib/mass/core/massState.js +102 -0
  274. package/lib/mass/core/massState.js.map +1 -0
  275. package/lib/mass/core/massStateEdits.d.ts +51 -0
  276. package/lib/mass/core/massStateEdits.d.ts.map +1 -0
  277. package/lib/mass/core/massStateEdits.js +90 -0
  278. package/lib/mass/core/massStateEdits.js.map +1 -0
  279. package/lib/mass/core/massSummary.d.ts +77 -0
  280. package/lib/mass/core/massSummary.d.ts.map +1 -0
  281. package/lib/mass/core/massSummary.js +174 -0
  282. package/lib/mass/core/massSummary.js.map +1 -0
  283. package/lib/mass/core/mzDecimalsSetting.d.ts +36 -0
  284. package/lib/mass/core/mzDecimalsSetting.d.ts.map +1 -0
  285. package/lib/mass/core/mzDecimalsSetting.js +42 -0
  286. package/lib/mass/core/mzDecimalsSetting.js.map +1 -0
  287. package/lib/mass/core/nearestPeak.d.ts +75 -0
  288. package/lib/mass/core/nearestPeak.d.ts.map +1 -0
  289. package/lib/mass/core/nearestPeak.js +99 -0
  290. package/lib/mass/core/nearestPeak.js.map +1 -0
  291. package/lib/mass/core/peakLabelLines.d.ts +77 -0
  292. package/lib/mass/core/peakLabelLines.d.ts.map +1 -0
  293. package/lib/mass/core/peakLabelLines.js +54 -0
  294. package/lib/mass/core/peakLabelLines.js.map +1 -0
  295. package/lib/mass/core/peakLabelPlan.d.ts +109 -0
  296. package/lib/mass/core/peakLabelPlan.d.ts.map +1 -0
  297. package/lib/mass/core/peakLabelPlan.js +143 -0
  298. package/lib/mass/core/peakLabelPlan.js.map +1 -0
  299. package/lib/mass/core/peakTable.d.ts +54 -0
  300. package/lib/mass/core/peakTable.d.ts.map +1 -0
  301. package/lib/mass/core/peakTable.js +53 -0
  302. package/lib/mass/core/peakTable.js.map +1 -0
  303. package/lib/mass/core/resolutionOf.d.ts +60 -0
  304. package/lib/mass/core/resolutionOf.d.ts.map +1 -0
  305. package/lib/mass/core/resolutionOf.js +84 -0
  306. package/lib/mass/core/resolutionOf.js.map +1 -0
  307. package/lib/mass/core/scanFilter.d.ts +25 -0
  308. package/lib/mass/core/scanFilter.d.ts.map +1 -0
  309. package/lib/mass/core/scanFilter.js +107 -0
  310. package/lib/mass/core/scanFilter.js.map +1 -0
  311. package/lib/mass/core/spectrumJcamp.d.ts +47 -0
  312. package/lib/mass/core/spectrumJcamp.d.ts.map +1 -0
  313. package/lib/mass/core/spectrumJcamp.js +167 -0
  314. package/lib/mass/core/spectrumJcamp.js.map +1 -0
  315. package/lib/mass/core/toMassSpectrum.d.ts +67 -0
  316. package/lib/mass/core/toMassSpectrum.d.ts.map +1 -0
  317. package/lib/mass/core/toMassSpectrum.js +78 -0
  318. package/lib/mass/core/toMassSpectrum.js.map +1 -0
  319. package/lib/mass/core/traceIcon.d.ts +82 -0
  320. package/lib/mass/core/traceIcon.d.ts.map +1 -0
  321. package/lib/mass/core/traceIcon.js +66 -0
  322. package/lib/mass/core/traceIcon.js.map +1 -0
  323. package/lib/mass/core/writtenResolution.d.ts +40 -0
  324. package/lib/mass/core/writtenResolution.d.ts.map +1 -0
  325. package/lib/mass/core/writtenResolution.js +77 -0
  326. package/lib/mass/core/writtenResolution.js.map +1 -0
  327. package/lib/mass/ui/MassAboutDialog.d.ts +16 -0
  328. package/lib/mass/ui/MassAboutDialog.d.ts.map +1 -0
  329. package/lib/mass/ui/MassAboutDialog.js +44 -0
  330. package/lib/mass/ui/MassAboutDialog.js.map +1 -0
  331. package/lib/mass/ui/MassCanvas.d.ts +46 -0
  332. package/lib/mass/ui/MassCanvas.d.ts.map +1 -0
  333. package/lib/mass/ui/MassCanvas.js +84 -0
  334. package/lib/mass/ui/MassCanvas.js.map +1 -0
  335. package/lib/mass/ui/MassChart.d.ts +21 -0
  336. package/lib/mass/ui/MassChart.d.ts.map +1 -0
  337. package/lib/mass/ui/MassChart.js +139 -0
  338. package/lib/mass/ui/MassChart.js.map +1 -0
  339. package/lib/mass/ui/MassCommandProvider.d.ts +15 -0
  340. package/lib/mass/ui/MassCommandProvider.d.ts.map +1 -0
  341. package/lib/mass/ui/MassCommandProvider.js +14 -0
  342. package/lib/mass/ui/MassCommandProvider.js.map +1 -0
  343. package/lib/mass/ui/MassCommandTooltip.d.ts +16 -0
  344. package/lib/mass/ui/MassCommandTooltip.d.ts.map +1 -0
  345. package/lib/mass/ui/MassCommandTooltip.js +22 -0
  346. package/lib/mass/ui/MassCommandTooltip.js.map +1 -0
  347. package/lib/mass/ui/MassDocumentationDialog.d.ts +18 -0
  348. package/lib/mass/ui/MassDocumentationDialog.d.ts.map +1 -0
  349. package/lib/mass/ui/MassDocumentationDialog.js +70 -0
  350. package/lib/mass/ui/MassDocumentationDialog.js.map +1 -0
  351. package/lib/mass/ui/MassEditor.d.ts +78 -0
  352. package/lib/mass/ui/MassEditor.d.ts.map +1 -0
  353. package/lib/mass/ui/MassEditor.js +42 -0
  354. package/lib/mass/ui/MassEditor.js.map +1 -0
  355. package/lib/mass/ui/MassHeader.d.ts +12 -0
  356. package/lib/mass/ui/MassHeader.d.ts.map +1 -0
  357. package/lib/mass/ui/MassHeader.js +20 -0
  358. package/lib/mass/ui/MassHeader.js.map +1 -0
  359. package/lib/mass/ui/MassLogo.d.ts +21 -0
  360. package/lib/mass/ui/MassLogo.d.ts.map +1 -0
  361. package/lib/mass/ui/MassLogo.js +36 -0
  362. package/lib/mass/ui/MassLogo.js.map +1 -0
  363. package/lib/mass/ui/MassPointerTracker.d.ts +44 -0
  364. package/lib/mass/ui/MassPointerTracker.d.ts.map +1 -0
  365. package/lib/mass/ui/MassPointerTracker.js +29 -0
  366. package/lib/mass/ui/MassPointerTracker.js.map +1 -0
  367. package/lib/mass/ui/MassShell.d.ts +29 -0
  368. package/lib/mass/ui/MassShell.d.ts.map +1 -0
  369. package/lib/mass/ui/MassShell.js +133 -0
  370. package/lib/mass/ui/MassShell.js.map +1 -0
  371. package/lib/mass/ui/MassSidePanel.d.ts +32 -0
  372. package/lib/mass/ui/MassSidePanel.d.ts.map +1 -0
  373. package/lib/mass/ui/MassSidePanel.js +44 -0
  374. package/lib/mass/ui/MassSidePanel.js.map +1 -0
  375. package/lib/mass/ui/MassStateProvider.d.ts +19 -0
  376. package/lib/mass/ui/MassStateProvider.d.ts.map +1 -0
  377. package/lib/mass/ui/MassStateProvider.js +16 -0
  378. package/lib/mass/ui/MassStateProvider.js.map +1 -0
  379. package/lib/mass/ui/MassStatusBar.d.ts +15 -0
  380. package/lib/mass/ui/MassStatusBar.d.ts.map +1 -0
  381. package/lib/mass/ui/MassStatusBar.js +50 -0
  382. package/lib/mass/ui/MassStatusBar.js.map +1 -0
  383. package/lib/mass/ui/MassToolbar.d.ts +24 -0
  384. package/lib/mass/ui/MassToolbar.d.ts.map +1 -0
  385. package/lib/mass/ui/MassToolbar.js +36 -0
  386. package/lib/mass/ui/MassToolbar.js.map +1 -0
  387. package/lib/mass/ui/MetadataPanel.d.ts +35 -0
  388. package/lib/mass/ui/MetadataPanel.d.ts.map +1 -0
  389. package/lib/mass/ui/MetadataPanel.js +100 -0
  390. package/lib/mass/ui/MetadataPanel.js.map +1 -0
  391. package/lib/mass/ui/MzDecimalsMenu.d.ts +28 -0
  392. package/lib/mass/ui/MzDecimalsMenu.d.ts.map +1 -0
  393. package/lib/mass/ui/MzDecimalsMenu.js +40 -0
  394. package/lib/mass/ui/MzDecimalsMenu.js.map +1 -0
  395. package/lib/mass/ui/PeakLabels.d.ts +93 -0
  396. package/lib/mass/ui/PeakLabels.d.ts.map +1 -0
  397. package/lib/mass/ui/PeakLabels.js +91 -0
  398. package/lib/mass/ui/PeakLabels.js.map +1 -0
  399. package/lib/mass/ui/PeakTable.d.ts +34 -0
  400. package/lib/mass/ui/PeakTable.d.ts.map +1 -0
  401. package/lib/mass/ui/PeakTable.js +49 -0
  402. package/lib/mass/ui/PeakTable.js.map +1 -0
  403. package/lib/mass/ui/PeaksPanel.d.ts +31 -0
  404. package/lib/mass/ui/PeaksPanel.d.ts.map +1 -0
  405. package/lib/mass/ui/PeaksPanel.js +53 -0
  406. package/lib/mass/ui/PeaksPanel.js.map +1 -0
  407. package/lib/mass/ui/SpectraPanel.d.ts +17 -0
  408. package/lib/mass/ui/SpectraPanel.d.ts.map +1 -0
  409. package/lib/mass/ui/SpectraPanel.js +76 -0
  410. package/lib/mass/ui/SpectraPanel.js.map +1 -0
  411. package/lib/mass/ui/SpectrumRow.d.ts +26 -0
  412. package/lib/mass/ui/SpectrumRow.d.ts.map +1 -0
  413. package/lib/mass/ui/SpectrumRow.js +141 -0
  414. package/lib/mass/ui/SpectrumRow.js.map +1 -0
  415. package/lib/mass/ui/SpectrumTrace.d.ts +46 -0
  416. package/lib/mass/ui/SpectrumTrace.d.ts.map +1 -0
  417. package/lib/mass/ui/SpectrumTrace.js +68 -0
  418. package/lib/mass/ui/SpectrumTrace.js.map +1 -0
  419. package/lib/mass/ui/index.d.ts +69 -0
  420. package/lib/mass/ui/index.d.ts.map +1 -0
  421. package/lib/mass/ui/index.js +42 -0
  422. package/lib/mass/ui/index.js.map +1 -0
  423. package/lib/mass/ui/massActions.d.ts +52 -0
  424. package/lib/mass/ui/massActions.d.ts.map +1 -0
  425. package/lib/mass/ui/massActions.js +62 -0
  426. package/lib/mass/ui/massActions.js.map +1 -0
  427. package/lib/mass/ui/massChartProps.d.ts +128 -0
  428. package/lib/mass/ui/massChartProps.d.ts.map +1 -0
  429. package/lib/mass/ui/massChartProps.js +14 -0
  430. package/lib/mass/ui/massChartProps.js.map +1 -0
  431. package/lib/mass/ui/massCommandContext.d.ts +36 -0
  432. package/lib/mass/ui/massCommandContext.d.ts.map +1 -0
  433. package/lib/mass/ui/massCommandContext.js +45 -0
  434. package/lib/mass/ui/massCommandContext.js.map +1 -0
  435. package/lib/mass/ui/massHostPanels.d.ts +48 -0
  436. package/lib/mass/ui/massHostPanels.d.ts.map +1 -0
  437. package/lib/mass/ui/massHostPanels.js +41 -0
  438. package/lib/mass/ui/massHostPanels.js.map +1 -0
  439. package/lib/mass/ui/massStateContext.d.ts +26 -0
  440. package/lib/mass/ui/massStateContext.d.ts.map +1 -0
  441. package/lib/mass/ui/massStateContext.js +37 -0
  442. package/lib/mass/ui/massStateContext.js.map +1 -0
  443. package/lib/mass/ui/useIntensityZoom.d.ts +20 -0
  444. package/lib/mass/ui/useIntensityZoom.d.ts.map +1 -0
  445. package/lib/mass/ui/useIntensityZoom.js +42 -0
  446. package/lib/mass/ui/useIntensityZoom.js.map +1 -0
  447. package/lib/mass/ui/useMassEditor.d.ts +52 -0
  448. package/lib/mass/ui/useMassEditor.d.ts.map +1 -0
  449. package/lib/mass/ui/useMassEditor.js +93 -0
  450. package/lib/mass/ui/useMassEditor.js.map +1 -0
  451. package/lib/mass/ui/useMassFiles.d.ts +22 -0
  452. package/lib/mass/ui/useMassFiles.d.ts.map +1 -0
  453. package/lib/mass/ui/useMassFiles.js +71 -0
  454. package/lib/mass/ui/useMassFiles.js.map +1 -0
  455. package/lib/mass/ui/useMassHandle.d.ts +15 -0
  456. package/lib/mass/ui/useMassHandle.d.ts.map +1 -0
  457. package/lib/mass/ui/useMassHandle.js +35 -0
  458. package/lib/mass/ui/useMassHandle.js.map +1 -0
  459. package/lib/mass/ui/useMassPointer.d.ts +70 -0
  460. package/lib/mass/ui/useMassPointer.d.ts.map +1 -0
  461. package/lib/mass/ui/useMassPointer.js +57 -0
  462. package/lib/mass/ui/useMassPointer.js.map +1 -0
  463. package/lib/mass/ui/useMassShortcuts.d.ts +21 -0
  464. package/lib/mass/ui/useMassShortcuts.d.ts.map +1 -0
  465. package/lib/mass/ui/useMassShortcuts.js +66 -0
  466. package/lib/mass/ui/useMassShortcuts.js.map +1 -0
  467. package/lib/mass/ui/useMassSide.d.ts +27 -0
  468. package/lib/mass/ui/useMassSide.d.ts.map +1 -0
  469. package/lib/mass/ui/useMassSide.js +45 -0
  470. package/lib/mass/ui/useMassSide.js.map +1 -0
  471. package/lib/mass/ui/useMassZoom.d.ts +92 -0
  472. package/lib/mass/ui/useMassZoom.d.ts.map +1 -0
  473. package/lib/mass/ui/useMassZoom.js +65 -0
  474. package/lib/mass/ui/useMassZoom.js.map +1 -0
  475. package/lib/mass.d.ts +16 -0
  476. package/lib/mass.d.ts.map +1 -0
  477. package/lib/mass.js +16 -0
  478. package/lib/mass.js.map +1 -0
  479. package/lib/panel/ui/PanelRail.d.ts.map +1 -1
  480. package/lib/panel/ui/PanelRail.js +6 -1
  481. package/lib/panel/ui/PanelRail.js.map +1 -1
  482. package/lib/slides/ui/slideSanitizeSchema.d.ts +3 -2
  483. package/lib/slides/ui/slideSanitizeSchema.d.ts.map +1 -1
  484. package/lib/slides/ui/slideSanitizeSchema.js +82 -2
  485. package/lib/slides/ui/slideSanitizeSchema.js.map +1 -1
  486. package/package.json +6 -1
  487. package/src/about/core/providers.ts +7 -0
  488. package/src/about/ui/AboutProvidedBy.tsx +49 -0
  489. package/src/chart/ui/useChartPointer.ts +18 -4
  490. package/src/credits/core/credits.ts +53 -0
  491. package/src/download/core/drawingMarkup.ts +18 -1
  492. package/src/download/core/figurePng.ts +21 -8
  493. package/src/download/core/figureSvg.ts +5 -2
  494. package/src/download/core/figureTarget.ts +28 -3
  495. package/src/download/core/svgBounds.ts +21 -0
  496. package/src/download/core/svgToPng.ts +3 -4
  497. package/src/format/core/relativeTime.ts +29 -7
  498. package/src/host/core/connectHost.ts +77 -120
  499. package/src/host/core/hostOutputs.ts +197 -0
  500. package/src/host/core/index.ts +13 -7
  501. package/src/host/core/irKinds.ts +92 -0
  502. package/src/host/core/kinds.ts +16 -6
  503. package/src/host/core/protocol.ts +50 -8
  504. package/src/host/core/selectInputs.ts +145 -0
  505. package/src/host/testing/sciPeaks.ts +140 -0
  506. package/src/host/testing/standInHost.ts +30 -5
  507. package/src/host/ui/useHostConnection.ts +17 -8
  508. package/src/host-testing.ts +4 -0
  509. package/src/ir/core/handPicking.ts +154 -0
  510. package/src/ir/core/index.ts +14 -0
  511. package/src/ir/core/irBandState.ts +155 -0
  512. package/src/ir/core/irCommands.ts +7 -0
  513. package/src/ir/core/irPeaks.ts +79 -0
  514. package/src/ir/core/irReducer.ts +27 -34
  515. package/src/ir/core/irSpectrum.ts +16 -0
  516. package/src/ir/core/irState.ts +15 -8
  517. package/src/ir/core/pickBands.ts +46 -39
  518. package/src/ir/core/ramanBands.ts +2 -2
  519. package/src/ir/core/spectrumBands.ts +113 -0
  520. package/src/ir/ui/BandRow.tsx +20 -2
  521. package/src/ir/ui/BandsPanel.tsx +46 -88
  522. package/src/ir/ui/BandsToolbar.tsx +152 -0
  523. package/src/ir/ui/IrCanvas.tsx +22 -11
  524. package/src/ir/ui/IrChart.tsx +10 -1
  525. package/src/ir/ui/IrDocumentationDialog.tsx +7 -0
  526. package/src/ir/ui/IrEditor.tsx +4 -2
  527. package/src/ir/ui/IrShell.tsx +5 -0
  528. package/src/ir/ui/IrStatusBar.tsx +4 -1
  529. package/src/ir/ui/IrToolbar.tsx +14 -5
  530. package/src/ir/ui/VibrationalEditor.tsx +2 -1
  531. package/src/ir/ui/irActions.ts +11 -0
  532. package/src/ir/ui/irChartProps.ts +4 -1
  533. package/src/ir/ui/useIrEditor.ts +21 -21
  534. package/src/locales/de.json +63 -0
  535. package/src/locales/en.json +63 -0
  536. package/src/locales/es.json +63 -0
  537. package/src/locales/fr.json +63 -0
  538. package/src/locales/it.json +63 -0
  539. package/src/mass/core/analyseSpectrum.ts +191 -0
  540. package/src/mass/core/ascendingTrace.ts +62 -0
  541. package/src/mass/core/centroidPeaks.ts +114 -0
  542. package/src/mass/core/detectMassFormat.ts +113 -0
  543. package/src/mass/core/downloadSpectra.ts +52 -0
  544. package/src/mass/core/fromJcamp.ts +151 -0
  545. package/src/mass/core/fromText.ts +58 -0
  546. package/src/mass/core/index.ts +194 -0
  547. package/src/mass/core/jcampTechnique.ts +87 -0
  548. package/src/mass/core/labelStackBox.ts +75 -0
  549. package/src/mass/core/labelledPeaks.ts +135 -0
  550. package/src/mass/core/loadMassSpectra.ts +86 -0
  551. package/src/mass/core/loadedMassSpectrum.ts +43 -0
  552. package/src/mass/core/massCommands.ts +156 -0
  553. package/src/mass/core/massDomain.ts +229 -0
  554. package/src/mass/core/massEditorApi.ts +68 -0
  555. package/src/mass/core/massFormat.ts +187 -0
  556. package/src/mass/core/massMeta.ts +239 -0
  557. package/src/mass/core/massReducer.ts +232 -0
  558. package/src/mass/core/massResolution.ts +169 -0
  559. package/src/mass/core/massSidePanels.ts +27 -0
  560. package/src/mass/core/massSpectrum.ts +220 -0
  561. package/src/mass/core/massState.ts +206 -0
  562. package/src/mass/core/massStateEdits.ts +104 -0
  563. package/src/mass/core/massSummary.ts +213 -0
  564. package/src/mass/core/mzDecimalsSetting.ts +52 -0
  565. package/src/mass/core/nearestPeak.ts +130 -0
  566. package/src/mass/core/peakLabelLines.ts +112 -0
  567. package/src/mass/core/peakLabelPlan.ts +246 -0
  568. package/src/mass/core/peakTable.ts +82 -0
  569. package/src/mass/core/resolutionOf.ts +100 -0
  570. package/src/mass/core/scanFilter.ts +119 -0
  571. package/src/mass/core/spectrumJcamp.ts +186 -0
  572. package/src/mass/core/toMassSpectrum.ts +126 -0
  573. package/src/mass/core/traceIcon.ts +105 -0
  574. package/src/mass/core/writtenResolution.ts +81 -0
  575. package/src/mass/ui/MassAboutDialog.tsx +89 -0
  576. package/src/mass/ui/MassCanvas.tsx +170 -0
  577. package/src/mass/ui/MassChart.tsx +266 -0
  578. package/src/mass/ui/MassCommandProvider.tsx +34 -0
  579. package/src/mass/ui/MassCommandTooltip.tsx +36 -0
  580. package/src/mass/ui/MassDocumentationDialog.tsx +136 -0
  581. package/src/mass/ui/MassEditor.tsx +130 -0
  582. package/src/mass/ui/MassHeader.tsx +38 -0
  583. package/src/mass/ui/MassLogo.tsx +84 -0
  584. package/src/mass/ui/MassPointerTracker.tsx +72 -0
  585. package/src/mass/ui/MassShell.tsx +237 -0
  586. package/src/mass/ui/MassSidePanel.tsx +107 -0
  587. package/src/mass/ui/MassStateProvider.tsx +32 -0
  588. package/src/mass/ui/MassStatusBar.tsx +108 -0
  589. package/src/mass/ui/MassToolbar.tsx +120 -0
  590. package/src/mass/ui/MetadataPanel.tsx +201 -0
  591. package/src/mass/ui/MzDecimalsMenu.tsx +86 -0
  592. package/src/mass/ui/PeakLabels.tsx +242 -0
  593. package/src/mass/ui/PeakTable.tsx +199 -0
  594. package/src/mass/ui/PeaksPanel.tsx +182 -0
  595. package/src/mass/ui/SpectraPanel.tsx +153 -0
  596. package/src/mass/ui/SpectrumRow.tsx +246 -0
  597. package/src/mass/ui/SpectrumTrace.tsx +119 -0
  598. package/src/mass/ui/index.ts +69 -0
  599. package/src/mass/ui/massActions.ts +109 -0
  600. package/src/mass/ui/massChartProps.ts +130 -0
  601. package/src/mass/ui/massCommandContext.tsx +65 -0
  602. package/src/mass/ui/massHostPanels.ts +71 -0
  603. package/src/mass/ui/massStateContext.ts +48 -0
  604. package/src/mass/ui/useIntensityZoom.ts +55 -0
  605. package/src/mass/ui/useMassEditor.ts +156 -0
  606. package/src/mass/ui/useMassFiles.ts +91 -0
  607. package/src/mass/ui/useMassHandle.ts +58 -0
  608. package/src/mass/ui/useMassPointer.ts +120 -0
  609. package/src/mass/ui/useMassShortcuts.ts +85 -0
  610. package/src/mass/ui/useMassSide.ts +63 -0
  611. package/src/mass/ui/useMassZoom.ts +157 -0
  612. package/src/mass.ts +16 -0
  613. package/src/panel/ui/PanelRail.tsx +5 -1
  614. package/src/slides/ui/slideSanitizeSchema.ts +86 -2
  615. package/styles/chrome.css +7 -0
  616. package/styles/slides.css +47 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Everything the viewer offers, what each is called, and the key it answers to.
3
+ *
4
+ * One table, read by three things that must agree: the toolbar draws it, the
5
+ * tooltip explains it, and the key handler fires it. Written apart from all
6
+ * three so a command cannot be added to the toolbar without a name, or bound to
7
+ * a key nothing tells the reader about.
8
+ *
9
+ * The keys are the infrared viewer's wherever the two viewers share a command,
10
+ * so a chemist who has learned one has learned the other.
11
+ */
12
+
13
+ /** The key a command answers to. */
14
+ export interface MassShortcut {
15
+ /** The `event.key` values it fires on, the first being the one shown. */
16
+ keys: readonly string[];
17
+ /**
18
+ * How to write the key in a tooltip, where the raw value would read badly.
19
+ * @default the first of `keys`
20
+ */
21
+ label?: readonly string[];
22
+ }
23
+
24
+ /** A gesture that does the same thing, listed under the tooltip's title. */
25
+ export interface MassGesture {
26
+ /** Where the gesture is made, or what it is made with. */
27
+ title: string;
28
+ /** The buttons, keys or wheel that make it. */
29
+ shortcuts: readonly string[];
30
+ }
31
+
32
+ /** One thing the viewer can be asked to do. */
33
+ export interface MassCommand {
34
+ /** What it is called, which is what the tooltip is titled. */
35
+ title: string;
36
+ /**
37
+ * The key it answers to, absent for a command with none.
38
+ * @default undefined
39
+ */
40
+ shortcut?: MassShortcut;
41
+ /**
42
+ * What it does, in a sentence, under the title in the tooltip.
43
+ * @default undefined
44
+ */
45
+ description?: string;
46
+ /**
47
+ * The gestures that do the same thing, for the ones a key cannot describe.
48
+ * @default undefined
49
+ */
50
+ gestures?: readonly MassGesture[];
51
+ }
52
+
53
+ /** Where the chart is, for a gesture made anywhere on it. */
54
+ const OVER_THE_CHART = 'Over the chart';
55
+
56
+ /** Everything the viewer offers, in the order it is reached for. */
57
+ export const massCommands = {
58
+ about: {
59
+ title: 'About the mass spectrum viewer',
60
+ description: 'What it reads, what it is built on, and what it credits.',
61
+ },
62
+ documentation: {
63
+ title: 'Documentation',
64
+ shortcut: { keys: ['h'] },
65
+ description:
66
+ 'How to open a spectrum, what the panels hold, and every gesture.',
67
+ },
68
+ fullScreen: {
69
+ title: 'Full screen',
70
+ description:
71
+ 'The viewer takes the whole screen rather than its corner of the page. Esc gives it back.',
72
+ },
73
+ openFiles: {
74
+ title: 'Open spectra…',
75
+ shortcut: { keys: ['o'] },
76
+ description:
77
+ 'Reads JCAMP-DX files and two-column text files of m/z and intensity, and adds what they hold to the chart.',
78
+ gestures: [{ title: OVER_THE_CHART, shortcuts: ['Drop files'] }],
79
+ },
80
+ readTool: {
81
+ title: 'Read',
82
+ shortcut: { keys: ['r'] },
83
+ description:
84
+ 'A drag narrows the m/z axis, which is the question a spectrum is nearly always asked. Released below the baseline, it takes the intensity axis with it.',
85
+ gestures: [{ title: OVER_THE_CHART, shortcuts: ['Drag'] }],
86
+ },
87
+ boxTool: {
88
+ title: 'Square zoom',
89
+ shortcut: { keys: ['b'] },
90
+ description:
91
+ 'A drag zooms to exactly the rectangle it sweeps out, both axes at once — for looking into the baseline under a cluster rather than across the spectrum.',
92
+ gestures: [{ title: OVER_THE_CHART, shortcuts: ['Drag a rectangle'] }],
93
+ },
94
+ zoomIn: {
95
+ title: 'Zoom in',
96
+ shortcut: { keys: ['+', '='] },
97
+ description: 'Brings the small peaks up, scaling the intensity about zero.',
98
+ gestures: [{ title: OVER_THE_CHART, shortcuts: ['Scroll wheel'] }],
99
+ },
100
+ zoomOut: {
101
+ title: 'Zoom out',
102
+ shortcut: { keys: ['-'] },
103
+ description: 'Puts the intensity axis back out again.',
104
+ gestures: [{ title: OVER_THE_CHART, shortcuts: ['Scroll wheel'] }],
105
+ },
106
+ resetZoom: {
107
+ title: 'Zoom to fit',
108
+ shortcut: { keys: ['f'] },
109
+ description: 'Shows every spectrum that is drawn, whole.',
110
+ gestures: [{ title: OVER_THE_CHART, shortcuts: ['Double click'] }],
111
+ },
112
+ toggleLabels: {
113
+ title: 'Label the peaks',
114
+ shortcut: { keys: ['l'] },
115
+ description:
116
+ 'Writes the m/z and the intensity over the tallest peaks of the selected spectrum. Which peaks follows the zoom: zoom onto a cluster and every line of it is labelled.',
117
+ },
118
+ toggleCharges: {
119
+ title: 'Write the charges',
120
+ shortcut: { keys: ['z'] },
121
+ description:
122
+ 'Adds the charge to the label of every peak whose isotopologue spacing, or charge ladder, established one.',
123
+ },
124
+ exportImage: {
125
+ title: 'Save figure…',
126
+ shortcut: { keys: ['x'] },
127
+ description:
128
+ 'The chart as it stands, saved as a PNG or an SVG at a chosen resolution, or copied as a PNG.',
129
+ },
130
+ clear: {
131
+ title: 'Close every spectrum',
132
+ description: 'Empties the chart and starts again.',
133
+ },
134
+ } as const satisfies Record<string, MassCommand>;
135
+
136
+ /** Identity of one of the commands the viewer offers. */
137
+ export type MassCommandId = keyof typeof massCommands;
138
+
139
+ /** What to do when each command is run, as the shell wires them. */
140
+ export type MassCommandHandlers = Partial<
141
+ Record<MassCommandId, (() => void) | undefined>
142
+ >;
143
+
144
+ /** How a component runs a command. */
145
+ export type RunMassCommand = (id: MassCommandId) => void;
146
+
147
+ /**
148
+ * What a command is called, with its key, for a label and an `aria-label`.
149
+ * @param id - Which command.
150
+ * @returns The title, and the key in parentheses when it has one.
151
+ */
152
+ export function massCommandLabel(id: MassCommandId): string {
153
+ const entry: MassCommand = massCommands[id];
154
+ const key = entry.shortcut?.label?.[0] ?? entry.shortcut?.keys[0];
155
+ return key === undefined ? entry.title : `${entry.title} (${key})`;
156
+ }
@@ -0,0 +1,229 @@
1
+ /**
2
+ * The window a chart opens on, worked out from the spectra it was handed.
3
+ *
4
+ * This is what "zoom to fit" and the first render both call, so it has to be
5
+ * right for a peak table of four rows and for a profile scan of half a million
6
+ * points alike, and it has to answer something usable when it is handed nothing
7
+ * at all — a chart with no data is still mounted, still measured, and still
8
+ * builds its scales.
9
+ */
10
+
11
+ import { xMaxValue } from 'ml-spectra-processing';
12
+
13
+ import type { MassDomain, MassSpectrum, MassTrace } from './massSpectrum.ts';
14
+
15
+ /**
16
+ * How much air is left either side of the outermost peak, as a fraction.
17
+ *
18
+ * A stick drawn exactly on the axis reads as a spectrum that was cut off there;
19
+ * two percent is enough to show that it was not.
20
+ */
21
+ export const X_DOMAIN_PADDING = 0.02;
22
+
23
+ /**
24
+ * How far above the tallest peak the intensity axis runs.
25
+ *
26
+ * The base peak carries the label nobody wants to lose — its m/z and its
27
+ * intensity, on two lines — and it is drawn above the stick. Twenty percent is
28
+ * the room those lines take at the top of a chart of any usual height.
29
+ */
30
+ export const Y_DOMAIN_HEADROOM = 1.2;
31
+
32
+ /**
33
+ * The window that shows everything currently drawn.
34
+ *
35
+ * A spectrum marked `excludeFromDomain` is left out of the extents, because it
36
+ * is a preview rather than data: a predicted pattern that appears and
37
+ * disappears with the pointer would throw away the zoom the user set every
38
+ * time it moved the axes. The exclusion is dropped when it would leave nothing
39
+ * at all — previewing into an empty chart has to show the preview, not an empty
40
+ * axis from 0 to 1.
41
+ *
42
+ * In mirror mode the negative half is the reflection of the positive one rather
43
+ * than its own extent. Two spectra compared head-to-head are only comparable if
44
+ * a peak of the same height means the same intensity in both halves; giving each
45
+ * half its own scale makes the weaker spectrum look as intense as the stronger,
46
+ * which is precisely the comparison the view exists to make.
47
+ * @param spectra - What the chart draws.
48
+ * @param mirror - Whether the chart reflects its spectra about zero. Defaults
49
+ * to `false`.
50
+ * @returns The window, in m/z and in intensity.
51
+ */
52
+ export function fullDomain(
53
+ spectra: readonly MassSpectrum[],
54
+ mirror = false,
55
+ ): MassDomain {
56
+ const extent = traceExtent(spectra, false) ?? traceExtent(spectra, true);
57
+ if (extent === null) return { x: [0, 1], y: [0, 1] };
58
+
59
+ const { xMinimum, xMaximum, yMaximum } = extent;
60
+ const padding = (xMaximum - xMinimum) * X_DOMAIN_PADDING;
61
+ // A single peak, or several at one m/z, has no width to take a fraction of.
62
+ const x: [number, number] =
63
+ padding > 0
64
+ ? [xMinimum - padding, xMaximum + padding]
65
+ : [xMinimum - 1, xMaximum + 1];
66
+ const top = yMaximum > 0 ? yMaximum * Y_DOMAIN_HEADROOM : 1;
67
+ return { x, y: mirror ? [-top, top] : [0, top] };
68
+ }
69
+
70
+ /**
71
+ * What a fitted window was fitted *to*, as one string two renders can compare.
72
+ *
73
+ * The chart puts its window back to `fullDomain` when it is handed different
74
+ * data, and must not when the same data is merely drawn differently — so
75
+ * something has to tell the two apart. It is the identities that are compared
76
+ * and never the extents: a spectrum switched from its profile to its sticks
77
+ * moves the fitted window by a hair, and refitting on a hair throws away the
78
+ * zoom somebody set, which is the whole reason this exists. Loading a spectrum,
79
+ * closing one and reflecting the chart about zero are the changes that have to
80
+ * be shown, and every one of them shows up here.
81
+ *
82
+ * A spectrum kept out of the automatic domain is kept out of this too, for the
83
+ * reason it is kept out of the extents: a predicted pattern previewed under the
84
+ * pointer comes and goes with the pointer, and refitting on it would throw the
85
+ * zoom away every time a search result is read. The identities are joined by a
86
+ * character no identity holds, so `a b` and `a` then `b` are two fits.
87
+ * @param spectra - What the chart draws.
88
+ * @param mirror - Whether the chart reflects its spectra about zero. Defaults
89
+ * to `false`.
90
+ * @returns A string equal to itself exactly when a fit would be made to the
91
+ * same thing.
92
+ */
93
+ export function fittedTo(
94
+ spectra: readonly MassSpectrum[],
95
+ mirror = false,
96
+ ): string {
97
+ let key = mirror ? 'mirror' : 'upward';
98
+ for (const spectrum of spectra) {
99
+ if (spectrum.excludeFromDomain) continue;
100
+ key += `\u0000${spectrum.id}`;
101
+ }
102
+ return key;
103
+ }
104
+
105
+ /**
106
+ * The tallest intensity among the traces a set of spectra currently draws.
107
+ *
108
+ * What "how tall is this chart" comes to, in the units the spectra are in, with
109
+ * the headroom `fullDomain` adds left off — so it answers a question about the
110
+ * measurement rather than about the plot. A preview kept out of the extents is
111
+ * kept out of this too, and a chart holding nothing but a preview is measured
112
+ * by it rather than answering zero.
113
+ * @param spectra - The spectra to measure, drawn or not.
114
+ * @returns The tallest intensity drawn, or `0` when nothing is.
115
+ */
116
+ export function basePeakOf(spectra: readonly MassSpectrum[]): number {
117
+ const extent = traceExtent(spectra, false) ?? traceExtent(spectra, true);
118
+ return extent === null ? 0 : extent.yMaximum;
119
+ }
120
+
121
+ /**
122
+ * How much of the axis framing a peak shows, either side of its mass.
123
+ *
124
+ * Wide enough to hold the isotopologue cluster of a singly charged ion, because
125
+ * a peak is read in its cluster and not alone: the M+1 says how much carbon it
126
+ * holds and the spacing says what charge it carries.
127
+ */
128
+ export const MZ_FRAME_HALF_WIDTH = 2.5;
129
+
130
+ /** How a mass is framed. */
131
+ export interface MzFrameOptions {
132
+ /**
133
+ * How much of the axis to show either side of the mass.
134
+ * @default MZ_FRAME_HALF_WIDTH
135
+ */
136
+ halfWidth?: number;
137
+ /**
138
+ * Whether the chart reflects its spectra about zero, which decides the height
139
+ * it opens on when it has no window of its own.
140
+ * @default false
141
+ */
142
+ mirror?: boolean;
143
+ }
144
+
145
+ /**
146
+ * The window that frames one mass, keeping the intensity axis where it was.
147
+ *
148
+ * The vertical extent is deliberately not recomputed from what falls inside the
149
+ * new window: a click is a request to look somewhere else along the m/z axis,
150
+ * and rescaling the height at the same time makes whatever was just clicked fill
151
+ * the plot, so every peak looks like the base peak and the one number the eye
152
+ * reads off a spectrum stops meaning anything. It is only worked out from the
153
+ * spectra when the chart has no window of its own to keep.
154
+ * @param mz - The mass to frame.
155
+ * @param spectra - What the chart is drawing, for the height it opens on.
156
+ * @param domain - The window the chart is showing, `null` when it is fitting.
157
+ * @param options - How wide a window, and whether the chart is mirrored.
158
+ * @returns The window to show.
159
+ */
160
+ export function mzFrame(
161
+ mz: number,
162
+ spectra: readonly MassSpectrum[],
163
+ domain: MassDomain | null,
164
+ options: MzFrameOptions = {},
165
+ ): MassDomain {
166
+ const { halfWidth = MZ_FRAME_HALF_WIDTH, mirror = false } = options;
167
+ const y = domain?.y ?? fullDomain(spectra, mirror).y;
168
+ return { x: [mz - halfWidth, mz + halfWidth], y };
169
+ }
170
+
171
+ /** The extremes of a set of traces, before any padding is added. */
172
+ interface TraceExtent {
173
+ /** The lowest m/z drawn. */
174
+ xMinimum: number;
175
+ /** The highest m/z drawn. */
176
+ xMaximum: number;
177
+ /** The tallest intensity drawn. */
178
+ yMaximum: number;
179
+ }
180
+
181
+ /**
182
+ * The extremes over every trace that is currently drawn.
183
+ * @param spectra - What the chart draws.
184
+ * @param includeExcluded - Whether to count the spectra kept out of the domain.
185
+ * @returns The extremes, or `null` when nothing is drawn.
186
+ */
187
+ function traceExtent(
188
+ spectra: readonly MassSpectrum[],
189
+ includeExcluded: boolean,
190
+ ): TraceExtent | null {
191
+ let extent: TraceExtent | null = null;
192
+ for (const spectrum of spectra) {
193
+ if (!includeExcluded && spectrum.excludeFromDomain) continue;
194
+ if (spectrum.showProfile && spectrum.profile !== null) {
195
+ extent = widen(extent, spectrum.profile);
196
+ }
197
+ if (spectrum.showCentroid) extent = widen(extent, spectrum.centroid);
198
+ }
199
+ return extent;
200
+ }
201
+
202
+ /**
203
+ * Grow an extent to cover one more trace.
204
+ *
205
+ * The m/z ends are read off the first and last sample rather than searched for:
206
+ * `MassTrace.x` is increasing by construction, so a scan would walk several
207
+ * hundred thousand points of a profile to learn what index zero already says.
208
+ * @param extent - What has been covered so far, `null` for nothing.
209
+ * @param trace - The trace to cover as well.
210
+ * @returns The grown extent, unchanged when the trace holds no point.
211
+ */
212
+ function widen(
213
+ extent: TraceExtent | null,
214
+ trace: MassTrace,
215
+ ): TraceExtent | null {
216
+ const { x, y } = trace;
217
+ if (x.length === 0 || y.length === 0) return extent;
218
+ const first = x[0] as number;
219
+ const last = x.at(-1) as number;
220
+ const tallest = xMaxValue(y);
221
+ if (extent === null) {
222
+ return { xMinimum: first, xMaximum: last, yMaximum: tallest };
223
+ }
224
+ return {
225
+ xMinimum: Math.min(extent.xMinimum, first),
226
+ xMaximum: Math.max(extent.xMaximum, last),
227
+ yMaximum: Math.max(extent.yMaximum, tallest),
228
+ };
229
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The handle a host drives the viewer through.
3
+ *
4
+ * A handle rather than props, for the reason NMRium uses one: "frame this peak"
5
+ * and "take these spectra" are *gestures*, and a gesture expressed as a prop has
6
+ * to change to be obeyed — so asking for the same window twice does nothing the
7
+ * second time, and a host ends up inventing a nonce to make it work.
8
+ */
9
+
10
+ import type { MassDomain, MassSpectrum } from './massSpectrum.ts';
11
+
12
+ /** How much room to leave either side of a mass a host asks to be framed. */
13
+ export interface ZoomToMzOptions {
14
+ /**
15
+ * How much of the m/z axis to show either side of the mass.
16
+ * @default MZ_FRAME_HALF_WIDTH
17
+ */
18
+ halfWidth?: number;
19
+ }
20
+
21
+ /** What a host can ask of the viewer. */
22
+ export interface MassEditorHandle {
23
+ /** The spectra that are open, in the order they were loaded. */
24
+ getSpectra: () => MassSpectrum[];
25
+ /** Draw these instead of what is open, and refit to them. */
26
+ setSpectra: (spectra: MassSpectrum[]) => void;
27
+ /** Draw these as well as what is open. */
28
+ addSpectra: (spectra: MassSpectrum[]) => void;
29
+ /**
30
+ * Read files the way a drop on the chart reads them, and add what they hold.
31
+ * Resolves once every file has been read; what could not be read is said in
32
+ * the status bar.
33
+ */
34
+ openFiles: (files: readonly File[]) => Promise<void>;
35
+ /** Close every spectrum. */
36
+ clear: () => void;
37
+ /** Show this window. */
38
+ setDomain: (domain: MassDomain) => void;
39
+ /** Show what fits. */
40
+ resetDomain: () => void;
41
+ /**
42
+ * Frame a mass, keeping the intensity axis as it is.
43
+ *
44
+ * The commonest thing a host wants: a peak named in a table beside the viewer
45
+ * is clicked, and the chart should go there.
46
+ */
47
+ zoomToMz: (mz: number, options?: ZoomToMzOptions) => void;
48
+ /** Point the panels at one spectrum, or at none. */
49
+ selectSpectrum: (id: string | null) => void;
50
+ }
51
+
52
+ /**
53
+ * A click on the plot, as the viewer tells its host about it.
54
+ *
55
+ * A click is a press let go over the plot without travelling: the end of a zoom
56
+ * drag is never one, and a click on the axis labels is not reported.
57
+ */
58
+ export interface MassPlotClick {
59
+ /** Where it landed on the m/z axis. */
60
+ mz: number;
61
+ /**
62
+ * The m/z of the picked peak within reach of the click, `null` when it landed
63
+ * on none — an empty stretch of the plot is not a peak of zero.
64
+ */
65
+ peakMz: number | null;
66
+ /** Identity of the spectrum selected when it was made, `null` for none. */
67
+ spectrumId: string | null;
68
+ }
@@ -0,0 +1,187 @@
1
+ /**
2
+ * How every number about a mass spectrum is written, wherever it is written.
3
+ *
4
+ * An m/z is written to the decimals the spectra on screen resolve — four for a
5
+ * high-resolution measurement, none for a nominal-mass table, as
6
+ * `mzDecimalsOf` settles it for all of them at once — and an intensity follows
7
+ * it. Settled once here, so a table, an axis label and a tooltip never disagree
8
+ * about how wide one number is.
9
+ */
10
+
11
+ import {
12
+ SCIENTIFIC_ABOVE,
13
+ formatScientific,
14
+ } from '../../chart/core/axisLabels.ts';
15
+ import { formatInteger } from '../../format/core/numbers.ts';
16
+
17
+ import type { MassResolution } from './massResolution.ts';
18
+ import { MZ_DECIMALS } from './massResolution.ts';
19
+ import type { MassFormat } from './massSpectrum.ts';
20
+
21
+ /** Decimals an intensity is written with, on the 0–100 scale. */
22
+ export const INTENSITY_DECIMALS = 2;
23
+
24
+ /**
25
+ * An m/z as every table, axis label and tooltip writes it.
26
+ *
27
+ * Always a fixed number of decimals, never `toPrecision` and never the shortest
28
+ * form that round-trips: a column of masses is read by running an eye down it,
29
+ * and `163` above `162.9871` above `164.1` is unreadable in a way that
30
+ * `163.0000` above `162.9871` above `164.1000` is not.
31
+ * @param mz - The mass-to-charge ratio.
32
+ * @param decimals - How many decimals the spectra on screen resolve, as
33
+ * `mzDecimalsOf` decides. Defaults to the high-resolution four.
34
+ * @returns The number as it is written.
35
+ */
36
+ export function formatMz(mz: number, decimals = MZ_DECIMALS.high): string {
37
+ return mz.toFixed(decimals);
38
+ }
39
+
40
+ /**
41
+ * An intensity as every table and tooltip writes it, on the 0–100 scale.
42
+ *
43
+ * It follows the m/z rather than being decided on its own: a nominal-mass peak
44
+ * table quotes relative intensities as whole percentages too, and one column of
45
+ * the same table rounded and the other not looks like a bug. Past the chart's
46
+ * own `SCIENTIFIC_ABOVE`, and under a hundredth — where two decimals would write
47
+ * a zero that is not one — the intensity is written as a power of ten, which is
48
+ * how the axis beside it spells such numbers too.
49
+ * @param intensity - The intensity, normalised to a base peak of 100, or the
50
+ * counts themselves for a spectrum that kept them.
51
+ * @param mzDecimals - How many decimals the masses beside it are written with.
52
+ * Defaults to the high-resolution four.
53
+ * @returns The number as it is written.
54
+ */
55
+ export function formatIntensity(
56
+ intensity: number,
57
+ mzDecimals = MZ_DECIMALS.high,
58
+ ): string {
59
+ const decimals = mzDecimals === 0 ? 0 : INTENSITY_DECIMALS;
60
+ if (intensity === 0) return (0).toFixed(decimals);
61
+ const size = Math.abs(intensity);
62
+ if (size >= SCIENTIFIC_ABOVE || size < PLAIN_BELOW) {
63
+ return formatScientific(intensity, INTENSITY_DECIMALS);
64
+ }
65
+ return intensity.toFixed(decimals);
66
+ }
67
+
68
+ /**
69
+ * A range of masses, low end first, as the list and the table write it.
70
+ * @param masses - The m/z of every peak, ascending.
71
+ * @param decimals - How many decimals to write them with.
72
+ * @returns `43.8490 – 223.6762`, or `''` for a spectrum holding no peak.
73
+ */
74
+ export function formatMzRange(masses: Float64Array, decimals: number): string {
75
+ if (masses.length === 0) return '';
76
+ const first = masses[0] as number;
77
+ const last = masses.at(-1) as number;
78
+ return `${formatMz(first, decimals)} – ${formatMz(last, decimals)}`;
79
+ }
80
+
81
+ /**
82
+ * A format as a chemist writes it rather than as the code spells it.
83
+ * @param format - The format the spectrum was read from.
84
+ * @returns Its name; a format this package does not read, as it was given.
85
+ */
86
+ export function massFormatLabel(format: MassFormat): string {
87
+ return FORMAT_LABELS.get(format) ?? format;
88
+ }
89
+
90
+ /**
91
+ * What a resolution verdict is called, in the words a status line uses.
92
+ * @param resolution - The verdict.
93
+ * @returns `high resolution`, `low resolution` or `nominal mass`.
94
+ */
95
+ export function resolutionLabel(resolution: MassResolution): string {
96
+ return RESOLUTION_LABELS[resolution.kind];
97
+ }
98
+
99
+ /**
100
+ * A resolving power as it is quoted: approximately, and to two figures.
101
+ *
102
+ * Two significant figures because that is all a median over a score of peaks
103
+ * can claim, and because `R ≈ 47,000` is how an instrument's resolution is
104
+ * quoted on its data sheet.
105
+ * @param resolvingPower - The resolving power `m / Δm`.
106
+ * @returns `R ≈ 47,000`.
107
+ */
108
+ export function resolvingPowerLabel(resolvingPower: number): string {
109
+ return `R ≈ ${formatInteger(Number(resolvingPower.toPrecision(2)))}`;
110
+ }
111
+
112
+ /**
113
+ * How a verdict was reached, said as a reader would want it said.
114
+ * @param resolution - The verdict.
115
+ * @returns The sentence fragment, e.g. `measured on the peak widths`.
116
+ */
117
+ export function resolutionBasisLabel(resolution: MassResolution): string {
118
+ return BASIS_LABELS[resolution.basis];
119
+ }
120
+
121
+ /**
122
+ * The intensity below which two decimals have nothing left to say it in.
123
+ *
124
+ * A hundredth, which is exactly where `INTENSITY_DECIMALS` runs out: `0.01` is
125
+ * the smallest number two decimals can write, and everything under it rounds to
126
+ * a zero that is not one.
127
+ */
128
+ const PLAIN_BELOW = 1e-2;
129
+
130
+ /**
131
+ * How each format is spelled where it is shown: `mzML` and `netCDF` are the
132
+ * names of the standards, capitals and all, and a table that showed `mzml`
133
+ * would read as a typo in a panel whose whole purpose is to quote the file
134
+ * faithfully. Every format a reader of the family hands spectra over in, the
135
+ * vendor ones included, since a host reading them hands the format over too.
136
+ */
137
+ const FORMAT_LABELS = new Map<MassFormat, string>([
138
+ ['jcamp', 'JCAMP-DX'],
139
+ ['text', 'Text, two columns'],
140
+ ['calculated', 'Calculated'],
141
+ ['mzml', 'mzML'],
142
+ ['mzxml', 'mzXML'],
143
+ ['mzdata', 'mzData'],
144
+ ['imzml', 'imzML'],
145
+ ['mzmlb', 'mzMLb'],
146
+ ['netcdf', 'netCDF'],
147
+ ['mgf', 'MGF'],
148
+ ['msp', 'MSP library'],
149
+ ['msn', 'MS1/MS2 text'],
150
+ ['dta', 'Sequest DTA'],
151
+ ['pkl', 'Micromass peak list'],
152
+ ['asm', 'Allotrope ASM'],
153
+ ['thermo', 'Thermo RAW'],
154
+ ['uep', 'Waters UNIFI package'],
155
+ ['watersraw', 'Waters RAW'],
156
+ ['wiff', 'SCIEX WIFF'],
157
+ ['wiff2', 'SCIEX WIFF2'],
158
+ ['wiffscan', 'SCIEX WIFF scan file'],
159
+ ['shimadzu', 'Shimadzu'],
160
+ ['chemstationms', 'Agilent ChemStation MS'],
161
+ ['chemstationch', 'Agilent ChemStation trace'],
162
+ ['chemstationuv', 'Agilent ChemStation UV'],
163
+ ['agilentdad', 'Agilent MassHunter device'],
164
+ ['masshunter', 'Agilent MassHunter'],
165
+ ['brukerflex', 'Bruker flex'],
166
+ ['brukertsf', 'Bruker timsTOF (TSF)'],
167
+ ['brukertdf', 'Bruker timsTOF (TDF)'],
168
+ ['penx', 'PerkinElmer TotalChrom'],
169
+ ['varian', 'Varian Saturn'],
170
+ ['spc', 'Galactic SPC'],
171
+ ['wdf', 'Renishaw WDF'],
172
+ ['targetraster', 'AP-MALDI target raster'],
173
+ ]);
174
+
175
+ /** How each kind of resolution is named. */
176
+ const RESOLUTION_LABELS: Record<MassResolution['kind'], string> = {
177
+ high: 'high resolution',
178
+ low: 'low resolution',
179
+ nominal: 'nominal mass',
180
+ };
181
+
182
+ /** How each basis of a verdict is said. */
183
+ const BASIS_LABELS: Record<MassResolution['basis'], string> = {
184
+ peakWidth: 'measured on the peak widths',
185
+ instrument: 'stated by the file',
186
+ decimals: 'read off the decimals written',
187
+ };