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.
- package/README.md +70 -2
- package/lib/about/core/providers.d.ts +6 -0
- package/lib/about/core/providers.d.ts.map +1 -1
- package/lib/about/core/providers.js +7 -0
- package/lib/about/core/providers.js.map +1 -1
- package/lib/about/ui/AboutProvidedBy.js +34 -0
- package/lib/about/ui/AboutProvidedBy.js.map +1 -1
- package/lib/chart/ui/useChartPointer.d.ts +9 -1
- package/lib/chart/ui/useChartPointer.d.ts.map +1 -1
- package/lib/chart/ui/useChartPointer.js +11 -3
- package/lib/chart/ui/useChartPointer.js.map +1 -1
- package/lib/credits/core/credits.d.ts +41 -0
- package/lib/credits/core/credits.d.ts.map +1 -1
- package/lib/credits/core/credits.js +50 -0
- package/lib/credits/core/credits.js.map +1 -1
- package/lib/download/core/drawingMarkup.d.ts +8 -1
- package/lib/download/core/drawingMarkup.d.ts.map +1 -1
- package/lib/download/core/drawingMarkup.js +13 -1
- package/lib/download/core/drawingMarkup.js.map +1 -1
- package/lib/download/core/figurePng.d.ts +14 -0
- package/lib/download/core/figurePng.d.ts.map +1 -1
- package/lib/download/core/figurePng.js +21 -6
- package/lib/download/core/figurePng.js.map +1 -1
- package/lib/download/core/figureSvg.d.ts.map +1 -1
- package/lib/download/core/figureSvg.js +5 -3
- package/lib/download/core/figureSvg.js.map +1 -1
- package/lib/download/core/figureTarget.d.ts +13 -0
- package/lib/download/core/figureTarget.d.ts.map +1 -1
- package/lib/download/core/figureTarget.js +25 -5
- package/lib/download/core/figureTarget.js.map +1 -1
- package/lib/download/core/svgBounds.d.ts +15 -0
- package/lib/download/core/svgBounds.d.ts.map +1 -1
- package/lib/download/core/svgBounds.js +20 -0
- package/lib/download/core/svgBounds.js.map +1 -1
- package/lib/download/core/svgToPng.d.ts.map +1 -1
- package/lib/download/core/svgToPng.js +4 -2
- package/lib/download/core/svgToPng.js.map +1 -1
- package/lib/format/core/relativeTime.d.ts +8 -3
- package/lib/format/core/relativeTime.d.ts.map +1 -1
- package/lib/format/core/relativeTime.js +19 -7
- package/lib/format/core/relativeTime.js.map +1 -1
- package/lib/host/core/connectHost.d.ts +25 -34
- package/lib/host/core/connectHost.d.ts.map +1 -1
- package/lib/host/core/connectHost.js +43 -89
- package/lib/host/core/connectHost.js.map +1 -1
- package/lib/host/core/hostOutputs.d.ts +58 -0
- package/lib/host/core/hostOutputs.d.ts.map +1 -0
- package/lib/host/core/hostOutputs.js +151 -0
- package/lib/host/core/hostOutputs.js.map +1 -0
- package/lib/host/core/index.d.ts +9 -3
- package/lib/host/core/index.d.ts.map +1 -1
- package/lib/host/core/index.js +4 -1
- package/lib/host/core/index.js.map +1 -1
- package/lib/host/core/irKinds.d.ts +124 -0
- package/lib/host/core/irKinds.d.ts.map +1 -0
- package/lib/host/core/irKinds.js +46 -0
- package/lib/host/core/irKinds.js.map +1 -0
- package/lib/host/core/kinds.d.ts +13 -5
- package/lib/host/core/kinds.d.ts.map +1 -1
- package/lib/host/core/kinds.js +11 -5
- package/lib/host/core/kinds.js.map +1 -1
- package/lib/host/core/protocol.d.ts +50 -7
- package/lib/host/core/protocol.d.ts.map +1 -1
- package/lib/host/core/protocol.js +10 -6
- package/lib/host/core/protocol.js.map +1 -1
- package/lib/host/core/selectInputs.d.ts +37 -0
- package/lib/host/core/selectInputs.d.ts.map +1 -0
- package/lib/host/core/selectInputs.js +110 -0
- package/lib/host/core/selectInputs.js.map +1 -0
- package/lib/host/testing/sciPeaks.d.ts +31 -0
- package/lib/host/testing/sciPeaks.d.ts.map +1 -1
- package/lib/host/testing/sciPeaks.js +73 -0
- package/lib/host/testing/sciPeaks.js.map +1 -1
- package/lib/host/testing/standInHost.d.ts +9 -1
- package/lib/host/testing/standInHost.d.ts.map +1 -1
- package/lib/host/testing/standInHost.js +19 -1
- package/lib/host/testing/standInHost.js.map +1 -1
- package/lib/host/ui/useHostConnection.d.ts +13 -5
- package/lib/host/ui/useHostConnection.d.ts.map +1 -1
- package/lib/host/ui/useHostConnection.js +4 -3
- package/lib/host/ui/useHostConnection.js.map +1 -1
- package/lib/host-testing.d.ts +2 -2
- package/lib/host-testing.d.ts.map +1 -1
- package/lib/host-testing.js +2 -2
- package/lib/host-testing.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/ir/core/handPicking.d.ts +58 -0
- package/lib/ir/core/handPicking.d.ts.map +1 -0
- package/lib/ir/core/handPicking.js +130 -0
- package/lib/ir/core/handPicking.js.map +1 -0
- package/lib/ir/core/index.d.ts +3 -0
- package/lib/ir/core/index.d.ts.map +1 -1
- package/lib/ir/core/index.js +3 -0
- package/lib/ir/core/index.js.map +1 -1
- package/lib/ir/core/irBandState.d.ts +57 -0
- package/lib/ir/core/irBandState.d.ts.map +1 -0
- package/lib/ir/core/irBandState.js +119 -0
- package/lib/ir/core/irBandState.js.map +1 -0
- package/lib/ir/core/irCommands.d.ts +11 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -1
- package/lib/ir/core/irCommands.js +6 -0
- package/lib/ir/core/irCommands.js.map +1 -1
- package/lib/ir/core/irPeaks.d.ts +28 -0
- package/lib/ir/core/irPeaks.d.ts.map +1 -0
- package/lib/ir/core/irPeaks.js +66 -0
- package/lib/ir/core/irPeaks.js.map +1 -0
- package/lib/ir/core/irReducer.d.ts +8 -0
- package/lib/ir/core/irReducer.d.ts.map +1 -1
- package/lib/ir/core/irReducer.js +15 -32
- package/lib/ir/core/irReducer.js.map +1 -1
- package/lib/ir/core/irSpectrum.d.ts +15 -0
- package/lib/ir/core/irSpectrum.d.ts.map +1 -1
- package/lib/ir/core/irSpectrum.js.map +1 -1
- package/lib/ir/core/irState.d.ts +9 -6
- package/lib/ir/core/irState.d.ts.map +1 -1
- package/lib/ir/core/irState.js +10 -6
- package/lib/ir/core/irState.js.map +1 -1
- package/lib/ir/core/pickBands.d.ts +14 -0
- package/lib/ir/core/pickBands.d.ts.map +1 -1
- package/lib/ir/core/pickBands.js +39 -33
- package/lib/ir/core/pickBands.js.map +1 -1
- package/lib/ir/core/ramanBands.d.ts +9 -1
- package/lib/ir/core/ramanBands.d.ts.map +1 -1
- package/lib/ir/core/ramanBands.js +2 -2
- package/lib/ir/core/ramanBands.js.map +1 -1
- package/lib/ir/core/spectrumBands.d.ts +46 -0
- package/lib/ir/core/spectrumBands.d.ts.map +1 -0
- package/lib/ir/core/spectrumBands.js +98 -0
- package/lib/ir/core/spectrumBands.js.map +1 -0
- package/lib/ir/ui/BandRow.d.ts +5 -0
- package/lib/ir/ui/BandRow.d.ts.map +1 -1
- package/lib/ir/ui/BandRow.js +4 -3
- package/lib/ir/ui/BandRow.js.map +1 -1
- package/lib/ir/ui/BandsPanel.d.ts +5 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
- package/lib/ir/ui/BandsPanel.js +36 -16
- package/lib/ir/ui/BandsPanel.js.map +1 -1
- package/lib/ir/ui/BandsToolbar.d.ts +9 -0
- package/lib/ir/ui/BandsToolbar.d.ts.map +1 -0
- package/lib/ir/ui/BandsToolbar.js +61 -0
- package/lib/ir/ui/BandsToolbar.js.map +1 -0
- package/lib/ir/ui/IrCanvas.d.ts +2 -1
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
- package/lib/ir/ui/IrCanvas.js +19 -5
- package/lib/ir/ui/IrCanvas.js.map +1 -1
- package/lib/ir/ui/IrChart.d.ts.map +1 -1
- package/lib/ir/ui/IrChart.js +8 -1
- package/lib/ir/ui/IrChart.js.map +1 -1
- package/lib/ir/ui/IrDocumentationDialog.js +1 -1
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
- package/lib/ir/ui/IrEditor.d.ts +4 -2
- package/lib/ir/ui/IrEditor.d.ts.map +1 -1
- package/lib/ir/ui/IrEditor.js.map +1 -1
- package/lib/ir/ui/IrShell.d.ts.map +1 -1
- package/lib/ir/ui/IrShell.js +6 -0
- package/lib/ir/ui/IrShell.js.map +1 -1
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
- package/lib/ir/ui/IrStatusBar.js +1 -1
- package/lib/ir/ui/IrStatusBar.js.map +1 -1
- package/lib/ir/ui/IrToolbar.d.ts +4 -3
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
- package/lib/ir/ui/IrToolbar.js +5 -4
- package/lib/ir/ui/IrToolbar.js.map +1 -1
- package/lib/ir/ui/VibrationalEditor.d.ts +2 -1
- package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -1
- package/lib/ir/ui/VibrationalEditor.js.map +1 -1
- package/lib/ir/ui/irActions.d.ts +5 -0
- package/lib/ir/ui/irActions.d.ts.map +1 -1
- package/lib/ir/ui/irActions.js +6 -0
- package/lib/ir/ui/irActions.js.map +1 -1
- package/lib/ir/ui/irChartProps.d.ts +4 -1
- package/lib/ir/ui/irChartProps.d.ts.map +1 -1
- package/lib/ir/ui/useIrEditor.d.ts +5 -11
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
- package/lib/ir/ui/useIrEditor.js +17 -18
- package/lib/ir/ui/useIrEditor.js.map +1 -1
- package/lib/locales/de.json +63 -0
- package/lib/locales/en.json +63 -0
- package/lib/locales/es.json +63 -0
- package/lib/locales/fr.json +63 -0
- package/lib/locales/it.json +63 -0
- package/lib/mass/core/analyseSpectrum.d.ts +85 -0
- package/lib/mass/core/analyseSpectrum.d.ts.map +1 -0
- package/lib/mass/core/analyseSpectrum.js +101 -0
- package/lib/mass/core/analyseSpectrum.js.map +1 -0
- package/lib/mass/core/ascendingTrace.d.ts +24 -0
- package/lib/mass/core/ascendingTrace.d.ts.map +1 -0
- package/lib/mass/core/ascendingTrace.js +57 -0
- package/lib/mass/core/ascendingTrace.js.map +1 -0
- package/lib/mass/core/centroidPeaks.d.ts +77 -0
- package/lib/mass/core/centroidPeaks.d.ts.map +1 -0
- package/lib/mass/core/centroidPeaks.js +62 -0
- package/lib/mass/core/centroidPeaks.js.map +1 -0
- package/lib/mass/core/detectMassFormat.d.ts +24 -0
- package/lib/mass/core/detectMassFormat.d.ts.map +1 -0
- package/lib/mass/core/detectMassFormat.js +105 -0
- package/lib/mass/core/detectMassFormat.js.map +1 -0
- package/lib/mass/core/downloadSpectra.d.ts +24 -0
- package/lib/mass/core/downloadSpectra.d.ts.map +1 -0
- package/lib/mass/core/downloadSpectra.js +35 -0
- package/lib/mass/core/downloadSpectra.js.map +1 -0
- package/lib/mass/core/fromJcamp.d.ts +46 -0
- package/lib/mass/core/fromJcamp.d.ts.map +1 -0
- package/lib/mass/core/fromJcamp.js +123 -0
- package/lib/mass/core/fromJcamp.js.map +1 -0
- package/lib/mass/core/fromText.d.ts +30 -0
- package/lib/mass/core/fromText.d.ts.map +1 -0
- package/lib/mass/core/fromText.js +39 -0
- package/lib/mass/core/fromText.js.map +1 -0
- package/lib/mass/core/index.d.ts +70 -0
- package/lib/mass/core/index.d.ts.map +1 -0
- package/lib/mass/core/index.js +42 -0
- package/lib/mass/core/index.js.map +1 -0
- package/lib/mass/core/jcampTechnique.d.ts +38 -0
- package/lib/mass/core/jcampTechnique.d.ts.map +1 -0
- package/lib/mass/core/jcampTechnique.js +70 -0
- package/lib/mass/core/jcampTechnique.js.map +1 -0
- package/lib/mass/core/labelStackBox.d.ts +49 -0
- package/lib/mass/core/labelStackBox.d.ts.map +1 -0
- package/lib/mass/core/labelStackBox.js +44 -0
- package/lib/mass/core/labelStackBox.js.map +1 -0
- package/lib/mass/core/labelledPeaks.d.ts +79 -0
- package/lib/mass/core/labelledPeaks.d.ts.map +1 -0
- package/lib/mass/core/labelledPeaks.js +74 -0
- package/lib/mass/core/labelledPeaks.js.map +1 -0
- package/lib/mass/core/loadMassSpectra.d.ts +57 -0
- package/lib/mass/core/loadMassSpectra.d.ts.map +1 -0
- package/lib/mass/core/loadMassSpectra.js +45 -0
- package/lib/mass/core/loadMassSpectra.js.map +1 -0
- package/lib/mass/core/loadedMassSpectrum.d.ts +42 -0
- package/lib/mass/core/loadedMassSpectrum.d.ts.map +1 -0
- package/lib/mass/core/loadedMassSpectrum.js +15 -0
- package/lib/mass/core/loadedMassSpectrum.js.map +1 -0
- package/lib/mass/core/massCommands.d.ts +170 -0
- package/lib/mass/core/massCommands.d.ts.map +1 -0
- package/lib/mass/core/massCommands.js +95 -0
- package/lib/mass/core/massCommands.js.map +1 -0
- package/lib/mass/core/massDomain.d.ts +121 -0
- package/lib/mass/core/massDomain.d.ts.map +1 -0
- package/lib/mass/core/massDomain.js +179 -0
- package/lib/mass/core/massDomain.js.map +1 -0
- package/lib/mass/core/massEditorApi.d.ts +65 -0
- package/lib/mass/core/massEditorApi.d.ts.map +1 -0
- package/lib/mass/core/massEditorApi.js +10 -0
- package/lib/mass/core/massEditorApi.js.map +1 -0
- package/lib/mass/core/massFormat.d.ts +78 -0
- package/lib/mass/core/massFormat.d.ts.map +1 -0
- package/lib/mass/core/massFormat.js +168 -0
- package/lib/mass/core/massFormat.js.map +1 -0
- package/lib/mass/core/massMeta.d.ts +85 -0
- package/lib/mass/core/massMeta.d.ts.map +1 -0
- package/lib/mass/core/massMeta.js +182 -0
- package/lib/mass/core/massMeta.js.map +1 -0
- package/lib/mass/core/massReducer.d.ts +82 -0
- package/lib/mass/core/massReducer.d.ts.map +1 -0
- package/lib/mass/core/massReducer.js +163 -0
- package/lib/mass/core/massReducer.js.map +1 -0
- package/lib/mass/core/massResolution.d.ts +92 -0
- package/lib/mass/core/massResolution.d.ts.map +1 -0
- package/lib/mass/core/massResolution.js +126 -0
- package/lib/mass/core/massResolution.js.map +1 -0
- package/lib/mass/core/massSidePanels.d.ts +28 -0
- package/lib/mass/core/massSidePanels.d.ts.map +1 -0
- package/lib/mass/core/massSidePanels.js +12 -0
- package/lib/mass/core/massSidePanels.js.map +1 -0
- package/lib/mass/core/massSpectrum.d.ts +206 -0
- package/lib/mass/core/massSpectrum.d.ts.map +1 -0
- package/lib/mass/core/massSpectrum.js +41 -0
- package/lib/mass/core/massSpectrum.js.map +1 -0
- package/lib/mass/core/massState.d.ts +145 -0
- package/lib/mass/core/massState.d.ts.map +1 -0
- package/lib/mass/core/massState.js +102 -0
- package/lib/mass/core/massState.js.map +1 -0
- package/lib/mass/core/massStateEdits.d.ts +51 -0
- package/lib/mass/core/massStateEdits.d.ts.map +1 -0
- package/lib/mass/core/massStateEdits.js +90 -0
- package/lib/mass/core/massStateEdits.js.map +1 -0
- package/lib/mass/core/massSummary.d.ts +77 -0
- package/lib/mass/core/massSummary.d.ts.map +1 -0
- package/lib/mass/core/massSummary.js +174 -0
- package/lib/mass/core/massSummary.js.map +1 -0
- package/lib/mass/core/mzDecimalsSetting.d.ts +36 -0
- package/lib/mass/core/mzDecimalsSetting.d.ts.map +1 -0
- package/lib/mass/core/mzDecimalsSetting.js +42 -0
- package/lib/mass/core/mzDecimalsSetting.js.map +1 -0
- package/lib/mass/core/nearestPeak.d.ts +75 -0
- package/lib/mass/core/nearestPeak.d.ts.map +1 -0
- package/lib/mass/core/nearestPeak.js +99 -0
- package/lib/mass/core/nearestPeak.js.map +1 -0
- package/lib/mass/core/peakLabelLines.d.ts +77 -0
- package/lib/mass/core/peakLabelLines.d.ts.map +1 -0
- package/lib/mass/core/peakLabelLines.js +54 -0
- package/lib/mass/core/peakLabelLines.js.map +1 -0
- package/lib/mass/core/peakLabelPlan.d.ts +109 -0
- package/lib/mass/core/peakLabelPlan.d.ts.map +1 -0
- package/lib/mass/core/peakLabelPlan.js +143 -0
- package/lib/mass/core/peakLabelPlan.js.map +1 -0
- package/lib/mass/core/peakTable.d.ts +54 -0
- package/lib/mass/core/peakTable.d.ts.map +1 -0
- package/lib/mass/core/peakTable.js +53 -0
- package/lib/mass/core/peakTable.js.map +1 -0
- package/lib/mass/core/resolutionOf.d.ts +60 -0
- package/lib/mass/core/resolutionOf.d.ts.map +1 -0
- package/lib/mass/core/resolutionOf.js +84 -0
- package/lib/mass/core/resolutionOf.js.map +1 -0
- package/lib/mass/core/scanFilter.d.ts +25 -0
- package/lib/mass/core/scanFilter.d.ts.map +1 -0
- package/lib/mass/core/scanFilter.js +107 -0
- package/lib/mass/core/scanFilter.js.map +1 -0
- package/lib/mass/core/spectrumJcamp.d.ts +47 -0
- package/lib/mass/core/spectrumJcamp.d.ts.map +1 -0
- package/lib/mass/core/spectrumJcamp.js +167 -0
- package/lib/mass/core/spectrumJcamp.js.map +1 -0
- package/lib/mass/core/toMassSpectrum.d.ts +67 -0
- package/lib/mass/core/toMassSpectrum.d.ts.map +1 -0
- package/lib/mass/core/toMassSpectrum.js +78 -0
- package/lib/mass/core/toMassSpectrum.js.map +1 -0
- package/lib/mass/core/traceIcon.d.ts +82 -0
- package/lib/mass/core/traceIcon.d.ts.map +1 -0
- package/lib/mass/core/traceIcon.js +66 -0
- package/lib/mass/core/traceIcon.js.map +1 -0
- package/lib/mass/core/writtenResolution.d.ts +40 -0
- package/lib/mass/core/writtenResolution.d.ts.map +1 -0
- package/lib/mass/core/writtenResolution.js +77 -0
- package/lib/mass/core/writtenResolution.js.map +1 -0
- package/lib/mass/ui/MassAboutDialog.d.ts +16 -0
- package/lib/mass/ui/MassAboutDialog.d.ts.map +1 -0
- package/lib/mass/ui/MassAboutDialog.js +44 -0
- package/lib/mass/ui/MassAboutDialog.js.map +1 -0
- package/lib/mass/ui/MassCanvas.d.ts +46 -0
- package/lib/mass/ui/MassCanvas.d.ts.map +1 -0
- package/lib/mass/ui/MassCanvas.js +84 -0
- package/lib/mass/ui/MassCanvas.js.map +1 -0
- package/lib/mass/ui/MassChart.d.ts +21 -0
- package/lib/mass/ui/MassChart.d.ts.map +1 -0
- package/lib/mass/ui/MassChart.js +139 -0
- package/lib/mass/ui/MassChart.js.map +1 -0
- package/lib/mass/ui/MassCommandProvider.d.ts +15 -0
- package/lib/mass/ui/MassCommandProvider.d.ts.map +1 -0
- package/lib/mass/ui/MassCommandProvider.js +14 -0
- package/lib/mass/ui/MassCommandProvider.js.map +1 -0
- package/lib/mass/ui/MassCommandTooltip.d.ts +16 -0
- package/lib/mass/ui/MassCommandTooltip.d.ts.map +1 -0
- package/lib/mass/ui/MassCommandTooltip.js +22 -0
- package/lib/mass/ui/MassCommandTooltip.js.map +1 -0
- package/lib/mass/ui/MassDocumentationDialog.d.ts +18 -0
- package/lib/mass/ui/MassDocumentationDialog.d.ts.map +1 -0
- package/lib/mass/ui/MassDocumentationDialog.js +70 -0
- package/lib/mass/ui/MassDocumentationDialog.js.map +1 -0
- package/lib/mass/ui/MassEditor.d.ts +78 -0
- package/lib/mass/ui/MassEditor.d.ts.map +1 -0
- package/lib/mass/ui/MassEditor.js +42 -0
- package/lib/mass/ui/MassEditor.js.map +1 -0
- package/lib/mass/ui/MassHeader.d.ts +12 -0
- package/lib/mass/ui/MassHeader.d.ts.map +1 -0
- package/lib/mass/ui/MassHeader.js +20 -0
- package/lib/mass/ui/MassHeader.js.map +1 -0
- package/lib/mass/ui/MassLogo.d.ts +21 -0
- package/lib/mass/ui/MassLogo.d.ts.map +1 -0
- package/lib/mass/ui/MassLogo.js +36 -0
- package/lib/mass/ui/MassLogo.js.map +1 -0
- package/lib/mass/ui/MassPointerTracker.d.ts +44 -0
- package/lib/mass/ui/MassPointerTracker.d.ts.map +1 -0
- package/lib/mass/ui/MassPointerTracker.js +29 -0
- package/lib/mass/ui/MassPointerTracker.js.map +1 -0
- package/lib/mass/ui/MassShell.d.ts +29 -0
- package/lib/mass/ui/MassShell.d.ts.map +1 -0
- package/lib/mass/ui/MassShell.js +133 -0
- package/lib/mass/ui/MassShell.js.map +1 -0
- package/lib/mass/ui/MassSidePanel.d.ts +32 -0
- package/lib/mass/ui/MassSidePanel.d.ts.map +1 -0
- package/lib/mass/ui/MassSidePanel.js +44 -0
- package/lib/mass/ui/MassSidePanel.js.map +1 -0
- package/lib/mass/ui/MassStateProvider.d.ts +19 -0
- package/lib/mass/ui/MassStateProvider.d.ts.map +1 -0
- package/lib/mass/ui/MassStateProvider.js +16 -0
- package/lib/mass/ui/MassStateProvider.js.map +1 -0
- package/lib/mass/ui/MassStatusBar.d.ts +15 -0
- package/lib/mass/ui/MassStatusBar.d.ts.map +1 -0
- package/lib/mass/ui/MassStatusBar.js +50 -0
- package/lib/mass/ui/MassStatusBar.js.map +1 -0
- package/lib/mass/ui/MassToolbar.d.ts +24 -0
- package/lib/mass/ui/MassToolbar.d.ts.map +1 -0
- package/lib/mass/ui/MassToolbar.js +36 -0
- package/lib/mass/ui/MassToolbar.js.map +1 -0
- package/lib/mass/ui/MetadataPanel.d.ts +35 -0
- package/lib/mass/ui/MetadataPanel.d.ts.map +1 -0
- package/lib/mass/ui/MetadataPanel.js +100 -0
- package/lib/mass/ui/MetadataPanel.js.map +1 -0
- package/lib/mass/ui/MzDecimalsMenu.d.ts +28 -0
- package/lib/mass/ui/MzDecimalsMenu.d.ts.map +1 -0
- package/lib/mass/ui/MzDecimalsMenu.js +40 -0
- package/lib/mass/ui/MzDecimalsMenu.js.map +1 -0
- package/lib/mass/ui/PeakLabels.d.ts +93 -0
- package/lib/mass/ui/PeakLabels.d.ts.map +1 -0
- package/lib/mass/ui/PeakLabels.js +91 -0
- package/lib/mass/ui/PeakLabels.js.map +1 -0
- package/lib/mass/ui/PeakTable.d.ts +34 -0
- package/lib/mass/ui/PeakTable.d.ts.map +1 -0
- package/lib/mass/ui/PeakTable.js +49 -0
- package/lib/mass/ui/PeakTable.js.map +1 -0
- package/lib/mass/ui/PeaksPanel.d.ts +31 -0
- package/lib/mass/ui/PeaksPanel.d.ts.map +1 -0
- package/lib/mass/ui/PeaksPanel.js +53 -0
- package/lib/mass/ui/PeaksPanel.js.map +1 -0
- package/lib/mass/ui/SpectraPanel.d.ts +17 -0
- package/lib/mass/ui/SpectraPanel.d.ts.map +1 -0
- package/lib/mass/ui/SpectraPanel.js +76 -0
- package/lib/mass/ui/SpectraPanel.js.map +1 -0
- package/lib/mass/ui/SpectrumRow.d.ts +26 -0
- package/lib/mass/ui/SpectrumRow.d.ts.map +1 -0
- package/lib/mass/ui/SpectrumRow.js +141 -0
- package/lib/mass/ui/SpectrumRow.js.map +1 -0
- package/lib/mass/ui/SpectrumTrace.d.ts +46 -0
- package/lib/mass/ui/SpectrumTrace.d.ts.map +1 -0
- package/lib/mass/ui/SpectrumTrace.js +68 -0
- package/lib/mass/ui/SpectrumTrace.js.map +1 -0
- package/lib/mass/ui/index.d.ts +69 -0
- package/lib/mass/ui/index.d.ts.map +1 -0
- package/lib/mass/ui/index.js +42 -0
- package/lib/mass/ui/index.js.map +1 -0
- package/lib/mass/ui/massActions.d.ts +52 -0
- package/lib/mass/ui/massActions.d.ts.map +1 -0
- package/lib/mass/ui/massActions.js +62 -0
- package/lib/mass/ui/massActions.js.map +1 -0
- package/lib/mass/ui/massChartProps.d.ts +128 -0
- package/lib/mass/ui/massChartProps.d.ts.map +1 -0
- package/lib/mass/ui/massChartProps.js +14 -0
- package/lib/mass/ui/massChartProps.js.map +1 -0
- package/lib/mass/ui/massCommandContext.d.ts +36 -0
- package/lib/mass/ui/massCommandContext.d.ts.map +1 -0
- package/lib/mass/ui/massCommandContext.js +45 -0
- package/lib/mass/ui/massCommandContext.js.map +1 -0
- package/lib/mass/ui/massHostPanels.d.ts +48 -0
- package/lib/mass/ui/massHostPanels.d.ts.map +1 -0
- package/lib/mass/ui/massHostPanels.js +41 -0
- package/lib/mass/ui/massHostPanels.js.map +1 -0
- package/lib/mass/ui/massStateContext.d.ts +26 -0
- package/lib/mass/ui/massStateContext.d.ts.map +1 -0
- package/lib/mass/ui/massStateContext.js +37 -0
- package/lib/mass/ui/massStateContext.js.map +1 -0
- package/lib/mass/ui/useIntensityZoom.d.ts +20 -0
- package/lib/mass/ui/useIntensityZoom.d.ts.map +1 -0
- package/lib/mass/ui/useIntensityZoom.js +42 -0
- package/lib/mass/ui/useIntensityZoom.js.map +1 -0
- package/lib/mass/ui/useMassEditor.d.ts +52 -0
- package/lib/mass/ui/useMassEditor.d.ts.map +1 -0
- package/lib/mass/ui/useMassEditor.js +93 -0
- package/lib/mass/ui/useMassEditor.js.map +1 -0
- package/lib/mass/ui/useMassFiles.d.ts +22 -0
- package/lib/mass/ui/useMassFiles.d.ts.map +1 -0
- package/lib/mass/ui/useMassFiles.js +71 -0
- package/lib/mass/ui/useMassFiles.js.map +1 -0
- package/lib/mass/ui/useMassHandle.d.ts +15 -0
- package/lib/mass/ui/useMassHandle.d.ts.map +1 -0
- package/lib/mass/ui/useMassHandle.js +35 -0
- package/lib/mass/ui/useMassHandle.js.map +1 -0
- package/lib/mass/ui/useMassPointer.d.ts +70 -0
- package/lib/mass/ui/useMassPointer.d.ts.map +1 -0
- package/lib/mass/ui/useMassPointer.js +57 -0
- package/lib/mass/ui/useMassPointer.js.map +1 -0
- package/lib/mass/ui/useMassShortcuts.d.ts +21 -0
- package/lib/mass/ui/useMassShortcuts.d.ts.map +1 -0
- package/lib/mass/ui/useMassShortcuts.js +66 -0
- package/lib/mass/ui/useMassShortcuts.js.map +1 -0
- package/lib/mass/ui/useMassSide.d.ts +27 -0
- package/lib/mass/ui/useMassSide.d.ts.map +1 -0
- package/lib/mass/ui/useMassSide.js +45 -0
- package/lib/mass/ui/useMassSide.js.map +1 -0
- package/lib/mass/ui/useMassZoom.d.ts +92 -0
- package/lib/mass/ui/useMassZoom.d.ts.map +1 -0
- package/lib/mass/ui/useMassZoom.js +65 -0
- package/lib/mass/ui/useMassZoom.js.map +1 -0
- package/lib/mass.d.ts +16 -0
- package/lib/mass.d.ts.map +1 -0
- package/lib/mass.js +16 -0
- package/lib/mass.js.map +1 -0
- package/lib/panel/ui/PanelRail.d.ts.map +1 -1
- package/lib/panel/ui/PanelRail.js +6 -1
- package/lib/panel/ui/PanelRail.js.map +1 -1
- package/lib/slides/ui/slideSanitizeSchema.d.ts +3 -2
- package/lib/slides/ui/slideSanitizeSchema.d.ts.map +1 -1
- package/lib/slides/ui/slideSanitizeSchema.js +82 -2
- package/lib/slides/ui/slideSanitizeSchema.js.map +1 -1
- package/package.json +6 -1
- package/src/about/core/providers.ts +7 -0
- package/src/about/ui/AboutProvidedBy.tsx +49 -0
- package/src/chart/ui/useChartPointer.ts +18 -4
- package/src/credits/core/credits.ts +53 -0
- package/src/download/core/drawingMarkup.ts +18 -1
- package/src/download/core/figurePng.ts +21 -8
- package/src/download/core/figureSvg.ts +5 -2
- package/src/download/core/figureTarget.ts +28 -3
- package/src/download/core/svgBounds.ts +21 -0
- package/src/download/core/svgToPng.ts +3 -4
- package/src/format/core/relativeTime.ts +29 -7
- package/src/host/core/connectHost.ts +77 -120
- package/src/host/core/hostOutputs.ts +197 -0
- package/src/host/core/index.ts +13 -7
- package/src/host/core/irKinds.ts +92 -0
- package/src/host/core/kinds.ts +16 -6
- package/src/host/core/protocol.ts +50 -8
- package/src/host/core/selectInputs.ts +145 -0
- package/src/host/testing/sciPeaks.ts +140 -0
- package/src/host/testing/standInHost.ts +30 -5
- package/src/host/ui/useHostConnection.ts +17 -8
- package/src/host-testing.ts +4 -0
- package/src/ir/core/handPicking.ts +154 -0
- package/src/ir/core/index.ts +14 -0
- package/src/ir/core/irBandState.ts +155 -0
- package/src/ir/core/irCommands.ts +7 -0
- package/src/ir/core/irPeaks.ts +79 -0
- package/src/ir/core/irReducer.ts +27 -34
- package/src/ir/core/irSpectrum.ts +16 -0
- package/src/ir/core/irState.ts +15 -8
- package/src/ir/core/pickBands.ts +46 -39
- package/src/ir/core/ramanBands.ts +2 -2
- package/src/ir/core/spectrumBands.ts +113 -0
- package/src/ir/ui/BandRow.tsx +20 -2
- package/src/ir/ui/BandsPanel.tsx +46 -88
- package/src/ir/ui/BandsToolbar.tsx +152 -0
- package/src/ir/ui/IrCanvas.tsx +22 -11
- package/src/ir/ui/IrChart.tsx +10 -1
- package/src/ir/ui/IrDocumentationDialog.tsx +7 -0
- package/src/ir/ui/IrEditor.tsx +4 -2
- package/src/ir/ui/IrShell.tsx +5 -0
- package/src/ir/ui/IrStatusBar.tsx +4 -1
- package/src/ir/ui/IrToolbar.tsx +14 -5
- package/src/ir/ui/VibrationalEditor.tsx +2 -1
- package/src/ir/ui/irActions.ts +11 -0
- package/src/ir/ui/irChartProps.ts +4 -1
- package/src/ir/ui/useIrEditor.ts +21 -21
- package/src/locales/de.json +63 -0
- package/src/locales/en.json +63 -0
- package/src/locales/es.json +63 -0
- package/src/locales/fr.json +63 -0
- package/src/locales/it.json +63 -0
- package/src/mass/core/analyseSpectrum.ts +191 -0
- package/src/mass/core/ascendingTrace.ts +62 -0
- package/src/mass/core/centroidPeaks.ts +114 -0
- package/src/mass/core/detectMassFormat.ts +113 -0
- package/src/mass/core/downloadSpectra.ts +52 -0
- package/src/mass/core/fromJcamp.ts +151 -0
- package/src/mass/core/fromText.ts +58 -0
- package/src/mass/core/index.ts +194 -0
- package/src/mass/core/jcampTechnique.ts +87 -0
- package/src/mass/core/labelStackBox.ts +75 -0
- package/src/mass/core/labelledPeaks.ts +135 -0
- package/src/mass/core/loadMassSpectra.ts +86 -0
- package/src/mass/core/loadedMassSpectrum.ts +43 -0
- package/src/mass/core/massCommands.ts +156 -0
- package/src/mass/core/massDomain.ts +229 -0
- package/src/mass/core/massEditorApi.ts +68 -0
- package/src/mass/core/massFormat.ts +187 -0
- package/src/mass/core/massMeta.ts +239 -0
- package/src/mass/core/massReducer.ts +232 -0
- package/src/mass/core/massResolution.ts +169 -0
- package/src/mass/core/massSidePanels.ts +27 -0
- package/src/mass/core/massSpectrum.ts +220 -0
- package/src/mass/core/massState.ts +206 -0
- package/src/mass/core/massStateEdits.ts +104 -0
- package/src/mass/core/massSummary.ts +213 -0
- package/src/mass/core/mzDecimalsSetting.ts +52 -0
- package/src/mass/core/nearestPeak.ts +130 -0
- package/src/mass/core/peakLabelLines.ts +112 -0
- package/src/mass/core/peakLabelPlan.ts +246 -0
- package/src/mass/core/peakTable.ts +82 -0
- package/src/mass/core/resolutionOf.ts +100 -0
- package/src/mass/core/scanFilter.ts +119 -0
- package/src/mass/core/spectrumJcamp.ts +186 -0
- package/src/mass/core/toMassSpectrum.ts +126 -0
- package/src/mass/core/traceIcon.ts +105 -0
- package/src/mass/core/writtenResolution.ts +81 -0
- package/src/mass/ui/MassAboutDialog.tsx +89 -0
- package/src/mass/ui/MassCanvas.tsx +170 -0
- package/src/mass/ui/MassChart.tsx +266 -0
- package/src/mass/ui/MassCommandProvider.tsx +34 -0
- package/src/mass/ui/MassCommandTooltip.tsx +36 -0
- package/src/mass/ui/MassDocumentationDialog.tsx +136 -0
- package/src/mass/ui/MassEditor.tsx +130 -0
- package/src/mass/ui/MassHeader.tsx +38 -0
- package/src/mass/ui/MassLogo.tsx +84 -0
- package/src/mass/ui/MassPointerTracker.tsx +72 -0
- package/src/mass/ui/MassShell.tsx +237 -0
- package/src/mass/ui/MassSidePanel.tsx +107 -0
- package/src/mass/ui/MassStateProvider.tsx +32 -0
- package/src/mass/ui/MassStatusBar.tsx +108 -0
- package/src/mass/ui/MassToolbar.tsx +120 -0
- package/src/mass/ui/MetadataPanel.tsx +201 -0
- package/src/mass/ui/MzDecimalsMenu.tsx +86 -0
- package/src/mass/ui/PeakLabels.tsx +242 -0
- package/src/mass/ui/PeakTable.tsx +199 -0
- package/src/mass/ui/PeaksPanel.tsx +182 -0
- package/src/mass/ui/SpectraPanel.tsx +153 -0
- package/src/mass/ui/SpectrumRow.tsx +246 -0
- package/src/mass/ui/SpectrumTrace.tsx +119 -0
- package/src/mass/ui/index.ts +69 -0
- package/src/mass/ui/massActions.ts +109 -0
- package/src/mass/ui/massChartProps.ts +130 -0
- package/src/mass/ui/massCommandContext.tsx +65 -0
- package/src/mass/ui/massHostPanels.ts +71 -0
- package/src/mass/ui/massStateContext.ts +48 -0
- package/src/mass/ui/useIntensityZoom.ts +55 -0
- package/src/mass/ui/useMassEditor.ts +156 -0
- package/src/mass/ui/useMassFiles.ts +91 -0
- package/src/mass/ui/useMassHandle.ts +58 -0
- package/src/mass/ui/useMassPointer.ts +120 -0
- package/src/mass/ui/useMassShortcuts.ts +85 -0
- package/src/mass/ui/useMassSide.ts +63 -0
- package/src/mass/ui/useMassZoom.ts +157 -0
- package/src/mass.ts +16 -0
- package/src/panel/ui/PanelRail.tsx +5 -1
- package/src/slides/ui/slideSanitizeSchema.ts +86 -2
- package/styles/chrome.css +7 -0
- 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
|
+
}
|