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,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gestures that move the window a chart is showing.
|
|
3
|
+
*
|
|
4
|
+
* A drag zooms the x axis, because that is the axis a chemist reads: the
|
|
5
|
+
* question is nearly always "what is between 366 and 372", never "what is
|
|
6
|
+
* between forty and sixty percent". The y axis comes along only when the drag is
|
|
7
|
+
* released past the baseline, a gesture that cannot be made by accident and one
|
|
8
|
+
* the preview rectangle announces before the button is let go. The wheel scales
|
|
9
|
+
* the y axis on its own, bringing up the small features being asked about far
|
|
10
|
+
* more often than any box around them, and a double click puts the window back.
|
|
11
|
+
*
|
|
12
|
+
* Which of them a chart answers is `ZoomGestures`, and a viewer is free to offer
|
|
13
|
+
* fewer: a drag can be the rectangle it sweeps out, and the wheel can be left to
|
|
14
|
+
* the page. Neither is a preference to be toggled — it is what the measurement
|
|
15
|
+
* makes worth doing, and `chartDomain.ts` says why.
|
|
16
|
+
*
|
|
17
|
+
* Not every gesture moves the window. A drag can be asked to report the range it
|
|
18
|
+
* swept out, a press that went nowhere is a click, and a host can refuse a press
|
|
19
|
+
* outright so that a handle drawn on the chart keeps the gesture aimed at it;
|
|
20
|
+
* `chartGestures.ts` holds all three, and `zoomDomain.ts` holds what a gesture
|
|
21
|
+
* does to a window. Neither knows anything of React, which is what lets the
|
|
22
|
+
* answer to a gesture be read without a chart on screen.
|
|
23
|
+
*
|
|
24
|
+
* What the window is fitted *to* is handed in rather than worked out here, and
|
|
25
|
+
* that is what makes one hook serve every kind of spectrum: fitting reads the
|
|
26
|
+
* traces, and a mass spectrum's are two per spectrum where an infrared
|
|
27
|
+
* spectrum's are one in either of two units. `useChartWindow` then holds the
|
|
28
|
+
* answer each viewer hands over.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import type { PointerEvent as ReactPointerEvent, RefObject } from 'react';
|
|
32
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
33
|
+
|
|
34
|
+
import type {
|
|
35
|
+
ChartDomain,
|
|
36
|
+
YAxisRules,
|
|
37
|
+
ZoomGestures,
|
|
38
|
+
ZoomRules,
|
|
39
|
+
} from '../core/chartDomain.ts';
|
|
40
|
+
import { DEFAULT_ZOOM_GESTURES } from '../core/chartDomain.ts';
|
|
41
|
+
import type { ChartScale } from '../core/chartScale.ts';
|
|
42
|
+
import { chartWheelFactor } from '../core/chartViewport.ts';
|
|
43
|
+
import type { ZoomSelection } from '../core/zoomDomain.ts';
|
|
44
|
+
import { scaledYAxis, zoomSelection } from '../core/zoomDomain.ts';
|
|
45
|
+
|
|
46
|
+
import type {
|
|
47
|
+
ChartGestureReports,
|
|
48
|
+
ChartZoomHandlers,
|
|
49
|
+
Drag,
|
|
50
|
+
} from './chartGestures.ts';
|
|
51
|
+
import {
|
|
52
|
+
answeredRelease,
|
|
53
|
+
draggedTo,
|
|
54
|
+
releaseDrag,
|
|
55
|
+
startedDrag,
|
|
56
|
+
} from './chartGestures.ts';
|
|
57
|
+
import type { ChartWindowOptions } from './useChartWindow.ts';
|
|
58
|
+
import { useChartWindow } from './useChartWindow.ts';
|
|
59
|
+
import { useWheelListener } from './useWheelListener.ts';
|
|
60
|
+
|
|
61
|
+
/** The chart, what it is fitted to, and which gestures it answers. */
|
|
62
|
+
export interface ChartZoomOptions
|
|
63
|
+
extends ChartWindowOptions, ChartGestureReports {
|
|
64
|
+
/** The SVG the gestures are made on, as it was handed to its `ref`. */
|
|
65
|
+
svgRef: RefObject<SVGSVGElement | null>;
|
|
66
|
+
/**
|
|
67
|
+
* How the y axis behaves under a gesture — where its baseline is, and whether
|
|
68
|
+
* that baseline is held in the window.
|
|
69
|
+
* @default a stick spectrum's: a baseline of zero, always kept
|
|
70
|
+
*/
|
|
71
|
+
yAxis?: YAxisRules;
|
|
72
|
+
/**
|
|
73
|
+
* Which gestures the chart answers: what a drag asks for, and whether the
|
|
74
|
+
* wheel scales the value axis at all.
|
|
75
|
+
*
|
|
76
|
+
* Both together rather than one at a time, because they are one decision. A
|
|
77
|
+
* viewer that reads its data in more than one way — an infrared spectrum is
|
|
78
|
+
* read as absorbance or as percent transmittance — settles the whole set from
|
|
79
|
+
* whatever it is currently reading, and hands it over as it stands.
|
|
80
|
+
* @default every gesture: a drag along the horizontal axis, and the wheel
|
|
81
|
+
*/
|
|
82
|
+
gestures?: ZoomGestures;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** The window, the drag being made in it, and how to work both. */
|
|
86
|
+
export interface ChartZoom {
|
|
87
|
+
/** What the chart is showing. */
|
|
88
|
+
domain: ChartDomain;
|
|
89
|
+
/**
|
|
90
|
+
* The horizontal axis, as every gesture was measured against it: **draw with
|
|
91
|
+
* this rather than building one**, since a second scale beside it is a second
|
|
92
|
+
* chance to get a reversed axis the wrong way round.
|
|
93
|
+
*/
|
|
94
|
+
xScale: ChartScale;
|
|
95
|
+
/** The vertical axis, likewise. */
|
|
96
|
+
yScale: ChartScale;
|
|
97
|
+
/** The drag being made, `null` when none is. */
|
|
98
|
+
selection: ZoomSelection | null;
|
|
99
|
+
/** Put the window back to everything that is drawn. */
|
|
100
|
+
reset: () => void;
|
|
101
|
+
/** Put on the SVG. */
|
|
102
|
+
handlers: ChartZoomHandlers;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Zoom a chart by dragging it, by the wheel and by double clicking it.
|
|
107
|
+
*
|
|
108
|
+
* Which window is on screen — the fit, the one a gesture arrived at, or the one
|
|
109
|
+
* a host imposes — is `useChartWindow`. What is here is what a gesture *is*: the
|
|
110
|
+
* drag as it is made, the rules it is read under, and the answer it comes to.
|
|
111
|
+
* @param options - The chart, the fit and how its y axis behaves.
|
|
112
|
+
* @returns The window and the gestures that move it.
|
|
113
|
+
*/
|
|
114
|
+
export function useChartZoom(options: ChartZoomOptions): ChartZoom {
|
|
115
|
+
const {
|
|
116
|
+
fitted,
|
|
117
|
+
fitKey,
|
|
118
|
+
yFitKey,
|
|
119
|
+
svgRef,
|
|
120
|
+
plot,
|
|
121
|
+
yAxis,
|
|
122
|
+
gestures,
|
|
123
|
+
reverseX = false,
|
|
124
|
+
domain: imposed = null,
|
|
125
|
+
onSelectRange,
|
|
126
|
+
onClick,
|
|
127
|
+
shouldStartDrag,
|
|
128
|
+
} = options;
|
|
129
|
+
|
|
130
|
+
const { domain, xScale, yScale, show, reset } = useChartWindow({
|
|
131
|
+
fitted,
|
|
132
|
+
fitKey,
|
|
133
|
+
...(yFitKey === undefined ? {} : { yFitKey }),
|
|
134
|
+
plot,
|
|
135
|
+
domain: imposed,
|
|
136
|
+
reverseX,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Taken apart field by field rather than depending on the object, so a viewer
|
|
140
|
+
// rebuilding an equal `yAxis` or `gestures` on every render does not rebuild
|
|
141
|
+
// the rules and every callback hanging off them. Every field has to be listed
|
|
142
|
+
// here: one left out silently falls back to its default, which is how a
|
|
143
|
+
// transmittance chart came to answer a mass spectrum's question about its own
|
|
144
|
+
// baseline.
|
|
145
|
+
const baseline = yAxis?.baseline;
|
|
146
|
+
const keepBaseline = yAxis?.keepBaseline;
|
|
147
|
+
const pointsDown = yAxis?.pointsDown;
|
|
148
|
+
const dragMode = gestures?.drag ?? DEFAULT_ZOOM_GESTURES.drag;
|
|
149
|
+
const wheel = gestures?.wheel ?? DEFAULT_ZOOM_GESTURES.wheel;
|
|
150
|
+
const rules = useMemo<ZoomRules>(
|
|
151
|
+
() => ({ baseline, keepBaseline, pointsDown, drag: dragMode }),
|
|
152
|
+
[baseline, keepBaseline, pointsDown, dragMode],
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const [drag, setDrag] = useState<Drag | null>(null);
|
|
156
|
+
|
|
157
|
+
const onWheel = useCallback(
|
|
158
|
+
(event: WheelEvent) => {
|
|
159
|
+
// Refused before the event is touched, so a chart that does not answer the
|
|
160
|
+
// wheel scrolls the page under the pointer exactly as the rest of it does.
|
|
161
|
+
// Swallowing the gesture and doing nothing with it would be the one
|
|
162
|
+
// outcome nobody asked for.
|
|
163
|
+
if (!wheel) return;
|
|
164
|
+
const factor = chartWheelFactor(event.deltaY, event.deltaMode);
|
|
165
|
+
if (factor === 1) return;
|
|
166
|
+
// Heard non-passively for exactly this: without the refusal the chart
|
|
167
|
+
// zooms and the page scrolls out from under it at the same time.
|
|
168
|
+
event.preventDefault();
|
|
169
|
+
show(scaledYAxis(domain, factor, rules.baseline));
|
|
170
|
+
},
|
|
171
|
+
[domain, rules.baseline, wheel, show],
|
|
172
|
+
);
|
|
173
|
+
useWheelListener(svgRef, onWheel);
|
|
174
|
+
|
|
175
|
+
const onPointerDown = useCallback(
|
|
176
|
+
(event: ReactPointerEvent<SVGSVGElement>) => {
|
|
177
|
+
const started = startedDrag(event, svgRef.current, shouldStartDrag);
|
|
178
|
+
if (started !== null) setDrag(started);
|
|
179
|
+
},
|
|
180
|
+
[svgRef, shouldStartDrag],
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const onPointerMove = useCallback(
|
|
184
|
+
(event: ReactPointerEvent<SVGSVGElement>) => {
|
|
185
|
+
const moved = draggedTo(drag, event, svgRef.current);
|
|
186
|
+
if (moved !== null) setDrag(moved);
|
|
187
|
+
},
|
|
188
|
+
[drag, svgRef],
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const onPointerUp = useCallback(
|
|
192
|
+
(event: ReactPointerEvent<SVGSVGElement>) => {
|
|
193
|
+
if (drag?.pointerId !== event.pointerId) return;
|
|
194
|
+
releaseDrag(event);
|
|
195
|
+
setDrag(null);
|
|
196
|
+
const released = draggedTo(drag, event, svgRef.current) ?? drag;
|
|
197
|
+
const next = answeredRelease(
|
|
198
|
+
domain,
|
|
199
|
+
released,
|
|
200
|
+
plot,
|
|
201
|
+
xScale,
|
|
202
|
+
yScale,
|
|
203
|
+
rules,
|
|
204
|
+
{ onSelectRange, onClick },
|
|
205
|
+
// Read off the release rather than off the press, because that is where
|
|
206
|
+
// the reader was looking and what `reportClick` already inverts.
|
|
207
|
+
{ shift: event.shiftKey, alt: event.altKey },
|
|
208
|
+
);
|
|
209
|
+
if (next !== null) show(next);
|
|
210
|
+
},
|
|
211
|
+
[
|
|
212
|
+
drag,
|
|
213
|
+
domain,
|
|
214
|
+
plot,
|
|
215
|
+
xScale,
|
|
216
|
+
yScale,
|
|
217
|
+
svgRef,
|
|
218
|
+
rules,
|
|
219
|
+
onSelectRange,
|
|
220
|
+
onClick,
|
|
221
|
+
show,
|
|
222
|
+
],
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
const onPointerCancel = useCallback(
|
|
226
|
+
(event: ReactPointerEvent<SVGSVGElement>) => {
|
|
227
|
+
if (drag?.pointerId !== event.pointerId) return;
|
|
228
|
+
releaseDrag(event);
|
|
229
|
+
setDrag(null);
|
|
230
|
+
},
|
|
231
|
+
[drag],
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
const selection = useMemo(
|
|
235
|
+
() => zoomSelection(drag, yScale, rules),
|
|
236
|
+
[drag, yScale, rules],
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
domain,
|
|
241
|
+
xScale,
|
|
242
|
+
yScale,
|
|
243
|
+
selection,
|
|
244
|
+
reset,
|
|
245
|
+
handlers: {
|
|
246
|
+
onPointerDown,
|
|
247
|
+
onPointerMove,
|
|
248
|
+
onPointerUp,
|
|
249
|
+
onPointerCancel,
|
|
250
|
+
onDoubleClick: reset,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export { type ChartZoomHandlers } from './chartGestures.ts';
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wheel over an element, heard loudly enough to refuse the page its
|
|
3
|
+
* scroll.
|
|
4
|
+
*
|
|
5
|
+
* React's `onWheel` is registered passively — the browser is told in advance
|
|
6
|
+
* that the page may scroll before the handler has had its say — so calling
|
|
7
|
+
* `preventDefault` inside it does nothing at all: the chart zooms and the page
|
|
8
|
+
* scrolls out from under it at the same time. The only way to be heard is to
|
|
9
|
+
* register the listener on the element directly with `{ passive: false }`,
|
|
10
|
+
* which is what this hook exists to do; nothing else about the gesture belongs
|
|
11
|
+
* here.
|
|
12
|
+
*
|
|
13
|
+
* The listener is attached once and reads the handler through a ref refreshed
|
|
14
|
+
* on every commit. Both halves are needed: attaching once is what keeps a
|
|
15
|
+
* pointer resting over the chart from re-registering a listener sixty times a
|
|
16
|
+
* second, and reading the handler live is what stops that one listener from
|
|
17
|
+
* zooming the window as it stood when the chart was mounted.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { RefObject } from 'react';
|
|
21
|
+
import { useEffect, useLayoutEffect, useRef } from 'react';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Hear the wheel over an element.
|
|
25
|
+
* @param ref - The element, as it was handed to its `ref`.
|
|
26
|
+
* @param handler - What to do with the wheel; free to be an inline arrow, since
|
|
27
|
+
* it is read at the moment the wheel turns rather than closed over when the
|
|
28
|
+
* listener is attached. It is the handler's own business to call
|
|
29
|
+
* `preventDefault` — the listener is registered so that the call is honoured,
|
|
30
|
+
* not so that it is made.
|
|
31
|
+
*/
|
|
32
|
+
export function useWheelListener<T extends Element>(
|
|
33
|
+
ref: RefObject<T | null>,
|
|
34
|
+
handler: (event: WheelEvent) => void,
|
|
35
|
+
): void {
|
|
36
|
+
const latest = useRef(handler);
|
|
37
|
+
useLayoutEffect(() => {
|
|
38
|
+
latest.current = handler;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
const element = ref.current;
|
|
43
|
+
if (element === null) return;
|
|
44
|
+
// Typed as the plain `Event` the element's own listener map hands it: an
|
|
45
|
+
// `Element` is not known to carry a wheel, so the narrowing is done here.
|
|
46
|
+
function onWheel(event: Event) {
|
|
47
|
+
if (event instanceof WheelEvent) latest.current(event);
|
|
48
|
+
}
|
|
49
|
+
element.addEventListener('wheel', onWheel, WHEEL_LISTENER);
|
|
50
|
+
return () => {
|
|
51
|
+
element.removeEventListener('wheel', onWheel);
|
|
52
|
+
};
|
|
53
|
+
}, [ref]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Registered non-passively, which is the whole reason this hook exists. Nothing
|
|
58
|
+
* is passed back on removal: a listener is matched on its type, its function
|
|
59
|
+
* and its capture flag alone, and passing the options object there is a type
|
|
60
|
+
* error rather than a courtesy.
|
|
61
|
+
*/
|
|
62
|
+
const WHEEL_LISTENER = { passive: false } as const;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Put a PNG on the clipboard.
|
|
3
|
+
*
|
|
4
|
+
* The image is handed over as a promise rather than as a blob on purpose:
|
|
5
|
+
* Safari only allows a clipboard write that the click itself started, so the
|
|
6
|
+
* item has to be built while the handler is still running and the
|
|
7
|
+
* rasterization awaited by the clipboard rather than before it.
|
|
8
|
+
* @param png - The image being rasterized.
|
|
9
|
+
* @returns Whether it was copied. `false` outside a secure context, and in a
|
|
10
|
+
* browser whose clipboard takes text only.
|
|
11
|
+
*/
|
|
12
|
+
export async function writeImageToClipboard(
|
|
13
|
+
png: Promise<Blob>,
|
|
14
|
+
): Promise<boolean> {
|
|
15
|
+
if (typeof ClipboardItem === 'undefined' || !navigator.clipboard?.write) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { writeImageToClipboard } from './copyPng.ts';
|
|
1
2
|
export type { WriteBlobToClipboardOptions } from './writeBlobToClipboard.ts';
|
|
2
3
|
export { writeBlobToClipboard } from './writeBlobToClipboard.ts';
|
|
3
4
|
export type { ClipboardContent, ClipboardText } from './writeToClipboard.ts';
|
|
@@ -4,7 +4,6 @@ import { MISSING_VALUE } from '../../format/core/missing.ts';
|
|
|
4
4
|
import { TOKEN } from '../../tokens/core/familyTokens.ts';
|
|
5
5
|
|
|
6
6
|
import { ClickToCopy } from './ClickToCopy.tsx';
|
|
7
|
-
import { CopyButton } from './CopyButton.tsx';
|
|
8
7
|
|
|
9
8
|
const DEFAULT_BLOCK_HEIGHT = 160;
|
|
10
9
|
|
|
@@ -12,7 +11,7 @@ const DEFAULT_BLOCK_HEIGHT = 160;
|
|
|
12
11
|
export interface CopyableValueProps {
|
|
13
12
|
/** What the value is, written above it, e.g. `InChIKey`. */
|
|
14
13
|
label: string;
|
|
15
|
-
/** The value itself, which is
|
|
14
|
+
/** The value itself, which is what a click on it copies. */
|
|
16
15
|
value: string;
|
|
17
16
|
/**
|
|
18
17
|
* A longer explanation of the label, shown on hover.
|
|
@@ -31,8 +30,9 @@ export interface CopyableValueProps {
|
|
|
31
30
|
*/
|
|
32
31
|
maxHeight?: number | string;
|
|
33
32
|
/**
|
|
34
|
-
* What the pointer and a screen reader are told the
|
|
35
|
-
*
|
|
33
|
+
* What the pointer and a screen reader are told, replacing the title built
|
|
34
|
+
* from the label and the value.
|
|
35
|
+
* @default undefined — `Copy the ${label} (${value})`
|
|
36
36
|
*/
|
|
37
37
|
copyTitle?: string;
|
|
38
38
|
/**
|
|
@@ -48,14 +48,16 @@ export interface CopyableValueProps {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
|
-
* One read-only value, named,
|
|
51
|
+
* One read-only value, named, copied by clicking it.
|
|
52
52
|
*
|
|
53
|
-
* A derived notation — a SMILES, an InChIKey, an accession
|
|
54
|
-
* somewhere else, so
|
|
55
|
-
*
|
|
56
|
-
*
|
|
53
|
+
* A derived notation — a SMILES, an InChIKey, an accession, a computed energy
|
|
54
|
+
* — is only useful somewhere else, so the value is the button that copies it:
|
|
55
|
+
* the cursor carries a clipboard over it, a click or `Enter` puts it on the
|
|
56
|
+
* clipboard, and a tick confirms. Nothing is drawn beside the label, which
|
|
57
|
+
* names the value and no more. An empty value reads as the missing marker and
|
|
58
|
+
* offers nothing to copy.
|
|
57
59
|
* @param props - See {@link CopyableValueProps}.
|
|
58
|
-
* @returns The labelled value
|
|
60
|
+
* @returns The labelled value.
|
|
59
61
|
*/
|
|
60
62
|
export function CopyableValue(props: CopyableValueProps): ReactElement {
|
|
61
63
|
const {
|
|
@@ -64,7 +66,7 @@ export function CopyableValue(props: CopyableValueProps): ReactElement {
|
|
|
64
66
|
hint,
|
|
65
67
|
block = false,
|
|
66
68
|
maxHeight = DEFAULT_BLOCK_HEIGHT,
|
|
67
|
-
copyTitle
|
|
69
|
+
copyTitle,
|
|
68
70
|
children,
|
|
69
71
|
className,
|
|
70
72
|
} = props;
|
|
@@ -78,27 +80,18 @@ export function CopyableValue(props: CopyableValueProps): ReactElement {
|
|
|
78
80
|
: `copyable-value ${className}`
|
|
79
81
|
}
|
|
80
82
|
>
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
</span>
|
|
89
|
-
<CopyButton
|
|
90
|
-
content={value}
|
|
91
|
-
title={copyTitle}
|
|
92
|
-
disabled={isEmpty}
|
|
93
|
-
minimal
|
|
94
|
-
small
|
|
95
|
-
/>
|
|
96
|
-
</div>
|
|
83
|
+
<span
|
|
84
|
+
className="copyable-value__label"
|
|
85
|
+
style={hint === undefined ? LABEL_STYLE : HINTED_LABEL_STYLE}
|
|
86
|
+
title={hint}
|
|
87
|
+
>
|
|
88
|
+
{label}
|
|
89
|
+
</span>
|
|
97
90
|
<ClickToCopy
|
|
98
91
|
as="code"
|
|
99
92
|
value={value}
|
|
100
93
|
label={label}
|
|
101
|
-
|
|
94
|
+
title={copyTitle}
|
|
102
95
|
disabled={isEmpty}
|
|
103
96
|
className="copyable-value__value"
|
|
104
97
|
style={block ? { ...BLOCK_VALUE_STYLE, maxHeight } : VALUE_STYLE}
|
|
@@ -110,14 +103,8 @@ export function CopyableValue(props: CopyableValueProps): ReactElement {
|
|
|
110
103
|
);
|
|
111
104
|
}
|
|
112
105
|
|
|
113
|
-
const HEADER_STYLE = {
|
|
114
|
-
display: 'flex',
|
|
115
|
-
alignItems: 'center',
|
|
116
|
-
justifyContent: 'space-between',
|
|
117
|
-
gap: 8,
|
|
118
|
-
} as const satisfies CSSProperties;
|
|
119
|
-
|
|
120
106
|
const LABEL_STYLE = {
|
|
107
|
+
display: 'block',
|
|
121
108
|
color: TOKEN.textMuted,
|
|
122
109
|
fontSize: 12,
|
|
123
110
|
fontWeight: 600,
|
package/src/core.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from './i18n/core/index.ts';
|
|
|
14
14
|
export * from './language/core/index.ts';
|
|
15
15
|
export * from './orbital/core/index.ts';
|
|
16
16
|
export * from './overlay/core/index.ts';
|
|
17
|
+
export * from './panel/core/index.ts';
|
|
17
18
|
export * from './parallel/core/index.ts';
|
|
18
19
|
export * from './pedagogy/core/index.ts';
|
|
19
20
|
export * from './periodic/core/index.ts';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A row of buttons with the name box among them, wrapping when the dialog is
|
|
3
|
+
* too narrow for them.
|
|
4
|
+
*/
|
|
5
|
+
export const exportButtonsStyle = {
|
|
6
|
+
display: 'flex',
|
|
7
|
+
flexWrap: 'wrap',
|
|
8
|
+
alignItems: 'center',
|
|
9
|
+
gap: 6,
|
|
10
|
+
} as const;
|
|
11
|
+
|
|
12
|
+
/** One group of an export dialog: what it offers, in a column. */
|
|
13
|
+
export const exportSectionStyle = {
|
|
14
|
+
display: 'flex',
|
|
15
|
+
flexDirection: 'column',
|
|
16
|
+
gap: 8,
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
/** Text that says something about a control rather than being one. */
|
|
20
|
+
export const exportNoteStyle = { fontSize: 12, opacity: 0.7 } as const;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/** How big a picture is written out, as a multiple of the size it is drawn at. */
|
|
2
|
+
export interface ImageResolution {
|
|
3
|
+
/** Identifies the resolution in a picker. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** What the option reads. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** How many pixels each drawing unit becomes. */
|
|
8
|
+
scale: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The sizes a picture leaves the editor at.
|
|
13
|
+
*
|
|
14
|
+
* A drawing unit is about a screen pixel, so the multipliers read as what the
|
|
15
|
+
* picture is for rather than as numbers: what is on screen, the same again on a
|
|
16
|
+
* retina display, and the two steps up a figure needs to survive being printed
|
|
17
|
+
* or thrown on a wall.
|
|
18
|
+
*/
|
|
19
|
+
export const IMAGE_RESOLUTIONS = [
|
|
20
|
+
{ id: 'screen', label: 'Screen (1×)', scale: 1 },
|
|
21
|
+
{ id: 'retina', label: 'Retina (2×)', scale: 2 },
|
|
22
|
+
{ id: 'print', label: 'Print (4×)', scale: 4 },
|
|
23
|
+
{ id: 'poster', label: 'Poster (8×)', scale: 8 },
|
|
24
|
+
] as const satisfies readonly ImageResolution[];
|
|
25
|
+
|
|
26
|
+
/** One of the resolutions offered. */
|
|
27
|
+
export type ImageResolutionId = (typeof IMAGE_RESOLUTIONS)[number]['id'];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The resolution a picture is written out at unless another is picked: what is
|
|
31
|
+
* on screen, doubled, which is what a picture pasted into a document wants.
|
|
32
|
+
*/
|
|
33
|
+
export const DEFAULT_IMAGE_RESOLUTION = IMAGE_RESOLUTIONS[1];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Longest side a browser rasterizes reliably.
|
|
37
|
+
*
|
|
38
|
+
* Above roughly this, Safari and Chrome quietly hand back an empty canvas
|
|
39
|
+
* instead of refusing, so the picture would be saved blank.
|
|
40
|
+
*/
|
|
41
|
+
const MAXIMUM_SIDE = 8192;
|
|
42
|
+
|
|
43
|
+
/** Most pixels a rasterized picture is allowed to hold. */
|
|
44
|
+
const MAXIMUM_PIXELS = 32 * 1024 * 1024;
|
|
45
|
+
|
|
46
|
+
/** How big a picture comes out, in pixels. */
|
|
47
|
+
export interface ImageSize {
|
|
48
|
+
/** Width of the picture, in pixels. */
|
|
49
|
+
width: number;
|
|
50
|
+
/** Height of the picture, in pixels. */
|
|
51
|
+
height: number;
|
|
52
|
+
/**
|
|
53
|
+
* What each drawing unit was actually worth. Below the resolution that was
|
|
54
|
+
* asked for when it would have made a picture too big to rasterize.
|
|
55
|
+
*/
|
|
56
|
+
scale: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* How big a rectangle of the drawing comes out at a given resolution.
|
|
61
|
+
*
|
|
62
|
+
* The resolution is a wish rather than an instruction: a wide glycan asked for
|
|
63
|
+
* at 8× would run past what a browser can rasterize and come back blank, so the
|
|
64
|
+
* scale is brought down until the picture fits instead. The scale it settled on
|
|
65
|
+
* comes back with the size, so what will actually be written can be shown
|
|
66
|
+
* before it is.
|
|
67
|
+
* @param box - The rectangle being written out.
|
|
68
|
+
* @param box.width - How wide it is, in drawing units.
|
|
69
|
+
* @param box.height - How tall it is, in drawing units.
|
|
70
|
+
* @param scale - How many pixels each drawing unit should become.
|
|
71
|
+
* @returns The size, and the scale it was reached at.
|
|
72
|
+
*/
|
|
73
|
+
export function imageSize(
|
|
74
|
+
box: { width: number; height: number },
|
|
75
|
+
scale: number,
|
|
76
|
+
): ImageSize {
|
|
77
|
+
const wanted = Number.isFinite(scale) && scale > 0 ? scale : 1;
|
|
78
|
+
const width = Math.max(box.width, 1);
|
|
79
|
+
const height = Math.max(box.height, 1);
|
|
80
|
+
|
|
81
|
+
const limit = Math.min(
|
|
82
|
+
MAXIMUM_SIDE / width,
|
|
83
|
+
MAXIMUM_SIDE / height,
|
|
84
|
+
Math.sqrt(MAXIMUM_PIXELS / (width * height)),
|
|
85
|
+
);
|
|
86
|
+
const used = Math.min(wanted, limit);
|
|
87
|
+
// A picture held back by the limit is rounded down rather than to the nearest
|
|
88
|
+
// pixel, so rounding cannot put it back over what it was held to.
|
|
89
|
+
const toPixels = used < wanted ? Math.floor : Math.round;
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
width: Math.max(1, toPixels(width * used)),
|
|
93
|
+
height: Math.max(1, toPixels(height * used)),
|
|
94
|
+
scale: used,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The resolution an identifier stands for.
|
|
100
|
+
* @param id - What was picked.
|
|
101
|
+
* @returns The resolution, falling back to the default one.
|
|
102
|
+
*/
|
|
103
|
+
export function imageResolution(id: string): ImageResolution {
|
|
104
|
+
return (
|
|
105
|
+
IMAGE_RESOLUTIONS.find((resolution) => resolution.id === id) ??
|
|
106
|
+
DEFAULT_IMAGE_RESOLUTION
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* A size, written the way it is shown next to the resolution it comes from.
|
|
112
|
+
* @param size - The size to write, `null` when nothing is drawn.
|
|
113
|
+
* @returns The text, e.g. `1440 × 620 px`.
|
|
114
|
+
*/
|
|
115
|
+
export function formatImageSize(size: ImageSize | null): string {
|
|
116
|
+
if (!size) return 'nothing to export';
|
|
117
|
+
return `${size.width} × ${size.height} px`;
|
|
118
|
+
}
|
|
@@ -37,3 +37,37 @@ export {
|
|
|
37
37
|
figureSize,
|
|
38
38
|
} from './figureTarget.ts';
|
|
39
39
|
export { sanitizeFileName } from './sanitizeFileName.ts';
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
exportButtonsStyle,
|
|
43
|
+
exportNoteStyle,
|
|
44
|
+
exportSectionStyle,
|
|
45
|
+
} from './exportStyles.ts';
|
|
46
|
+
export type {
|
|
47
|
+
ImageResolution,
|
|
48
|
+
ImageResolutionId,
|
|
49
|
+
ImageSize,
|
|
50
|
+
} from './imageResolution.ts';
|
|
51
|
+
export {
|
|
52
|
+
DEFAULT_IMAGE_RESOLUTION,
|
|
53
|
+
IMAGE_RESOLUTIONS,
|
|
54
|
+
formatImageSize,
|
|
55
|
+
imageResolution,
|
|
56
|
+
imageSize,
|
|
57
|
+
} from './imageResolution.ts';
|
|
58
|
+
export type { PictureFrame, PictureOptions } from './pictureExport.ts';
|
|
59
|
+
export {
|
|
60
|
+
PICTURE_PADDING,
|
|
61
|
+
copyPicture,
|
|
62
|
+
pictureSize,
|
|
63
|
+
savePngPicture,
|
|
64
|
+
saveSvgPicture,
|
|
65
|
+
} from './pictureExport.ts';
|
|
66
|
+
export { drawingIn, stackDrawings } from './stackedDrawing.ts';
|
|
67
|
+
export type { SvgBox } from './svgBounds.ts';
|
|
68
|
+
export { CONTENT_ATTRIBUTE, contentBox, elementBox } from './svgBounds.ts';
|
|
69
|
+
export { SVG_NAMESPACE } from './svgNamespace.ts';
|
|
70
|
+
export type { PngOptions } from './svgToPng.ts';
|
|
71
|
+
export { svgToPng } from './svgToPng.ts';
|
|
72
|
+
export type { SvgDocumentOptions } from './svgToString.ts';
|
|
73
|
+
export { svgToString } from './svgToString.ts';
|