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
|
@@ -29,12 +29,7 @@
|
|
|
29
29
|
import TemperatureSlider from './TemperatureSlider.svelte'
|
|
30
30
|
import type { Point4D } from './thermodynamics'
|
|
31
31
|
import * as thermo from './thermodynamics'
|
|
32
|
-
import type {
|
|
33
|
-
ConvexHullEntry,
|
|
34
|
-
HighlightStyle,
|
|
35
|
-
HullFaceColorMode,
|
|
36
|
-
PhaseData,
|
|
37
|
-
} from './types'
|
|
32
|
+
import type { ConvexHullEntry, HighlightStyle, HullFaceColorMode, PhaseData } from './types'
|
|
38
33
|
import { MAGNETIC_ORDERING_CATEGORY } from './types'
|
|
39
34
|
import { compute_hull_stability } from './helpers'
|
|
40
35
|
|
|
@@ -61,9 +56,7 @@
|
|
|
61
56
|
),
|
|
62
57
|
element_colors = vesta_hex,
|
|
63
58
|
color_mode = $bindable(DEFAULTS.convex_hull.quaternary.color_mode),
|
|
64
|
-
color_scale = $bindable(
|
|
65
|
-
DEFAULTS.convex_hull.quaternary.color_scale as D3InterpolateName,
|
|
66
|
-
),
|
|
59
|
+
color_scale = $bindable(DEFAULTS.convex_hull.quaternary.color_scale as D3InterpolateName),
|
|
67
60
|
info_pane_open = $bindable(DEFAULTS.convex_hull.quaternary.info_pane_open),
|
|
68
61
|
controls_open = $bindable(DEFAULTS.convex_hull.quaternary.legend_pane_open),
|
|
69
62
|
max_hull_dist_show_phases = $bindable(
|
|
@@ -72,12 +65,8 @@
|
|
|
72
65
|
max_hull_dist_show_labels = $bindable(
|
|
73
66
|
DEFAULTS.convex_hull.quaternary.max_hull_dist_show_labels,
|
|
74
67
|
),
|
|
75
|
-
show_stable_labels = $bindable(
|
|
76
|
-
|
|
77
|
-
),
|
|
78
|
-
show_unstable_labels = $bindable(
|
|
79
|
-
DEFAULTS.convex_hull.quaternary.show_unstable_labels,
|
|
80
|
-
),
|
|
68
|
+
show_stable_labels = $bindable(DEFAULTS.convex_hull.quaternary.show_stable_labels),
|
|
69
|
+
show_unstable_labels = $bindable(DEFAULTS.convex_hull.quaternary.show_unstable_labels),
|
|
81
70
|
on_file_drop,
|
|
82
71
|
enable_click_selection = true,
|
|
83
72
|
enable_structure_preview = true,
|
|
@@ -96,9 +85,10 @@
|
|
|
96
85
|
children,
|
|
97
86
|
tooltip,
|
|
98
87
|
...rest
|
|
99
|
-
}: BaseConvexHullProps<ConvexHullEntry> &
|
|
100
|
-
|
|
101
|
-
|
|
88
|
+
}: BaseConvexHullProps<ConvexHullEntry> &
|
|
89
|
+
Hull3DProps & {
|
|
90
|
+
highlight_style?: HighlightStyle
|
|
91
|
+
} = $props()
|
|
102
92
|
|
|
103
93
|
const merged_controls = $derived({ ...default_controls, ...controls })
|
|
104
94
|
const controls_config = $derived(normalize_show_controls(show_controls))
|
|
@@ -106,13 +96,24 @@
|
|
|
106
96
|
...default_hull_config,
|
|
107
97
|
...config,
|
|
108
98
|
colors: { ...default_hull_config.colors, ...config.colors },
|
|
109
|
-
margin: { t: 60, r: 60, b: 60, l: 60, ...config.margin },
|
|
110
99
|
})
|
|
111
100
|
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
101
|
+
// Cache resolved canvas colors and refresh them only when the theme changes.
|
|
102
|
+
const initial_text_color = helpers.get_canvas_text_color(is_dark_mode())
|
|
103
|
+
let text_color = $state(initial_text_color)
|
|
104
|
+
let hull_edge_color = $state(initial_text_color)
|
|
105
|
+
function refresh_canvas_colors(dark_mode: boolean): void {
|
|
106
|
+
const next_text_color = helpers.get_canvas_text_color(dark_mode)
|
|
107
|
+
text_color = next_text_color
|
|
108
|
+
const resolved_edge_color = canvas
|
|
109
|
+
? getComputedStyle(canvas).getPropertyValue(`--hull-edge-color`).trim()
|
|
110
|
+
: ``
|
|
111
|
+
hull_edge_color = resolved_edge_color || next_text_color
|
|
112
|
+
}
|
|
113
|
+
$effect(() => {
|
|
114
|
+
refresh_canvas_colors(is_dark_mode())
|
|
115
|
+
return watch_dark_mode(refresh_canvas_colors)
|
|
116
|
+
})
|
|
116
117
|
|
|
117
118
|
// Shared reactive data pipeline (temperature → gas → energy mode → hull data → threshold)
|
|
118
119
|
// Explicit generic breaks the circular type inference through the all_enriched_entries thunk
|
|
@@ -131,44 +132,44 @@
|
|
|
131
132
|
show_unstable: () => show_unstable,
|
|
132
133
|
entry_category: () => entry_category,
|
|
133
134
|
hidden_categories: () => hidden_categories,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
set_max_hull_dist_show_phases: (value) => max_hull_dist_show_phases = value,
|
|
140
|
-
set_stable_entries: (value) => stable_entries = value,
|
|
141
|
-
set_unstable_entries: (value) => unstable_entries = value,
|
|
135
|
+
keep_plot_entry: helpers.entry_within_hull_dist,
|
|
136
|
+
set_temperature: (next_temp) => (temperature = next_temp),
|
|
137
|
+
set_max_hull_dist_show_phases: (value) => (max_hull_dist_show_phases = value),
|
|
138
|
+
set_stable_entries: (value) => (stable_entries = value),
|
|
139
|
+
set_unstable_entries: (value) => (unstable_entries = value),
|
|
142
140
|
})
|
|
143
141
|
const merged_gas_config = $derived(hull_data.merged_gas_config)
|
|
144
142
|
const pd_data = $derived(hull_data.pd_data)
|
|
145
143
|
const elements = $derived(hull_data.elements)
|
|
146
144
|
const plot_entries = $derived(hull_data.plot_entries)
|
|
147
145
|
|
|
146
|
+
// Entry → 4D hull point (3 barycentric composition fractions + e_form as w),
|
|
147
|
+
// or null when the entry lacks a finite formation energy or valid composition
|
|
148
|
+
function to_point_4d(entry: ConvexHullEntry): Point4D | null {
|
|
149
|
+
if (
|
|
150
|
+
!Number.isFinite(entry.e_form_per_atom) ||
|
|
151
|
+
![entry.x, entry.y, entry.z].every(Number.isFinite)
|
|
152
|
+
)
|
|
153
|
+
return null
|
|
154
|
+
const amounts = elements.map((el) => entry.composition[el] || 0)
|
|
155
|
+
const total = amounts.reduce((sum, amt) => sum + amt, 0)
|
|
156
|
+
if (!(total > 0)) return null
|
|
157
|
+
const [x, y, z] = amounts.map((amt) => amt / total)
|
|
158
|
+
return [x, y, z].every(Number.isFinite)
|
|
159
|
+
? { x, y, z, w: entry.e_form_per_atom ?? NaN }
|
|
160
|
+
: null
|
|
161
|
+
}
|
|
162
|
+
|
|
148
163
|
// Compute 4D hull for visualization (always compute when we have formation energies)
|
|
149
164
|
const hull_4d = $derived.by(() => {
|
|
150
165
|
if (elements.length !== 4) return []
|
|
151
166
|
|
|
152
167
|
try {
|
|
153
|
-
//
|
|
154
|
-
const
|
|
168
|
+
// Excluded entries don't participate in hull construction
|
|
169
|
+
const points_4d = compute_4d_coords(pd_data.entries, elements)
|
|
155
170
|
.filter((ent) => !ent.exclude_from_hull)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const points_4d: Point4D[] = coords
|
|
159
|
-
.filter(
|
|
160
|
-
(ent) =>
|
|
161
|
-
Number.isFinite(ent.e_form_per_atom) &&
|
|
162
|
-
[ent.x, ent.y, ent.z].every(Number.isFinite),
|
|
163
|
-
)
|
|
164
|
-
.map((ent) => {
|
|
165
|
-
const amounts = elements.map((el) => ent.composition[el] || 0)
|
|
166
|
-
const total = amounts.reduce((sum, amt) => sum + amt, 0)
|
|
167
|
-
if (!(total > 0)) return { x: NaN, y: NaN, z: NaN, w: NaN }
|
|
168
|
-
const [x, y, z] = amounts.map((amt) => amt / total)
|
|
169
|
-
return { x, y, z, w: ent.e_form_per_atom ?? NaN }
|
|
170
|
-
})
|
|
171
|
-
.filter((point) => [point.x, point.y, point.z, point.w].every(Number.isFinite))
|
|
171
|
+
.map(to_point_4d)
|
|
172
|
+
.filter((point): point is Point4D => point !== null)
|
|
172
173
|
|
|
173
174
|
if (points_4d.length < 5) return [] // Need at least 5 points for 4D hull
|
|
174
175
|
|
|
@@ -189,32 +190,26 @@
|
|
|
189
190
|
|
|
190
191
|
// Build 4D points, tracking original indices for mapping hull distances back
|
|
191
192
|
const valid = coords.flatMap((entry, idx) => {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
![entry.x, entry.y, entry.z].every(Number.isFinite)
|
|
195
|
-
) return []
|
|
196
|
-
const amounts = elements.map((el) => entry.composition[el] || 0)
|
|
197
|
-
const total = amounts.reduce((sum, amt) => sum + amt, 0)
|
|
198
|
-
if (!(total > 0)) return []
|
|
199
|
-
const [x, y, z] = amounts.map((amt) => amt / total)
|
|
200
|
-
return [x, y, z].every(Number.isFinite)
|
|
201
|
-
? [{ idx, pt: { x, y, z, w: entry.e_form_per_atom ?? NaN } }]
|
|
202
|
-
: []
|
|
193
|
+
const pt = to_point_4d(entry)
|
|
194
|
+
return pt ? [{ idx, pt }] : []
|
|
203
195
|
})
|
|
204
|
-
const raw_dists = thermo.compute_e_above_hull_4d(
|
|
196
|
+
const raw_dists = thermo.compute_e_above_hull_4d(
|
|
197
|
+
valid.map((item) => item.pt),
|
|
198
|
+
hull_4d,
|
|
199
|
+
)
|
|
205
200
|
const hull_map = new Map(valid.map((item, hull_idx) => [item.idx, raw_dists[hull_idx]]))
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
})
|
|
201
|
+
// missing/non-finite distance (no energy or point outside hull projection) -> unknown
|
|
202
|
+
return coords.map((entry, idx) => ({
|
|
203
|
+
...entry,
|
|
204
|
+
...compute_hull_stability(hull_map.get(idx), entry.exclude_from_hull),
|
|
205
|
+
}))
|
|
211
206
|
} catch (err) {
|
|
212
207
|
console.error(`Error computing quaternary coordinates:`, err)
|
|
213
208
|
return []
|
|
214
209
|
}
|
|
215
210
|
})
|
|
216
211
|
|
|
217
|
-
let canvas
|
|
212
|
+
let canvas = $state<HTMLCanvasElement>()
|
|
218
213
|
let ctx: CanvasRenderingContext2D | null = null
|
|
219
214
|
|
|
220
215
|
// Camera state - following Materials Project's 3D camera setup
|
|
@@ -234,12 +229,12 @@
|
|
|
234
229
|
canvas: () => canvas,
|
|
235
230
|
wrapper: () => wrapper,
|
|
236
231
|
ctx: () => ctx,
|
|
237
|
-
set_ctx: (context) => ctx = context,
|
|
238
|
-
set_canvas_dims: (dims) => canvas_dims = dims,
|
|
232
|
+
set_ctx: (context) => (ctx = context),
|
|
233
|
+
set_canvas_dims: (dims) => (canvas_dims = dims),
|
|
239
234
|
visible_entries: () => hull_data.visible_entries,
|
|
240
235
|
plot_entries: () => plot_entries,
|
|
241
236
|
selected_entry: () => selected_entry,
|
|
242
|
-
set_selected_entry: (entry) => selected_entry = entry,
|
|
237
|
+
set_selected_entry: (entry) => (selected_entry = entry),
|
|
243
238
|
fullscreen: () => fullscreen,
|
|
244
239
|
enable_click_selection: () => enable_click_selection,
|
|
245
240
|
enable_structure_preview: () => enable_structure_preview,
|
|
@@ -248,7 +243,7 @@
|
|
|
248
243
|
on_file_drop: () => on_file_drop,
|
|
249
244
|
entry_category: () => entry_category,
|
|
250
245
|
zoom: () => camera.zoom,
|
|
251
|
-
set_zoom: (zoom) => camera.zoom = zoom,
|
|
246
|
+
set_zoom: (zoom) => (camera.zoom = zoom),
|
|
252
247
|
project_point: project_3d_point,
|
|
253
248
|
extract_structure: extract_structure_from_entry,
|
|
254
249
|
render_frame,
|
|
@@ -271,11 +266,11 @@
|
|
|
271
266
|
},
|
|
272
267
|
actions: () => ({
|
|
273
268
|
r: reset_camera,
|
|
274
|
-
b: () => color_mode = color_mode === `stability` ? `energy` : `stability
|
|
275
|
-
s: () => show_stable = !show_stable,
|
|
276
|
-
u: () => show_unstable = !show_unstable,
|
|
277
|
-
h: () => show_hull_faces = !show_hull_faces,
|
|
278
|
-
l: () => show_stable_labels = !show_stable_labels,
|
|
269
|
+
b: () => (color_mode = color_mode === `stability` ? `energy` : `stability`),
|
|
270
|
+
s: () => (show_stable = !show_stable),
|
|
271
|
+
u: () => (show_unstable = !show_unstable),
|
|
272
|
+
h: () => (show_hull_faces = !show_hull_faces),
|
|
273
|
+
l: () => (show_stable_labels = !show_stable_labels),
|
|
279
274
|
}),
|
|
280
275
|
})
|
|
281
276
|
const { render_once } = interactions
|
|
@@ -292,9 +287,7 @@
|
|
|
292
287
|
let pulse_opacity = $derived(0.3 + 0.4 * pulse.unit)
|
|
293
288
|
|
|
294
289
|
// Merge highlight style with defaults
|
|
295
|
-
const merged_highlight_style = $derived(
|
|
296
|
-
helpers.merge_highlight_style(highlight_style),
|
|
297
|
-
)
|
|
290
|
+
const merged_highlight_style = $derived(helpers.merge_highlight_style(highlight_style))
|
|
298
291
|
|
|
299
292
|
// Helper to check if entry is highlighted
|
|
300
293
|
const is_highlighted = (entry: ConvexHullEntry): boolean =>
|
|
@@ -303,13 +296,11 @@
|
|
|
303
296
|
// Re-render when important state changes
|
|
304
297
|
$effect(() => {
|
|
305
298
|
// oxfmt-ignore
|
|
306
|
-
void [show_hull_faces, color_mode, color_scale, camera.rotation_x, camera.rotation_y, camera.zoom, camera.center_x, camera.center_y, plot_entries, hull_data.visible_entries, hull_face_color, hull_face_opacity, hull_face_color_mode, element_colors, text_color, elements] // track reactively
|
|
299
|
+
void [show_hull_faces, color_mode, color_scale, camera.rotation_x, camera.rotation_y, camera.zoom, camera.center_x, camera.center_y, plot_entries, hull_data.visible_entries, hull_face_color, hull_face_opacity, hull_face_color_mode, element_colors, text_color, hull_edge_color, elements] // track reactively
|
|
307
300
|
|
|
308
301
|
render_once()
|
|
309
302
|
})
|
|
310
303
|
|
|
311
|
-
// Visibility toggles are now bindable props
|
|
312
|
-
|
|
313
304
|
// Smart label defaults: hide labels for large datasets. Applied once per dataset
|
|
314
305
|
// (keyed on the entries prop) so later entry-count changes from temperature/gas
|
|
315
306
|
// filtering don't clobber the user's label toggles.
|
|
@@ -347,8 +338,7 @@
|
|
|
347
338
|
show_unstable_labels = DEFAULTS.convex_hull.quaternary.show_unstable_labels
|
|
348
339
|
// Use auto-computed threshold based on entry count instead of static default
|
|
349
340
|
max_hull_dist_show_phases = hull_data.auto_default_threshold
|
|
350
|
-
max_hull_dist_show_labels =
|
|
351
|
-
DEFAULTS.convex_hull.quaternary.max_hull_dist_show_labels
|
|
341
|
+
max_hull_dist_show_labels = DEFAULTS.convex_hull.quaternary.max_hull_dist_show_labels
|
|
352
342
|
show_hull_faces = DEFAULTS.convex_hull.quaternary.show_hull_faces
|
|
353
343
|
hull_face_color = DEFAULTS.convex_hull.quaternary.hull_face_color
|
|
354
344
|
hull_face_opacity = DEFAULTS.convex_hull.quaternary.hull_face_opacity
|
|
@@ -365,8 +355,8 @@
|
|
|
365
355
|
)
|
|
366
356
|
|
|
367
357
|
// Cache energy color scale per frame/setting
|
|
368
|
-
const energy_color_scale = $derived
|
|
369
|
-
helpers.get_energy_color_scale(color_mode, color_scale, plot_entries)
|
|
358
|
+
const energy_color_scale = $derived(
|
|
359
|
+
helpers.get_energy_color_scale(color_mode, color_scale, plot_entries),
|
|
370
360
|
)
|
|
371
361
|
|
|
372
362
|
// Convex hull statistics - compute internally and expose via bindable prop
|
|
@@ -382,16 +372,11 @@
|
|
|
382
372
|
): { x: number; y: number; depth: number } {
|
|
383
373
|
if (!canvas) return { x: 0, y: 0, depth: 0 }
|
|
384
374
|
|
|
385
|
-
// Center coordinates around tetrahedron
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
const
|
|
390
|
-
const centroid_y = (0 + Math.sqrt(3) / 2 + Math.sqrt(3) / 6 + 0) / 4 // = √3/6
|
|
391
|
-
const centroid_z = (0 + 0 + Math.sqrt(6) / 3 + 0) / 4 // = √6/12
|
|
392
|
-
centered_x = x - centroid_x
|
|
393
|
-
centered_y = y - centroid_y
|
|
394
|
-
centered_z = z - centroid_z
|
|
375
|
+
// Center coordinates around the tetrahedron centroid: average of vertices
|
|
376
|
+
// (1,0,0), (0.5,√3/2,0), (0.5,√3/6,√6/3), (0,0,0)
|
|
377
|
+
const centered_x = x - (1 + 0.5 + 0.5 + 0) / 4 // centroid_x = 0.5
|
|
378
|
+
const centered_y = y - (0 + Math.sqrt(3) / 2 + Math.sqrt(3) / 6 + 0) / 4 // = √3/6
|
|
379
|
+
const centered_z = z - (0 + 0 + Math.sqrt(6) / 3 + 0) / 4 // = √6/12
|
|
395
380
|
|
|
396
381
|
// Apply 3D transformations around the centered coordinates
|
|
397
382
|
const cos_x = Math.cos(camera.rotation_x)
|
|
@@ -419,56 +404,33 @@
|
|
|
419
404
|
}
|
|
420
405
|
}
|
|
421
406
|
|
|
407
|
+
// Dashed tetrahedron outline (matching the gray structure lines used in 3D)
|
|
408
|
+
// plus corner element labels
|
|
422
409
|
function draw_structure_outline(): void {
|
|
423
410
|
if (!ctx || !canvas) return
|
|
424
411
|
|
|
425
|
-
const styles = getComputedStyle(canvas)
|
|
426
|
-
// Match gray dashed structure lines used in 3D
|
|
427
412
|
ctx.strokeStyle = CONVEX_HULL_STYLE.structure_line.color
|
|
428
413
|
ctx.lineWidth = CONVEX_HULL_STYLE.structure_line.line_width
|
|
429
414
|
ctx.setLineDash(CONVEX_HULL_STYLE.structure_line.dash)
|
|
430
415
|
|
|
431
|
-
// Draw tetrahedron edges
|
|
432
|
-
draw_tetrahedron()
|
|
433
|
-
|
|
434
|
-
// Reset dash and stroke for subsequent drawings
|
|
435
|
-
ctx.setLineDash([])
|
|
436
|
-
ctx.strokeStyle = styles.getPropertyValue(`--hull-edge-color`) || `#212121`
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
function draw_tetrahedron(): void {
|
|
440
|
-
if (!ctx) return
|
|
441
|
-
|
|
442
|
-
// Convert vertices to Point3D objects
|
|
443
416
|
const vertices = TETRAHEDRON_VERTICES.map(([x, y, z]) => ({ x, y, z }))
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
const edges = [
|
|
447
|
-
[0, 1],
|
|
448
|
-
[0, 2],
|
|
449
|
-
[0, 3], // From vertex 0
|
|
450
|
-
[1, 2],
|
|
451
|
-
[1, 3], // From vertex 1
|
|
452
|
-
[2, 3], // From vertex 2
|
|
453
|
-
]
|
|
454
|
-
|
|
455
|
-
// Draw edges
|
|
417
|
+
// oxfmt-ignore
|
|
418
|
+
const edges = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
|
|
456
419
|
ctx.beginPath()
|
|
457
420
|
for (const [start, end] of edges) {
|
|
458
|
-
const
|
|
459
|
-
const
|
|
460
|
-
|
|
461
|
-
const proj1 = project_3d_point(v1.x, v1.y, v1.z)
|
|
462
|
-
const proj2 = project_3d_point(v2.x, v2.y, v2.z)
|
|
463
|
-
|
|
421
|
+
const proj1 = project_3d_point(vertices[start].x, vertices[start].y, vertices[start].z)
|
|
422
|
+
const proj2 = project_3d_point(vertices[end].x, vertices[end].y, vertices[end].z)
|
|
464
423
|
ctx.moveTo(proj1.x, proj1.y)
|
|
465
424
|
ctx.lineTo(proj2.x, proj2.y)
|
|
466
425
|
}
|
|
467
426
|
ctx.stroke()
|
|
468
427
|
|
|
469
|
-
//
|
|
428
|
+
// Reset dash and stroke for subsequent drawings
|
|
429
|
+
ctx.setLineDash([])
|
|
430
|
+
ctx.strokeStyle = hull_edge_color
|
|
431
|
+
|
|
432
|
+
// Corner element labels: place just outside each vertex, along the centroid→vertex line
|
|
470
433
|
if (elements.length === 4) {
|
|
471
|
-
// Tetrahedron centroid in barycentric space maps to average of vertices
|
|
472
434
|
const centroid = {
|
|
473
435
|
x: (vertices[0].x + vertices[1].x + vertices[2].x + vertices[3].x) / 4,
|
|
474
436
|
y: (vertices[0].y + vertices[1].y + vertices[2].y + vertices[3].y) / 4,
|
|
@@ -483,16 +445,13 @@
|
|
|
483
445
|
const distance = 0.06
|
|
484
446
|
for (let idx = 0; idx < 4; idx++) {
|
|
485
447
|
const vx = vertices[idx]
|
|
486
|
-
|
|
487
|
-
const { x: cx, y: cy, z: cz } = centroid
|
|
488
|
-
const dir = { x: vx.x - cx, y: vx.y - cy, z: vx.z - cz }
|
|
448
|
+
const dir = { x: vx.x - centroid.x, y: vx.y - centroid.y, z: vx.z - centroid.z }
|
|
489
449
|
const len = Math.hypot(dir.x, dir.y, dir.z) || 1
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
const proj = project_3d_point(label_pos.x, label_pos.y, label_pos.z)
|
|
450
|
+
const proj = project_3d_point(
|
|
451
|
+
vx.x + (dir.x / len) * distance,
|
|
452
|
+
vx.y + (dir.y / len) * distance,
|
|
453
|
+
vx.z + (dir.z / len) * distance,
|
|
454
|
+
)
|
|
496
455
|
ctx.fillText(elements[idx], proj.x, proj.y)
|
|
497
456
|
}
|
|
498
457
|
}
|
|
@@ -527,30 +486,10 @@
|
|
|
527
486
|
const [p0, p1, p2, p3] = tet.vertices
|
|
528
487
|
|
|
529
488
|
// Convert barycentric coordinates to tetrahedral 3D coordinates
|
|
530
|
-
const tet0 = barycentric_to_tetrahedral([
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
1 - p0.x - p0.y - p0.z,
|
|
535
|
-
])
|
|
536
|
-
const tet1 = barycentric_to_tetrahedral([
|
|
537
|
-
p1.x,
|
|
538
|
-
p1.y,
|
|
539
|
-
p1.z,
|
|
540
|
-
1 - p1.x - p1.y - p1.z,
|
|
541
|
-
])
|
|
542
|
-
const tet2 = barycentric_to_tetrahedral([
|
|
543
|
-
p2.x,
|
|
544
|
-
p2.y,
|
|
545
|
-
p2.z,
|
|
546
|
-
1 - p2.x - p2.y - p2.z,
|
|
547
|
-
])
|
|
548
|
-
const tet3 = barycentric_to_tetrahedral([
|
|
549
|
-
p3.x,
|
|
550
|
-
p3.y,
|
|
551
|
-
p3.z,
|
|
552
|
-
1 - p3.x - p3.y - p3.z,
|
|
553
|
-
])
|
|
489
|
+
const tet0 = barycentric_to_tetrahedral([p0.x, p0.y, p0.z, 1 - p0.x - p0.y - p0.z])
|
|
490
|
+
const tet1 = barycentric_to_tetrahedral([p1.x, p1.y, p1.z, 1 - p1.x - p1.y - p1.z])
|
|
491
|
+
const tet2 = barycentric_to_tetrahedral([p2.x, p2.y, p2.z, 1 - p2.x - p2.y - p2.z])
|
|
492
|
+
const tet3 = barycentric_to_tetrahedral([p3.x, p3.y, p3.z, 1 - p3.x - p3.y - p3.z])
|
|
554
493
|
|
|
555
494
|
// Project to 2D screen space
|
|
556
495
|
const proj0 = project_3d_point(tet0.x, tet0.y, tet0.z)
|
|
@@ -564,8 +503,14 @@
|
|
|
564
503
|
(p0.x + p1.x + p2.x + p3.x) / 4,
|
|
565
504
|
(p0.y + p1.y + p2.y + p3.y) / 4,
|
|
566
505
|
(p0.z + p1.z + p2.z + p3.z) / 4,
|
|
567
|
-
(
|
|
568
|
-
|
|
506
|
+
(1 -
|
|
507
|
+
p0.x -
|
|
508
|
+
p0.y -
|
|
509
|
+
p0.z +
|
|
510
|
+
(1 - p1.x - p1.y - p1.z) +
|
|
511
|
+
(1 - p2.x - p2.y - p2.z) +
|
|
512
|
+
(1 - p3.x - p3.y - p3.z)) /
|
|
513
|
+
4,
|
|
569
514
|
]
|
|
570
515
|
|
|
571
516
|
// Each tetrahedron has 4 triangular faces
|
|
@@ -607,7 +552,7 @@
|
|
|
607
552
|
let min_w = 0
|
|
608
553
|
if (hull_face_color_mode === `formation_energy`) {
|
|
609
554
|
const all_avg_w = triangles.map((tri) => tri.avg_w)
|
|
610
|
-
min_w =
|
|
555
|
+
min_w = helpers.array_min(all_avg_w)
|
|
611
556
|
energy_face_scale = helpers.get_energy_color_scale(
|
|
612
557
|
`energy`,
|
|
613
558
|
color_scale,
|
|
@@ -625,7 +570,7 @@
|
|
|
625
570
|
}
|
|
626
571
|
if (hull_face_color_mode === `dominant_element`) {
|
|
627
572
|
// Find element with highest fraction
|
|
628
|
-
const max_idx = tri.centroid_bary.indexOf(
|
|
573
|
+
const max_idx = tri.centroid_bary.indexOf(helpers.array_max(tri.centroid_bary))
|
|
629
574
|
const el = elements[max_idx]
|
|
630
575
|
return element_colors[el] ?? `#888888`
|
|
631
576
|
}
|
|
@@ -639,9 +584,10 @@
|
|
|
639
584
|
for (const tri of triangles) {
|
|
640
585
|
const [v0, v1, v2] = tri.vertices
|
|
641
586
|
// Uniform mode uses variable opacity; other modes use fixed opacity
|
|
642
|
-
const alpha =
|
|
643
|
-
|
|
644
|
-
|
|
587
|
+
const alpha =
|
|
588
|
+
hull_face_color_mode === `uniform`
|
|
589
|
+
? (norm_alpha?.(tri.avg_w) ?? hull_face_opacity)
|
|
590
|
+
: hull_face_opacity
|
|
645
591
|
const face_color = get_face_color(tri)
|
|
646
592
|
|
|
647
593
|
ctx.save()
|
|
@@ -683,9 +629,12 @@
|
|
|
683
629
|
.filter((entry) => {
|
|
684
630
|
if (entry.is_element) return false
|
|
685
631
|
const is_stable = helpers.entry_is_stable(entry)
|
|
686
|
-
return (
|
|
687
|
-
(
|
|
632
|
+
return (
|
|
633
|
+
(is_stable && show_stable_labels) ||
|
|
634
|
+
(!is_stable &&
|
|
635
|
+
show_unstable_labels &&
|
|
688
636
|
(entry.e_above_hull ?? 0) <= max_hull_dist_show_labels)
|
|
637
|
+
)
|
|
689
638
|
}),
|
|
690
639
|
)
|
|
691
640
|
|
|
@@ -761,7 +710,7 @@
|
|
|
761
710
|
|
|
762
711
|
<div
|
|
763
712
|
{...rest}
|
|
764
|
-
class=
|
|
713
|
+
class={[`convex-hull-4d`, rest.class]}
|
|
765
714
|
class:dragover={interactions.drag_over}
|
|
766
715
|
style={`${style}; ${rest.style ?? ``}`}
|
|
767
716
|
data-has-selection={selected_entry !== null}
|
|
@@ -776,11 +725,11 @@
|
|
|
776
725
|
aria-label="Convex hull visualization"
|
|
777
726
|
>
|
|
778
727
|
{@render children?.({
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
728
|
+
stable_entries,
|
|
729
|
+
unstable_entries,
|
|
730
|
+
highlighted_entries,
|
|
731
|
+
selected_entry,
|
|
732
|
+
})}
|
|
784
733
|
<h3 style="position: absolute; left: 1em; top: 1ex; margin: 0">
|
|
785
734
|
{@html sanitize_html(merged_controls.title || phase_stats?.chemical_system || ``)}
|
|
786
735
|
</h3>
|
|
@@ -853,7 +802,10 @@
|
|
|
853
802
|
/>
|
|
854
803
|
|
|
855
804
|
{#if hull_data.has_temp_data && temperature !== undefined}
|
|
856
|
-
<TemperatureSlider
|
|
805
|
+
<TemperatureSlider
|
|
806
|
+
available_temperatures={hull_data.available_temperatures}
|
|
807
|
+
bind:temperature
|
|
808
|
+
/>
|
|
857
809
|
{/if}
|
|
858
810
|
|
|
859
811
|
{#if hull_data.gas_analysis.has_gas_dependent_elements && merged_gas_config}
|
|
@@ -863,7 +815,6 @@
|
|
|
863
815
|
temperature={temperature ?? 300}
|
|
864
816
|
/>
|
|
865
817
|
{/if}
|
|
866
|
-
|
|
867
818
|
</div>
|
|
868
819
|
|
|
869
820
|
<style>
|
|
@@ -3,6 +3,6 @@ import type { ConvexHullEntry, HighlightStyle } from './types';
|
|
|
3
3
|
type $$ComponentProps = BaseConvexHullProps<ConvexHullEntry> & Hull3DProps & {
|
|
4
4
|
highlight_style?: HighlightStyle;
|
|
5
5
|
};
|
|
6
|
-
declare const ConvexHull4D: import("svelte").Component<$$ComponentProps, {}, "
|
|
6
|
+
declare const ConvexHull4D: import("svelte").Component<$$ComponentProps, {}, "fullscreen" | "wrapper" | "controls_open" | "color_scale" | "info_pane_open" | "temperature" | "show_hull_faces" | "hull_face_opacity" | "hull_face_color_mode" | "color_mode" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "hidden_categories" | "energy_source_mode" | "stable_entries" | "unstable_entries" | "phase_stats" | "highlighted_entries" | "selected_entry" | "gas_pressures">;
|
|
7
7
|
type ConvexHull4D = ReturnType<typeof ConvexHull4D>;
|
|
8
8
|
export default ConvexHull4D;
|
|
@@ -59,32 +59,30 @@
|
|
|
59
59
|
max_hull_dist_show_phases = $bindable(0),
|
|
60
60
|
max_hull_dist_show_labels = $bindable(0.1),
|
|
61
61
|
energy_source_mode = $bindable(`precomputed`),
|
|
62
|
-
}:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
& Pick<ComponentProps<typeof ConvexHullInfoPane>, `phase_stats` | `label_threshold`>
|
|
87
|
-
& {
|
|
62
|
+
}: Pick<
|
|
63
|
+
ControlsProps,
|
|
64
|
+
| `camera`
|
|
65
|
+
| `merged_controls`
|
|
66
|
+
| `stable_entries`
|
|
67
|
+
| `unstable_entries`
|
|
68
|
+
| `color_mode`
|
|
69
|
+
| `color_scale`
|
|
70
|
+
| `show_stable`
|
|
71
|
+
| `show_unstable`
|
|
72
|
+
| `entry_category`
|
|
73
|
+
| `hidden_categories`
|
|
74
|
+
| `show_stable_labels`
|
|
75
|
+
| `show_unstable_labels`
|
|
76
|
+
| `max_hull_dist_show_phases`
|
|
77
|
+
| `max_hull_dist_show_labels`
|
|
78
|
+
| `energy_source_mode`
|
|
79
|
+
| `controls_open`
|
|
80
|
+
| `show_hull_faces`
|
|
81
|
+
| `hull_face_color`
|
|
82
|
+
| `hull_face_opacity`
|
|
83
|
+
| `hull_face_color_mode`
|
|
84
|
+
> &
|
|
85
|
+
Pick<ComponentProps<typeof ConvexHullInfoPane>, `phase_stats` | `label_threshold`> & {
|
|
88
86
|
interactions: ReturnType<typeof create_canvas_interactions>
|
|
89
87
|
hull_data: ReturnType<typeof create_hull_data_pipeline<ConvexHullEntry>>
|
|
90
88
|
controls_config: ShowControlsState
|
|
@@ -107,12 +105,7 @@
|
|
|
107
105
|
{#if controls_config.mode !== `never`}
|
|
108
106
|
<section class="control-buttons {controls_config.class}">
|
|
109
107
|
{#if controls_config.visible(`reset`)}
|
|
110
|
-
<button
|
|
111
|
-
type="button"
|
|
112
|
-
onclick={reset_all}
|
|
113
|
-
title={reset_title}
|
|
114
|
-
class="reset-camera-btn"
|
|
115
|
-
>
|
|
108
|
+
<button type="button" onclick={reset_all} title={reset_title} class="reset-camera-btn">
|
|
116
109
|
<Icon icon="Reset" />
|
|
117
110
|
</button>
|
|
118
111
|
{/if}
|
|
@@ -159,14 +152,14 @@
|
|
|
159
152
|
{merged_controls}
|
|
160
153
|
toggle_props={{ class: `legend-controls-btn` }}
|
|
161
154
|
{show_hull_faces}
|
|
162
|
-
on_hull_faces_change={(value: boolean) => show_hull_faces = value}
|
|
155
|
+
on_hull_faces_change={(value: boolean) => (show_hull_faces = value)}
|
|
163
156
|
{hull_face_color}
|
|
164
|
-
on_hull_face_color_change={(value: string) => hull_face_color = value}
|
|
157
|
+
on_hull_face_color_change={(value: string) => (hull_face_color = value)}
|
|
165
158
|
{hull_face_opacity}
|
|
166
|
-
on_hull_face_opacity_change={(value: number) => hull_face_opacity = value}
|
|
159
|
+
on_hull_face_opacity_change={(value: number) => (hull_face_opacity = value)}
|
|
167
160
|
{hull_face_color_mode}
|
|
168
161
|
on_hull_face_color_mode_change={(value: HullFaceColorMode) =>
|
|
169
|
-
|
|
162
|
+
(hull_face_color_mode = value)}
|
|
170
163
|
bind:energy_source_mode
|
|
171
164
|
has_precomputed_e_form={hull_data.has_precomputed_e_form}
|
|
172
165
|
can_compute_e_form={hull_data.can_compute_e_form}
|
|
@@ -181,8 +174,7 @@
|
|
|
181
174
|
{#if interactions.hover_data}
|
|
182
175
|
{@const { entry, position } = interactions.hover_data}
|
|
183
176
|
{@const entry_highlight = is_highlighted(entry) ? merged_highlight_style : undefined}
|
|
184
|
-
{@const tooltip_style =
|
|
185
|
-
`z-index: ${CONVEX_HULL_STYLE.z_index.tooltip}; backdrop-filter: blur(4px);
|
|
177
|
+
{@const tooltip_style = `z-index: ${CONVEX_HULL_STYLE.z_index.tooltip}; backdrop-filter: blur(4px);
|
|
186
178
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);`}
|
|
187
179
|
<PlotTooltip
|
|
188
180
|
x={position.x}
|
|
@@ -209,7 +201,11 @@
|
|
|
209
201
|
/>
|
|
210
202
|
|
|
211
203
|
<!-- z-index 1: above auto-stacked siblings after the chrome (3D gizmo, gas controls), below z-2 sliders -->
|
|
212
|
-
<DragOverlay
|
|
204
|
+
<DragOverlay
|
|
205
|
+
visible={interactions.drag_over}
|
|
206
|
+
message="Drop JSON file to load phase diagram data"
|
|
207
|
+
style="z-index: 1"
|
|
208
|
+
/>
|
|
213
209
|
|
|
214
210
|
{#if interactions.modal_open && interactions.selected_structure}
|
|
215
211
|
<StructurePopup
|
|
@@ -260,7 +256,7 @@
|
|
|
260
256
|
color: var(--text-color, currentColor);
|
|
261
257
|
transition: background-color 0.2s;
|
|
262
258
|
display: flex;
|
|
263
|
-
font-size: clamp(0.
|
|
259
|
+
font-size: var(--ctrl-btn-icon-size, clamp(0.7rem, 2cqmin, 0.85rem));
|
|
264
260
|
}
|
|
265
261
|
.control-buttons :global(button):hover {
|
|
266
262
|
background-color: color-mix(in srgb, currentColor 8%, transparent);
|