matterviz 0.3.1 → 0.3.3
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 -2
- package/dist/FilePicker.svelte +154 -96
- package/dist/Icon.svelte +20 -14
- package/dist/MillerIndexInput.svelte +27 -21
- package/dist/api/optimade.js +6 -6
- package/dist/app.css +216 -178
- package/dist/brillouin/BrillouinZone.svelte +299 -198
- package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
- package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
- package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
- package/dist/brillouin/compute.js +11 -6
- package/dist/chempot-diagram/ChemPotDiagram.svelte +327 -0
- package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
- package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
- package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
- package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
- package/dist/chempot-diagram/async-compute.svelte.js +77 -0
- package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
- package/dist/chempot-diagram/chempot-worker.js +11 -0
- package/dist/chempot-diagram/color.d.ts +10 -0
- package/dist/chempot-diagram/color.js +32 -0
- package/dist/chempot-diagram/compute.d.ts +48 -0
- package/dist/chempot-diagram/compute.js +812 -0
- package/dist/chempot-diagram/index.d.ts +6 -0
- package/dist/chempot-diagram/index.js +6 -0
- package/dist/chempot-diagram/pointer.d.ts +16 -0
- package/dist/chempot-diagram/pointer.js +40 -0
- package/dist/chempot-diagram/temperature.d.ts +15 -0
- package/dist/chempot-diagram/temperature.js +36 -0
- package/dist/chempot-diagram/types.d.ts +86 -0
- package/dist/chempot-diagram/types.js +28 -0
- package/dist/colors/index.d.ts +3 -1
- package/dist/colors/index.js +9 -3
- package/dist/composition/BarChart.svelte +141 -77
- package/dist/composition/BubbleChart.svelte +107 -52
- package/dist/composition/Composition.svelte +100 -79
- package/dist/composition/Formula.svelte +108 -62
- package/dist/composition/FormulaFilter.svelte +973 -353
- package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
- package/dist/composition/PieChart.svelte +199 -99
- package/dist/composition/PieChart.svelte.d.ts +1 -1
- package/dist/composition/format.d.ts +5 -0
- package/dist/composition/format.js +20 -3
- package/dist/composition/parse.js +14 -9
- package/dist/convex-hull/ConvexHull.svelte +93 -38
- package/dist/convex-hull/ConvexHull2D.svelte +551 -393
- package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
- package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
- package/dist/convex-hull/ConvexHullControls.svelte +115 -28
- package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
- package/dist/convex-hull/ConvexHullStats.svelte +821 -249
- package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
- package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
- package/dist/convex-hull/GasPressureControls.svelte +104 -61
- package/dist/convex-hull/StructurePopup.svelte +25 -4
- package/dist/convex-hull/TemperatureSlider.svelte +45 -25
- package/dist/convex-hull/barycentric-coords.js +13 -7
- package/dist/convex-hull/demo-temperature.d.ts +6 -0
- package/dist/convex-hull/demo-temperature.js +40 -0
- package/dist/convex-hull/gas-thermodynamics.js +17 -12
- package/dist/convex-hull/helpers.d.ts +10 -1
- package/dist/convex-hull/helpers.js +79 -38
- package/dist/convex-hull/index.d.ts +1 -0
- package/dist/convex-hull/index.js +1 -0
- package/dist/convex-hull/thermodynamics.d.ts +8 -21
- package/dist/convex-hull/thermodynamics.js +163 -69
- package/dist/convex-hull/types.d.ts +12 -12
- package/dist/convex-hull/types.js +0 -12
- package/dist/coordination/CoordinationBarPlot.svelte +232 -176
- package/dist/element/BohrAtom.svelte +56 -13
- package/dist/element/ElementHeading.svelte +7 -2
- package/dist/element/ElementPhoto.svelte +15 -9
- package/dist/element/ElementStats.svelte +10 -4
- package/dist/element/ElementTile.svelte +137 -73
- package/dist/element/Nucleus.svelte +39 -11
- package/dist/element/data.js +2 -14
- package/dist/element/data.json.gz +0 -0
- package/dist/element/types.d.ts +1 -0
- package/dist/feedback/ClickFeedback.svelte +16 -5
- package/dist/feedback/DragOverlay.svelte +10 -2
- package/dist/feedback/Spinner.svelte +4 -2
- package/dist/feedback/StatusMessage.svelte +8 -2
- package/dist/fermi-surface/FermiSlice.svelte +118 -88
- package/dist/fermi-surface/FermiSurface.svelte +336 -239
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
- package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
- package/dist/fermi-surface/compute.js +16 -20
- package/dist/fermi-surface/parse.js +37 -33
- package/dist/fermi-surface/symmetry.js +2 -7
- package/dist/fermi-surface/types.d.ts +3 -5
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
- package/dist/heatmap-matrix/index.d.ts +53 -0
- package/dist/heatmap-matrix/index.js +100 -0
- package/dist/heatmap-matrix/shared.d.ts +2 -0
- package/dist/heatmap-matrix/shared.js +4 -0
- package/dist/icons.d.ts +111 -0
- package/dist/icons.js +158 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +5 -2
- package/dist/io/decompress.js +1 -1
- package/dist/io/export.d.ts +3 -0
- package/dist/io/export.js +138 -140
- package/dist/io/file-drop.d.ts +7 -0
- package/dist/io/file-drop.js +43 -0
- package/dist/io/index.d.ts +2 -2
- package/dist/io/index.js +2 -112
- package/dist/io/is-binary.js +2 -3
- package/dist/io/types.d.ts +1 -0
- package/dist/io/url-drop.d.ts +2 -0
- package/dist/io/url-drop.js +117 -0
- package/dist/isosurface/Isosurface.svelte +220 -110
- package/dist/isosurface/IsosurfaceControls.svelte +65 -28
- package/dist/isosurface/parse.js +104 -56
- package/dist/isosurface/slice.d.ts +2 -1
- package/dist/isosurface/slice.js +8 -13
- package/dist/isosurface/types.d.ts +14 -1
- package/dist/isosurface/types.js +152 -5
- package/dist/labels.d.ts +2 -1
- package/dist/labels.js +12 -8
- package/dist/layout/FullscreenToggle.svelte +11 -2
- package/dist/layout/InfoCard.svelte +38 -6
- package/dist/layout/InfoTag.svelte +125 -94
- package/dist/layout/PropertyFilter.svelte +82 -37
- package/dist/layout/SettingsSection.svelte +85 -55
- package/dist/layout/SubpageGrid.svelte +82 -0
- package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.js +1 -0
- package/dist/layout/json-tree/JsonNode.svelte +266 -223
- package/dist/layout/json-tree/JsonTree.svelte +516 -429
- package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
- package/dist/layout/json-tree/JsonValue.svelte +281 -173
- package/dist/layout/json-tree/types.d.ts +10 -2
- package/dist/layout/json-tree/utils.d.ts +2 -0
- package/dist/layout/json-tree/utils.js +37 -2
- package/dist/marching-cubes.js +25 -2
- package/dist/math.d.ts +20 -17
- package/dist/math.js +474 -57
- package/dist/overlays/ContextMenu.svelte +66 -40
- package/dist/overlays/DraggablePane.svelte +331 -154
- package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
- package/dist/periodic-table/PeriodicTable.svelte +278 -145
- package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
- package/dist/periodic-table/PropertySelect.svelte +25 -7
- package/dist/periodic-table/TableInset.svelte +8 -3
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
- package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
- package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
- package/dist/phase-diagram/build-diagram.js +9 -9
- package/dist/phase-diagram/colors.js +1 -3
- package/dist/phase-diagram/index.d.ts +2 -0
- package/dist/phase-diagram/index.js +2 -0
- package/dist/phase-diagram/parse.js +10 -9
- package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
- package/dist/phase-diagram/svg-to-diagram.js +869 -0
- package/dist/phase-diagram/types.d.ts +10 -0
- package/dist/phase-diagram/utils.d.ts +8 -4
- package/dist/phase-diagram/utils.js +219 -74
- package/dist/plot/AxisLabel.svelte +51 -0
- package/dist/plot/AxisLabel.svelte.d.ts +16 -0
- package/dist/plot/BarPlot.svelte +1461 -768
- package/dist/plot/BarPlot.svelte.d.ts +3 -3
- package/dist/plot/BarPlotControls.svelte +33 -6
- package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
- package/dist/plot/ColorBar.svelte +533 -383
- package/dist/plot/ColorBar.svelte.d.ts +1 -1
- package/dist/plot/ColorScaleSelect.svelte +28 -7
- package/dist/plot/ElementScatter.svelte +38 -16
- package/dist/plot/FillArea.svelte +152 -92
- package/dist/plot/Histogram.svelte +1162 -709
- package/dist/plot/Histogram.svelte.d.ts +1 -1
- package/dist/plot/HistogramControls.svelte +81 -18
- package/dist/plot/HistogramControls.svelte.d.ts +6 -2
- package/dist/plot/InteractiveAxisLabel.svelte +34 -11
- package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
- package/dist/plot/Line.svelte +63 -28
- package/dist/plot/PlotControls.svelte +221 -96
- package/dist/plot/PlotControls.svelte.d.ts +1 -1
- package/dist/plot/PlotLegend.svelte +174 -91
- package/dist/plot/PlotTooltip.svelte +45 -6
- package/dist/plot/PortalSelect.svelte +175 -146
- package/dist/plot/ReferenceLine.svelte +77 -22
- package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
- package/dist/plot/ReferenceLine3D.svelte +132 -107
- package/dist/plot/ReferencePlane.svelte +146 -123
- package/dist/plot/ScatterPlot.svelte +1880 -1156
- package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
- package/dist/plot/ScatterPlot3D.svelte +256 -131
- package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlot3DControls.svelte +300 -297
- package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
- package/dist/plot/ScatterPlot3DScene.svelte +608 -406
- package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlotControls.svelte +150 -70
- package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
- package/dist/plot/ScatterPoint.svelte +98 -26
- package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
- package/dist/plot/SpacegroupBarPlot.svelte +142 -85
- package/dist/plot/Surface3D.svelte +159 -108
- package/dist/plot/ZeroLines.svelte +96 -0
- package/dist/plot/ZeroLines.svelte.d.ts +32 -0
- package/dist/plot/ZoomRect.svelte +23 -0
- package/dist/plot/ZoomRect.svelte.d.ts +8 -0
- package/dist/plot/axis-utils.d.ts +1 -1
- package/dist/plot/axis-utils.js +1 -3
- package/dist/plot/data-cleaning.js +12 -28
- package/dist/plot/data-transform.js +2 -1
- package/dist/plot/fill-utils.js +2 -0
- package/dist/plot/index.d.ts +6 -2
- package/dist/plot/index.js +6 -2
- package/dist/plot/interactions.d.ts +8 -10
- package/dist/plot/interactions.js +2 -3
- package/dist/plot/layout.d.ts +11 -2
- package/dist/plot/layout.js +44 -17
- package/dist/plot/reference-line.d.ts +5 -22
- package/dist/plot/reference-line.js +12 -84
- package/dist/plot/scales.js +24 -36
- package/dist/plot/types.d.ts +53 -40
- package/dist/plot/types.js +12 -7
- package/dist/plot/utils/label-placement.d.ts +32 -15
- package/dist/plot/utils/label-placement.js +227 -63
- package/dist/plot/utils/series-visibility.js +2 -3
- package/dist/plot/utils.d.ts +1 -0
- package/dist/plot/utils.js +14 -0
- package/dist/rdf/RdfPlot.svelte +173 -132
- package/dist/rdf/calc-rdf.js +4 -5
- package/dist/sanitize.d.ts +4 -0
- package/dist/sanitize.js +107 -0
- package/dist/settings.d.ts +21 -6
- package/dist/settings.js +63 -19
- package/dist/spectral/Bands.svelte +963 -412
- package/dist/spectral/Bands.svelte.d.ts +22 -2
- package/dist/spectral/BandsAndDos.svelte +90 -49
- package/dist/spectral/BrillouinBandsDos.svelte +151 -93
- package/dist/spectral/Dos.svelte +389 -258
- package/dist/spectral/helpers.d.ts +23 -1
- package/dist/spectral/helpers.js +119 -51
- package/dist/spectral/types.d.ts +2 -0
- package/dist/state.svelte.d.ts +1 -1
- package/dist/state.svelte.js +3 -2
- package/dist/structure/Arrow.svelte +59 -20
- package/dist/structure/AtomLegend.svelte +231 -129
- package/dist/structure/AtomLegend.svelte.d.ts +1 -1
- package/dist/structure/Bond.svelte +73 -47
- package/dist/structure/CanvasTooltip.svelte +10 -2
- package/dist/structure/CellSelect.svelte +148 -51
- package/dist/structure/Cylinder.svelte +33 -17
- package/dist/structure/Lattice.svelte +88 -33
- package/dist/structure/Structure.svelte +1077 -821
- package/dist/structure/Structure.svelte.d.ts +1 -1
- package/dist/structure/StructureControls.svelte +373 -139
- package/dist/structure/StructureControls.svelte.d.ts +1 -1
- package/dist/structure/StructureExportPane.svelte +124 -89
- package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
- package/dist/structure/StructureInfoPane.svelte +304 -231
- package/dist/structure/StructureScene.svelte +919 -445
- package/dist/structure/StructureScene.svelte.d.ts +16 -7
- package/dist/structure/atom-properties.d.ts +6 -2
- package/dist/structure/atom-properties.js +42 -29
- package/dist/structure/bonding.js +6 -7
- package/dist/structure/export.js +22 -34
- package/dist/structure/ferrox-wasm-types.d.ts +3 -2
- package/dist/structure/ferrox-wasm-types.js +0 -3
- package/dist/structure/ferrox-wasm.d.ts +3 -2
- package/dist/structure/ferrox-wasm.js +2 -3
- package/dist/structure/index.d.ts +16 -0
- package/dist/structure/index.js +88 -6
- package/dist/structure/measure.d.ts +2 -2
- package/dist/structure/measure.js +4 -44
- package/dist/structure/parse.js +130 -155
- package/dist/structure/partial-occupancy.d.ts +25 -0
- package/dist/structure/partial-occupancy.js +99 -0
- package/dist/structure/pbc.d.ts +1 -0
- package/dist/structure/pbc.js +16 -6
- package/dist/structure/supercell.d.ts +2 -2
- package/dist/structure/supercell.js +12 -22
- package/dist/structure/validation.js +5 -3
- package/dist/symmetry/SymmetryStats.svelte +94 -37
- package/dist/symmetry/WyckoffTable.svelte +42 -14
- package/dist/symmetry/cell-transform.js +5 -3
- package/dist/symmetry/index.d.ts +7 -4
- package/dist/symmetry/index.js +87 -21
- package/dist/symmetry/spacegroups.js +148 -148
- package/dist/table/HeatmapTable.svelte +1112 -516
- package/dist/table/HeatmapTable.svelte.d.ts +12 -1
- package/dist/table/ToggleMenu.svelte +125 -90
- package/dist/table/index.d.ts +2 -0
- package/dist/table/index.js +2 -4
- package/dist/theme/ThemeControl.svelte +21 -12
- package/dist/time.js +4 -1
- package/dist/tooltip/TooltipContent.svelte +33 -8
- package/dist/trajectory/Trajectory.svelte +889 -687
- package/dist/trajectory/TrajectoryError.svelte +14 -3
- package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
- package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
- package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
- package/dist/trajectory/constants.d.ts +6 -0
- package/dist/trajectory/constants.js +7 -0
- package/dist/trajectory/extract.js +13 -31
- package/dist/trajectory/format-detect.d.ts +9 -0
- package/dist/trajectory/format-detect.js +76 -0
- package/dist/trajectory/frame-reader.d.ts +17 -0
- package/dist/trajectory/frame-reader.js +332 -0
- package/dist/trajectory/helpers.d.ts +14 -0
- package/dist/trajectory/helpers.js +172 -0
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +23 -14
- package/dist/trajectory/parse/ase.d.ts +2 -0
- package/dist/trajectory/parse/ase.js +77 -0
- package/dist/trajectory/parse/hdf5.d.ts +2 -0
- package/dist/trajectory/parse/hdf5.js +129 -0
- package/dist/trajectory/parse/index.d.ts +12 -0
- package/dist/trajectory/parse/index.js +299 -0
- package/dist/trajectory/parse/lammps.d.ts +5 -0
- package/dist/trajectory/parse/lammps.js +179 -0
- package/dist/trajectory/parse/vasp.d.ts +2 -0
- package/dist/trajectory/parse/vasp.js +68 -0
- package/dist/trajectory/parse/xyz.d.ts +2 -0
- package/dist/trajectory/parse/xyz.js +110 -0
- package/dist/trajectory/plotting.js +13 -8
- package/dist/trajectory/types.d.ts +11 -0
- package/dist/trajectory/types.js +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +17 -0
- package/dist/xrd/XrdPlot.svelte +337 -245
- package/dist/xrd/broadening.js +14 -9
- package/dist/xrd/calc-xrd.js +12 -19
- package/dist/xrd/parse.d.ts +1 -1
- package/dist/xrd/parse.js +17 -17
- package/package.json +103 -101
- package/readme.md +4 -4
- package/dist/trajectory/parse.d.ts +0 -42
- package/dist/trajectory/parse.js +0 -1267
- /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
- /package/dist/theme/{themes.js → themes.mjs} +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as ChemPotDiagram } from './ChemPotDiagram.svelte';
|
|
2
|
+
export { default as ChemPotDiagram2D } from './ChemPotDiagram2D.svelte';
|
|
3
|
+
export { default as ChemPotDiagram3D } from './ChemPotDiagram3D.svelte';
|
|
4
|
+
export { compute_chempot_async } from './async-compute.svelte';
|
|
5
|
+
export { compute_chempot_diagram, get_ternary_combinations } from './compute';
|
|
6
|
+
export * from './types';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as ChemPotDiagram } from './ChemPotDiagram.svelte';
|
|
2
|
+
export { default as ChemPotDiagram2D } from './ChemPotDiagram2D.svelte';
|
|
3
|
+
export { default as ChemPotDiagram3D } from './ChemPotDiagram3D.svelte';
|
|
4
|
+
export { compute_chempot_async } from './async-compute.svelte';
|
|
5
|
+
export { compute_chempot_diagram, get_ternary_combinations } from './compute';
|
|
6
|
+
export * from './types';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function get_pointer_coords(raw_event: unknown): {
|
|
2
|
+
clientX: number;
|
|
3
|
+
clientY: number;
|
|
4
|
+
} | null;
|
|
5
|
+
/** Convert pointer event to container-relative coords for tooltip placement. */
|
|
6
|
+
export declare function get_hover_pointer(raw_event: unknown, container_rect: DOMRect | null | undefined): {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
} | null;
|
|
10
|
+
/** Add hover pointer to an info object for tooltip placement. */
|
|
11
|
+
export declare function with_hover_pointer<T extends {
|
|
12
|
+
pointer?: {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
};
|
|
16
|
+
}>(info: Omit<T, `pointer`>, raw_event: unknown, container_rect: DOMRect | null | undefined): T;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Event/pointer normalization for hover tooltips.
|
|
2
|
+
// Handles DOM events and Threlte/Three.js event wrappers (nativeEvent, srcEvent).
|
|
3
|
+
const is_pointer_like_event = (event_val) => (typeof PointerEvent !== `undefined` && event_val instanceof PointerEvent) ||
|
|
4
|
+
(typeof MouseEvent !== `undefined` && event_val instanceof MouseEvent);
|
|
5
|
+
export function get_pointer_coords(raw_event) {
|
|
6
|
+
if (is_pointer_like_event(raw_event)) {
|
|
7
|
+
return raw_event;
|
|
8
|
+
}
|
|
9
|
+
if (!raw_event || typeof raw_event !== `object`)
|
|
10
|
+
return null;
|
|
11
|
+
const event_obj = raw_event;
|
|
12
|
+
if (is_pointer_like_event(event_obj.nativeEvent)) {
|
|
13
|
+
return event_obj.nativeEvent;
|
|
14
|
+
}
|
|
15
|
+
if (is_pointer_like_event(event_obj.srcEvent)) {
|
|
16
|
+
return event_obj.srcEvent;
|
|
17
|
+
}
|
|
18
|
+
const client_x = event_obj.clientX;
|
|
19
|
+
const client_y = event_obj.clientY;
|
|
20
|
+
if (typeof client_x === `number` && typeof client_y === `number`) {
|
|
21
|
+
return { clientX: client_x, clientY: client_y };
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/** Convert pointer event to container-relative coords for tooltip placement. */
|
|
26
|
+
export function get_hover_pointer(raw_event, container_rect) {
|
|
27
|
+
const pointer_event = get_pointer_coords(raw_event);
|
|
28
|
+
if (!pointer_event)
|
|
29
|
+
return null;
|
|
30
|
+
const offset_x = container_rect?.left ?? 0;
|
|
31
|
+
const offset_y = container_rect?.top ?? 0;
|
|
32
|
+
const x = pointer_event.clientX - offset_x + 4;
|
|
33
|
+
const y = pointer_event.clientY - offset_y + 4;
|
|
34
|
+
return { x, y };
|
|
35
|
+
}
|
|
36
|
+
/** Add hover pointer to an info object for tooltip placement. */
|
|
37
|
+
export function with_hover_pointer(info, raw_event, container_rect) {
|
|
38
|
+
const pointer = get_hover_pointer(raw_event, container_rect);
|
|
39
|
+
return { ...info, pointer: pointer ?? undefined };
|
|
40
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { PhaseData } from '../convex-hull/types';
|
|
2
|
+
import type { ChemPotDiagramConfig } from './types';
|
|
3
|
+
interface TempFilterProps {
|
|
4
|
+
interpolate_temperature?: boolean;
|
|
5
|
+
max_interpolation_gap?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface TempFilterPayload {
|
|
8
|
+
has_temp_data: boolean;
|
|
9
|
+
available_temperatures: number[];
|
|
10
|
+
temp_filtered_entries: PhaseData[];
|
|
11
|
+
}
|
|
12
|
+
export declare function get_projection_source_entries(entries: PhaseData[], temp_filtered_entries: PhaseData[]): PhaseData[];
|
|
13
|
+
export declare function get_temp_filter_payload(entries: PhaseData[], temperature: number | undefined, config: ChemPotDiagramConfig, props: TempFilterProps): TempFilterPayload;
|
|
14
|
+
export declare function get_valid_temperature(temperature: number | undefined, has_temp_data: boolean, available_temperatures: number[]): number | undefined;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { analyze_temperature_data, filter_entries_at_temperature, } from '../convex-hull/helpers';
|
|
2
|
+
import { CHEMPOT_DEFAULTS } from './types';
|
|
3
|
+
export function get_projection_source_entries(entries, temp_filtered_entries) {
|
|
4
|
+
return temp_filtered_entries.length > 0 ? temp_filtered_entries : entries;
|
|
5
|
+
}
|
|
6
|
+
const resolve_temp_filter_options = (config, props) => ({
|
|
7
|
+
interpolate: config.interpolate_temperature ??
|
|
8
|
+
props.interpolate_temperature ??
|
|
9
|
+
CHEMPOT_DEFAULTS.interpolate_temperature,
|
|
10
|
+
max_interpolation_gap: config.max_interpolation_gap ??
|
|
11
|
+
props.max_interpolation_gap ??
|
|
12
|
+
CHEMPOT_DEFAULTS.max_interpolation_gap,
|
|
13
|
+
});
|
|
14
|
+
export function get_temp_filter_payload(entries, temperature, config, props) {
|
|
15
|
+
const { has_temp_data, available_temperatures } = analyze_temperature_data(entries);
|
|
16
|
+
if (!has_temp_data || temperature === undefined) {
|
|
17
|
+
return { has_temp_data, available_temperatures, temp_filtered_entries: entries };
|
|
18
|
+
}
|
|
19
|
+
const filter_options = resolve_temp_filter_options(config, props);
|
|
20
|
+
const temp_filtered_entries = filter_entries_at_temperature(entries, temperature, filter_options);
|
|
21
|
+
return { has_temp_data, available_temperatures, temp_filtered_entries };
|
|
22
|
+
}
|
|
23
|
+
export function get_valid_temperature(temperature, has_temp_data, available_temperatures) {
|
|
24
|
+
if (!has_temp_data || available_temperatures.length === 0)
|
|
25
|
+
return temperature;
|
|
26
|
+
const min_temperature = available_temperatures[0];
|
|
27
|
+
const max_temperature = available_temperatures.at(-1) ?? min_temperature;
|
|
28
|
+
if (temperature === undefined)
|
|
29
|
+
return min_temperature;
|
|
30
|
+
if (available_temperatures.includes(temperature))
|
|
31
|
+
return temperature;
|
|
32
|
+
if (temperature >= min_temperature && temperature <= max_temperature) {
|
|
33
|
+
return temperature;
|
|
34
|
+
}
|
|
35
|
+
return min_temperature;
|
|
36
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { D3InterpolateName } from '../colors';
|
|
2
|
+
import type { PhaseData } from '../convex-hull/types';
|
|
3
|
+
export type ChemPotLimits = Partial<Record<string, [number, number]>>;
|
|
4
|
+
export type ChemPotColorMode = `none` | `energy` | `formation_energy` | `arity` | `entries`;
|
|
5
|
+
export type ChemPotProjectionMode = `single` | `grid`;
|
|
6
|
+
export interface ChemPotDiagramConfig {
|
|
7
|
+
formal_chempots?: boolean;
|
|
8
|
+
default_min_limit?: number;
|
|
9
|
+
element_padding?: number;
|
|
10
|
+
label_stable?: boolean;
|
|
11
|
+
elements?: string[];
|
|
12
|
+
limits?: ChemPotLimits;
|
|
13
|
+
formulas_to_draw?: string[];
|
|
14
|
+
draw_formula_meshes?: boolean;
|
|
15
|
+
draw_formula_lines?: boolean;
|
|
16
|
+
formula_colors?: string[];
|
|
17
|
+
show_tooltip?: boolean;
|
|
18
|
+
tooltip_detail_level?: `compact` | `detailed`;
|
|
19
|
+
color_mode?: ChemPotColorMode;
|
|
20
|
+
color_scale?: D3InterpolateName;
|
|
21
|
+
reverse_color_scale?: boolean;
|
|
22
|
+
interpolate_temperature?: boolean;
|
|
23
|
+
max_interpolation_gap?: number;
|
|
24
|
+
projection_mode?: ChemPotProjectionMode;
|
|
25
|
+
}
|
|
26
|
+
export interface ChemPotDiagramData {
|
|
27
|
+
domains: Record<string, number[][]>;
|
|
28
|
+
elements: string[];
|
|
29
|
+
el_refs: Record<string, PhaseData>;
|
|
30
|
+
min_entries: PhaseData[];
|
|
31
|
+
hyperplanes: number[][];
|
|
32
|
+
hyperplane_entries: PhaseData[];
|
|
33
|
+
lims: [number, number][];
|
|
34
|
+
}
|
|
35
|
+
export interface ChemPotHoverPointer {
|
|
36
|
+
x: number;
|
|
37
|
+
y: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ChemPotHoverInfoBase {
|
|
40
|
+
formula: string;
|
|
41
|
+
view: `2d` | `3d`;
|
|
42
|
+
pointer?: ChemPotHoverPointer;
|
|
43
|
+
}
|
|
44
|
+
export interface AxisRangeData {
|
|
45
|
+
element: string;
|
|
46
|
+
min_val: number;
|
|
47
|
+
max_val: number;
|
|
48
|
+
}
|
|
49
|
+
export interface ChemPotHoverInfo2D extends ChemPotHoverInfoBase {
|
|
50
|
+
view: `2d`;
|
|
51
|
+
n_points: number;
|
|
52
|
+
axis_ranges: AxisRangeData[];
|
|
53
|
+
}
|
|
54
|
+
export interface ChemPotHoverInfo3D extends ChemPotHoverInfoBase {
|
|
55
|
+
view: `3d`;
|
|
56
|
+
n_vertices: number;
|
|
57
|
+
n_edges: number;
|
|
58
|
+
n_points: number;
|
|
59
|
+
ann_loc: number[];
|
|
60
|
+
axis_ranges: AxisRangeData[];
|
|
61
|
+
touches_limits: string[];
|
|
62
|
+
is_elemental: boolean;
|
|
63
|
+
is_draw_formula: boolean;
|
|
64
|
+
matching_entry_count: number;
|
|
65
|
+
min_energy_per_atom: number | null;
|
|
66
|
+
max_energy_per_atom: number | null;
|
|
67
|
+
neighbors: string[];
|
|
68
|
+
}
|
|
69
|
+
export type ChemPotHoverInfo = ChemPotHoverInfo2D | ChemPotHoverInfo3D;
|
|
70
|
+
export declare const CHEMPOT_DEFAULTS: {
|
|
71
|
+
readonly formal_chempots: true;
|
|
72
|
+
readonly default_min_limit: -50;
|
|
73
|
+
readonly element_padding: 1;
|
|
74
|
+
readonly label_stable: true;
|
|
75
|
+
readonly draw_formula_meshes: true;
|
|
76
|
+
readonly draw_formula_lines: true;
|
|
77
|
+
readonly show_tooltip: true;
|
|
78
|
+
readonly tooltip_detail_level: "detailed";
|
|
79
|
+
readonly color_mode: ChemPotColorMode;
|
|
80
|
+
readonly color_scale: D3InterpolateName;
|
|
81
|
+
readonly reverse_color_scale: true;
|
|
82
|
+
readonly interpolate_temperature: true;
|
|
83
|
+
readonly max_interpolation_gap: 500;
|
|
84
|
+
readonly projection_mode: ChemPotProjectionMode;
|
|
85
|
+
readonly formula_colors: readonly ["#1b9e77", "#d95f02", "#7570b3", "#e7298a", "#66a61e", "#e6ab02", "#a6761d", "#666666"];
|
|
86
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Default configuration values
|
|
2
|
+
export const CHEMPOT_DEFAULTS = {
|
|
3
|
+
formal_chempots: true,
|
|
4
|
+
default_min_limit: -50,
|
|
5
|
+
element_padding: 1.0,
|
|
6
|
+
label_stable: true,
|
|
7
|
+
draw_formula_meshes: true,
|
|
8
|
+
draw_formula_lines: true,
|
|
9
|
+
show_tooltip: true,
|
|
10
|
+
tooltip_detail_level: `detailed`,
|
|
11
|
+
color_mode: `formation_energy`,
|
|
12
|
+
color_scale: `interpolateSpectral`,
|
|
13
|
+
reverse_color_scale: true,
|
|
14
|
+
interpolate_temperature: true,
|
|
15
|
+
max_interpolation_gap: 500,
|
|
16
|
+
projection_mode: `single`,
|
|
17
|
+
// Dark2 qualitative palette (same as pymatgen/plotly default)
|
|
18
|
+
formula_colors: [
|
|
19
|
+
`#1b9e77`,
|
|
20
|
+
`#d95f02`,
|
|
21
|
+
`#7570b3`,
|
|
22
|
+
`#e7298a`,
|
|
23
|
+
`#66a61e`,
|
|
24
|
+
`#e6ab02`,
|
|
25
|
+
`#a6761d`,
|
|
26
|
+
`#666666`,
|
|
27
|
+
],
|
|
28
|
+
};
|
package/dist/colors/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as d3_sc from 'd3-scale-chromatic';
|
|
2
|
+
import type { Vec3 } from '../math';
|
|
2
3
|
import type { ELEM_SYMBOLS } from '../labels';
|
|
3
4
|
export type D3InterpolateName = keyof typeof d3_sc & `interpolate${string}`;
|
|
4
5
|
export type D3ColorSchemeName = D3InterpolateName extends `interpolate${infer Name}` ? Name : never;
|
|
6
|
+
export declare const get_d3_interpolator: (name: D3InterpolateName) => ((t: number) => string);
|
|
5
7
|
export declare const COLOR_SCALE_TYPES: readonly ["continuous", "categorical"];
|
|
6
8
|
export type ColorScaleType = (typeof COLOR_SCALE_TYPES)[number];
|
|
7
9
|
export declare const DEFAULT_CATEGORY_COLORS: Record<string, string>;
|
|
8
10
|
export declare const AXIS_COLORS: readonly [readonly ["x", "#d75555", "#e66666"], readonly ["y", "#55b855", "#66c966"], readonly ["z", "#5555d7", "#6666e6"]];
|
|
9
11
|
export declare const NEG_AXIS_COLORS: readonly [readonly ["nx", "#b84444", "#cc5555"], readonly ["ny", "#44a044", "#55b155"], readonly ["nz", "#4444b8", "#5555c9"]];
|
|
10
|
-
export type RGBColor =
|
|
12
|
+
export type RGBColor = Vec3;
|
|
11
13
|
export type ElementColorScheme = Record<(typeof ELEM_SYMBOLS)[number], RGBColor>;
|
|
12
14
|
export declare const vesta_hex: Record<string, string>;
|
|
13
15
|
export declare const jmol_hex: Record<string, string>;
|
package/dist/colors/index.js
CHANGED
|
@@ -6,6 +6,10 @@ import jmol_colors from './jmol-colors.json' with { type: 'json' };
|
|
|
6
6
|
import muted_colors from './muted-colors.json' with { type: 'json' };
|
|
7
7
|
import pastel_colors from './pastel-colors.json' with { type: 'json' };
|
|
8
8
|
import vesta_colors from './vesta-colors.json' with { type: 'json' };
|
|
9
|
+
export const get_d3_interpolator = (name) => {
|
|
10
|
+
const candidate = d3_sc[name];
|
|
11
|
+
return typeof candidate === `function` ? candidate : d3_sc.interpolateViridis;
|
|
12
|
+
};
|
|
9
13
|
export const COLOR_SCALE_TYPES = [`continuous`, `categorical`];
|
|
10
14
|
// color values have to be in hex format since that's the only format
|
|
11
15
|
// <input type="color"> supports
|
|
@@ -57,10 +61,10 @@ export const is_color = (val) => {
|
|
|
57
61
|
return false;
|
|
58
62
|
// Check for hex colors, rgb/rgba, hsl/hsla, color(), var(), and named colors
|
|
59
63
|
// Exclude incomplete function prefixes like 'rgb', 'hsl', 'var', 'color'
|
|
60
|
-
return /^(#[0-9a-f]{3,8}|rgba?\([^)]+\)|hsla?\([^)]+\)|color\([^)]+\)|var\([^)]+\)|(?!rgb$|hsl$|var$|color$)[a-z]+)$/i
|
|
61
|
-
.test(val.toString().trim());
|
|
64
|
+
return /^(#[0-9a-f]{3,8}|rgba?\([^)]+\)|hsla?\([^)]+\)|color\([^)]+\)|var\([^)]+\)|(?!rgb$|hsl$|var$|color$)[a-z]+)$/i.test(val.trim());
|
|
62
65
|
};
|
|
63
66
|
export const PLOT_COLORS = [
|
|
67
|
+
// Color series for e.g. line plots
|
|
64
68
|
`#63b3ed`,
|
|
65
69
|
`#68d391`,
|
|
66
70
|
`#fbd38d`,
|
|
@@ -129,7 +133,9 @@ export function is_dark_mode() {
|
|
|
129
133
|
if (stored === `dark` || stored === `light`)
|
|
130
134
|
return stored === `dark`;
|
|
131
135
|
}
|
|
132
|
-
catch {
|
|
136
|
+
catch {
|
|
137
|
+
/* localStorage throws in private browsing mode */
|
|
138
|
+
}
|
|
133
139
|
return globalThis.matchMedia?.(`(prefers-color-scheme: dark)`).matches ?? false;
|
|
134
140
|
}
|
|
135
141
|
// Watch for dark mode changes and call callback on each change. Returns cleanup function.
|
|
@@ -1,73 +1,143 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ColorSchemeName } from '../colors'
|
|
3
|
+
import { ELEMENT_COLOR_SCHEMES, pick_contrast_color } from '../colors'
|
|
4
|
+
import type { CompositionType } from './'
|
|
5
|
+
import type { ElementSymbol } from '../element'
|
|
6
|
+
import { format_num } from '../labels'
|
|
7
|
+
import type { Snippet } from 'svelte'
|
|
8
|
+
import type { SVGAttributes } from 'svelte/elements'
|
|
9
|
+
import { type ChartSegmentData, get_chart_font_scale } from './index'
|
|
10
|
+
import { fractional_composition } from './parse'
|
|
11
|
+
|
|
12
|
+
type BarSegmentData = ChartSegmentData & {
|
|
13
|
+
x: number
|
|
14
|
+
width: number
|
|
15
|
+
can_show_label: boolean
|
|
16
|
+
needs_external_label: boolean
|
|
17
|
+
external_label_position: `above` | `below` | null
|
|
18
|
+
label_x: number
|
|
19
|
+
label_y: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let {
|
|
23
|
+
composition,
|
|
24
|
+
size = 200,
|
|
25
|
+
bar_height = 30,
|
|
26
|
+
label_height = 20,
|
|
27
|
+
gap = 2,
|
|
28
|
+
min_segment_size_for_label = 15,
|
|
29
|
+
thin_segment_threshold = 0.2,
|
|
30
|
+
external_label_size_threshold = 5,
|
|
31
|
+
outer_corners_only = true,
|
|
32
|
+
show_labels = true,
|
|
33
|
+
show_percentages = false,
|
|
34
|
+
show_amounts = true,
|
|
35
|
+
color_scheme = `Vesta`,
|
|
36
|
+
segment_content,
|
|
37
|
+
interactive = true,
|
|
38
|
+
svg_node = $bindable(null),
|
|
39
|
+
children,
|
|
40
|
+
...rest
|
|
41
|
+
}: SVGAttributes<SVGSVGElement> & {
|
|
42
|
+
composition: CompositionType
|
|
43
|
+
size?: number
|
|
44
|
+
bar_height?: number
|
|
45
|
+
label_height?: number
|
|
46
|
+
gap?: number
|
|
47
|
+
min_segment_size_for_label?: number
|
|
48
|
+
thin_segment_threshold?: number
|
|
49
|
+
external_label_size_threshold?: number
|
|
50
|
+
outer_corners_only?: boolean
|
|
51
|
+
show_labels?: boolean
|
|
52
|
+
show_percentages?: boolean
|
|
53
|
+
show_amounts?: boolean
|
|
54
|
+
color_scheme?: ColorSchemeName
|
|
55
|
+
segment_content?: Snippet<[BarSegmentData]>
|
|
56
|
+
interactive?: boolean
|
|
57
|
+
svg_node?: SVGSVGElement | null
|
|
58
|
+
children?: Snippet<[{ hovered_element: ElementSymbol | null }]>
|
|
59
|
+
} = $props()
|
|
60
|
+
|
|
61
|
+
let element_colors = $derived(
|
|
62
|
+
ELEMENT_COLOR_SCHEMES[color_scheme] || ELEMENT_COLOR_SCHEMES.Vesta,
|
|
63
|
+
)
|
|
64
|
+
let fractions = $derived(fractional_composition(composition))
|
|
65
|
+
|
|
66
|
+
let svg_height = $derived(label_height + gap + bar_height + gap + label_height)
|
|
67
|
+
let bar_y = $derived(label_height + gap)
|
|
68
|
+
let above_labels_y = $derived(label_height / 2)
|
|
69
|
+
let below_labels_y = $derived(
|
|
70
|
+
label_height + gap + bar_height + gap + label_height / 2,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
let segments = $derived.by(() => {
|
|
74
|
+
const element_entries = Object.entries(composition).filter(([_, amount]) =>
|
|
75
|
+
amount && amount > 0
|
|
76
|
+
) as [ElementSymbol, number][]
|
|
77
|
+
if (element_entries.length === 0) return []
|
|
78
|
+
|
|
79
|
+
let [current_x, above_labels, below_labels] = [0, 0, 0]
|
|
80
|
+
|
|
17
81
|
return element_entries.map(([element, amount]) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
82
|
+
const fraction = fractions[element] || 0
|
|
83
|
+
const color = element_colors[element] || `#cccccc`
|
|
84
|
+
const width = fraction * size
|
|
85
|
+
const x = current_x
|
|
86
|
+
current_x += width
|
|
87
|
+
|
|
88
|
+
const segment_size = Math.min(width, size)
|
|
89
|
+
const base_scale = Math.min(2, Math.max(1, segment_size / 40))
|
|
90
|
+
const label_text = element + (show_amounts ? amount?.toString() ?? `` : ``) +
|
|
91
|
+
(show_percentages ? `${format_num(fraction, `.1~%`)}` : ``)
|
|
92
|
+
const font_scale = get_chart_font_scale(
|
|
93
|
+
base_scale,
|
|
94
|
+
label_text,
|
|
95
|
+
segment_size * 0.9,
|
|
96
|
+
0.6,
|
|
97
|
+
12,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
// Label positioning
|
|
101
|
+
const can_show_label = segment_size >= min_segment_size_for_label
|
|
102
|
+
const is_thin = fraction < thin_segment_threshold
|
|
103
|
+
const can_show_external_label = segment_size >= external_label_size_threshold
|
|
104
|
+
const needs_external_label = is_thin && can_show_external_label
|
|
105
|
+
|
|
106
|
+
let external_label_position: `above` | `below` | null = null
|
|
107
|
+
if (needs_external_label) {
|
|
108
|
+
external_label_position = above_labels <= below_labels ? `above` : `below`
|
|
109
|
+
if (external_label_position === `above`) above_labels++
|
|
110
|
+
else below_labels++
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const text_color = pick_contrast_color({ bg_color: color })
|
|
114
|
+
const label_props = {
|
|
115
|
+
font_scale,
|
|
116
|
+
text_color,
|
|
117
|
+
can_show_label,
|
|
118
|
+
needs_external_label,
|
|
119
|
+
external_label_position,
|
|
120
|
+
label_x: x + width / 2,
|
|
121
|
+
label_y: bar_y + bar_height / 2,
|
|
122
|
+
}
|
|
123
|
+
return { element, amount, fraction, color, x, width, ...label_props }
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
let hovered_element: ElementSymbol | null = $state(null)
|
|
128
|
+
// Generate unique ID for clipPath to avoid collisions across BarCharts
|
|
129
|
+
let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`)
|
|
57
130
|
</script>
|
|
58
131
|
|
|
59
132
|
{#snippet label_content(segment: BarSegmentData)}
|
|
60
133
|
<tspan class="element-symbol" style:font-size="{10 * segment.font_scale}px">
|
|
61
134
|
{segment.element}
|
|
62
135
|
</tspan>
|
|
63
|
-
{#if show_amounts}
|
|
64
|
-
<tspan class="amount" style:font-size="{
|
|
65
|
-
{segment.amount}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
{#if show_percentages}
|
|
69
|
-
<tspan class="percentage" style:font-size="{8 * segment.font_scale}px" dx="1" dy="5">
|
|
70
|
-
{format_num(segment.fraction, `.1~%`)}
|
|
136
|
+
{#if show_amounts || show_percentages}
|
|
137
|
+
<tspan class="amount" style:font-size="{6.5 * segment.font_scale}px" dx="1" dy="5">
|
|
138
|
+
{show_amounts ? segment.amount : ``}{show_amounts && show_percentages ? `=` : ``}{
|
|
139
|
+
show_percentages ? format_num(segment.fraction, `.1~%`) : ``
|
|
140
|
+
}
|
|
71
141
|
</tspan>
|
|
72
142
|
{/if}
|
|
73
143
|
{/snippet}
|
|
@@ -76,9 +146,7 @@ let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`);
|
|
|
76
146
|
viewBox="0 0 {size} {svg_height}"
|
|
77
147
|
{...rest}
|
|
78
148
|
class="bar-chart {rest.class ?? ``}"
|
|
79
|
-
style
|
|
80
|
-
outer_corners_only ? 4 : 0
|
|
81
|
-
}px; ${rest.style ?? ``}`}
|
|
149
|
+
style:max-width="{size}px"
|
|
82
150
|
bind:this={svg_node}
|
|
83
151
|
>
|
|
84
152
|
<!-- Background and border -->
|
|
@@ -87,11 +155,8 @@ let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`);
|
|
|
87
155
|
y={bar_y}
|
|
88
156
|
width={size}
|
|
89
157
|
height={bar_height}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
fill="var(--bar-bg, #fff)"
|
|
93
|
-
stroke="var(--bar-border, #ccc)"
|
|
94
|
-
stroke-width="1"
|
|
158
|
+
fill="var(--bar-bg)"
|
|
159
|
+
stroke="var(--bar-border, none)"
|
|
95
160
|
/>
|
|
96
161
|
|
|
97
162
|
<!-- External labels above -->
|
|
@@ -119,8 +184,8 @@ let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`);
|
|
|
119
184
|
y={bar_y}
|
|
120
185
|
width={size}
|
|
121
186
|
height={bar_height}
|
|
122
|
-
rx={outer_corners_only ?
|
|
123
|
-
ry={outer_corners_only ?
|
|
187
|
+
rx={outer_corners_only ? 2 : 0}
|
|
188
|
+
ry={outer_corners_only ? 2 : 0}
|
|
124
189
|
/>
|
|
125
190
|
</clipPath>
|
|
126
191
|
</defs>
|
|
@@ -169,7 +234,7 @@ let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`);
|
|
|
169
234
|
x={segment.label_x}
|
|
170
235
|
y={segment.label_y}
|
|
171
236
|
text-anchor="middle"
|
|
172
|
-
dominant-baseline=
|
|
237
|
+
dominant-baseline={show_amounts || show_percentages ? `middle` : `central`}
|
|
173
238
|
class="bar-label"
|
|
174
239
|
style:fill={segment.text_color}
|
|
175
240
|
>
|
|
@@ -201,8 +266,7 @@ let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`);
|
|
|
201
266
|
<style>
|
|
202
267
|
.bar-chart {
|
|
203
268
|
display: inline-block;
|
|
204
|
-
|
|
205
|
-
max-width: var(--bar-max-width, 100%);
|
|
269
|
+
--bar-bg: light-dark(#fff, #333);
|
|
206
270
|
}
|
|
207
271
|
.bar-segment {
|
|
208
272
|
transition: all 0.2s ease;
|
|
@@ -227,7 +291,7 @@ let clip_path_id = $derived(`bar-clip-${crypto.randomUUID()}`);
|
|
|
227
291
|
.element-symbol {
|
|
228
292
|
font-weight: 700;
|
|
229
293
|
}
|
|
230
|
-
.amount
|
|
294
|
+
.amount {
|
|
231
295
|
font-weight: 500;
|
|
232
296
|
}
|
|
233
297
|
</style>
|