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