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,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the viewer offers, what each is called, and the key it answers to.
|
|
3
|
+
*
|
|
4
|
+
* One table, read by three things that must agree: the toolbar draws it, the
|
|
5
|
+
* tooltip explains it, and the key handler fires it. Written apart from all
|
|
6
|
+
* three so a command cannot be added to the toolbar without a name, or bound to
|
|
7
|
+
* a key nothing tells the reader about.
|
|
8
|
+
*
|
|
9
|
+
* The provider, the hooks and the tooltip are three files of their own beside
|
|
10
|
+
* this one, because a module that exports a component and a constant together
|
|
11
|
+
* cannot be hot reloaded — `react-refresh/only-export-components` is the rule
|
|
12
|
+
* that says so, and the split is the fix rather than the exception.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** The key a command answers to. */
|
|
16
|
+
export interface IrShortcut {
|
|
17
|
+
/** The `event.key` values it fires on, the first being the one shown. */
|
|
18
|
+
keys: readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* How to write the key in a tooltip, where the raw value would read badly.
|
|
21
|
+
* @default the first of `keys`
|
|
22
|
+
*/
|
|
23
|
+
label?: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** A gesture that does the same thing, listed under the tooltip's title. */
|
|
27
|
+
export interface IrGesture {
|
|
28
|
+
/** Where the gesture is made, or what it is made with. */
|
|
29
|
+
title: string;
|
|
30
|
+
/** The buttons, keys or wheel that make it. */
|
|
31
|
+
shortcuts: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** One thing the viewer can be asked to do. */
|
|
35
|
+
export interface IrCommand {
|
|
36
|
+
/** What it is called, which is what the tooltip is titled. */
|
|
37
|
+
title: string;
|
|
38
|
+
/**
|
|
39
|
+
* The key it answers to, absent for a command with none.
|
|
40
|
+
* @default undefined
|
|
41
|
+
*/
|
|
42
|
+
shortcut?: IrShortcut;
|
|
43
|
+
/**
|
|
44
|
+
* What it does, in a sentence, under the title in the tooltip.
|
|
45
|
+
* @default undefined
|
|
46
|
+
*/
|
|
47
|
+
description?: string;
|
|
48
|
+
/**
|
|
49
|
+
* The gestures that do the same thing, for the ones a key cannot describe.
|
|
50
|
+
* @default undefined
|
|
51
|
+
*/
|
|
52
|
+
gestures?: readonly IrGesture[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Everything the viewer offers, in the order it is reached for. */
|
|
56
|
+
export const irCommands = {
|
|
57
|
+
about: {
|
|
58
|
+
title: 'About the infrared viewer',
|
|
59
|
+
description: 'What it reads, what it is built on, and what it credits.',
|
|
60
|
+
},
|
|
61
|
+
documentation: {
|
|
62
|
+
title: 'Documentation',
|
|
63
|
+
shortcut: { keys: ['h'] },
|
|
64
|
+
description:
|
|
65
|
+
'How to open a spectrum, what the panels hold, and every gesture.',
|
|
66
|
+
},
|
|
67
|
+
fullScreen: {
|
|
68
|
+
title: 'Full screen',
|
|
69
|
+
description:
|
|
70
|
+
'The viewer takes the whole screen rather than its corner of the page. Esc gives it back.',
|
|
71
|
+
},
|
|
72
|
+
readTool: {
|
|
73
|
+
title: 'Read',
|
|
74
|
+
shortcut: { keys: ['r'] },
|
|
75
|
+
description:
|
|
76
|
+
'A drag narrows the wavenumber axis, which is the question a spectrum is nearly always asked. Released past the baseline it takes the value axis with it. Reading absorbance only: percent transmittance is zoomed by rectangle alone.',
|
|
77
|
+
gestures: [{ title: 'Reading absorbance', shortcuts: ['Drag'] }],
|
|
78
|
+
},
|
|
79
|
+
boxTool: {
|
|
80
|
+
title: 'Square zoom',
|
|
81
|
+
shortcut: { keys: ['b'] },
|
|
82
|
+
description:
|
|
83
|
+
'A drag zooms to exactly the rectangle it sweeps out, both axes at once — for looking into a baseline or a shoulder rather than across the spectrum. It is the only drag on percent transmittance.',
|
|
84
|
+
gestures: [{ title: 'Over the chart', shortcuts: ['Drag a rectangle'] }],
|
|
85
|
+
},
|
|
86
|
+
zoomIn: {
|
|
87
|
+
title: 'Zoom in',
|
|
88
|
+
shortcut: { keys: ['+', '='] },
|
|
89
|
+
description: 'Brings the weak bands up, about the baseline they hang from.',
|
|
90
|
+
gestures: [{ title: 'Reading absorbance', shortcuts: ['Scroll wheel'] }],
|
|
91
|
+
},
|
|
92
|
+
zoomOut: {
|
|
93
|
+
title: 'Zoom out',
|
|
94
|
+
shortcut: { keys: ['-'] },
|
|
95
|
+
description: 'Puts the value axis back out again.',
|
|
96
|
+
gestures: [{ title: 'Reading absorbance', shortcuts: ['Scroll wheel'] }],
|
|
97
|
+
},
|
|
98
|
+
resetZoom: {
|
|
99
|
+
title: 'Zoom to fit',
|
|
100
|
+
shortcut: { keys: ['f'] },
|
|
101
|
+
description: 'Shows every spectrum that is drawn, whole.',
|
|
102
|
+
gestures: [{ title: 'Over the chart', shortcuts: ['Double click'] }],
|
|
103
|
+
},
|
|
104
|
+
toggleMode: {
|
|
105
|
+
title: 'Absorbance or transmittance',
|
|
106
|
+
shortcut: { keys: ['t'] },
|
|
107
|
+
description:
|
|
108
|
+
'The same measurement read the other way up. Bands hang down from 100 % transmittance and stand up out of zero absorbance.',
|
|
109
|
+
},
|
|
110
|
+
togglePicking: {
|
|
111
|
+
title: 'Pick the bands',
|
|
112
|
+
shortcut: { keys: ['p'] },
|
|
113
|
+
description:
|
|
114
|
+
'Finds the bands of the selected spectrum, marks them on the chart and lists them with everything each might be.',
|
|
115
|
+
},
|
|
116
|
+
toggleAssignments: {
|
|
117
|
+
title: 'Name the assignments',
|
|
118
|
+
shortcut: { keys: ['a'] },
|
|
119
|
+
description:
|
|
120
|
+
'Writes what each labelled band might be under its wavenumber. Worth turning off once the chart is crowded.',
|
|
121
|
+
},
|
|
122
|
+
exportImage: {
|
|
123
|
+
title: 'Export as an image…',
|
|
124
|
+
shortcut: { keys: ['x'] },
|
|
125
|
+
description:
|
|
126
|
+
'The chart as it stands, at a chosen resolution — PNG, or SVG, which is drawn again at whatever size it is printed rather than enlarged.',
|
|
127
|
+
},
|
|
128
|
+
clear: {
|
|
129
|
+
title: 'Close every spectrum',
|
|
130
|
+
description: 'Empties the chart and starts again.',
|
|
131
|
+
},
|
|
132
|
+
} as const satisfies Record<string, IrCommand>;
|
|
133
|
+
|
|
134
|
+
/** Identity of one of the commands the viewer offers. */
|
|
135
|
+
export type IrCommandId = keyof typeof irCommands;
|
|
136
|
+
|
|
137
|
+
/** What to do when each command is run, as the shell wires them. */
|
|
138
|
+
export type IrCommandHandlers = Partial<
|
|
139
|
+
Record<IrCommandId, (() => void) | undefined>
|
|
140
|
+
>;
|
|
141
|
+
|
|
142
|
+
/** How a component runs a command. */
|
|
143
|
+
export type RunIrCommand = (id: IrCommandId) => void;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* What a command is called, with its key, for a label and an `aria-label`.
|
|
147
|
+
* @param id - Which command.
|
|
148
|
+
* @returns The title, and the key in parentheses when it has one.
|
|
149
|
+
*/
|
|
150
|
+
export function irCommandLabel(id: IrCommandId): string {
|
|
151
|
+
const entry = irCommands[id] as IrCommand;
|
|
152
|
+
const key = entry.shortcut?.label?.[0] ?? entry.shortcut?.keys[0];
|
|
153
|
+
return key === undefined ? entry.title : `${entry.title} (${key})`;
|
|
154
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The window a chart opens on, worked out from the spectra it was handed.
|
|
3
|
+
*
|
|
4
|
+
* This is what "zoom to fit" and the first render both call, so it has to answer
|
|
5
|
+
* something usable when it is handed nothing at all — a chart with no data is
|
|
6
|
+
* still mounted, still measured, and still builds its scales.
|
|
7
|
+
*
|
|
8
|
+
* The x window is in ascending wavenumbers even though the axis is drawn from
|
|
9
|
+
* 4000 down to 400: which way round it is read is the chart's business, and
|
|
10
|
+
* every piece of arithmetic that moves a window expects its ends in order.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { xMaxValue, xMinValue } from 'ml-spectra-processing';
|
|
14
|
+
|
|
15
|
+
import { bandsPointDown } from './irMode.ts';
|
|
16
|
+
import type { IrDomain, IrMode, IrSpectrum } from './irSpectrum.ts';
|
|
17
|
+
import { traceOf } from './irSpectrum.ts';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How much air is left either side of the outermost point, as a fraction.
|
|
21
|
+
*
|
|
22
|
+
* A trace drawn hard against the axis reads as a spectrum that was cut off
|
|
23
|
+
* there; two percent is enough to show that it was not.
|
|
24
|
+
*/
|
|
25
|
+
export const X_DOMAIN_PADDING = 0.02;
|
|
26
|
+
|
|
27
|
+
/** The same, on the value axis, where a trace touching an edge reads the same. */
|
|
28
|
+
export const Y_DOMAIN_PADDING = 0.05;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The extra room kept on the side the band labels occupy, as a fraction.
|
|
32
|
+
*
|
|
33
|
+
* A named band carries its wavenumber and its assignment on two lines, stacked
|
|
34
|
+
* away from the baseline — upwards from an absorbance maximum, downwards from a
|
|
35
|
+
* transmittance minimum — so the room has to be on a different side in each
|
|
36
|
+
* mode. Twenty percent is what those two lines take on a chart of any usual
|
|
37
|
+
* height.
|
|
38
|
+
*/
|
|
39
|
+
export const LABEL_HEADROOM = 0.2;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The window that shows everything currently drawn.
|
|
43
|
+
*
|
|
44
|
+
* A spectrum marked `excludeFromDomain` is left out of the extents, because it
|
|
45
|
+
* is a reference held up for comparison rather than data: letting it move the
|
|
46
|
+
* axes would throw away the zoom the user set every time they held one up. The
|
|
47
|
+
* exclusion is dropped when it would leave nothing at all.
|
|
48
|
+
* @param spectra - Everything the chart holds, drawn or not.
|
|
49
|
+
* @param mode - Which value axis is being drawn, which decides both the extents
|
|
50
|
+
* and the side the label room is kept on.
|
|
51
|
+
* @returns The window, in wavenumbers and in the value axis.
|
|
52
|
+
*/
|
|
53
|
+
export function fullDomain(
|
|
54
|
+
spectra: readonly IrSpectrum[],
|
|
55
|
+
mode: IrMode,
|
|
56
|
+
): IrDomain {
|
|
57
|
+
const extent =
|
|
58
|
+
traceExtent(spectra, mode, false) ?? traceExtent(spectra, mode, true);
|
|
59
|
+
if (extent === null) {
|
|
60
|
+
return mode === 'absorbance'
|
|
61
|
+
? { x: [400, 4000], y: [0, 1] }
|
|
62
|
+
: { x: [400, 4000], y: [0, 100] };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const { xMinimum, xMaximum, yMinimum, yMaximum } = extent;
|
|
66
|
+
const xPadding = (xMaximum - xMinimum) * X_DOMAIN_PADDING;
|
|
67
|
+
// A spectrum of a single point has no width to take a fraction of.
|
|
68
|
+
const x: [number, number] =
|
|
69
|
+
xPadding > 0
|
|
70
|
+
? [xMinimum - xPadding, xMaximum + xPadding]
|
|
71
|
+
: [xMinimum - 1, xMaximum + 1];
|
|
72
|
+
|
|
73
|
+
const ySpan = yMaximum - yMinimum;
|
|
74
|
+
const yPadding = ySpan > 0 ? ySpan * Y_DOMAIN_PADDING : 1;
|
|
75
|
+
const headroom = ySpan > 0 ? ySpan * LABEL_HEADROOM : 1;
|
|
76
|
+
const down = bandsPointDown(mode);
|
|
77
|
+
const y: [number, number] = [
|
|
78
|
+
yMinimum - (down ? headroom : yPadding),
|
|
79
|
+
yMaximum + (down ? yPadding : headroom),
|
|
80
|
+
];
|
|
81
|
+
return { x, y };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* What a fitted window was fitted *to*, as one string two renders can compare.
|
|
86
|
+
*
|
|
87
|
+
* The chart puts its window back to `fullDomain` when it is handed different
|
|
88
|
+
* data, and must not when the same data is merely redrawn — so something has to
|
|
89
|
+
* tell the two apart.
|
|
90
|
+
*
|
|
91
|
+
* **The mode is part of it**, and that is the one place this differs from a mass
|
|
92
|
+
* spectrum's fit key. Switching from transmittance to absorbance does not nudge
|
|
93
|
+
* the extents, it replaces the value axis outright — a window of 25 to 100
|
|
94
|
+
* percent means nothing at all in absorbance — so it has to refit, where a
|
|
95
|
+
* change of colour or of name must not.
|
|
96
|
+
* @param spectra - Everything the chart holds, drawn or not.
|
|
97
|
+
* @param mode - Which value axis is being drawn.
|
|
98
|
+
* @returns A string equal to itself exactly when a fit would be made to the
|
|
99
|
+
* same thing.
|
|
100
|
+
*/
|
|
101
|
+
export function fittedTo(spectra: readonly IrSpectrum[], mode: IrMode): string {
|
|
102
|
+
let key = mode;
|
|
103
|
+
for (const spectrum of spectra) {
|
|
104
|
+
if (spectrum.excludeFromDomain || !spectrum.visible) continue;
|
|
105
|
+
key += ` ${spectrum.id}`;
|
|
106
|
+
}
|
|
107
|
+
return key;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The extremes of a set of traces, before any padding is added. */
|
|
111
|
+
interface TraceExtent {
|
|
112
|
+
/** The lowest wavenumber drawn. */
|
|
113
|
+
xMinimum: number;
|
|
114
|
+
/** The highest wavenumber drawn. */
|
|
115
|
+
xMaximum: number;
|
|
116
|
+
/** The lowest value drawn. */
|
|
117
|
+
yMinimum: number;
|
|
118
|
+
/** The highest value drawn. */
|
|
119
|
+
yMaximum: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* The extremes over every trace that is currently drawn.
|
|
124
|
+
* @param spectra - Everything the chart holds.
|
|
125
|
+
* @param mode - Which value axis is being drawn.
|
|
126
|
+
* @param includeExcluded - Whether to count the spectra kept out of the domain.
|
|
127
|
+
* @returns The extremes, or `null` when nothing is drawn.
|
|
128
|
+
*/
|
|
129
|
+
function traceExtent(
|
|
130
|
+
spectra: readonly IrSpectrum[],
|
|
131
|
+
mode: IrMode,
|
|
132
|
+
includeExcluded: boolean,
|
|
133
|
+
): TraceExtent | null {
|
|
134
|
+
let extent: TraceExtent | null = null;
|
|
135
|
+
for (const spectrum of spectra) {
|
|
136
|
+
if (!spectrum.visible) continue;
|
|
137
|
+
if (!includeExcluded && spectrum.excludeFromDomain) continue;
|
|
138
|
+
const { x, y } = traceOf(spectrum, mode);
|
|
139
|
+
if (x.length === 0 || y.length === 0) continue;
|
|
140
|
+
// The wavenumber ends are read off the first and last sample rather than
|
|
141
|
+
// searched for: the array is ascending by construction, so a scan would walk
|
|
142
|
+
// every point of the spectrum to learn what index zero already says.
|
|
143
|
+
const first = x[0] as number;
|
|
144
|
+
const last = x.at(-1) as number;
|
|
145
|
+
const lowest = xMinValue(y);
|
|
146
|
+
const highest = xMaxValue(y);
|
|
147
|
+
extent =
|
|
148
|
+
extent === null
|
|
149
|
+
? {
|
|
150
|
+
xMinimum: first,
|
|
151
|
+
xMaximum: last,
|
|
152
|
+
yMinimum: lowest,
|
|
153
|
+
yMaximum: highest,
|
|
154
|
+
}
|
|
155
|
+
: {
|
|
156
|
+
xMinimum: Math.min(extent.xMinimum, first),
|
|
157
|
+
xMaximum: Math.max(extent.xMaximum, last),
|
|
158
|
+
yMinimum: Math.min(extent.yMinimum, lowest),
|
|
159
|
+
yMaximum: Math.max(extent.yMaximum, highest),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return extent;
|
|
163
|
+
}
|
|
@@ -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
|
+
}
|