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,100 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { MF } from 'react-mf';
4
+ import { Toolbar } from 'react-science/ui';
5
+ import { labelStyle, panelBodyStyle, panelEmptyStyle, panelStyle, panelToolbarStyle, } from "../../panel/core/panelStyles.js";
6
+ import { spectrumMetaRows, spectrumResolutionRows, } from "../core/massSummary.js";
7
+ import { useMassEditorState } from "./massStateContext.js";
8
+ /**
9
+ * The acquisition panel of the viewer, about whichever spectrum is selected.
10
+ * @returns The panel.
11
+ */
12
+ export function MetadataPanel() {
13
+ const { selectedSpectrum, mzDecimals } = useMassEditorState();
14
+ return _jsx(MassMetadata, { spectrum: selectedSpectrum, mzDecimals: mzDecimals });
15
+ }
16
+ /**
17
+ * How a spectrum was acquired, as the file stated it, and what the viewer
18
+ * found out about it — for any viewer, whatever state it keeps the spectrum in.
19
+ *
20
+ * Every row the file wrote is a fact it actually wrote: the reader leaves out
21
+ * whatever was blank rather than showing it as a dash, so a short table means a
22
+ * terse file and not a bug. The order is the reader's — source, instrument,
23
+ * analyser, ionization, polarity, energy, and on down to who ran it — because
24
+ * that is the order a method is read in. A file that wrote nothing gets the
25
+ * facts true of every spectrum instead, a pasted one included: which file and
26
+ * format it came from, how many peaks it holds and between which masses.
27
+ *
28
+ * Under either comes whether it is a high-resolution measurement, with how that
29
+ * was decided, since a verdict read off the decimals of a peak table is a
30
+ * weaker claim than one measured on the widths of its peaks.
31
+ * @param props - Component props.
32
+ * @returns The panel.
33
+ */
34
+ export function MassMetadata(props) {
35
+ const { spectrum: selectedSpectrum, mzDecimals } = props;
36
+ const [showConditions, setShowConditions] = useState(false);
37
+ const meta = selectedSpectrum?.meta ?? null;
38
+ const conditions = meta?.conditions ?? null;
39
+ const title = meta?.title ?? null;
40
+ const molecularFormula = meta?.molecularFormula ?? null;
41
+ // The whole viewer re-renders on every drag of the chart, and the rows only
42
+ // change when the selected spectrum does.
43
+ const rows = useMemo(() => selectedSpectrum === null
44
+ ? []
45
+ : [
46
+ ...spectrumMetaRows(selectedSpectrum, mzDecimals),
47
+ ...spectrumResolutionRows(selectedSpectrum),
48
+ ], [selectedSpectrum, mzDecimals]);
49
+ return (_jsxs("div", { style: panelStyle, children: [_jsx("div", { style: panelToolbarStyle, children: _jsx(Toolbar, { "aria-label": "Acquisition", children: _jsx(Toolbar.Item, { icon: "align-left", active: showConditions, disabled: conditions === null, tooltip: conditions === null
50
+ ? 'This file carried no scan description of its own'
51
+ : "Show the instrument's own scan description, as it was written", "aria-label": "Show the scan description", onClick: () => setShowConditions(!showConditions) }) }) }), _jsx("div", { style: panelBodyStyle, children: selectedSpectrum === null ? (_jsx("p", { style: panelEmptyStyle, children: "No spectrum is selected. Click one in the Spectra panel and what its file said about the acquisition appears here." })) : (_jsxs(_Fragment, { children: [title === null ? null : _jsx("div", { style: titleStyle, children: title }), meta === null ? (_jsx("p", { style: panelEmptyStyle, children: "This file carried no acquisition metadata, so this is what the viewer knows about it." })) : null, _jsx("table", { style: tableStyle, children: _jsxs("tbody", { children: [molecularFormula === null ? null : (_jsxs("tr", { children: [_jsx("th", { scope: "row", style: rowLabelStyle, children: "Formula" }), _jsx("td", { style: rowValueStyle, children: _jsx(MF, { mf: molecularFormula }) })] })), rows.map((row) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", style: rowLabelStyle, children: row.label }), _jsx("td", { style: rowValueStyle, children: row.value })] }, row.label)))] }) }), conditions === null || !showConditions ? null : (_jsxs("div", { children: [_jsx("div", { style: labelStyle, children: "Scan description" }), _jsx("pre", { style: conditionsStyle, children: conditions })] }))] })) })] }));
52
+ }
53
+ /** What the file calls the spectrum, which is rarely what the list calls it. */
54
+ const titleStyle = {
55
+ fontSize: 12,
56
+ fontWeight: 600,
57
+ lineHeight: 1.3,
58
+ wordBreak: 'break-word',
59
+ };
60
+ const tableStyle = {
61
+ width: '100%',
62
+ fontSize: 12,
63
+ borderCollapse: 'collapse',
64
+ };
65
+ /**
66
+ * The label column is as narrow as it can be and the value takes the rest: the
67
+ * labels are short and known, and it is the values a file surprises you with.
68
+ */
69
+ const rowLabelStyle = {
70
+ width: '1%',
71
+ padding: '2px 8px 2px 0',
72
+ textAlign: 'left',
73
+ fontWeight: 600,
74
+ whiteSpace: 'nowrap',
75
+ verticalAlign: 'top',
76
+ opacity: 0.7,
77
+ };
78
+ const rowValueStyle = {
79
+ padding: '2px 0',
80
+ verticalAlign: 'top',
81
+ wordBreak: 'break-word',
82
+ };
83
+ /**
84
+ * Kept verbatim, wrapping rather than scrolling sideways: a Thermo scan filter
85
+ * is one long line that says more about the acquisition than the structured
86
+ * records do, and half of it off the edge of a panel is half a method.
87
+ */
88
+ const conditionsStyle = {
89
+ margin: 0,
90
+ padding: 6,
91
+ borderRadius: 3,
92
+ background: 'rgba(17, 20, 24, 0.06)',
93
+ fontFamily: 'monospace',
94
+ fontSize: 11,
95
+ lineHeight: 1.35,
96
+ whiteSpace: 'pre-wrap',
97
+ wordBreak: 'break-word',
98
+ userSelect: 'all',
99
+ };
100
+ //# sourceMappingURL=MetadataPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataPanel.js","sourceRoot":"","sources":["../../../src/mass/ui/MetadataPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { MzDecimalsSetting } from '../core/mzDecimalsSetting.ts';
3
+ export interface MzDecimalsMenuProps {
4
+ /** What is chosen, `'auto'` while nothing is. */
5
+ setting: MzDecimalsSetting;
6
+ /**
7
+ * How many decimals `'auto'` comes to for the spectra in view, which the
8
+ * entry for it says, so choosing nothing is not a choice made blind.
9
+ */
10
+ autoDecimals: number;
11
+ /** Called with what was picked. */
12
+ onChange: (setting: MzDecimalsSetting) => void;
13
+ }
14
+ /**
15
+ * How many decimals the masses are written with, picked from a panel toolbar.
16
+ *
17
+ * The first entry leaves it to the spectra — high-resolution masses or nominal
18
+ * ones, as each spectrum's resolution says — and the rest fix a number for
19
+ * every mass on screen at once: chart, crosshair, tables. A list rather than a
20
+ * stepper, because the useful answers are few and a reader picking one wants
21
+ * to see them side by side; the button is lit while a number overrides the
22
+ * spectra, so a chart written to fewer decimals than it resolves never looks
23
+ * like one that resolves no more.
24
+ * @param props - Component props.
25
+ * @returns The toolbar item and its menu.
26
+ */
27
+ export declare function MzDecimalsMenu(props: MzDecimalsMenuProps): ReactElement;
28
+ //# sourceMappingURL=MzDecimalsMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MzDecimalsMenu.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/MzDecimalsMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,OAAO,EAAE,iBAAiB,CAAC;IAC3B;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAChD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAoCvE"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Menu, MenuItem } from '@blueprintjs/core';
3
+ import { Toolbar } from 'react-science/ui';
4
+ import { MAXIMUM_MZ_DECIMALS } from "../core/mzDecimalsSetting.js";
5
+ /**
6
+ * How many decimals the masses are written with, picked from a panel toolbar.
7
+ *
8
+ * The first entry leaves it to the spectra — high-resolution masses or nominal
9
+ * ones, as each spectrum's resolution says — and the rest fix a number for
10
+ * every mass on screen at once: chart, crosshair, tables. A list rather than a
11
+ * stepper, because the useful answers are few and a reader picking one wants
12
+ * to see them side by side; the button is lit while a number overrides the
13
+ * spectra, so a chart written to fewer decimals than it resolves never looks
14
+ * like one that resolves no more.
15
+ * @param props - Component props.
16
+ * @returns The toolbar item and its menu.
17
+ */
18
+ export function MzDecimalsMenu(props) {
19
+ const { setting, autoDecimals, onChange } = props;
20
+ return (_jsx(Toolbar.PopoverItem, { itemProps: {
21
+ icon: 'floating-point',
22
+ tooltip: LABEL,
23
+ 'aria-label': LABEL,
24
+ active: setting !== 'auto',
25
+ }, content: _jsxs(Menu, { "aria-label": LABEL, children: [_jsx(MenuItem, { roleStructure: "listoption", selected: setting === 'auto', text: `Automatic — by resolution (now ${decimalsText(autoDecimals)})`, onClick: () => onChange('auto') }), CHOICES.map((decimals) => (_jsx(MenuItem, { roleStructure: "listoption", selected: setting === decimals, text: decimals === 0
26
+ ? 'Nominal mass (0 decimals)'
27
+ : decimalsText(decimals), onClick: () => onChange(decimals) }, decimals)))] }) }));
28
+ }
29
+ const LABEL = 'Decimals of the masses';
30
+ /** Every number that can be chosen, from the nominal mass up. */
31
+ const CHOICES = Array.from({ length: MAXIMUM_MZ_DECIMALS + 1 }, (_, decimals) => decimals);
32
+ /**
33
+ * A number of decimals, as the menu says it.
34
+ * @param decimals - How many.
35
+ * @returns `1 decimal`, or `n decimals`.
36
+ */
37
+ function decimalsText(decimals) {
38
+ return decimals === 1 ? '1 decimal' : `${decimals} decimals`;
39
+ }
40
+ //# sourceMappingURL=MzDecimalsMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MzDecimalsMenu.js","sourceRoot":"","sources":["../../../src/mass/ui/MzDecimalsMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAcnE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAElD,OAAO,CACL,KAAC,OAAO,CAAC,WAAW,IAClB,SAAS,EAAE;YACT,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,OAAO,KAAK,MAAM;SAC3B,EACD,OAAO,EACL,MAAC,IAAI,kBAAa,KAAK,aACrB,KAAC,QAAQ,IACP,aAAa,EAAC,YAAY,EAC1B,QAAQ,EAAE,OAAO,KAAK,MAAM,EAC5B,IAAI,EAAE,kCAAkC,YAAY,CAAC,YAAY,CAAC,GAAG,EACrE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAC/B,EACD,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACzB,KAAC,QAAQ,IAEP,aAAa,EAAC,YAAY,EAC1B,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAC9B,IAAI,EACF,QAAQ,KAAK,CAAC;wBACZ,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAE5B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAR5B,QAAQ,CASb,CACH,CAAC,IACG,GAET,CACH,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,wBAAwB,CAAC;AAEvC,iEAAiE;AACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,EAAE,EACnC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAC1B,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,WAAW,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,93 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { PlotRect } from '../../chart/core/chartGeometry.ts';
3
+ import type { ChartScale } from '../../chart/core/chartScale.ts';
4
+ import type { HoveredPeak } from '../core/labelStackBox.ts';
5
+ import type { MassSpectrum } from '../core/massSpectrum.ts';
6
+ export interface PeakLabelsProps {
7
+ /**
8
+ * The spectrum whose peaks are labelled. Hand it the same one that was drawn:
9
+ * a mirrored half is drawn normalised, and labels computed from the spectrum
10
+ * as measured would float above sticks of another height.
11
+ */
12
+ spectrum: MassSpectrum;
13
+ /** Where the plot sits, which is what a stack may not be pushed out of. */
14
+ plot: PlotRect;
15
+ /** The m/z axis as it is currently zoomed. */
16
+ xScale: ChartScale;
17
+ /**
18
+ * The intensity axis as it is currently zoomed. Reflect it and the labels
19
+ * follow the sticks downwards — together with `below`, which turns the stacks
20
+ * over.
21
+ */
22
+ yScale: ChartScale;
23
+ /**
24
+ * How many peaks are labelled at most, the most intense first.
25
+ * @default DEFAULT_LABEL_LIMIT
26
+ */
27
+ limit?: number;
28
+ /**
29
+ * Whether a peak whose charge was established says so.
30
+ * @default false
31
+ */
32
+ showCharges?: boolean;
33
+ /**
34
+ * How many decimals the masses on screen are written with.
35
+ * @default 4
36
+ */
37
+ mzDecimals?: number;
38
+ /**
39
+ * What explains each peak, keyed as `peakKey` keys it — the name a host
40
+ * writes on top of a stack.
41
+ * @default undefined
42
+ */
43
+ annotationLabels?: ReadonlyMap<string, string>;
44
+ /**
45
+ * Whether the stacks hang under the sticks rather than standing over them,
46
+ * which is what the lower half of a mirrored pair wants.
47
+ * @default false
48
+ */
49
+ below?: boolean;
50
+ /**
51
+ * The ink the stacks are written in — worth passing the spectrum's own colour
52
+ * on a chart holding several, where an unattributed m/z belongs to any of them.
53
+ * @default the theme's label colour
54
+ */
55
+ color?: string;
56
+ /**
57
+ * What one unit of the measured intensity is written as.
58
+ * @default 1
59
+ */
60
+ intensityScale?: number;
61
+ /**
62
+ * Called with the peak whose stack the pointer is resting on, `null` when it
63
+ * leaves. Without it the stacks answer no pointer at all.
64
+ * @default undefined
65
+ */
66
+ onHover?: (peak: HoveredPeak | null) => void;
67
+ }
68
+ /**
69
+ * The tops of the best peaks of one spectrum, and what each of them reads.
70
+ *
71
+ * Two things drawn together because they are one claim: a short mark on the tip
72
+ * of the picked peak, and the numbers written over it. The mark is the half that
73
+ * matters when the continuous trace is the one on screen — the centroid is then
74
+ * not drawn at all, and a stack of numbers floating over a peak shape says which
75
+ * region was picked but never which point of it, which is the number the stack
76
+ * is quoting. With the mark on the tip the two agree by construction.
77
+ *
78
+ * Which peaks are labelled is `planPeakLabels`'s to decide, and it follows the
79
+ * zoom: a survey of the whole spectrum labels its base peak and a few others,
80
+ * and the same spectrum zoomed onto one cluster labels every line in it. Every
81
+ * line is haloed and none of them is boxed: a number over a peak is written
82
+ * over whatever the plot has there, and the halo clears a hairline of chart from
83
+ * around each glyph, where a filled box would hide the very data it is about.
84
+ *
85
+ * The numbers take no pointer event; the room they occupy does, as one
86
+ * transparent rectangle per stack, and only when somebody asked for it — so a
87
+ * stack can be interrogated without becoming a control, while the crosshair
88
+ * underneath goes on following the pointer.
89
+ * @param props - Component props.
90
+ * @returns The marks and the labels, as SVG.
91
+ */
92
+ export declare function PeakLabels(props: PeakLabelsProps): ReactElement;
93
+ //# sourceMappingURL=PeakLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeakLabels.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/PeakLabels.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAQjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI5D,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB,2EAA2E;IAC3E,IAAI,EAAE,QAAQ,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAwH/D"}
@@ -0,0 +1,91 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { CHART_COLORS, CHART_FONT, LABEL_HALO, LABEL_QUIET, PEAK_LABEL, } from "../../chart/core/chartTheme.js";
4
+ import { planPeakLabels } from "../core/peakLabelPlan.js";
5
+ /**
6
+ * The tops of the best peaks of one spectrum, and what each of them reads.
7
+ *
8
+ * Two things drawn together because they are one claim: a short mark on the tip
9
+ * of the picked peak, and the numbers written over it. The mark is the half that
10
+ * matters when the continuous trace is the one on screen — the centroid is then
11
+ * not drawn at all, and a stack of numbers floating over a peak shape says which
12
+ * region was picked but never which point of it, which is the number the stack
13
+ * is quoting. With the mark on the tip the two agree by construction.
14
+ *
15
+ * Which peaks are labelled is `planPeakLabels`'s to decide, and it follows the
16
+ * zoom: a survey of the whole spectrum labels its base peak and a few others,
17
+ * and the same spectrum zoomed onto one cluster labels every line in it. Every
18
+ * line is haloed and none of them is boxed: a number over a peak is written
19
+ * over whatever the plot has there, and the halo clears a hairline of chart from
20
+ * around each glyph, where a filled box would hide the very data it is about.
21
+ *
22
+ * The numbers take no pointer event; the room they occupy does, as one
23
+ * transparent rectangle per stack, and only when somebody asked for it — so a
24
+ * stack can be interrogated without becoming a control, while the crosshair
25
+ * underneath goes on following the pointer.
26
+ * @param props - Component props.
27
+ * @returns The marks and the labels, as SVG.
28
+ */
29
+ export function PeakLabels(props) {
30
+ const { spectrum, plot, xScale, yScale, limit, showCharges = false, mzDecimals, annotationLabels, below = false, color = CHART_COLORS.labelText, intensityScale = 1, onHover, } = props;
31
+ const plans = useMemo(() => planPeakLabels({
32
+ spectrum,
33
+ plot,
34
+ xScale,
35
+ yScale,
36
+ showCharges,
37
+ below,
38
+ intensityScale,
39
+ ...(limit === undefined ? {} : { limit }),
40
+ ...(mzDecimals === undefined ? {} : { mzDecimals }),
41
+ ...(annotationLabels === undefined ? {} : { annotationLabels }),
42
+ }), [
43
+ spectrum,
44
+ plot,
45
+ xScale,
46
+ yScale,
47
+ limit,
48
+ showCharges,
49
+ mzDecimals,
50
+ annotationLabels,
51
+ below,
52
+ intensityScale,
53
+ ]);
54
+ // Every picked peak is marked; only the ones that kept their room are
55
+ // written, since a stack over a peak whose neighbour took the room would be
56
+ // written across that neighbour's.
57
+ const written = useMemo(() => plans.filter((plan) => Number.isFinite(plan.labelX)), [plans]);
58
+ const stackStyle = useMemo(() => ({ fill: color, fontSize: CHART_FONT.label, ...LABEL_HALO }), [color]);
59
+ const markStyle = useMemo(() => ({ stroke: color }), [color]);
60
+ return (_jsxs("g", { children: [_jsx("g", { pointerEvents: "none", style: markStyle, children: plans.map((plan) => (_jsx("line", { x1: plan.tipX, y1: plan.tipY, x2: plan.tipX, y2: below
61
+ ? plan.tipY - PEAK_LABEL.topMark
62
+ : plan.tipY + PEAK_LABEL.topMark }, plan.key))) }), _jsx("g", { pointerEvents: "none", style: stackStyle, children: written.map((plan) => (_jsx("text", { textAnchor: "middle", children: plan.lines.map((line, index) => (_jsx("tspan", { x: plan.labelX, y: plan.baselines[index], style: LINE_STYLES[line.kind], children: line.text }, line.kind))) }, plan.key))) }), onHover === undefined
63
+ ? null
64
+ : written.map((plan) => (_jsx("rect", { x: plan.box.x, y: plan.box.y, width: plan.box.width, height: plan.box.height, fill: "transparent", onPointerEnter: () => onHover({
65
+ key: plan.key,
66
+ mz: plan.peak.x,
67
+ intensity: plan.peak.y,
68
+ charge: plan.peak.charge,
69
+ x: plan.labelX,
70
+ // A card hangs off the edge of the stack facing away from the
71
+ // stick, so it never covers the peak it is about.
72
+ y: below ? plan.box.y + plan.box.height : plan.box.y,
73
+ }), onPointerLeave: () => onHover(null) }, plan.key)))] }));
74
+ }
75
+ /**
76
+ * How each line of a stack is set.
77
+ *
78
+ * Four numbers in one ink and one weight are four things said at once, and the
79
+ * eye has to read all of them to find the one it came for. So the stack is
80
+ * graded instead: the name of what the peak is carries the weight, because it is
81
+ * the only line that is an answer rather than a measurement; the m/z is written
82
+ * plain, which is what a chemist is nearly always reading; and the charge and
83
+ * the intensity are let back towards the paper.
84
+ */
85
+ const LINE_STYLES = {
86
+ annotation: { fontWeight: 600 },
87
+ charge: { fillOpacity: LABEL_QUIET },
88
+ mz: {},
89
+ intensity: { fillOpacity: LABEL_QUIET },
90
+ };
91
+ //# sourceMappingURL=PeakLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeakLabels.js","sourceRoot":"","sources":["../../../src/mass/ui/PeakLabels.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAiE1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EACJ,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,MAAM,EACN,KAAK,EACL,WAAW,GAAG,KAAK,EACnB,UAAU,EACV,gBAAgB,EAChB,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,YAAY,CAAC,SAAS,EAC9B,cAAc,GAAG,CAAC,EAClB,OAAO,GACR,GAAG,KAAK,CAAC;IAEV,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CACH,cAAc,CAAC;QACb,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,MAAM;QACN,WAAW;QACX,KAAK;QACL,cAAc;QACd,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;KAChE,CAAC,EACJ;QACE,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,MAAM;QACN,KAAK;QACL,WAAW;QACX,UAAU;QACV,gBAAgB;QAChB,KAAK;QACL,cAAc;KACf,CACF,CAAC;IAEF,sEAAsE;IACtE,4EAA4E;IAC5E,mCAAmC;IACnC,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC1D,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC,EAClE,CAAC,KAAK,CAAC,CACR,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE9D,OAAO,CACL,wBAGE,YAAG,aAAa,EAAC,MAAM,EAAC,KAAK,EAAE,SAAS,YACrC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAEE,EAAE,EAAE,IAAI,CAAC,IAAI,EACb,EAAE,EAAE,IAAI,CAAC,IAAI,EACb,EAAE,EAAE,IAAI,CAAC,IAAI,EACb,EAAE,EACA,KAAK;wBACH,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO;wBAChC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,IAP/B,IAAI,CAAC,GAAG,CASb,CACH,CAAC,GACA,EACJ,YAAG,aAAa,EAAC,MAAM,EAAC,KAAK,EAAE,UAAU,YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACrB,eAAqB,UAAU,EAAC,QAAQ,YACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC/B,gBAEE,CAAC,EAAE,IAAI,CAAC,MAAM,EACd,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EACxB,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAE5B,IAAI,CAAC,IAAI,IALL,IAAI,CAAC,IAAI,CAMR,CACT,CAAC,IAVO,IAAI,CAAC,GAAG,CAWZ,CACR,CAAC,GACA,EACH,OAAO,KAAK,SAAS;gBACpB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACpB,eAEE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EACb,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EACrB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EACvB,IAAI,EAAC,aAAa,EAClB,cAAc,EAAE,GAAG,EAAE,CACnB,OAAO,CAAC;wBACN,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACf,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;wBACxB,CAAC,EAAE,IAAI,CAAC,MAAM;wBACd,8DAA8D;wBAC9D,kDAAkD;wBAClD,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACrD,CAAC,EAEJ,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAlB9B,IAAI,CAAC,GAAG,CAmBb,CACH,CAAC,IACJ,CACL,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,GAA6C;IAC5D,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;IAC/B,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IACpC,EAAE,EAAE,EAAE;IACN,SAAS,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;CACxC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { MassPeakObject } from '../core/centroidPeaks.ts';
2
+ /** Which column the rows are read in the order of. */
3
+ export type PeakSortKey = 'mz' | 'intensity';
4
+ export interface PeakTableProps {
5
+ /** The peaks to list, in increasing m/z. */
6
+ peaks: readonly MassPeakObject[];
7
+ /** How many decimals the masses are written with. */
8
+ mzDecimals: number;
9
+ /**
10
+ * Which column the rows are in the order of: m/z ascending, which is how a
11
+ * spectrum is read, or intensity descending, which is how its base peak and
12
+ * its neighbours are found.
13
+ */
14
+ sortKey: PeakSortKey;
15
+ /** Order the rows by a column. */
16
+ onSort: (key: PeakSortKey) => void;
17
+ /** The m/z of the peak the pointer is resting on, `null` for none. */
18
+ highlightMz: number | null;
19
+ /** Told which peak a row the pointer rests on is, `null` when it leaves. */
20
+ onHighlight: (mz: number | null) => void;
21
+ /** Frame a peak on the chart. */
22
+ onPick: (mz: number) => void;
23
+ }
24
+ /**
25
+ * The peaks, one row each, under a header that sorts them.
26
+ *
27
+ * Only the rows in view are drawn: a table opened onto a whole Orbitrap scan is
28
+ * a thousand rows, and every one of them would otherwise be laid out again on
29
+ * every hover of the chart beside it.
30
+ * @param props - Component props.
31
+ * @returns The table.
32
+ */
33
+ export declare function PeakTable(props: PeakTableProps): import("react").JSX.Element;
34
+ //# sourceMappingURL=PeakTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeakTable.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/PeakTable.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,sDAAsD;AACtD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,EAAE,WAAW,CAAC;IACrB,kCAAkC;IAClC,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACnC,sEAAsE;IACtE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,iCAAiC;IACjC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BA8E9C"}
@@ -0,0 +1,49 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { memo, useMemo, useRef } from 'react';
3
+ import { panelCellStyle, panelColumnButtonStyle, panelNumberCellStyle, panelScrollAreaStyle, panelStickyHeaderStyle, panelTableStyle, } from "../../panel/core/panelStyles.js";
4
+ import { useVirtualRows } from "../../panel/ui/useVirtualRows.js";
5
+ import { formatIntensity, formatMz } from "../core/massFormat.js";
6
+ /**
7
+ * The peaks, one row each, under a header that sorts them.
8
+ *
9
+ * Only the rows in view are drawn: a table opened onto a whole Orbitrap scan is
10
+ * a thousand rows, and every one of them would otherwise be laid out again on
11
+ * every hover of the chart beside it.
12
+ * @param props - Component props.
13
+ * @returns The table.
14
+ */
15
+ export function PeakTable(props) {
16
+ const { peaks, mzDecimals, sortKey, onSort, highlightMz, onHighlight, onPick, } = props;
17
+ const scrollRef = useRef(null);
18
+ const ordered = useMemo(() => sortKey === 'mz'
19
+ ? peaks
20
+ : peaks.toSorted((first, second) => second.y - first.y), [peaks, sortKey]);
21
+ const rows = useVirtualRows(scrollRef, ordered.length, ROW_HEIGHT);
22
+ const showsCharge = useMemo(() => peaks.some((peak) => peak.charge !== 0), [peaks]);
23
+ return (_jsx("div", { ref: scrollRef, style: panelScrollAreaStyle, children: _jsxs("table", { style: panelTableStyle, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: panelStickyHeaderStyle, children: _jsxs("button", { type: "button", style: panelColumnButtonStyle, onClick: () => onSort('mz'), children: ["m/z", sortKey === 'mz' ? ' ▲' : ''] }) }), _jsx("th", { style: panelStickyHeaderStyle, children: _jsxs("button", { type: "button", style: panelColumnButtonStyle, onClick: () => onSort('intensity'), children: ["intensity", sortKey === 'intensity' ? ' ▼' : ''] }) }), showsCharge ? (_jsx("th", { style: panelStickyHeaderStyle, children: _jsx("span", { style: panelColumnButtonStyle, children: "z" }) })) : null] }) }), _jsxs("tbody", { onPointerLeave: () => onHighlight(null), children: [rows.before > 0 ? _jsx("tr", { style: { height: rows.before } }) : null, rows.indices.map((index) => {
24
+ const peak = ordered[index];
25
+ return (_jsx(PeakRow, { index: index, peak: peak, mzDecimals: mzDecimals, showsCharge: showsCharge, isHighlighted: peak.x === highlightMz, measure: rows.measure, onHighlight: onHighlight, onPick: onPick }, peak.x));
26
+ }), rows.after > 0 ? _jsx("tr", { style: { height: rows.after } }) : null] })] }) }));
27
+ }
28
+ /**
29
+ * One peak. Memoised, because a hover on the chart moves the highlight and only
30
+ * the row it left and the row it reached have anything new to draw.
31
+ */
32
+ const PeakRow = memo(function PeakRow(props) {
33
+ const { index, peak, mzDecimals, showsCharge, isHighlighted, measure, onHighlight, onPick, } = props;
34
+ return (_jsxs("tr", { ref: measure, "data-index": index, style: isHighlighted ? highlightedRowStyle : rowStyle, title: "Click to frame this peak on the chart",
35
+ // Reachable by Tab as well as by the pointer: framing a peak is the one
36
+ // thing a row does, and a keyboard has to be able to ask for it.
37
+ tabIndex: 0, onPointerEnter: () => onHighlight(peak.x), onFocus: () => onHighlight(peak.x), onClick: () => onPick(peak.x), onKeyDown: (event) => {
38
+ if (event.key !== 'Enter' && event.key !== ' ')
39
+ return;
40
+ event.preventDefault();
41
+ onPick(peak.x);
42
+ }, children: [_jsx("td", { style: panelCellStyle, children: formatMz(peak.x, mzDecimals) }), _jsx("td", { style: panelNumberCellStyle, children: formatIntensity(peak.y, mzDecimals) }), showsCharge ? (_jsx("td", { style: panelNumberCellStyle, children: peak.charge === 0 ? '' : peak.charge })) : null] }));
43
+ });
44
+ /** What one row is worth before one has been measured. */
45
+ const ROW_HEIGHT = 18;
46
+ const rowStyle = { cursor: 'pointer' };
47
+ /** The row of the peak being looked at, wherever it was pointed at. */
48
+ const highlightedRowStyle = { ...rowStyle, background: '#e8f1fb' };
49
+ //# sourceMappingURL=PeakTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeakTable.js","sourceRoot":"","sources":["../../../src/mass/ui/PeakTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface PeaksPanelProps {
2
+ /**
3
+ * The m/z of the peak the pointer is resting on, wherever it was hovered.
4
+ * @default null
5
+ */
6
+ highlightMz?: number | null;
7
+ /**
8
+ * Told which peak a row the pointer rests on is, `null` when it leaves.
9
+ * @default undefined
10
+ */
11
+ onHighlight?: (mz: number | null) => void;
12
+ }
13
+ /**
14
+ * What is actually in the selected spectrum, peak by peak.
15
+ *
16
+ * The centroid rather than the profile, because the centroid is what every
17
+ * number downstream is computed from — a profile lists the dozens of points one
18
+ * ion's peak shape covers, and none of them is the ion. For a profile these are
19
+ * the peaks the picking found in it.
20
+ *
21
+ * The window is the chart's by default: zoom into a cluster and the question
22
+ * becomes what is in *that* cluster, and a table that went on listing every row
23
+ * would have to be searched for the answer the chart is already pointing at. A
24
+ * floor of a hundredth of the base peak leaves the baseline out, and both are a
25
+ * toggle away. Resting on a row lights the peak on the chart, and clicking one
26
+ * frames it there.
27
+ * @param props - Component props.
28
+ * @returns The panel.
29
+ */
30
+ export declare function PeaksPanel(props: PeaksPanelProps): import("react").JSX.Element;
31
+ //# sourceMappingURL=PeaksPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeaksPanel.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/PeaksPanel.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,+BA4HhD"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useMemo, useState } from 'react';
3
+ import { SelectedTotal, Toolbar } from 'react-science/ui';
4
+ import { useCopyToClipboard } from "../../clipboard/ui/useCopyToClipboard.js";
5
+ import { panelBodyStyle, panelEmptyStyle, panelStyle, panelToolbarCountStyle, panelToolbarStyle, } from "../../panel/core/panelStyles.js";
6
+ import { mzFrame } from "../core/massDomain.js";
7
+ import { PEAK_TABLE_LIMIT, PEAK_TABLE_THRESHOLD, peakTableRows, peakTableToTsv, } from "../core/peakTable.js";
8
+ import { MzDecimalsMenu } from "./MzDecimalsMenu.js";
9
+ import { PeakTable } from "./PeakTable.js";
10
+ import { useMassCommandProps } from "./massCommandContext.js";
11
+ import { useMassActions, useMassEditorState } from "./massStateContext.js";
12
+ /**
13
+ * What is actually in the selected spectrum, peak by peak.
14
+ *
15
+ * The centroid rather than the profile, because the centroid is what every
16
+ * number downstream is computed from — a profile lists the dozens of points one
17
+ * ion's peak shape covers, and none of them is the ion. For a profile these are
18
+ * the peaks the picking found in it.
19
+ *
20
+ * The window is the chart's by default: zoom into a cluster and the question
21
+ * becomes what is in *that* cluster, and a table that went on listing every row
22
+ * would have to be searched for the answer the chart is already pointing at. A
23
+ * floor of a hundredth of the base peak leaves the baseline out, and both are a
24
+ * toggle away. Resting on a row lights the peak on the chart, and clicking one
25
+ * frames it there.
26
+ * @param props - Component props.
27
+ * @returns The panel.
28
+ */
29
+ export function PeaksPanel(props) {
30
+ const { highlightMz = null, onHighlight } = props;
31
+ const { state, visibleSpectra, selectedSpectrum, mzDecimals, autoMzDecimals, } = useMassEditorState();
32
+ const actions = useMassActions();
33
+ const command = useMassCommandProps();
34
+ const { domain } = state.view;
35
+ const { showLabels, showCharges } = state.settings;
36
+ const [inWindow, setInWindow] = useState(true);
37
+ const [withFloor, setWithFloor] = useState(true);
38
+ const [sortKey, setSortKey] = useState('mz');
39
+ const { copied, copy } = useCopyToClipboard();
40
+ const peaks = useMemo(() => selectedSpectrum === null
41
+ ? []
42
+ : peakTableRows(selectedSpectrum, {
43
+ domain: inWindow ? domain : null,
44
+ threshold: withFloor ? PEAK_TABLE_THRESHOLD : 0,
45
+ }), [selectedSpectrum, inWindow, domain, withFloor]);
46
+ // Stable across a pointer move, so the memoised rows survive one.
47
+ const onPick = useCallback((mz) => actions.setDomain(mzFrame(mz, visibleSpectra, domain)), [actions, visibleSpectra, domain]);
48
+ const highlight = useCallback((mz) => onHighlight?.(mz), [onHighlight]);
49
+ const total = selectedSpectrum?.centroid.x.length ?? 0;
50
+ return (_jsxs("div", { style: panelStyle, children: [_jsxs("div", { style: panelToolbarStyle, children: [_jsxs(Toolbar, { "aria-label": "Peaks", children: [_jsx(Toolbar.Item, { icon: "zoom-to-fit", active: inWindow, tooltip: "Only the peaks the chart is showing", "aria-label": "Only the peaks the chart is showing", onClick: () => setInWindow(!inWindow) }), _jsx(Toolbar.Item, { icon: "filter", active: withFloor, tooltip: "Leave out the peaks under 1 % of the base peak", "aria-label": "Leave out the peaks under 1 % of the base peak", onClick: () => setWithFloor(!withFloor) }), _jsx(Toolbar.Item, { icon: "label", active: showLabels, ...command('toggleLabels') }), _jsx(Toolbar.Item, { icon: "numerical", active: showCharges, ...command('toggleCharges') }), _jsx(MzDecimalsMenu, { setting: state.settings.mzDecimals, autoDecimals: autoMzDecimals, onChange: (setting) => actions.setSettings({ mzDecimals: setting }) }), _jsx(Toolbar.Item, { icon: copied ? 'tick' : 'duplicate', tooltip: "Copy the rows as tab-separated text", "aria-label": "Copy the rows as tab-separated text", disabled: peaks.length === 0, onClick: () => void copy(peakTableToTsv(peaks, mzDecimals)) })] }), _jsx("div", { style: panelToolbarCountStyle, title: `${peaks.length} of the ${total} peaks of this spectrum listed`, children: _jsx(SelectedTotal, { count: peaks.length, total: total }) })] }), _jsx("div", { style: panelBodyStyle, children: selectedSpectrum === null ? (_jsx("p", { style: panelEmptyStyle, children: "No spectrum is selected. Click one in the Spectra panel and its peaks are listed here." })) : peaks.length === 0 ? (_jsx("p", { style: panelEmptyStyle, children: "No peak stands in the window above the floor. Zoom out, or switch the window or the floor off in the toolbar." })) : (_jsxs(_Fragment, { children: [peaks.length === PEAK_TABLE_LIMIT ? (_jsxs("p", { style: noteStyle, children: ["The ", PEAK_TABLE_LIMIT, " most intense peaks are listed. Zoom in to list the rest."] })) : null, _jsx(PeakTable, { peaks: peaks, mzDecimals: mzDecimals, sortKey: sortKey, onSort: setSortKey, highlightMz: highlightMz, onHighlight: highlight, onPick: onPick })] })) })] }));
51
+ }
52
+ const noteStyle = { margin: 0, fontSize: 11, opacity: 0.7 };
53
+ //# sourceMappingURL=PeaksPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeaksPanel.js","sourceRoot":"","sources":["../../../src/mass/ui/PeaksPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * What is loaded: one row per spectrum, in the order the files gave them.
3
+ *
4
+ * The list is the viewer's selection as well as its legend. Whichever row is
5
+ * selected is the spectrum the acquisition table describes, the peak table holds
6
+ * and the chart writes its labels on, so a row is not a checkbox with a colour
7
+ * beside it — it is the control that decides what the other panels are about.
8
+ * That is also why the arrow keys walk it: a GC/MS export gives a page per scan,
9
+ * and finding the interesting one means stepping down them watching the chart.
10
+ *
11
+ * What acts on the list rather than on one row — opening more, drawing every
12
+ * trace again, handing the whole list over as a file, closing every one — is a
13
+ * toolbar under the header, where a panel's own actions belong.
14
+ * @returns The panel.
15
+ */
16
+ export declare function SpectraPanel(): import("react").JSX.Element;
17
+ //# sourceMappingURL=SpectraPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpectraPanel.d.ts","sourceRoot":"","sources":["../../../src/mass/ui/SpectraPanel.tsx"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,gCA2G3B"}