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,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { D3InterpolateName } from '../colors'
|
|
3
|
+
import { clamp01 } from '../utils'
|
|
3
4
|
import {
|
|
4
5
|
add_alpha,
|
|
5
6
|
AXIS_COLORS,
|
|
@@ -15,9 +16,14 @@
|
|
|
15
16
|
import { sanitize_html } from '../sanitize'
|
|
16
17
|
import { Spinner } from '../feedback'
|
|
17
18
|
import { format_num } from '../labels'
|
|
18
|
-
import { to_radians, type
|
|
19
|
+
import { to_radians, type Vec2, type Vec3 } from '../math'
|
|
19
20
|
import { ColorBar } from '../plot'
|
|
20
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
centered_rect,
|
|
23
|
+
pad_rect,
|
|
24
|
+
rects_overlap,
|
|
25
|
+
rect_within_rect,
|
|
26
|
+
} from '../plot/core/layout'
|
|
21
27
|
import type { Rect } from '../plot/core/layout'
|
|
22
28
|
import { create_pulse_animation } from '../effects.svelte'
|
|
23
29
|
import { DEFAULTS } from '../settings'
|
|
@@ -76,9 +82,7 @@
|
|
|
76
82
|
),
|
|
77
83
|
element_colors = vesta_hex,
|
|
78
84
|
color_mode = $bindable(DEFAULTS.convex_hull.ternary.color_mode),
|
|
79
|
-
color_scale = $bindable(
|
|
80
|
-
DEFAULTS.convex_hull.ternary.color_scale as D3InterpolateName,
|
|
81
|
-
),
|
|
85
|
+
color_scale = $bindable(DEFAULTS.convex_hull.ternary.color_scale as D3InterpolateName),
|
|
82
86
|
info_pane_open = $bindable(DEFAULTS.convex_hull.ternary.info_pane_open),
|
|
83
87
|
controls_open = $bindable(DEFAULTS.convex_hull.ternary.legend_pane_open),
|
|
84
88
|
max_hull_dist_show_phases = $bindable(
|
|
@@ -88,9 +92,7 @@
|
|
|
88
92
|
DEFAULTS.convex_hull.ternary.max_hull_dist_show_labels,
|
|
89
93
|
),
|
|
90
94
|
show_stable_labels = $bindable(DEFAULTS.convex_hull.ternary.show_stable_labels),
|
|
91
|
-
show_unstable_labels = $bindable(
|
|
92
|
-
DEFAULTS.convex_hull.ternary.show_unstable_labels,
|
|
93
|
-
),
|
|
95
|
+
show_unstable_labels = $bindable(DEFAULTS.convex_hull.ternary.show_unstable_labels),
|
|
94
96
|
on_file_drop,
|
|
95
97
|
enable_click_selection = true,
|
|
96
98
|
enable_structure_preview = true,
|
|
@@ -110,9 +112,10 @@
|
|
|
110
112
|
children,
|
|
111
113
|
tooltip,
|
|
112
114
|
...rest
|
|
113
|
-
}: BaseConvexHullProps<ConvexHullEntry> &
|
|
114
|
-
|
|
115
|
-
|
|
115
|
+
}: BaseConvexHullProps<ConvexHullEntry> &
|
|
116
|
+
Hull3DProps & {
|
|
117
|
+
highlight_style?: HighlightStyle
|
|
118
|
+
} = $props()
|
|
116
119
|
|
|
117
120
|
const merged_controls = $derived({ ...default_controls, ...controls })
|
|
118
121
|
const controls_config = $derived(normalize_show_controls(show_controls))
|
|
@@ -120,7 +123,6 @@
|
|
|
120
123
|
...default_hull_config,
|
|
121
124
|
...config,
|
|
122
125
|
colors: { ...default_hull_config.colors, ...config.colors },
|
|
123
|
-
margin: { t: 40, r: 40, b: 60, l: 60, ...config.margin },
|
|
124
126
|
})
|
|
125
127
|
|
|
126
128
|
// Shared reactive data pipeline (temperature → gas → energy mode → hull data → threshold)
|
|
@@ -140,11 +142,11 @@
|
|
|
140
142
|
show_unstable: () => show_unstable,
|
|
141
143
|
entry_category: () => entry_category,
|
|
142
144
|
hidden_categories: () => hidden_categories,
|
|
143
|
-
keep_plot_entry:
|
|
144
|
-
set_temperature: (next_temp) => temperature = next_temp,
|
|
145
|
-
set_max_hull_dist_show_phases: (value) => max_hull_dist_show_phases = value,
|
|
146
|
-
set_stable_entries: (value) => stable_entries = value,
|
|
147
|
-
set_unstable_entries: (value) => unstable_entries = value,
|
|
145
|
+
keep_plot_entry: helpers.entry_within_hull_dist,
|
|
146
|
+
set_temperature: (next_temp) => (temperature = next_temp),
|
|
147
|
+
set_max_hull_dist_show_phases: (value) => (max_hull_dist_show_phases = value),
|
|
148
|
+
set_stable_entries: (value) => (stable_entries = value),
|
|
149
|
+
set_unstable_entries: (value) => (unstable_entries = value),
|
|
148
150
|
})
|
|
149
151
|
const has_temp_data = $derived(hull_data.has_temp_data)
|
|
150
152
|
const gas_analysis = $derived(hull_data.gas_analysis)
|
|
@@ -159,11 +161,7 @@
|
|
|
159
161
|
if (elements.length !== 3) return []
|
|
160
162
|
try {
|
|
161
163
|
// Pass precomputed el_refs to avoid recomputing in error diagnostics
|
|
162
|
-
const coords = get_ternary_3d_coordinates(
|
|
163
|
-
pd_data.entries,
|
|
164
|
-
elements,
|
|
165
|
-
pd_data.el_refs,
|
|
166
|
-
)
|
|
164
|
+
const coords = get_ternary_3d_coordinates(pd_data.entries, elements, pd_data.el_refs)
|
|
167
165
|
return coords
|
|
168
166
|
} catch (error) {
|
|
169
167
|
console.error(`Error computing ternary coordinates:`, error)
|
|
@@ -188,7 +186,7 @@
|
|
|
188
186
|
})
|
|
189
187
|
|
|
190
188
|
// Cached hull model for e_above_hull queries; recompute only when faces change
|
|
191
|
-
|
|
189
|
+
const hull_model = $derived(thermo.build_lower_hull_model(hull_faces))
|
|
192
190
|
|
|
193
191
|
// Enrich coords with e_above_hull from cached hull model (before filtering)
|
|
194
192
|
const all_enriched_entries = $derived.by(() => {
|
|
@@ -196,8 +194,10 @@
|
|
|
196
194
|
if (hull_data.energy_mode !== `on-the-fly`) return coords_entries
|
|
197
195
|
const pts = coords_entries.map(({ x, y, z }) => ({ x, y, z }))
|
|
198
196
|
const raw_dists = thermo.compute_e_above_hull_for_points(pts, hull_model)
|
|
197
|
+
// non-finite distance (no covering hull face) -> unknown, handled by compute_hull_stability
|
|
199
198
|
return coords_entries.map((entry, idx) => ({
|
|
200
|
-
...entry,
|
|
199
|
+
...entry,
|
|
200
|
+
...compute_hull_stability(raw_dists[idx], entry.exclude_from_hull),
|
|
201
201
|
}))
|
|
202
202
|
})
|
|
203
203
|
|
|
@@ -224,23 +224,11 @@
|
|
|
224
224
|
let gizmo_active = $state(false)
|
|
225
225
|
|
|
226
226
|
// Convert elevation/azimuth (degrees) to Three.js camera position + up vector.
|
|
227
|
-
function gizmo_camera(
|
|
228
|
-
elev_deg: number,
|
|
229
|
-
azim_deg: number,
|
|
230
|
-
): { position: Vec3; up: Vec3 } {
|
|
227
|
+
function gizmo_camera(elev_deg: number, azim_deg: number): { position: Vec3; up: Vec3 } {
|
|
231
228
|
const [elev, azim] = [to_radians(elev_deg), to_radians(azim_deg)]
|
|
232
|
-
const [se, ce, sa, ca] = [
|
|
233
|
-
Math.sin(elev),
|
|
234
|
-
Math.cos(elev),
|
|
235
|
-
Math.sin(azim),
|
|
236
|
-
Math.cos(azim),
|
|
237
|
-
]
|
|
229
|
+
const [se, ce, sa, ca] = [Math.sin(elev), Math.cos(elev), Math.sin(azim), Math.cos(azim)]
|
|
238
230
|
return {
|
|
239
|
-
position: [
|
|
240
|
-
-sa * se * GIZMO_CAM_DIST,
|
|
241
|
-
-ca * se * GIZMO_CAM_DIST,
|
|
242
|
-
ce * GIZMO_CAM_DIST,
|
|
243
|
-
],
|
|
231
|
+
position: [-sa * se * GIZMO_CAM_DIST, -ca * se * GIZMO_CAM_DIST, ce * GIZMO_CAM_DIST],
|
|
244
232
|
up: [sa * ce, ca * ce, se],
|
|
245
233
|
}
|
|
246
234
|
}
|
|
@@ -256,7 +244,7 @@
|
|
|
256
244
|
camera.center_x = 0
|
|
257
245
|
// 0.6 matches the draw_data_points() scale factor that maps data coords to canvas pixels
|
|
258
246
|
const scale = Math.min(canvas_dims.width, canvas_dims.height) * 0.6 * camera.zoom
|
|
259
|
-
camera.center_y = Math.sqrt(3) / 12 * scale * Math.cos(to_radians(elev_deg))
|
|
247
|
+
camera.center_y = (Math.sqrt(3) / 12) * scale * Math.cos(to_radians(elev_deg))
|
|
260
248
|
}
|
|
261
249
|
|
|
262
250
|
// Sync: ConvexHull3D → Three.js gizmo camera (on main canvas drag)
|
|
@@ -276,14 +264,15 @@
|
|
|
276
264
|
const cam = gizmo_cam_ref
|
|
277
265
|
if (!cam) return
|
|
278
266
|
const { x: cx, y: cy, z: cz } = cam.position
|
|
279
|
-
const dist = Math.
|
|
267
|
+
const dist = Math.hypot(cx, cy, cz)
|
|
280
268
|
if (dist < 1e-6) return
|
|
281
269
|
const elev_rad = Math.acos(Math.max(-1, Math.min(1, cz / dist)))
|
|
282
270
|
const sin_elev = Math.sin(elev_rad)
|
|
283
|
-
const azim_deg =
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
271
|
+
const azim_deg =
|
|
272
|
+
Math.abs(sin_elev) > 1e-6
|
|
273
|
+
? (Math.atan2(-cx / (dist * sin_elev), -cy / (dist * sin_elev)) * 180) / Math.PI
|
|
274
|
+
: 0
|
|
275
|
+
const elev_deg = (elev_rad * 180) / Math.PI
|
|
287
276
|
camera.elevation = elev_deg
|
|
288
277
|
camera.azimuth = azim_deg
|
|
289
278
|
center_camera(elev_deg)
|
|
@@ -291,14 +280,15 @@
|
|
|
291
280
|
|
|
292
281
|
// Gizmo axis colors (constant — AXIS_COLORS/NEG_AXIS_COLORS never change)
|
|
293
282
|
const gizmo_axis_options = Object.fromEntries(
|
|
294
|
-
[...AXIS_COLORS, ...NEG_AXIS_COLORS].map((
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
283
|
+
[...AXIS_COLORS, ...NEG_AXIS_COLORS].map(([axis, color, hover_color]) => [
|
|
284
|
+
axis,
|
|
285
|
+
{
|
|
286
|
+
color,
|
|
287
|
+
labelColor: `#111`,
|
|
288
|
+
opacity: 0.85,
|
|
289
|
+
hover: { color: hover_color, labelColor: `#222`, opacity: 1 },
|
|
290
|
+
},
|
|
291
|
+
]),
|
|
302
292
|
)
|
|
303
293
|
|
|
304
294
|
// Extract placement from gizmo options (not a Threlte Gizmo prop)
|
|
@@ -328,12 +318,12 @@
|
|
|
328
318
|
canvas: () => canvas,
|
|
329
319
|
wrapper: () => wrapper,
|
|
330
320
|
ctx: () => ctx,
|
|
331
|
-
set_ctx: (context) => ctx = context,
|
|
332
|
-
set_canvas_dims: (dims) => canvas_dims = dims,
|
|
321
|
+
set_ctx: (context) => (ctx = context),
|
|
322
|
+
set_canvas_dims: (dims) => (canvas_dims = dims),
|
|
333
323
|
visible_entries: () => visible_entries,
|
|
334
324
|
plot_entries: () => plot_entries,
|
|
335
325
|
selected_entry: () => selected_entry,
|
|
336
|
-
set_selected_entry: (entry) => selected_entry = entry,
|
|
326
|
+
set_selected_entry: (entry) => (selected_entry = entry),
|
|
337
327
|
fullscreen: () => fullscreen,
|
|
338
328
|
enable_click_selection: () => enable_click_selection,
|
|
339
329
|
enable_structure_preview: () => enable_structure_preview,
|
|
@@ -342,7 +332,7 @@
|
|
|
342
332
|
on_file_drop: () => on_file_drop,
|
|
343
333
|
entry_category: () => entry_category,
|
|
344
334
|
zoom: () => camera.zoom,
|
|
345
|
-
set_zoom: (zoom) => camera.zoom = zoom,
|
|
335
|
+
set_zoom: (zoom) => (camera.zoom = zoom),
|
|
346
336
|
project_point: project_3d_point,
|
|
347
337
|
extract_structure: extract_structure_from_entry,
|
|
348
338
|
render_frame,
|
|
@@ -369,11 +359,11 @@
|
|
|
369
359
|
camera.azimuth = 0
|
|
370
360
|
center_camera(0)
|
|
371
361
|
},
|
|
372
|
-
b: () => color_mode = color_mode === `stability` ? `energy` : `stability
|
|
373
|
-
s: () => show_stable = !show_stable,
|
|
374
|
-
u: () => show_unstable = !show_unstable,
|
|
375
|
-
h: () => show_hull_faces = !show_hull_faces,
|
|
376
|
-
l: () => show_stable_labels = !show_stable_labels,
|
|
362
|
+
b: () => (color_mode = color_mode === `stability` ? `energy` : `stability`),
|
|
363
|
+
s: () => (show_stable = !show_stable),
|
|
364
|
+
u: () => (show_unstable = !show_unstable),
|
|
365
|
+
h: () => (show_hull_faces = !show_hull_faces),
|
|
366
|
+
l: () => (show_stable_labels = !show_stable_labels),
|
|
377
367
|
}),
|
|
378
368
|
})
|
|
379
369
|
const { render_once } = interactions
|
|
@@ -390,9 +380,7 @@
|
|
|
390
380
|
let pulse_opacity = $derived(0.3 + 0.4 * pulse.unit)
|
|
391
381
|
|
|
392
382
|
// Merge highlight style with defaults
|
|
393
|
-
const merged_highlight_style = $derived(
|
|
394
|
-
helpers.merge_highlight_style(highlight_style),
|
|
395
|
-
)
|
|
383
|
+
const merged_highlight_style = $derived(helpers.merge_highlight_style(highlight_style))
|
|
396
384
|
|
|
397
385
|
// Helper to check if entry is highlighted
|
|
398
386
|
const is_highlighted = (entry: ConvexHullEntry): boolean =>
|
|
@@ -443,8 +431,8 @@
|
|
|
443
431
|
)
|
|
444
432
|
|
|
445
433
|
// Cache energy color scale per frame/setting
|
|
446
|
-
const energy_color_scale = $derived
|
|
447
|
-
helpers.get_energy_color_scale(color_mode, color_scale, plot_entries)
|
|
434
|
+
const energy_color_scale = $derived(
|
|
435
|
+
helpers.get_energy_color_scale(color_mode, color_scale, plot_entries),
|
|
448
436
|
)
|
|
449
437
|
|
|
450
438
|
// Convex hull statistics - compute internally and expose via bindable prop
|
|
@@ -460,10 +448,7 @@
|
|
|
460
448
|
): { x: number; y: number; depth: number } {
|
|
461
449
|
if (!canvas) return { x: 0, y: 0, depth: 0 }
|
|
462
450
|
|
|
463
|
-
const [elev, azim] = [
|
|
464
|
-
(camera.elevation * Math.PI) / 180,
|
|
465
|
-
(camera.azimuth * Math.PI) / 180,
|
|
466
|
-
]
|
|
451
|
+
const [elev, azim] = [(camera.elevation * Math.PI) / 180, (camera.azimuth * Math.PI) / 180]
|
|
467
452
|
const [cos_az, sin_az, cos_el, sin_el] = [
|
|
468
453
|
Math.cos(azim),
|
|
469
454
|
Math.sin(azim),
|
|
@@ -486,68 +471,38 @@
|
|
|
486
471
|
}
|
|
487
472
|
}
|
|
488
473
|
|
|
474
|
+
// Dashed triangle outline: base triangle at E_form = 0, bottom triangle at the most
|
|
475
|
+
// negative formation energy, and vertical edges connecting corresponding corners
|
|
489
476
|
function draw_structure_outline(): void {
|
|
490
477
|
if (!ctx || !canvas) return
|
|
491
478
|
|
|
492
|
-
// Set consistent style for all triangle structure lines
|
|
493
479
|
ctx.strokeStyle = CONVEX_HULL_STYLE.structure_line.color
|
|
494
480
|
ctx.lineWidth = CONVEX_HULL_STYLE.structure_line.line_width
|
|
495
|
-
ctx.setLineDash(CONVEX_HULL_STYLE.structure_line.dash)
|
|
496
|
-
|
|
497
|
-
// Draw triangle base and vertical edges
|
|
498
|
-
draw_triangle_structure()
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
function draw_triangle_structure(): void {
|
|
502
|
-
if (!ctx || !canvas) return
|
|
481
|
+
ctx.setLineDash(CONVEX_HULL_STYLE.structure_line.dash)
|
|
503
482
|
|
|
504
|
-
|
|
505
|
-
const e_form_min = energy_range.min // Includes 0 for elemental references
|
|
506
|
-
const e_form_max = energy_range.max // Includes 0 for elemental references
|
|
507
|
-
|
|
508
|
-
// Draw base triangle edges (top triangle at formation energy = 0)
|
|
483
|
+
const { min: e_form_min } = energy_range
|
|
509
484
|
const triangle_edges = get_triangle_edges()
|
|
510
485
|
ctx.beginPath()
|
|
511
|
-
for (const [
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
486
|
+
for (const z_plane of [0, e_form_min]) {
|
|
487
|
+
for (const [v1, v2] of triangle_edges) {
|
|
488
|
+
const proj1 = project_3d_point(v1.x, v1.y, z_plane)
|
|
489
|
+
const proj2 = project_3d_point(v2.x, v2.y, z_plane)
|
|
490
|
+
ctx.moveTo(proj1.x, proj1.y)
|
|
491
|
+
ctx.lineTo(proj2.x, proj2.y)
|
|
492
|
+
}
|
|
517
493
|
}
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
// Draw vertical edges from corners (from most negative to 0 formation energy)
|
|
521
|
-
const vertical_edges = get_triangle_vertical_edges(
|
|
522
|
-
e_form_min,
|
|
523
|
-
e_form_max,
|
|
524
|
-
)
|
|
525
|
-
ctx.beginPath()
|
|
526
|
-
for (const [v1, v2] of vertical_edges) {
|
|
494
|
+
for (const [v1, v2] of get_triangle_vertical_edges(e_form_min, 0)) {
|
|
527
495
|
const proj1 = project_3d_point(v1.x, v1.y, v1.z)
|
|
528
496
|
const proj2 = project_3d_point(v2.x, v2.y, v2.z)
|
|
529
|
-
|
|
530
|
-
ctx.moveTo(proj1.x, proj1.y)
|
|
531
|
-
ctx.lineTo(proj2.x, proj2.y)
|
|
532
|
-
}
|
|
533
|
-
ctx.stroke()
|
|
534
|
-
|
|
535
|
-
// Draw bottom triangle (connecting the bottom tips of vertical lines)
|
|
536
|
-
const bottom_triangle_edges = get_triangle_edges()
|
|
537
|
-
ctx.beginPath()
|
|
538
|
-
for (const [v1, v2] of bottom_triangle_edges) {
|
|
539
|
-
const proj1 = project_3d_point(v1.x, v1.y, e_form_min) // Bottom triangle at most negative energy
|
|
540
|
-
const proj2 = project_3d_point(v2.x, v2.y, e_form_min)
|
|
541
|
-
|
|
542
497
|
ctx.moveTo(proj1.x, proj1.y)
|
|
543
498
|
ctx.lineTo(proj2.x, proj2.y)
|
|
544
499
|
}
|
|
545
500
|
ctx.stroke()
|
|
546
501
|
|
|
547
|
-
// Reset stroke style
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
ctx.setLineDash([])
|
|
502
|
+
// Reset stroke style and line dash for subsequent drawing operations
|
|
503
|
+
ctx.strokeStyle =
|
|
504
|
+
getComputedStyle(canvas).getPropertyValue(`--hull-edge-color`) || `#212121`
|
|
505
|
+
ctx.setLineDash([])
|
|
551
506
|
}
|
|
552
507
|
|
|
553
508
|
function draw_element_labels(): void {
|
|
@@ -562,15 +517,11 @@
|
|
|
562
517
|
ctx.textAlign = `center`
|
|
563
518
|
ctx.textBaseline = `middle`
|
|
564
519
|
|
|
565
|
-
for (
|
|
566
|
-
let idx = 0;
|
|
567
|
-
idx < TRIANGLE_VERTICES.length && idx < elements.length;
|
|
568
|
-
idx++
|
|
569
|
-
) {
|
|
520
|
+
for (let idx = 0; idx < TRIANGLE_VERTICES.length && idx < elements.length; idx++) {
|
|
570
521
|
const [x, y] = TRIANGLE_VERTICES[idx]
|
|
571
522
|
const dx = x - centroid.x
|
|
572
523
|
const dy = y - centroid.y
|
|
573
|
-
const length = Math.
|
|
524
|
+
const length = Math.hypot(dx, dy)
|
|
574
525
|
const distance = 0.05
|
|
575
526
|
|
|
576
527
|
const label_pos = {
|
|
@@ -596,14 +547,10 @@
|
|
|
596
547
|
|
|
597
548
|
// Find the vertex that projects to the leftmost x-position (changes with rotation)
|
|
598
549
|
const projected_vertices = TRIANGLE_VERTICES.map(([vx, vy]) =>
|
|
599
|
-
project_3d_point(vx, vy, e_mid)
|
|
550
|
+
project_3d_point(vx, vy, e_mid),
|
|
600
551
|
)
|
|
601
552
|
const leftmost_idx = projected_vertices.reduce(
|
|
602
|
-
(
|
|
603
|
-
min_idx,
|
|
604
|
-
proj,
|
|
605
|
-
idx,
|
|
606
|
-
) => (proj.x < projected_vertices[min_idx].x ? idx : min_idx),
|
|
553
|
+
(min_idx, proj, idx) => (proj.x < projected_vertices[min_idx].x ? idx : min_idx),
|
|
607
554
|
0,
|
|
608
555
|
)
|
|
609
556
|
const [axis_x, axis_y] = TRIANGLE_VERTICES[leftmost_idx]
|
|
@@ -667,10 +614,8 @@
|
|
|
667
614
|
let energy_face_scale: ((val: number) => string) | null = null
|
|
668
615
|
let min_face_e_form = 0
|
|
669
616
|
if (hull_face_color_mode === `formation_energy`) {
|
|
670
|
-
const all_e_form = hull_faces.flatMap((tri) =>
|
|
671
|
-
|
|
672
|
-
)
|
|
673
|
-
min_face_e_form = Math.min(...all_e_form)
|
|
617
|
+
const all_e_form = hull_faces.flatMap((tri) => tri.vertices.map((vertex) => vertex.z))
|
|
618
|
+
min_face_e_form = helpers.array_min(all_e_form)
|
|
674
619
|
energy_face_scale = helpers.get_energy_color_scale(
|
|
675
620
|
`energy`,
|
|
676
621
|
color_scale,
|
|
@@ -681,10 +626,7 @@
|
|
|
681
626
|
}
|
|
682
627
|
|
|
683
628
|
// Helper to get face color based on mode
|
|
684
|
-
const get_face_color = (
|
|
685
|
-
tri: typeof hull_faces[0],
|
|
686
|
-
tri_idx: number,
|
|
687
|
-
): string => {
|
|
629
|
+
const get_face_color = (tri: (typeof hull_faces)[0], tri_idx: number): string => {
|
|
688
630
|
if (hull_face_color_mode === `uniform`) {
|
|
689
631
|
return hull_face_color
|
|
690
632
|
}
|
|
@@ -711,11 +653,7 @@
|
|
|
711
653
|
|
|
712
654
|
// Sort faces by depth for proper rendering
|
|
713
655
|
const faces_with_depth = hull_faces.map((tri, tri_idx) => {
|
|
714
|
-
const centroid_proj = project_3d_point(
|
|
715
|
-
tri.centroid.x,
|
|
716
|
-
tri.centroid.y,
|
|
717
|
-
tri.centroid.z,
|
|
718
|
-
)
|
|
656
|
+
const centroid_proj = project_3d_point(tri.centroid.x, tri.centroid.y, tri.centroid.z)
|
|
719
657
|
return { tri, tri_idx, depth: centroid_proj.depth }
|
|
720
658
|
})
|
|
721
659
|
|
|
@@ -740,16 +678,21 @@
|
|
|
740
678
|
const a3 = norm_alpha?.(p3.z) ?? 0
|
|
741
679
|
|
|
742
680
|
// Solve a*x + b*y + c = alpha at the three projected vertices
|
|
743
|
-
const x1 = proj1.x,
|
|
744
|
-
|
|
745
|
-
const
|
|
681
|
+
const x1 = proj1.x,
|
|
682
|
+
y1 = proj1.y
|
|
683
|
+
const x2 = proj2.x,
|
|
684
|
+
y2 = proj2.y
|
|
685
|
+
const x3 = proj3.x,
|
|
686
|
+
y3 = proj3.y
|
|
746
687
|
const det = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)
|
|
747
|
-
let coef_a = 0,
|
|
688
|
+
let coef_a = 0,
|
|
689
|
+
coef_b = 0,
|
|
690
|
+
coef_c = (a1 + a2 + a3) / 3
|
|
748
691
|
if (Math.abs(det) > 1e-9) {
|
|
749
692
|
coef_a = (a1 * (y2 - y3) + a2 * (y3 - y1) + a3 * (y1 - y2)) / det
|
|
750
693
|
coef_b = (a1 * (x3 - x2) + a2 * (x1 - x3) + a3 * (x2 - x1)) / det
|
|
751
|
-
coef_c =
|
|
752
|
-
a3 * (x1 * y2 - x2 * y1)) /
|
|
694
|
+
coef_c =
|
|
695
|
+
(a1 * (x2 * y3 - x3 * y2) + a2 * (x3 * y1 - x1 * y3) + a3 * (x1 * y2 - x2 * y1)) /
|
|
753
696
|
det
|
|
754
697
|
}
|
|
755
698
|
|
|
@@ -826,7 +769,7 @@
|
|
|
826
769
|
const denom = Math.max(1e-6, max_fe - min_fe)
|
|
827
770
|
return (value: number) => {
|
|
828
771
|
// alpha 0 at 0 eV, goes to hull_face_opacity at most negative energy
|
|
829
|
-
const energy_fraction =
|
|
772
|
+
const energy_fraction = clamp01((value - min_fe) / denom)
|
|
830
773
|
const alpha = (1 - energy_fraction) * hull_face_opacity
|
|
831
774
|
return add_alpha(hull_face_color, alpha)
|
|
832
775
|
}
|
|
@@ -940,18 +883,21 @@
|
|
|
940
883
|
ctx.textBaseline = `top`
|
|
941
884
|
const label_height = hull_label_font_size + 2
|
|
942
885
|
|
|
943
|
-
const label_entries = helpers
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
(
|
|
949
|
-
(
|
|
950
|
-
|
|
951
|
-
|
|
886
|
+
const label_entries = helpers
|
|
887
|
+
.get_composition_label_entries(
|
|
888
|
+
visible_entries.filter((entry) => {
|
|
889
|
+
if (entry.is_element) return false
|
|
890
|
+
const is_stable_point = helpers.entry_is_stable(entry)
|
|
891
|
+
return (
|
|
892
|
+
(is_stable_point && show_stable_labels) ||
|
|
893
|
+
(!is_stable_point &&
|
|
894
|
+
show_unstable_labels &&
|
|
895
|
+
(entry.e_above_hull ?? 0) <= max_hull_dist_show_labels)
|
|
896
|
+
)
|
|
897
|
+
}),
|
|
898
|
+
)
|
|
952
899
|
.sort((entry_1, entry_2) => {
|
|
953
|
-
const energy_diff = label_priority_energy(entry_1) -
|
|
954
|
-
label_priority_energy(entry_2)
|
|
900
|
+
const energy_diff = label_priority_energy(entry_1) - label_priority_energy(entry_2)
|
|
955
901
|
if (energy_diff !== 0) return energy_diff
|
|
956
902
|
return (entry_1.e_above_hull ?? 0) - (entry_2.e_above_hull ?? 0)
|
|
957
903
|
})
|
|
@@ -971,17 +917,13 @@
|
|
|
971
917
|
const is_stable_point = helpers.entry_is_stable(entry)
|
|
972
918
|
const point_size = (entry.size || (is_stable_point ? 6 : 4)) * canvas_dims.scale
|
|
973
919
|
const text_width = measure_formula_segments(ctx, formula_segments)
|
|
974
|
-
const placements = get_label_placements(
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
rect_within_rect(candidate.rect, canvas_rect) &&
|
|
982
|
-
!occupied_rects.some((occupied_rect) =>
|
|
983
|
-
rects_overlap(candidate.rect, occupied_rect)
|
|
984
|
-
)
|
|
920
|
+
const placements = get_label_placements(projected, point_size, text_width, label_height)
|
|
921
|
+
const placement = placements.find(
|
|
922
|
+
(candidate) =>
|
|
923
|
+
rect_within_rect(candidate.rect, canvas_rect) &&
|
|
924
|
+
!occupied_rects.some((occupied_rect) =>
|
|
925
|
+
rects_overlap(candidate.rect, occupied_rect),
|
|
926
|
+
),
|
|
985
927
|
)
|
|
986
928
|
if (!placement) continue
|
|
987
929
|
|
|
@@ -1029,7 +971,7 @@
|
|
|
1029
971
|
|
|
1030
972
|
// Reactive dark mode detection for canvas text color
|
|
1031
973
|
let dark_mode = $state(is_dark_mode())
|
|
1032
|
-
$effect(() => watch_dark_mode((dark) => dark_mode = dark))
|
|
974
|
+
$effect(() => watch_dark_mode((dark) => (dark_mode = dark)))
|
|
1033
975
|
const text_color = $derived(helpers.get_canvas_text_color(dark_mode))
|
|
1034
976
|
|
|
1035
977
|
// Performance: Cache canvas dimensions and formation energy range
|
|
@@ -1060,7 +1002,7 @@
|
|
|
1060
1002
|
|
|
1061
1003
|
<div
|
|
1062
1004
|
{...rest}
|
|
1063
|
-
class=
|
|
1005
|
+
class={[`convex-hull-3d`, rest.class]}
|
|
1064
1006
|
class:dragover={interactions.drag_over}
|
|
1065
1007
|
style={`${style}; ${rest.style ?? ``}`}
|
|
1066
1008
|
data-has-selection={selected_entry !== null}
|
|
@@ -1073,11 +1015,11 @@
|
|
|
1073
1015
|
aria-label="Ternary convex hull visualization"
|
|
1074
1016
|
>
|
|
1075
1017
|
{@render children?.({
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1018
|
+
stable_entries,
|
|
1019
|
+
unstable_entries,
|
|
1020
|
+
highlighted_entries,
|
|
1021
|
+
selected_entry,
|
|
1022
|
+
})}
|
|
1081
1023
|
<h3 style="position: absolute; left: 1em; top: 1ex; margin: 0; font-weight: 500">
|
|
1082
1024
|
{@html sanitize_html(merged_controls.title || phase_stats?.chemical_system || ``)}
|
|
1083
1025
|
</h3>
|
|
@@ -1109,9 +1051,7 @@
|
|
|
1109
1051
|
|
|
1110
1052
|
<!-- Formation Energy Faces Color Bar (bottom-right corner) -->
|
|
1111
1053
|
<!-- Only show for uniform/formation_energy modes where face color relates to E_form -->
|
|
1112
|
-
{#if plot_entries.length > 0 && show_hull_faces &&
|
|
1113
|
-
(hull_face_color_mode === `uniform` ||
|
|
1114
|
-
hull_face_color_mode === `formation_energy`)}
|
|
1054
|
+
{#if plot_entries.length > 0 && show_hull_faces && (hull_face_color_mode === `uniform` || hull_face_color_mode === `formation_energy`)}
|
|
1115
1055
|
<ColorBar
|
|
1116
1056
|
title="Formation energy (eV/atom)"
|
|
1117
1057
|
color_scale_fn={e_form_color_scale_fn}
|
|
@@ -1169,7 +1109,7 @@
|
|
|
1169
1109
|
<div class="gizmo-wrapper {controls_config.class}" data-placement={gizmo_placement}>
|
|
1170
1110
|
<Canvas
|
|
1171
1111
|
createRenderer={(cvs: HTMLCanvasElement) =>
|
|
1172
|
-
|
|
1112
|
+
new WebGLRenderer({ canvas: cvs, alpha: true, antialias: true })}
|
|
1173
1113
|
>
|
|
1174
1114
|
<T.PerspectiveCamera
|
|
1175
1115
|
makeDefault
|
|
@@ -1199,11 +1139,13 @@
|
|
|
1199
1139
|
</div>
|
|
1200
1140
|
{/if}
|
|
1201
1141
|
|
|
1202
|
-
{#if (has_temp_data && temperature !== undefined) ||
|
|
1203
|
-
(gas_analysis.has_gas_dependent_elements && merged_gas_config)}
|
|
1142
|
+
{#if (has_temp_data && temperature !== undefined) || (gas_analysis.has_gas_dependent_elements && merged_gas_config)}
|
|
1204
1143
|
<div class="right-controls">
|
|
1205
1144
|
{#if has_temp_data && temperature !== undefined}
|
|
1206
|
-
<TemperatureSlider
|
|
1145
|
+
<TemperatureSlider
|
|
1146
|
+
available_temperatures={hull_data.available_temperatures}
|
|
1147
|
+
bind:temperature
|
|
1148
|
+
/>
|
|
1207
1149
|
{/if}
|
|
1208
1150
|
{#if gas_analysis.has_gas_dependent_elements && merged_gas_config}
|
|
1209
1151
|
<GasPressureControls
|
|
@@ -1214,7 +1156,6 @@
|
|
|
1214
1156
|
{/if}
|
|
1215
1157
|
</div>
|
|
1216
1158
|
{/if}
|
|
1217
|
-
|
|
1218
1159
|
</div>
|
|
1219
1160
|
|
|
1220
1161
|
<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 ConvexHull3D: import("svelte").Component<$$ComponentProps, {}, "
|
|
6
|
+
declare const ConvexHull3D: 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 ConvexHull3D = ReturnType<typeof ConvexHull3D>;
|
|
8
8
|
export default ConvexHull3D;
|