matterviz 0.3.7 → 0.4.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/dist/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +1 -1
- package/dist/api/optimade.js +32 -26
- package/dist/app.css +0 -3
- package/dist/brillouin/BrillouinZone.svelte +8 -3
- package/dist/brillouin/BrillouinZone.svelte.d.ts +2 -1
- package/dist/brillouin/BrillouinZoneScene.svelte +52 -6
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -0
- package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
- package/dist/brillouin/compute.js +10 -14
- package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +12 -15
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +8 -10
- package/dist/chempot-diagram/async-compute.svelte.js +3 -1
- package/dist/chempot-diagram/chempot-worker.js +2 -1
- package/dist/chempot-diagram/compute.d.ts +1 -1
- package/dist/chempot-diagram/compute.js +17 -19
- package/dist/colors/index.js +6 -5
- package/dist/composition/FormulaFilter.svelte +12 -6
- package/dist/composition/PieChart.svelte +6 -5
- package/dist/composition/chem-sys.d.ts +8 -0
- package/dist/composition/chem-sys.js +85 -0
- package/dist/composition/format.js +4 -2
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +1 -0
- package/dist/composition/parse.js +25 -13
- package/dist/convex-hull/ConvexHull2D.svelte +12 -10
- package/dist/convex-hull/ConvexHull3D.svelte +5 -5
- package/dist/convex-hull/ConvexHull4D.svelte +5 -9
- package/dist/convex-hull/ConvexHullStats.svelte +12 -12
- package/dist/convex-hull/GasPressureControls.svelte +4 -4
- package/dist/convex-hull/TemperatureSlider.svelte +2 -2
- package/dist/convex-hull/demo-temperature.d.ts +1 -1
- package/dist/convex-hull/demo-temperature.js +20 -22
- package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
- package/dist/convex-hull/gas-thermodynamics.js +22 -30
- package/dist/convex-hull/helpers.d.ts +3 -0
- package/dist/convex-hull/helpers.js +17 -9
- package/dist/convex-hull/index.d.ts +1 -1
- package/dist/convex-hull/thermodynamics.js +83 -78
- package/dist/convex-hull/types.d.ts +1 -1
- package/dist/coordination/CoordinationBarPlot.svelte +23 -23
- package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
- package/dist/element/ElementTile.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSlice.svelte +13 -5
- package/dist/fermi-surface/FermiSurface.svelte +11 -5
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +3 -0
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
- package/dist/fermi-surface/compute.js +59 -59
- package/dist/fermi-surface/export.js +3 -2
- package/dist/fermi-surface/parse.js +7 -4
- package/dist/fermi-surface/types.d.ts +1 -0
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +23 -21
- package/dist/heatmap-matrix/index.js +1 -1
- package/dist/io/decompress.js +4 -2
- package/dist/io/export.d.ts +4 -4
- package/dist/io/export.js +47 -25
- package/dist/io/fetch.js +5 -1
- package/dist/io/file-drop.d.ts +1 -1
- package/dist/io/file-drop.js +35 -36
- package/dist/io/url-drop.js +64 -33
- package/dist/isosurface/parse.js +6 -7
- package/dist/isosurface/slice.js +5 -4
- package/dist/isosurface/types.js +1 -1
- package/dist/keyboard.d.ts +3 -0
- package/dist/keyboard.js +23 -0
- package/dist/labels.d.ts +1 -1
- package/dist/labels.js +8 -7
- package/dist/layout/PropertyFilter.svelte +3 -2
- package/dist/layout/SettingsSection.svelte +1 -1
- package/dist/layout/json-tree/JsonNode.svelte +1 -1
- package/dist/layout/json-tree/JsonTree.svelte +2 -2
- package/dist/layout/json-tree/utils.js +5 -4
- package/dist/marching-cubes.js +8 -13
- package/dist/math.d.ts +5 -1
- package/dist/math.js +24 -9
- package/dist/overlays/DraggablePane.svelte +4 -4
- package/dist/periodic-table/PeriodicTable.svelte +20 -9
- package/dist/periodic-table/PropertySelect.svelte +1 -0
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
- package/dist/phase-diagram/build-diagram.js +2 -2
- package/dist/phase-diagram/parse.js +6 -5
- package/dist/phase-diagram/types.d.ts +1 -1
- package/dist/phase-diagram/utils.d.ts +3 -3
- package/dist/phase-diagram/utils.js +8 -12
- package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +229 -587
- package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +5 -5
- package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
- package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
- package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +6 -6
- package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
- package/dist/plot/bar/data.d.ts +40 -0
- package/dist/plot/bar/data.js +154 -0
- package/dist/plot/bar/geometry.d.ts +39 -0
- package/dist/plot/bar/geometry.js +60 -0
- package/dist/plot/bar/index.d.ts +3 -0
- package/dist/plot/bar/index.js +3 -0
- package/dist/plot/box/BoxPlot.svelte +1462 -0
- package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
- package/dist/plot/box/BoxPlotControls.svelte +109 -0
- package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
- package/dist/plot/box/Violin.svelte +14 -0
- package/dist/plot/box/Violin.svelte.d.ts +70 -0
- package/dist/plot/box/box-plot.d.ts +55 -0
- package/dist/plot/box/box-plot.js +126 -0
- package/dist/plot/box/index.d.ts +5 -0
- package/dist/plot/box/index.js +5 -0
- package/dist/plot/box/kde.d.ts +16 -0
- package/dist/plot/box/kde.js +160 -0
- package/dist/plot/box/quantile.d.ts +3 -0
- package/dist/plot/box/quantile.js +53 -0
- package/dist/plot/{auto-place.js → core/auto-place.js} +2 -2
- package/dist/plot/core/axis-utils.d.ts +46 -0
- package/dist/plot/core/axis-utils.js +110 -0
- package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
- package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
- package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +36 -33
- package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +2 -2
- package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
- package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
- package/dist/plot/core/components/ControlPane.svelte +46 -0
- package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
- package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
- package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
- package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
- package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
- package/dist/plot/{Line.svelte → core/components/Line.svelte} +30 -13
- package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +7 -5
- package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +3 -2
- package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
- package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
- package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
- package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
- package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
- package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
- package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
- package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
- package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
- package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +4 -4
- package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +2 -2
- package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +7 -7
- package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +2 -2
- package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
- package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
- package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
- package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
- package/dist/plot/core/components/index.d.ts +17 -0
- package/dist/plot/core/components/index.js +17 -0
- package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
- package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +3 -5
- package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
- package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
- package/dist/plot/core/fill-utils.d.ts +33 -0
- package/dist/plot/core/fill-utils.js +388 -0
- package/dist/plot/{hover-lock.svelte.js → core/hover-lock.svelte.js} +5 -6
- package/dist/plot/core/index.d.ts +10 -0
- package/dist/plot/core/index.js +11 -0
- package/dist/plot/core/interactions.d.ts +35 -0
- package/dist/plot/core/interactions.js +195 -0
- package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
- package/dist/plot/{layout.js → core/layout.js} +16 -8
- package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +1 -1
- package/dist/plot/{reference-line.js → core/reference-line.js} +23 -36
- package/dist/plot/{scales.d.ts → core/scales.d.ts} +2 -2
- package/dist/plot/{scales.js → core/scales.js} +84 -85
- package/dist/plot/core/svg.d.ts +2 -0
- package/dist/plot/core/svg.js +41 -0
- package/dist/plot/{types.d.ts → core/types.d.ts} +19 -79
- package/dist/plot/{types.js → core/types.js} +1 -1
- package/dist/plot/{utils → core/utils}/label-placement.d.ts +2 -2
- package/dist/plot/core/utils/series-visibility.d.ts +26 -0
- package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
- package/dist/plot/core/utils.d.ts +11 -0
- package/dist/plot/core/utils.js +27 -0
- package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +154 -294
- package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
- package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
- package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
- package/dist/plot/histogram/index.d.ts +2 -0
- package/dist/plot/histogram/index.js +2 -0
- package/dist/plot/index.d.ts +8 -41
- package/dist/plot/index.js +10 -39
- package/dist/plot/sankey/Sankey.svelte +700 -0
- package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
- package/dist/plot/sankey/SankeyControls.svelte +98 -0
- package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
- package/dist/plot/sankey/index.d.ts +4 -0
- package/dist/plot/sankey/index.js +3 -0
- package/dist/plot/sankey/sankey-types.d.ts +42 -0
- package/dist/plot/sankey/sankey-types.js +4 -0
- package/dist/plot/sankey/sankey.d.ts +52 -0
- package/dist/plot/sankey/sankey.js +187 -0
- package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +61 -59
- package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +4 -4
- package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
- package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
- package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +221 -642
- package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +7 -7
- package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
- package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +1 -1
- package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
- package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
- package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
- package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
- package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +3 -3
- package/dist/plot/scatter/index.d.ts +7 -0
- package/dist/plot/scatter/index.js +5 -0
- package/dist/plot/scatter/scatter-data.d.ts +19 -0
- package/dist/plot/scatter/scatter-data.js +212 -0
- package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +12 -10
- package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +7 -7
- package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +5 -4
- package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +2 -2
- package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +11 -11
- package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +3 -3
- package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +1 -1
- package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +1 -1
- package/dist/plot/scatter-3d/index.d.ts +4 -0
- package/dist/plot/scatter-3d/index.js +4 -0
- package/dist/plot/sunburst/Sunburst.svelte +1045 -0
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
- package/dist/plot/sunburst/SunburstControls.svelte +200 -0
- package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
- package/dist/plot/sunburst/index.d.ts +4 -0
- package/dist/plot/sunburst/index.js +4 -0
- package/dist/plot/sunburst/render.d.ts +34 -0
- package/dist/plot/sunburst/render.js +122 -0
- package/dist/plot/sunburst/sunburst.d.ts +62 -0
- package/dist/plot/sunburst/sunburst.js +266 -0
- package/dist/rdf/RdfPlot.svelte +2 -1
- package/dist/rdf/calc-rdf.js +11 -24
- package/dist/sanitize.js +1 -1
- package/dist/settings.d.ts +65 -1
- package/dist/settings.js +262 -0
- package/dist/spectral/Bands.svelte +39 -29
- package/dist/spectral/Bands.svelte.d.ts +3 -4
- package/dist/spectral/BandsAndDos.svelte +1 -1
- package/dist/spectral/BrillouinBandsDos.svelte +39 -27
- package/dist/spectral/Dos.svelte +10 -19
- package/dist/spectral/Dos.svelte.d.ts +2 -2
- package/dist/spectral/helpers.d.ts +3 -1
- package/dist/spectral/helpers.js +95 -29
- package/dist/structure/AtomLegend.svelte +8 -9
- package/dist/structure/CellSelect.svelte +1 -2
- package/dist/structure/Cylinder.svelte +12 -8
- package/dist/structure/Cylinder.svelte.d.ts +4 -1
- package/dist/structure/Structure.svelte +78 -72
- package/dist/structure/Structure.svelte.d.ts +1 -1
- package/dist/structure/StructureInfoPane.svelte +5 -6
- package/dist/structure/StructureScene.svelte +11 -10
- package/dist/structure/atom-properties.js +6 -6
- package/dist/structure/bond-order-perception.js +1 -1
- package/dist/structure/bonding.d.ts +1 -0
- package/dist/structure/bonding.js +43 -15
- package/dist/structure/export.js +27 -23
- package/dist/structure/index.d.ts +2 -4
- package/dist/structure/index.js +1 -3
- package/dist/structure/label-placement.js +4 -4
- package/dist/structure/measure.d.ts +3 -2
- package/dist/structure/measure.js +6 -5
- package/dist/structure/parse.js +121 -103
- package/dist/structure/pbc.js +4 -0
- package/dist/symmetry/SymmetryStats.svelte +2 -2
- package/dist/symmetry/index.d.ts +1 -1
- package/dist/symmetry/index.js +22 -24
- package/dist/symmetry/spacegroups.d.ts +7 -0
- package/dist/symmetry/spacegroups.js +48 -13
- package/dist/table/HeatmapTable.svelte +63 -11
- package/dist/table/HeatmapTable.svelte.d.ts +1 -1
- package/dist/table/index.d.ts +1 -3
- package/dist/table/index.js +1 -1
- package/dist/theme/index.js +8 -8
- package/dist/tooltip/KCoords.svelte +45 -0
- package/dist/tooltip/KCoords.svelte.d.ts +8 -0
- package/dist/tooltip/index.d.ts +1 -0
- package/dist/tooltip/index.js +1 -0
- package/dist/trajectory/Trajectory.svelte +66 -40
- package/dist/trajectory/Trajectory.svelte.d.ts +2 -1
- package/dist/trajectory/TrajectoryExportPane.svelte +2 -1
- package/dist/trajectory/TrajectoryInfoPane.svelte +2 -1
- package/dist/trajectory/format-detect.d.ts +1 -0
- package/dist/trajectory/format-detect.js +25 -11
- package/dist/trajectory/frame-reader.js +17 -50
- package/dist/trajectory/helpers.js +1 -1
- package/dist/trajectory/index.js +1 -1
- package/dist/trajectory/parse/hdf5.js +1 -1
- package/dist/trajectory/parse/index.js +14 -6
- package/dist/trajectory/parse/vasp.js +36 -17
- package/dist/trajectory/parse/xyz.d.ts +24 -0
- package/dist/trajectory/parse/xyz.js +102 -89
- package/dist/trajectory/plotting.d.ts +1 -1
- package/dist/trajectory/plotting.js +15 -15
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +6 -4
- package/dist/xrd/XrdPlot.svelte +2 -1
- package/dist/xrd/calc-xrd.js +15 -12
- package/dist/xrd/parse.js +2 -2
- package/package.json +22 -18
- package/dist/plot/PlotControls.svelte.d.ts +0 -4
- package/dist/plot/axis-utils.d.ts +0 -19
- package/dist/plot/axis-utils.js +0 -78
- package/dist/plot/defaults.d.ts +0 -19
- package/dist/plot/defaults.js +0 -9
- package/dist/plot/fill-utils.d.ts +0 -46
- package/dist/plot/fill-utils.js +0 -322
- package/dist/plot/interactions.d.ts +0 -12
- package/dist/plot/interactions.js +0 -101
- package/dist/plot/svg.d.ts +0 -1
- package/dist/plot/svg.js +0 -11
- package/dist/plot/utils/series-visibility.d.ts +0 -15
- package/dist/plot/utils.d.ts +0 -1
- package/dist/plot/utils.js +0 -14
- /package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +0 -0
- /package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +0 -0
- /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
- /package/dist/plot/{hover-lock.svelte.d.ts → core/hover-lock.svelte.d.ts} +0 -0
- /package/dist/plot/{utils → core/utils}/label-placement.js +0 -0
- /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Shared quantile + selection helpers used by box-plot.ts and kde.ts.
|
|
2
|
+
// quickselect partially sorts in place; quantile_unordered mutates its input
|
|
3
|
+
// (quantile_sorted assumes an already-ascending array and never mutates).
|
|
4
|
+
//
|
|
5
|
+
// Unguarded contract: quickselect, quantile_sorted and quantile_unordered all assume
|
|
6
|
+
// values.length > 0 and 0 <= p <= 1. Out-of-range inputs index past the array and
|
|
7
|
+
// yield undefined/NaN — callers (box-plot.ts, kde.ts) must length- and p-range-check
|
|
8
|
+
// before calling.
|
|
9
|
+
export function quickselect(values, kth) {
|
|
10
|
+
let left = 0;
|
|
11
|
+
let right = values.length - 1;
|
|
12
|
+
while (left < right) {
|
|
13
|
+
const pivot = values[(left + right) >>> 1];
|
|
14
|
+
let scan_lo = left;
|
|
15
|
+
let scan_hi = right;
|
|
16
|
+
while (scan_lo <= scan_hi) {
|
|
17
|
+
while (values[scan_lo] < pivot)
|
|
18
|
+
scan_lo++;
|
|
19
|
+
while (values[scan_hi] > pivot)
|
|
20
|
+
scan_hi--;
|
|
21
|
+
if (scan_lo <= scan_hi) {
|
|
22
|
+
const tmp = values[scan_lo];
|
|
23
|
+
values[scan_lo] = values[scan_hi];
|
|
24
|
+
values[scan_hi] = tmp;
|
|
25
|
+
scan_lo++;
|
|
26
|
+
scan_hi--;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (kth <= scan_hi)
|
|
30
|
+
right = scan_hi;
|
|
31
|
+
else if (kth >= scan_lo)
|
|
32
|
+
left = scan_lo;
|
|
33
|
+
else
|
|
34
|
+
return values[kth];
|
|
35
|
+
}
|
|
36
|
+
return values[kth];
|
|
37
|
+
}
|
|
38
|
+
export function quantile_sorted(values, p) {
|
|
39
|
+
const idx = (values.length - 1) * p;
|
|
40
|
+
const lo = Math.floor(idx);
|
|
41
|
+
const hi = Math.ceil(idx);
|
|
42
|
+
const frac = idx - lo;
|
|
43
|
+
const lo_val = values[lo];
|
|
44
|
+
return hi === lo ? lo_val : lo_val + (values[hi] - lo_val) * frac;
|
|
45
|
+
}
|
|
46
|
+
export function quantile_unordered(values, p) {
|
|
47
|
+
const idx = (values.length - 1) * p;
|
|
48
|
+
const lo = Math.floor(idx);
|
|
49
|
+
const hi = Math.ceil(idx);
|
|
50
|
+
const frac = idx - lo;
|
|
51
|
+
const lo_val = quickselect(values, lo);
|
|
52
|
+
return hi === lo ? lo_val : lo_val + (quickselect(values, hi) - lo_val) * frac;
|
|
53
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { compute_element_placement, sample_series_obstacle_points } from './layout';
|
|
1
|
+
import { compute_element_placement, sample_series_obstacle_points, } from './layout';
|
|
2
2
|
// Shared "move a decoration (legend/colorbar) outside the plot when interior overlap is
|
|
3
3
|
// unavoidable" logic, reused by every 2D plot (ScatterPlot/BarPlot/Histogram/BinnedScatterPlot).
|
|
4
4
|
export const DECOR_GAP = 8; // px gap between an outside decoration and the plot edge
|
|
@@ -55,7 +55,7 @@ export function clip_bar(vertical, cross, a, b) {
|
|
|
55
55
|
const CROWDING_RATIO = 0.5;
|
|
56
56
|
// True when even the best interior spot for `footprint` (px) is too dense to host the decoration
|
|
57
57
|
function is_crowded(obstacles, footprint, base_w, base_h, clearance) {
|
|
58
|
-
if (
|
|
58
|
+
if (obstacles.length === 0 || base_w <= 0 || base_h <= 0)
|
|
59
59
|
return false;
|
|
60
60
|
const fw = footprint.width / base_w;
|
|
61
61
|
const fh = footprint.height / base_h;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AxisConfig, AxisLoadError, BarSeries, DataLoaderFn, DataSeries } from './types';
|
|
2
|
+
export declare const AXIS_DEFAULTS: {
|
|
3
|
+
format: string;
|
|
4
|
+
scale_type: "linear";
|
|
5
|
+
ticks: number;
|
|
6
|
+
label_shift: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
};
|
|
10
|
+
tick: {
|
|
11
|
+
label: {
|
|
12
|
+
shift: {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
};
|
|
16
|
+
inside: boolean;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
range: [number | null, number | null];
|
|
20
|
+
};
|
|
21
|
+
type AxisType = `x` | `x2` | `y` | `y2`;
|
|
22
|
+
export declare function merge_series_state<T extends DataSeries | BarSeries>(old_series: T[], new_series: T[]): T[];
|
|
23
|
+
export interface AxisChangeState<T extends DataSeries | BarSeries> {
|
|
24
|
+
get_axis: (axis: AxisType) => AxisConfig;
|
|
25
|
+
set_axis: (axis: AxisType, config: AxisConfig) => void;
|
|
26
|
+
get_series: () => T[];
|
|
27
|
+
set_series: (series: T[]) => void;
|
|
28
|
+
get_loading: () => AxisType | null;
|
|
29
|
+
set_loading: (axis: AxisType | null) => void;
|
|
30
|
+
}
|
|
31
|
+
export declare const create_axis_change_handler: <T extends DataSeries | BarSeries>(state: AxisChangeState<T>, data_loader: DataLoaderFn<Record<string, unknown>, T> | undefined, on_axis_change?: (axis: AxisType, key: string, new_series: T[]) => void, on_error?: (error: AxisLoadError) => void) => ((axis: AxisType, key: string) => Promise<void>);
|
|
32
|
+
export declare function create_axis_loader<T extends DataSeries | BarSeries>(state: AxisChangeState<T>, get_props: () => {
|
|
33
|
+
data_loader?: DataLoaderFn<Record<string, unknown>, T>;
|
|
34
|
+
on_axis_change?: (axis: AxisType, key: string, new_series: T[]) => void;
|
|
35
|
+
on_error?: (error: AxisLoadError) => void;
|
|
36
|
+
}): {
|
|
37
|
+
handle_axis_change: (axis: AxisType, key: string) => Promise<void>;
|
|
38
|
+
try_auto_load: () => void;
|
|
39
|
+
};
|
|
40
|
+
export declare const AXIS_LABEL_CONTAINER: {
|
|
41
|
+
readonly width: 200;
|
|
42
|
+
readonly height: 24;
|
|
43
|
+
readonly x_offset: 100;
|
|
44
|
+
readonly y_offset: 12;
|
|
45
|
+
};
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Shared utilities for interactive axis functionality
|
|
2
|
+
import { to_error } from '../../utils';
|
|
3
|
+
// Shared axis defaults across plot components (single source of truth)
|
|
4
|
+
export const AXIS_DEFAULTS = {
|
|
5
|
+
format: ``,
|
|
6
|
+
scale_type: `linear`,
|
|
7
|
+
ticks: 5,
|
|
8
|
+
label_shift: { x: 0, y: 0 },
|
|
9
|
+
tick: { label: { shift: { x: 0, y: 0 }, inside: false } },
|
|
10
|
+
range: [null, null],
|
|
11
|
+
};
|
|
12
|
+
// Merge new series with preserved UI state from old series.
|
|
13
|
+
// Matches by stable id first, then by index only for ordered id-less series.
|
|
14
|
+
export function merge_series_state(old_series, new_series) {
|
|
15
|
+
// Build id lookup map for O(1) matching (string or number ids)
|
|
16
|
+
const by_id = new Map();
|
|
17
|
+
for (const srs of old_series) {
|
|
18
|
+
if (srs.id !== undefined && srs.id !== ``)
|
|
19
|
+
by_id.set(srs.id, srs);
|
|
20
|
+
}
|
|
21
|
+
return new_series.map((new_srs, idx) => {
|
|
22
|
+
const old_srs = new_srs.id !== undefined && new_srs.id !== `` ? by_id.get(new_srs.id) : old_series[idx];
|
|
23
|
+
if (!old_srs) {
|
|
24
|
+
return new_srs;
|
|
25
|
+
}
|
|
26
|
+
// Preserve UI state: visibility and styling from old series if not in new
|
|
27
|
+
const result = { ...new_srs };
|
|
28
|
+
result.visible ??= old_srs.visible;
|
|
29
|
+
// Preserve style properties only when key exists in BOTH series (guards against
|
|
30
|
+
// cross-type injection when T is a union like DataSeries | BarSeries)
|
|
31
|
+
for (const key of [`point_style`, `line_style`, `color`]) {
|
|
32
|
+
if (key in old_srs && key in new_srs && result[key] === undefined) {
|
|
33
|
+
result[key] = old_srs[key];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Handle axis property change - loads new data via data_loader
|
|
40
|
+
// Returns a function bound to the component's state accessors
|
|
41
|
+
export const create_axis_change_handler = (state, data_loader, on_axis_change, on_error) => async (axis, key) => {
|
|
42
|
+
if (!data_loader || state.get_loading())
|
|
43
|
+
return;
|
|
44
|
+
const axis_config = state.get_axis(axis);
|
|
45
|
+
const prev_key = axis_config.selected_key;
|
|
46
|
+
// Skip if key unchanged AND series already loaded (allows initial load when series empty)
|
|
47
|
+
if (prev_key === key && state.get_series().length > 0)
|
|
48
|
+
return;
|
|
49
|
+
// Update selected_key immediately for UI feedback
|
|
50
|
+
state.set_axis(axis, { ...axis_config, selected_key: key });
|
|
51
|
+
state.set_loading(axis);
|
|
52
|
+
try {
|
|
53
|
+
const result = await data_loader(axis, key, state.get_series());
|
|
54
|
+
// Merge new series with preserved state from old series
|
|
55
|
+
const merged = merge_series_state(state.get_series(), result.series);
|
|
56
|
+
state.set_series(merged);
|
|
57
|
+
// Update axis label/unit if provided
|
|
58
|
+
if (result.axis_label || result.axis_unit) {
|
|
59
|
+
const current = state.get_axis(axis);
|
|
60
|
+
state.set_axis(axis, {
|
|
61
|
+
...current,
|
|
62
|
+
label: result.axis_label ?? current.label,
|
|
63
|
+
unit: result.axis_unit ?? current.unit,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
on_axis_change?.(axis, key, merged);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error(`Failed to load data for ${axis}=${key}:`, err);
|
|
70
|
+
// Revert selection
|
|
71
|
+
state.set_axis(axis, { ...state.get_axis(axis), selected_key: prev_key });
|
|
72
|
+
const message = to_error(err).message;
|
|
73
|
+
on_error?.({ axis, key, message });
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
state.set_loading(null);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
// Bundle axis change handler with one-shot auto-load of the first axis option.
|
|
80
|
+
// get_props keeps callback props fresh; try_auto_load reads series/axis configs
|
|
81
|
+
// through state getters so a component `$effect(try_auto_load)` tracks them reactively.
|
|
82
|
+
export function create_axis_loader(state, get_props) {
|
|
83
|
+
let auto_load_attempted = false; // prevent infinite retries on failure
|
|
84
|
+
const handle_axis_change = (axis, key) => {
|
|
85
|
+
const { data_loader, on_axis_change, on_error } = get_props();
|
|
86
|
+
return create_axis_change_handler(state, data_loader, on_axis_change, on_error)(axis, key);
|
|
87
|
+
};
|
|
88
|
+
// Auto-load data if series is empty but options exist (runs once, x-axis first then y)
|
|
89
|
+
const try_auto_load = () => {
|
|
90
|
+
if (state.get_series().length > 0 || !get_props().data_loader || auto_load_attempted)
|
|
91
|
+
return;
|
|
92
|
+
for (const axis of [`x`, `y`]) {
|
|
93
|
+
const config = state.get_axis(axis);
|
|
94
|
+
if (config.options?.length) {
|
|
95
|
+
auto_load_attempted = true;
|
|
96
|
+
handle_axis_change(axis, config.selected_key ?? config.options[0].key).catch(() => { });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
return { handle_axis_change, try_auto_load };
|
|
102
|
+
}
|
|
103
|
+
// Constants for axis label foreignObject positioning (all values in px)
|
|
104
|
+
// Use minimal dimensions - overflow: visible handles any dropdown expansion
|
|
105
|
+
export const AXIS_LABEL_CONTAINER = {
|
|
106
|
+
width: 200, // container width for centering; dropdown can overflow
|
|
107
|
+
height: 24, // single line height; dropdown options overflow downward
|
|
108
|
+
x_offset: 100, // half of width for horizontal centering
|
|
109
|
+
y_offset: 12, // half of height for vertical centering
|
|
110
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { AXIS_LABEL_CONTAINER } from '
|
|
3
|
-
import type { AxisOption } from '
|
|
2
|
+
import { AXIS_LABEL_CONTAINER } from '../axis-utils'
|
|
3
|
+
import type { AxisOption } from '../types'
|
|
4
4
|
import InteractiveAxisLabel from './InteractiveAxisLabel.svelte'
|
|
5
5
|
|
|
6
6
|
let {
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { luminance } from '
|
|
3
|
-
import Spinner from '
|
|
4
|
-
import { format_num } from '
|
|
5
|
-
import { sanitize_html } from '
|
|
6
|
-
import type { Vec2 } from '
|
|
7
|
-
import * as math from '
|
|
2
|
+
import { luminance } from '../../../colors'
|
|
3
|
+
import Spinner from '../../../feedback/Spinner.svelte'
|
|
4
|
+
import { format_num } from '../../../labels'
|
|
5
|
+
import { sanitize_html } from '../../../sanitize'
|
|
6
|
+
import type { Vec2 } from '../../../math'
|
|
7
|
+
import * as math from '../../../math'
|
|
8
8
|
import { format } from 'd3-format'
|
|
9
9
|
import * as d3 from 'd3-scale'
|
|
10
10
|
import * as d3_sc from 'd3-scale-chromatic'
|
|
11
11
|
import { timeFormat } from 'd3-time-format'
|
|
12
12
|
import type { HTMLAttributes } from 'svelte/elements'
|
|
13
|
-
import type { D3InterpolateName } from '
|
|
13
|
+
import type { D3InterpolateName } from '../../../colors'
|
|
14
14
|
import PortalSelect from './PortalSelect.svelte'
|
|
15
|
-
import { generate_arcsinh_ticks, scale_arcsinh } from '
|
|
15
|
+
import { generate_arcsinh_ticks, scale_arcsinh } from '../scales'
|
|
16
16
|
import type {
|
|
17
17
|
AxisOption,
|
|
18
18
|
ColorBarDataLoaderFn,
|
|
19
19
|
ColorScaleOption,
|
|
20
20
|
Orientation,
|
|
21
21
|
ScaleType,
|
|
22
|
-
} from '
|
|
23
|
-
import { get_arcsinh_threshold, get_scale_type_name } from '
|
|
22
|
+
} from '../types'
|
|
23
|
+
import { get_arcsinh_threshold, get_scale_type_name } from '../types'
|
|
24
24
|
|
|
25
25
|
let {
|
|
26
26
|
title = $bindable(),
|
|
@@ -103,11 +103,11 @@
|
|
|
103
103
|
// If ticks are secondary (top), default label to bottom
|
|
104
104
|
if (orientation === `horizontal`) {
|
|
105
105
|
return tick_side === `primary` ? `top` : `bottom`
|
|
106
|
-
}
|
|
106
|
+
} // orientation === `vertical`
|
|
107
107
|
// If ticks are primary (right), default label to left
|
|
108
108
|
// If ticks are secondary (left), default label to right
|
|
109
109
|
return tick_side === `primary` ? `left` : `right`
|
|
110
|
-
|
|
110
|
+
|
|
111
111
|
})
|
|
112
112
|
|
|
113
113
|
// Number of ticks to generate
|
|
@@ -200,7 +200,7 @@
|
|
|
200
200
|
|
|
201
201
|
const power_of_10_ticks: number[] = []
|
|
202
202
|
for (let exp = start_exp; exp <= end_exp; exp++) {
|
|
203
|
-
power_of_10_ticks.push(
|
|
203
|
+
power_of_10_ticks.push(10 ** exp)
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
// Ensure domain endpoints are included if they are powers of 10 and missed by loop
|
|
@@ -225,27 +225,24 @@
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
return power_of_10_ticks
|
|
228
|
-
} else {
|
|
229
|
-
// Generate exactly n_ticks manually for log scale if not snapping
|
|
230
|
-
const log_min = Math.log10(scale_min)
|
|
231
|
-
const log_max = Math.log10(scale_max)
|
|
232
|
-
return [...Array(n_ticks).keys()].map((idx) => {
|
|
233
|
-
const fraction = idx / (n_ticks - 1)
|
|
234
|
-
const log_val = log_min + fraction * (log_max - log_min)
|
|
235
|
-
return Math.pow(10, log_val)
|
|
236
|
-
})
|
|
237
|
-
}
|
|
238
|
-
} else {
|
|
239
|
-
// Use D3's default nice ticks for linear scale
|
|
240
|
-
if (snap_ticks) return scale.ticks(n_ticks)
|
|
241
|
-
else {
|
|
242
|
-
// Generate exactly n_ticks evenly spaced linear ticks
|
|
243
|
-
return [...Array(n_ticks).keys()].map((idx) => {
|
|
244
|
-
const fraction = idx / (n_ticks - 1)
|
|
245
|
-
return scale_min + fraction * (scale_max - scale_min)
|
|
246
|
-
})
|
|
247
228
|
}
|
|
229
|
+
// Generate exactly n_ticks manually for log scale if not snapping
|
|
230
|
+
const log_min = Math.log10(scale_min)
|
|
231
|
+
const log_max = Math.log10(scale_max)
|
|
232
|
+
return [...Array(n_ticks).keys()].map((idx) => {
|
|
233
|
+
const fraction = idx / (n_ticks - 1)
|
|
234
|
+
const log_val = log_min + fraction * (log_max - log_min)
|
|
235
|
+
return 10 ** log_val
|
|
236
|
+
})
|
|
248
237
|
}
|
|
238
|
+
// Use D3's default nice ticks for linear scale
|
|
239
|
+
if (snap_ticks) return scale.ticks(n_ticks)
|
|
240
|
+
// Generate exactly n_ticks evenly spaced linear ticks
|
|
241
|
+
return [...Array(n_ticks).keys()].map((idx) => {
|
|
242
|
+
const fraction = idx / (n_ticks - 1)
|
|
243
|
+
return scale_min + fraction * (scale_max - scale_min)
|
|
244
|
+
})
|
|
245
|
+
|
|
249
246
|
})
|
|
250
247
|
|
|
251
248
|
// Update nice_range binding when snapping ticks
|
|
@@ -380,7 +377,7 @@
|
|
|
380
377
|
if (use_log_interp) {
|
|
381
378
|
data_value = log_span === 0
|
|
382
379
|
? adjusted_min_ramp
|
|
383
|
-
:
|
|
380
|
+
: 10 ** (log_min + fraction * log_span)
|
|
384
381
|
} else if (type_name === `arcsinh`) {
|
|
385
382
|
data_value = asinh_span === 0
|
|
386
383
|
? min_ramp_domain
|
|
@@ -644,6 +641,12 @@
|
|
|
644
641
|
display: var(--cbar-label-display);
|
|
645
642
|
align-items: center;
|
|
646
643
|
justify-content: center;
|
|
644
|
+
/* blur-only (no tint): invisible over uniform bg, smears busy bg to keep title readable */
|
|
645
|
+
background: var(--cbar-label-bg, transparent);
|
|
646
|
+
backdrop-filter: var(--cbar-label-backdrop-filter, blur(4px));
|
|
647
|
+
border-radius: var(--cbar-label-border-radius, var(--border-radius, 3pt));
|
|
648
|
+
/* keep title selectable/copyable */
|
|
649
|
+
user-select: text;
|
|
647
650
|
}
|
|
648
651
|
span.tick-label {
|
|
649
652
|
position: absolute;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
|
-
import type { AxisOption, ColorBarDataLoaderFn, ColorScaleOption, Orientation, ScaleType } from '
|
|
2
|
+
import type { AxisOption, ColorBarDataLoaderFn, ColorScaleOption, Orientation, ScaleType } from '../types';
|
|
3
3
|
type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
4
|
title?: string;
|
|
5
5
|
color_scale?: ((x: number) => string) | string | null;
|
|
@@ -26,6 +26,6 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
|
|
|
26
26
|
selected_color_scale_key?: string;
|
|
27
27
|
on_color_scale_change?: (key: string) => void;
|
|
28
28
|
};
|
|
29
|
-
declare const ColorBar: import("svelte").Component<$$ComponentProps, {}, "title" | "
|
|
29
|
+
declare const ColorBar: import("svelte").Component<$$ComponentProps, {}, "title" | "range" | "color_scale" | "tick_labels" | "nice_range" | "selected_property_key" | "selected_color_scale_key">;
|
|
30
30
|
type ColorBar = ReturnType<typeof ColorBar>;
|
|
31
31
|
export default ColorBar;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { ColorBar } from '
|
|
2
|
+
import { ColorBar } from '../..'
|
|
3
3
|
import * as d3_sc from 'd3-scale-chromatic'
|
|
4
4
|
import type { ComponentProps } from 'svelte'
|
|
5
5
|
import Select from 'svelte-multiselect'
|
|
6
|
-
import type { D3InterpolateName } from '
|
|
6
|
+
import type { D3InterpolateName } from '../../../colors'
|
|
7
7
|
|
|
8
8
|
let {
|
|
9
9
|
options = Object.keys(d3_sc).filter((key) =>
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
<Select
|
|
29
29
|
{options}
|
|
30
30
|
maxSelect={1}
|
|
31
|
+
maxOptions={options.length}
|
|
31
32
|
{minSelect}
|
|
32
33
|
bind:value
|
|
33
34
|
bind:selected
|
|
@@ -47,7 +48,7 @@
|
|
|
47
48
|
tick_labels={0}
|
|
48
49
|
title_side="left"
|
|
49
50
|
wrapper_style="width: 100%;"
|
|
50
|
-
title_style="width: 6em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left;"
|
|
51
|
+
title_style="width: 6em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; font-size: 0.9rem;"
|
|
51
52
|
{...colorbar}
|
|
52
53
|
/>
|
|
53
54
|
{/snippet}
|
package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ColorBar } from '
|
|
1
|
+
import { ColorBar } from '../..';
|
|
2
2
|
import type { ComponentProps } from 'svelte';
|
|
3
3
|
import Select from 'svelte-multiselect';
|
|
4
|
-
import type { D3InterpolateName } from '
|
|
4
|
+
import type { D3InterpolateName } from '../../../colors';
|
|
5
5
|
type $$ComponentProps = Omit<ComponentProps<typeof Select>, `options`> & {
|
|
6
6
|
options?: D3InterpolateName[];
|
|
7
7
|
value?: D3InterpolateName;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// Shared draggable controls-pane shell (gear toggle + settings pane) used by plot/diagram
|
|
3
|
+
// controls components. Centralizes the toggle/pane styling and the `*-controls-toggle` /
|
|
4
|
+
// `*-controls-pane` class convention so it lives in one place instead of being re-typed in
|
|
5
|
+
// every *Controls component (PlotControls, SankeyControls, ...).
|
|
6
|
+
import { DraggablePane } from '../../../overlays'
|
|
7
|
+
import type { Snippet } from 'svelte'
|
|
8
|
+
import type { HTMLAttributes } from 'svelte/elements'
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
controls_open = $bindable(false),
|
|
12
|
+
controls_class = `plot`,
|
|
13
|
+
title = controls_class || `plot`,
|
|
14
|
+
toggle_props = {},
|
|
15
|
+
pane_props = {},
|
|
16
|
+
children,
|
|
17
|
+
}: {
|
|
18
|
+
controls_open?: boolean
|
|
19
|
+
controls_class?: string // class prefix -> `${controls_class}-controls-{toggle,pane}`
|
|
20
|
+
title?: string // toggle button title text ("Open <title> controls")
|
|
21
|
+
toggle_props?: HTMLAttributes<HTMLButtonElement>
|
|
22
|
+
pane_props?: HTMLAttributes<HTMLDivElement>
|
|
23
|
+
children?: Snippet
|
|
24
|
+
} = $props()
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<DraggablePane
|
|
28
|
+
bind:show={controls_open}
|
|
29
|
+
closed_icon="Settings"
|
|
30
|
+
open_icon="Cross"
|
|
31
|
+
toggle_props={{
|
|
32
|
+
title: `${controls_open ? `Close` : `Open`} ${title} controls`,
|
|
33
|
+
...toggle_props,
|
|
34
|
+
class: `${controls_class}-controls-toggle ${toggle_props?.class ?? ``}`,
|
|
35
|
+
style:
|
|
36
|
+
`position: absolute; top: var(--ctrl-btn-top, 5pt); right: var(--ctrl-btn-right, 1ex);` +
|
|
37
|
+
(toggle_props?.style ?? ``),
|
|
38
|
+
}}
|
|
39
|
+
pane_props={{
|
|
40
|
+
...pane_props,
|
|
41
|
+
class: `${controls_class}-controls-pane ${pane_props?.class ?? ``}`,
|
|
42
|
+
style: `--pane-padding: 12px; --pane-gap: 4px; ${pane_props?.style ?? ``}`,
|
|
43
|
+
}}
|
|
44
|
+
>
|
|
45
|
+
{@render children?.()}
|
|
46
|
+
</DraggablePane>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
controls_open?: boolean;
|
|
5
|
+
controls_class?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
toggle_props?: HTMLAttributes<HTMLButtonElement>;
|
|
8
|
+
pane_props?: HTMLAttributes<HTMLDivElement>;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
};
|
|
11
|
+
declare const ControlPane: import("svelte").Component<$$ComponentProps, {}, "controls_open">;
|
|
12
|
+
type ControlPane = ReturnType<typeof ControlPane>;
|
|
13
|
+
export default ControlPane;
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
FillGradient,
|
|
9
9
|
FillHandlerEvent,
|
|
10
10
|
FillRegion,
|
|
11
|
-
} from '
|
|
11
|
+
} from '../types'
|
|
12
|
+
import { unique_id } from '../utils'
|
|
12
13
|
|
|
13
14
|
let {
|
|
14
15
|
region,
|
|
@@ -35,14 +36,17 @@
|
|
|
35
36
|
} = $props()
|
|
36
37
|
|
|
37
38
|
// Stable instance ID for gradient uniqueness (generated once per component instance)
|
|
38
|
-
const instance_id =
|
|
39
|
+
const instance_id = unique_id()
|
|
39
40
|
let gradient_id = $derived(
|
|
40
41
|
`fill-gradient-${region.id ?? region_idx}-${instance_id}`,
|
|
41
42
|
)
|
|
42
43
|
|
|
44
|
+
// On hover (without an explicit hover_style), noticeably raise opacity. A faint fill (e.g. a
|
|
45
|
+
// low-alpha rgba color at the default 0.3 fill-opacity) is otherwise nearly invisible, so a mere
|
|
46
|
+
// brightness filter reads as "no change". An explicit hover_style.fill_opacity always wins.
|
|
43
47
|
let effective_opacity = $derived(
|
|
44
|
-
is_hovered
|
|
45
|
-
? region.hover_style.fill_opacity
|
|
48
|
+
is_hovered
|
|
49
|
+
? region.hover_style?.fill_opacity ?? Math.min(1, (region.fill_opacity ?? 0.3) + 0.4)
|
|
46
50
|
: region.fill_opacity ?? 0.3,
|
|
47
51
|
)
|
|
48
52
|
let effective_fill = $derived(
|
|
@@ -53,6 +57,8 @@
|
|
|
53
57
|
let path_fill = $derived(
|
|
54
58
|
typeof effective_fill === `object` ? `url(#${gradient_id})` : effective_fill,
|
|
55
59
|
)
|
|
60
|
+
// outline drawn only on hover when the user opted in via hover_style.stroke
|
|
61
|
+
let hover_stroke = $derived(is_hovered ? region.hover_style?.stroke : undefined)
|
|
56
62
|
let is_clickable = $derived(Boolean(on_click || region.on_click))
|
|
57
63
|
let cursor_style = $derived(
|
|
58
64
|
region.hover_style?.cursor ?? (is_clickable ? `pointer` : `default`),
|
|
@@ -205,11 +211,16 @@
|
|
|
205
211
|
</defs>
|
|
206
212
|
{/if}
|
|
207
213
|
|
|
208
|
-
<!-- Main fill path
|
|
214
|
+
<!-- Main fill path. On hover the opacity boost (effective_opacity) highlights the area. We do NOT
|
|
215
|
+
stroke by default: a fill-between region is one closed polygon, so stroking traces its whole
|
|
216
|
+
perimeter (both boundaries + the straight closing edges), which looks messy and doesn't follow
|
|
217
|
+
the visible area. Users can still opt into an outline via hover_style.stroke. -->
|
|
209
218
|
<path
|
|
210
219
|
d={tweened_path.current}
|
|
211
220
|
fill={path_fill}
|
|
212
221
|
fill-opacity={effective_opacity}
|
|
222
|
+
stroke={hover_stroke ?? `none`}
|
|
223
|
+
stroke-width={hover_stroke ? region.hover_style?.stroke_width ?? 1.5 : 0}
|
|
213
224
|
/>
|
|
214
225
|
</g>
|
|
215
226
|
|
|
@@ -218,6 +229,6 @@
|
|
|
218
229
|
transition: opacity 0.15s ease;
|
|
219
230
|
}
|
|
220
231
|
.fill-region.hovered {
|
|
221
|
-
filter: brightness(1.1);
|
|
232
|
+
filter: brightness(1.35) saturate(1.2);
|
|
222
233
|
}
|
|
223
234
|
</style>
|
package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import Spinner from '
|
|
3
|
-
import { sanitize_html } from '
|
|
2
|
+
import Spinner from '../../../feedback/Spinner.svelte'
|
|
3
|
+
import { sanitize_html } from '../../../sanitize'
|
|
4
4
|
import PortalSelect from './PortalSelect.svelte'
|
|
5
|
-
import type { AxisOption } from '
|
|
5
|
+
import type { AxisOption } from '../types'
|
|
6
6
|
|
|
7
7
|
let {
|
|
8
8
|
label = ``,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AxisOption } from '
|
|
1
|
+
import type { AxisOption } from '../types';
|
|
2
2
|
type $$ComponentProps = {
|
|
3
3
|
label?: string;
|
|
4
4
|
options?: AxisOption[];
|
|
@@ -9,6 +9,6 @@ type $$ComponentProps = {
|
|
|
9
9
|
on_select?: (key: string) => void;
|
|
10
10
|
[key: string]: unknown;
|
|
11
11
|
};
|
|
12
|
-
declare const InteractiveAxisLabel: import("svelte").Component<$$ComponentProps, {}, "color" | "
|
|
12
|
+
declare const InteractiveAxisLabel: import("svelte").Component<$$ComponentProps, {}, "color" | "loading" | "selected_key">;
|
|
13
13
|
type InteractiveAxisLabel = ReturnType<typeof InteractiveAxisLabel>;
|
|
14
14
|
export default InteractiveAxisLabel;
|