react-cheminfo 0.28.0 → 0.29.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 +38 -25
- 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/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/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/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/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/ui.d.ts +1 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +1 -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/clipboard/core/copyPng.ts +20 -0
- package/src/clipboard/core/index.ts +1 -0
- 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/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/ui.ts +1 -0
|
@@ -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'];
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an infrared spectrum is once it has been read, whatever it was read from.
|
|
3
|
+
*
|
|
4
|
+
* One acquisition becomes one `IrSpectrum` carrying **both** value axes —
|
|
5
|
+
* absorbance and percent transmittance — over one shared array of wavenumbers.
|
|
6
|
+
* Both are held rather than one being derived on demand because `ir-spectrum`
|
|
7
|
+
* already produces both when it reads a file: it adds an `a` and a `t` variable
|
|
8
|
+
* to every spectrum whichever of the two the instrument wrote, so the conversion
|
|
9
|
+
* happens once, in the one place that knows what the file's y axis meant. Holding
|
|
10
|
+
* the answer means switching what is drawn costs nothing, and means the two
|
|
11
|
+
* axes can never drift apart through a round trip.
|
|
12
|
+
*
|
|
13
|
+
* The arrays are `Float64Array` and are replaced on a change, never written
|
|
14
|
+
* into, since every consumer holds the same object by reference. An infrared
|
|
15
|
+
* spectrum is a few thousand points rather than a mass spectrum's few hundred
|
|
16
|
+
* thousand, so holding two value axes costs nothing worth counting.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { DataXY } from 'cheminfo-types';
|
|
20
|
+
|
|
21
|
+
import type { ChartDomain } from '../../chart/core/chartDomain.ts';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* One trace of a measurement: wavenumber against whichever value axis is drawn.
|
|
25
|
+
*
|
|
26
|
+
* `DataXY` is the shape every package in this pipeline speaks — `ir-spectrum`,
|
|
27
|
+
* `common-spectrum`, `xy-parser` and `ml-spectra-processing` all take and return
|
|
28
|
+
* it — so declaring a parallel type of our own would buy nothing and cost an
|
|
29
|
+
* adapter at each boundary.
|
|
30
|
+
*/
|
|
31
|
+
export type IrTrace = DataXY<Float64Array>;
|
|
32
|
+
|
|
33
|
+
/** The formats a spectrum can have been read from. */
|
|
34
|
+
export type IrFormat = 'jcamp' | 'spc' | 'text' | 'calculated';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Where a spectrum came from, and what the file said about the acquisition.
|
|
38
|
+
*
|
|
39
|
+
* Kept apart from `meta` because these are the facts other code branches on,
|
|
40
|
+
* while `meta` is a table to read.
|
|
41
|
+
*/
|
|
42
|
+
export interface IrOrigin {
|
|
43
|
+
/** The format it was read from. */
|
|
44
|
+
format: IrFormat;
|
|
45
|
+
/**
|
|
46
|
+
* Name of the file it came from, absent for a paste.
|
|
47
|
+
* @default undefined
|
|
48
|
+
*/
|
|
49
|
+
fileName?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Which block of that file, absent when the file held only one.
|
|
52
|
+
* @default undefined
|
|
53
|
+
*/
|
|
54
|
+
blockIndex?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Which value axis the file itself carried, absent when it said nothing.
|
|
57
|
+
*
|
|
58
|
+
* Worth keeping even though both axes are held: a spectrum exported as
|
|
59
|
+
* transmittance and one exported as absorbance are the same measurement, but
|
|
60
|
+
* only one of the two is what the instrument actually recorded, and the other
|
|
61
|
+
* carries whatever the conversion did to its noise.
|
|
62
|
+
* @default undefined
|
|
63
|
+
*/
|
|
64
|
+
recorded?: IrMode;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** One row of the acquisition table. */
|
|
68
|
+
export interface IrMetaField {
|
|
69
|
+
/** How the row is named, in the display order the table fixes. */
|
|
70
|
+
label: string;
|
|
71
|
+
/** The value as the file states it. */
|
|
72
|
+
value: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* What the file says about how the spectrum was acquired.
|
|
77
|
+
*
|
|
78
|
+
* Only ever what it actually says: a field the file leaves blank is left out
|
|
79
|
+
* rather than shown empty, so the table is short and every line in it is a fact.
|
|
80
|
+
* A plain two-column paste carries none of this, and the panel then shows the
|
|
81
|
+
* file name alone.
|
|
82
|
+
*/
|
|
83
|
+
export interface IrMeta {
|
|
84
|
+
/** The title record, `null` when the file carries none. */
|
|
85
|
+
title: string | null;
|
|
86
|
+
/** The fields that are populated, in display order. */
|
|
87
|
+
fields: IrMetaField[];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Which value axis is being drawn and read. */
|
|
91
|
+
export type IrMode = 'absorbance' | 'transmittance';
|
|
92
|
+
|
|
93
|
+
/** One spectrum as the viewer holds it. */
|
|
94
|
+
export interface IrSpectrum {
|
|
95
|
+
/** Identity, stable across edits so a selection survives a rename. */
|
|
96
|
+
id: string;
|
|
97
|
+
/** What the list calls it; editable, and never used as identity. */
|
|
98
|
+
name: string;
|
|
99
|
+
/** The colour it is drawn in. */
|
|
100
|
+
color: string;
|
|
101
|
+
/**
|
|
102
|
+
* The wavenumbers in cm⁻¹, **ascending**.
|
|
103
|
+
*
|
|
104
|
+
* Ascending even though the axis is read from 4000 down to 400: which way the
|
|
105
|
+
* numbers run on screen is the chart's business, and every binary search and
|
|
106
|
+
* every extent taken off index zero downstream wants them in order. Reversing
|
|
107
|
+
* the data instead would make the drawing simpler once and everything else
|
|
108
|
+
* wrong.
|
|
109
|
+
*/
|
|
110
|
+
wavenumber: Float64Array;
|
|
111
|
+
/** Absorbance at each wavenumber, as `ir-spectrum` supplied it. */
|
|
112
|
+
absorbance: Float64Array;
|
|
113
|
+
/** Percent transmittance at each wavenumber, likewise. */
|
|
114
|
+
transmittance: Float64Array;
|
|
115
|
+
/** What the file said about the acquisition, `null` when it said nothing. */
|
|
116
|
+
meta: IrMeta | null;
|
|
117
|
+
/** Where it came from. */
|
|
118
|
+
origin: IrOrigin;
|
|
119
|
+
/** Whether it is drawn. */
|
|
120
|
+
visible: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Whether the trace is left out of the automatic domain. A reference held
|
|
123
|
+
* under the pointer for comparison must not move the axes, or hovering one
|
|
124
|
+
* would throw away the zoom the user set.
|
|
125
|
+
* @default false
|
|
126
|
+
*/
|
|
127
|
+
excludeFromDomain?: boolean;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The window the chart is showing, in data units.
|
|
132
|
+
*
|
|
133
|
+
* `ChartDomain` itself, not a type of our own: the arithmetic that moves a
|
|
134
|
+
* window is the shared chart's and speaks that type, and an alias here
|
|
135
|
+
* that merely renamed it would need converting at every call. `x` is in
|
|
136
|
+
* wavenumbers and runs low to high, whichever way round the axis is drawn.
|
|
137
|
+
*/
|
|
138
|
+
export type IrDomain = ChartDomain;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The trace to draw for a spectrum, in whichever value axis is being read.
|
|
142
|
+
*
|
|
143
|
+
* The arrays are handed back by reference rather than copied: nothing downstream
|
|
144
|
+
* writes into a trace, and a profile of a few thousand points copied on every
|
|
145
|
+
* render of every spectrum is a copy per frame for no gain.
|
|
146
|
+
* @param spectrum - The spectrum.
|
|
147
|
+
* @param mode - Which value axis is being drawn.
|
|
148
|
+
* @returns The trace, sharing the spectrum's own arrays.
|
|
149
|
+
*/
|
|
150
|
+
export function traceOf(spectrum: IrSpectrum, mode: IrMode): IrTrace {
|
|
151
|
+
return {
|
|
152
|
+
x: spectrum.wavenumber,
|
|
153
|
+
y: mode === 'absorbance' ? spectrum.absorbance : spectrum.transmittance,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the viewer knows, in the three buckets NMRium splits its own into
|
|
3
|
+
* — the same three the mass viewer holds, under the same names.
|
|
4
|
+
*
|
|
5
|
+
* The split is the persistence boundary as much as anything: `data` is the
|
|
6
|
+
* document, `view` is where you are in it and lasts as long as the session, and
|
|
7
|
+
* `settings` is the workspace, which is how every spectrum is drawn whichever
|
|
8
|
+
* ones happen to be open.
|
|
9
|
+
*
|
|
10
|
+
* The bands are **not** in here. They are derived from the spectra and the
|
|
11
|
+
* picking settings, so holding them would mean holding an answer that has to be
|
|
12
|
+
* kept in step with its own inputs — `useIrEditor` recomputes them instead, and
|
|
13
|
+
* a stale band is then impossible rather than merely unlikely.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { IrSidePanelId } from './irSidePanels.ts';
|
|
17
|
+
import type { IrDomain, IrMode, IrSpectrum } from './irSpectrum.ts';
|
|
18
|
+
import type { PickBandsOptions } from './pickBands.ts';
|
|
19
|
+
|
|
20
|
+
/** The document: what a file holds. */
|
|
21
|
+
export interface IrData {
|
|
22
|
+
/** The spectra, in the order they were loaded. */
|
|
23
|
+
spectra: IrSpectrum[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** What a drag across the chart is for while it is chosen. */
|
|
27
|
+
export type IrTool = 'read' | 'box';
|
|
28
|
+
|
|
29
|
+
/** Where you are in the viewer. */
|
|
30
|
+
export interface IrView {
|
|
31
|
+
/** Identity of the spectrum the panels act on, `null` for none. */
|
|
32
|
+
selectedId: string | null;
|
|
33
|
+
/**
|
|
34
|
+
* The window being shown, `null` while the chart is showing what fits.
|
|
35
|
+
*
|
|
36
|
+
* Held here so that a toolbar button can zoom — the chart is told a window and
|
|
37
|
+
* reports every window it arrives at, and this is where the answer lives
|
|
38
|
+
* between the two.
|
|
39
|
+
*/
|
|
40
|
+
domain: IrDomain | null;
|
|
41
|
+
/** Which tool a drag across the chart is running. */
|
|
42
|
+
tool: IrTool;
|
|
43
|
+
/** The side panels that are open, in the order their icons are stacked. */
|
|
44
|
+
openPanelIds: IrSidePanelId[];
|
|
45
|
+
/** Why the last action was refused, `null` as soon as one succeeds. */
|
|
46
|
+
error: string | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** The workspace: how every spectrum is drawn, whichever ones are open. */
|
|
50
|
+
export interface IrSettings {
|
|
51
|
+
/** Which value axis the spectra are read in. */
|
|
52
|
+
mode: IrMode;
|
|
53
|
+
/** Whether the bands are picked at all. */
|
|
54
|
+
pickBands: boolean;
|
|
55
|
+
/** How the bands are picked when they are. */
|
|
56
|
+
picking: PickBandsOptions;
|
|
57
|
+
/** Whether a band's label names its assignment as well as its wavenumber. */
|
|
58
|
+
showAssignments: boolean;
|
|
59
|
+
/** At most how many bands are labelled on the chart. */
|
|
60
|
+
labelLimit: number;
|
|
61
|
+
/** How far outside a table range a band may fall and still be offered it. */
|
|
62
|
+
assignmentTolerance: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Everything the viewer knows. */
|
|
66
|
+
export interface IrState {
|
|
67
|
+
/** The spectra that are open. */
|
|
68
|
+
data: IrData;
|
|
69
|
+
/** Where you are in the viewer. */
|
|
70
|
+
view: IrView;
|
|
71
|
+
/** How spectra are drawn and read. */
|
|
72
|
+
settings: IrSettings;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Part of a state, as a host restoring one supplies it. */
|
|
76
|
+
export interface PartialIrState {
|
|
77
|
+
/** The spectra that were open. */
|
|
78
|
+
data?: IrData;
|
|
79
|
+
/** Where the viewer was left. */
|
|
80
|
+
view?: Partial<IrView>;
|
|
81
|
+
/** The workspace they were drawn in. */
|
|
82
|
+
settings?: Partial<IrSettings>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** The panel the splitter brings back when it is dragged open on nothing. */
|
|
86
|
+
export const DEFAULT_SIDE_PANEL: IrSidePanelId = 'spectra';
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The panels a fresh viewer opens with.
|
|
90
|
+
*
|
|
91
|
+
* The band table, because it is the reason to open an infrared spectrum at all
|
|
92
|
+
* — a trace on its own can be looked at, and it is the table beside it that lets
|
|
93
|
+
* it be read.
|
|
94
|
+
*/
|
|
95
|
+
export const DEFAULT_SIDE_PANELS: IrSidePanelId[] = ['spectra', 'bands'];
|
|
96
|
+
|
|
97
|
+
/** At most how many bands a gesture may ask to have labelled. */
|
|
98
|
+
export const MAXIMUM_LABEL_LIMIT = 200;
|
|
99
|
+
|
|
100
|
+
/** How many are labelled to begin with. */
|
|
101
|
+
export const DEFAULT_LABEL_LIMIT = 12;
|
|
102
|
+
|
|
103
|
+
/** How the bands are picked before anybody adjusts it. */
|
|
104
|
+
export const DEFAULT_PICKING: PickBandsOptions = {
|
|
105
|
+
minRelativeHeight: 0.02,
|
|
106
|
+
minPeakWidth: 4,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/** The workspace a fresh viewer starts from. */
|
|
110
|
+
export const DEFAULT_SETTINGS: IrSettings = {
|
|
111
|
+
mode: 'transmittance',
|
|
112
|
+
pickBands: true,
|
|
113
|
+
picking: DEFAULT_PICKING,
|
|
114
|
+
showAssignments: false,
|
|
115
|
+
labelLimit: DEFAULT_LABEL_LIMIT,
|
|
116
|
+
assignmentTolerance: 5,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Fold a change into the workspace, refusing what no chart survives.
|
|
121
|
+
*
|
|
122
|
+
* A number typed into a field arrives here as `NaN` for every keystroke that is
|
|
123
|
+
* not yet a number — a lone minus sign, an empty box — and a limit of `NaN`
|
|
124
|
+
* silently stops every label being drawn. So each is checked, and the current
|
|
125
|
+
* value is kept where the new one is unusable rather than the field being
|
|
126
|
+
* fought with while it is being typed in.
|
|
127
|
+
* @param current - The workspace in force.
|
|
128
|
+
* @param change - What to change about it.
|
|
129
|
+
* @returns The new workspace.
|
|
130
|
+
*/
|
|
131
|
+
export function mergeIrSettings(
|
|
132
|
+
current: IrSettings,
|
|
133
|
+
change: Partial<IrSettings> = {},
|
|
134
|
+
): IrSettings {
|
|
135
|
+
const asked = change.labelLimit ?? current.labelLimit;
|
|
136
|
+
const tolerance = change.assignmentTolerance ?? current.assignmentTolerance;
|
|
137
|
+
return {
|
|
138
|
+
...current,
|
|
139
|
+
...change,
|
|
140
|
+
picking: { ...current.picking, ...change.picking },
|
|
141
|
+
labelLimit: Number.isFinite(asked)
|
|
142
|
+
? Math.min(MAXIMUM_LABEL_LIMIT, Math.max(0, Math.round(asked)))
|
|
143
|
+
: current.labelLimit,
|
|
144
|
+
assignmentTolerance:
|
|
145
|
+
Number.isFinite(tolerance) && tolerance >= 0
|
|
146
|
+
? tolerance
|
|
147
|
+
: current.assignmentTolerance,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Whether a window is one a chart can be built on.
|
|
153
|
+
*
|
|
154
|
+
* Both ends finite and the low one below the high one. A window failing either
|
|
155
|
+
* makes every scale built from it infinite, which the DOM refuses outright — so
|
|
156
|
+
* a handle told to frame a band it worked out wrongly leaves the chart alone
|
|
157
|
+
* instead of blanking it.
|
|
158
|
+
* @param domain - The window to check.
|
|
159
|
+
* @returns Whether it can be shown.
|
|
160
|
+
*/
|
|
161
|
+
export function isIrWindow(domain: IrDomain): boolean {
|
|
162
|
+
return isWindow(domain.x) && isWindow(domain.y);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Whether one axis of a window runs from somewhere to somewhere else.
|
|
167
|
+
* @param bounds - `[from, to]` on that axis.
|
|
168
|
+
* @returns Whether it is usable.
|
|
169
|
+
*/
|
|
170
|
+
function isWindow(bounds: [number, number]): boolean {
|
|
171
|
+
const [from, to] = bounds;
|
|
172
|
+
return Number.isFinite(from) && Number.isFinite(to) && from < to;
|
|
173
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One entry point for whatever was dropped, opened or pasted.
|
|
3
|
+
*
|
|
4
|
+
* The format is decided from the bytes and the right reader is called, so a
|
|
5
|
+
* caller hands over a file and gets spectra back without knowing what it turned
|
|
6
|
+
* out to be. Each reader is imported only once the bytes turn out to need it, so
|
|
7
|
+
* a page that never opens an SPC never downloads its parser.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describeSource } from '../../error/core/index.ts';
|
|
11
|
+
|
|
12
|
+
import type { LoadedIrSpectrum } from './analysisSpectra.ts';
|
|
13
|
+
import { detectIrFormat } from './detectIrFormat.ts';
|
|
14
|
+
import type { IrOrigin } from './irSpectrum.ts';
|
|
15
|
+
|
|
16
|
+
/** How a file is read. */
|
|
17
|
+
export interface LoadIrSpectraOptions {
|
|
18
|
+
/**
|
|
19
|
+
* The file's name, which decides the reader when the content is silent and is
|
|
20
|
+
* carried onto every spectrum read out of it.
|
|
21
|
+
* @default undefined
|
|
22
|
+
*/
|
|
23
|
+
fileName?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** What a file turned out to hold. */
|
|
27
|
+
export interface LoadIrSpectraResult {
|
|
28
|
+
/** The spectra it held, in the order the file wrote them. */
|
|
29
|
+
spectra: LoadedIrSpectrum[];
|
|
30
|
+
/** What it turned out to be. */
|
|
31
|
+
format: IrOrigin['format'];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Read every infrared spectrum a file holds.
|
|
36
|
+
* @param data - The file, as bytes, or the pasted text.
|
|
37
|
+
* @param options - The file's name.
|
|
38
|
+
* @returns The spectra, and the format they were read from.
|
|
39
|
+
* @throws {Error} When nothing in the file names a format this can read, or when
|
|
40
|
+
* the reader for that format gave up on it.
|
|
41
|
+
*/
|
|
42
|
+
export async function loadIrSpectra(
|
|
43
|
+
data: Uint8Array | string,
|
|
44
|
+
options: LoadIrSpectraOptions = {},
|
|
45
|
+
): Promise<LoadIrSpectraResult> {
|
|
46
|
+
const { fileName } = options;
|
|
47
|
+
const format = detectIrFormat(data, fileName);
|
|
48
|
+
|
|
49
|
+
if (format === 'jcamp') {
|
|
50
|
+
const { fromJcamp } = await import('./fromJcamp.ts');
|
|
51
|
+
return { spectra: fromJcamp(data, options), format };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (format === 'spc') {
|
|
55
|
+
if (typeof data === 'string') {
|
|
56
|
+
throw new Error(
|
|
57
|
+
`${describeSource(fileName)} looks like an SPC file but arrived as text — SPC is binary, and reading it as text loses bytes it cannot get back.`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const { fromSpc } = await import('./fromSpc.ts');
|
|
61
|
+
return { spectra: fromSpc(data, options), format };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (format === 'text') {
|
|
65
|
+
// Deliberately refused rather than half-read. `ir-spectrum` adds the
|
|
66
|
+
// absorbance and transmittance pair to everything `fromJcamp` and `fromSPC`
|
|
67
|
+
// produce, but not to `fromText`, so a two-column file arrives carrying only
|
|
68
|
+
// the axis it was written in. Deriving the other one here would put a second
|
|
69
|
+
// implementation of that conversion in this package, which is exactly what
|
|
70
|
+
// depending on `ir-spectrum` is meant to avoid.
|
|
71
|
+
throw new Error(
|
|
72
|
+
`${describeSource(fileName)} is two columns of numbers, which this viewer cannot read yet: ir-spectrum derives the absorbance and transmittance pair for JCAMP-DX and SPC but not for plain text, and this package deliberately does not do that conversion itself. Export the spectrum as JCAMP-DX (.jdx) instead.`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
throw new Error(
|
|
77
|
+
`${describeSource(fileName)} is not a spectrum this viewer can read — JCAMP-DX (.jdx, .dx) and Thermo Galactic SPC (.spc) are understood.`,
|
|
78
|
+
);
|
|
79
|
+
}
|