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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawing only the rows the page is showing, for a list that scrolls with it.
|
|
3
|
+
*
|
|
4
|
+
* `useVirtualRows` measures a scroll region of its own, which is what a panel
|
|
5
|
+
* beside a chart has. A table filling a tab has none: it flows down the document
|
|
6
|
+
* and the browser window is what scrolls it, so giving the list its own
|
|
7
|
+
* `overflow` would grow a second scrollbar inside the first and cap the table at
|
|
8
|
+
* whatever height it was handed — a layout change made to serve the virtualiser
|
|
9
|
+
* rather than the reader.
|
|
10
|
+
*/
|
|
11
|
+
import type { VirtualRows } from './useVirtualRows.ts';
|
|
12
|
+
/** The rows to draw, and what the list reports its own position through. */
|
|
13
|
+
export interface VirtualWindowRows extends VirtualRows {
|
|
14
|
+
/**
|
|
15
|
+
* What the element holding the rows reports its position through, as its
|
|
16
|
+
* `ref`. Without it every offset is reckoned from the top of the document and
|
|
17
|
+
* the wrong rows are drawn, by however tall whatever sits above the list is.
|
|
18
|
+
*/
|
|
19
|
+
measureList: (node: HTMLElement | null) => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Draw only the rows the page is showing, however long the list is.
|
|
23
|
+
*
|
|
24
|
+
* The rows are measured against the window, so the list only has to say how far
|
|
25
|
+
* down the page it begins — which is what the virtualiser calls its scroll
|
|
26
|
+
* margin, and what `measureList` reports.
|
|
27
|
+
*
|
|
28
|
+
* That position is read in a ref callback rather than in an effect, which is
|
|
29
|
+
* how `useChartSize` reads a box for the same reason: the node is the only
|
|
30
|
+
* thing the measurement needs, so it is taken the moment React has one and
|
|
31
|
+
* taken again whenever it hands over another. A filter that cuts a thousand
|
|
32
|
+
* rows to fifty changes how tall the list is and not where it starts, so there
|
|
33
|
+
* is nothing to remeasure when the count moves.
|
|
34
|
+
* @param count - How many rows the list holds.
|
|
35
|
+
* @param estimatedRowHeight - What one row is worth until one has been drawn.
|
|
36
|
+
* @returns The rows to draw, the spacers standing in for the others, and the
|
|
37
|
+
* ref the list reports its position through.
|
|
38
|
+
*/
|
|
39
|
+
export declare function useVirtualWindowRows(count: number, estimatedRowHeight: number): VirtualWindowRows;
|
|
40
|
+
//# sourceMappingURL=useVirtualWindowRows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVirtualWindowRows.d.ts","sourceRoot":"","sources":["../../../src/panel/ui/useVirtualWindowRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,4EAA4E;AAC5E,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD;;;;OAIG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,MAAM,GACzB,iBAAiB,CA2BnB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawing only the rows the page is showing, for a list that scrolls with it.
|
|
3
|
+
*
|
|
4
|
+
* `useVirtualRows` measures a scroll region of its own, which is what a panel
|
|
5
|
+
* beside a chart has. A table filling a tab has none: it flows down the document
|
|
6
|
+
* and the browser window is what scrolls it, so giving the list its own
|
|
7
|
+
* `overflow` would grow a second scrollbar inside the first and cap the table at
|
|
8
|
+
* whatever height it was handed — a layout change made to serve the virtualiser
|
|
9
|
+
* rather than the reader.
|
|
10
|
+
*/
|
|
11
|
+
import { useWindowVirtualizer } from '@tanstack/react-virtual';
|
|
12
|
+
import { useCallback, useState } from 'react';
|
|
13
|
+
import { rowSpacers } from "../core/rowSpacers.js";
|
|
14
|
+
/**
|
|
15
|
+
* Draw only the rows the page is showing, however long the list is.
|
|
16
|
+
*
|
|
17
|
+
* The rows are measured against the window, so the list only has to say how far
|
|
18
|
+
* down the page it begins — which is what the virtualiser calls its scroll
|
|
19
|
+
* margin, and what `measureList` reports.
|
|
20
|
+
*
|
|
21
|
+
* That position is read in a ref callback rather than in an effect, which is
|
|
22
|
+
* how `useChartSize` reads a box for the same reason: the node is the only
|
|
23
|
+
* thing the measurement needs, so it is taken the moment React has one and
|
|
24
|
+
* taken again whenever it hands over another. A filter that cuts a thousand
|
|
25
|
+
* rows to fifty changes how tall the list is and not where it starts, so there
|
|
26
|
+
* is nothing to remeasure when the count moves.
|
|
27
|
+
* @param count - How many rows the list holds.
|
|
28
|
+
* @param estimatedRowHeight - What one row is worth until one has been drawn.
|
|
29
|
+
* @returns The rows to draw, the spacers standing in for the others, and the
|
|
30
|
+
* ref the list reports its position through.
|
|
31
|
+
*/
|
|
32
|
+
export function useVirtualWindowRows(count, estimatedRowHeight) {
|
|
33
|
+
const [scrollMargin, setScrollMargin] = useState(0);
|
|
34
|
+
const measureList = useCallback((node) => {
|
|
35
|
+
if (node === null)
|
|
36
|
+
return;
|
|
37
|
+
setScrollMargin(node.getBoundingClientRect().top + window.scrollY);
|
|
38
|
+
}, []);
|
|
39
|
+
const virtualizer = useWindowVirtualizer({
|
|
40
|
+
count,
|
|
41
|
+
estimateSize: () => estimatedRowHeight,
|
|
42
|
+
overscan: OVERSCAN,
|
|
43
|
+
scrollMargin,
|
|
44
|
+
});
|
|
45
|
+
const drawn = virtualizer.getVirtualItems();
|
|
46
|
+
const indices = new Array(drawn.length);
|
|
47
|
+
for (let position = 0; position < drawn.length; position++) {
|
|
48
|
+
indices[position] = drawn[position].index;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
indices,
|
|
52
|
+
...rowSpacers(drawn, virtualizer.getTotalSize()),
|
|
53
|
+
measure: virtualizer.measureElement,
|
|
54
|
+
measureList,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* How many rows are drawn beyond each end of the window.
|
|
59
|
+
*
|
|
60
|
+
* The same reasoning as `useVirtualRows`, and the same number: enough that a
|
|
61
|
+
* wheel gesture never reaches the edge of what was drawn before the next render
|
|
62
|
+
* has run.
|
|
63
|
+
*/
|
|
64
|
+
const OVERSCAN = 12;
|
|
65
|
+
//# sourceMappingURL=useVirtualWindowRows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVirtualWindowRows.js","sourceRoot":"","sources":["../../../src/panel/ui/useVirtualWindowRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAcnD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,kBAA0B;IAE1B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,IAAwB,EAAE,EAAE;QAC3D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,eAAe,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACvC,KAAK;QACL,YAAY,EAAE,GAAG,EAAE,CAAC,kBAAkB;QACtC,QAAQ,EAAE,QAAQ;QAClB,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC3D,OAAO,CAAC,QAAQ,CAAC,GAAI,KAAK,CAAC,QAAQ,CAAuB,CAAC,KAAK,CAAC;IACnE,CAAC;IAED,OAAO;QACL,OAAO;QACP,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,EAAE,WAAW,CAAC,cAAc;QACnC,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,QAAQ,GAAG,EAAE,CAAC"}
|
package/lib/ui.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from './hooks/ui/index.ts';
|
|
|
17
17
|
export * from './i18n/ui/index.ts';
|
|
18
18
|
export * from './language/ui/index.ts';
|
|
19
19
|
export * from './overlay/ui/index.ts';
|
|
20
|
+
export * from './panel/ui/index.ts';
|
|
20
21
|
export * from './parallel/ui/index.ts';
|
|
21
22
|
export * from './pedagogy/ui/index.ts';
|
|
22
23
|
export * from './periodic/ui/index.ts';
|
package/lib/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
package/lib/ui.js
CHANGED
|
@@ -17,6 +17,7 @@ export * from "./hooks/ui/index.js";
|
|
|
17
17
|
export * from "./i18n/ui/index.js";
|
|
18
18
|
export * from "./language/ui/index.js";
|
|
19
19
|
export * from "./overlay/ui/index.js";
|
|
20
|
+
export * from "./panel/ui/index.js";
|
|
20
21
|
export * from "./parallel/ui/index.js";
|
|
21
22
|
export * from "./pedagogy/ui/index.js";
|
|
22
23
|
export * from "./periodic/ui/index.js";
|
package/lib/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-cheminfo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "React components, hooks and framework-free helpers shared by the cheminfo sites: site chrome, citations, sharing, routing, pedagogy, charts, and the structure, orbital and 3D molecule viewers",
|
|
6
6
|
"author": "Luc Patiny",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"./build-info": "./lib/build-info.js",
|
|
19
19
|
"./conformers": "./lib/conformers.js",
|
|
20
20
|
"./core": "./lib/core.js",
|
|
21
|
+
"./ir": "./lib/ir.js",
|
|
21
22
|
"./molecule3d": "./lib/molecule3d.js",
|
|
22
23
|
"./orbital": "./lib/orbital.js",
|
|
23
24
|
"./slides": "./lib/slides.js",
|
|
@@ -61,9 +62,14 @@
|
|
|
61
62
|
},
|
|
62
63
|
"dependencies": {
|
|
63
64
|
"@formatjs/icu-messageformat-parser": "^3.5.20",
|
|
65
|
+
"@tanstack/react-virtual": "^3.14.13",
|
|
64
66
|
"cheminfo-font": "^1.28.0",
|
|
67
|
+
"cheminfo-types": "^1.16.0",
|
|
68
|
+
"convert-to-jcamp": "^7.0.1",
|
|
65
69
|
"intl-messageformat": "^11.2.15",
|
|
70
|
+
"ir-spectrum": "^4.2.0",
|
|
66
71
|
"leven": "^4.1.0",
|
|
72
|
+
"ml-spectra-processing": "^14.35.1",
|
|
67
73
|
"openchemlib": "^9.25.0",
|
|
68
74
|
"react-markdown": "^10.1.0",
|
|
69
75
|
"rehype-raw": "^7.0.0",
|
|
@@ -85,6 +91,7 @@
|
|
|
85
91
|
"eslint": "^9.39.5",
|
|
86
92
|
"eslint-config-cheminfo-react": "^20.1.0",
|
|
87
93
|
"eslint-config-cheminfo-typescript": "^22.1.0",
|
|
94
|
+
"jsdom": "^30.1.1",
|
|
88
95
|
"ml-dataset-iris": "^1.2.1",
|
|
89
96
|
"ml-pca": "^4.1.1",
|
|
90
97
|
"ml-signal-processing": "^2.2.2",
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a number is written wherever a chart writes one.
|
|
3
|
+
*
|
|
4
|
+
* The axis decides, not the number: the precision comes from the tick step, and
|
|
5
|
+
* the notation from the largest tick, so every label on one axis is written the
|
|
6
|
+
* same way and a reader can run an eye down a column of them. `chartAxisScale`
|
|
7
|
+
* works both out; this is where they turn into text.
|
|
8
|
+
*
|
|
9
|
+
* It is a second way of writing the labels `chartAxisScale` already carries,
|
|
10
|
+
* and it exists because the two answer different questions. A figure lifts a
|
|
11
|
+
* common power of ten into its axis title and writes short labels under it — a
|
|
12
|
+
* chart whose axis title is fixed by the measurement cannot, so a spectrum
|
|
13
|
+
* writes the magnitude into each label instead.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { ChartAxisScale } from './chartAxisScale.ts';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Write a number the way an axis label or a readout wants it.
|
|
20
|
+
*
|
|
21
|
+
* The decimals come from the axis, so every label on it is written to the same
|
|
22
|
+
* precision — but a tick that happens to land on a round number then reads
|
|
23
|
+
* `500.0000` where `500` was meant, and half its width is zeros carrying
|
|
24
|
+
* nothing. They are trimmed off the end only, never out of the middle, so
|
|
25
|
+
* `500.0002` keeps every digit it needs.
|
|
26
|
+
*
|
|
27
|
+
* `toFixed` also writes `-0` for anything that rounds to zero from below, which
|
|
28
|
+
* is never what an axis means and is jarring on the one tick a chemist looks at
|
|
29
|
+
* most.
|
|
30
|
+
* @param value - The number to write.
|
|
31
|
+
* @param decimals - How many decimals to write it to, as `niceTicks` derived.
|
|
32
|
+
* @returns The label.
|
|
33
|
+
*/
|
|
34
|
+
export function formatNumber(value: number, decimals: number): string {
|
|
35
|
+
const text = value.toFixed(Math.min(20, Math.max(0, Math.floor(decimals))));
|
|
36
|
+
const trimmed = text.includes('.') ? text.replace(/\.?0+$/, '') : text;
|
|
37
|
+
return trimmed === '-0' ? '0' : trimmed;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The magnitude above which a number is quicker read as a power of ten.
|
|
42
|
+
*
|
|
43
|
+
* An ion count is quoted in whatever the instrument counted in, so an intensity
|
|
44
|
+
* axis written out in full reads `200000000` — nine digits a reader has to group
|
|
45
|
+
* into threes before knowing which power of ten they are looking at, and wide
|
|
46
|
+
* enough to run into the axis title printed beside them. Above this the same
|
|
47
|
+
* tick is written `2e+8`, which says the magnitude first and in four characters.
|
|
48
|
+
*
|
|
49
|
+
* A hundred thousand rather than a million because that is where a number stops
|
|
50
|
+
* being read at a glance, and because it is the threshold every intensity in the
|
|
51
|
+
* mass side is already written against — a colourbar and an axis that disagreed
|
|
52
|
+
* about how one count is spelled would read as two measurements.
|
|
53
|
+
*/
|
|
54
|
+
export const SCIENTIFIC_ABOVE = 1e5;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The magnitude below which the digits that mean anything are all behind zeros.
|
|
58
|
+
*
|
|
59
|
+
* The mirror of `SCIENTIFIC_ABOVE`: `0.00002` is four characters of nothing
|
|
60
|
+
* followed by the one digit that was measured.
|
|
61
|
+
*/
|
|
62
|
+
export const SCIENTIFIC_BELOW = 1e-4;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Write a number as a mantissa and a power of ten.
|
|
66
|
+
*
|
|
67
|
+
* With no precision asked for, the mantissa keeps only the digits it needs — a
|
|
68
|
+
* tick at a hundred and fifty million is `1.5e+8` and the one above it `2e+8`,
|
|
69
|
+
* rather than both being padded to the same width with zeros that say nothing.
|
|
70
|
+
* The value is rounded to a few significant digits first, because a tick is
|
|
71
|
+
* reached by multiplying a step by an index and `3 * 0.1` is `0.30000000000000004`
|
|
72
|
+
* — which the shortest form would write out in full, every digit of it noise.
|
|
73
|
+
* @param value - The number to write.
|
|
74
|
+
* @param digits - How many decimals the mantissa carries. Left out, it carries
|
|
75
|
+
* as few as tell this number from its neighbours.
|
|
76
|
+
* @returns The number in scientific notation, or `0` for zero, which has no
|
|
77
|
+
* exponent and is written the same way on any axis.
|
|
78
|
+
*/
|
|
79
|
+
export function formatScientific(value: number, digits?: number): string {
|
|
80
|
+
if (value === 0) return '0';
|
|
81
|
+
if (digits === undefined) {
|
|
82
|
+
return Number(value.toPrecision(SCIENTIFIC_DIGITS)).toExponential();
|
|
83
|
+
}
|
|
84
|
+
return value.toExponential(Math.min(100, Math.max(0, Math.floor(digits))));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* How one axis writes every one of its labels.
|
|
89
|
+
*
|
|
90
|
+
* The notation is chosen once, from the largest tick on the axis, and then used
|
|
91
|
+
* for all of them — including the small ones and the zero. An axis is read by
|
|
92
|
+
* running an eye along it, and one whose labels changed notation partway would
|
|
93
|
+
* have to be read a label at a time instead.
|
|
94
|
+
* @param axis - The axis, as `chartAxisScale` divided it.
|
|
95
|
+
* @returns A writer for every label on that axis.
|
|
96
|
+
*/
|
|
97
|
+
export function axisLabeller(axis: ChartAxisScale): (value: number) => string {
|
|
98
|
+
const { values, decimals } = axis;
|
|
99
|
+
let largest = 0;
|
|
100
|
+
for (const tick of values) {
|
|
101
|
+
const magnitude = Math.abs(tick);
|
|
102
|
+
if (magnitude > largest) largest = magnitude;
|
|
103
|
+
}
|
|
104
|
+
const scientific =
|
|
105
|
+
largest >= SCIENTIFIC_ABOVE || (largest > 0 && largest < SCIENTIFIC_BELOW);
|
|
106
|
+
return scientific
|
|
107
|
+
? (value) => formatScientific(value)
|
|
108
|
+
: (value) => formatNumber(value, decimals);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* How many significant digits survive the rounding that sheds floating noise.
|
|
113
|
+
*
|
|
114
|
+
* A tick is 1, 2 or 5 times a power of ten times an index, so two digits carry
|
|
115
|
+
* every one of them and six is room to spare for a readout written this way.
|
|
116
|
+
*/
|
|
117
|
+
const SCIENTIFIC_DIGITS = 6;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeping the labels above the peaks apart from one another.
|
|
3
|
+
*
|
|
4
|
+
* An annotated spectrum wants a box over every peak it explains, and an
|
|
5
|
+
* isotopologue cluster puts four of them within a few pixels. Sliding them
|
|
6
|
+
* apart is most of the job, and the leader line back to the stick is what says
|
|
7
|
+
* which peak a box belongs to — so a box a little out of place is still
|
|
8
|
+
* readable.
|
|
9
|
+
*
|
|
10
|
+
* A box slid *far* out of place is not. Spacing a crowd out marches the last of
|
|
11
|
+
* them across the whole plot, where it comes to rest over peaks it says nothing
|
|
12
|
+
* about, with a leader long enough to be read as pointing at one of them. Those
|
|
13
|
+
* are dropped, and only those: a mark still sits on every annotated peak, so
|
|
14
|
+
* the fragment is not one the chemist concludes the spectrum lacks — it is one
|
|
15
|
+
* whose picture is a zoom away.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { NumberArray } from 'cheminfo-types';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Slide overlapping boxes apart, keeping every one of them inside the plot.
|
|
22
|
+
*
|
|
23
|
+
* Two sweeps, and the order of the clamps is the whole behaviour. The first
|
|
24
|
+
* sweep runs left to right and pushes each box far enough past its neighbour to
|
|
25
|
+
* clear it, which piles the crowding up against the right edge; the second runs
|
|
26
|
+
* back the other way, pulling that pile inside the right bound and spacing it
|
|
27
|
+
* out leftwards again.
|
|
28
|
+
*
|
|
29
|
+
* The left bound is then applied last, after the spacing, and so beats it. A
|
|
30
|
+
* cluster too wide for the room it is in therefore ends with its leftmost boxes
|
|
31
|
+
* overlapping rather than with one of them hanging off the plot — an overlap is
|
|
32
|
+
* two labels a reader can still pick apart with the leader lines, while a box
|
|
33
|
+
* outside the plot is clipped away and reads as an annotation that was never
|
|
34
|
+
* made.
|
|
35
|
+
* @param centres - Where each box would like to be centred, in pixels; any
|
|
36
|
+
* order, and the result comes back in that same order.
|
|
37
|
+
* @param bounds - `[from, to]` in pixels that no box may extend beyond.
|
|
38
|
+
* @param width - How wide every box is.
|
|
39
|
+
* @param gap - The clear space wanted between two neighbouring boxes.
|
|
40
|
+
* @param maximumDrift - How far a box may be slid from where it wanted to be
|
|
41
|
+
* before it is dropped instead, in pixels. Defaults to two whole box steps.
|
|
42
|
+
* @returns The centre each box was actually given, `NaN` for one that was slid
|
|
43
|
+
* too far and dropped.
|
|
44
|
+
*/
|
|
45
|
+
export function layoutAnnotationBoxes(
|
|
46
|
+
centres: NumberArray,
|
|
47
|
+
bounds: readonly [number, number],
|
|
48
|
+
width: number,
|
|
49
|
+
gap: number,
|
|
50
|
+
maximumDrift = (width + gap) * MAXIMUM_DRIFT_STEPS,
|
|
51
|
+
): Float64Array {
|
|
52
|
+
const count = centres.length;
|
|
53
|
+
const placed = new Float64Array(count);
|
|
54
|
+
if (count === 0) return placed;
|
|
55
|
+
|
|
56
|
+
const half = width / 2;
|
|
57
|
+
const minimumCentre = bounds[0] + half;
|
|
58
|
+
const maximumCentre = bounds[1] - half;
|
|
59
|
+
const step = width + gap;
|
|
60
|
+
const order = ascendingOrder(centres);
|
|
61
|
+
|
|
62
|
+
let previous = Number.NEGATIVE_INFINITY;
|
|
63
|
+
for (let position = 0; position < count; position++) {
|
|
64
|
+
const index = order[position] as number;
|
|
65
|
+
let centre = Math.min(
|
|
66
|
+
Math.max(centres[index] as number, minimumCentre),
|
|
67
|
+
maximumCentre,
|
|
68
|
+
);
|
|
69
|
+
if (centre < previous + step) centre = previous + step;
|
|
70
|
+
placed[index] = centre;
|
|
71
|
+
previous = centre;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let next = Number.POSITIVE_INFINITY;
|
|
75
|
+
for (let position = count - 1; position >= 0; position--) {
|
|
76
|
+
const index = order[position] as number;
|
|
77
|
+
let centre = placed[index] as number;
|
|
78
|
+
if (centre > maximumCentre) centre = maximumCentre;
|
|
79
|
+
if (centre > next - step) centre = next - step;
|
|
80
|
+
if (centre < minimumCentre) centre = minimumCentre;
|
|
81
|
+
placed[index] = centre;
|
|
82
|
+
next = centre;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// A picture that has been slid too far from the peak it explains is worse
|
|
86
|
+
// than no picture: it hangs over a peak it says nothing about, and the leader
|
|
87
|
+
// back to its own is long enough to be read as pointing at something else.
|
|
88
|
+
// Those are dropped rather than drawn, and the mark on the peak still says
|
|
89
|
+
// the annotation is there.
|
|
90
|
+
for (let index = 0; index < count; index++) {
|
|
91
|
+
const wanted = centres[index] as number;
|
|
92
|
+
if (Math.abs((placed[index] as number) - wanted) > maximumDrift) {
|
|
93
|
+
placed[index] = Number.NaN;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return placed;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* How far a picture may be slid from its peak, counted in whole box steps.
|
|
101
|
+
*
|
|
102
|
+
* Two: a box may be pushed past two neighbours and still be read as belonging
|
|
103
|
+
* to the peak under it, which is what a cluster of three peaks needs. Past that
|
|
104
|
+
* the leader is longer than the box is wide and reaches across other peaks, so
|
|
105
|
+
* the picture reads as answering for one of them instead.
|
|
106
|
+
*/
|
|
107
|
+
export const MAXIMUM_DRIFT_STEPS = 2;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The indices of the boxes, ordered by where they want to be.
|
|
111
|
+
*
|
|
112
|
+
* The sweeps only make sense left to right, and the caller's order is whatever
|
|
113
|
+
* the annotations came in — usually by mass, but a second producer's marks are
|
|
114
|
+
* appended rather than merged.
|
|
115
|
+
* @param centres - Where each box would like to be centred.
|
|
116
|
+
* @returns The indices, ascending by centre.
|
|
117
|
+
*/
|
|
118
|
+
function ascendingOrder(centres: NumberArray): Uint32Array {
|
|
119
|
+
const order = new Uint32Array(centres.length);
|
|
120
|
+
for (let index = 0; index < centres.length; index++) {
|
|
121
|
+
order[index] = index;
|
|
122
|
+
}
|
|
123
|
+
return order.toSorted(
|
|
124
|
+
(first, second) => (centres[first] as number) - (centres[second] as number),
|
|
125
|
+
);
|
|
126
|
+
}
|
|
@@ -12,6 +12,15 @@ const COMFORTABLE_LABEL = 6;
|
|
|
12
12
|
const STEP_10 = Math.sqrt(50);
|
|
13
13
|
const STEP_5 = Math.sqrt(10);
|
|
14
14
|
const STEP_2 = Math.SQRT2;
|
|
15
|
+
/**
|
|
16
|
+
* How far a fraction may sit above 1, 2 or 5 and still count as being on it.
|
|
17
|
+
*
|
|
18
|
+
* `span / count` is computed in floating point, so a window that ought to give
|
|
19
|
+
* a step of exactly one lands a hair above it — `1.0000000000000002` — and an
|
|
20
|
+
* exact comparison would take the next step up and halve the number of ticks
|
|
21
|
+
* for no visible reason.
|
|
22
|
+
*/
|
|
23
|
+
const STEP_EPSILON = 1e-9;
|
|
15
24
|
|
|
16
25
|
/** A niced axis: its domain, its ticks, and the labels they are written with. */
|
|
17
26
|
export interface ChartAxisScale {
|
|
@@ -29,6 +38,22 @@ export interface ChartAxisScale {
|
|
|
29
38
|
readonly labels: readonly string[];
|
|
30
39
|
}
|
|
31
40
|
|
|
41
|
+
/**
|
|
42
|
+
* How the step is chosen when an even division lands between two nice ones.
|
|
43
|
+
*
|
|
44
|
+
* - `nearest` — take whichever of 1, 2 or 5 the division is closest to, which
|
|
45
|
+
* puts the tick count near what was asked for from either side.
|
|
46
|
+
* - `atMost` — always take the larger, so the count asked for is a budget the
|
|
47
|
+
* axis never exceeds.
|
|
48
|
+
*
|
|
49
|
+
* The difference is not cosmetic. A figure asking for about five ticks wants
|
|
50
|
+
* them spaced as evenly as the numbers allow, and one either way costs it
|
|
51
|
+
* nothing. An axis in a two-hundred-pixel panel has worked its count out from
|
|
52
|
+
* the room it has and the width of a label, so one tick more than it asked for
|
|
53
|
+
* is two labels touching.
|
|
54
|
+
*/
|
|
55
|
+
export type ChartAxisStep = 'nearest' | 'atMost';
|
|
56
|
+
|
|
32
57
|
/** How an axis is divided. */
|
|
33
58
|
export interface ChartAxisScaleOptions {
|
|
34
59
|
/**
|
|
@@ -39,10 +64,15 @@ export interface ChartAxisScaleOptions {
|
|
|
39
64
|
/**
|
|
40
65
|
* Whether to widen the domain outward to whole steps, so the axis ends on a
|
|
41
66
|
* labelled tick. Turn it off when the domain is already exact — a share that
|
|
42
|
-
* must end at 100
|
|
67
|
+
* must end at 100%, or a window a reader dragged out for themselves.
|
|
43
68
|
* @default true
|
|
44
69
|
*/
|
|
45
70
|
nice?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* How the step is chosen. See {@link ChartAxisStep}.
|
|
73
|
+
* @default 'nearest'
|
|
74
|
+
*/
|
|
75
|
+
step?: ChartAxisStep;
|
|
46
76
|
}
|
|
47
77
|
|
|
48
78
|
/**
|
|
@@ -68,11 +98,34 @@ export function chartAxisScale(
|
|
|
68
98
|
max: number,
|
|
69
99
|
options: ChartAxisScaleOptions = {},
|
|
70
100
|
): ChartAxisScale {
|
|
71
|
-
const { count = DEFAULT_COUNT, nice = true } = options;
|
|
101
|
+
const { count = DEFAULT_COUNT, nice = true, step: rounding } = options;
|
|
72
102
|
const wanted = tickCount(count);
|
|
103
|
+
// A window of one point is not a window: there is no step to read a
|
|
104
|
+
// precision off, so the single label is written at the precision its own
|
|
105
|
+
// magnitude asks for. Only when the domain is taken as given — a domain that
|
|
106
|
+
// is to be niced is opened instead, so that a constant column still draws an
|
|
107
|
+
// axis to stand on.
|
|
108
|
+
if (!nice && min === max && Number.isFinite(min)) {
|
|
109
|
+
const decimals = chartTickDecimals(Math.abs(min));
|
|
110
|
+
return {
|
|
111
|
+
domain: [min, min],
|
|
112
|
+
values: [min],
|
|
113
|
+
step: 0,
|
|
114
|
+
decimals,
|
|
115
|
+
exponent: 0,
|
|
116
|
+
labels: [chartTickLabel(min, decimals)],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
73
119
|
const opened = openDomain(min, max);
|
|
74
|
-
const domain = nice
|
|
75
|
-
|
|
120
|
+
const domain = nice
|
|
121
|
+
? chartNiceDomain(opened[0], opened[1], wanted, rounding)
|
|
122
|
+
: opened;
|
|
123
|
+
const [first, last, increment] = tickSpec(
|
|
124
|
+
domain[0],
|
|
125
|
+
domain[1],
|
|
126
|
+
wanted,
|
|
127
|
+
rounding,
|
|
128
|
+
);
|
|
76
129
|
const spacing = increment < 0 ? -1 / increment : increment;
|
|
77
130
|
const step = Number.isFinite(spacing) && spacing > 0 ? spacing : 0;
|
|
78
131
|
const values = step === 0 ? [] : tickValues(first, last, increment);
|
|
@@ -93,18 +146,20 @@ export function chartAxisScale(
|
|
|
93
146
|
* @param min - One end, in either order.
|
|
94
147
|
* @param max - The other end.
|
|
95
148
|
* @param count - Roughly how many ticks the domain will carry. Defaults to `5`.
|
|
149
|
+
* @param rounding - How the step is chosen. See {@link ChartAxisStep}.
|
|
96
150
|
* @returns The widened domain, ascending.
|
|
97
151
|
*/
|
|
98
152
|
export function chartNiceDomain(
|
|
99
153
|
min: number,
|
|
100
154
|
max: number,
|
|
101
155
|
count = DEFAULT_COUNT,
|
|
156
|
+
rounding: ChartAxisStep = 'nearest',
|
|
102
157
|
): [number, number] {
|
|
103
158
|
const wanted = tickCount(count);
|
|
104
159
|
let [start, stop] = openDomain(min, max);
|
|
105
160
|
let previous = 0;
|
|
106
161
|
for (let pass = 0; pass < NICE_PASSES; pass++) {
|
|
107
|
-
const [, , increment] = tickSpec(start, stop, wanted);
|
|
162
|
+
const [, , increment] = tickSpec(start, stop, wanted, rounding);
|
|
108
163
|
if (increment === previous || !Number.isFinite(increment)) break;
|
|
109
164
|
const low = wholeStep(start, increment, true);
|
|
110
165
|
const high = wholeStep(stop, increment, false);
|
|
@@ -163,14 +218,41 @@ export function chartExponentSuffix(exponent: number): string {
|
|
|
163
218
|
|
|
164
219
|
type TickSpec = [first: number, last: number, increment: number];
|
|
165
220
|
|
|
166
|
-
|
|
221
|
+
/**
|
|
222
|
+
* The nice factor a division is closest to.
|
|
223
|
+
* @param error - The division's mantissa, between 1 and 10.
|
|
224
|
+
* @returns 1, 2, 5 or 10.
|
|
225
|
+
*/
|
|
226
|
+
function stepNearest(error: number): number {
|
|
227
|
+
if (error >= STEP_10) return 10;
|
|
228
|
+
if (error >= STEP_5) return 5;
|
|
229
|
+
if (error >= STEP_2) return 2;
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The smallest nice factor at or above a division, so the ticks are never
|
|
235
|
+
* closer together than asked for.
|
|
236
|
+
* @param error - The division's mantissa, between 1 and 10.
|
|
237
|
+
* @returns 1, 2, 5 or 10.
|
|
238
|
+
*/
|
|
239
|
+
function stepAtMost(error: number): number {
|
|
240
|
+
if (error <= 1 + STEP_EPSILON) return 1;
|
|
241
|
+
if (error <= 2 + STEP_EPSILON) return 2;
|
|
242
|
+
if (error <= 5 + STEP_EPSILON) return 5;
|
|
243
|
+
return 10;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function tickSpec(
|
|
247
|
+
start: number,
|
|
248
|
+
stop: number,
|
|
249
|
+
count: number,
|
|
250
|
+
rounding: ChartAxisStep = 'nearest',
|
|
251
|
+
): TickSpec {
|
|
167
252
|
const rawStep = (stop - start) / count;
|
|
168
253
|
const power = Math.floor(Math.log10(rawStep));
|
|
169
254
|
const error = rawStep / 10 ** power;
|
|
170
|
-
|
|
171
|
-
if (error >= STEP_2) factor = 2;
|
|
172
|
-
if (error >= STEP_5) factor = 5;
|
|
173
|
-
if (error >= STEP_10) factor = 10;
|
|
255
|
+
const factor = rounding === 'atMost' ? stepAtMost(error) : stepNearest(error);
|
|
174
256
|
if (power < 0) {
|
|
175
257
|
const divisor = 10 ** -power / factor;
|
|
176
258
|
let first = Math.round(start * divisor);
|