react-cheminfo 0.28.0 → 0.30.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 +79 -26
- package/lib/chart/core/axisLabels.d.ts +82 -0
- package/lib/chart/core/axisLabels.d.ts.map +1 -0
- package/lib/chart/core/axisLabels.js +111 -0
- package/lib/chart/core/axisLabels.js.map +1 -0
- package/lib/chart/core/boxLayout.d.ts +53 -0
- package/lib/chart/core/boxLayout.d.ts.map +1 -0
- package/lib/chart/core/boxLayout.js +112 -0
- package/lib/chart/core/boxLayout.js.map +1 -0
- package/lib/chart/core/chartAxisScale.d.ts +23 -2
- package/lib/chart/core/chartAxisScale.d.ts.map +1 -1
- package/lib/chart/core/chartAxisScale.js +64 -13
- package/lib/chart/core/chartAxisScale.js.map +1 -1
- package/lib/chart/core/chartDomain.d.ts +160 -0
- package/lib/chart/core/chartDomain.d.ts.map +1 -0
- package/lib/chart/core/chartDomain.js +46 -0
- package/lib/chart/core/chartDomain.js.map +1 -0
- package/lib/chart/core/chartGeometry.d.ts +131 -0
- package/lib/chart/core/chartGeometry.d.ts.map +1 -0
- package/lib/chart/core/chartGeometry.js +101 -0
- package/lib/chart/core/chartGeometry.js.map +1 -0
- package/lib/chart/core/chartPane.d.ts +11 -0
- package/lib/chart/core/chartPane.d.ts.map +1 -0
- package/lib/chart/core/chartPane.js +11 -0
- package/lib/chart/core/chartPane.js.map +1 -0
- package/lib/chart/core/chartScale.d.ts +4 -1
- package/lib/chart/core/chartScale.d.ts.map +1 -1
- package/lib/chart/core/chartScale.js +8 -4
- package/lib/chart/core/chartScale.js.map +1 -1
- package/lib/chart/core/chartTheme.d.ts +156 -0
- package/lib/chart/core/chartTheme.d.ts.map +1 -0
- package/lib/chart/core/chartTheme.js +156 -0
- package/lib/chart/core/chartTheme.js.map +1 -0
- package/lib/chart/core/chartViewport.d.ts +32 -5
- package/lib/chart/core/chartViewport.d.ts.map +1 -1
- package/lib/chart/core/chartViewport.js +40 -11
- package/lib/chart/core/chartViewport.js.map +1 -1
- package/lib/chart/core/guidePlacement.d.ts +52 -0
- package/lib/chart/core/guidePlacement.d.ts.map +1 -0
- package/lib/chart/core/guidePlacement.js +52 -0
- package/lib/chart/core/guidePlacement.js.map +1 -0
- package/lib/chart/core/index.d.ts +29 -2
- package/lib/chart/core/index.d.ts.map +1 -1
- package/lib/chart/core/index.js +19 -2
- package/lib/chart/core/index.js.map +1 -1
- package/lib/chart/core/labelStack.d.ts +27 -0
- package/lib/chart/core/labelStack.d.ts.map +1 -0
- package/lib/chart/core/labelStack.js +62 -0
- package/lib/chart/core/labelStack.js.map +1 -0
- package/lib/chart/core/legendBox.d.ts +152 -0
- package/lib/chart/core/legendBox.d.ts.map +1 -0
- package/lib/chart/core/legendBox.js +169 -0
- package/lib/chart/core/legendBox.js.map +1 -0
- package/lib/chart/core/selectionGeometry.d.ts +45 -0
- package/lib/chart/core/selectionGeometry.d.ts.map +1 -0
- package/lib/chart/core/selectionGeometry.js +49 -0
- package/lib/chart/core/selectionGeometry.js.map +1 -0
- package/lib/chart/core/spectrumColor.d.ts +80 -0
- package/lib/chart/core/spectrumColor.d.ts.map +1 -0
- package/lib/chart/core/spectrumColor.js +120 -0
- package/lib/chart/core/spectrumColor.js.map +1 -0
- package/lib/chart/core/stackCapacity.d.ts +136 -0
- package/lib/chart/core/stackCapacity.d.ts.map +1 -0
- package/lib/chart/core/stackCapacity.js +153 -0
- package/lib/chart/core/stackCapacity.js.map +1 -0
- package/lib/chart/core/svgPoint.d.ts +62 -0
- package/lib/chart/core/svgPoint.d.ts.map +1 -0
- package/lib/chart/core/svgPoint.js +43 -0
- package/lib/chart/core/svgPoint.js.map +1 -0
- package/lib/chart/core/tracePath.d.ts +94 -0
- package/lib/chart/core/tracePath.d.ts.map +1 -0
- package/lib/chart/core/tracePath.js +191 -0
- package/lib/chart/core/tracePath.js.map +1 -0
- package/lib/chart/core/trackerReadout.d.ts +55 -0
- package/lib/chart/core/trackerReadout.d.ts.map +1 -0
- package/lib/chart/core/trackerReadout.js +53 -0
- package/lib/chart/core/trackerReadout.js.map +1 -0
- package/lib/chart/core/viewTransform.d.ts +167 -0
- package/lib/chart/core/viewTransform.d.ts.map +1 -0
- package/lib/chart/core/viewTransform.js +188 -0
- package/lib/chart/core/viewTransform.js.map +1 -0
- package/lib/chart/core/zoomDomain.d.ts +127 -0
- package/lib/chart/core/zoomDomain.d.ts.map +1 -0
- package/lib/chart/core/zoomDomain.js +175 -0
- package/lib/chart/core/zoomDomain.js.map +1 -0
- package/lib/chart/ui/Axes.d.ts +104 -0
- package/lib/chart/ui/Axes.d.ts.map +1 -0
- package/lib/chart/ui/Axes.js +155 -0
- package/lib/chart/ui/Axes.js.map +1 -0
- package/lib/chart/ui/AxisGuide.d.ts +60 -0
- package/lib/chart/ui/AxisGuide.d.ts.map +1 -0
- package/lib/chart/ui/AxisGuide.js +111 -0
- package/lib/chart/ui/AxisGuide.js.map +1 -0
- package/lib/chart/ui/ChartStack.d.ts +81 -0
- package/lib/chart/ui/ChartStack.d.ts.map +1 -0
- package/lib/chart/ui/ChartStack.js +42 -0
- package/lib/chart/ui/ChartStack.js.map +1 -0
- package/lib/chart/ui/ChartTracker.d.ts +36 -0
- package/lib/chart/ui/ChartTracker.d.ts.map +1 -0
- package/lib/chart/ui/ChartTracker.js +27 -0
- package/lib/chart/ui/ChartTracker.js.map +1 -0
- package/lib/chart/ui/PlotCaption.d.ts +44 -0
- package/lib/chart/ui/PlotCaption.d.ts.map +1 -0
- package/lib/chart/ui/PlotCaption.js +68 -0
- package/lib/chart/ui/PlotCaption.js.map +1 -0
- package/lib/chart/ui/SelectionRect.d.ts +27 -0
- package/lib/chart/ui/SelectionRect.d.ts.map +1 -0
- package/lib/chart/ui/SelectionRect.js +31 -0
- package/lib/chart/ui/SelectionRect.js.map +1 -0
- package/lib/chart/ui/TraceLegend.d.ts +99 -0
- package/lib/chart/ui/TraceLegend.d.ts.map +1 -0
- package/lib/chart/ui/TraceLegend.js +45 -0
- package/lib/chart/ui/TraceLegend.js.map +1 -0
- package/lib/chart/ui/chartGestures.d.ts +158 -0
- package/lib/chart/ui/chartGestures.d.ts.map +1 -0
- package/lib/chart/ui/chartGestures.js +145 -0
- package/lib/chart/ui/chartGestures.js.map +1 -0
- package/lib/chart/ui/chartStackLevel.d.ts +115 -0
- package/lib/chart/ui/chartStackLevel.d.ts.map +1 -0
- package/lib/chart/ui/chartStackLevel.js +96 -0
- package/lib/chart/ui/chartStackLevel.js.map +1 -0
- package/lib/chart/ui/chartSurface.d.ts +35 -0
- package/lib/chart/ui/chartSurface.d.ts.map +1 -0
- package/lib/chart/ui/chartSurface.js +58 -0
- package/lib/chart/ui/chartSurface.js.map +1 -0
- package/lib/chart/ui/index.d.ts +24 -0
- package/lib/chart/ui/index.d.ts.map +1 -1
- package/lib/chart/ui/index.js +13 -0
- package/lib/chart/ui/index.js.map +1 -1
- package/lib/chart/ui/useChartPointer.d.ts +124 -0
- package/lib/chart/ui/useChartPointer.d.ts.map +1 -0
- package/lib/chart/ui/useChartPointer.js +152 -0
- package/lib/chart/ui/useChartPointer.js.map +1 -0
- package/lib/chart/ui/useChartSize.d.ts +49 -0
- package/lib/chart/ui/useChartSize.d.ts.map +1 -0
- package/lib/chart/ui/useChartSize.js +91 -0
- package/lib/chart/ui/useChartSize.js.map +1 -0
- package/lib/chart/ui/useChartWindow.d.ts +147 -0
- package/lib/chart/ui/useChartWindow.d.ts.map +1 -0
- package/lib/chart/ui/useChartWindow.js +135 -0
- package/lib/chart/ui/useChartWindow.js.map +1 -0
- package/lib/chart/ui/useChartZoom.d.ts +88 -0
- package/lib/chart/ui/useChartZoom.d.ts.map +1 -0
- package/lib/chart/ui/useChartZoom.js +142 -0
- package/lib/chart/ui/useChartZoom.js.map +1 -0
- package/lib/chart/ui/useWheelListener.d.ts +30 -0
- package/lib/chart/ui/useWheelListener.d.ts.map +1 -0
- package/lib/chart/ui/useWheelListener.js +57 -0
- package/lib/chart/ui/useWheelListener.js.map +1 -0
- package/lib/chrome/ui/AccountButton.d.ts +76 -0
- package/lib/chrome/ui/AccountButton.d.ts.map +1 -0
- package/lib/chrome/ui/AccountButton.js +66 -0
- package/lib/chrome/ui/AccountButton.js.map +1 -0
- package/lib/chrome/ui/index.d.ts +2 -0
- package/lib/chrome/ui/index.d.ts.map +1 -1
- package/lib/chrome/ui/index.js +1 -0
- package/lib/chrome/ui/index.js.map +1 -1
- package/lib/clipboard/core/copyPng.d.ts +13 -0
- package/lib/clipboard/core/copyPng.d.ts.map +1 -0
- package/lib/clipboard/core/copyPng.js +19 -0
- package/lib/clipboard/core/copyPng.js.map +1 -0
- package/lib/clipboard/core/index.d.ts +1 -0
- package/lib/clipboard/core/index.d.ts.map +1 -1
- package/lib/clipboard/core/index.js +1 -0
- package/lib/clipboard/core/index.js.map +1 -1
- package/lib/clipboard/ui/ClickToCopy.d.ts +6 -0
- package/lib/clipboard/ui/ClickToCopy.d.ts.map +1 -1
- package/lib/clipboard/ui/ClickToCopy.js +3 -3
- package/lib/clipboard/ui/ClickToCopy.js.map +1 -1
- package/lib/core.d.ts +1 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +1 -0
- package/lib/core.js.map +1 -1
- package/lib/download/core/exportStyles.d.ts +22 -0
- package/lib/download/core/exportStyles.d.ts.map +1 -0
- package/lib/download/core/exportStyles.js +19 -0
- package/lib/download/core/exportStyles.js.map +1 -0
- package/lib/download/core/imageResolution.d.ts +88 -0
- package/lib/download/core/imageResolution.d.ts.map +1 -0
- package/lib/download/core/imageResolution.js +77 -0
- package/lib/download/core/imageResolution.js.map +1 -0
- package/lib/download/core/index.d.ts +13 -0
- package/lib/download/core/index.d.ts.map +1 -1
- package/lib/download/core/index.js +8 -0
- package/lib/download/core/index.js.map +1 -1
- package/lib/download/core/pictureExport.d.ts +93 -0
- package/lib/download/core/pictureExport.d.ts.map +1 -0
- package/lib/download/core/pictureExport.js +116 -0
- package/lib/download/core/pictureExport.js.map +1 -0
- package/lib/download/core/stackedDrawing.d.ts +36 -0
- package/lib/download/core/stackedDrawing.d.ts.map +1 -0
- package/lib/download/core/stackedDrawing.js +98 -0
- package/lib/download/core/stackedDrawing.js.map +1 -0
- package/lib/download/core/svgBounds.d.ts +44 -0
- package/lib/download/core/svgBounds.d.ts.map +1 -0
- package/lib/download/core/svgBounds.js +69 -0
- package/lib/download/core/svgBounds.js.map +1 -0
- package/lib/download/core/svgNamespace.d.ts +9 -0
- package/lib/download/core/svgNamespace.d.ts.map +1 -0
- package/lib/download/core/svgNamespace.js +10 -0
- package/lib/download/core/svgNamespace.js.map +1 -0
- package/lib/download/core/svgToPng.d.ts +43 -0
- package/lib/download/core/svgToPng.d.ts.map +1 -0
- package/lib/download/core/svgToPng.js +79 -0
- package/lib/download/core/svgToPng.js.map +1 -0
- package/lib/download/core/svgToString.d.ts +45 -0
- package/lib/download/core/svgToString.d.ts.map +1 -0
- package/lib/download/core/svgToString.js +58 -0
- package/lib/download/core/svgToString.js.map +1 -0
- package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
- package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
- package/lib/download/ui/ExportDialogFrame.js +24 -0
- package/lib/download/ui/ExportDialogFrame.js.map +1 -0
- package/lib/download/ui/ExportImageDialog.d.ts +47 -0
- package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
- package/lib/download/ui/ExportImageDialog.js +25 -0
- package/lib/download/ui/ExportImageDialog.js.map +1 -0
- package/lib/download/ui/ExportNameField.d.ts +29 -0
- package/lib/download/ui/ExportNameField.d.ts.map +1 -0
- package/lib/download/ui/ExportNameField.js +99 -0
- package/lib/download/ui/ExportNameField.js.map +1 -0
- package/lib/download/ui/ExportPictureSection.d.ts +38 -0
- package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
- package/lib/download/ui/ExportPictureSection.js +48 -0
- package/lib/download/ui/ExportPictureSection.js.map +1 -0
- package/lib/download/ui/index.d.ts +10 -0
- package/lib/download/ui/index.d.ts.map +1 -1
- package/lib/download/ui/index.js +5 -0
- package/lib/download/ui/index.js.map +1 -1
- package/lib/download/ui/useDrawingBox.d.ts +23 -0
- package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
- package/lib/download/ui/useDrawingBox.js +21 -0
- package/lib/download/ui/useDrawingBox.js.map +1 -0
- package/lib/error/core/describeSource.d.ts +17 -0
- package/lib/error/core/describeSource.d.ts.map +1 -0
- package/lib/error/core/describeSource.js +19 -0
- package/lib/error/core/describeSource.js.map +1 -0
- package/lib/error/core/index.d.ts +1 -0
- package/lib/error/core/index.d.ts.map +1 -1
- package/lib/error/core/index.js +1 -0
- package/lib/error/core/index.js.map +1 -1
- package/lib/help/ui/HelpBody.d.ts +10 -1
- package/lib/help/ui/HelpBody.d.ts.map +1 -1
- package/lib/help/ui/HelpBody.js +24 -1
- package/lib/help/ui/HelpBody.js.map +1 -1
- package/lib/help/ui/index.d.ts +1 -1
- package/lib/help/ui/index.d.ts.map +1 -1
- package/lib/help/ui/index.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/analysisSpectra.d.ts +46 -0
- package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
- package/lib/ir/core/analysisSpectra.js +187 -0
- package/lib/ir/core/analysisSpectra.js.map +1 -0
- package/lib/ir/core/assignBands.d.ts +83 -0
- package/lib/ir/core/assignBands.d.ts.map +1 -0
- package/lib/ir/core/assignBands.js +83 -0
- package/lib/ir/core/assignBands.js.map +1 -0
- package/lib/ir/core/bandAssignments.d.ts +47 -0
- package/lib/ir/core/bandAssignments.d.ts.map +1 -0
- package/lib/ir/core/bandAssignments.js +305 -0
- package/lib/ir/core/bandAssignments.js.map +1 -0
- package/lib/ir/core/bandLabelPlan.d.ts +93 -0
- package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
- package/lib/ir/core/bandLabelPlan.js +104 -0
- package/lib/ir/core/bandLabelPlan.js.map +1 -0
- package/lib/ir/core/detectIrFormat.d.ts +23 -0
- package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
- package/lib/ir/core/detectIrFormat.js +133 -0
- package/lib/ir/core/detectIrFormat.js.map +1 -0
- package/lib/ir/core/downloadSpectra.d.ts +26 -0
- package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
- package/lib/ir/core/downloadSpectra.js +37 -0
- package/lib/ir/core/downloadSpectra.js.map +1 -0
- package/lib/ir/core/fromJcamp.d.ts +35 -0
- package/lib/ir/core/fromJcamp.d.ts.map +1 -0
- package/lib/ir/core/fromJcamp.js +48 -0
- package/lib/ir/core/fromJcamp.js.map +1 -0
- package/lib/ir/core/fromSpc.d.ts +30 -0
- package/lib/ir/core/fromSpc.d.ts.map +1 -0
- package/lib/ir/core/fromSpc.js +40 -0
- package/lib/ir/core/fromSpc.js.map +1 -0
- package/lib/ir/core/index.d.ts +51 -0
- package/lib/ir/core/index.d.ts.map +1 -0
- package/lib/ir/core/index.js +35 -0
- package/lib/ir/core/index.js.map +1 -0
- package/lib/ir/core/irBand.d.ts +45 -0
- package/lib/ir/core/irBand.d.ts.map +1 -0
- package/lib/ir/core/irBand.js +30 -0
- package/lib/ir/core/irBand.js.map +1 -0
- package/lib/ir/core/irCommands.d.ts +168 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -0
- package/lib/ir/core/irCommands.js +94 -0
- package/lib/ir/core/irCommands.js.map +1 -0
- package/lib/ir/core/irDomain.d.ts +63 -0
- package/lib/ir/core/irDomain.d.ts.map +1 -0
- package/lib/ir/core/irDomain.js +136 -0
- package/lib/ir/core/irDomain.js.map +1 -0
- package/lib/ir/core/irEditorApi.d.ts +42 -0
- package/lib/ir/core/irEditorApi.d.ts.map +1 -0
- package/lib/ir/core/irEditorApi.js +10 -0
- package/lib/ir/core/irEditorApi.js.map +1 -0
- package/lib/ir/core/irFormat.d.ts +42 -0
- package/lib/ir/core/irFormat.d.ts.map +1 -0
- package/lib/ir/core/irFormat.js +51 -0
- package/lib/ir/core/irFormat.js.map +1 -0
- package/lib/ir/core/irMode.d.ts +160 -0
- package/lib/ir/core/irMode.d.ts.map +1 -0
- package/lib/ir/core/irMode.js +175 -0
- package/lib/ir/core/irMode.js.map +1 -0
- package/lib/ir/core/irReducer.d.ts +101 -0
- package/lib/ir/core/irReducer.d.ts.map +1 -0
- package/lib/ir/core/irReducer.js +207 -0
- package/lib/ir/core/irReducer.js.map +1 -0
- package/lib/ir/core/irSidePanels.d.ts +22 -0
- package/lib/ir/core/irSidePanels.d.ts.map +1 -0
- package/lib/ir/core/irSidePanels.js +12 -0
- package/lib/ir/core/irSidePanels.js.map +1 -0
- package/lib/ir/core/irSpectrum.d.ts +140 -0
- package/lib/ir/core/irSpectrum.d.ts.map +1 -0
- package/lib/ir/core/irSpectrum.js +34 -0
- package/lib/ir/core/irSpectrum.js.map +1 -0
- package/lib/ir/core/irState.d.ts +119 -0
- package/lib/ir/core/irState.d.ts.map +1 -0
- package/lib/ir/core/irState.js +92 -0
- package/lib/ir/core/irState.js.map +1 -0
- package/lib/ir/core/loadIrSpectra.d.ts +36 -0
- package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
- package/lib/ir/core/loadIrSpectra.js +44 -0
- package/lib/ir/core/loadIrSpectra.js.map +1 -0
- package/lib/ir/core/nearestBand.d.ts +35 -0
- package/lib/ir/core/nearestBand.d.ts.map +1 -0
- package/lib/ir/core/nearestBand.js +47 -0
- package/lib/ir/core/nearestBand.js.map +1 -0
- package/lib/ir/core/pickBands.d.ts +70 -0
- package/lib/ir/core/pickBands.d.ts.map +1 -0
- package/lib/ir/core/pickBands.js +125 -0
- package/lib/ir/core/pickBands.js.map +1 -0
- package/lib/ir/core/spectrumJcamp.d.ts +58 -0
- package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
- package/lib/ir/core/spectrumJcamp.js +156 -0
- package/lib/ir/core/spectrumJcamp.js.map +1 -0
- package/lib/ir/core/toIrSpectrum.d.ts +59 -0
- package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
- package/lib/ir/core/toIrSpectrum.js +56 -0
- package/lib/ir/core/toIrSpectrum.js.map +1 -0
- package/lib/ir/ui/BandMarks.d.ts +52 -0
- package/lib/ir/ui/BandMarks.d.ts.map +1 -0
- package/lib/ir/ui/BandMarks.js +71 -0
- package/lib/ir/ui/BandMarks.js.map +1 -0
- package/lib/ir/ui/BandsPanel.d.ts +31 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
- package/lib/ir/ui/BandsPanel.js +94 -0
- package/lib/ir/ui/BandsPanel.js.map +1 -0
- package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
- package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
- package/lib/ir/ui/IrAboutDialog.js +32 -0
- package/lib/ir/ui/IrAboutDialog.js.map +1 -0
- package/lib/ir/ui/IrCanvas.d.ts +38 -0
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
- package/lib/ir/ui/IrCanvas.js +41 -0
- package/lib/ir/ui/IrCanvas.js.map +1 -0
- package/lib/ir/ui/IrChart.d.ts +28 -0
- package/lib/ir/ui/IrChart.d.ts.map +1 -0
- package/lib/ir/ui/IrChart.js +114 -0
- package/lib/ir/ui/IrChart.js.map +1 -0
- package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
- package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
- package/lib/ir/ui/IrCommandProvider.js +14 -0
- package/lib/ir/ui/IrCommandProvider.js.map +1 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
- package/lib/ir/ui/IrCommandTooltip.js +22 -0
- package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
- package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
- package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
- package/lib/ir/ui/IrDocumentationDialog.js +68 -0
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
- package/lib/ir/ui/IrEditor.d.ts +60 -0
- package/lib/ir/ui/IrEditor.d.ts.map +1 -0
- package/lib/ir/ui/IrEditor.js +42 -0
- package/lib/ir/ui/IrEditor.js.map +1 -0
- package/lib/ir/ui/IrHeader.d.ts +13 -0
- package/lib/ir/ui/IrHeader.d.ts.map +1 -0
- package/lib/ir/ui/IrHeader.js +21 -0
- package/lib/ir/ui/IrHeader.js.map +1 -0
- package/lib/ir/ui/IrLogo.d.ts +20 -0
- package/lib/ir/ui/IrLogo.d.ts.map +1 -0
- package/lib/ir/ui/IrLogo.js +17 -0
- package/lib/ir/ui/IrLogo.js.map +1 -0
- package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
- package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
- package/lib/ir/ui/IrPointerTracker.js +47 -0
- package/lib/ir/ui/IrPointerTracker.js.map +1 -0
- package/lib/ir/ui/IrShell.d.ts +25 -0
- package/lib/ir/ui/IrShell.d.ts.map +1 -0
- package/lib/ir/ui/IrShell.js +178 -0
- package/lib/ir/ui/IrShell.js.map +1 -0
- package/lib/ir/ui/IrSidePanel.d.ts +26 -0
- package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
- package/lib/ir/ui/IrSidePanel.js +39 -0
- package/lib/ir/ui/IrSidePanel.js.map +1 -0
- package/lib/ir/ui/IrStateProvider.d.ts +19 -0
- package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
- package/lib/ir/ui/IrStateProvider.js +16 -0
- package/lib/ir/ui/IrStateProvider.js.map +1 -0
- package/lib/ir/ui/IrStatusBar.d.ts +14 -0
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
- package/lib/ir/ui/IrStatusBar.js +48 -0
- package/lib/ir/ui/IrStatusBar.js.map +1 -0
- package/lib/ir/ui/IrToolbar.d.ts +18 -0
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
- package/lib/ir/ui/IrToolbar.js +32 -0
- package/lib/ir/ui/IrToolbar.js.map +1 -0
- package/lib/ir/ui/IrTraces.d.ts +63 -0
- package/lib/ir/ui/IrTraces.d.ts.map +1 -0
- package/lib/ir/ui/IrTraces.js +72 -0
- package/lib/ir/ui/IrTraces.js.map +1 -0
- package/lib/ir/ui/MetadataPanel.d.ts +15 -0
- package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
- package/lib/ir/ui/MetadataPanel.js +49 -0
- package/lib/ir/ui/MetadataPanel.js.map +1 -0
- package/lib/ir/ui/SpectraPanel.d.ts +20 -0
- package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
- package/lib/ir/ui/SpectraPanel.js +42 -0
- package/lib/ir/ui/SpectraPanel.js.map +1 -0
- package/lib/ir/ui/SpectrumRow.d.ts +26 -0
- package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
- package/lib/ir/ui/SpectrumRow.js +41 -0
- package/lib/ir/ui/SpectrumRow.js.map +1 -0
- package/lib/ir/ui/index.d.ts +56 -0
- package/lib/ir/ui/index.d.ts.map +1 -0
- package/lib/ir/ui/index.js +36 -0
- package/lib/ir/ui/index.js.map +1 -0
- package/lib/ir/ui/irActions.d.ts +52 -0
- package/lib/ir/ui/irActions.d.ts.map +1 -0
- package/lib/ir/ui/irActions.js +62 -0
- package/lib/ir/ui/irActions.js.map +1 -0
- package/lib/ir/ui/irChartProps.d.ts +116 -0
- package/lib/ir/ui/irChartProps.d.ts.map +1 -0
- package/lib/ir/ui/irChartProps.js +14 -0
- package/lib/ir/ui/irChartProps.js.map +1 -0
- package/lib/ir/ui/irCommandContext.d.ts +35 -0
- package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
- package/lib/ir/ui/irCommandContext.js +44 -0
- package/lib/ir/ui/irCommandContext.js.map +1 -0
- package/lib/ir/ui/irStateContext.d.ts +26 -0
- package/lib/ir/ui/irStateContext.d.ts.map +1 -0
- package/lib/ir/ui/irStateContext.js +37 -0
- package/lib/ir/ui/irStateContext.js.map +1 -0
- package/lib/ir/ui/useIrEditor.d.ts +51 -0
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
- package/lib/ir/ui/useIrEditor.js +88 -0
- package/lib/ir/ui/useIrEditor.js.map +1 -0
- package/lib/ir/ui/useIrPointer.d.ts +66 -0
- package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
- package/lib/ir/ui/useIrPointer.js +53 -0
- package/lib/ir/ui/useIrPointer.js.map +1 -0
- package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
- package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
- package/lib/ir/ui/useIrShortcuts.js +73 -0
- package/lib/ir/ui/useIrShortcuts.js.map +1 -0
- package/lib/ir/ui/useIrZoom.d.ts +51 -0
- package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
- package/lib/ir/ui/useIrZoom.js +46 -0
- package/lib/ir/ui/useIrZoom.js.map +1 -0
- package/lib/ir.d.ts +13 -0
- package/lib/ir.d.ts.map +1 -0
- package/lib/ir.js +13 -0
- package/lib/ir.js.map +1 -0
- package/lib/locales/de.json +3 -0
- package/lib/locales/en.json +3 -0
- package/lib/locales/es.json +3 -0
- package/lib/locales/fr.json +3 -0
- package/lib/panel/core/dialogStyles.d.ts +13 -0
- package/lib/panel/core/dialogStyles.d.ts.map +1 -0
- package/lib/panel/core/dialogStyles.js +11 -0
- package/lib/panel/core/dialogStyles.js.map +1 -0
- package/lib/panel/core/index.d.ts +19 -0
- package/lib/panel/core/index.d.ts.map +1 -0
- package/lib/panel/core/index.js +18 -0
- package/lib/panel/core/index.js.map +1 -0
- package/lib/panel/core/isEditingField.d.ts +17 -0
- package/lib/panel/core/isEditingField.d.ts.map +1 -0
- package/lib/panel/core/isEditingField.js +25 -0
- package/lib/panel/core/isEditingField.js.map +1 -0
- package/lib/panel/core/panelStyles.d.ts +242 -0
- package/lib/panel/core/panelStyles.d.ts.map +1 -0
- package/lib/panel/core/panelStyles.js +228 -0
- package/lib/panel/core/panelStyles.js.map +1 -0
- package/lib/panel/core/rowSpacers.d.ts +38 -0
- package/lib/panel/core/rowSpacers.d.ts.map +1 -0
- package/lib/panel/core/rowSpacers.js +31 -0
- package/lib/panel/core/rowSpacers.js.map +1 -0
- package/lib/panel/core/statusBar.d.ts +44 -0
- package/lib/panel/core/statusBar.d.ts.map +1 -0
- package/lib/panel/core/statusBar.js +40 -0
- package/lib/panel/core/statusBar.js.map +1 -0
- package/lib/panel/core/textFilter.d.ts +22 -0
- package/lib/panel/core/textFilter.d.ts.map +1 -0
- package/lib/panel/core/textFilter.js +32 -0
- package/lib/panel/core/textFilter.js.map +1 -0
- package/lib/panel/core/yieldToPainting.d.ts +17 -0
- package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
- package/lib/panel/core/yieldToPainting.js +21 -0
- package/lib/panel/core/yieldToPainting.js.map +1 -0
- package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
- package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
- package/lib/panel/ui/AboutDialogFrame.js +43 -0
- package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
- package/lib/panel/ui/ClearButton.d.ts +28 -0
- package/lib/panel/ui/ClearButton.d.ts.map +1 -0
- package/lib/panel/ui/ClearButton.js +23 -0
- package/lib/panel/ui/ClearButton.js.map +1 -0
- package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
- package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
- package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
- package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
- package/lib/panel/ui/FilterInput.d.ts +31 -0
- package/lib/panel/ui/FilterInput.d.ts.map +1 -0
- package/lib/panel/ui/FilterInput.js +23 -0
- package/lib/panel/ui/FilterInput.js.map +1 -0
- package/lib/panel/ui/HelpLabel.d.ts +24 -0
- package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
- package/lib/panel/ui/HelpLabel.js +23 -0
- package/lib/panel/ui/HelpLabel.js.map +1 -0
- package/lib/panel/ui/PanelMessage.d.ts +41 -0
- package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
- package/lib/panel/ui/PanelMessage.js +30 -0
- package/lib/panel/ui/PanelMessage.js.map +1 -0
- package/lib/panel/ui/PanelRail.d.ts +41 -0
- package/lib/panel/ui/PanelRail.d.ts.map +1 -0
- package/lib/panel/ui/PanelRail.js +12 -0
- package/lib/panel/ui/PanelRail.js.map +1 -0
- package/lib/panel/ui/Section.d.ts +25 -0
- package/lib/panel/ui/Section.d.ts.map +1 -0
- package/lib/panel/ui/Section.js +41 -0
- package/lib/panel/ui/Section.js.map +1 -0
- package/lib/panel/ui/SidePanelStack.d.ts +62 -0
- package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
- package/lib/panel/ui/SidePanelStack.js +40 -0
- package/lib/panel/ui/SidePanelStack.js.map +1 -0
- package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
- package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
- package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
- package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
- package/lib/panel/ui/index.d.ts +37 -0
- package/lib/panel/ui/index.d.ts.map +1 -0
- package/lib/panel/ui/index.js +24 -0
- package/lib/panel/ui/index.js.map +1 -0
- package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
- package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
- package/lib/panel/ui/useConfirmOnEnter.js +64 -0
- package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
- package/lib/panel/ui/useFilterBox.d.ts +23 -0
- package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
- package/lib/panel/ui/useFilterBox.js +22 -0
- package/lib/panel/ui/useFilterBox.js.map +1 -0
- package/lib/panel/ui/useVirtualRows.d.ts +46 -0
- package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
- package/lib/panel/ui/useVirtualRows.js +56 -0
- package/lib/panel/ui/useVirtualRows.js.map +1 -0
- package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
- package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
- package/lib/panel/ui/useVirtualWindowRows.js +65 -0
- package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
- package/lib/structure/core/conformerBoltzmann.d.ts +56 -0
- package/lib/structure/core/conformerBoltzmann.d.ts.map +1 -0
- package/lib/structure/core/conformerBoltzmann.js +96 -0
- package/lib/structure/core/conformerBoltzmann.js.map +1 -0
- package/lib/structure/core/conformerEnergy.d.ts +69 -0
- package/lib/structure/core/conformerEnergy.d.ts.map +1 -0
- package/lib/structure/core/conformerEnergy.js +47 -0
- package/lib/structure/core/conformerEnergy.js.map +1 -0
- package/lib/structure/core/index.d.ts +3 -0
- package/lib/structure/core/index.d.ts.map +1 -1
- package/lib/structure/core/index.js +2 -0
- package/lib/structure/core/index.js.map +1 -1
- package/lib/structure/ui/ConformerTable.d.ts +73 -0
- package/lib/structure/ui/ConformerTable.d.ts.map +1 -0
- package/lib/structure/ui/ConformerTable.js +259 -0
- package/lib/structure/ui/ConformerTable.js.map +1 -0
- package/lib/structure/ui/conformerColumns.d.ts +30 -0
- package/lib/structure/ui/conformerColumns.d.ts.map +1 -0
- package/lib/structure/ui/conformerColumns.js +37 -0
- package/lib/structure/ui/conformerColumns.js.map +1 -0
- package/lib/ui.d.ts +5 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +3 -0
- package/lib/ui.js.map +1 -1
- package/package.json +8 -1
- package/src/chart/core/axisLabels.ts +117 -0
- package/src/chart/core/boxLayout.ts +126 -0
- package/src/chart/core/chartAxisScale.ts +92 -10
- package/src/chart/core/chartDomain.ts +185 -0
- package/src/chart/core/chartGeometry.ts +159 -0
- package/src/chart/core/chartPane.ts +10 -0
- package/src/chart/core/chartScale.ts +7 -4
- package/src/chart/core/chartTheme.ts +161 -0
- package/src/chart/core/chartViewport.ts +40 -13
- package/src/chart/core/guidePlacement.ts +66 -0
- package/src/chart/core/index.ts +121 -2
- package/src/chart/core/labelStack.ts +72 -0
- package/src/chart/core/legendBox.ts +263 -0
- package/src/chart/core/selectionGeometry.ts +68 -0
- package/src/chart/core/spectrumColor.ts +129 -0
- package/src/chart/core/stackCapacity.ts +162 -0
- package/src/chart/core/svgPoint.ts +77 -0
- package/src/chart/core/tracePath.ts +228 -0
- package/src/chart/core/trackerReadout.ts +78 -0
- package/src/chart/core/viewTransform.ts +287 -0
- package/src/chart/core/zoomDomain.ts +235 -0
- package/src/chart/ui/Axes.tsx +361 -0
- package/src/chart/ui/AxisGuide.tsx +187 -0
- package/src/chart/ui/ChartStack.tsx +130 -0
- package/src/chart/ui/ChartTracker.tsx +101 -0
- package/src/chart/ui/PlotCaption.tsx +108 -0
- package/src/chart/ui/SelectionRect.tsx +52 -0
- package/src/chart/ui/TraceLegend.tsx +193 -0
- package/src/chart/ui/chartGestures.ts +270 -0
- package/src/chart/ui/chartStackLevel.tsx +210 -0
- package/src/chart/ui/chartSurface.ts +66 -0
- package/src/chart/ui/index.ts +35 -0
- package/src/chart/ui/useChartPointer.ts +223 -0
- package/src/chart/ui/useChartSize.ts +115 -0
- package/src/chart/ui/useChartWindow.ts +240 -0
- package/src/chart/ui/useChartZoom.ts +255 -0
- package/src/chart/ui/useWheelListener.ts +62 -0
- package/src/chrome/ui/AccountButton.tsx +185 -0
- package/src/chrome/ui/index.ts +2 -0
- package/src/clipboard/core/copyPng.ts +20 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/ui/ClickToCopy.tsx +9 -1
- package/src/core.ts +1 -0
- package/src/download/core/exportStyles.ts +20 -0
- package/src/download/core/imageResolution.ts +118 -0
- package/src/download/core/index.ts +34 -0
- package/src/download/core/pictureExport.ts +207 -0
- package/src/download/core/stackedDrawing.ts +108 -0
- package/src/download/core/svgBounds.ts +80 -0
- package/src/download/core/svgNamespace.ts +9 -0
- package/src/download/core/svgToPng.ts +121 -0
- package/src/download/core/svgToString.ts +95 -0
- package/src/download/ui/ExportDialogFrame.tsx +86 -0
- package/src/download/ui/ExportImageDialog.tsx +91 -0
- package/src/download/ui/ExportNameField.tsx +148 -0
- package/src/download/ui/ExportPictureSection.tsx +142 -0
- package/src/download/ui/index.ts +11 -0
- package/src/download/ui/useDrawingBox.ts +37 -0
- package/src/error/core/describeSource.ts +18 -0
- package/src/error/core/index.ts +1 -0
- package/src/help/ui/HelpBody.tsx +41 -2
- package/src/help/ui/index.ts +6 -1
- package/src/ir/core/analysisSpectra.ts +231 -0
- package/src/ir/core/assignBands.ts +144 -0
- package/src/ir/core/bandAssignments.ts +329 -0
- package/src/ir/core/bandLabelPlan.ts +194 -0
- package/src/ir/core/detectIrFormat.ts +139 -0
- package/src/ir/core/downloadSpectra.ts +57 -0
- package/src/ir/core/fromJcamp.ts +70 -0
- package/src/ir/core/fromSpc.ts +61 -0
- package/src/ir/core/index.ts +113 -0
- package/src/ir/core/irBand.ts +57 -0
- package/src/ir/core/irCommands.ts +154 -0
- package/src/ir/core/irDomain.ts +163 -0
- package/src/ir/core/irEditorApi.ts +44 -0
- package/src/ir/core/irFormat.ts +57 -0
- package/src/ir/core/irMode.ts +203 -0
- package/src/ir/core/irReducer.ts +273 -0
- package/src/ir/core/irSidePanels.ts +20 -0
- package/src/ir/core/irSpectrum.ts +155 -0
- package/src/ir/core/irState.ts +173 -0
- package/src/ir/core/loadIrSpectra.ts +79 -0
- package/src/ir/core/nearestBand.ts +57 -0
- package/src/ir/core/pickBands.ts +181 -0
- package/src/ir/core/spectrumJcamp.ts +178 -0
- package/src/ir/core/toIrSpectrum.ts +102 -0
- package/src/ir/ui/BandMarks.tsx +166 -0
- package/src/ir/ui/BandsPanel.tsx +271 -0
- package/src/ir/ui/IrAboutDialog.tsx +121 -0
- package/src/ir/ui/IrCanvas.tsx +91 -0
- package/src/ir/ui/IrChart.tsx +215 -0
- package/src/ir/ui/IrCommandProvider.tsx +32 -0
- package/src/ir/ui/IrCommandTooltip.tsx +36 -0
- package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
- package/src/ir/ui/IrEditor.tsx +99 -0
- package/src/ir/ui/IrHeader.tsx +39 -0
- package/src/ir/ui/IrLogo.tsx +49 -0
- package/src/ir/ui/IrPointerTracker.tsx +102 -0
- package/src/ir/ui/IrShell.tsx +285 -0
- package/src/ir/ui/IrSidePanel.tsx +78 -0
- package/src/ir/ui/IrStateProvider.tsx +32 -0
- package/src/ir/ui/IrStatusBar.tsx +97 -0
- package/src/ir/ui/IrToolbar.tsx +102 -0
- package/src/ir/ui/IrTraces.tsx +134 -0
- package/src/ir/ui/MetadataPanel.tsx +88 -0
- package/src/ir/ui/SpectraPanel.tsx +114 -0
- package/src/ir/ui/SpectrumRow.tsx +127 -0
- package/src/ir/ui/index.ts +56 -0
- package/src/ir/ui/irActions.ts +103 -0
- package/src/ir/ui/irChartProps.ts +118 -0
- package/src/ir/ui/irCommandContext.tsx +62 -0
- package/src/ir/ui/irStateContext.ts +48 -0
- package/src/ir/ui/useIrEditor.ts +139 -0
- package/src/ir/ui/useIrPointer.ts +109 -0
- package/src/ir/ui/useIrShortcuts.ts +95 -0
- package/src/ir/ui/useIrZoom.ts +86 -0
- package/src/ir.ts +13 -0
- package/src/locales/de.json +3 -0
- package/src/locales/en.json +3 -0
- package/src/locales/es.json +3 -0
- package/src/locales/fr.json +3 -0
- package/src/panel/core/dialogStyles.ts +11 -0
- package/src/panel/core/index.ts +47 -0
- package/src/panel/core/isEditingField.ts +23 -0
- package/src/panel/core/panelStyles.ts +248 -0
- package/src/panel/core/rowSpacers.ts +50 -0
- package/src/panel/core/statusBar.ts +48 -0
- package/src/panel/core/textFilter.ts +33 -0
- package/src/panel/core/yieldToPainting.ts +20 -0
- package/src/panel/ui/AboutDialogFrame.tsx +100 -0
- package/src/panel/ui/ClearButton.tsx +42 -0
- package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
- package/src/panel/ui/FilterInput.tsx +60 -0
- package/src/panel/ui/HelpLabel.tsx +43 -0
- package/src/panel/ui/PanelMessage.tsx +64 -0
- package/src/panel/ui/PanelRail.tsx +64 -0
- package/src/panel/ui/Section.tsx +66 -0
- package/src/panel/ui/SidePanelStack.tsx +109 -0
- package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
- package/src/panel/ui/index.ts +47 -0
- package/src/panel/ui/useConfirmOnEnter.ts +68 -0
- package/src/panel/ui/useFilterBox.ts +35 -0
- package/src/panel/ui/useVirtualRows.ts +82 -0
- package/src/panel/ui/useVirtualWindowRows.ts +86 -0
- package/src/structure/core/conformerBoltzmann.ts +102 -0
- package/src/structure/core/conformerEnergy.ts +97 -0
- package/src/structure/core/index.ts +15 -0
- package/src/structure/ui/ConformerTable.tsx +429 -0
- package/src/structure/ui/conformerColumns.ts +55 -0
- package/src/ui.ts +13 -0
- package/styles/chrome.css +55 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The handle a host drives the viewer through.
|
|
3
|
+
*
|
|
4
|
+
* A handle rather than props, for the reason NMRium uses one: "frame this band"
|
|
5
|
+
* and "take these spectra" are *gestures*, and a gesture expressed as a prop has
|
|
6
|
+
* to change to be obeyed — so asking for the same window twice does nothing the
|
|
7
|
+
* second time, and a host ends up inventing a nonce to make it work.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { IrDomain, IrSpectrum } from './irSpectrum.ts';
|
|
11
|
+
|
|
12
|
+
/** How much room to leave either side of a band a host asks to be framed. */
|
|
13
|
+
export interface ZoomToBandOptions {
|
|
14
|
+
/**
|
|
15
|
+
* How wide the window is, in cm⁻¹.
|
|
16
|
+
* @default 200
|
|
17
|
+
*/
|
|
18
|
+
width?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** What a host can ask of the viewer. */
|
|
22
|
+
export interface IrEditorHandle {
|
|
23
|
+
/** The spectra that are open, in the order they were loaded. */
|
|
24
|
+
getSpectra: () => IrSpectrum[];
|
|
25
|
+
/** Draw these instead of what is open, and refit to them. */
|
|
26
|
+
setSpectra: (spectra: IrSpectrum[]) => void;
|
|
27
|
+
/** Draw these as well as what is open. */
|
|
28
|
+
addSpectra: (spectra: IrSpectrum[]) => void;
|
|
29
|
+
/** Close every spectrum. */
|
|
30
|
+
clear: () => void;
|
|
31
|
+
/** Show this window. */
|
|
32
|
+
setDomain: (domain: IrDomain) => void;
|
|
33
|
+
/** Show what fits. */
|
|
34
|
+
resetDomain: () => void;
|
|
35
|
+
/**
|
|
36
|
+
* Frame a wavenumber, keeping the value axis as it is.
|
|
37
|
+
*
|
|
38
|
+
* The commonest thing a host wants: a band named in a table beside the viewer
|
|
39
|
+
* is clicked, and the chart should go there.
|
|
40
|
+
*/
|
|
41
|
+
zoomToWavenumber: (wavenumber: number, options?: ZoomToBandOptions) => void;
|
|
42
|
+
/** Point the panels at one spectrum, or at none. */
|
|
43
|
+
selectSpectrum: (id: string | null) => void;
|
|
44
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a wavenumber and a value are written, wherever they are written.
|
|
3
|
+
*
|
|
4
|
+
* One module for it because the chart labels, the crosshair readout and any
|
|
5
|
+
* table beside them must agree to the digit: a band the chart calls 1715 and a
|
|
6
|
+
* row that calls it 1714.6 read as two bands.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { IrMode } from './irSpectrum.ts';
|
|
10
|
+
|
|
11
|
+
/** How many decimals an absorbance is written to. */
|
|
12
|
+
export const ABSORBANCE_DECIMALS = 3;
|
|
13
|
+
|
|
14
|
+
/** How many a percent transmittance is written to. */
|
|
15
|
+
export const TRANSMITTANCE_DECIMALS = 1;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Write a wavenumber the way a chemist quotes one.
|
|
19
|
+
*
|
|
20
|
+
* As a whole number, because that is the precision the measurement actually
|
|
21
|
+
* carries: a bench instrument samples every 2 or 4 cm⁻¹ and a printed
|
|
22
|
+
* assignment is never quoted to a decimal. Writing 1714.6 would claim a
|
|
23
|
+
* resolution the spectrum does not have.
|
|
24
|
+
* @param wavenumber - The wavenumber, in cm⁻¹.
|
|
25
|
+
* @returns The number as a string, or an empty string when there is no number.
|
|
26
|
+
*/
|
|
27
|
+
export function formatWavenumber(wavenumber: number): string {
|
|
28
|
+
if (!Number.isFinite(wavenumber)) return '';
|
|
29
|
+
return Math.round(wavenumber).toString();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Write a value in whichever axis it belongs to.
|
|
34
|
+
*
|
|
35
|
+
* Three decimals for an absorbance and one for a percent transmittance, which is
|
|
36
|
+
* roughly the same precision expressed two ways — an absorbance of 0.001 and a
|
|
37
|
+
* transmittance of 0.2 percent are both about where a real spectrum's noise
|
|
38
|
+
* sits.
|
|
39
|
+
* @param value - The value.
|
|
40
|
+
* @param mode - Which axis it is in.
|
|
41
|
+
* @returns The number as a string, without its unit.
|
|
42
|
+
*/
|
|
43
|
+
export function formatIrValue(value: number, mode: IrMode): string {
|
|
44
|
+
if (!Number.isFinite(value)) return '';
|
|
45
|
+
return value.toFixed(
|
|
46
|
+
mode === 'absorbance' ? ABSORBANCE_DECIMALS : TRANSMITTANCE_DECIMALS,
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* What the value axis is called where there is room for one word.
|
|
52
|
+
* @param mode - Which axis is being drawn.
|
|
53
|
+
* @returns `A` or `%T`, as a spectrum is annotated by hand.
|
|
54
|
+
*/
|
|
55
|
+
export function shortModeLabel(mode: IrMode): string {
|
|
56
|
+
return mode === 'absorbance' ? 'A' : '%T';
|
|
57
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything that differs between reading a spectrum as absorbance and reading
|
|
3
|
+
* it as percent transmittance.
|
|
4
|
+
*
|
|
5
|
+
* The two are the same measurement drawn upside down, and nearly every
|
|
6
|
+
* difference between them is one of a handful of facts: what the axis is called,
|
|
7
|
+
* where its baseline is, whether that baseline is held in the window, which way
|
|
8
|
+
* a band points, and which zoom gestures are worth answering. Gathering them
|
|
9
|
+
* here is what keeps the switch from being an `if (mode === …)` in the chart,
|
|
10
|
+
* the tracker, the band marks, the zoom and the fitting separately, where they
|
|
11
|
+
* would eventually disagree.
|
|
12
|
+
*
|
|
13
|
+
* **No conversion happens here, or anywhere in this package.** `ir-spectrum`
|
|
14
|
+
* adds both an absorbance and a transmittance variable to every spectrum it
|
|
15
|
+
* reads, whichever the instrument wrote, so the arithmetic that relates them is
|
|
16
|
+
* its business and is done once at the point the file is understood. A second
|
|
17
|
+
* implementation here would be a second answer.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type {
|
|
21
|
+
YAxisRules,
|
|
22
|
+
ZoomDragMode,
|
|
23
|
+
ZoomGestures,
|
|
24
|
+
} from '../../chart/core/chartDomain.ts';
|
|
25
|
+
|
|
26
|
+
import type { IrMode } from './irSpectrum.ts';
|
|
27
|
+
|
|
28
|
+
/** The two ways a spectrum is read, in the order a control offers them. */
|
|
29
|
+
export const IR_MODES: readonly IrMode[] = ['transmittance', 'absorbance'];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* How each mode behaves, every fact in one place.
|
|
33
|
+
*
|
|
34
|
+
* `transmittance` comes first because it is what the majority of instruments
|
|
35
|
+
* export and what most chemists picture when they say "the IR": bands hanging
|
|
36
|
+
* down from a baseline near 100.
|
|
37
|
+
*/
|
|
38
|
+
export const IR_MODE_RULES = {
|
|
39
|
+
transmittance: {
|
|
40
|
+
/** What the vertical axis is called. */
|
|
41
|
+
title: 'transmittance (%)',
|
|
42
|
+
/**
|
|
43
|
+
* The clear baseline a band hangs from, which the wheel scales about.
|
|
44
|
+
*
|
|
45
|
+
* A hundred rather than zero, and this is the whole reason `YAxisRules`
|
|
46
|
+
* exists: scaling percent transmittance about zero walks the entire trace
|
|
47
|
+
* off the top of the plot, because the trace lives just under 100 and
|
|
48
|
+
* nothing interesting is near the origin.
|
|
49
|
+
*/
|
|
50
|
+
baseline: 100,
|
|
51
|
+
/**
|
|
52
|
+
* Whether 100 is held inside the window a drag asks for.
|
|
53
|
+
*
|
|
54
|
+
* It is not. A band dragged out between 20 and 60 percent is being asked
|
|
55
|
+
* about between 20 and 60 percent; forcing the baseline back in would undo
|
|
56
|
+
* the zoom in the act of granting it. This is the opposite of a mass
|
|
57
|
+
* spectrum, whose sticks are drawn *from* their baseline and are cut off at
|
|
58
|
+
* the ankles without it.
|
|
59
|
+
*/
|
|
60
|
+
keepBaseline: false,
|
|
61
|
+
/** Bands point down, away from the baseline above them. */
|
|
62
|
+
bandsPointDown: true,
|
|
63
|
+
/**
|
|
64
|
+
* A drag is the rectangle it sweeps out, whatever tool is chosen.
|
|
65
|
+
*
|
|
66
|
+
* Percent transmittance is bounded at both ends and the trace fills nearly
|
|
67
|
+
* all of it, so the question this axis is asked is never "between which two
|
|
68
|
+
* percentages" — it is "look closer at that corner", which is a rectangle
|
|
69
|
+
* and nothing else. Leaving the reading gesture available here would offer a
|
|
70
|
+
* choice between one useful answer and one that changes nothing.
|
|
71
|
+
*/
|
|
72
|
+
boxZoomOnly: true,
|
|
73
|
+
/**
|
|
74
|
+
* The wheel is left to the page.
|
|
75
|
+
*
|
|
76
|
+
* The axis is bounded — a transmittance is a percentage of the light that
|
|
77
|
+
* got through, so it lies between 0 and 100 and the trace already fills it.
|
|
78
|
+
* Scaling it freely about 100 therefore only ever takes the window past one
|
|
79
|
+
* end or crushes it against the other, which is a poor thing to have a
|
|
80
|
+
* pointer resting over a chart do by accident. The rectangle asks the same
|
|
81
|
+
* question properly, by naming the two percentages it lands between.
|
|
82
|
+
*
|
|
83
|
+
* The zoom in and zoom out **commands** still scale the axis here: they are
|
|
84
|
+
* aimed at, they step by a known factor, and the reader who pressed one
|
|
85
|
+
* knows what it did.
|
|
86
|
+
*/
|
|
87
|
+
wheelZoom: false,
|
|
88
|
+
},
|
|
89
|
+
absorbance: {
|
|
90
|
+
title: 'absorbance',
|
|
91
|
+
/** Zero absorbance is a real floor: no light absorbed. */
|
|
92
|
+
baseline: 0,
|
|
93
|
+
/**
|
|
94
|
+
* Whether zero is held inside the window a drag asks for.
|
|
95
|
+
*
|
|
96
|
+
* It is not, for the same reason as transmittance: a weak band between 0.02
|
|
97
|
+
* and 0.05 absorbance is unreadable in a window that starts at zero, and
|
|
98
|
+
* being able to drag to it is the point of the gesture. Zero remains the
|
|
99
|
+
* baseline the wheel scales about, which is what keeps the trace anchored.
|
|
100
|
+
*/
|
|
101
|
+
keepBaseline: false,
|
|
102
|
+
/** Bands point up, out of the baseline under them. */
|
|
103
|
+
bandsPointDown: false,
|
|
104
|
+
/**
|
|
105
|
+
* Both drags are worth having, so the tool decides between them.
|
|
106
|
+
*
|
|
107
|
+
* Absorbance is open at the top and its weak bands lie against zero, so "what
|
|
108
|
+
* is between 1650 and 1750" and "what is in that rectangle" are two different
|
|
109
|
+
* questions a chemist genuinely asks of the same trace.
|
|
110
|
+
*/
|
|
111
|
+
boxZoomOnly: false,
|
|
112
|
+
/**
|
|
113
|
+
* The wheel scales the axis about zero, which is what brings a weak band up
|
|
114
|
+
* out of the baseline without narrowing the wavenumbers at all.
|
|
115
|
+
*/
|
|
116
|
+
wheelZoom: true,
|
|
117
|
+
},
|
|
118
|
+
} as const satisfies Record<
|
|
119
|
+
IrMode,
|
|
120
|
+
{
|
|
121
|
+
title: string;
|
|
122
|
+
baseline: number;
|
|
123
|
+
keepBaseline: boolean;
|
|
124
|
+
bandsPointDown: boolean;
|
|
125
|
+
boxZoomOnly: boolean;
|
|
126
|
+
wheelZoom: boolean;
|
|
127
|
+
}
|
|
128
|
+
>;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* What the vertical axis is called in a mode.
|
|
132
|
+
* @param mode - Which value axis is being drawn.
|
|
133
|
+
* @returns The axis title.
|
|
134
|
+
*/
|
|
135
|
+
export function yAxisTitle(mode: IrMode): string {
|
|
136
|
+
return IR_MODE_RULES[mode].title;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* How the vertical axis behaves under a gesture in a mode.
|
|
141
|
+
* @param mode - Which value axis is being drawn.
|
|
142
|
+
* @returns The rules to hand to the zoom.
|
|
143
|
+
*/
|
|
144
|
+
export function yAxisRules(mode: IrMode): YAxisRules {
|
|
145
|
+
const { baseline, keepBaseline, bandsPointDown } = IR_MODE_RULES[mode];
|
|
146
|
+
// `pointsDown` is what tells the zoom which way "released past the baseline"
|
|
147
|
+
// points: percent transmittance hangs from 100 at the top of the plot, so the
|
|
148
|
+
// gesture is a drag released above it rather than below.
|
|
149
|
+
return { baseline, keepBaseline, pointsDown: bandsPointDown };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Which zoom gestures a mode answers, and what a drag in it asks for.
|
|
154
|
+
*
|
|
155
|
+
* The mode has the last word on the drag rather than the tool, because the tool
|
|
156
|
+
* is a preference and this is not: percent transmittance has one useful drag,
|
|
157
|
+
* and a viewer that let a tool button ask for the other would answer with a
|
|
158
|
+
* gesture that narrows the wavenumbers and leaves the crowded axis exactly as it
|
|
159
|
+
* was. The tool is still read — in absorbance both drags mean something — so a
|
|
160
|
+
* chemist who chose the square zoom keeps it across a switch to %T and back.
|
|
161
|
+
* @param mode - Which value axis is being drawn.
|
|
162
|
+
* @param tool - What a drag asks for where the mode leaves the choice open.
|
|
163
|
+
* Defaults to the reading gesture.
|
|
164
|
+
* @returns The gestures to hand to the zoom.
|
|
165
|
+
*/
|
|
166
|
+
export function zoomGestures(
|
|
167
|
+
mode: IrMode,
|
|
168
|
+
tool: ZoomDragMode = 'xAxis',
|
|
169
|
+
): Required<ZoomGestures> {
|
|
170
|
+
const { boxZoomOnly, wheelZoom } = IR_MODE_RULES[mode];
|
|
171
|
+
return { drag: boxZoomOnly ? 'box' : tool, wheel: wheelZoom };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Whether a mode leaves the square zoom as the only drag there is.
|
|
176
|
+
*
|
|
177
|
+
* What the toolbar and the status bar need in order to say so: a tool button
|
|
178
|
+
* showing `read` as available in percent transmittance would be describing a
|
|
179
|
+
* gesture the chart will not make.
|
|
180
|
+
* @param mode - Which value axis is being drawn.
|
|
181
|
+
* @returns Whether every drag is a rectangle.
|
|
182
|
+
*/
|
|
183
|
+
export function boxZoomOnly(mode: IrMode): boolean {
|
|
184
|
+
return IR_MODE_RULES[mode].boxZoomOnly;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Which way a band points in a mode, which is which way its label is stacked.
|
|
189
|
+
* @param mode - Which value axis is being drawn.
|
|
190
|
+
* @returns Whether bands hang downwards.
|
|
191
|
+
*/
|
|
192
|
+
export function bandsPointDown(mode: IrMode): boolean {
|
|
193
|
+
return IR_MODE_RULES[mode].bandsPointDown;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The other mode, for a control that toggles between the two.
|
|
198
|
+
* @param mode - The mode in force.
|
|
199
|
+
* @returns The one to switch to.
|
|
200
|
+
*/
|
|
201
|
+
export function otherIrMode(mode: IrMode): IrMode {
|
|
202
|
+
return mode === 'absorbance' ? 'transmittance' : 'absorbance';
|
|
203
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every change the viewer can undergo, as one function over one object.
|
|
3
|
+
*
|
|
4
|
+
* A reducer rather than a graph of signals, for the reason
|
|
5
|
+
* `docs/decisions.md` gives about the glycan editor: a published component must
|
|
6
|
+
* not impose a state library on the page that mounts it, and two viewers on one
|
|
7
|
+
* page must not share a module-level singleton. The state is a plain object, so a
|
|
8
|
+
* host can save it, restore it and compare it.
|
|
9
|
+
*
|
|
10
|
+
* Every case returns the state **itself** when it has nothing to do, so a render
|
|
11
|
+
* memoised on the state is not defeated by an action that changed nothing —
|
|
12
|
+
* selecting the spectrum already selected, closing an error that is already
|
|
13
|
+
* closed.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { IrSidePanelId } from './irSidePanels.ts';
|
|
17
|
+
import type { IrDomain, IrSpectrum } from './irSpectrum.ts';
|
|
18
|
+
import type { IrSettings, IrState, IrTool, PartialIrState } from './irState.ts';
|
|
19
|
+
import {
|
|
20
|
+
DEFAULT_SETTINGS,
|
|
21
|
+
DEFAULT_SIDE_PANELS,
|
|
22
|
+
isIrWindow,
|
|
23
|
+
mergeIrSettings,
|
|
24
|
+
} from './irState.ts';
|
|
25
|
+
|
|
26
|
+
/** Everything that can be asked of the viewer. */
|
|
27
|
+
export type IrAction =
|
|
28
|
+
| { type: 'addSpectra'; spectra: IrSpectrum[] }
|
|
29
|
+
| { type: 'setSpectra'; spectra: IrSpectrum[] }
|
|
30
|
+
| { type: 'removeSpectrum'; id: string }
|
|
31
|
+
| { type: 'renameSpectrum'; id: string; name: string }
|
|
32
|
+
| { type: 'setSpectrumColor'; id: string; color: string }
|
|
33
|
+
| { type: 'setSpectrumVisible'; id: string; visible: boolean }
|
|
34
|
+
| { type: 'selectSpectrum'; id: string | null }
|
|
35
|
+
| { type: 'setDomain'; domain: IrDomain }
|
|
36
|
+
| { type: 'resetDomain' }
|
|
37
|
+
| { type: 'setTool'; tool: IrTool }
|
|
38
|
+
| { type: 'togglePanel'; panelId: IrSidePanelId }
|
|
39
|
+
| { type: 'setError'; error: string | null }
|
|
40
|
+
| { type: 'setSettings'; settings: Partial<IrSettings> }
|
|
41
|
+
| { type: 'loadState'; state: PartialIrState }
|
|
42
|
+
| { type: 'clear' };
|
|
43
|
+
|
|
44
|
+
/** What a viewer opens on. */
|
|
45
|
+
export interface CreateIrStateOptions {
|
|
46
|
+
/**
|
|
47
|
+
* The spectra to open on.
|
|
48
|
+
* @default []
|
|
49
|
+
*/
|
|
50
|
+
spectra?: IrSpectrum[];
|
|
51
|
+
/**
|
|
52
|
+
* The workspace to open in.
|
|
53
|
+
* @default DEFAULT_SETTINGS
|
|
54
|
+
*/
|
|
55
|
+
settings?: Partial<IrSettings>;
|
|
56
|
+
/**
|
|
57
|
+
* The panels open to begin with.
|
|
58
|
+
* @default DEFAULT_SIDE_PANELS
|
|
59
|
+
*/
|
|
60
|
+
panelIds?: IrSidePanelId[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The state a viewer opens with.
|
|
65
|
+
*
|
|
66
|
+
* The panel list is spread rather than stored by reference: a caller's array is
|
|
67
|
+
* the caller's to mutate, and a viewer holding it would find its open panels
|
|
68
|
+
* changing under it.
|
|
69
|
+
* @param options - What it opens on.
|
|
70
|
+
* @returns The state.
|
|
71
|
+
*/
|
|
72
|
+
export function createIrState(options: CreateIrStateOptions = {}): IrState {
|
|
73
|
+
const { spectra = [], settings, panelIds } = options;
|
|
74
|
+
return {
|
|
75
|
+
data: { spectra: [...spectra] },
|
|
76
|
+
view: {
|
|
77
|
+
selectedId: spectra[0]?.id ?? null,
|
|
78
|
+
domain: null,
|
|
79
|
+
tool: 'read',
|
|
80
|
+
openPanelIds: [...(panelIds ?? DEFAULT_SIDE_PANELS)],
|
|
81
|
+
error: null,
|
|
82
|
+
},
|
|
83
|
+
settings: mergeIrSettings(DEFAULT_SETTINGS, settings),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Fold one action into the state.
|
|
89
|
+
* @param state - The state in force.
|
|
90
|
+
* @param action - What is being asked.
|
|
91
|
+
* @returns The new state, or the old one when nothing changed.
|
|
92
|
+
*/
|
|
93
|
+
export function irReducer(state: IrState, action: IrAction): IrState {
|
|
94
|
+
switch (action.type) {
|
|
95
|
+
case 'addSpectra': {
|
|
96
|
+
if (action.spectra.length === 0) return state;
|
|
97
|
+
const spectra = [...state.data.spectra, ...action.spectra];
|
|
98
|
+
return {
|
|
99
|
+
...state,
|
|
100
|
+
data: { spectra },
|
|
101
|
+
view: {
|
|
102
|
+
...state.view,
|
|
103
|
+
// Whatever arrived is what somebody wants to look at, so it takes the
|
|
104
|
+
// selection — but only when nothing was selected, since a spectrum
|
|
105
|
+
// added for comparison must not steal the panels from the one being
|
|
106
|
+
// read.
|
|
107
|
+
selectedId: state.view.selectedId ?? action.spectra[0]?.id ?? null,
|
|
108
|
+
error: null,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
case 'setSpectra': {
|
|
114
|
+
return {
|
|
115
|
+
...state,
|
|
116
|
+
data: { spectra: [...action.spectra] },
|
|
117
|
+
view: {
|
|
118
|
+
...state.view,
|
|
119
|
+
selectedId: action.spectra[0]?.id ?? null,
|
|
120
|
+
// Replacing what is drawn is the one change that throws the window
|
|
121
|
+
// away: a window over one spectrum's wavenumbers means nothing over
|
|
122
|
+
// another's, and the chart refits when it is handed `null`.
|
|
123
|
+
domain: null,
|
|
124
|
+
error: null,
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
case 'removeSpectrum': {
|
|
130
|
+
const spectra = state.data.spectra.filter(
|
|
131
|
+
(spectrum) => spectrum.id !== action.id,
|
|
132
|
+
);
|
|
133
|
+
if (spectra.length === state.data.spectra.length) return state;
|
|
134
|
+
return {
|
|
135
|
+
...state,
|
|
136
|
+
data: { spectra },
|
|
137
|
+
view: {
|
|
138
|
+
...state.view,
|
|
139
|
+
selectedId:
|
|
140
|
+
state.view.selectedId === action.id
|
|
141
|
+
? (spectra[0]?.id ?? null)
|
|
142
|
+
: state.view.selectedId,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
case 'renameSpectrum': {
|
|
148
|
+
const name = action.name.trim();
|
|
149
|
+
if (name === '') {
|
|
150
|
+
return withError(state, 'A spectrum needs a name to be called by.');
|
|
151
|
+
}
|
|
152
|
+
return mapSpectrum(state, action.id, (spectrum) =>
|
|
153
|
+
spectrum.name === name ? spectrum : { ...spectrum, name },
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
case 'setSpectrumColor': {
|
|
158
|
+
return mapSpectrum(state, action.id, (spectrum) =>
|
|
159
|
+
spectrum.color === action.color
|
|
160
|
+
? spectrum
|
|
161
|
+
: { ...spectrum, color: action.color },
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
case 'setSpectrumVisible': {
|
|
166
|
+
return mapSpectrum(state, action.id, (spectrum) =>
|
|
167
|
+
spectrum.visible === action.visible
|
|
168
|
+
? spectrum
|
|
169
|
+
: { ...spectrum, visible: action.visible },
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
case 'selectSpectrum': {
|
|
174
|
+
if (state.view.selectedId === action.id) return state;
|
|
175
|
+
return { ...state, view: { ...state.view, selectedId: action.id } };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
case 'setDomain': {
|
|
179
|
+
if (!isIrWindow(action.domain)) return state;
|
|
180
|
+
return { ...state, view: { ...state.view, domain: action.domain } };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
case 'resetDomain': {
|
|
184
|
+
if (state.view.domain === null) return state;
|
|
185
|
+
return { ...state, view: { ...state.view, domain: null } };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
case 'setTool': {
|
|
189
|
+
if (state.view.tool === action.tool) return state;
|
|
190
|
+
return { ...state, view: { ...state.view, tool: action.tool } };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
case 'togglePanel': {
|
|
194
|
+
const { openPanelIds } = state.view;
|
|
195
|
+
const open = openPanelIds.includes(action.panelId);
|
|
196
|
+
return {
|
|
197
|
+
...state,
|
|
198
|
+
view: {
|
|
199
|
+
...state.view,
|
|
200
|
+
openPanelIds: open
|
|
201
|
+
? openPanelIds.filter((id) => id !== action.panelId)
|
|
202
|
+
: [...openPanelIds, action.panelId],
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
case 'setError': {
|
|
208
|
+
if (state.view.error === action.error) return state;
|
|
209
|
+
return { ...state, view: { ...state.view, error: action.error } };
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
case 'setSettings': {
|
|
213
|
+
const settings = mergeIrSettings(state.settings, action.settings);
|
|
214
|
+
return { ...state, settings };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
case 'loadState': {
|
|
218
|
+
const { data, view, settings } = action.state;
|
|
219
|
+
return {
|
|
220
|
+
data: data === undefined ? state.data : { spectra: [...data.spectra] },
|
|
221
|
+
view: { ...state.view, ...view },
|
|
222
|
+
settings: mergeIrSettings(state.settings, settings),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
case 'clear': {
|
|
227
|
+
if (state.data.spectra.length === 0 && state.view.error === null) {
|
|
228
|
+
return state;
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
...state,
|
|
232
|
+
data: { spectra: [] },
|
|
233
|
+
view: { ...state.view, selectedId: null, domain: null, error: null },
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/* Every action is handled above, and TypeScript is what keeps that true
|
|
237
|
+
when one is added — so there is nothing for a fallback to do. */
|
|
238
|
+
// no default
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Change one spectrum, leaving the state alone when it did not change.
|
|
244
|
+
* @param state - The state in force.
|
|
245
|
+
* @param id - Which spectrum.
|
|
246
|
+
* @param change - What to make of it; return it unchanged for no change.
|
|
247
|
+
* @returns The new state, or the old one.
|
|
248
|
+
*/
|
|
249
|
+
function mapSpectrum(
|
|
250
|
+
state: IrState,
|
|
251
|
+
id: string,
|
|
252
|
+
change: (spectrum: IrSpectrum) => IrSpectrum,
|
|
253
|
+
): IrState {
|
|
254
|
+
let changed = false;
|
|
255
|
+
const spectra = state.data.spectra.map((spectrum) => {
|
|
256
|
+
if (spectrum.id !== id) return spectrum;
|
|
257
|
+
const next = change(spectrum);
|
|
258
|
+
if (next !== spectrum) changed = true;
|
|
259
|
+
return next;
|
|
260
|
+
});
|
|
261
|
+
if (!changed) return state;
|
|
262
|
+
return { ...state, data: { spectra }, view: { ...state.view, error: null } };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Refuse an action, saying why.
|
|
267
|
+
* @param state - The state in force.
|
|
268
|
+
* @param error - The sentence to show whoever asked.
|
|
269
|
+
* @returns The state carrying the refusal.
|
|
270
|
+
*/
|
|
271
|
+
function withError(state: IrState, error: string): IrState {
|
|
272
|
+
return { ...state, view: { ...state.view, error } };
|
|
273
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ActivityBarItemProps } from 'react-science/ui';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The panels the side of the viewer can hold, in the order their icons stack.
|
|
5
|
+
*
|
|
6
|
+
* One frozen list read by both the activity bar and the panel stack, so a panel
|
|
7
|
+
* switched off and on again comes back where it was rather than at the end.
|
|
8
|
+
*/
|
|
9
|
+
export const irSidePanels = [
|
|
10
|
+
{ id: 'spectra', title: 'Spectra', icon: 'timeline-line-chart' },
|
|
11
|
+
{ id: 'bands', title: 'Bands', icon: 'th-list' },
|
|
12
|
+
{ id: 'metadata', title: 'Acquisition', icon: 'properties' },
|
|
13
|
+
] as const satisfies ReadonlyArray<{
|
|
14
|
+
id: string;
|
|
15
|
+
title: string;
|
|
16
|
+
icon: ActivityBarItemProps['icon'];
|
|
17
|
+
}>;
|
|
18
|
+
|
|
19
|
+
/** Identity of one of the panels the activity bar offers. */
|
|
20
|
+
export type IrSidePanelId = (typeof irSidePanels)[number]['id'];
|