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,153 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { SelectedTotal, Toolbar } from 'react-science/ui';
3
+
4
+ import { useListKeyboardNavigation } from '../../hooks/ui/useListKeyboardNavigation.ts';
5
+ import {
6
+ panelBodyStyle,
7
+ panelEmptyStyle,
8
+ panelStyle,
9
+ panelToolbarCountStyle,
10
+ panelToolbarStyle,
11
+ } from '../../panel/core/panelStyles.ts';
12
+ import { downloadMassSpectra } from '../core/downloadSpectra.ts';
13
+ import { massCommandLabel } from '../core/massCommands.ts';
14
+
15
+ import { SpectrumRow } from './SpectrumRow.tsx';
16
+ import { useMassCommand } from './massCommandContext.tsx';
17
+ import { useMassActions, useMassEditorState } from './massStateContext.ts';
18
+
19
+ /**
20
+ * What is loaded: one row per spectrum, in the order the files gave them.
21
+ *
22
+ * The list is the viewer's selection as well as its legend. Whichever row is
23
+ * selected is the spectrum the acquisition table describes, the peak table holds
24
+ * and the chart writes its labels on, so a row is not a checkbox with a colour
25
+ * beside it — it is the control that decides what the other panels are about.
26
+ * That is also why the arrow keys walk it: a GC/MS export gives a page per scan,
27
+ * and finding the interesting one means stepping down them watching the chart.
28
+ *
29
+ * What acts on the list rather than on one row — opening more, drawing every
30
+ * trace again, handing the whole list over as a file, closing every one — is a
31
+ * toolbar under the header, where a panel's own actions belong.
32
+ * @returns The panel.
33
+ */
34
+ export function SpectraPanel() {
35
+ const { state, visibleSpectra } = useMassEditorState();
36
+ const actions = useMassActions();
37
+ const run = useMassCommand();
38
+ const { spectra } = state.data;
39
+ const { selectedId } = state.view;
40
+ const listRef = useRef<HTMLDivElement>(null);
41
+
42
+ const selectedIndex = spectra.findIndex(
43
+ (spectrum) => spectrum.id === selectedId,
44
+ );
45
+ const onKeyDown = useListKeyboardNavigation({
46
+ length: spectra.length,
47
+ selectedIndex,
48
+ onSelect: (index) => {
49
+ const spectrum = spectra[index];
50
+ if (spectrum !== undefined) actions.selectSpectrum(spectrum.id);
51
+ },
52
+ });
53
+
54
+ useEffect(() => {
55
+ if (listRef.current === null || selectedId === null) return;
56
+ listRef.current
57
+ .querySelector('[data-selected="true"]')
58
+ ?.scrollIntoView({ block: 'nearest' });
59
+ }, [selectedId]);
60
+
61
+ const allDrawn = spectra.every(
62
+ (spectrum) => spectrum.showProfile || spectrum.showCentroid,
63
+ );
64
+
65
+ return (
66
+ <div style={panelStyle}>
67
+ <div style={panelToolbarStyle}>
68
+ <Toolbar aria-label="Spectra">
69
+ <Toolbar.Item
70
+ icon="folder-open"
71
+ tooltip={massCommandLabel('openFiles')}
72
+ aria-label={massCommandLabel('openFiles')}
73
+ onClick={() => run('openFiles')}
74
+ />
75
+ <Toolbar.Item
76
+ icon="trash"
77
+ intent="danger"
78
+ tooltip="Close every spectrum"
79
+ aria-label="Close every spectrum"
80
+ disabled={spectra.length === 0}
81
+ onClick={actions.clear}
82
+ />
83
+ <Toolbar.Item
84
+ icon="eye-open"
85
+ tooltip="Draw every spectrum again, each as the trace it was read as"
86
+ aria-label="Draw every spectrum again"
87
+ disabled={spectra.length === 0 || allDrawn}
88
+ onClick={() => {
89
+ for (const spectrum of spectra) {
90
+ if (spectrum.showProfile || spectrum.showCentroid) continue;
91
+ actions.setSpectrumVisibility(spectrum.id, {
92
+ showProfile: spectrum.profile !== null,
93
+ showCentroid: spectrum.profile === null,
94
+ });
95
+ }
96
+ }}
97
+ />
98
+ <Toolbar.Item
99
+ icon="download"
100
+ tooltip="Download every spectrum as one JCAMP-DX file"
101
+ aria-label="Download every spectrum"
102
+ disabled={spectra.length === 0}
103
+ onClick={() => downloadMassSpectra(spectra)}
104
+ />
105
+ </Toolbar>
106
+ <div
107
+ style={panelToolbarCountStyle}
108
+ title={`${visibleSpectra.length} of ${spectra.length} spectra drawn`}
109
+ >
110
+ <SelectedTotal count={visibleSpectra.length} total={spectra.length} />
111
+ </div>
112
+ </div>
113
+
114
+ <div ref={listRef} style={panelBodyStyle}>
115
+ {spectra.length === 0 ? (
116
+ <p style={panelEmptyStyle}>
117
+ No spectrum is open. Drop a JCAMP-DX file, or two columns of m/z and
118
+ intensity, on the chart.
119
+ </p>
120
+ ) : (
121
+ <ul
122
+ aria-label="Open spectra"
123
+ // Reached by Tab, or by clicking a row, and then walked with the
124
+ // arrows.
125
+ tabIndex={0}
126
+ style={listStyle}
127
+ onKeyDown={onKeyDown}
128
+ >
129
+ {spectra.map((spectrum) => (
130
+ <SpectrumRow
131
+ key={spectrum.id}
132
+ spectrum={spectrum}
133
+ isSelected={spectrum.id === selectedId}
134
+ />
135
+ ))}
136
+ </ul>
137
+ )}
138
+ </div>
139
+ </div>
140
+ );
141
+ }
142
+
143
+ /**
144
+ * The rows, flush against one another: a gap between every pair reads as a
145
+ * stack of cards rather than as one list to run an eye down.
146
+ */
147
+ const listStyle = {
148
+ display: 'flex',
149
+ flexDirection: 'column',
150
+ margin: 0,
151
+ padding: 0,
152
+ listStyle: 'none',
153
+ } as const;
@@ -0,0 +1,246 @@
1
+ import { InputGroup } from '@blueprintjs/core';
2
+ import { useMemo, useState } from 'react';
3
+ import { Button } from 'react-science/ui';
4
+
5
+ import { SpectrumColorSwatch } from '../../panel/ui/SpectrumColorSwatch.tsx';
6
+ import { downloadMassSpectrum } from '../core/downloadSpectra.ts';
7
+ import type { MassSpectrum } from '../core/massSpectrum.ts';
8
+ import { spectrumSubtitle } from '../core/massSummary.ts';
9
+ import type { MassTraceKind, TraceIconState } from '../core/traceIcon.ts';
10
+ import { nextTraceIconClick, traceIconState } from '../core/traceIcon.ts';
11
+
12
+ import { useMassActions } from './massStateContext.ts';
13
+
14
+ export interface SpectrumRowProps {
15
+ /** The spectrum the row is of. */
16
+ spectrum: MassSpectrum;
17
+ /** Whether it is the one the panels act on. */
18
+ isSelected: boolean;
19
+ }
20
+
21
+ /**
22
+ * One loaded spectrum: its colour, its two traces, its name, and the way out.
23
+ *
24
+ * Everything on the row addresses the spectrum by its identity, never by where
25
+ * it sits in the list — a row acts on a list that has been shortened by a close
26
+ * since it was drawn, and an index would then recolour or close whichever
27
+ * spectrum has taken that place.
28
+ *
29
+ * The two trace icons are the row's centre of gravity, and they are tri-state
30
+ * rather than checkboxes; `traceIcon.ts` says why. The name is renamed in place
31
+ * on a double click, because a name is what a chemist tells scans apart by and
32
+ * a file's own titles are often the same string a dozen times over. The line
33
+ * under it says what kind of spectrum it is: profile or centroid, how many
34
+ * peaks, and at what resolution.
35
+ * @param props - Component props.
36
+ * @returns The row.
37
+ */
38
+ export function SpectrumRow(props: SpectrumRowProps) {
39
+ const { spectrum, isSelected } = props;
40
+ const actions = useMassActions();
41
+ const [draftName, setDraftName] = useState<string | null>(null);
42
+
43
+ const subtitle = useMemo(
44
+ () => spectrumSubtitle(spectrum, { describeKind: true }),
45
+ [spectrum],
46
+ );
47
+ const profileState = traceIconState(spectrum.showProfile, isSelected);
48
+ const centroidState = traceIconState(spectrum.showCentroid, isSelected);
49
+
50
+ /**
51
+ * Run the cycle of one trace icon.
52
+ * @param kind - The trace the icon stands for.
53
+ * @param state - What the icon was saying before the click.
54
+ */
55
+ function clickTrace(kind: MassTraceKind, state: TraceIconState): void {
56
+ const click = nextTraceIconClick(kind, state);
57
+ actions.setSpectrumVisibility(spectrum.id, click.visibility);
58
+ if (click.select) actions.selectSpectrum(spectrum.id);
59
+ }
60
+
61
+ /** Take the name typed, unless it was emptied — a rename abandoned. */
62
+ function commitRename(): void {
63
+ const name = draftName?.trim() ?? '';
64
+ setDraftName(null);
65
+ if (name !== '') actions.renameSpectrum(spectrum.id, name);
66
+ }
67
+
68
+ return (
69
+ <li
70
+ // A row of controls rather than an option of a listbox, so the one every
71
+ // panel is about is said to be the current one.
72
+ aria-current={isSelected ? 'true' : undefined}
73
+ style={isSelected ? selectedRowStyle : rowStyle}
74
+ data-selected={isSelected ? 'true' : undefined}
75
+ >
76
+ <SpectrumColorSwatch
77
+ color={spectrum.color}
78
+ name={spectrum.name}
79
+ onPick={(color) => actions.setSpectrumColor(spectrum.id, color)}
80
+ />
81
+
82
+ <Button
83
+ variant="minimal"
84
+ size="small"
85
+ icon="timeline-line-chart"
86
+ active={profileState !== 'hidden'}
87
+ intent={profileState === 'selected' ? 'primary' : 'none'}
88
+ disabled={spectrum.profile === null}
89
+ tooltipProps={{
90
+ ...rowTooltipProps,
91
+ content:
92
+ spectrum.profile === null
93
+ ? 'This file was already centroided, so it has no continuous trace'
94
+ : traceTooltip('profile', profileState),
95
+ }}
96
+ aria-label={`Continuous trace of ${spectrum.name}`}
97
+ onClick={() => clickTrace('profile', profileState)}
98
+ />
99
+
100
+ <Button
101
+ variant="minimal"
102
+ size="small"
103
+ icon="timeline-bar-chart"
104
+ active={centroidState !== 'hidden'}
105
+ intent={centroidState === 'selected' ? 'primary' : 'none'}
106
+ tooltipProps={{
107
+ ...rowTooltipProps,
108
+ content: traceTooltip('centroid', centroidState),
109
+ }}
110
+ aria-label={`Centroid sticks of ${spectrum.name}`}
111
+ onClick={() => clickTrace('centroid', centroidState)}
112
+ />
113
+
114
+ {draftName === null ? (
115
+ <button
116
+ type="button"
117
+ style={nameStyle}
118
+ title="Click to work on this spectrum, double click to rename it"
119
+ onClick={() => actions.selectSpectrum(spectrum.id)}
120
+ onDoubleClick={() => setDraftName(spectrum.name)}
121
+ >
122
+ <span style={nameTextStyle}>{spectrum.name}</span>
123
+ <span style={subtitleStyle}>{subtitle}</span>
124
+ </button>
125
+ ) : (
126
+ <InputGroup
127
+ autoFocus
128
+ size="small"
129
+ value={draftName}
130
+ spellCheck={false}
131
+ autoCapitalize="off"
132
+ autoCorrect="off"
133
+ autoComplete="off"
134
+ aria-label={`Name of ${spectrum.name}`}
135
+ onValueChange={setDraftName}
136
+ onBlur={commitRename}
137
+ onKeyDown={(event) => {
138
+ if (event.key === 'Enter') commitRename();
139
+ if (event.key === 'Escape') setDraftName(null);
140
+ }}
141
+ />
142
+ )}
143
+
144
+ <Button
145
+ variant="minimal"
146
+ size="small"
147
+ icon="download"
148
+ aria-label={`Download ${spectrum.name}`}
149
+ tooltipProps={{
150
+ ...rowTooltipProps,
151
+ content: 'Download this spectrum as a JCAMP-DX file',
152
+ }}
153
+ onClick={() => downloadMassSpectrum(spectrum)}
154
+ />
155
+
156
+ <Button
157
+ variant="minimal"
158
+ size="small"
159
+ icon="cross"
160
+ aria-label={`Close ${spectrum.name}`}
161
+ tooltipProps={{ ...rowTooltipProps, content: 'Close this spectrum' }}
162
+ onClick={() => actions.removeSpectrum(spectrum.id)}
163
+ />
164
+ </li>
165
+ );
166
+ }
167
+
168
+ /**
169
+ * What a click on a trace icon would do, said as a sentence.
170
+ *
171
+ * The three states of the icon look alike enough at 16 pixels that the cycle is
172
+ * actually learned from the tooltip, so each one says what the click does rather
173
+ * than what the icon means — including that picking one trace puts the other
174
+ * away, which is the part a reader would otherwise discover by surprise.
175
+ * @param kind - The trace the icon stands for.
176
+ * @param state - What the icon is saying.
177
+ * @returns The tooltip.
178
+ */
179
+ function traceTooltip(kind: MassTraceKind, state: TraceIconState): string {
180
+ const trace =
181
+ kind === 'profile' ? 'the continuous trace' : 'the centroid sticks';
182
+ const other =
183
+ kind === 'profile' ? 'the centroid sticks' : 'the continuous trace';
184
+ if (state === 'hidden') {
185
+ return `Draw ${trace} instead of ${other}, and work on this spectrum`;
186
+ }
187
+ if (state === 'drawn') {
188
+ return 'Work on this spectrum — its peaks are the ones labelled';
189
+ }
190
+ return 'Take this spectrum off the chart';
191
+ }
192
+
193
+ /**
194
+ * How a tooltip behaves on a control that sits in a list: a hand crossing forty
195
+ * rows passes over a hundred of these, and with no delay every one of them
196
+ * opens.
197
+ */
198
+ const rowTooltipProps = { compact: true, hoverOpenDelay: 300 } as const;
199
+
200
+ const rowStyle = {
201
+ display: 'flex',
202
+ alignItems: 'center',
203
+ gap: 2,
204
+ padding: '0 2px',
205
+ borderRadius: 3,
206
+ } as const;
207
+
208
+ /** The selected row, which is the one every other panel is about. */
209
+ const selectedRowStyle = { ...rowStyle, background: '#e8f1fb' } as const;
210
+
211
+ const nameStyle = {
212
+ display: 'flex',
213
+ flexDirection: 'column',
214
+ alignItems: 'flex-start',
215
+ gap: 1,
216
+ flex: '1 1 1px',
217
+ minWidth: 0,
218
+ padding: '1px 2px',
219
+ border: 'none',
220
+ background: 'none',
221
+ color: 'inherit',
222
+ font: 'inherit',
223
+ textAlign: 'left',
224
+ cursor: 'pointer',
225
+ } as const;
226
+
227
+ /** One line, cut short rather than wrapped: the rows stay a fixed height. */
228
+ const nameTextStyle = {
229
+ maxWidth: '100%',
230
+ fontSize: 12,
231
+ fontWeight: 600,
232
+ lineHeight: 1.2,
233
+ overflow: 'hidden',
234
+ textOverflow: 'ellipsis',
235
+ whiteSpace: 'nowrap',
236
+ } as const;
237
+
238
+ const subtitleStyle = {
239
+ maxWidth: '100%',
240
+ fontSize: 10,
241
+ lineHeight: 1.2,
242
+ opacity: 0.7,
243
+ overflow: 'hidden',
244
+ textOverflow: 'ellipsis',
245
+ whiteSpace: 'nowrap',
246
+ } as const;
@@ -0,0 +1,119 @@
1
+ import { xyReduce, xyReduceNonContinuous } from 'ml-spectra-processing';
2
+ import type { ReactElement } from 'react';
3
+ import { useMemo } from 'react';
4
+
5
+ import type { PlotRect } from '../../chart/core/chartGeometry.ts';
6
+ import type { ChartScale } from '../../chart/core/chartScale.ts';
7
+ import { chartValue } from '../../chart/core/chartScale.ts';
8
+ import { profilePath, stickPath } from '../../chart/core/tracePath.ts';
9
+ import type { MassSpectrum } from '../core/massSpectrum.ts';
10
+
11
+ export interface SpectrumTraceProps {
12
+ /** The spectrum, which says in itself which of its traces are drawn. */
13
+ spectrum: MassSpectrum;
14
+ /** Where the plot sits, whose width is how many points are worth drawing. */
15
+ plot: PlotRect;
16
+ /**
17
+ * The m/z axis as it is currently zoomed. It must be stable while the window
18
+ * is — a scale rebuilt on every render rebuilds both paths with it, and a
19
+ * profile scan reduced afresh on each pointer move is what makes a chart
20
+ * stutter under the hand.
21
+ */
22
+ xScale: ChartScale;
23
+ /** The intensity axis as it is currently zoomed, and the same requirement. */
24
+ yScale: ChartScale;
25
+ /**
26
+ * How thick both traces are drawn, in pixels.
27
+ * @default 1
28
+ */
29
+ strokeWidth?: number;
30
+ }
31
+
32
+ /**
33
+ * One spectrum, drawn as at most two paths in its own colour.
34
+ *
35
+ * The window the traces are reduced to is read back off the scale rather than
36
+ * passed in beside it, so the reduction can never have been computed for a
37
+ * window other than the one being drawn — the two would disagree for exactly
38
+ * one render after a zoom, which is the render the eye catches.
39
+ *
40
+ * A measured profile is reduced to the pixel columns it will occupy, keeping
41
+ * the extremes of each column so the noise still looks like noise. A
42
+ * **calculated** trace is never reduced: an isotopic distribution is emitted as
43
+ * a stick with an explicit zero either side of it, a reducer takes the zeros for
44
+ * the flat stretches they look like and drops them, and the line then runs from
45
+ * peak top to peak top without ever coming back to the baseline. The centroid is
46
+ * reduced against the current view too: a peak table of fifty thousand sticks
47
+ * has no more than one per pixel column to show, and which peak wins a column
48
+ * changes with every zoom.
49
+ * @param props - Component props.
50
+ * @returns The spectrum, as SVG.
51
+ */
52
+ export function SpectrumTrace(props: SpectrumTraceProps): ReactElement {
53
+ const { spectrum, plot, xScale, yScale, strokeWidth = TRACE_WIDTH } = props;
54
+ const { profile, centroid, origin, color, showProfile, showCentroid } =
55
+ spectrum;
56
+
57
+ const from = chartValue(xScale, plot.left);
58
+ const to = chartValue(xScale, plot.right);
59
+ const columns = Math.max(2, Math.round(plot.width));
60
+
61
+ const profileD = useMemo(() => {
62
+ if (!showProfile || profile === null || profile.x.length === 0) return '';
63
+ const drawn =
64
+ origin.format === 'calculated'
65
+ ? profile
66
+ : xyReduce(profile, {
67
+ from,
68
+ to,
69
+ nbPoints: columns * PROFILE_POINTS_PER_COLUMN,
70
+ });
71
+ return profilePath(drawn.x, drawn.y, xScale, yScale);
72
+ }, [showProfile, profile, origin.format, from, to, columns, xScale, yScale]);
73
+
74
+ const centroidD = useMemo(() => {
75
+ if (!showCentroid || centroid.x.length === 0) return '';
76
+ const drawn = xyReduceNonContinuous(centroid, {
77
+ from,
78
+ to,
79
+ maxApproximateNbPoints: columns,
80
+ });
81
+ return stickPath(drawn.x, drawn.y, xScale, yScale);
82
+ }, [showCentroid, centroid, from, to, columns, xScale, yScale]);
83
+
84
+ return (
85
+ <g pointerEvents="none">
86
+ {profileD === '' ? null : (
87
+ <path
88
+ d={profileD}
89
+ fill="none"
90
+ stroke={color}
91
+ strokeWidth={strokeWidth}
92
+ strokeLinejoin="round"
93
+ />
94
+ )}
95
+ {centroidD === '' ? null : (
96
+ <path
97
+ d={centroidD}
98
+ fill="none"
99
+ stroke={color}
100
+ strokeWidth={strokeWidth}
101
+ />
102
+ )}
103
+ </g>
104
+ );
105
+ }
106
+
107
+ /** How thick a trace is when nobody asks for anything else. */
108
+ const TRACE_WIDTH = 1;
109
+
110
+ /**
111
+ * How many reduced samples each pixel column of a profile is given.
112
+ *
113
+ * The reduction keeps the lowest and the highest sample of every slot, so two
114
+ * per column is the least that draws a column at all — and `xyReduce` asks for
115
+ * about four times what is displayed before a narrow peak survives at its true
116
+ * height rather than at the height of whichever sample the slot boundary
117
+ * happened to land on.
118
+ */
119
+ const PROFILE_POINTS_PER_COLUMN = 4;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The mass spectrum chart, the panels beside it and the editor they sit in.
3
+ *
4
+ * `MassChart` is the drawing and holds nothing: it takes spectra, what to label
5
+ * and a window as props and hands every gesture back, so it fits a report page
6
+ * or a test as readily as an editor. The chart's own drawing — scales, ticks,
7
+ * plot geometry, the zoom gestures and the label placement — is the shared
8
+ * chart layer, which every viewer of the family draws with.
9
+ */
10
+
11
+ export type { MassAboutDialogProps } from './MassAboutDialog.tsx';
12
+ export { MassAboutDialog } from './MassAboutDialog.tsx';
13
+ export type { MassCanvasProps } from './MassCanvas.tsx';
14
+ export { MassCanvas } from './MassCanvas.tsx';
15
+ export { MassChart } from './MassChart.tsx';
16
+ export type { MassCommandProviderProps } from './MassCommandProvider.tsx';
17
+ export { MassCommandProvider } from './MassCommandProvider.tsx';
18
+ export type { MassCommandTooltipProps } from './MassCommandTooltip.tsx';
19
+ export { MassCommandTooltip } from './MassCommandTooltip.tsx';
20
+ export type { MassDocumentationDialogProps } from './MassDocumentationDialog.tsx';
21
+ export { MassDocumentationDialog } from './MassDocumentationDialog.tsx';
22
+ export type { MassEditorProps } from './MassEditor.tsx';
23
+ export { MassEditor } from './MassEditor.tsx';
24
+ export { MassHeader } from './MassHeader.tsx';
25
+ export type { MassLogoProps } from './MassLogo.tsx';
26
+ export { MassLogo } from './MassLogo.tsx';
27
+ export type { MassPointerTrackerProps } from './MassPointerTracker.tsx';
28
+ export { MassPointerTracker } from './MassPointerTracker.tsx';
29
+ export type { MassSidePanelProps } from './MassSidePanel.tsx';
30
+ export { MassSidePanel } from './MassSidePanel.tsx';
31
+ export type { MassStateProviderProps } from './MassStateProvider.tsx';
32
+ export { MassStateProvider } from './MassStateProvider.tsx';
33
+ export { MassStatusBar } from './MassStatusBar.tsx';
34
+ export type { MassToolbarProps } from './MassToolbar.tsx';
35
+ export { MassToolbar } from './MassToolbar.tsx';
36
+ export type { MassMetadataProps } from './MetadataPanel.tsx';
37
+ export { MassMetadata, MetadataPanel } from './MetadataPanel.tsx';
38
+ export type { MzDecimalsMenuProps } from './MzDecimalsMenu.tsx';
39
+ export { MzDecimalsMenu } from './MzDecimalsMenu.tsx';
40
+ export type { PeakLabelsProps } from './PeakLabels.tsx';
41
+ export { PeakLabels } from './PeakLabels.tsx';
42
+ export type { PeakSortKey, PeakTableProps } from './PeakTable.tsx';
43
+ export { PeakTable } from './PeakTable.tsx';
44
+ export type { PeaksPanelProps } from './PeaksPanel.tsx';
45
+ export { PeaksPanel } from './PeaksPanel.tsx';
46
+ export { SpectraPanel } from './SpectraPanel.tsx';
47
+ export type { SpectrumRowProps } from './SpectrumRow.tsx';
48
+ export { SpectrumRow } from './SpectrumRow.tsx';
49
+ export type { SpectrumTraceProps } from './SpectrumTrace.tsx';
50
+ export { SpectrumTrace } from './SpectrumTrace.tsx';
51
+ export type { MassEditorActions } from './massActions.ts';
52
+ export { createMassActions } from './massActions.ts';
53
+ export type { MassChartProps } from './massChartProps.ts';
54
+ export type { MassCommandContextValue } from './massCommandContext.tsx';
55
+ export { useMassCommand, useMassCommandProps } from './massCommandContext.tsx';
56
+ export type { MassHostPanel, MassStackPanel } from './massHostPanels.ts';
57
+ export { isMassHostPanel, massStackPanels } from './massHostPanels.ts';
58
+ export { useMassActions, useMassEditorState } from './massStateContext.ts';
59
+ export type { IntensityZoom } from './useIntensityZoom.ts';
60
+ export { useIntensityZoom } from './useIntensityZoom.ts';
61
+ export type { MassEditorApi, UseMassEditorOptions } from './useMassEditor.ts';
62
+ export { useMassEditor } from './useMassEditor.ts';
63
+ export type { MassFiles } from './useMassFiles.ts';
64
+ export { useMassFiles } from './useMassFiles.ts';
65
+ export type { MassPointerOptions, MassReadout } from './useMassPointer.ts';
66
+ export { sameMassReadout, useMassPointer } from './useMassPointer.ts';
67
+ export { useMassShortcuts } from './useMassShortcuts.ts';
68
+ export type { MassZoomClick, MassZoomOptions } from './useMassZoom.ts';
69
+ export { useMassZoom } from './useMassZoom.ts';