react-cheminfo 0.27.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/clipboard/ui/CopyableValue.d.ts +12 -9
- package/lib/clipboard/ui/CopyableValue.d.ts.map +1 -1
- package/lib/clipboard/ui/CopyableValue.js +11 -15
- package/lib/clipboard/ui/CopyableValue.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/clipboard/ui/CopyableValue.tsx +22 -35
- 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,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much of a drawing surface is shown, and where.
|
|
3
|
+
*
|
|
4
|
+
* Everything here is arithmetic on a `viewBox`: zooming narrows the window and
|
|
5
|
+
* panning slides it, so what is inside is re-rendered at the new scale rather
|
|
6
|
+
* than magnified as pixels. None of it knows what is being drawn — it is the
|
|
7
|
+
* pan-and-zoom half of a canvas, and it is shared because a glycan drawing and
|
|
8
|
+
* an ion image ask the same questions of it and would otherwise answer them
|
|
9
|
+
* twice.
|
|
10
|
+
*
|
|
11
|
+
* What they do not share is how a surface is fitted before it is touched, which
|
|
12
|
+
* is why `baseViewBox` takes `maximumScale`: a glycan is centred at its own
|
|
13
|
+
* size up to a readable maximum, while an image is fitted to its frame.
|
|
14
|
+
*/
|
|
15
|
+
export interface ViewState {
|
|
16
|
+
/** How far in, `1` being the base view. */
|
|
17
|
+
zoom: number;
|
|
18
|
+
/** Left edge of the window, from the left edge of the base view. */
|
|
19
|
+
panX: number;
|
|
20
|
+
/** Top edge of the window, from the top edge of the base view. */
|
|
21
|
+
panY: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** A rectangle of the drawing, shaped the way the `viewBox` wants it. */
|
|
25
|
+
export interface ViewBox {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Closest and furthest the canvas will go. */
|
|
33
|
+
export const MINIMUM_ZOOM = 0.25;
|
|
34
|
+
export const MAXIMUM_ZOOM = 8;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Biggest a drawing unit is ever drawn at, in pixels, unless a caller says
|
|
38
|
+
* otherwise.
|
|
39
|
+
*
|
|
40
|
+
* Chosen against the glycan canvas, where a symbol is 34 units across and a
|
|
41
|
+
* bond 60 long, so a drawing at this scale reads about the size it does in a
|
|
42
|
+
* paper — which is as big as it is worth drawing. Without the cap a
|
|
43
|
+
* disaccharide on a wide screen is blown up until three residues fill a metre
|
|
44
|
+
* of pixels. A surface with its own idea of how big is big enough passes its
|
|
45
|
+
* own maximum instead.
|
|
46
|
+
*/
|
|
47
|
+
export const MAXIMUM_CONTENT_SCALE = 1.5;
|
|
48
|
+
|
|
49
|
+
/** The base view, seen as it comes: no zoom, no pan. */
|
|
50
|
+
export const INITIAL_VIEW: ViewState = { zoom: 1, panX: 0, panY: 0 };
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* What the canvas shows before it is zoomed or panned.
|
|
54
|
+
*
|
|
55
|
+
* A drawing too big for the canvas is fitted to it, as anything drawn to be
|
|
56
|
+
* looked at whole must be. A drawing smaller than that is *not* stretched to
|
|
57
|
+
* fill it: it is drawn at its own size, up to `maximumScale`, in the middle of
|
|
58
|
+
* a window opened around it — so a disaccharide reads like a disaccharide
|
|
59
|
+
* however wide the screen it is on, and the empty canvas around it is still
|
|
60
|
+
* canvas, there to be clicked and drawn on.
|
|
61
|
+
* @param content - Size of the whole drawing, in canvas units.
|
|
62
|
+
* @param content.width - How wide the drawing is.
|
|
63
|
+
* @param content.height - How tall the drawing is.
|
|
64
|
+
* @param viewport - Size of the canvas on screen, in pixels.
|
|
65
|
+
* @param viewport.width - How wide the canvas is.
|
|
66
|
+
* @param viewport.height - How tall the canvas is.
|
|
67
|
+
* @param maximumScale - Biggest a canvas unit may be drawn, in pixels.
|
|
68
|
+
* @returns The rectangle of the drawing seen at zoom `1`.
|
|
69
|
+
*/
|
|
70
|
+
export function baseViewBox(
|
|
71
|
+
content: { width: number; height: number },
|
|
72
|
+
viewport: { width: number; height: number },
|
|
73
|
+
maximumScale = MAXIMUM_CONTENT_SCALE,
|
|
74
|
+
): ViewBox {
|
|
75
|
+
// Before the canvas has been measured there is nothing to fit the drawing
|
|
76
|
+
// to; showing it whole is what the `viewBox` does on its own anyway.
|
|
77
|
+
if (
|
|
78
|
+
content.width <= 0 ||
|
|
79
|
+
content.height <= 0 ||
|
|
80
|
+
viewport.width <= 0 ||
|
|
81
|
+
viewport.height <= 0
|
|
82
|
+
) {
|
|
83
|
+
return { x: 0, y: 0, width: content.width, height: content.height };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const fitted = Math.min(
|
|
87
|
+
viewport.width / content.width,
|
|
88
|
+
viewport.height / content.height,
|
|
89
|
+
);
|
|
90
|
+
const scale = Math.min(fitted, maximumScale);
|
|
91
|
+
const width = viewport.width / scale;
|
|
92
|
+
const height = viewport.height / scale;
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
x: (content.width - width) / 2,
|
|
96
|
+
y: (content.height - height) / 2,
|
|
97
|
+
width,
|
|
98
|
+
height,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* How far in and out a particular surface may go.
|
|
104
|
+
*
|
|
105
|
+
* Carried as an argument rather than fixed, because the two surfaces that use
|
|
106
|
+
* this disagree about it and both are right: a drawing may be zoomed out below
|
|
107
|
+
* its fitted size to see where it sits on the canvas, while an ion image has
|
|
108
|
+
* nothing outside itself to see — zooming out past the fit would only add
|
|
109
|
+
* emptiness — so its floor is the fit and its ceiling is far higher, since a
|
|
110
|
+
* twenty-micrometre pixel is worth magnifying.
|
|
111
|
+
*/
|
|
112
|
+
export interface ZoomBounds {
|
|
113
|
+
/**
|
|
114
|
+
* Furthest out.
|
|
115
|
+
* @default MINIMUM_ZOOM
|
|
116
|
+
*/
|
|
117
|
+
minimum?: number;
|
|
118
|
+
/**
|
|
119
|
+
* Furthest in.
|
|
120
|
+
* @default MAXIMUM_ZOOM
|
|
121
|
+
*/
|
|
122
|
+
maximum?: number;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The magnification a window factor asks for.
|
|
127
|
+
*
|
|
128
|
+
* There are two ways to say "zoom" and this package uses both, so the
|
|
129
|
+
* conversion is named rather than written as a stray reciprocal. A chart zooms
|
|
130
|
+
* by resizing the **window** it shows — `chartWheelFactor` returns that, and a
|
|
131
|
+
* factor above one means a wider window and therefore less magnification. A
|
|
132
|
+
* drawing surface zooms by scaling the picture, so `zoomAbout` takes a
|
|
133
|
+
* **magnification**, where above one means larger.
|
|
134
|
+
*
|
|
135
|
+
* Feeding one to the other reverses the wheel: the gesture still works, it
|
|
136
|
+
* simply does the opposite of what the hand meant, which is the kind of defect
|
|
137
|
+
* that survives review because nothing throws and the picture still moves.
|
|
138
|
+
* @param windowFactor - How much the window is being multiplied by.
|
|
139
|
+
* @returns The magnification that corresponds to it.
|
|
140
|
+
*/
|
|
141
|
+
export function magnificationOf(windowFactor: number): number {
|
|
142
|
+
if (!Number.isFinite(windowFactor) || windowFactor === 0) return 1;
|
|
143
|
+
return 1 / windowFactor;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Hold a zoom inside what the surface allows.
|
|
148
|
+
* @param zoom - The wanted zoom.
|
|
149
|
+
* @param bounds - How far in and out this surface goes.
|
|
150
|
+
* @returns The zoom it will actually use.
|
|
151
|
+
*/
|
|
152
|
+
export function clampZoom(zoom: number, bounds: ZoomBounds = {}): number {
|
|
153
|
+
const { minimum = MINIMUM_ZOOM, maximum = MAXIMUM_ZOOM } = bounds;
|
|
154
|
+
// A zoom that is not a number at all is a lost view rather than a small one,
|
|
155
|
+
// so it comes back to the base rather than to the floor — held inside the
|
|
156
|
+
// bounds all the same, since a surface whose floor is the fit has no base
|
|
157
|
+
// below it.
|
|
158
|
+
const wanted = Number.isFinite(zoom) ? zoom : 1;
|
|
159
|
+
return Math.min(maximum, Math.max(minimum, wanted));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Zoom while keeping one point of the drawing under the pointer.
|
|
164
|
+
*
|
|
165
|
+
* Without the anchor the drawing would drift away from the cursor as it grows,
|
|
166
|
+
* which is what makes a wheel zoom feel wrong.
|
|
167
|
+
* @param view - Where the canvas is now.
|
|
168
|
+
* @param base - What the canvas shows at zoom `1`.
|
|
169
|
+
* @param factor - How much to multiply the zoom by.
|
|
170
|
+
* @param anchor - The surface point to keep still, usually the pointer.
|
|
171
|
+
* @param anchor.x - Its horizontal position, in drawing units.
|
|
172
|
+
* @param anchor.y - Its vertical position, in drawing units.
|
|
173
|
+
* @param bounds - How far in and out this surface goes.
|
|
174
|
+
* @returns Where the canvas goes.
|
|
175
|
+
*/
|
|
176
|
+
export function zoomAbout(
|
|
177
|
+
view: ViewState,
|
|
178
|
+
base: ViewBox,
|
|
179
|
+
factor: number,
|
|
180
|
+
anchor: { x: number; y: number },
|
|
181
|
+
bounds: ZoomBounds = {},
|
|
182
|
+
): ViewState {
|
|
183
|
+
const zoom = clampZoom(view.zoom * factor, bounds);
|
|
184
|
+
if (zoom === view.zoom) return view;
|
|
185
|
+
|
|
186
|
+
const beforeWidth = base.width / view.zoom;
|
|
187
|
+
const beforeHeight = base.height / view.zoom;
|
|
188
|
+
const afterWidth = base.width / zoom;
|
|
189
|
+
const afterHeight = base.height / zoom;
|
|
190
|
+
|
|
191
|
+
// The pan is measured from the base view, so the anchor is read from there
|
|
192
|
+
// too: a window written that way keeps its place over the drawing when the
|
|
193
|
+
// canvas is resized and the base view moves under it.
|
|
194
|
+
const anchorX = anchor.x - base.x;
|
|
195
|
+
const anchorY = anchor.y - base.y;
|
|
196
|
+
|
|
197
|
+
const fractionX = beforeWidth === 0 ? 0 : (anchorX - view.panX) / beforeWidth;
|
|
198
|
+
const fractionY =
|
|
199
|
+
beforeHeight === 0 ? 0 : (anchorY - view.panY) / beforeHeight;
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
zoom,
|
|
203
|
+
panX: anchorX - fractionX * afterWidth,
|
|
204
|
+
panY: anchorY - fractionY * afterHeight,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Slide the window, in canvas units.
|
|
210
|
+
* @param view - Where the canvas is now.
|
|
211
|
+
* @param deltaX - How far to move it horizontally.
|
|
212
|
+
* @param deltaY - How far to move it vertically.
|
|
213
|
+
* @returns Where the canvas goes.
|
|
214
|
+
*/
|
|
215
|
+
export function panBy(
|
|
216
|
+
view: ViewState,
|
|
217
|
+
deltaX: number,
|
|
218
|
+
deltaY: number,
|
|
219
|
+
): ViewState {
|
|
220
|
+
return {
|
|
221
|
+
zoom: view.zoom,
|
|
222
|
+
panX: view.panX - deltaX,
|
|
223
|
+
panY: view.panY - deltaY,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Set the zoom about the middle of what is on screen, which is what the
|
|
229
|
+
* toolbar buttons want — they have no pointer to zoom around.
|
|
230
|
+
* @param view - Where the canvas is now.
|
|
231
|
+
* @param base - What the canvas shows at zoom `1`.
|
|
232
|
+
* @param zoom - The wanted zoom.
|
|
233
|
+
* @param bounds - How far in and out this surface goes.
|
|
234
|
+
* @returns Where the canvas goes.
|
|
235
|
+
*/
|
|
236
|
+
export function zoomToAboutCentre(
|
|
237
|
+
view: ViewState,
|
|
238
|
+
base: ViewBox,
|
|
239
|
+
zoom: number,
|
|
240
|
+
bounds: ZoomBounds = {},
|
|
241
|
+
): ViewState {
|
|
242
|
+
const centre = {
|
|
243
|
+
x: base.x + view.panX + base.width / view.zoom / 2,
|
|
244
|
+
y: base.y + view.panY + base.height / view.zoom / 2,
|
|
245
|
+
};
|
|
246
|
+
return zoomAbout(
|
|
247
|
+
view,
|
|
248
|
+
base,
|
|
249
|
+
clampZoom(zoom, bounds) / view.zoom,
|
|
250
|
+
centre,
|
|
251
|
+
bounds,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* The rectangle of the drawing the canvas is showing.
|
|
257
|
+
* @param view - Where the canvas is.
|
|
258
|
+
* @param base - What the canvas shows at zoom `1`.
|
|
259
|
+
* @returns The rectangle.
|
|
260
|
+
*/
|
|
261
|
+
export function viewBoxOf(view: ViewState, base: ViewBox): ViewBox {
|
|
262
|
+
return {
|
|
263
|
+
x: base.x + view.panX,
|
|
264
|
+
y: base.y + view.panY,
|
|
265
|
+
width: base.width / view.zoom,
|
|
266
|
+
height: base.height / view.zoom,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* The rectangle, written the way the `viewBox` attribute wants it.
|
|
272
|
+
* @param box - The rectangle.
|
|
273
|
+
* @returns The attribute.
|
|
274
|
+
*/
|
|
275
|
+
export function viewBoxAttribute(box: ViewBox): string {
|
|
276
|
+
return `${round(box.x)} ${round(box.y)} ${round(box.width)} ${round(box.height)}`;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* A coordinate, short enough not to bloat an attribute rewritten on every
|
|
281
|
+
* frame of a drag.
|
|
282
|
+
* @param value - The coordinate.
|
|
283
|
+
* @returns It, to two decimals.
|
|
284
|
+
*/
|
|
285
|
+
function round(value: number): number {
|
|
286
|
+
return Math.round(value * 100) / 100;
|
|
287
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The window a gesture asks for, where each viewer's own fitting holds the one
|
|
3
|
+
* the data asks for.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here touches React or the DOM: a drag arrives as two corners in the
|
|
6
|
+
* user units of the SVG, a wheel as a factor, and each leaves as a window — so
|
|
7
|
+
* what a gesture does to a chart can be read, and tested, without one being on
|
|
8
|
+
* screen.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { clamp } from '../../format/core/clamp.ts';
|
|
12
|
+
|
|
13
|
+
import type { ChartDomain, ZoomRules } from './chartDomain.ts';
|
|
14
|
+
import { DEFAULT_Y_AXIS_RULES } from './chartDomain.ts';
|
|
15
|
+
import type { PlotRect } from './chartGeometry.ts';
|
|
16
|
+
import type { ChartScale } from './chartScale.ts';
|
|
17
|
+
import { chartPixel, chartValue } from './chartScale.ts';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How far the pointer has to travel before a press counts as a gesture rather
|
|
21
|
+
* than as a click, in user units of the SVG.
|
|
22
|
+
*
|
|
23
|
+
* Across the x axis it is what decides whether there is a window at all: below
|
|
24
|
+
* this the gesture is a click that happened to wobble — which is most clicks
|
|
25
|
+
* made on a trackpad — and zooming to it would leave a window a fraction of a
|
|
26
|
+
* data unit wide, from which the only way back is the double click nobody knows
|
|
27
|
+
* about yet. `chartGestures.ts` asks the same question of the vertical travel
|
|
28
|
+
* before it calls a release a click, since a drag of one pixel across and three
|
|
29
|
+
* hundred down went somewhere.
|
|
30
|
+
*/
|
|
31
|
+
export const MINIMUM_DRAG = 4;
|
|
32
|
+
|
|
33
|
+
/** The two corners of a drag, in the user units of the SVG. */
|
|
34
|
+
export interface DragBox {
|
|
35
|
+
/** Where the press landed, horizontally. */
|
|
36
|
+
fromX: number;
|
|
37
|
+
/** Where it landed vertically. */
|
|
38
|
+
fromY: number;
|
|
39
|
+
/** Where the pointer is now, horizontally. */
|
|
40
|
+
toX: number;
|
|
41
|
+
/** Where it is vertically. */
|
|
42
|
+
toY: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The drag as it is being made, for the preview rectangle to be drawn from. */
|
|
46
|
+
export interface ZoomSelection extends DragBox {
|
|
47
|
+
/**
|
|
48
|
+
* Whether letting go here would take the y axis with it, which is what the
|
|
49
|
+
* rectangle changes shape to say.
|
|
50
|
+
*/
|
|
51
|
+
zoomsYAxis: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The drag as the preview rectangle needs it.
|
|
56
|
+
*
|
|
57
|
+
* The answer the rectangle changes shape on is worked out once, here, rather
|
|
58
|
+
* than by the rectangle itself — so what the preview promises and what letting
|
|
59
|
+
* go actually does are the same test rather than two that have to agree.
|
|
60
|
+
*
|
|
61
|
+
* A `select` drag is therefore always a band, however far past the baseline it
|
|
62
|
+
* strays: its answer is two numbers on one axis, so a preview that grew into a
|
|
63
|
+
* rectangle would promise a height nobody is ever told about.
|
|
64
|
+
* @param drag - The drag being made, `null` when none is.
|
|
65
|
+
* @param yScale - The y axis as it is currently zoomed.
|
|
66
|
+
* @param rules - How the y axis behaves and what a drag means, defaulting to a
|
|
67
|
+
* stick spectrum read by dragging its horizontal axis.
|
|
68
|
+
* @returns The selection to draw, `null` when there is no drag.
|
|
69
|
+
*/
|
|
70
|
+
export function zoomSelection(
|
|
71
|
+
drag: DragBox | null,
|
|
72
|
+
yScale: ChartScale,
|
|
73
|
+
rules: ZoomRules = {},
|
|
74
|
+
): ZoomSelection | null {
|
|
75
|
+
if (drag === null) return null;
|
|
76
|
+
const {
|
|
77
|
+
baseline = DEFAULT_Y_AXIS_RULES.baseline,
|
|
78
|
+
pointsDown = DEFAULT_Y_AXIS_RULES.pointsDown,
|
|
79
|
+
drag: mode = 'xAxis',
|
|
80
|
+
} = rules;
|
|
81
|
+
return {
|
|
82
|
+
fromX: drag.fromX,
|
|
83
|
+
fromY: drag.fromY,
|
|
84
|
+
toX: drag.toX,
|
|
85
|
+
toY: drag.toY,
|
|
86
|
+
// The box tool takes the height always, so the preview is a rectangle from
|
|
87
|
+
// the first pixel of the gesture rather than a full-height band that
|
|
88
|
+
// suddenly becomes one; a select drag never takes it at all.
|
|
89
|
+
zoomsYAxis:
|
|
90
|
+
mode === 'box' ||
|
|
91
|
+
(mode !== 'select' &&
|
|
92
|
+
releasedBeyondBaseline(drag.toY, yScale, baseline, pointsDown)),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Whether a drag let go here asks for the y axis as well.
|
|
98
|
+
*
|
|
99
|
+
* The baseline, not the bottom of the plot: on a mirrored chart zero runs across
|
|
100
|
+
* the middle, so a drag that dips into the reflected half has crossed it, and on
|
|
101
|
+
* an ordinary chart the same test means the pointer went below the axis and out
|
|
102
|
+
* into the margin. One rule, two gestures that both read as "and take the height
|
|
103
|
+
* with you".
|
|
104
|
+
*
|
|
105
|
+
* **Which way "past" points depends on which side of the baseline the data is
|
|
106
|
+
* on**, which is what `pointsDown` says. Features that stand up out of a
|
|
107
|
+
* baseline at the foot of the plot — mass sticks, absorbance bands — are passed
|
|
108
|
+
* by going below it. Percent transmittance hangs down from 100, which sits near
|
|
109
|
+
* the top of the plot, so there the gesture is a drag released *above* the
|
|
110
|
+
* baseline; asking the other question would answer yes almost everywhere in the
|
|
111
|
+
* plot and make every ordinary drag take the value axis with it.
|
|
112
|
+
* @param pointerY - Where the pointer is, in user units of the SVG.
|
|
113
|
+
* @param yScale - The y axis as it is currently zoomed.
|
|
114
|
+
* @param baseline - The value the gesture is judged against. Defaults to `0`.
|
|
115
|
+
* @param pointsDown - Whether the data hangs below the baseline. Defaults to
|
|
116
|
+
* `false`.
|
|
117
|
+
* @returns Whether the y axis comes along.
|
|
118
|
+
*/
|
|
119
|
+
export function releasedBeyondBaseline(
|
|
120
|
+
pointerY: number,
|
|
121
|
+
yScale: ChartScale,
|
|
122
|
+
baseline = DEFAULT_Y_AXIS_RULES.baseline,
|
|
123
|
+
pointsDown = DEFAULT_Y_AXIS_RULES.pointsDown,
|
|
124
|
+
): boolean {
|
|
125
|
+
const atBaseline = chartPixel(yScale, baseline);
|
|
126
|
+
// SVG counts pixels downwards, so "above the baseline" is the smaller pixel.
|
|
127
|
+
return pointsDown ? pointerY < atBaseline : pointerY > atBaseline;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The window a drag asks for, or `null` when it asks for nothing.
|
|
132
|
+
*
|
|
133
|
+
* Both corners are pulled back inside the plot before they are read, so a drag
|
|
134
|
+
* that ran out over the axis labels — which is how the y axis is asked for in
|
|
135
|
+
* the first place — zooms to the edge of the data rather than to whatever lies
|
|
136
|
+
* under the margin.
|
|
137
|
+
*
|
|
138
|
+
* Whether the baseline is kept in the window is the one thing that differs
|
|
139
|
+
* between viewers, and `YAxisRules` is where they say so. A stick spectrum keeps
|
|
140
|
+
* it: sticks are drawn from it, and a window starting at a tenth of the base
|
|
141
|
+
* peak would cut every one of them off at the ankles. A continuous trace does
|
|
142
|
+
* not: a band dragged out between two absorbances is asked about between those
|
|
143
|
+
* two absorbances.
|
|
144
|
+
* @param current - The window in force, kept on the axis that is not asked for.
|
|
145
|
+
* @param drag - The two corners, in user units of the SVG.
|
|
146
|
+
* @param plot - Where the plot sits inside the SVG.
|
|
147
|
+
* @param xScale - The x axis as it is currently zoomed.
|
|
148
|
+
* @param yScale - The y axis as it is currently zoomed.
|
|
149
|
+
* @param rules - How the y axis behaves and what a drag means, defaulting to a
|
|
150
|
+
* stick spectrum read by dragging its horizontal axis.
|
|
151
|
+
* @returns The window to show, `null` when the drag was too short to be one.
|
|
152
|
+
*/
|
|
153
|
+
export function zoomedDomain(
|
|
154
|
+
current: ChartDomain,
|
|
155
|
+
drag: DragBox,
|
|
156
|
+
plot: PlotRect,
|
|
157
|
+
xScale: ChartScale,
|
|
158
|
+
yScale: ChartScale,
|
|
159
|
+
rules: ZoomRules = {},
|
|
160
|
+
): ChartDomain | null {
|
|
161
|
+
const {
|
|
162
|
+
baseline = DEFAULT_Y_AXIS_RULES.baseline,
|
|
163
|
+
keepBaseline = DEFAULT_Y_AXIS_RULES.keepBaseline,
|
|
164
|
+
pointsDown = DEFAULT_Y_AXIS_RULES.pointsDown,
|
|
165
|
+
drag: mode = 'xAxis',
|
|
166
|
+
} = rules;
|
|
167
|
+
const fromX = clamp(drag.fromX, plot.left, plot.right);
|
|
168
|
+
const toX = clamp(drag.toX, plot.left, plot.right);
|
|
169
|
+
if (Math.abs(toX - fromX) < MINIMUM_DRAG) return null;
|
|
170
|
+
// Sorted after inverting, not before: an axis drawn right to left — an
|
|
171
|
+
// infrared spectrum runs from 4000 down to 400 — maps the leftmost pixel to
|
|
172
|
+
// the *highest* value, so taking the left edge as the lower bound would hand
|
|
173
|
+
// back a window whose ends are the wrong way round, and every scale built
|
|
174
|
+
// from it would draw the trace mirrored.
|
|
175
|
+
const firstX = chartValue(xScale, fromX);
|
|
176
|
+
const secondX = chartValue(xScale, toX);
|
|
177
|
+
const x: [number, number] = [
|
|
178
|
+
Math.min(firstX, secondX),
|
|
179
|
+
Math.max(firstX, secondX),
|
|
180
|
+
];
|
|
181
|
+
// The box tool is asked for the rectangle it was given, wherever it was let
|
|
182
|
+
// go; the reading gesture takes the height only when it crossed the baseline.
|
|
183
|
+
if (
|
|
184
|
+
mode !== 'box' &&
|
|
185
|
+
!releasedBeyondBaseline(drag.toY, yScale, baseline, pointsDown)
|
|
186
|
+
) {
|
|
187
|
+
return { x, y: current.y };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const fromY = chartValue(yScale, clamp(drag.fromY, plot.top, plot.bottom));
|
|
191
|
+
const toY = chartValue(yScale, clamp(drag.toY, plot.top, plot.bottom));
|
|
192
|
+
// Both ends, so a baseline the data runs *down* from — 100 percent
|
|
193
|
+
// transmittance — is kept as surely as one it stands on. The box tool holds no
|
|
194
|
+
// baseline at all: a rectangle dragged round a feature is a promise about
|
|
195
|
+
// exactly that rectangle, and a viewer whose axis rules keep its baseline
|
|
196
|
+
// would otherwise see the tool quietly return a taller window than the one
|
|
197
|
+
// drawn.
|
|
198
|
+
const holdBaseline = keepBaseline && mode !== 'box';
|
|
199
|
+
const bottom = holdBaseline
|
|
200
|
+
? Math.min(baseline, fromY, toY)
|
|
201
|
+
: Math.min(fromY, toY);
|
|
202
|
+
const top = holdBaseline
|
|
203
|
+
? Math.max(baseline, fromY, toY)
|
|
204
|
+
: Math.max(fromY, toY);
|
|
205
|
+
return top > bottom ? { x, y: [bottom, top] } : { x, y: current.y };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The window one turn of the wheel asks for.
|
|
210
|
+
*
|
|
211
|
+
* Both bounds are scaled about the baseline rather than about the middle of the
|
|
212
|
+
* window. On a stick spectrum that keeps the foot the sticks are drawn from on
|
|
213
|
+
* the axis, and keeps a mirrored chart symmetric — scaling about the middle
|
|
214
|
+
* would send the two halves apart at different rates, so a peak of one height
|
|
215
|
+
* would mean two different intensities. On an axis running downwards from a
|
|
216
|
+
* baseline, such as percent transmittance from 100, it is what stretches the
|
|
217
|
+
* bands instead of walking the whole trace off the plot.
|
|
218
|
+
* @param current - The window in force.
|
|
219
|
+
* @param factor - What one wheel event is worth, above one to zoom out.
|
|
220
|
+
* @param baseline - The value to scale about. Defaults to `0`.
|
|
221
|
+
* @returns The window to show, `current` itself when the factor is not one a
|
|
222
|
+
* window survives.
|
|
223
|
+
*/
|
|
224
|
+
export function scaledYAxis(
|
|
225
|
+
current: ChartDomain,
|
|
226
|
+
factor: number,
|
|
227
|
+
baseline = DEFAULT_Y_AXIS_RULES.baseline,
|
|
228
|
+
): ChartDomain {
|
|
229
|
+
if (!Number.isFinite(factor) || factor <= 0) return current;
|
|
230
|
+
const y: [number, number] = [
|
|
231
|
+
baseline + (current.y[0] - baseline) * factor,
|
|
232
|
+
baseline + (current.y[1] - baseline) * factor,
|
|
233
|
+
];
|
|
234
|
+
return y[1] > y[0] ? { x: current.x, y } : current;
|
|
235
|
+
}
|