matterviz 0.4.0 → 0.4.2
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/dist/EmptyState.svelte +10 -4
- package/dist/FilePicker.svelte +12 -14
- package/dist/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +2 -2
- package/dist/app.css +53 -0
- package/dist/brillouin/BrillouinZone.svelte +132 -219
- package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
- package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
- package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
- package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
- package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
- package/dist/brillouin/ReciprocalVectors.svelte +39 -0
- package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
- package/dist/brillouin/compute.d.ts +2 -0
- package/dist/brillouin/compute.js +80 -77
- package/dist/brillouin/geometry.d.ts +8 -0
- package/dist/brillouin/geometry.js +57 -0
- package/dist/brillouin/index.d.ts +2 -0
- package/dist/brillouin/index.js +2 -0
- package/dist/brillouin/types.d.ts +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
- package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
- package/dist/chempot-diagram/async-compute.svelte.js +1 -1
- package/dist/chempot-diagram/color.d.ts +3 -6
- package/dist/chempot-diagram/color.js +5 -5
- package/dist/chempot-diagram/compute.d.ts +3 -3
- package/dist/chempot-diagram/compute.js +3 -1
- package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
- package/dist/chempot-diagram/controls-state.svelte.js +42 -0
- package/dist/chempot-diagram/export.d.ts +47 -0
- package/dist/chempot-diagram/export.js +133 -0
- package/dist/chempot-diagram/index.d.ts +1 -0
- package/dist/chempot-diagram/index.js +1 -0
- package/dist/chempot-diagram/pointer.d.ts +0 -10
- package/dist/chempot-diagram/pointer.js +4 -4
- package/dist/chempot-diagram/types.d.ts +3 -3
- package/dist/colors/index.d.ts +0 -4
- package/dist/colors/index.js +21 -22
- package/dist/composition/BarChart.svelte +37 -31
- package/dist/composition/BubbleChart.svelte +17 -17
- package/dist/composition/Composition.svelte +7 -11
- package/dist/composition/Formula.svelte +18 -25
- package/dist/composition/FormulaFilter.svelte +96 -98
- package/dist/composition/PieChart.svelte +60 -46
- package/dist/composition/chem-sys.js +3 -2
- package/dist/composition/format.js +4 -3
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +2 -3
- package/dist/composition/parse.js +27 -28
- package/dist/constants.js +11 -9
- package/dist/controls.d.ts +1 -0
- package/dist/controls.js +0 -1
- package/dist/convex-hull/ConvexHull.svelte +20 -25
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
- package/dist/convex-hull/ConvexHull2D.svelte +176 -256
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +269 -804
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +236 -755
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
- package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
- package/dist/convex-hull/ConvexHullControls.svelte +128 -49
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
- package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
- package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
- package/dist/convex-hull/ConvexHullStats.svelte +210 -351
- package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
- package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
- package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
- package/dist/convex-hull/GasPressureControls.svelte +5 -12
- package/dist/convex-hull/StructurePopup.svelte +17 -21
- package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
- package/dist/convex-hull/TemperatureSlider.svelte +4 -10
- package/dist/convex-hull/barycentric-coords.d.ts +2 -4
- package/dist/convex-hull/barycentric-coords.js +6 -33
- package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
- package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
- package/dist/convex-hull/helpers.d.ts +47 -17
- package/dist/convex-hull/helpers.js +186 -101
- package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
- package/dist/convex-hull/hull-state.svelte.js +124 -0
- package/dist/convex-hull/index.d.ts +9 -7
- package/dist/convex-hull/index.js +7 -2
- package/dist/convex-hull/thermodynamics.js +109 -937
- package/dist/convex-hull/types.d.ts +12 -4
- package/dist/convex-hull/types.js +12 -0
- package/dist/coordination/CoordinationBarPlot.svelte +41 -43
- package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
- package/dist/coordination/calc-coordination.d.ts +1 -1
- package/dist/coordination/calc-coordination.js +28 -25
- package/dist/element/BohrAtom.svelte +6 -8
- package/dist/element/ElementHeading.svelte +4 -1
- package/dist/element/ElementPhoto.svelte +11 -9
- package/dist/element/ElementStats.svelte +12 -10
- package/dist/element/ElementTile.svelte +24 -29
- package/dist/element/ElementTile.svelte.d.ts +1 -1
- package/dist/element/Nucleus.svelte +4 -2
- package/dist/element/data.d.ts +1 -2
- package/dist/element/helpers.d.ts +4 -0
- package/dist/element/helpers.js +18 -0
- package/dist/element/index.d.ts +1 -0
- package/dist/element/index.js +3 -0
- package/dist/feedback/DragOverlay.svelte +5 -3
- package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
- package/dist/feedback/StatusMessage.svelte +20 -7
- package/dist/fermi-surface/FermiSlice.svelte +21 -18
- package/dist/fermi-surface/FermiSurface.svelte +78 -165
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
- package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
- package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
- package/dist/fermi-surface/compute.js +14 -13
- package/dist/fermi-surface/export.js +4 -15
- package/dist/fermi-surface/index.d.ts +0 -1
- package/dist/fermi-surface/index.js +0 -1
- package/dist/fermi-surface/parse.d.ts +1 -1
- package/dist/fermi-surface/parse.js +84 -97
- package/dist/fermi-surface/types.d.ts +2 -2
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
- package/dist/heatmap-matrix/index.d.ts +8 -2
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/io/ExportPane.svelte +170 -0
- package/dist/io/ExportPane.svelte.d.ts +17 -0
- package/dist/io/decompress.d.ts +2 -1
- package/dist/io/decompress.js +22 -36
- package/dist/io/export.d.ts +9 -1
- package/dist/io/export.js +37 -29
- package/dist/io/fetch.d.ts +2 -4
- package/dist/io/fetch.js +0 -11
- package/dist/io/file-drop.d.ts +7 -0
- package/dist/io/file-drop.js +13 -0
- package/dist/io/index.d.ts +1 -0
- package/dist/io/index.js +3 -0
- package/dist/io/is-binary.d.ts +9 -0
- package/dist/io/is-binary.js +45 -1
- package/dist/io/types.d.ts +13 -0
- package/dist/io/url-drop.js +13 -25
- package/dist/isosurface/Isosurface.svelte +17 -23
- package/dist/isosurface/IsosurfaceControls.svelte +37 -42
- package/dist/isosurface/parse-vaspwave.d.ts +3 -0
- package/dist/isosurface/parse-vaspwave.js +138 -0
- package/dist/isosurface/parse.js +50 -48
- package/dist/labels.d.ts +6 -2
- package/dist/labels.js +44 -14
- package/dist/layout/FullscreenButton.svelte +34 -0
- package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
- package/dist/layout/FullscreenToggle.svelte +12 -12
- package/dist/layout/InfoCard.svelte +7 -18
- package/dist/layout/InfoTag.svelte +1 -3
- package/dist/layout/NumberRangeInput.svelte +46 -0
- package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
- package/dist/layout/PropertyFilter.svelte +2 -6
- package/dist/layout/SettingsSection.svelte +21 -17
- package/dist/layout/SubpageGrid.svelte +3 -1
- package/dist/layout/ViewerChrome.svelte +115 -0
- package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
- package/dist/layout/fullscreen.d.ts +4 -0
- package/dist/layout/fullscreen.js +3 -5
- package/dist/layout/fullscreen.svelte.d.ts +8 -0
- package/dist/layout/fullscreen.svelte.js +36 -0
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/json-tree/JsonNode.svelte +8 -11
- package/dist/layout/json-tree/JsonTree.svelte +53 -77
- package/dist/layout/json-tree/JsonValue.svelte +7 -15
- package/dist/layout/json-tree/utils.js +14 -23
- package/dist/math.d.ts +9 -3
- package/dist/math.js +37 -21
- package/dist/overlays/ContextMenu.svelte +4 -2
- package/dist/overlays/CopyButton.svelte +11 -5
- package/dist/overlays/DragControlTab.svelte +6 -1
- package/dist/overlays/DraggablePane.svelte +81 -26
- package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
- package/dist/overlays/GlassChip.svelte +30 -0
- package/dist/overlays/GlassChip.svelte.d.ts +8 -0
- package/dist/overlays/InfoPaneCards.svelte +11 -23
- package/dist/overlays/index.d.ts +11 -0
- package/dist/overlays/index.js +26 -0
- package/dist/overlays/portal.d.ts +2 -0
- package/dist/overlays/portal.js +14 -0
- package/dist/periodic-table/PeriodicTable.svelte +115 -146
- package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
- package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
- package/dist/periodic-table/TableInset.svelte +9 -4
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
- package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
- package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
- package/dist/phase-diagram/build-diagram.js +3 -3
- package/dist/phase-diagram/colors.js +1 -1
- package/dist/phase-diagram/diagram-input.d.ts +1 -2
- package/dist/phase-diagram/parse.d.ts +2 -1
- package/dist/phase-diagram/parse.js +15 -15
- package/dist/phase-diagram/svg-to-diagram.js +21 -15
- package/dist/phase-diagram/utils.js +2 -3
- package/dist/plot/bar/BarPlot.svelte +494 -692
- package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
- package/dist/plot/bar/BarPlotControls.svelte +1 -3
- package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
- package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
- package/dist/plot/bar/data.d.ts +5 -4
- package/dist/plot/bar/data.js +2 -1
- package/dist/plot/box/BoxPlot.svelte +361 -439
- package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
- package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
- package/dist/plot/box/Violin.svelte.d.ts +2 -1
- package/dist/plot/box/box-plot.d.ts +3 -2
- package/dist/plot/box/box-plot.js +6 -3
- package/dist/plot/box/kde.d.ts +2 -1
- package/dist/plot/box/kde.js +4 -4
- package/dist/plot/core/auto-place.d.ts +1 -1
- package/dist/plot/core/auto-place.js +5 -2
- package/dist/plot/core/axis-utils.d.ts +12 -7
- package/dist/plot/core/axis-utils.js +48 -48
- package/dist/plot/core/components/AxisLabel.svelte +82 -20
- package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
- package/dist/plot/core/components/ColorBar.svelte +106 -111
- package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
- package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
- package/dist/plot/core/components/FillArea.svelte +10 -17
- package/dist/plot/core/components/HierarchyControls.svelte +249 -0
- package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
- package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
- package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
- package/dist/plot/core/components/Line.svelte +21 -11
- package/dist/plot/core/components/Line.svelte.d.ts +5 -2
- package/dist/plot/core/components/PlotAxis.svelte +42 -18
- package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
- package/dist/plot/core/components/PlotControls.svelte +65 -41
- package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
- package/dist/plot/core/components/PlotLegend.svelte +31 -35
- package/dist/plot/core/components/PlotMarginals.svelte +616 -0
- package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
- package/dist/plot/core/components/PlotTooltip.svelte +1 -1
- package/dist/plot/core/components/PortalSelect.svelte +4 -8
- package/dist/plot/core/components/ReferenceLine.svelte +27 -24
- package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
- package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
- package/dist/plot/core/components/ReferencePlane.svelte +9 -10
- package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
- package/dist/plot/core/components/ZeroLines.svelte +4 -8
- package/dist/plot/core/components/ZoomRect.svelte +1 -2
- package/dist/plot/core/components/index.d.ts +1 -0
- package/dist/plot/core/components/index.js +1 -0
- package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
- package/dist/plot/core/data-cleaning-signal.js +467 -0
- package/dist/plot/core/data-cleaning.d.ts +2 -42
- package/dist/plot/core/data-cleaning.js +29 -476
- package/dist/plot/core/data-transform.js +9 -5
- package/dist/plot/core/fill-utils.d.ts +7 -4
- package/dist/plot/core/fill-utils.js +34 -9
- package/dist/plot/core/index.d.ts +1 -0
- package/dist/plot/core/index.js +1 -0
- package/dist/plot/core/interactions.d.ts +5 -1
- package/dist/plot/core/interactions.js +14 -2
- package/dist/plot/core/layout.d.ts +3 -1
- package/dist/plot/core/layout.js +22 -13
- package/dist/plot/core/marginals.d.ts +170 -0
- package/dist/plot/core/marginals.js +436 -0
- package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
- package/dist/plot/core/pan-zoom.svelte.js +221 -0
- package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
- package/dist/plot/core/placed-tween.svelte.js +68 -0
- package/dist/plot/core/reference-line.d.ts +10 -10
- package/dist/plot/core/reference-line.js +7 -7
- package/dist/plot/core/scales.d.ts +40 -25
- package/dist/plot/core/scales.js +49 -21
- package/dist/plot/core/svg.d.ts +2 -1
- package/dist/plot/core/types/fills.d.ts +101 -0
- package/dist/plot/core/types/fills.js +15 -0
- package/dist/plot/core/types/plot-3d.d.ts +87 -0
- package/dist/plot/core/types/plot-3d.js +4 -0
- package/dist/plot/core/types/reference-lines.d.ts +140 -0
- package/dist/plot/core/types/reference-lines.js +9 -0
- package/dist/plot/core/types.d.ts +47 -331
- package/dist/plot/core/types.js +23 -20
- package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
- package/dist/plot/core/utils/hierarchy-chart.js +179 -0
- package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
- package/dist/plot/core/utils/hierarchy-labels.js +99 -0
- package/dist/plot/core/utils/label-placement.d.ts +1 -1
- package/dist/plot/core/utils/label-placement.js +5 -5
- package/dist/plot/core/utils.d.ts +2 -1
- package/dist/plot/histogram/Histogram.svelte +373 -631
- package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
- package/dist/plot/histogram/HistogramControls.svelte +30 -28
- package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
- package/dist/plot/histogram/histogram.d.ts +31 -0
- package/dist/plot/histogram/histogram.js +70 -0
- package/dist/plot/histogram/index.d.ts +1 -0
- package/dist/plot/histogram/index.js +1 -0
- package/dist/plot/index.d.ts +1 -0
- package/dist/plot/index.js +1 -0
- package/dist/plot/sankey/Sankey.svelte +79 -73
- package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
- package/dist/plot/sankey/SankeyControls.svelte +22 -16
- package/dist/plot/sankey/sankey.js +3 -1
- package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
- package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
- package/dist/plot/scatter/ElementScatter.svelte +4 -1
- package/dist/plot/scatter/ScatterPlot.svelte +623 -821
- package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
- package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
- package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
- package/dist/plot/scatter/ScatterPoint.svelte +16 -9
- package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
- package/dist/plot/scatter/binned-scatter-types.js +6 -1
- package/dist/plot/scatter/index.d.ts +1 -1
- package/dist/plot/scatter/scatter-data.d.ts +1 -1
- package/dist/plot/scatter/scatter-data.js +8 -7
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
- package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
- package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
- package/dist/plot/sunburst/Sunburst.svelte +256 -338
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
- package/dist/plot/sunburst/index.d.ts +1 -1
- package/dist/plot/sunburst/index.js +2 -1
- package/dist/plot/sunburst/render.d.ts +2 -2
- package/dist/plot/sunburst/render.js +47 -22
- package/dist/plot/sunburst/sunburst.d.ts +5 -1
- package/dist/plot/sunburst/sunburst.js +14 -4
- package/dist/plot/treemap/Treemap.svelte +907 -0
- package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
- package/dist/plot/treemap/index.d.ts +3 -0
- package/dist/plot/treemap/index.js +4 -0
- package/dist/plot/treemap/treemap.d.ts +26 -0
- package/dist/plot/treemap/treemap.js +99 -0
- package/dist/rdf/RdfPlot.svelte +22 -26
- package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
- package/dist/rdf/calc-rdf.js +4 -8
- package/dist/sanitize.js +14 -3
- package/dist/scene/SceneCamera.svelte +62 -0
- package/dist/scene/SceneCamera.svelte.d.ts +19 -0
- package/dist/scene/bind-renderer.svelte.d.ts +2 -0
- package/dist/scene/bind-renderer.svelte.js +22 -0
- package/dist/scene/index.d.ts +4 -0
- package/dist/scene/index.js +5 -0
- package/dist/scene/props.js +52 -0
- package/dist/scene/types.d.ts +26 -0
- package/dist/scene/types.js +1 -0
- package/dist/settings.d.ts +33 -11
- package/dist/settings.js +136 -51
- package/dist/spectral/Bands.svelte +231 -237
- package/dist/spectral/Bands.svelte.d.ts +3 -2
- package/dist/spectral/BandsAndDos.svelte +29 -29
- package/dist/spectral/BrillouinBandsDos.svelte +21 -29
- package/dist/spectral/Dos.svelte +75 -77
- package/dist/spectral/Dos.svelte.d.ts +2 -1
- package/dist/spectral/helpers.d.ts +9 -9
- package/dist/spectral/helpers.js +66 -70
- package/dist/state.svelte.d.ts +0 -7
- package/dist/state.svelte.js +5 -24
- package/dist/structure/Arrow.svelte +6 -21
- package/dist/structure/ArrowInstances.svelte +160 -0
- package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
- package/dist/structure/AtomLegend.svelte +115 -75
- package/dist/structure/AtomLegend.svelte.d.ts +1 -1
- package/dist/structure/Bond.svelte +31 -23
- package/dist/structure/CanvasTooltip.svelte +16 -3
- package/dist/structure/CellSelect.svelte +22 -29
- package/dist/structure/CellSelect.svelte.d.ts +2 -1
- package/dist/structure/Cylinder.svelte +24 -40
- package/dist/structure/InstancedAtoms.svelte +114 -0
- package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
- package/dist/structure/Lattice.svelte +85 -149
- package/dist/structure/SiteLabels.svelte +122 -0
- package/dist/structure/SiteLabels.svelte.d.ts +18 -0
- package/dist/structure/Structure.svelte +725 -735
- package/dist/structure/Structure.svelte.d.ts +8 -16
- package/dist/structure/StructureCarousel.svelte +630 -0
- package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
- package/dist/structure/StructureControls.svelte +298 -325
- package/dist/structure/StructureControls.svelte.d.ts +5 -3
- package/dist/structure/StructureExportPane.svelte +62 -168
- package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
- package/dist/structure/StructureInfoPane.svelte +77 -69
- package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
- package/dist/structure/StructureScene.svelte +758 -600
- package/dist/structure/StructureScene.svelte.d.ts +24 -20
- package/dist/structure/StructureViewport.svelte +386 -0
- package/dist/structure/StructureViewport.svelte.d.ts +63 -0
- package/dist/structure/atom-label-placement.d.ts +18 -0
- package/dist/structure/atom-label-placement.js +115 -0
- package/dist/structure/atom-properties.d.ts +3 -1
- package/dist/structure/atom-properties.js +115 -54
- package/dist/structure/bond-order-perception.js +2 -4
- package/dist/structure/bonding.d.ts +12 -2
- package/dist/structure/bonding.js +172 -73
- package/dist/structure/edit-history.d.ts +6 -0
- package/dist/structure/edit-history.js +27 -0
- package/dist/structure/export.d.ts +25 -4
- package/dist/structure/export.js +103 -153
- package/dist/structure/format-detect.d.ts +1 -0
- package/dist/structure/format-detect.js +22 -0
- package/dist/structure/geometry.d.ts +9 -0
- package/dist/structure/geometry.js +27 -0
- package/dist/structure/index.d.ts +18 -1
- package/dist/structure/index.js +15 -2
- package/dist/structure/measure.d.ts +1 -1
- package/dist/structure/measure.js +6 -12
- package/dist/structure/parse.d.ts +5 -3
- package/dist/structure/parse.js +551 -567
- package/dist/structure/partial-occupancy.d.ts +0 -1
- package/dist/structure/partial-occupancy.js +5 -3
- package/dist/structure/pbc.d.ts +1 -1
- package/dist/structure/pbc.js +204 -51
- package/dist/structure/polyhedra.d.ts +40 -0
- package/dist/structure/polyhedra.js +587 -0
- package/dist/structure/site.d.ts +4 -0
- package/dist/structure/site.js +1 -0
- package/dist/structure/supercell.d.ts +1 -2
- package/dist/structure/supercell.js +10 -15
- package/dist/structure/validation.js +5 -6
- package/dist/symmetry/SymmetryElementControls.svelte +69 -0
- package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
- package/dist/symmetry/SymmetryElements.svelte +350 -0
- package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
- package/dist/symmetry/SymmetryStats.svelte +142 -49
- package/dist/symmetry/WyckoffTable.svelte +58 -16
- package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
- package/dist/symmetry/cell-transform.js +8 -14
- package/dist/symmetry/index.d.ts +15 -4
- package/dist/symmetry/index.js +308 -81
- package/dist/symmetry/spacegroups.d.ts +5 -1
- package/dist/symmetry/spacegroups.js +18 -3
- package/dist/symmetry/symmetry-elements.d.ts +33 -0
- package/dist/symmetry/symmetry-elements.js +521 -0
- package/dist/symmetry/wyckoff-db.d.ts +9 -0
- package/dist/symmetry/wyckoff-db.js +87 -0
- package/dist/table/HeatmapTable.svelte +1104 -378
- package/dist/table/HeatmapTable.svelte.d.ts +12 -2
- package/dist/table/ToggleMenu.svelte +5 -12
- package/dist/table/index.d.ts +21 -6
- package/dist/table/index.js +34 -21
- package/dist/theme/ThemeControl.svelte +16 -8
- package/dist/theme/index.d.ts +1 -5
- package/dist/theme/index.js +4 -10
- package/dist/theme/themes.mjs +14 -7
- package/dist/tooltip/KCoords.svelte +4 -1
- package/dist/tooltip/TooltipContent.svelte +2 -5
- package/dist/trajectory/Trajectory.svelte +556 -352
- package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
- package/dist/trajectory/TrajectoryError.svelte +11 -8
- package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
- package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
- package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
- package/dist/trajectory/constants.js +6 -2
- package/dist/trajectory/extract.js +73 -71
- package/dist/trajectory/format-detect.d.ts +0 -1
- package/dist/trajectory/format-detect.js +13 -17
- package/dist/trajectory/frame-reader.d.ts +2 -1
- package/dist/trajectory/frame-reader.js +74 -136
- package/dist/trajectory/helpers.d.ts +12 -2
- package/dist/trajectory/helpers.js +68 -37
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +3 -0
- package/dist/trajectory/parse/ase.d.ts +9 -1
- package/dist/trajectory/parse/ase.js +47 -32
- package/dist/trajectory/parse/diagnostics.d.ts +3 -0
- package/dist/trajectory/parse/diagnostics.js +14 -0
- package/dist/trajectory/parse/h5-utils.d.ts +13 -0
- package/dist/trajectory/parse/h5-utils.js +109 -0
- package/dist/trajectory/parse/hdf5.d.ts +1 -1
- package/dist/trajectory/parse/hdf5.js +116 -106
- package/dist/trajectory/parse/index.d.ts +3 -4
- package/dist/trajectory/parse/index.js +68 -119
- package/dist/trajectory/parse/lammps.d.ts +0 -2
- package/dist/trajectory/parse/lammps.js +14 -16
- package/dist/trajectory/parse/pymatgen.d.ts +2 -0
- package/dist/trajectory/parse/pymatgen.js +74 -0
- package/dist/trajectory/parse/vasp.js +13 -9
- package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
- package/dist/trajectory/parse/vaspout-electronic.js +207 -0
- package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
- package/dist/trajectory/parse/vaspout-h5.js +284 -0
- package/dist/trajectory/parse/xyz.d.ts +9 -21
- package/dist/trajectory/parse/xyz.js +38 -39
- package/dist/trajectory/plotting.d.ts +8 -10
- package/dist/trajectory/plotting.js +102 -127
- package/dist/utils.d.ts +4 -0
- package/dist/utils.js +8 -1
- package/dist/xrd/XrdPlot.svelte +56 -85
- package/dist/xrd/broadening.d.ts +2 -1
- package/dist/xrd/broadening.js +2 -1
- package/dist/xrd/calc-xrd.js +8 -15
- package/dist/xrd/index.d.ts +2 -2
- package/dist/xrd/parse.d.ts +0 -1
- package/dist/xrd/parse.js +56 -73
- package/package.json +77 -36
- package/dist/api/mp.d.ts +0 -6
- package/dist/api/mp.js +0 -22
- package/dist/element/data.json +0 -11864
- package/dist/fermi-surface/marching-cubes.d.ts +0 -2
- package/dist/fermi-surface/marching-cubes.js +0 -2
- package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
- package/dist/plot/core/hover-lock.svelte.js +0 -45
- package/dist/plot/sunburst/SunburstControls.svelte +0 -200
- package/dist/structure/label-placement.d.ts +0 -14
- package/dist/structure/label-placement.js +0 -72
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// Shared pan/zoom/touch/drag-rect interaction controller for the 2D plot components
|
|
2
|
+
// (BarPlot, BoxPlot, Histogram, ScatterPlot). Owns the interaction state machine;
|
|
3
|
+
// per-component policy (which axis props to write on rect-zoom, reset semantics)
|
|
4
|
+
// stays in the component via the on_rect_zoom/on_reset/set_range callbacks.
|
|
5
|
+
import { MIN_TOUCH_DISTANCE_PIXELS, pan_range_by_pixels, PINCH_ZOOM_THRESHOLD, remove_drag_listeners, snapshot_ranges, zoom_range_by_factor, } from './interactions';
|
|
6
|
+
const AXES = [`x`, `x2`, `y`, `y2`];
|
|
7
|
+
export function create_pan_zoom(opts) {
|
|
8
|
+
// Rect-zoom drag state
|
|
9
|
+
let drag_state = $state({ start: null, current: null, bounds: null });
|
|
10
|
+
// Pan state
|
|
11
|
+
let is_focused = $state(false);
|
|
12
|
+
let shift_held = $state(false);
|
|
13
|
+
let pan_drag_state = $state(null);
|
|
14
|
+
let touch_state = $state(null);
|
|
15
|
+
const cancel_rect_drag = () => {
|
|
16
|
+
drag_state = { start: null, current: null, bounds: null };
|
|
17
|
+
if (typeof window !== `undefined`) {
|
|
18
|
+
window.removeEventListener(`mousemove`, on_window_mouse_move);
|
|
19
|
+
window.removeEventListener(`mouseup`, on_window_mouse_up);
|
|
20
|
+
document.body.style.cursor = ``;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const on_window_mouse_move = (evt) => {
|
|
24
|
+
if (!drag_state.start || !drag_state.bounds)
|
|
25
|
+
return;
|
|
26
|
+
const coords = {
|
|
27
|
+
x: evt.clientX - drag_state.bounds.left,
|
|
28
|
+
y: evt.clientY - drag_state.bounds.top,
|
|
29
|
+
};
|
|
30
|
+
drag_state.current = coords;
|
|
31
|
+
const inside_svg = coords.x >= 0 &&
|
|
32
|
+
coords.x <= drag_state.bounds.width &&
|
|
33
|
+
coords.y >= 0 &&
|
|
34
|
+
coords.y <= drag_state.bounds.height;
|
|
35
|
+
opts.on_drag_move?.(coords, inside_svg);
|
|
36
|
+
};
|
|
37
|
+
const on_window_mouse_up = () => {
|
|
38
|
+
if (drag_state.start && drag_state.current) {
|
|
39
|
+
// Ignore minuscule drag rects (e.g. accidental clicks)
|
|
40
|
+
const dx = Math.abs(drag_state.start.x - drag_state.current.x);
|
|
41
|
+
const dy = Math.abs(drag_state.start.y - drag_state.current.y);
|
|
42
|
+
if (dx > 5 && dy > 5)
|
|
43
|
+
opts.on_rect_zoom(drag_state.start, drag_state.current);
|
|
44
|
+
}
|
|
45
|
+
cancel_rect_drag();
|
|
46
|
+
};
|
|
47
|
+
// Pan/zoom all four axes from an interaction-start snapshot, each in its own
|
|
48
|
+
// scale's transform space (log axes pan by a constant factor, linear by a shift)
|
|
49
|
+
const pan_all_axes = (init, dx_px, dy_px) => {
|
|
50
|
+
const dims = opts.plot_dims();
|
|
51
|
+
for (const axis of AXES) {
|
|
52
|
+
const horizontal = axis === `x` || axis === `x2`;
|
|
53
|
+
opts.set_range(axis, pan_range_by_pixels(init[`initial_${axis}_range`], horizontal ? dx_px : dy_px, horizontal ? dims.width : dims.height, opts.scale_type(axis)));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const zoom_all_axes = (init, factor) => {
|
|
57
|
+
for (const axis of AXES) {
|
|
58
|
+
opts.set_range(axis, zoom_range_by_factor(init[`initial_${axis}_range`], factor, opts.scale_type(axis)));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
// Pan drag handler (drag direction inverted on x for natural pan feel)
|
|
62
|
+
const on_pan_move = (evt) => {
|
|
63
|
+
if (!pan_drag_state)
|
|
64
|
+
return;
|
|
65
|
+
const sensitivity = opts.pan()?.drag_sensitivity ?? 1;
|
|
66
|
+
pan_all_axes(pan_drag_state, -(evt.clientX - pan_drag_state.start.x) * sensitivity, (evt.clientY - pan_drag_state.start.y) * sensitivity);
|
|
67
|
+
};
|
|
68
|
+
const on_pan_end = () => {
|
|
69
|
+
pan_drag_state = null;
|
|
70
|
+
document.body.style.cursor = ``;
|
|
71
|
+
window.removeEventListener(`mousemove`, on_pan_move);
|
|
72
|
+
window.removeEventListener(`mouseup`, on_pan_end);
|
|
73
|
+
};
|
|
74
|
+
const on_mouse_down = (evt) => {
|
|
75
|
+
const svg = opts.svg();
|
|
76
|
+
if (!svg)
|
|
77
|
+
return;
|
|
78
|
+
// Shift+drag pans (when enabled); plain drag draws the zoom rect
|
|
79
|
+
const pan_enabled = opts.pan()?.enabled !== false;
|
|
80
|
+
if (pan_enabled && evt.shiftKey) {
|
|
81
|
+
evt.preventDefault();
|
|
82
|
+
pan_drag_state = {
|
|
83
|
+
start: { x: evt.clientX, y: evt.clientY },
|
|
84
|
+
...snapshot_ranges(opts.ranges()),
|
|
85
|
+
};
|
|
86
|
+
document.body.style.cursor = `grabbing`;
|
|
87
|
+
window.addEventListener(`mousemove`, on_pan_move);
|
|
88
|
+
window.addEventListener(`mouseup`, on_pan_end);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Cache bounds at drag start so window mousemove can compute relative coords
|
|
92
|
+
const bounds = svg.getBoundingClientRect();
|
|
93
|
+
const coords = { x: evt.clientX - bounds.left, y: evt.clientY - bounds.top };
|
|
94
|
+
drag_state = { start: coords, current: coords, bounds };
|
|
95
|
+
window.addEventListener(`mousemove`, on_window_mouse_move);
|
|
96
|
+
window.addEventListener(`mouseup`, on_window_mouse_up);
|
|
97
|
+
document.body.style.cursor = `crosshair`;
|
|
98
|
+
evt.preventDefault();
|
|
99
|
+
};
|
|
100
|
+
// Wheel handler for pan (requires focus and shift). Use shift_held state
|
|
101
|
+
// (tracked via window keydown/keyup) for compatibility with synthetic events.
|
|
102
|
+
const on_wheel = (evt) => {
|
|
103
|
+
const pan_cfg = opts.pan();
|
|
104
|
+
if (pan_cfg?.enabled === false || !is_focused || !shift_held)
|
|
105
|
+
return;
|
|
106
|
+
evt.preventDefault();
|
|
107
|
+
const dims = opts.plot_dims();
|
|
108
|
+
const sensitivity = pan_cfg?.wheel_sensitivity ?? 1;
|
|
109
|
+
const ranges = opts.ranges();
|
|
110
|
+
// Pan along the dominant wheel direction
|
|
111
|
+
if (Math.abs(evt.deltaX) > Math.abs(evt.deltaY)) {
|
|
112
|
+
const dx = evt.deltaX * sensitivity;
|
|
113
|
+
opts.set_range(`x`, pan_range_by_pixels(ranges.x, dx, dims.width, opts.scale_type(`x`)));
|
|
114
|
+
opts.set_range(`x2`, pan_range_by_pixels(ranges.x2, dx, dims.width, opts.scale_type(`x2`)));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const dy = evt.deltaY * sensitivity;
|
|
118
|
+
opts.set_range(`y`, pan_range_by_pixels(ranges.y, dy, dims.height, opts.scale_type(`y`)));
|
|
119
|
+
opts.set_range(`y2`, pan_range_by_pixels(ranges.y2, dy, dims.height, opts.scale_type(`y2`)));
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
// Touch handlers for pinch-zoom and two-finger pan
|
|
123
|
+
const on_touch_start = (evt) => {
|
|
124
|
+
const pan_cfg = opts.pan();
|
|
125
|
+
const touch_enabled = pan_cfg?.enabled !== false && pan_cfg?.touch_enabled !== false;
|
|
126
|
+
if (!touch_enabled || evt.touches.length !== 2)
|
|
127
|
+
return;
|
|
128
|
+
evt.preventDefault();
|
|
129
|
+
touch_state = {
|
|
130
|
+
start_touches: Array.from(evt.touches).map((touch) => ({
|
|
131
|
+
x: touch.clientX,
|
|
132
|
+
y: touch.clientY,
|
|
133
|
+
})),
|
|
134
|
+
...snapshot_ranges(opts.ranges()),
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
const on_touch_move = (evt) => {
|
|
138
|
+
if (!touch_state || evt.touches.length !== 2)
|
|
139
|
+
return;
|
|
140
|
+
evt.preventDefault();
|
|
141
|
+
const [t1, t2] = Array.from(evt.touches);
|
|
142
|
+
const [s1, s2] = touch_state.start_touches;
|
|
143
|
+
// Calculate center movement for pan
|
|
144
|
+
const start_center = { x: (s1.x + s2.x) / 2, y: (s1.y + s2.y) / 2 };
|
|
145
|
+
const curr_center = { x: (t1.clientX + t2.clientX) / 2, y: (t1.clientY + t2.clientY) / 2 };
|
|
146
|
+
const dx = curr_center.x - start_center.x;
|
|
147
|
+
const dy = curr_center.y - start_center.y;
|
|
148
|
+
// Calculate pinch scale (curr/start so spread = zoom in, pinch = zoom out)
|
|
149
|
+
const start_dist = Math.hypot(s2.x - s1.x, s2.y - s1.y);
|
|
150
|
+
// ignore near-coincident touches so curr_dist / start_dist can't blow up the scale
|
|
151
|
+
if (start_dist < MIN_TOUCH_DISTANCE_PIXELS)
|
|
152
|
+
return;
|
|
153
|
+
const curr_dist = Math.hypot(t2.clientX - t1.clientX, t2.clientY - t1.clientY);
|
|
154
|
+
const scale = curr_dist / start_dist;
|
|
155
|
+
// Pinch zoom about the view center if scale changed significantly, else pan
|
|
156
|
+
if (Math.abs(scale - 1) > PINCH_ZOOM_THRESHOLD && scale > Number.EPSILON) {
|
|
157
|
+
zoom_all_axes(touch_state, scale);
|
|
158
|
+
}
|
|
159
|
+
else
|
|
160
|
+
pan_all_axes(touch_state, -dx, dy);
|
|
161
|
+
};
|
|
162
|
+
const on_touch_end = () => {
|
|
163
|
+
touch_state = null;
|
|
164
|
+
};
|
|
165
|
+
// SVG keydown: Escape cancels an in-flight rect drag, Enter/Space resets the view.
|
|
166
|
+
// Target check keeps focusable plot children (bars, points) from triggering a reset
|
|
167
|
+
// when their own Enter/Space activation bubbles up.
|
|
168
|
+
const on_key_down = (evt) => {
|
|
169
|
+
if (evt.target !== evt.currentTarget)
|
|
170
|
+
return;
|
|
171
|
+
if (evt.key === `Escape` && drag_state.start)
|
|
172
|
+
cancel_rect_drag();
|
|
173
|
+
if ([`Enter`, ` `].includes(evt.key)) {
|
|
174
|
+
evt.preventDefault();
|
|
175
|
+
opts.on_reset();
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
return {
|
|
179
|
+
get drag_start() {
|
|
180
|
+
return drag_state.start;
|
|
181
|
+
},
|
|
182
|
+
get drag_current() {
|
|
183
|
+
return drag_state.current;
|
|
184
|
+
},
|
|
185
|
+
get is_pan_dragging() {
|
|
186
|
+
return pan_drag_state !== null;
|
|
187
|
+
},
|
|
188
|
+
get cursor() {
|
|
189
|
+
if (pan_drag_state)
|
|
190
|
+
return `grabbing`;
|
|
191
|
+
return shift_held && opts.pan()?.enabled !== false ? `grab` : `crosshair`;
|
|
192
|
+
},
|
|
193
|
+
set_focused: (focused) => {
|
|
194
|
+
is_focused = focused;
|
|
195
|
+
},
|
|
196
|
+
on_mouse_down,
|
|
197
|
+
on_wheel,
|
|
198
|
+
on_touch_start,
|
|
199
|
+
on_touch_move,
|
|
200
|
+
on_touch_end,
|
|
201
|
+
on_key_down,
|
|
202
|
+
on_window_key_down: (evt) => {
|
|
203
|
+
if (evt.key === `Shift`)
|
|
204
|
+
shift_held = true;
|
|
205
|
+
},
|
|
206
|
+
on_window_key_up: (evt) => {
|
|
207
|
+
if (evt.key === `Shift`)
|
|
208
|
+
shift_held = false;
|
|
209
|
+
},
|
|
210
|
+
reset_view: () => opts.on_reset(),
|
|
211
|
+
// Tear down any window listeners + cursor override if the component unmounts
|
|
212
|
+
// mid-drag (mouseup/panend would otherwise never fire, leaking listeners and a
|
|
213
|
+
// stuck cursor). Safe during SSR teardown, where window/document don't exist.
|
|
214
|
+
destroy: () => {
|
|
215
|
+
remove_drag_listeners([on_window_mouse_move, on_pan_move], [on_window_mouse_up, on_pan_end]);
|
|
216
|
+
drag_state = { start: null, current: null, bounds: null };
|
|
217
|
+
pan_drag_state = null;
|
|
218
|
+
touch_state = null;
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Tween, type TweenOptions } from 'svelte/motion';
|
|
2
|
+
type Point = {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function create_placed_tween(opts: {
|
|
7
|
+
placement: () => Point | null;
|
|
8
|
+
dims: () => {
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
responsive: () => boolean;
|
|
13
|
+
element: () => Element | null | undefined;
|
|
14
|
+
tween?: () => TweenOptions<Point> | undefined;
|
|
15
|
+
suspended?: () => boolean;
|
|
16
|
+
manual_position?: () => Point | null;
|
|
17
|
+
}): {
|
|
18
|
+
coords: Tween<Point>;
|
|
19
|
+
set_locked: (locked: boolean) => void;
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Tweened position for auto-placed plot elements (legend, colorbar) with hover lock,
|
|
2
|
+
// debounced release, resize detection, and stability gating
|
|
3
|
+
import { untrack } from 'svelte';
|
|
4
|
+
import { Tween } from 'svelte/motion';
|
|
5
|
+
const HOVER_DEBOUNCE_MS = 300;
|
|
6
|
+
// Tweened position for an auto-placed plot element with the stability gating shared
|
|
7
|
+
// by BarPlot/BoxPlot/Histogram/ScatterPlot legends: snap (no animation) on first
|
|
8
|
+
// placement, follow container resizes, stay put while hovered (debounced hover lock),
|
|
9
|
+
// and track placement continuously only when `responsive`. Creates $effects, so it
|
|
10
|
+
// must be called during component init.
|
|
11
|
+
export function create_placed_tween(opts) {
|
|
12
|
+
// Hover lock: placement updates pause while the element is hovered; release is
|
|
13
|
+
// debounced so brief mouse-outs don't cause jumps
|
|
14
|
+
let hover_locked = $state(false);
|
|
15
|
+
let unlock_timeout = null;
|
|
16
|
+
const set_locked = (locked) => {
|
|
17
|
+
// Always clear any pending unlock so rapid calls don't queue multiple timeouts
|
|
18
|
+
if (unlock_timeout)
|
|
19
|
+
clearTimeout(unlock_timeout);
|
|
20
|
+
if (locked)
|
|
21
|
+
hover_locked = true;
|
|
22
|
+
else
|
|
23
|
+
unlock_timeout = setTimeout(() => (hover_locked = false), HOVER_DEBOUNCE_MS);
|
|
24
|
+
};
|
|
25
|
+
// Plain (untracked) flags: only read/written inside the effect below, and outcomes
|
|
26
|
+
// don't depend on re-running when they flip
|
|
27
|
+
let prev_dims = null;
|
|
28
|
+
let has_initial_placement = false;
|
|
29
|
+
const coords = new Tween({ x: 0, y: 0 }, untrack(() => ({ duration: 400, ...opts.tween?.() })));
|
|
30
|
+
// Clear pending unlock timeout to prevent state updates after unmount
|
|
31
|
+
$effect(() => () => {
|
|
32
|
+
if (unlock_timeout)
|
|
33
|
+
clearTimeout(unlock_timeout);
|
|
34
|
+
});
|
|
35
|
+
// Update position with stability checks
|
|
36
|
+
$effect(() => {
|
|
37
|
+
const { width, height } = opts.dims();
|
|
38
|
+
if (!width || !height)
|
|
39
|
+
return;
|
|
40
|
+
if (opts.suspended?.())
|
|
41
|
+
return;
|
|
42
|
+
const manual = opts.manual_position?.();
|
|
43
|
+
if (manual) {
|
|
44
|
+
// Immediate update (no animation) for manually positioned elements
|
|
45
|
+
void coords.set({ x: manual.x, y: manual.y }, { duration: 0 });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const placement = opts.placement();
|
|
49
|
+
if (!placement)
|
|
50
|
+
return;
|
|
51
|
+
// Track dimensions for resize detection
|
|
52
|
+
const dims_changed = !prev_dims || prev_dims.width !== width || prev_dims.height !== height;
|
|
53
|
+
if (dims_changed)
|
|
54
|
+
prev_dims = { width, height };
|
|
55
|
+
// Only update if: resize occurred, OR (not hover-locked AND (responsive OR not
|
|
56
|
+
// yet initially placed))
|
|
57
|
+
const should_update = dims_changed || (!hover_locked && (opts.responsive() || !has_initial_placement));
|
|
58
|
+
if (should_update) {
|
|
59
|
+
void coords.set({ x: placement.x, y: placement.y },
|
|
60
|
+
// Skip animation on initial placement to avoid jump from (0, 0)
|
|
61
|
+
has_initial_placement ? undefined : { duration: 0 });
|
|
62
|
+
// Only lock position after the element has an actual measured size
|
|
63
|
+
if (opts.element())
|
|
64
|
+
has_initial_placement = true;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return { coords, set_locked };
|
|
68
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Vec2, Vec4 } from '../../math';
|
|
1
2
|
import type { RefLine, RefLineValue } from './types';
|
|
2
3
|
export type IndexedRefLine = RefLine & {
|
|
3
4
|
idx: number;
|
|
@@ -11,18 +12,18 @@ export interface RefLinesByZIndex {
|
|
|
11
12
|
}
|
|
12
13
|
export declare function group_ref_lines_by_z(lines: IndexedRefLine[]): RefLinesByZIndex;
|
|
13
14
|
export declare function normalize_value(value: RefLineValue): number;
|
|
14
|
-
export declare const normalize_point: (point: [RefLineValue, RefLineValue]) =>
|
|
15
|
-
export declare function resolve_line_endpoints(ref_line: RefLine,
|
|
15
|
+
export declare const normalize_point: (point: [RefLineValue, RefLineValue]) => Vec2;
|
|
16
|
+
export declare function resolve_line_endpoints(ref_line: RefLine, bounds: {
|
|
16
17
|
x_min: number;
|
|
17
18
|
x_max: number;
|
|
18
19
|
y_min: number;
|
|
19
20
|
y_max: number;
|
|
20
|
-
},
|
|
21
|
+
}, scales: {
|
|
21
22
|
x_scale: (val: number) => number;
|
|
22
23
|
x2_scale?: (val: number) => number;
|
|
23
24
|
y_scale: (val: number) => number;
|
|
24
25
|
y2_scale?: (val: number) => number;
|
|
25
|
-
}):
|
|
26
|
+
}): Vec4 | null;
|
|
26
27
|
interface AnnotationPosition {
|
|
27
28
|
x: number;
|
|
28
29
|
y: number;
|
|
@@ -45,13 +46,12 @@ export interface Scene3DParams {
|
|
|
45
46
|
scene_x: number;
|
|
46
47
|
scene_y: number;
|
|
47
48
|
scene_z: number;
|
|
48
|
-
x_range:
|
|
49
|
-
y_range:
|
|
50
|
-
z_range:
|
|
49
|
+
x_range: Vec2;
|
|
50
|
+
y_range: Vec2;
|
|
51
|
+
z_range: Vec2;
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
-
export declare
|
|
54
|
-
export declare function normalize_to_scene(value: number, [min_val, max_val]: [number, number], scene_size: number): number;
|
|
53
|
+
export declare const span_or: (span: [number | null, number | null] | undefined, range: Vec2) => Vec2;
|
|
54
|
+
export declare function normalize_to_scene(value: number, [min_val, max_val]: Vec2, scene_size: number): number;
|
|
55
55
|
export declare function create_to_threejs(params: Scene3DParams): (user_x: number, user_y: number, user_z: number) => {
|
|
56
56
|
x: number;
|
|
57
57
|
y: number;
|
|
@@ -90,7 +90,9 @@ function clip_segment_to_rect(p1x, p1y, p2x, p2y, x_min, x_max, y_min, y_max) {
|
|
|
90
90
|
}
|
|
91
91
|
// Compute the screen coordinates for a reference line
|
|
92
92
|
// Returns [x1, y1, x2, y2] in pixel coordinates, or null if line is not visible
|
|
93
|
-
export function resolve_line_endpoints(ref_line,
|
|
93
|
+
export function resolve_line_endpoints(ref_line, bounds, scales) {
|
|
94
|
+
const { x_min, x_max, y_min, y_max } = bounds;
|
|
95
|
+
const { x_scale, x2_scale, y_scale, y2_scale } = scales;
|
|
94
96
|
// Determine which scales to use based on axis assignment
|
|
95
97
|
const active_x_scale = ref_line.x_axis === `x2` && x2_scale ? x2_scale : x_scale;
|
|
96
98
|
const active_y_scale = ref_line.y_axis === `y2` && y2_scale ? y2_scale : y_scale;
|
|
@@ -103,10 +105,8 @@ export function resolve_line_endpoints(ref_line, { x_min, x_max, y_min, y_max, }
|
|
|
103
105
|
// Relative to data coordinate conversion
|
|
104
106
|
const to_data_x = (rel) => x_min + rel * (x_max - x_min);
|
|
105
107
|
const to_data_y = (rel) => y_min + rel * (y_max - y_min);
|
|
106
|
-
let x1_data = 0;
|
|
107
|
-
let y1_data = 0;
|
|
108
|
-
let x2_data = 0;
|
|
109
|
-
let y2_data = 0;
|
|
108
|
+
let [x1_data, x2_data] = [0, 0];
|
|
109
|
+
let [y1_data, y2_data] = [0, 0];
|
|
110
110
|
const line_type = ref_line.type;
|
|
111
111
|
if (line_type === `horizontal`) {
|
|
112
112
|
const y_val = normalize_value(ref_line.y);
|
|
@@ -210,7 +210,7 @@ export function calculate_annotation_position(x1, y1, x2, y2, annotation) {
|
|
|
210
210
|
// Calculate base position with edge padding applied along line direction
|
|
211
211
|
const dx = x2 - x1;
|
|
212
212
|
const dy = y2 - y1;
|
|
213
|
-
const len = Math.
|
|
213
|
+
const len = Math.hypot(dx, dy);
|
|
214
214
|
let base_x = x1 + frac * dx;
|
|
215
215
|
let base_y = y1 + frac * dy;
|
|
216
216
|
// Apply edge padding to pull text slightly inward from plot boundaries
|
|
@@ -276,7 +276,7 @@ export function calculate_annotation_position(x1, y1, x2, y2, annotation) {
|
|
|
276
276
|
}
|
|
277
277
|
return { x: final_x, y: final_y, text_anchor, dominant_baseline, rotation };
|
|
278
278
|
}
|
|
279
|
-
|
|
279
|
+
// Apply span constraints or use full range as fallback
|
|
280
280
|
export const span_or = (span, range) => [span?.[0] ?? range[0], span?.[1] ?? range[1]];
|
|
281
281
|
// Normalize a data value to scene coordinates (centered around 0)
|
|
282
282
|
export function normalize_to_scene(value, [min_val, max_val], scene_size) {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Point, ScaleType, TimeInterval } from '..';
|
|
1
|
+
import type { Vec2 } from '../../math';
|
|
2
|
+
import type { ColorScaleConfig, Point, ScaleType, SizeScaleConfig, TimeInterval } from '..';
|
|
3
3
|
import type { ScaleContinuousNumeric, ScaleTime } from 'd3-scale';
|
|
4
4
|
export type TicksOption = number | number[] | TimeInterval | Record<number, string>;
|
|
5
5
|
export interface ArcsinhScale {
|
|
6
6
|
(value: number | Date): number;
|
|
7
|
-
domain():
|
|
8
|
-
domain(domain:
|
|
9
|
-
range():
|
|
10
|
-
range(range:
|
|
7
|
+
domain(): Vec2;
|
|
8
|
+
domain(domain: Vec2): ArcsinhScale;
|
|
9
|
+
range(): Vec2;
|
|
10
|
+
range(range: Vec2): ArcsinhScale;
|
|
11
11
|
invert(value: number): number;
|
|
12
12
|
copy(): ArcsinhScale;
|
|
13
13
|
ticks(count?: number): number[];
|
|
@@ -16,33 +16,48 @@ export interface ArcsinhScale {
|
|
|
16
16
|
export type PlotScaleFn = ScaleContinuousNumeric<number, number> | ScaleTime<number, number> | ArcsinhScale;
|
|
17
17
|
export declare function scale_arcsinh(threshold?: number): ArcsinhScale;
|
|
18
18
|
export declare function generate_arcsinh_ticks(min: number, max: number, threshold?: number, count?: number): number[];
|
|
19
|
-
export declare function create_scale(scale_type: ScaleType, domain:
|
|
20
|
-
export declare
|
|
21
|
-
|
|
19
|
+
export declare function create_scale(scale_type: ScaleType, domain: Vec2, output_range: Vec2): ScaleContinuousNumeric<number, number> | ArcsinhScale;
|
|
20
|
+
export declare function create_axis_scales<A extends {
|
|
21
|
+
scale_type?: ScaleType;
|
|
22
|
+
}>(axes: {
|
|
23
|
+
x: A;
|
|
24
|
+
x2: A;
|
|
25
|
+
y: A;
|
|
26
|
+
y2: A;
|
|
27
|
+
}, ranges: {
|
|
28
|
+
x: Vec2;
|
|
29
|
+
x2: Vec2;
|
|
30
|
+
y: Vec2;
|
|
31
|
+
y2: Vec2;
|
|
32
|
+
}, pad: {
|
|
33
|
+
l: number;
|
|
34
|
+
r: number;
|
|
35
|
+
t: number;
|
|
36
|
+
b: number;
|
|
37
|
+
}, width: number, height: number): {
|
|
38
|
+
x: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
|
|
39
|
+
x2: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
|
|
40
|
+
y: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
|
|
41
|
+
y2: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
|
|
42
|
+
};
|
|
43
|
+
export declare const create_time_scale: (domain: Vec2, output_range: Vec2) => ScaleTime<number, number, never>;
|
|
44
|
+
export declare function generate_ticks(domain: Vec2, scale_type: ScaleType, ticks_option: TicksOption | undefined, scale_fn: PlotScaleFn, // D3 scale function with .ticks() method
|
|
22
45
|
options?: {
|
|
23
46
|
format?: string;
|
|
24
47
|
default_count?: number;
|
|
25
48
|
interval_padding?: number;
|
|
26
49
|
}): number[];
|
|
27
|
-
export declare function calculate_domain(values: number[], scale_type?: ScaleType):
|
|
28
|
-
export declare function get_nice_data_range(points: Point[], get_value: (
|
|
50
|
+
export declare function calculate_domain(values: number[], scale_type?: ScaleType): Vec2;
|
|
51
|
+
export declare function get_nice_data_range(points: Point[], get_value: (point: Point) => number, limits: [number | null, number | null], scale_type: ScaleType, padding_factor: number, is_time?: boolean): Vec2;
|
|
29
52
|
export declare function generate_log_ticks(min: number, max: number, ticks_option?: TicksOption): number[];
|
|
30
53
|
export declare function get_tick_label(tick_value: number, ticks_option: TicksOption | undefined): string | null;
|
|
31
|
-
export declare function create_color_scale(color_scale_config: {
|
|
32
|
-
type?: ScaleType;
|
|
33
|
-
scheme?: D3ColorSchemeName | D3InterpolateName;
|
|
34
|
-
value_range?: [number, number];
|
|
35
|
-
} | string, auto_color_range: [number, number]): ((value: number) => string) & {
|
|
54
|
+
export declare function create_color_scale(color_scale_config: ColorScaleConfig | string, auto_color_range: Vec2): ((value: number) => string) & {
|
|
36
55
|
domain: {
|
|
37
|
-
():
|
|
38
|
-
(new_domain:
|
|
56
|
+
(): Vec2;
|
|
57
|
+
(new_domain: Vec2): ((value: number) => string) & /*elided*/ any;
|
|
39
58
|
};
|
|
40
59
|
};
|
|
41
|
-
export declare function create_size_scale(config: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
value_range?: [number, number];
|
|
45
|
-
}, all_size_values: (number | null)[]): import("d3-scale").ScaleLinear<number, number, never> | (((value: number) => number) & {
|
|
46
|
-
domain: () => [number, number];
|
|
47
|
-
range: () => [number, number];
|
|
60
|
+
export declare function create_size_scale(config: SizeScaleConfig, all_size_values: (number | null)[]): import("d3-scale").ScaleLinear<number, number, never> | (((value: number) => number) & {
|
|
61
|
+
domain: () => Vec2;
|
|
62
|
+
range: () => Vec2;
|
|
48
63
|
});
|
package/dist/plot/core/scales.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as math from '../../math';
|
|
2
|
-
import {
|
|
2
|
+
import { get_d3_interpolator } from '../../colors';
|
|
3
|
+
import { clamp01 } from '../../utils';
|
|
4
|
+
import { get_arcsinh_threshold, get_scale_type_name, is_time_scale, SCALE_DEFAULTS, } from './types';
|
|
3
5
|
import { extent, range } from 'd3-array';
|
|
4
6
|
import { scaleLinear, scaleLog, scaleSequential, scaleSequentialLog, scaleTime, } from 'd3-scale';
|
|
5
7
|
import * as d3_sc from 'd3-scale-chromatic';
|
|
@@ -33,8 +35,8 @@ export function scale_arcsinh(threshold = 1) {
|
|
|
33
35
|
// Linear interpolation in transformed space
|
|
34
36
|
if (t_max === t_min)
|
|
35
37
|
return (r_min + r_max) / 2;
|
|
36
|
-
const
|
|
37
|
-
return r_min +
|
|
38
|
+
const frac = (t_val - t_min) / (t_max - t_min);
|
|
39
|
+
return r_min + frac * (r_max - r_min);
|
|
38
40
|
});
|
|
39
41
|
// Domain getter/setter
|
|
40
42
|
scale.domain = function (domain) {
|
|
@@ -63,8 +65,8 @@ export function scale_arcsinh(threshold = 1) {
|
|
|
63
65
|
// Inverse linear interpolation
|
|
64
66
|
if (r_max === r_min)
|
|
65
67
|
return (d_min + d_max) / 2;
|
|
66
|
-
const
|
|
67
|
-
const t_val = t_min +
|
|
68
|
+
const frac = (value - r_min) / (r_max - r_min);
|
|
69
|
+
const t_val = t_min + frac * (t_max - t_min);
|
|
68
70
|
// Inverse transform
|
|
69
71
|
return sinh_transform(t_val);
|
|
70
72
|
};
|
|
@@ -188,6 +190,19 @@ export function create_scale(scale_type, domain, output_range) {
|
|
|
188
190
|
// For 'time' or 'linear', return linear scale (time scales need create_time_scale())
|
|
189
191
|
return scaleLinear().domain(domain).range(output_range);
|
|
190
192
|
}
|
|
193
|
+
// Build the four axis scales for a 2D plot in one call: x/x2 share the horizontal pixel span,
|
|
194
|
+
// y/y2 the inverted vertical one. Shared by BarPlot/BoxPlot/Histogram (identical layout math).
|
|
195
|
+
export function create_axis_scales(axes, ranges, pad, width, height) {
|
|
196
|
+
const x_px = [pad.l, width - pad.r];
|
|
197
|
+
const y_px = [height - pad.b, pad.t];
|
|
198
|
+
const scale = (axis, domain, px) => create_scale(axis.scale_type ?? `linear`, domain, px);
|
|
199
|
+
return {
|
|
200
|
+
x: scale(axes.x, ranges.x, x_px),
|
|
201
|
+
x2: scale(axes.x2, ranges.x2, x_px),
|
|
202
|
+
y: scale(axes.y, ranges.y, y_px),
|
|
203
|
+
y2: scale(axes.y2, ranges.y2, y_px),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
191
206
|
// Create a time scale for time-based data
|
|
192
207
|
export const create_time_scale = (domain, output_range) => scaleTime()
|
|
193
208
|
.domain([new Date(domain[0]), new Date(domain[1])])
|
|
@@ -224,15 +239,17 @@ options = {}) {
|
|
|
224
239
|
const ticks = time_scale.ticks(count);
|
|
225
240
|
if (typeof ticks_option === `string`) {
|
|
226
241
|
if (ticks_option === `month`) {
|
|
227
|
-
return ticks
|
|
242
|
+
return ticks
|
|
243
|
+
.filter((date) => date.getDate() === 1)
|
|
244
|
+
.map((date) => date.getTime());
|
|
228
245
|
}
|
|
229
246
|
if (ticks_option === `year`) {
|
|
230
247
|
return ticks
|
|
231
|
-
.filter((
|
|
232
|
-
.map((
|
|
248
|
+
.filter((date) => date.getMonth() === 0 && date.getDate() === 1)
|
|
249
|
+
.map((date) => date.getTime());
|
|
233
250
|
}
|
|
234
251
|
}
|
|
235
|
-
return ticks.map((
|
|
252
|
+
return ticks.map((date) => date.getTime());
|
|
236
253
|
}
|
|
237
254
|
const type_name = get_scale_type_name(scale_type);
|
|
238
255
|
// Log scale ticks
|
|
@@ -261,9 +278,13 @@ export function calculate_domain(values, scale_type = `linear`) {
|
|
|
261
278
|
if (min_val === undefined || max_val === undefined)
|
|
262
279
|
return [0, 1];
|
|
263
280
|
const type_name = get_scale_type_name(scale_type);
|
|
264
|
-
//
|
|
265
|
-
//
|
|
266
|
-
|
|
281
|
+
// log clamps to positive (arcsinh/linear take any value); clamp BOTH ends so all-negative
|
|
282
|
+
// data can't leave max <= the clamped min and invert/collapse the scale
|
|
283
|
+
if (type_name === `log`) {
|
|
284
|
+
const lo = Math.max(min_val, math.LOG_EPS);
|
|
285
|
+
return [lo, Math.max(max_val, lo)];
|
|
286
|
+
}
|
|
287
|
+
return [min_val, max_val];
|
|
267
288
|
}
|
|
268
289
|
// Advanced domain calculation with padding and nice boundaries (from ScatterPlot)
|
|
269
290
|
export function get_nice_data_range(points, get_value, limits, scale_type, padding_factor, is_time = false) {
|
|
@@ -272,6 +293,13 @@ export function get_nice_data_range(points, get_value, limits, scale_type, paddi
|
|
|
272
293
|
let data_min = min ?? min_ext ?? 0;
|
|
273
294
|
let data_max = max ?? max_ext ?? 1;
|
|
274
295
|
const type_name = get_scale_type_name(scale_type);
|
|
296
|
+
const can_snap_zero = min_ext !== undefined &&
|
|
297
|
+
max_ext !== undefined &&
|
|
298
|
+
min_ext < max_ext &&
|
|
299
|
+
!is_time &&
|
|
300
|
+
type_name !== `log`;
|
|
301
|
+
const snap_zero_min = can_snap_zero && min === null && min_ext === 0;
|
|
302
|
+
const snap_zero_max = can_snap_zero && max === null && max_ext === 0;
|
|
275
303
|
// Apply padding *only if* limits were NOT provided
|
|
276
304
|
if (min === null && max === null && points.length > 0) {
|
|
277
305
|
if (data_min !== data_max) {
|
|
@@ -337,7 +365,7 @@ export function get_nice_data_range(points, get_value, limits, scale_type, paddi
|
|
|
337
365
|
// Use D3's nice() to create pretty boundaries
|
|
338
366
|
// For arcsinh, we don't use D3's nice() - just return padded domain
|
|
339
367
|
if (type_name === `arcsinh`) {
|
|
340
|
-
return [data_min, data_max];
|
|
368
|
+
return [snap_zero_min ? 0 : data_min, snap_zero_max ? 0 : data_max];
|
|
341
369
|
}
|
|
342
370
|
// Create the scale with the *padded* data domain
|
|
343
371
|
const scale = type_name === `log`
|
|
@@ -348,7 +376,7 @@ export function get_nice_data_range(points, get_value, limits, scale_type, paddi
|
|
|
348
376
|
: scaleLinear().domain([data_min, data_max]);
|
|
349
377
|
scale.nice();
|
|
350
378
|
const [nice_min = data_min, nice_max = data_max] = scale.domain();
|
|
351
|
-
return [nice_min, nice_max];
|
|
379
|
+
return [snap_zero_min ? 0 : nice_min, snap_zero_max ? 0 : nice_max];
|
|
352
380
|
}
|
|
353
381
|
// Generate logarithmic ticks (from ScatterPlot)
|
|
354
382
|
export function generate_log_ticks(min, max, ticks_option) {
|
|
@@ -398,16 +426,16 @@ export function create_color_scale(color_scale_config, auto_color_range) {
|
|
|
398
426
|
const candidate_interpolator = Object.entries(d3_sc).find(([key]) => key === scheme)?.[1];
|
|
399
427
|
const interpolator = typeof candidate_interpolator === `function`
|
|
400
428
|
? candidate_interpolator
|
|
401
|
-
:
|
|
429
|
+
: get_d3_interpolator(SCALE_DEFAULTS.scheme);
|
|
402
430
|
const [min_val, max_val] = (typeof color_scale_config === `string` ? undefined : color_scale_config.value_range) ??
|
|
403
431
|
auto_color_range;
|
|
404
432
|
const scale_type = typeof color_scale_config === `string` ? undefined : color_scale_config.type;
|
|
405
433
|
const type_name = get_scale_type_name(scale_type);
|
|
406
434
|
if (type_name === `log`) {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
]);
|
|
435
|
+
// clamp both ends (like create_scale): all-negative data otherwise yields an inverted
|
|
436
|
+
// [LOG_EPS, max<0] domain that maps every input to undefined
|
|
437
|
+
const lo = Math.max(min_val, math.LOG_EPS);
|
|
438
|
+
return scaleSequentialLog(interpolator).domain([lo, Math.max(max_val, lo * 1.1)]);
|
|
411
439
|
}
|
|
412
440
|
if (type_name === `arcsinh`) {
|
|
413
441
|
// For arcsinh color scale, we create a custom scale that wraps the interpolator
|
|
@@ -434,7 +462,7 @@ function create_arcsinh_color_scale(interpolator, initial_domain, threshold) {
|
|
|
434
462
|
const t_val = Math.asinh(value / safe_threshold);
|
|
435
463
|
// Normalize to [0, 1]
|
|
436
464
|
const normalized = t_max === t_min ? 0.5 : (t_val - t_min) / (t_max - t_min);
|
|
437
|
-
return interpolator(
|
|
465
|
+
return interpolator(clamp01(normalized));
|
|
438
466
|
});
|
|
439
467
|
// Domain getter/setter for D3 compatibility - returns same scale instance
|
|
440
468
|
scale.domain = function (new_domain) {
|
|
@@ -447,7 +475,7 @@ function create_arcsinh_color_scale(interpolator, initial_domain, threshold) {
|
|
|
447
475
|
}
|
|
448
476
|
// Create a size scale function from configuration
|
|
449
477
|
export function create_size_scale(config, all_size_values) {
|
|
450
|
-
const [min_radius, max_radius] = config.radius_range ??
|
|
478
|
+
const [min_radius, max_radius] = config.radius_range ?? SCALE_DEFAULTS.radius;
|
|
451
479
|
const auto_range = all_size_values.length > 0
|
|
452
480
|
? extent(all_size_values.filter((val) => val !== null))
|
|
453
481
|
: [0, 1];
|
package/dist/plot/core/svg.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Vec2 } from '../../math';
|
|
2
|
+
export declare function violin_path(grid_px: readonly number[], half_offsets_px: readonly number[], center: number, side: `both` | `positive` | `negative`, orient: (cross: number, val: number) => Vec2): string;
|
|
2
3
|
export declare function bar_path(x: number, y: number, w: number, h: number, r: number, vertical?: boolean): string;
|