matterviz 0.4.1 → 0.4.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 -4
- package/dist/FilePicker.svelte +48 -60
- package/dist/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +2 -2
- package/dist/api/optimade.js +10 -7
- package/dist/app.css +68 -0
- package/dist/brillouin/BrillouinZone.svelte +90 -91
- package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
- package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
- package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
- package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
- package/dist/brillouin/compute.js +10 -16
- package/dist/brillouin/geometry.js +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
- package/dist/chempot-diagram/async-compute.svelte.js +13 -14
- package/dist/chempot-diagram/color.d.ts +21 -1
- package/dist/chempot-diagram/color.js +70 -1
- package/dist/chempot-diagram/compute.d.ts +7 -0
- package/dist/chempot-diagram/compute.js +85 -26
- package/dist/chempot-diagram/controls-state.svelte.js +1 -1
- package/dist/chempot-diagram/export.js +1 -6
- package/dist/chempot-diagram/temperature.js +9 -10
- package/dist/colors/index.d.ts +0 -4
- package/dist/colors/index.js +19 -20
- package/dist/composition/BarChart.svelte +30 -26
- package/dist/composition/BubbleChart.svelte +17 -17
- package/dist/composition/Composition.svelte +10 -19
- package/dist/composition/Formula.svelte +20 -27
- package/dist/composition/FormulaFilter.svelte +115 -184
- package/dist/composition/PieChart.svelte +55 -41
- package/dist/composition/format.js +7 -9
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +2 -2
- package/dist/composition/parse.js +61 -115
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +17 -26
- package/dist/convex-hull/ConvexHull.svelte +12 -15
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull2D.svelte +93 -94
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +127 -186
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +131 -180
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
- package/dist/convex-hull/ConvexHullControls.svelte +46 -48
- package/dist/convex-hull/ConvexHullStats.svelte +193 -195
- package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
- package/dist/convex-hull/GasPressureControls.svelte +5 -12
- package/dist/convex-hull/StructurePopup.svelte +18 -22
- package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
- package/dist/convex-hull/TemperatureSlider.svelte +4 -10
- package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
- package/dist/convex-hull/gas-thermodynamics.js +21 -53
- package/dist/convex-hull/helpers.d.ts +8 -10
- package/dist/convex-hull/helpers.js +37 -43
- package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
- package/dist/convex-hull/thermodynamics.js +37 -44
- package/dist/coordination/CoordinationBarPlot.svelte +49 -53
- 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 +5 -9
- 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 +44 -67
- package/dist/element/Nucleus.svelte +4 -2
- package/dist/element/data.d.ts +3 -2
- package/dist/element/data.js +5 -1
- package/dist/element/helpers.d.ts +4 -0
- package/dist/element/helpers.js +18 -0
- package/dist/element/index.d.ts +2 -5
- package/dist/element/index.js +4 -19
- package/dist/feedback/DragOverlay.svelte +5 -5
- package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
- package/dist/feedback/StatusMessage.svelte +7 -4
- package/dist/fermi-surface/FermiSlice.svelte +21 -18
- package/dist/fermi-surface/FermiSurface.svelte +35 -44
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
- package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
- package/dist/fermi-surface/compute.js +25 -58
- package/dist/fermi-surface/parse.js +54 -88
- package/dist/file-viewer/JsonBrowser.svelte +1043 -0
- package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
- package/dist/file-viewer/PlotPanel.svelte +350 -0
- package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
- package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
- package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
- package/dist/file-viewer/detect.d.ts +11 -0
- package/dist/file-viewer/detect.js +381 -0
- package/dist/file-viewer/eligibility.d.ts +4 -0
- package/dist/file-viewer/eligibility.js +53 -0
- package/dist/file-viewer/host-protocol.d.ts +50 -0
- package/dist/file-viewer/host-transfer.d.ts +25 -0
- package/dist/file-viewer/host-transfer.js +42 -0
- package/dist/file-viewer/index.d.ts +5 -0
- package/dist/file-viewer/index.js +5 -0
- package/dist/file-viewer/main.d.ts +44 -0
- package/dist/file-viewer/main.js +535 -0
- package/dist/file-viewer/parse.d.ts +9 -0
- package/dist/file-viewer/parse.js +170 -0
- package/dist/file-viewer/plot-utils.d.ts +24 -0
- package/dist/file-viewer/plot-utils.js +191 -0
- package/dist/file-viewer/types.d.ts +4 -0
- package/dist/file-viewer/types.js +5 -0
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
- package/dist/heatmap-matrix/index.d.ts +5 -0
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +4 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/io/ExportPane.svelte +11 -7
- package/dist/io/decompress.d.ts +4 -1
- package/dist/io/decompress.js +24 -36
- package/dist/io/export.d.ts +11 -4
- package/dist/io/export.js +75 -19
- package/dist/io/fetch.d.ts +0 -3
- package/dist/io/fetch.js +0 -11
- package/dist/io/file-drop.js +60 -35
- package/dist/io/index.d.ts +0 -1
- package/dist/io/index.js +2 -9
- package/dist/io/is-binary.d.ts +9 -0
- package/dist/io/is-binary.js +45 -1
- package/dist/io/url-drop.d.ts +2 -0
- package/dist/io/url-drop.js +40 -40
- package/dist/isosurface/Isosurface.svelte +700 -215
- package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
- package/dist/isosurface/IsosurfaceControls.svelte +590 -116
- package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
- package/dist/isosurface/VolumeSlice.svelte +224 -0
- package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
- package/dist/isosurface/coloring.d.ts +20 -0
- package/dist/isosurface/coloring.js +118 -0
- package/dist/isosurface/geometry-worker-types.d.ts +38 -0
- package/dist/isosurface/geometry.worker.d.ts +1 -0
- package/dist/isosurface/geometry.worker.js +59 -0
- package/dist/isosurface/grid.d.ts +10 -0
- package/dist/isosurface/grid.js +31 -0
- package/dist/isosurface/index.d.ts +4 -0
- package/dist/isosurface/index.js +4 -0
- package/dist/isosurface/parse-vaspwave.d.ts +3 -0
- package/dist/isosurface/parse-vaspwave.js +138 -0
- package/dist/isosurface/parse.js +6 -6
- package/dist/isosurface/profile.d.ts +12 -0
- package/dist/isosurface/profile.js +19 -0
- package/dist/isosurface/sampling.d.ts +34 -0
- package/dist/isosurface/sampling.js +408 -0
- package/dist/isosurface/slice-rendering.d.ts +13 -0
- package/dist/isosurface/slice-rendering.js +79 -0
- package/dist/isosurface/slice.d.ts +22 -2
- package/dist/isosurface/slice.js +200 -116
- package/dist/isosurface/types.d.ts +24 -1
- package/dist/isosurface/types.js +120 -8
- package/dist/json-path.d.ts +4 -0
- package/dist/json-path.js +89 -0
- package/dist/labels.d.ts +6 -2
- package/dist/labels.js +44 -14
- package/dist/layout/FullscreenButton.svelte +2 -1
- package/dist/layout/FullscreenToggle.svelte +10 -4
- package/dist/layout/InfoCard.svelte +8 -21
- 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 +57 -62
- package/dist/layout/SettingsSection.svelte.d.ts +6 -7
- package/dist/layout/SubpageGrid.svelte +3 -1
- package/dist/layout/ViewerChrome.svelte +16 -11
- package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
- package/dist/layout/fullscreen.js +3 -5
- package/dist/layout/fullscreen.svelte.js +1 -2
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.js +1 -0
- package/dist/layout/json-tree/JsonNode.svelte +22 -59
- package/dist/layout/json-tree/JsonTree.svelte +101 -172
- package/dist/layout/json-tree/JsonValue.svelte +9 -32
- package/dist/layout/json-tree/utils.d.ts +0 -3
- package/dist/layout/json-tree/utils.js +50 -188
- package/dist/marching-cubes.d.ts +8 -1
- package/dist/marching-cubes.js +115 -48
- package/dist/math.d.ts +5 -2
- package/dist/math.js +48 -38
- package/dist/overlays/ContextMenu.svelte +19 -34
- package/dist/overlays/CopyButton.svelte +11 -5
- package/dist/overlays/DragControlTab.svelte +6 -1
- package/dist/overlays/DraggablePane.svelte +110 -74
- package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
- package/dist/overlays/GlassChip.svelte +32 -0
- package/dist/overlays/GlassChip.svelte.d.ts +8 -0
- package/dist/overlays/InfoPaneCards.svelte +11 -23
- package/dist/overlays/index.d.ts +7 -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 +113 -145
- package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
- package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
- package/dist/periodic-table/TableInset.svelte +9 -4
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
- package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
- package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
- package/dist/phase-diagram/build-diagram.js +4 -9
- package/dist/phase-diagram/diagram-input.d.ts +1 -2
- package/dist/phase-diagram/parse.js +15 -15
- package/dist/phase-diagram/svg-to-diagram.js +28 -27
- package/dist/phase-diagram/utils.js +2 -3
- package/dist/plot/bar/BarPlot.svelte +461 -426
- package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
- package/dist/plot/bar/BarPlotControls.svelte +1 -3
- package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
- package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
- package/dist/plot/bar/data.d.ts +5 -4
- package/dist/plot/bar/data.js +2 -1
- package/dist/plot/box/BoxPlot.svelte +322 -226
- package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
- package/dist/plot/box/Violin.svelte.d.ts +1 -0
- package/dist/plot/box/box-plot.js +1 -1
- package/dist/plot/core/auto-place.d.ts +1 -1
- package/dist/plot/core/auto-place.js +2 -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 +101 -106
- 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 +18 -9
- package/dist/plot/core/components/Line.svelte.d.ts +2 -0
- package/dist/plot/core/components/PlotAxis.svelte +40 -17
- package/dist/plot/core/components/PlotControls.svelte +65 -41
- 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 +54 -57
- package/dist/plot/core/components/ReferencePlane.svelte +7 -8
- 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 +27 -474
- package/dist/plot/core/data-transform.d.ts +1 -2
- package/dist/plot/core/data-transform.js +9 -15
- package/dist/plot/core/fill-utils.d.ts +3 -1
- package/dist/plot/core/fill-utils.js +28 -6
- package/dist/plot/core/index.d.ts +1 -0
- package/dist/plot/core/index.js +1 -0
- package/dist/plot/core/interactions.js +0 -2
- package/dist/plot/core/layout.d.ts +15 -6
- package/dist/plot/core/layout.js +57 -38
- 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 +2 -4
- package/dist/plot/core/pan-zoom.svelte.js +34 -17
- package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
- package/dist/plot/core/placed-tween.svelte.js +68 -21
- package/dist/plot/core/reference-line.js +1 -1
- package/dist/plot/core/scales.d.ts +23 -0
- package/dist/plot/core/scales.js +39 -13
- package/dist/plot/core/svg.js +0 -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 +29 -324
- package/dist/plot/core/types.js +23 -20
- package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
- package/dist/plot/core/utils/hierarchy-chart.js +191 -0
- package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
- package/dist/plot/core/utils/hierarchy-labels.js +100 -0
- package/dist/plot/core/utils/label-placement.js +2 -2
- package/dist/plot/histogram/Histogram.svelte +314 -340
- package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
- package/dist/plot/histogram/HistogramControls.svelte +30 -28
- 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 +78 -69
- package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
- package/dist/plot/sankey/SankeyControls.svelte +22 -16
- package/dist/plot/sankey/sankey.js +13 -9
- package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
- package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
- package/dist/plot/scatter/ElementScatter.svelte +4 -1
- package/dist/plot/scatter/ScatterPlot.svelte +517 -410
- package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
- 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/adaptive-density.d.ts +1 -1
- package/dist/plot/scatter/adaptive-density.js +36 -20
- package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
- package/dist/plot/scatter/binned-scatter-types.js +6 -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 +25 -34
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
- package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
- package/dist/plot/sunburst/Sunburst.svelte +269 -347
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
- 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 +10 -3
- package/dist/plot/treemap/Treemap.svelte +1022 -0
- package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
- package/dist/plot/treemap/index.d.ts +4 -0
- package/dist/plot/treemap/index.js +4 -0
- package/dist/plot/treemap/labels.d.ts +38 -0
- package/dist/plot/treemap/labels.js +80 -0
- package/dist/plot/treemap/treemap.d.ts +28 -0
- package/dist/plot/treemap/treemap.js +102 -0
- package/dist/rdf/RdfPlot.svelte +37 -59
- package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
- package/dist/rdf/calc-rdf.js +63 -52
- package/dist/rdf/index.d.ts +0 -1
- package/dist/sanitize.js +85 -27
- package/dist/scene/SceneCamera.svelte +1 -1
- package/dist/scene/SceneCamera.svelte.d.ts +1 -1
- package/dist/scene/bind-renderer.svelte.js +14 -6
- package/dist/scene/index.d.ts +1 -2
- package/dist/scene/index.js +1 -1
- package/dist/scene/{props.js → props.svelte.js} +15 -1
- package/dist/settings.d.ts +19 -9
- package/dist/settings.js +229 -525
- package/dist/spectral/Bands.svelte +207 -221
- package/dist/spectral/BandsAndDos.svelte +11 -9
- package/dist/spectral/BrillouinBandsDos.svelte +19 -42
- package/dist/spectral/Dos.svelte +92 -93
- package/dist/spectral/helpers.d.ts +3 -3
- package/dist/spectral/helpers.js +65 -140
- package/dist/state.svelte.js +5 -18
- package/dist/structure/Arrow.svelte +5 -18
- package/dist/structure/ArrowInstances.svelte +160 -0
- package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
- package/dist/structure/AtomLegend.svelte +120 -85
- package/dist/structure/AtomLegend.svelte.d.ts +2 -3
- package/dist/structure/Bond.svelte +31 -23
- package/dist/structure/CanvasTooltip.svelte +15 -3
- package/dist/structure/CellSelect.svelte +45 -35
- 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 +636 -504
- package/dist/structure/Structure.svelte.d.ts +4 -2
- package/dist/structure/StructureCarousel.svelte +637 -0
- package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
- package/dist/structure/StructureControls.svelte +165 -425
- package/dist/structure/StructureControls.svelte.d.ts +1 -1
- package/dist/structure/StructureExportPane.svelte +17 -21
- package/dist/structure/StructureInfoPane.svelte +128 -133
- package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
- package/dist/structure/StructureScene.svelte +535 -578
- package/dist/structure/StructureScene.svelte.d.ts +6 -2
- package/dist/structure/StructureViewport.svelte +451 -0
- package/dist/structure/StructureViewport.svelte.d.ts +65 -0
- package/dist/structure/atom-label-placement.d.ts +16 -12
- package/dist/structure/atom-label-placement.js +70 -37
- package/dist/structure/atom-properties.d.ts +2 -0
- package/dist/structure/atom-properties.js +105 -38
- package/dist/structure/bond-order-perception.js +3 -8
- package/dist/structure/bonding.d.ts +9 -3
- package/dist/structure/bonding.js +95 -46
- package/dist/structure/edit-history.d.ts +6 -0
- package/dist/structure/edit-history.js +27 -0
- package/dist/structure/export.d.ts +1 -0
- package/dist/structure/export.js +89 -105
- package/dist/structure/format-detect.d.ts +1 -0
- package/dist/structure/format-detect.js +20 -0
- package/dist/structure/geometry.d.ts +9 -0
- package/dist/structure/geometry.js +27 -0
- package/dist/structure/index.d.ts +16 -1
- package/dist/structure/index.js +15 -10
- package/dist/structure/measure.d.ts +1 -1
- package/dist/structure/measure.js +6 -12
- package/dist/structure/parse.d.ts +2 -1
- package/dist/structure/parse.js +272 -313
- package/dist/structure/partial-occupancy.js +10 -5
- package/dist/structure/pbc.js +85 -107
- package/dist/structure/polyhedra.d.ts +0 -1
- package/dist/structure/polyhedra.js +7 -21
- package/dist/structure/prop-groups.d.ts +85 -0
- package/dist/structure/prop-groups.js +18 -0
- package/dist/structure/supercell.d.ts +1 -2
- package/dist/structure/supercell.js +7 -13
- package/dist/symmetry/SymmetryElements.svelte +11 -15
- package/dist/symmetry/SymmetryStats.svelte +55 -71
- package/dist/symmetry/WyckoffTable.svelte +10 -28
- package/dist/symmetry/cell-transform.js +6 -14
- package/dist/symmetry/index.d.ts +1 -0
- package/dist/symmetry/index.js +13 -10
- package/dist/symmetry/spacegroups.js +3 -2
- package/dist/table/HeatmapTable.svelte +1142 -447
- package/dist/table/HeatmapTable.svelte.d.ts +12 -2
- package/dist/table/ToggleMenu.svelte +168 -53
- package/dist/table/ToggleMenu.svelte.d.ts +1 -1
- 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/embedded.d.ts +18 -0
- package/dist/theme/embedded.js +206 -0
- package/dist/theme/index.d.ts +5 -5
- package/dist/theme/index.js +5 -12
- package/dist/theme/themes.mjs +44 -66
- package/dist/tooltip/KCoords.svelte +4 -1
- package/dist/tooltip/TooltipContent.svelte +3 -6
- package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
- package/dist/tooltip/index.d.ts +8 -1
- package/dist/trajectory/Trajectory.svelte +613 -386
- package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
- package/dist/trajectory/TrajectoryError.svelte +12 -74
- package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
- package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
- package/dist/trajectory/extract.js +61 -49
- package/dist/trajectory/format-detect.d.ts +2 -0
- package/dist/trajectory/format-detect.js +17 -13
- package/dist/trajectory/frame-reader.d.ts +2 -0
- package/dist/trajectory/frame-reader.js +35 -32
- package/dist/trajectory/helpers.d.ts +2 -0
- package/dist/trajectory/helpers.js +34 -56
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +5 -8
- package/dist/trajectory/parse/ase.js +1 -1
- 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 +6 -6
- package/dist/trajectory/parse/index.js +25 -33
- package/dist/trajectory/parse/lammps.js +8 -12
- package/dist/trajectory/parse/vasp.js +10 -7
- 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 +4 -0
- package/dist/trajectory/parse/vaspout-h5.js +281 -0
- package/dist/trajectory/parse/xyz.js +59 -9
- package/dist/trajectory/plotting.d.ts +8 -9
- package/dist/trajectory/plotting.js +113 -64
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +7 -0
- package/dist/xrd/XrdPlot.svelte +79 -118
- package/dist/xrd/broadening.js +2 -1
- package/dist/xrd/calc-xrd.js +24 -62
- package/dist/xrd/parse.d.ts +0 -1
- package/dist/xrd/parse.js +69 -95
- package/package.json +94 -34
- package/readme.md +6 -5
- package/dist/api/mp.d.ts +0 -6
- package/dist/api/mp.js +0 -22
- package/dist/plot/sunburst/SunburstControls.svelte +0 -200
- package/dist/scene/types.d.ts +0 -26
- package/dist/tooltip/types.d.ts +0 -8
- package/dist/trajectory/constants.d.ts +0 -6
- package/dist/trajectory/constants.js +0 -11
- /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
- /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { sanitize_html } from '../sanitize'
|
|
3
3
|
import type { HTMLAttributes } from 'svelte/elements'
|
|
4
|
-
import {
|
|
4
|
+
import { create_clipboard_feedback } from './'
|
|
5
5
|
import CopyButton from './CopyButton.svelte'
|
|
6
6
|
|
|
7
7
|
type InfoPaneRow = {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
} = $props()
|
|
34
34
|
|
|
35
35
|
let info_filter = $state(``)
|
|
36
|
-
const
|
|
36
|
+
const { copied, copy } = create_clipboard_feedback()
|
|
37
37
|
const row_key = (card_title: string, row: InfoPaneRow, row_idx: number): string =>
|
|
38
38
|
row.key ?? `${card_title}:${row.label}:${row.value}:${row_idx}`
|
|
39
39
|
|
|
@@ -44,27 +44,16 @@
|
|
|
44
44
|
.map((card) => ({
|
|
45
45
|
...card,
|
|
46
46
|
rows: card.rows.filter(({ label, value }) =>
|
|
47
|
-
`${card.title} ${label} ${value}`.toLowerCase().includes(filter)
|
|
47
|
+
`${card.title} ${label} ${value}`.toLowerCase().includes(filter),
|
|
48
48
|
),
|
|
49
49
|
}))
|
|
50
50
|
.filter(({ rows }) => rows.length > 0)
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
row: InfoPaneRow,
|
|
56
|
-
row_idx: number,
|
|
57
|
-
): Promise<void> {
|
|
58
|
-
const key = row_key(card_title, row, row_idx)
|
|
59
|
-
try {
|
|
60
|
-
await navigator.clipboard.writeText(`${row.label}: ${row.value}`)
|
|
61
|
-
copied_items.add(key)
|
|
62
|
-
setTimeout(() => copied_items.delete(key), 1000)
|
|
63
|
-
} catch (error) {
|
|
64
|
-
console.error(`Failed to copy to clipboard:`, error)
|
|
65
|
-
}
|
|
66
|
-
}
|
|
53
|
+
const copy_row = (card_title: string, row: InfoPaneRow, row_idx: number): Promise<void> =>
|
|
54
|
+
copy(`${row.label}: ${row.value}`, row_key(card_title, row, row_idx))
|
|
67
55
|
</script>
|
|
56
|
+
|
|
68
57
|
{#if show_filter}
|
|
69
58
|
<input
|
|
70
59
|
class="info-filter"
|
|
@@ -78,7 +67,7 @@
|
|
|
78
67
|
{#if filtered_cards.length === 0}
|
|
79
68
|
<p class="empty-filter">No {empty_label} matches "{info_filter}".</p>
|
|
80
69
|
{:else}
|
|
81
|
-
<div {...rest} class=
|
|
70
|
+
<div {...rest} class={[`info-cards`, rest.class]} style:--row-label-min={row_label_min}>
|
|
82
71
|
{#each filtered_cards as card (card.title)}
|
|
83
72
|
<section class="info-card">
|
|
84
73
|
<svelte:element this={`h${heading_level}`}>{card.title}</svelte:element>
|
|
@@ -89,7 +78,7 @@
|
|
|
89
78
|
<CopyButton
|
|
90
79
|
label="Copy {row.label}: {row.value}"
|
|
91
80
|
title="Copy {row.label}"
|
|
92
|
-
copied={
|
|
81
|
+
copied={copied.has(row_key(card.title, row, row_idx))}
|
|
93
82
|
onclick={() => copy_row(card.title, row, row_idx)}
|
|
94
83
|
/>
|
|
95
84
|
</div>
|
|
@@ -129,10 +118,9 @@
|
|
|
129
118
|
}
|
|
130
119
|
.info-row {
|
|
131
120
|
display: grid;
|
|
132
|
-
grid-template-columns:
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
) auto;
|
|
121
|
+
grid-template-columns:
|
|
122
|
+
minmax(var(--row-label-min), var(--row-label-max, 0.8fr)) minmax(0, 1fr)
|
|
123
|
+
auto;
|
|
136
124
|
align-items: center;
|
|
137
125
|
gap: 5pt;
|
|
138
126
|
padding: var(--info-row-padding, 1pt 0);
|
package/dist/overlays/index.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { ComponentProps } from 'svelte';
|
|
2
|
+
import { SvelteSet } from 'svelte/reactivity';
|
|
2
3
|
import type DraggablePane from './DraggablePane.svelte';
|
|
3
4
|
export { default as ContextMenu } from './ContextMenu.svelte';
|
|
4
5
|
export { default as DraggablePane } from './DraggablePane.svelte';
|
|
5
6
|
export { default as DragControlTab } from './DragControlTab.svelte';
|
|
7
|
+
export { default as GlassChip } from './GlassChip.svelte';
|
|
8
|
+
export * from './portal';
|
|
6
9
|
export type PaneToggleProps = ComponentProps<typeof DraggablePane>[`toggle_props`];
|
|
7
10
|
export type PaneProps = ComponentProps<typeof DraggablePane>[`pane_props`];
|
|
11
|
+
export declare function create_clipboard_feedback(duration?: number): {
|
|
12
|
+
copied: SvelteSet<string>;
|
|
13
|
+
copy: (text: string, key: string) => Promise<void>;
|
|
14
|
+
};
|
package/dist/overlays/index.js
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
1
2
|
export { default as ContextMenu } from './ContextMenu.svelte';
|
|
2
3
|
export { default as DraggablePane } from './DraggablePane.svelte';
|
|
3
4
|
export { default as DragControlTab } from './DragControlTab.svelte';
|
|
5
|
+
export { default as GlassChip } from './GlassChip.svelte';
|
|
6
|
+
export * from './portal';
|
|
7
|
+
// Reactive clipboard-copy feedback shared by info panes. `copy(text, key)` writes
|
|
8
|
+
// `text` to the clipboard and flags `key` as recently-copied in the returned reactive
|
|
9
|
+
// `copied` set for `duration` ms, so UIs can show a transient "copied" checkmark.
|
|
10
|
+
export function create_clipboard_feedback(duration = 1000) {
|
|
11
|
+
const copied = new SvelteSet();
|
|
12
|
+
const timers = new SvelteMap();
|
|
13
|
+
const copy = async (text, key) => {
|
|
14
|
+
try {
|
|
15
|
+
await navigator.clipboard.writeText(text);
|
|
16
|
+
copied.add(key);
|
|
17
|
+
// reset any in-flight timer so a re-copy gets the full feedback duration
|
|
18
|
+
clearTimeout(timers.get(key));
|
|
19
|
+
timers.set(key, setTimeout(() => {
|
|
20
|
+
copied.delete(key);
|
|
21
|
+
timers.delete(key);
|
|
22
|
+
}, duration));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error(`Failed to copy to clipboard:`, error);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return { copied, copy };
|
|
29
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Attachment that moves its element into `target` (e.g. a host panel's toolbar),
|
|
2
|
+
// so components can offer optional external placement of their chrome (search/
|
|
3
|
+
// export/settings buttons etc.) without duplicating markup: pass nothing and the
|
|
4
|
+
// element renders inline where declared; pass a target and it teleports there.
|
|
5
|
+
// A comment anchor marks the original position so the element is restored when
|
|
6
|
+
// the target changes or unmounts, keeping Svelte's teardown sound.
|
|
7
|
+
export const portal = (target) => (element) => {
|
|
8
|
+
if (!target)
|
|
9
|
+
return undefined;
|
|
10
|
+
const anchor = document.createComment(`portal`);
|
|
11
|
+
element.before(anchor);
|
|
12
|
+
target.append(element);
|
|
13
|
+
return () => anchor.replaceWith(element);
|
|
14
|
+
};
|
|
@@ -9,9 +9,13 @@
|
|
|
9
9
|
import type { ComponentProps, Snippet } from 'svelte'
|
|
10
10
|
import type { HTMLAttributes } from 'svelte/elements'
|
|
11
11
|
import type { D3InterpolateName } from '../colors'
|
|
12
|
+
import type { MissingCellStyle } from '../heatmap-matrix'
|
|
12
13
|
import type { ScaleContext } from './index'
|
|
13
14
|
import { TableInset } from './index'
|
|
14
15
|
|
|
16
|
+
// a tile's heat value: scalar or 1-4-segment array of numbers/colors
|
|
17
|
+
type HeatValue = number | number[] | string | string[]
|
|
18
|
+
|
|
15
19
|
const default_f_block_inset_tiles = [
|
|
16
20
|
{ name: `Lanthanides`, symbol: `La-Lu`, number: `57-71`, category: `lanthanide` },
|
|
17
21
|
{ name: `Actinides`, symbol: `Ac-Lr`, number: `89-103`, category: `actinide` },
|
|
@@ -36,7 +40,7 @@
|
|
|
36
40
|
color_scale_range = [null, null],
|
|
37
41
|
color_overrides = {},
|
|
38
42
|
labels = {},
|
|
39
|
-
|
|
43
|
+
missing = {},
|
|
40
44
|
split_layout = undefined,
|
|
41
45
|
show_color_bar = true,
|
|
42
46
|
color_bar_props = {},
|
|
@@ -50,12 +54,10 @@
|
|
|
50
54
|
tile_props?: Partial<ComponentProps<typeof ElementTile>>
|
|
51
55
|
show_photo?: boolean
|
|
52
56
|
disabled?: boolean // disable hover and click events from updating active_element
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
heatmap_values?:
|
|
57
|
-
| Partial<Record<ElementSymbol, number | number[] | string | string[]>>
|
|
58
|
-
| (number | number[] | string | string[])[]
|
|
57
|
+
// array (positional by atomic number, can be partial) or object keyed by element symbol.
|
|
58
|
+
// each value is a single number/color or an array of 1-4 numbers/colors for multi-segment
|
|
59
|
+
// tiles. null/omitted -> missing (uses the `missing` fallback); 0 is a real value
|
|
60
|
+
heatmap_values?: Partial<Record<ElementSymbol, HeatValue | null>> | (HeatValue | null)[]
|
|
59
61
|
// links is either string with element property (name, symbol, number, ...) to use as link,
|
|
60
62
|
// or object with mapping element symbols to link
|
|
61
63
|
links?: keyof ChemicalElement | Record<ElementSymbol, string> | null
|
|
@@ -78,9 +80,7 @@
|
|
|
78
80
|
color_scale_range?: [number | null, number | null]
|
|
79
81
|
color_overrides?: Partial<Record<ElementSymbol, string>>
|
|
80
82
|
labels?: Partial<Record<ElementSymbol, string>>
|
|
81
|
-
//
|
|
82
|
-
// "element-category" falls back to element category default color
|
|
83
|
-
missing_color?: string
|
|
83
|
+
missing?: MissingCellStyle // styling for tiles with no heatmap value
|
|
84
84
|
// control the layout of multi-value splits for all tiles
|
|
85
85
|
split_layout?: `diagonal` | `horizontal` | `vertical` | `triangular` | `quadrant`
|
|
86
86
|
// automatically show a color bar when heatmap_values is provided (default: true)
|
|
@@ -91,16 +91,16 @@
|
|
|
91
91
|
bottom_left_inset?: Snippet<[{ active_element: ChemicalElement | null }]>
|
|
92
92
|
tooltip?:
|
|
93
93
|
| Snippet<
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
94
|
+
[
|
|
95
|
+
{
|
|
96
|
+
element: ChemicalElement
|
|
97
|
+
value: HeatValue | null
|
|
98
|
+
active: boolean
|
|
99
|
+
bg_color: string | null
|
|
100
|
+
scale_context: ScaleContext
|
|
101
|
+
},
|
|
102
|
+
]
|
|
103
|
+
>
|
|
104
104
|
| boolean
|
|
105
105
|
children?: Snippet
|
|
106
106
|
onenter?: (element: ChemicalElement) => void
|
|
@@ -114,7 +114,8 @@
|
|
|
114
114
|
`each element possibly omitting elements at the end, got ${heatmap_values.length}`,
|
|
115
115
|
)
|
|
116
116
|
return []
|
|
117
|
-
}
|
|
117
|
+
}
|
|
118
|
+
return heatmap_values
|
|
118
119
|
} else if (typeof heatmap_values === `object`) {
|
|
119
120
|
const bad_keys = Object.keys(heatmap_values).filter(
|
|
120
121
|
(key) => !ELEM_SYMBOLS.includes(key as ElementSymbol),
|
|
@@ -125,7 +126,9 @@
|
|
|
125
126
|
)
|
|
126
127
|
return []
|
|
127
128
|
}
|
|
128
|
-
|
|
129
|
+
// keep absent elements as null (distinct from a real 0 value) so they map to the
|
|
130
|
+
// missing fallback while explicit 0 maps through the color scale
|
|
131
|
+
return ELEM_SYMBOLS.map((symbol) => heatmap_values[symbol] ?? null)
|
|
129
132
|
}
|
|
130
133
|
return []
|
|
131
134
|
})
|
|
@@ -158,14 +161,11 @@
|
|
|
158
161
|
ArrowDown: row === 6 && in_f_block ? 9 : row === 7 && in_f_block ? 10 : row + 1,
|
|
159
162
|
}
|
|
160
163
|
const target_row = row_map[event.key] ?? row
|
|
161
|
-
const target_col =
|
|
162
|
-
? col - 1
|
|
163
|
-
: event.key === `ArrowRight`
|
|
164
|
-
? col + 1
|
|
165
|
-
: col
|
|
164
|
+
const target_col =
|
|
165
|
+
event.key === `ArrowLeft` ? col - 1 : event.key === `ArrowRight` ? col + 1 : col
|
|
166
166
|
active_element =
|
|
167
167
|
element_data.find((el) => el.column === target_col && el.row === target_row) ??
|
|
168
|
-
|
|
168
|
+
active_element
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
function handle_tooltip_enter(element: ChemicalElement, event: MouseEvent) {
|
|
@@ -188,124 +188,92 @@
|
|
|
188
188
|
typeof color_scale === `string` ? get_d3_interpolator(color_scale) : color_scale,
|
|
189
189
|
)
|
|
190
190
|
|
|
191
|
+
// finite numeric heat value (numeric strings coerced; colors, null/false and non-finite
|
|
192
|
+
// excluded so they can't poison the color-scale domain). null => not a mappable number
|
|
193
|
+
const to_heat_num = (value: number | string | false | null | undefined): number | null => {
|
|
194
|
+
if (value == null || value === false || is_color(value)) return null
|
|
195
|
+
const num = Number(value)
|
|
196
|
+
return Number.isFinite(num) ? num : null
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
let heat_nums = $derived(
|
|
200
|
+
heat_values
|
|
201
|
+
.flat()
|
|
202
|
+
.map(to_heat_num)
|
|
203
|
+
.filter((num): num is number => num !== null),
|
|
204
|
+
)
|
|
205
|
+
// values usable by the active scale (log excludes non-positive)
|
|
206
|
+
let usable_heat_nums = $derived(log ? heat_nums.filter((num) => num > 0) : heat_nums)
|
|
207
|
+
|
|
191
208
|
let cs_min = $derived(
|
|
192
|
-
color_scale_range[0] ??
|
|
193
|
-
(heat_values.length > 0
|
|
194
|
-
? Math.min(
|
|
195
|
-
...heat_values.flat().filter((val): val is number => typeof val === `number`),
|
|
196
|
-
)
|
|
197
|
-
: 0),
|
|
209
|
+
color_scale_range[0] ?? (heat_nums.length > 0 ? Math.min(...heat_nums) : 0),
|
|
198
210
|
)
|
|
199
211
|
let cs_max = $derived(
|
|
200
|
-
color_scale_range[1] ??
|
|
201
|
-
(heat_values.length > 0
|
|
202
|
-
? Math.max(
|
|
203
|
-
...heat_values.flat().filter((val): val is number => typeof val === `number`),
|
|
204
|
-
)
|
|
205
|
-
: 1),
|
|
212
|
+
color_scale_range[1] ?? (heat_nums.length > 0 ? Math.max(...heat_nums) : 1),
|
|
206
213
|
)
|
|
207
214
|
|
|
208
215
|
// smallest positive bound for log color mapping (matches the auto ColorBar's log scale)
|
|
209
216
|
let cs_min_pos = $derived.by(() => {
|
|
210
217
|
if (cs_min > 0) return cs_min
|
|
211
|
-
const pos =
|
|
212
|
-
typeof val === `number` && val > 0
|
|
213
|
-
)
|
|
218
|
+
const pos = heat_nums.filter((num) => num > 0)
|
|
214
219
|
return pos.length > 0 ? Math.min(...pos) : cs_max
|
|
215
220
|
})
|
|
216
221
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
// If it's already a color string, return it directly
|
|
228
|
-
if (is_color(value)) return value
|
|
229
|
-
|
|
230
|
-
// Return missing color for zero/invalid values or when no heatmap data
|
|
231
|
-
if (
|
|
232
|
-
!value ||
|
|
233
|
-
value === 0 ||
|
|
234
|
-
(log && value <= 0) ||
|
|
235
|
-
!heat_values?.length ||
|
|
236
|
-
!color_scale_fn
|
|
237
|
-
) {
|
|
238
|
-
// Use missing color for zero/missing values or when no heatmap data
|
|
239
|
-
if (missing_color === `element-category` && element) {
|
|
240
|
-
return colors.category[element.category] || `#cccccc`
|
|
241
|
-
}
|
|
242
|
-
return missing_color
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// map value to [0, 1] range
|
|
246
|
-
const span = cs_max - cs_min
|
|
247
|
-
if (span === 0) return color_scale_fn?.(0.5) // midpoint when all values equal
|
|
222
|
+
// whether a value maps to a heatmap color (false => use the missing fallback). 0 is a
|
|
223
|
+
// real value; only absent/null/non-finite (and <=0 in log mode) count as missing. a
|
|
224
|
+
// multi-value tile is missing only when every segment is missing
|
|
225
|
+
const value_is_missing = (value: HeatValue | false | null): boolean => {
|
|
226
|
+
if (Array.isArray(value)) return value.every(value_is_missing) // [] -> true (missing)
|
|
227
|
+
if (is_color(value)) return false // explicit colors are real values, not missing
|
|
228
|
+
const num = to_heat_num(value)
|
|
229
|
+
return num === null || (log && num <= 0)
|
|
230
|
+
}
|
|
248
231
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
232
|
+
const bg_color = (
|
|
233
|
+
value: HeatValue | false | null,
|
|
234
|
+
element?: ChemicalElement,
|
|
235
|
+
): string | null => {
|
|
236
|
+
if (Array.isArray(value)) return bg_color(value[0], element) // arrays: use first value
|
|
237
|
+
if (is_color(value)) return value // already a color string
|
|
238
|
+
|
|
239
|
+
if (!heat_values.length || !color_scale_fn || value_is_missing(value)) {
|
|
240
|
+
const category_color = (element && colors.category[element.category]) || `#cccccc`
|
|
241
|
+
if (missing.color === `element-category`) return category_color
|
|
242
|
+
// default: category colors for a plain table, gray for missing heatmap data
|
|
243
|
+
return missing.color || (heat_values.length ? `#666` : category_color)
|
|
244
|
+
}
|
|
258
245
|
|
|
259
|
-
|
|
260
|
-
(
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
)
|
|
264
|
-
|
|
246
|
+
// map value to [0, 1] range
|
|
247
|
+
const num = Number(value)
|
|
248
|
+
const span = cs_max - cs_min
|
|
249
|
+
if (span === 0) return color_scale_fn(0.5) // midpoint when all values equal
|
|
250
|
+
if (log) {
|
|
251
|
+
const log_span = Math.log(cs_max) - Math.log(cs_min_pos)
|
|
252
|
+
if (log_span === 0) return color_scale_fn(0.5)
|
|
253
|
+
return color_scale_fn((Math.log(num) - Math.log(cs_min_pos)) / log_span)
|
|
254
|
+
}
|
|
255
|
+
return color_scale_fn((num - cs_min) / span)
|
|
256
|
+
}
|
|
265
257
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
// Otherwise, map it through the color scale
|
|
270
|
-
return bg_color(val as number, element)
|
|
271
|
-
})
|
|
272
|
-
},
|
|
273
|
-
)
|
|
258
|
+
// per-segment colors for multi-value tiles (bg_color already handles color strings)
|
|
259
|
+
const bg_colors = (value: HeatValue | false, element?: ChemicalElement) =>
|
|
260
|
+
Array.isArray(value) ? value.map((val) => bg_color(val, element)) : []
|
|
274
261
|
|
|
275
262
|
// Determine whether to automatically show the color bar
|
|
276
|
-
let should_show_color_bar = $derived
|
|
277
|
-
if (!show_color_bar || inset || heat_values.length === 0) return false
|
|
278
|
-
|
|
279
|
-
const num_vals = heat_values
|
|
280
|
-
.flat()
|
|
281
|
-
.filter((val): val is number => typeof val === `number`)
|
|
282
|
-
|
|
283
|
-
const usable_values = log ? num_vals.filter((val) => val > 0) : num_vals
|
|
284
|
-
|
|
285
|
-
return usable_values.length > 0
|
|
286
|
-
})
|
|
263
|
+
let should_show_color_bar = $derived(show_color_bar && !inset && usable_heat_nums.length > 0)
|
|
287
264
|
|
|
288
265
|
// Calculate heat range for color bar
|
|
289
266
|
let heat_range = $derived.by((): Vec2 => {
|
|
290
267
|
if (!should_show_color_bar) return [0, 1]
|
|
291
|
-
|
|
292
|
-
const
|
|
293
|
-
.flat()
|
|
294
|
-
.filter((val): val is number => typeof val === `number`)
|
|
295
|
-
const usable_values = log ? numeric_values.filter((val) => val > 0) : numeric_values
|
|
296
|
-
|
|
297
|
-
if (usable_values.length === 0) return [0, 1]
|
|
298
|
-
|
|
299
|
-
const min = color_scale_range[0] ?? Math.min(...usable_values)
|
|
300
|
-
const max = color_scale_range[1] ?? Math.max(...usable_values)
|
|
301
|
-
|
|
268
|
+
const min = color_scale_range[0] ?? Math.min(...usable_heat_nums)
|
|
269
|
+
const max = color_scale_range[1] ?? Math.max(...usable_heat_nums)
|
|
302
270
|
return [min, max]
|
|
303
271
|
})
|
|
304
272
|
</script>
|
|
305
273
|
|
|
306
274
|
<svelte:window bind:innerWidth={window_width} onkeydown={handle_key} />
|
|
307
275
|
|
|
308
|
-
<div {...rest} class=
|
|
276
|
+
<div {...rest} class={[`periodic-table`, rest.class]}>
|
|
309
277
|
<div class="ptable-grid" style:gap>
|
|
310
278
|
{#if should_show_color_bar}
|
|
311
279
|
<TableInset class="auto-colorbar-inset">
|
|
@@ -326,28 +294,32 @@
|
|
|
326
294
|
{#each element_data as element (element.number)}
|
|
327
295
|
{@const { column, row, category, name, symbol } = element}
|
|
328
296
|
{@const value = heat_values[element.number - 1]}
|
|
297
|
+
{@const override = color_overrides[symbol]}
|
|
298
|
+
{@const tile_missing = heat_values.length > 0 && !override && value_is_missing(value)}
|
|
329
299
|
{@const is_active_elem = active_elements?.some((active_elem) =>
|
|
330
300
|
typeof active_elem === `string`
|
|
331
301
|
? active_elem === symbol
|
|
332
|
-
: active_elem?.symbol === symbol
|
|
302
|
+
: active_elem?.symbol === symbol,
|
|
333
303
|
)}
|
|
334
|
-
{@const active =
|
|
335
|
-
active_element?.name === name || is_active_elem}
|
|
336
|
-
{@const style = `grid-column: ${column}; grid-row: ${row}
|
|
304
|
+
{@const active =
|
|
305
|
+
active_category === category || active_element?.name === name || is_active_elem}
|
|
306
|
+
{@const style = `grid-column: ${column}; grid-row: ${row};${
|
|
307
|
+
tile_props?.style ? ` ${tile_props.style}` : ``
|
|
308
|
+
}${tile_missing && missing.style ? ` ${missing.style}` : ``}`}
|
|
337
309
|
<ElementTile
|
|
338
310
|
{element}
|
|
339
311
|
href={links
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
{
|
|
345
|
-
{value}
|
|
346
|
-
|
|
347
|
-
bg_colors={Array.isArray(value) ? bg_colors(value, element) : []}
|
|
312
|
+
? typeof links == `string`
|
|
313
|
+
? `/${element[links]}`.toLowerCase()
|
|
314
|
+
: links[symbol]
|
|
315
|
+
: undefined}
|
|
316
|
+
value={tile_missing ? undefined : (value ?? undefined)}
|
|
317
|
+
bg_color={override ?? bg_color(value, element) ?? undefined}
|
|
318
|
+
bg_colors={!override && Array.isArray(value) ? bg_colors(value, element) : []}
|
|
348
319
|
{active}
|
|
349
|
-
label={labels[symbol]}
|
|
320
|
+
label={labels[symbol] ?? (tile_missing ? missing.label : undefined)}
|
|
350
321
|
{...tile_props}
|
|
322
|
+
{style}
|
|
351
323
|
onmouseenter={(event: MouseEvent) => {
|
|
352
324
|
set_active_element(element)()
|
|
353
325
|
handle_tooltip_enter(element, event)
|
|
@@ -390,17 +362,16 @@
|
|
|
390
362
|
{#if tooltip_visible && tooltip_element}
|
|
391
363
|
{@const el = tooltip_element as ChemicalElement}
|
|
392
364
|
{@const style = `left: ${tooltip_pos.x}px; top: ${tooltip_pos.y}px;`}
|
|
393
|
-
{@const tooltip_value = heat_values[el.number - 1]
|
|
365
|
+
{@const tooltip_value = heat_values[el.number - 1]}
|
|
394
366
|
{#if typeof tooltip == `function`}
|
|
395
367
|
<div class="tooltip" {style}>
|
|
396
368
|
{@render tooltip({
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
})}
|
|
369
|
+
element: el,
|
|
370
|
+
value: tooltip_value ?? null,
|
|
371
|
+
active: active_category === el.category || active_element?.name === el.name,
|
|
372
|
+
bg_color: color_overrides[el.symbol] ?? bg_color(tooltip_value, el),
|
|
373
|
+
scale_context: { min: log ? cs_min_pos : cs_min, max: cs_max, color_scale },
|
|
374
|
+
})}
|
|
404
375
|
</div>
|
|
405
376
|
{:else if tooltip !== false}
|
|
406
377
|
<div class="tooltip" {style}>
|
|
@@ -448,10 +419,7 @@
|
|
|
448
419
|
.tooltip {
|
|
449
420
|
position: absolute;
|
|
450
421
|
transform: translate(-50%, -10%);
|
|
451
|
-
background: var(
|
|
452
|
-
--tooltip-bg,
|
|
453
|
-
light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.85))
|
|
454
|
-
);
|
|
422
|
+
background: var(--tooltip-bg, light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.85)));
|
|
455
423
|
color: var(--tooltip-color, light-dark(#222, #eee));
|
|
456
424
|
padding: var(--tooltip-padding, 4px 6px);
|
|
457
425
|
border-radius: var(--tooltip-border-radius, var(--border-radius, 3pt));
|
|
@@ -4,12 +4,14 @@ import { ColorBar } from '../plot';
|
|
|
4
4
|
import type { ComponentProps, Snippet } from 'svelte';
|
|
5
5
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
6
6
|
import type { D3InterpolateName } from '../colors';
|
|
7
|
+
import type { MissingCellStyle } from '../heatmap-matrix';
|
|
7
8
|
import type { ScaleContext } from './index';
|
|
9
|
+
type HeatValue = number | number[] | string | string[];
|
|
8
10
|
type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
|
|
9
11
|
tile_props?: Partial<ComponentProps<typeof ElementTile>>;
|
|
10
12
|
show_photo?: boolean;
|
|
11
13
|
disabled?: boolean;
|
|
12
|
-
heatmap_values?: Partial<Record<ElementSymbol,
|
|
14
|
+
heatmap_values?: Partial<Record<ElementSymbol, HeatValue | null>> | (HeatValue | null)[];
|
|
13
15
|
links?: keyof ChemicalElement | Record<ElementSymbol, string> | null;
|
|
14
16
|
log?: boolean;
|
|
15
17
|
color_scale?: D3InterpolateName | ((num: number) => string);
|
|
@@ -28,7 +30,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
|
|
|
28
30
|
color_scale_range?: [number | null, number | null];
|
|
29
31
|
color_overrides?: Partial<Record<ElementSymbol, string>>;
|
|
30
32
|
labels?: Partial<Record<ElementSymbol, string>>;
|
|
31
|
-
|
|
33
|
+
missing?: MissingCellStyle;
|
|
32
34
|
split_layout?: `diagonal` | `horizontal` | `vertical` | `triangular` | `quadrant`;
|
|
33
35
|
show_color_bar?: boolean;
|
|
34
36
|
color_bar_props?: Partial<ComponentProps<typeof ColorBar>>;
|
|
@@ -41,7 +43,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
|
|
|
41
43
|
tooltip?: Snippet<[
|
|
42
44
|
{
|
|
43
45
|
element: ChemicalElement;
|
|
44
|
-
value:
|
|
46
|
+
value: HeatValue | null;
|
|
45
47
|
active: boolean;
|
|
46
48
|
bg_color: string | null;
|
|
47
49
|
scale_context: ScaleContext;
|