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,32 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ import { massActionsContext, massStateContext } from './massStateContext.ts';
4
+ import type { MassEditorApi } from './useMassEditor.ts';
5
+
6
+ export interface MassStateProviderProps {
7
+ /** The viewer's state, as `useMassEditor` holds it. */
8
+ editor: MassEditorApi;
9
+ /** The viewer. */
10
+ children: ReactNode;
11
+ }
12
+
13
+ /**
14
+ * Put one viewer's state where its panels can reach it.
15
+ *
16
+ * The state and the actions go into separate contexts on purpose — see
17
+ * `massStateContext.ts` for why — and the actions are handed over as they are,
18
+ * since `useMassEditor` already keeps them stable for the life of the viewer.
19
+ * @param props - Component props.
20
+ * @returns The provider.
21
+ */
22
+ export function MassStateProvider(props: MassStateProviderProps) {
23
+ const { editor, children } = props;
24
+
25
+ return (
26
+ <massStateContext.Provider value={editor}>
27
+ <massActionsContext.Provider value={editor.actions}>
28
+ {children}
29
+ </massActionsContext.Provider>
30
+ </massStateContext.Provider>
31
+ );
32
+ }
@@ -0,0 +1,108 @@
1
+ import { Icon } from '@blueprintjs/core';
2
+
3
+ import {
4
+ countLabel,
5
+ statusBarStyle as barStyle,
6
+ statusItemStyle as itemStyle,
7
+ statusMutedStyle as mutedStyle,
8
+ statusSpacerStyle as spacerStyle,
9
+ } from '../../panel/core/statusBar.ts';
10
+ import {
11
+ formatMzRange,
12
+ resolutionLabel,
13
+ resolvingPowerLabel,
14
+ } from '../core/massFormat.ts';
15
+ import { resolutionOf } from '../core/resolutionOf.ts';
16
+
17
+ import { useMassEditorState } from './massStateContext.ts';
18
+
19
+ /**
20
+ * The one line under the chart: what is drawn, what it resolves, what went
21
+ * wrong.
22
+ *
23
+ * Everything in it is derived, so it is the cheapest place in the viewer to
24
+ * answer "did that work" — how many spectra are drawn of those open, how many
25
+ * peaks the selected one holds and between which masses, and whether it is a
26
+ * high-resolution spectrum, with the resolving power where one was measured.
27
+ *
28
+ * The refusal is last and is the only red in the shell, so the eye that has just
29
+ * dropped something and seen nothing happen lands on the reason.
30
+ * @returns The status bar.
31
+ */
32
+ export function MassStatusBar() {
33
+ const { state, visibleSpectra, selectedSpectrum, mzDecimals } =
34
+ useMassEditorState();
35
+ const { spectra } = state.data;
36
+ const { error, tool } = state.view;
37
+
38
+ const resolution =
39
+ selectedSpectrum === null ? null : resolutionOf(selectedSpectrum);
40
+ const range =
41
+ selectedSpectrum === null
42
+ ? ''
43
+ : formatMzRange(selectedSpectrum.centroid.x, mzDecimals);
44
+
45
+ return (
46
+ <div style={barStyle}>
47
+ <span style={itemStyle}>
48
+ {spectra.length === 0
49
+ ? 'no spectrum open — drop a JCAMP-DX or a text file on the chart'
50
+ : `${countLabel(visibleSpectra.length, 'spectrum', 'spectra')} drawn of ${spectra.length}`}
51
+ </span>
52
+
53
+ {selectedSpectrum === null ? null : (
54
+ <span style={nameStyle} title={selectedSpectrum.name}>
55
+ {selectedSpectrum.name}
56
+ </span>
57
+ )}
58
+
59
+ {resolution === null ? null : (
60
+ <span style={itemStyle}>
61
+ {resolutionLabel(resolution)}
62
+ {resolution.resolvingPower === null
63
+ ? null
64
+ : ` (${resolvingPowerLabel(resolution.resolvingPower)})`}
65
+ </span>
66
+ )}
67
+
68
+ {selectedSpectrum === null ? null : (
69
+ <span style={itemStyle}>
70
+ {countLabel(selectedSpectrum.centroid.x.length, 'peak', 'peaks')}
71
+ </span>
72
+ )}
73
+
74
+ {range === '' ? null : <span style={mutedStyle}>m/z {range}</span>}
75
+
76
+ {tool === 'box' ? (
77
+ <span style={mutedStyle}>square zoom: drag a rectangle</span>
78
+ ) : null}
79
+
80
+ <span style={spacerStyle} />
81
+
82
+ {error === null ? null : (
83
+ <span style={errorStyle} title={error}>
84
+ <Icon icon="warning-sign" size={12} />
85
+ {error}
86
+ </span>
87
+ )}
88
+ </div>
89
+ );
90
+ }
91
+
92
+ const nameStyle = {
93
+ ...itemStyle,
94
+ overflow: 'hidden',
95
+ textOverflow: 'ellipsis',
96
+ maxWidth: '32%',
97
+ fontWeight: 600,
98
+ } as const;
99
+
100
+ /** The one red in the shell: a refusal, and nothing else, is written in it. */
101
+ const errorStyle = {
102
+ ...itemStyle,
103
+ gap: 4,
104
+ color: '#C0392B',
105
+ overflow: 'hidden',
106
+ textOverflow: 'ellipsis',
107
+ maxWidth: '60%',
108
+ } as const;
@@ -0,0 +1,120 @@
1
+ import { Toolbar } from 'react-science/ui';
2
+
3
+ import type { FigureDownloadState } from '../../download/ui/useFigureDownload.tsx';
4
+
5
+ import { useMassCommandProps } from './massCommandContext.tsx';
6
+ import { useMassEditorState } from './massStateContext.ts';
7
+
8
+ /** What {@link MassToolbar} needs. */
9
+ export interface MassToolbarProps {
10
+ /**
11
+ * The "Save figure" panel the picture button opens.
12
+ * @default undefined — the button only runs the `exportImage` command
13
+ */
14
+ figure?: FigureDownloadState;
15
+ }
16
+
17
+ /**
18
+ * The tools, down the left of the chart.
19
+ *
20
+ * Only what is done to the spectra: what is asked of the viewer itself — the
21
+ * mark, help, full screen — is in the header. Opening files comes first,
22
+ * because nothing else does anything until a spectrum is open; then the
23
+ * **tools**, read and square zoom, which say what a drag is running; then the
24
+ * zoom commands that act at once; then what the chart writes over the peaks.
25
+ * Closing every spectrum is last and alone, being the only one that throws
26
+ * something away.
27
+ * @param props - Component props.
28
+ * @returns The toolbar.
29
+ */
30
+ export function MassToolbar(props: MassToolbarProps) {
31
+ const { figure } = props;
32
+ const { state, selectedSpectrum } = useMassEditorState();
33
+ const command = useMassCommandProps();
34
+ const { spectra } = state.data;
35
+ const { domain, tool } = state.view;
36
+ const { showLabels, showCharges } = state.settings;
37
+
38
+ const isEmpty = spectra.length === 0;
39
+ // The popover opens the panel itself, so the command's own click is left out.
40
+ const exportCommand = command('exportImage');
41
+
42
+ return (
43
+ // `collapse`, not the default `wrap`: a wrapping vertical toolbar measures
44
+ // itself and writes the result back as an inline width, so in a row short of
45
+ // space it settles at half an icon and stays there.
46
+ <Toolbar vertical overflow="collapse" aria-label="Mass spectrum tools">
47
+ <Toolbar.Item icon="folder-open" {...command('openFiles')} />
48
+
49
+ <Toolbar.Item
50
+ icon="arrows-horizontal"
51
+ active={tool === 'read'}
52
+ {...command('readTool')}
53
+ disabled={isEmpty}
54
+ />
55
+ <Toolbar.Item
56
+ icon="select"
57
+ active={tool === 'box'}
58
+ {...command('boxTool')}
59
+ disabled={isEmpty}
60
+ />
61
+
62
+ <Toolbar.Item icon="zoom-in" {...command('zoomIn')} disabled={isEmpty} />
63
+ <Toolbar.Item
64
+ icon="zoom-out"
65
+ {...command('zoomOut')}
66
+ disabled={isEmpty}
67
+ />
68
+ <Toolbar.Item
69
+ icon="zoom-to-fit"
70
+ {...command('resetZoom')}
71
+ disabled={domain === null}
72
+ />
73
+
74
+ <Toolbar.Item
75
+ icon="label"
76
+ active={showLabels}
77
+ {...command('toggleLabels')}
78
+ disabled={selectedSpectrum === null}
79
+ />
80
+ <Toolbar.Item
81
+ icon="numerical"
82
+ active={showCharges}
83
+ {...command('toggleCharges')}
84
+ disabled={!showLabels || selectedSpectrum === null}
85
+ />
86
+
87
+ {/* What the chart looks like right now is what a figure is of — the
88
+ window it was dragged to and the labels written over its peaks — so
89
+ the picture is taken here rather than rebuilt from the spectra. */}
90
+ {figure === undefined ? (
91
+ <Toolbar.Item
92
+ icon="media"
93
+ {...command('exportImage')}
94
+ disabled={isEmpty}
95
+ />
96
+ ) : (
97
+ <Toolbar.PopoverItem
98
+ isOpen={figure.isOpen}
99
+ onInteraction={figure.setOpen}
100
+ content={figure.panel}
101
+ disabled={isEmpty}
102
+ itemProps={{
103
+ icon: 'media',
104
+ tooltip: exportCommand.tooltip,
105
+ 'aria-label': exportCommand['aria-label'],
106
+ active: figure.isOpen,
107
+ disabled: isEmpty,
108
+ }}
109
+ />
110
+ )}
111
+
112
+ <Toolbar.Item
113
+ icon="trash"
114
+ intent="danger"
115
+ {...command('clear')}
116
+ disabled={isEmpty}
117
+ />
118
+ </Toolbar>
119
+ );
120
+ }
@@ -0,0 +1,201 @@
1
+ import { useMemo, useState } from 'react';
2
+ import { MF } from 'react-mf';
3
+ import { Toolbar } from 'react-science/ui';
4
+
5
+ import {
6
+ labelStyle,
7
+ panelBodyStyle,
8
+ panelEmptyStyle,
9
+ panelStyle,
10
+ panelToolbarStyle,
11
+ } from '../../panel/core/panelStyles.ts';
12
+ import type { MassSpectrum } from '../core/massSpectrum.ts';
13
+ import {
14
+ spectrumMetaRows,
15
+ spectrumResolutionRows,
16
+ } from '../core/massSummary.ts';
17
+
18
+ import { useMassEditorState } from './massStateContext.ts';
19
+
20
+ /**
21
+ * The acquisition panel of the viewer, about whichever spectrum is selected.
22
+ * @returns The panel.
23
+ */
24
+ export function MetadataPanel() {
25
+ const { selectedSpectrum, mzDecimals } = useMassEditorState();
26
+ return <MassMetadata spectrum={selectedSpectrum} mzDecimals={mzDecimals} />;
27
+ }
28
+
29
+ export interface MassMetadataProps {
30
+ /** The spectrum the panel is about, `null` when none is selected. */
31
+ spectrum: MassSpectrum | null;
32
+ /**
33
+ * How many decimals its masses are written with.
34
+ * @default 4
35
+ */
36
+ mzDecimals?: number;
37
+ }
38
+
39
+ /**
40
+ * How a spectrum was acquired, as the file stated it, and what the viewer
41
+ * found out about it — for any viewer, whatever state it keeps the spectrum in.
42
+ *
43
+ * Every row the file wrote is a fact it actually wrote: the reader leaves out
44
+ * whatever was blank rather than showing it as a dash, so a short table means a
45
+ * terse file and not a bug. The order is the reader's — source, instrument,
46
+ * analyser, ionization, polarity, energy, and on down to who ran it — because
47
+ * that is the order a method is read in. A file that wrote nothing gets the
48
+ * facts true of every spectrum instead, a pasted one included: which file and
49
+ * format it came from, how many peaks it holds and between which masses.
50
+ *
51
+ * Under either comes whether it is a high-resolution measurement, with how that
52
+ * was decided, since a verdict read off the decimals of a peak table is a
53
+ * weaker claim than one measured on the widths of its peaks.
54
+ * @param props - Component props.
55
+ * @returns The panel.
56
+ */
57
+ export function MassMetadata(props: MassMetadataProps) {
58
+ const { spectrum: selectedSpectrum, mzDecimals } = props;
59
+ const [showConditions, setShowConditions] = useState(false);
60
+
61
+ const meta = selectedSpectrum?.meta ?? null;
62
+ const conditions = meta?.conditions ?? null;
63
+ const title = meta?.title ?? null;
64
+ const molecularFormula = meta?.molecularFormula ?? null;
65
+
66
+ // The whole viewer re-renders on every drag of the chart, and the rows only
67
+ // change when the selected spectrum does.
68
+ const rows = useMemo(
69
+ () =>
70
+ selectedSpectrum === null
71
+ ? []
72
+ : [
73
+ ...spectrumMetaRows(selectedSpectrum, mzDecimals),
74
+ ...spectrumResolutionRows(selectedSpectrum),
75
+ ],
76
+ [selectedSpectrum, mzDecimals],
77
+ );
78
+
79
+ return (
80
+ <div style={panelStyle}>
81
+ <div style={panelToolbarStyle}>
82
+ <Toolbar aria-label="Acquisition">
83
+ <Toolbar.Item
84
+ icon="align-left"
85
+ active={showConditions}
86
+ disabled={conditions === null}
87
+ tooltip={
88
+ conditions === null
89
+ ? 'This file carried no scan description of its own'
90
+ : "Show the instrument's own scan description, as it was written"
91
+ }
92
+ aria-label="Show the scan description"
93
+ onClick={() => setShowConditions(!showConditions)}
94
+ />
95
+ </Toolbar>
96
+ </div>
97
+
98
+ <div style={panelBodyStyle}>
99
+ {selectedSpectrum === null ? (
100
+ <p style={panelEmptyStyle}>
101
+ No spectrum is selected. Click one in the Spectra panel and what its
102
+ file said about the acquisition appears here.
103
+ </p>
104
+ ) : (
105
+ <>
106
+ {title === null ? null : <div style={titleStyle}>{title}</div>}
107
+ {meta === null ? (
108
+ <p style={panelEmptyStyle}>
109
+ This file carried no acquisition metadata, so this is what the
110
+ viewer knows about it.
111
+ </p>
112
+ ) : null}
113
+ <table style={tableStyle}>
114
+ <tbody>
115
+ {molecularFormula === null ? null : (
116
+ <tr>
117
+ <th scope="row" style={rowLabelStyle}>
118
+ Formula
119
+ </th>
120
+ <td style={rowValueStyle}>
121
+ {/* Never the raw string: `C8H10N4O2` is only a formula
122
+ once its digits are subscripts. */}
123
+ <MF mf={molecularFormula} />
124
+ </td>
125
+ </tr>
126
+ )}
127
+ {rows.map((row) => (
128
+ <tr key={row.label}>
129
+ <th scope="row" style={rowLabelStyle}>
130
+ {row.label}
131
+ </th>
132
+ <td style={rowValueStyle}>{row.value}</td>
133
+ </tr>
134
+ ))}
135
+ </tbody>
136
+ </table>
137
+
138
+ {conditions === null || !showConditions ? null : (
139
+ <div>
140
+ <div style={labelStyle}>Scan description</div>
141
+ <pre style={conditionsStyle}>{conditions}</pre>
142
+ </div>
143
+ )}
144
+ </>
145
+ )}
146
+ </div>
147
+ </div>
148
+ );
149
+ }
150
+
151
+ /** What the file calls the spectrum, which is rarely what the list calls it. */
152
+ const titleStyle = {
153
+ fontSize: 12,
154
+ fontWeight: 600,
155
+ lineHeight: 1.3,
156
+ wordBreak: 'break-word',
157
+ } as const;
158
+
159
+ const tableStyle = {
160
+ width: '100%',
161
+ fontSize: 12,
162
+ borderCollapse: 'collapse',
163
+ } as const;
164
+
165
+ /**
166
+ * The label column is as narrow as it can be and the value takes the rest: the
167
+ * labels are short and known, and it is the values a file surprises you with.
168
+ */
169
+ const rowLabelStyle = {
170
+ width: '1%',
171
+ padding: '2px 8px 2px 0',
172
+ textAlign: 'left',
173
+ fontWeight: 600,
174
+ whiteSpace: 'nowrap',
175
+ verticalAlign: 'top',
176
+ opacity: 0.7,
177
+ } as const;
178
+
179
+ const rowValueStyle = {
180
+ padding: '2px 0',
181
+ verticalAlign: 'top',
182
+ wordBreak: 'break-word',
183
+ } as const;
184
+
185
+ /**
186
+ * Kept verbatim, wrapping rather than scrolling sideways: a Thermo scan filter
187
+ * is one long line that says more about the acquisition than the structured
188
+ * records do, and half of it off the edge of a panel is half a method.
189
+ */
190
+ const conditionsStyle = {
191
+ margin: 0,
192
+ padding: 6,
193
+ borderRadius: 3,
194
+ background: 'rgba(17, 20, 24, 0.06)',
195
+ fontFamily: 'monospace',
196
+ fontSize: 11,
197
+ lineHeight: 1.35,
198
+ whiteSpace: 'pre-wrap',
199
+ wordBreak: 'break-word',
200
+ userSelect: 'all',
201
+ } as const;
@@ -0,0 +1,86 @@
1
+ import { Menu, MenuItem } from '@blueprintjs/core';
2
+ import type { ReactElement } from 'react';
3
+ import { Toolbar } from 'react-science/ui';
4
+
5
+ import type { MzDecimalsSetting } from '../core/mzDecimalsSetting.ts';
6
+ import { MAXIMUM_MZ_DECIMALS } from '../core/mzDecimalsSetting.ts';
7
+
8
+ export interface MzDecimalsMenuProps {
9
+ /** What is chosen, `'auto'` while nothing is. */
10
+ setting: MzDecimalsSetting;
11
+ /**
12
+ * How many decimals `'auto'` comes to for the spectra in view, which the
13
+ * entry for it says, so choosing nothing is not a choice made blind.
14
+ */
15
+ autoDecimals: number;
16
+ /** Called with what was picked. */
17
+ onChange: (setting: MzDecimalsSetting) => void;
18
+ }
19
+
20
+ /**
21
+ * How many decimals the masses are written with, picked from a panel toolbar.
22
+ *
23
+ * The first entry leaves it to the spectra — high-resolution masses or nominal
24
+ * ones, as each spectrum's resolution says — and the rest fix a number for
25
+ * every mass on screen at once: chart, crosshair, tables. A list rather than a
26
+ * stepper, because the useful answers are few and a reader picking one wants
27
+ * to see them side by side; the button is lit while a number overrides the
28
+ * spectra, so a chart written to fewer decimals than it resolves never looks
29
+ * like one that resolves no more.
30
+ * @param props - Component props.
31
+ * @returns The toolbar item and its menu.
32
+ */
33
+ export function MzDecimalsMenu(props: MzDecimalsMenuProps): ReactElement {
34
+ const { setting, autoDecimals, onChange } = props;
35
+
36
+ return (
37
+ <Toolbar.PopoverItem
38
+ itemProps={{
39
+ icon: 'floating-point',
40
+ tooltip: LABEL,
41
+ 'aria-label': LABEL,
42
+ active: setting !== 'auto',
43
+ }}
44
+ content={
45
+ <Menu aria-label={LABEL}>
46
+ <MenuItem
47
+ roleStructure="listoption"
48
+ selected={setting === 'auto'}
49
+ text={`Automatic — by resolution (now ${decimalsText(autoDecimals)})`}
50
+ onClick={() => onChange('auto')}
51
+ />
52
+ {CHOICES.map((decimals) => (
53
+ <MenuItem
54
+ key={decimals}
55
+ roleStructure="listoption"
56
+ selected={setting === decimals}
57
+ text={
58
+ decimals === 0
59
+ ? 'Nominal mass (0 decimals)'
60
+ : decimalsText(decimals)
61
+ }
62
+ onClick={() => onChange(decimals)}
63
+ />
64
+ ))}
65
+ </Menu>
66
+ }
67
+ />
68
+ );
69
+ }
70
+
71
+ const LABEL = 'Decimals of the masses';
72
+
73
+ /** Every number that can be chosen, from the nominal mass up. */
74
+ const CHOICES = Array.from(
75
+ { length: MAXIMUM_MZ_DECIMALS + 1 },
76
+ (_, decimals) => decimals,
77
+ );
78
+
79
+ /**
80
+ * A number of decimals, as the menu says it.
81
+ * @param decimals - How many.
82
+ * @returns `1 decimal`, or `n decimals`.
83
+ */
84
+ function decimalsText(decimals: number): string {
85
+ return decimals === 1 ? '1 decimal' : `${decimals} decimals`;
86
+ }