matterviz 0.4.0 → 0.4.2
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 +12 -14
- package/dist/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +2 -2
- package/dist/app.css +53 -0
- package/dist/brillouin/BrillouinZone.svelte +132 -219
- package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
- package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
- package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
- package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
- package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
- package/dist/brillouin/ReciprocalVectors.svelte +39 -0
- package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
- package/dist/brillouin/compute.d.ts +2 -0
- package/dist/brillouin/compute.js +80 -77
- package/dist/brillouin/geometry.d.ts +8 -0
- package/dist/brillouin/geometry.js +57 -0
- package/dist/brillouin/index.d.ts +2 -0
- package/dist/brillouin/index.js +2 -0
- package/dist/brillouin/types.d.ts +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
- package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
- package/dist/chempot-diagram/async-compute.svelte.js +1 -1
- package/dist/chempot-diagram/color.d.ts +3 -6
- package/dist/chempot-diagram/color.js +5 -5
- package/dist/chempot-diagram/compute.d.ts +3 -3
- package/dist/chempot-diagram/compute.js +3 -1
- package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
- package/dist/chempot-diagram/controls-state.svelte.js +42 -0
- package/dist/chempot-diagram/export.d.ts +47 -0
- package/dist/chempot-diagram/export.js +133 -0
- package/dist/chempot-diagram/index.d.ts +1 -0
- package/dist/chempot-diagram/index.js +1 -0
- package/dist/chempot-diagram/pointer.d.ts +0 -10
- package/dist/chempot-diagram/pointer.js +4 -4
- package/dist/chempot-diagram/types.d.ts +3 -3
- package/dist/colors/index.d.ts +0 -4
- package/dist/colors/index.js +21 -22
- package/dist/composition/BarChart.svelte +37 -31
- package/dist/composition/BubbleChart.svelte +17 -17
- package/dist/composition/Composition.svelte +7 -11
- package/dist/composition/Formula.svelte +18 -25
- package/dist/composition/FormulaFilter.svelte +96 -98
- package/dist/composition/PieChart.svelte +60 -46
- package/dist/composition/chem-sys.js +3 -2
- package/dist/composition/format.js +4 -3
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +2 -3
- package/dist/composition/parse.js +27 -28
- package/dist/constants.js +11 -9
- package/dist/controls.d.ts +1 -0
- package/dist/controls.js +0 -1
- package/dist/convex-hull/ConvexHull.svelte +20 -25
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
- package/dist/convex-hull/ConvexHull2D.svelte +176 -256
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +269 -804
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +236 -755
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
- package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
- package/dist/convex-hull/ConvexHullControls.svelte +128 -49
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
- package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
- package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
- package/dist/convex-hull/ConvexHullStats.svelte +210 -351
- package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
- package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
- package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
- package/dist/convex-hull/GasPressureControls.svelte +5 -12
- package/dist/convex-hull/StructurePopup.svelte +17 -21
- package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
- package/dist/convex-hull/TemperatureSlider.svelte +4 -10
- package/dist/convex-hull/barycentric-coords.d.ts +2 -4
- package/dist/convex-hull/barycentric-coords.js +6 -33
- package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
- package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
- package/dist/convex-hull/helpers.d.ts +47 -17
- package/dist/convex-hull/helpers.js +186 -101
- package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
- package/dist/convex-hull/hull-state.svelte.js +124 -0
- package/dist/convex-hull/index.d.ts +9 -7
- package/dist/convex-hull/index.js +7 -2
- package/dist/convex-hull/thermodynamics.js +109 -937
- package/dist/convex-hull/types.d.ts +12 -4
- package/dist/convex-hull/types.js +12 -0
- package/dist/coordination/CoordinationBarPlot.svelte +41 -43
- 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 +6 -8
- 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 +24 -29
- package/dist/element/ElementTile.svelte.d.ts +1 -1
- package/dist/element/Nucleus.svelte +4 -2
- package/dist/element/data.d.ts +1 -2
- package/dist/element/helpers.d.ts +4 -0
- package/dist/element/helpers.js +18 -0
- package/dist/element/index.d.ts +1 -0
- package/dist/element/index.js +3 -0
- package/dist/feedback/DragOverlay.svelte +5 -3
- package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
- package/dist/feedback/StatusMessage.svelte +20 -7
- package/dist/fermi-surface/FermiSlice.svelte +21 -18
- package/dist/fermi-surface/FermiSurface.svelte +78 -165
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
- package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
- package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
- package/dist/fermi-surface/compute.js +14 -13
- package/dist/fermi-surface/export.js +4 -15
- package/dist/fermi-surface/index.d.ts +0 -1
- package/dist/fermi-surface/index.js +0 -1
- package/dist/fermi-surface/parse.d.ts +1 -1
- package/dist/fermi-surface/parse.js +84 -97
- package/dist/fermi-surface/types.d.ts +2 -2
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
- package/dist/heatmap-matrix/index.d.ts +8 -2
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/io/ExportPane.svelte +170 -0
- package/dist/io/ExportPane.svelte.d.ts +17 -0
- package/dist/io/decompress.d.ts +2 -1
- package/dist/io/decompress.js +22 -36
- package/dist/io/export.d.ts +9 -1
- package/dist/io/export.js +37 -29
- package/dist/io/fetch.d.ts +2 -4
- package/dist/io/fetch.js +0 -11
- package/dist/io/file-drop.d.ts +7 -0
- package/dist/io/file-drop.js +13 -0
- package/dist/io/index.d.ts +1 -0
- package/dist/io/index.js +3 -0
- package/dist/io/is-binary.d.ts +9 -0
- package/dist/io/is-binary.js +45 -1
- package/dist/io/types.d.ts +13 -0
- package/dist/io/url-drop.js +13 -25
- package/dist/isosurface/Isosurface.svelte +17 -23
- package/dist/isosurface/IsosurfaceControls.svelte +37 -42
- package/dist/isosurface/parse-vaspwave.d.ts +3 -0
- package/dist/isosurface/parse-vaspwave.js +138 -0
- package/dist/isosurface/parse.js +50 -48
- package/dist/labels.d.ts +6 -2
- package/dist/labels.js +44 -14
- package/dist/layout/FullscreenButton.svelte +34 -0
- package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
- package/dist/layout/FullscreenToggle.svelte +12 -12
- package/dist/layout/InfoCard.svelte +7 -18
- 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 +21 -17
- package/dist/layout/SubpageGrid.svelte +3 -1
- package/dist/layout/ViewerChrome.svelte +115 -0
- package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
- package/dist/layout/fullscreen.d.ts +4 -0
- package/dist/layout/fullscreen.js +3 -5
- package/dist/layout/fullscreen.svelte.d.ts +8 -0
- package/dist/layout/fullscreen.svelte.js +36 -0
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/json-tree/JsonNode.svelte +8 -11
- package/dist/layout/json-tree/JsonTree.svelte +53 -77
- package/dist/layout/json-tree/JsonValue.svelte +7 -15
- package/dist/layout/json-tree/utils.js +14 -23
- package/dist/math.d.ts +9 -3
- package/dist/math.js +37 -21
- package/dist/overlays/ContextMenu.svelte +4 -2
- package/dist/overlays/CopyButton.svelte +11 -5
- package/dist/overlays/DragControlTab.svelte +6 -1
- package/dist/overlays/DraggablePane.svelte +81 -26
- package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
- package/dist/overlays/GlassChip.svelte +30 -0
- package/dist/overlays/GlassChip.svelte.d.ts +8 -0
- package/dist/overlays/InfoPaneCards.svelte +11 -23
- package/dist/overlays/index.d.ts +11 -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 +115 -146
- package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
- package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
- package/dist/periodic-table/TableInset.svelte +9 -4
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
- package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
- package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
- package/dist/phase-diagram/build-diagram.js +3 -3
- package/dist/phase-diagram/colors.js +1 -1
- package/dist/phase-diagram/diagram-input.d.ts +1 -2
- package/dist/phase-diagram/parse.d.ts +2 -1
- package/dist/phase-diagram/parse.js +15 -15
- package/dist/phase-diagram/svg-to-diagram.js +21 -15
- package/dist/phase-diagram/utils.js +2 -3
- package/dist/plot/bar/BarPlot.svelte +494 -692
- package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
- package/dist/plot/bar/BarPlotControls.svelte +1 -3
- package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
- package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
- package/dist/plot/bar/data.d.ts +5 -4
- package/dist/plot/bar/data.js +2 -1
- package/dist/plot/box/BoxPlot.svelte +361 -439
- package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
- package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
- package/dist/plot/box/Violin.svelte.d.ts +2 -1
- package/dist/plot/box/box-plot.d.ts +3 -2
- package/dist/plot/box/box-plot.js +6 -3
- package/dist/plot/box/kde.d.ts +2 -1
- package/dist/plot/box/kde.js +4 -4
- package/dist/plot/core/auto-place.d.ts +1 -1
- package/dist/plot/core/auto-place.js +5 -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 +106 -111
- package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
- 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 +21 -11
- package/dist/plot/core/components/Line.svelte.d.ts +5 -2
- package/dist/plot/core/components/PlotAxis.svelte +42 -18
- package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
- package/dist/plot/core/components/PlotControls.svelte +65 -41
- package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
- 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 +56 -59
- package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
- package/dist/plot/core/components/ReferencePlane.svelte +9 -10
- package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
- 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 +29 -476
- package/dist/plot/core/data-transform.js +9 -5
- package/dist/plot/core/fill-utils.d.ts +7 -4
- package/dist/plot/core/fill-utils.js +34 -9
- package/dist/plot/core/index.d.ts +1 -0
- package/dist/plot/core/index.js +1 -0
- package/dist/plot/core/interactions.d.ts +5 -1
- package/dist/plot/core/interactions.js +14 -2
- package/dist/plot/core/layout.d.ts +3 -1
- package/dist/plot/core/layout.js +22 -13
- 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 +35 -0
- package/dist/plot/core/pan-zoom.svelte.js +221 -0
- package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
- package/dist/plot/core/placed-tween.svelte.js +68 -0
- package/dist/plot/core/reference-line.d.ts +10 -10
- package/dist/plot/core/reference-line.js +7 -7
- package/dist/plot/core/scales.d.ts +40 -25
- package/dist/plot/core/scales.js +49 -21
- package/dist/plot/core/svg.d.ts +2 -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 +47 -331
- package/dist/plot/core/types.js +23 -20
- package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
- package/dist/plot/core/utils/hierarchy-chart.js +179 -0
- package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
- package/dist/plot/core/utils/hierarchy-labels.js +99 -0
- package/dist/plot/core/utils/label-placement.d.ts +1 -1
- package/dist/plot/core/utils/label-placement.js +5 -5
- package/dist/plot/core/utils.d.ts +2 -1
- package/dist/plot/histogram/Histogram.svelte +373 -631
- package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
- package/dist/plot/histogram/HistogramControls.svelte +30 -28
- package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
- 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 +79 -73
- package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
- package/dist/plot/sankey/SankeyControls.svelte +22 -16
- package/dist/plot/sankey/sankey.js +3 -1
- package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
- package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
- package/dist/plot/scatter/ElementScatter.svelte +4 -1
- package/dist/plot/scatter/ScatterPlot.svelte +623 -821
- package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
- 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/binned-scatter-types.d.ts +6 -12
- package/dist/plot/scatter/binned-scatter-types.js +6 -1
- package/dist/plot/scatter/index.d.ts +1 -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 +40 -60
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
- package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
- package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
- package/dist/plot/sunburst/Sunburst.svelte +256 -338
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
- 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 +14 -4
- package/dist/plot/treemap/Treemap.svelte +907 -0
- package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
- package/dist/plot/treemap/index.d.ts +3 -0
- package/dist/plot/treemap/index.js +4 -0
- package/dist/plot/treemap/treemap.d.ts +26 -0
- package/dist/plot/treemap/treemap.js +99 -0
- package/dist/rdf/RdfPlot.svelte +22 -26
- package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
- package/dist/rdf/calc-rdf.js +4 -8
- package/dist/sanitize.js +14 -3
- package/dist/scene/SceneCamera.svelte +62 -0
- package/dist/scene/SceneCamera.svelte.d.ts +19 -0
- package/dist/scene/bind-renderer.svelte.d.ts +2 -0
- package/dist/scene/bind-renderer.svelte.js +22 -0
- package/dist/scene/index.d.ts +4 -0
- package/dist/scene/index.js +5 -0
- package/dist/scene/props.js +52 -0
- package/dist/scene/types.d.ts +26 -0
- package/dist/scene/types.js +1 -0
- package/dist/settings.d.ts +33 -11
- package/dist/settings.js +136 -51
- package/dist/spectral/Bands.svelte +231 -237
- package/dist/spectral/Bands.svelte.d.ts +3 -2
- package/dist/spectral/BandsAndDos.svelte +29 -29
- package/dist/spectral/BrillouinBandsDos.svelte +21 -29
- package/dist/spectral/Dos.svelte +75 -77
- package/dist/spectral/Dos.svelte.d.ts +2 -1
- package/dist/spectral/helpers.d.ts +9 -9
- package/dist/spectral/helpers.js +66 -70
- package/dist/state.svelte.d.ts +0 -7
- package/dist/state.svelte.js +5 -24
- package/dist/structure/Arrow.svelte +6 -21
- package/dist/structure/ArrowInstances.svelte +160 -0
- package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
- package/dist/structure/AtomLegend.svelte +115 -75
- package/dist/structure/AtomLegend.svelte.d.ts +1 -1
- package/dist/structure/Bond.svelte +31 -23
- package/dist/structure/CanvasTooltip.svelte +16 -3
- package/dist/structure/CellSelect.svelte +22 -29
- package/dist/structure/CellSelect.svelte.d.ts +2 -1
- 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 +725 -735
- package/dist/structure/Structure.svelte.d.ts +8 -16
- package/dist/structure/StructureCarousel.svelte +630 -0
- package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
- package/dist/structure/StructureControls.svelte +298 -325
- package/dist/structure/StructureControls.svelte.d.ts +5 -3
- package/dist/structure/StructureExportPane.svelte +62 -168
- package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
- package/dist/structure/StructureInfoPane.svelte +77 -69
- package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
- package/dist/structure/StructureScene.svelte +758 -600
- package/dist/structure/StructureScene.svelte.d.ts +24 -20
- package/dist/structure/StructureViewport.svelte +386 -0
- package/dist/structure/StructureViewport.svelte.d.ts +63 -0
- package/dist/structure/atom-label-placement.d.ts +18 -0
- package/dist/structure/atom-label-placement.js +115 -0
- package/dist/structure/atom-properties.d.ts +3 -1
- package/dist/structure/atom-properties.js +115 -54
- package/dist/structure/bond-order-perception.js +2 -4
- package/dist/structure/bonding.d.ts +12 -2
- package/dist/structure/bonding.js +172 -73
- package/dist/structure/edit-history.d.ts +6 -0
- package/dist/structure/edit-history.js +27 -0
- package/dist/structure/export.d.ts +25 -4
- package/dist/structure/export.js +103 -153
- package/dist/structure/format-detect.d.ts +1 -0
- package/dist/structure/format-detect.js +22 -0
- package/dist/structure/geometry.d.ts +9 -0
- package/dist/structure/geometry.js +27 -0
- package/dist/structure/index.d.ts +18 -1
- package/dist/structure/index.js +15 -2
- package/dist/structure/measure.d.ts +1 -1
- package/dist/structure/measure.js +6 -12
- package/dist/structure/parse.d.ts +5 -3
- package/dist/structure/parse.js +551 -567
- package/dist/structure/partial-occupancy.d.ts +0 -1
- package/dist/structure/partial-occupancy.js +5 -3
- package/dist/structure/pbc.d.ts +1 -1
- package/dist/structure/pbc.js +204 -51
- package/dist/structure/polyhedra.d.ts +40 -0
- package/dist/structure/polyhedra.js +587 -0
- package/dist/structure/site.d.ts +4 -0
- package/dist/structure/site.js +1 -0
- package/dist/structure/supercell.d.ts +1 -2
- package/dist/structure/supercell.js +10 -15
- package/dist/structure/validation.js +5 -6
- package/dist/symmetry/SymmetryElementControls.svelte +69 -0
- package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
- package/dist/symmetry/SymmetryElements.svelte +350 -0
- package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
- package/dist/symmetry/SymmetryStats.svelte +142 -49
- package/dist/symmetry/WyckoffTable.svelte +58 -16
- package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
- package/dist/symmetry/cell-transform.js +8 -14
- package/dist/symmetry/index.d.ts +15 -4
- package/dist/symmetry/index.js +308 -81
- package/dist/symmetry/spacegroups.d.ts +5 -1
- package/dist/symmetry/spacegroups.js +18 -3
- package/dist/symmetry/symmetry-elements.d.ts +33 -0
- package/dist/symmetry/symmetry-elements.js +521 -0
- package/dist/symmetry/wyckoff-db.d.ts +9 -0
- package/dist/symmetry/wyckoff-db.js +87 -0
- package/dist/table/HeatmapTable.svelte +1104 -378
- package/dist/table/HeatmapTable.svelte.d.ts +12 -2
- package/dist/table/ToggleMenu.svelte +5 -12
- 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/index.d.ts +1 -5
- package/dist/theme/index.js +4 -10
- package/dist/theme/themes.mjs +14 -7
- package/dist/tooltip/KCoords.svelte +4 -1
- package/dist/tooltip/TooltipContent.svelte +2 -5
- package/dist/trajectory/Trajectory.svelte +556 -352
- package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
- package/dist/trajectory/TrajectoryError.svelte +11 -8
- package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
- package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
- package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
- package/dist/trajectory/constants.js +6 -2
- package/dist/trajectory/extract.js +73 -71
- package/dist/trajectory/format-detect.d.ts +0 -1
- package/dist/trajectory/format-detect.js +13 -17
- package/dist/trajectory/frame-reader.d.ts +2 -1
- package/dist/trajectory/frame-reader.js +74 -136
- package/dist/trajectory/helpers.d.ts +12 -2
- package/dist/trajectory/helpers.js +68 -37
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +3 -0
- package/dist/trajectory/parse/ase.d.ts +9 -1
- package/dist/trajectory/parse/ase.js +47 -32
- package/dist/trajectory/parse/diagnostics.d.ts +3 -0
- package/dist/trajectory/parse/diagnostics.js +14 -0
- 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 +3 -4
- package/dist/trajectory/parse/index.js +68 -119
- package/dist/trajectory/parse/lammps.d.ts +0 -2
- package/dist/trajectory/parse/lammps.js +14 -16
- package/dist/trajectory/parse/pymatgen.d.ts +2 -0
- package/dist/trajectory/parse/pymatgen.js +74 -0
- package/dist/trajectory/parse/vasp.js +13 -9
- 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 +5 -0
- package/dist/trajectory/parse/vaspout-h5.js +284 -0
- package/dist/trajectory/parse/xyz.d.ts +9 -21
- package/dist/trajectory/parse/xyz.js +38 -39
- package/dist/trajectory/plotting.d.ts +8 -10
- package/dist/trajectory/plotting.js +102 -127
- package/dist/utils.d.ts +4 -0
- package/dist/utils.js +8 -1
- package/dist/xrd/XrdPlot.svelte +56 -85
- package/dist/xrd/broadening.d.ts +2 -1
- package/dist/xrd/broadening.js +2 -1
- package/dist/xrd/calc-xrd.js +8 -15
- package/dist/xrd/index.d.ts +2 -2
- package/dist/xrd/parse.d.ts +0 -1
- package/dist/xrd/parse.js +56 -73
- package/package.json +77 -36
- package/dist/api/mp.d.ts +0 -6
- package/dist/api/mp.js +0 -22
- package/dist/element/data.json +0 -11864
- package/dist/fermi-surface/marching-cubes.d.ts +0 -2
- package/dist/fermi-surface/marching-cubes.js +0 -2
- package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
- package/dist/plot/core/hover-lock.svelte.js +0 -45
- package/dist/plot/sunburst/SunburstControls.svelte +0 -200
- package/dist/structure/label-placement.d.ts +0 -14
- package/dist/structure/label-placement.js +0 -72
package/dist/io/file-drop.js
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
import { decompress_file } from './decompress';
|
|
3
3
|
import { handle_url_drop } from './url-drop';
|
|
4
4
|
import { to_error } from '../utils';
|
|
5
|
+
// Drag-over visual-state handlers for file-drop zones; spread onto the drop target
|
|
6
|
+
// alongside `ondrop` from create_file_drop_handler
|
|
7
|
+
export const drag_over_handlers = (opts) => ({
|
|
8
|
+
// preventDefault on dragover marks the element as a valid drop target; dragleave
|
|
9
|
+
// has no default action to cancel, so it only clears the visual state
|
|
10
|
+
ondragover: (event) => {
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
if (opts.allow && !opts.allow())
|
|
13
|
+
return;
|
|
14
|
+
opts.set_dragover(true);
|
|
15
|
+
},
|
|
16
|
+
ondragleave: () => opts.set_dragover(false),
|
|
17
|
+
});
|
|
5
18
|
// Handles URL drops (from FilePicker), direct file drops with decompression,
|
|
6
19
|
// loading state, and error reporting.
|
|
7
20
|
export const create_file_drop_handler = (opts) => async (event) => {
|
package/dist/io/index.d.ts
CHANGED
package/dist/io/index.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
export { default as ExportPane } from './ExportPane.svelte';
|
|
2
|
+
// strip_compression_extensions lives in ./decompress (Svelte-free) so parser
|
|
3
|
+
// modules can import it inside Web Workers; re-exported here.
|
|
1
4
|
export * from './decompress';
|
|
2
5
|
export * from './export';
|
|
3
6
|
export * from './fetch';
|
package/dist/io/is-binary.d.ts
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
1
|
export declare const is_binary: (content: string) => boolean;
|
|
2
|
+
export declare const has_gzip_magic: (bytes: Uint8Array) => boolean;
|
|
3
|
+
export declare const has_hdf5_magic: (bytes: Uint8Array) => boolean;
|
|
4
|
+
export declare const has_binary_magic: (bytes: Uint8Array) => boolean;
|
|
5
|
+
export declare const ext_of: (name: string) => string;
|
|
6
|
+
export declare const BINARY_EXTENSIONS: Set<string>;
|
|
7
|
+
export declare const is_known_text_file: (basename: string) => boolean;
|
|
8
|
+
export declare const strip_gz_ext: (filename: string) => string;
|
|
9
|
+
export declare const has_binary_inner_ext: (filename: string) => boolean;
|
|
10
|
+
export declare const is_binary_payload: (filename: string, buffer: ArrayBuffer) => boolean;
|
package/dist/io/is-binary.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Single source of truth for binary-vs-text detection in the io layer (used by
|
|
2
|
+
// decompress.ts and url-drop.ts): (1) is_binary string heuristic, (2) has_*_magic byte
|
|
3
|
+
// signatures, (3) extension/filename classification.
|
|
4
|
+
// === (1) string-content heuristic ===
|
|
5
|
+
// Detect binary from decoded text: a NUL byte or a high ratio of non-printable chars.
|
|
2
6
|
export const is_binary = (content) => {
|
|
3
7
|
if (!content)
|
|
4
8
|
return false;
|
|
@@ -18,3 +22,43 @@ export const is_binary = (content) => {
|
|
|
18
22
|
}
|
|
19
23
|
return (binary_char_count / content.length > 0.1 || printable_ascii_count / content.length < 0.7);
|
|
20
24
|
};
|
|
25
|
+
// === (2) magic-byte signatures ===
|
|
26
|
+
const starts_with = (bytes, sig) => bytes.length >= sig.length && sig.every((byte, idx) => bytes[idx] === byte);
|
|
27
|
+
// gzip member header
|
|
28
|
+
export const has_gzip_magic = (bytes) => starts_with(bytes, [0x1f, 0x8b]);
|
|
29
|
+
// Full 8-byte HDF5 superblock signature "\x89HDF\r\n\x1a\n" — used to validate that a file
|
|
30
|
+
// claiming a .h5/.hdf5 extension really is HDF5 (stricter than the binary sniff below).
|
|
31
|
+
export const has_hdf5_magic = (bytes) => starts_with(bytes, [0x89, 0x48, 0x44, 0x46, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
32
|
+
// Leading bytes that mark a payload as binary so a lossy UTF-8 decode would corrupt it.
|
|
33
|
+
// HDF5 is matched by its 4-byte "\x89HDF" prefix (the non-ASCII 0x89 already rules out text
|
|
34
|
+
// starting with "HDF"); the full 4-byte ZIP signatures rule out text merely starting "PK".
|
|
35
|
+
export const has_binary_magic = (bytes) => has_gzip_magic(bytes) ||
|
|
36
|
+
starts_with(bytes, [0x89, 0x48, 0x44, 0x46]) || // HDF5 "\x89HDF"
|
|
37
|
+
starts_with(bytes, [0x50, 0x4b, 0x03, 0x04]) || // ZIP local file
|
|
38
|
+
starts_with(bytes, [0x50, 0x4b, 0x05, 0x06]) || // ZIP empty archive (EOCD)
|
|
39
|
+
starts_with(bytes, [0x50, 0x4b, 0x07, 0x08]) || // ZIP spanned
|
|
40
|
+
starts_with(bytes, [0x2d, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x6c, 0x6d]); // ASE .traj "- of Ulm"
|
|
41
|
+
// === (3) extension / filename classification ===
|
|
42
|
+
export const ext_of = (name) => name.split(`.`).pop()?.toLowerCase() ?? ``;
|
|
43
|
+
// Binary data formats whose lossy UTF-8 decode would corrupt bytes (post-decompression)
|
|
44
|
+
const BINARY_DATA_EXTENSIONS = new Set(`h5 hdf5 traj npz pkl dat brml raw`.split(` `));
|
|
45
|
+
// All extensions treated as binary: data formats + compressed wrappers that must be
|
|
46
|
+
// downloaded/kept as raw bytes (used for binary-fetch mode and .gz inner-format checks)
|
|
47
|
+
export const BINARY_EXTENSIONS = new Set([
|
|
48
|
+
...BINARY_DATA_EXTENSIONS,
|
|
49
|
+
...`gz gzip zip bz2 xz`.split(` `),
|
|
50
|
+
]);
|
|
51
|
+
// Known text formats (plus extensionless VASP files) — safe to fetch/sniff as text
|
|
52
|
+
const TEXT_EXTENSIONS = new Set(`xyz extxyz json cif poscar yaml yml txt md py js ts css html xml`.split(` `));
|
|
53
|
+
const VASP_BASENAME_RE = /^(?:poscar|xdatcar|contcar)$/i;
|
|
54
|
+
export const is_known_text_file = (basename) => TEXT_EXTENSIONS.has(ext_of(basename)) || VASP_BASENAME_RE.test(basename);
|
|
55
|
+
const GZ_EXT_RE = /\.(?:gz|gzip)$/i;
|
|
56
|
+
// Strip a trailing .gz/.gzip wrapper extension, leaving any inner extension intact
|
|
57
|
+
export const strip_gz_ext = (filename) => filename.replace(GZ_EXT_RE, ``);
|
|
58
|
+
// Whether the file inside a .gz/.gzip wrapper is a known binary format that a lossy text
|
|
59
|
+
// decode would corrupt (bytes >= 0x80 -> U+FFFD)
|
|
60
|
+
export const has_binary_inner_ext = (filename) => BINARY_EXTENSIONS.has(ext_of(strip_gz_ext(filename)));
|
|
61
|
+
// Binary if the (post-decompression) extension is a known binary data format or the leading
|
|
62
|
+
// bytes match a magic signature
|
|
63
|
+
export const is_binary_payload = (filename, buffer) => BINARY_DATA_EXTENSIONS.has(ext_of(filename)) ||
|
|
64
|
+
has_binary_magic(new Uint8Array(buffer.slice(0, 8)));
|
package/dist/io/types.d.ts
CHANGED
|
@@ -6,3 +6,16 @@ export interface FileInfo {
|
|
|
6
6
|
category?: string;
|
|
7
7
|
category_icon?: string;
|
|
8
8
|
}
|
|
9
|
+
export interface ExportItem {
|
|
10
|
+
label: string;
|
|
11
|
+
hint?: string;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
on_download?: () => void;
|
|
14
|
+
copy_text?: () => string | null;
|
|
15
|
+
show_dpi?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface ExportSection {
|
|
18
|
+
title?: string;
|
|
19
|
+
tooltip?: string;
|
|
20
|
+
items: ExportItem[];
|
|
21
|
+
}
|
package/dist/io/url-drop.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { load_binary_traj } from '../trajectory/parse';
|
|
2
2
|
import { decompress_data_binary } from './decompress';
|
|
3
|
-
|
|
4
|
-
const TEXT_EXTENSIONS = new Set(`xyz extxyz json cif poscar yaml yml txt md py js ts css html xml`.split(` `));
|
|
5
|
-
const VASP_BASENAME_RE = /^(poscar|xdatcar|contcar)$/i;
|
|
6
|
-
const GZ_EXT_RE = /\.(gz|gzip)$/i;
|
|
3
|
+
import { BINARY_EXTENSIONS, ext_of, has_binary_inner_ext, has_binary_magic, has_gzip_magic, has_hdf5_magic, is_known_text_file, strip_gz_ext, } from './is-binary';
|
|
7
4
|
// Extract filename from Content-Disposition header, falling back to url_basename.
|
|
8
5
|
function extract_filename(headers, fallback) {
|
|
9
6
|
if (!headers)
|
|
@@ -11,11 +8,11 @@ function extract_filename(headers, fallback) {
|
|
|
11
8
|
const content_disposition_str = headers.get(`content-disposition`);
|
|
12
9
|
if (!content_disposition_str)
|
|
13
10
|
return fallback;
|
|
14
|
-
const star_match = /filename\*=([^;]+)/i.exec(content_disposition_str);
|
|
11
|
+
const star_match = /filename\*=(?<value>[^;]+)/i.exec(content_disposition_str);
|
|
15
12
|
if (star_match?.[1]) {
|
|
16
13
|
let raw = star_match[1].trim().replaceAll(/^"|"$/g, ``);
|
|
17
14
|
// Strip any RFC 5987 charset'language' prefix; bare values pass through unchanged
|
|
18
|
-
const ext_value_match = /^[\w!#$%&+^`{}~-]+'[\w-]*'(
|
|
15
|
+
const ext_value_match = /^[\w!#$%&+^`{}~-]+'[\w-]*'(?<value>.*)$/.exec(raw);
|
|
19
16
|
if (ext_value_match)
|
|
20
17
|
raw = ext_value_match[1];
|
|
21
18
|
try {
|
|
@@ -25,17 +22,13 @@ function extract_filename(headers, fallback) {
|
|
|
25
22
|
return raw;
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
|
-
const plain_match = /filename\s*=\s*"?([^";]+)"?/i.exec(content_disposition_str);
|
|
25
|
+
const plain_match = /filename\s*=\s*"?(?<value>[^";]+)"?/i.exec(content_disposition_str);
|
|
29
26
|
// truthiness check (not ??) so whitespace-only `filename=` values fall back too
|
|
30
27
|
const name = plain_match?.[1]?.trim();
|
|
31
28
|
if (!name)
|
|
32
29
|
return fallback;
|
|
33
30
|
return name;
|
|
34
31
|
}
|
|
35
|
-
const ext_of = (name) => name.split(`.`).pop()?.toLowerCase() ?? ``;
|
|
36
|
-
// Whether the file inside a .gz/.gzip wrapper is a known binary format that a
|
|
37
|
-
// lossy text decode would corrupt (bytes >= 0x80 → U+FFFD)
|
|
38
|
-
const has_binary_inner_ext = (filename) => BINARY_EXTENSIONS.has(ext_of(filename.replace(GZ_EXT_RE, ``)));
|
|
39
32
|
// Gunzip a fetched payload → [content, filename] with .gz/.gzip stripped; content
|
|
40
33
|
// stays an ArrayBuffer for binary inner formats, decoded string otherwise
|
|
41
34
|
async function decompress_gz_payload(buffer, filename) {
|
|
@@ -43,7 +36,7 @@ async function decompress_gz_payload(buffer, filename) {
|
|
|
43
36
|
const content = has_binary_inner_ext(filename)
|
|
44
37
|
? decompressed
|
|
45
38
|
: new TextDecoder().decode(decompressed);
|
|
46
|
-
return [content, filename
|
|
39
|
+
return [content, strip_gz_ext(filename)];
|
|
47
40
|
}
|
|
48
41
|
// Handle URL-based file drop data by fetching content lazily
|
|
49
42
|
export async function handle_url_drop(drag_event, callback) {
|
|
@@ -87,12 +80,10 @@ export async function load_from_url(url, callback) {
|
|
|
87
80
|
if (ext === `h5` || ext === `hdf5`) {
|
|
88
81
|
const result = await load_binary_traj(resp, `H5`, true);
|
|
89
82
|
// Log warning if signature doesn't match (only for ArrayBuffer results)
|
|
90
|
-
if (result instanceof ArrayBuffer &&
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
console.warn(`File has .h5/.hdf5 extension but missing HDF5 signature`);
|
|
95
|
-
}
|
|
83
|
+
if (result instanceof ArrayBuffer &&
|
|
84
|
+
result.byteLength >= 8 &&
|
|
85
|
+
!has_hdf5_magic(new Uint8Array(result.slice(0, 8)))) {
|
|
86
|
+
console.warn(`File has .h5/.hdf5 extension but missing HDF5 signature`);
|
|
96
87
|
}
|
|
97
88
|
return callback(result, filename);
|
|
98
89
|
}
|
|
@@ -108,7 +99,7 @@ export async function load_from_url(url, callback) {
|
|
|
108
99
|
}
|
|
109
100
|
// Skip Range requests for known text formats to avoid production server issues
|
|
110
101
|
// Include VASP files that don't have extensions (POSCAR, XDATCAR, CONTCAR)
|
|
111
|
-
const is_known_text =
|
|
102
|
+
const is_known_text = is_known_text_file(url_basename);
|
|
112
103
|
let sniffed_callback_args;
|
|
113
104
|
if (!is_known_text) {
|
|
114
105
|
// Only the Range sniff is guarded (failure → plain text fetch). Once magic bytes
|
|
@@ -121,13 +112,10 @@ export async function load_from_url(url, callback) {
|
|
|
121
112
|
const head = await fetch(url, { headers: { Range: `bytes=0-15` } });
|
|
122
113
|
if (head.ok) {
|
|
123
114
|
const buf = new Uint8Array(await head.arrayBuffer());
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// ASE .traj files start with the Ulm signature "- of Ulm"
|
|
127
|
-
const is_ase_traj = [0x2d, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x6c, 0x6d].every((byte, idx) => buf[idx] === byte);
|
|
128
|
-
if (is_gzip)
|
|
115
|
+
// gzip is gunzipped downstream; other binary magic (HDF5, ZIP, ASE Ulm) stays raw
|
|
116
|
+
if (has_gzip_magic(buf))
|
|
129
117
|
sniffed = `gzip`;
|
|
130
|
-
else if (
|
|
118
|
+
else if (has_binary_magic(buf))
|
|
131
119
|
sniffed = `binary`;
|
|
132
120
|
}
|
|
133
121
|
}
|
|
@@ -14,13 +14,12 @@
|
|
|
14
14
|
Uint32BufferAttribute,
|
|
15
15
|
} from 'three'
|
|
16
16
|
import type { IsosurfaceLayer, IsosurfaceSettings, VolumetricData } from './types'
|
|
17
|
-
import {
|
|
18
|
-
DEFAULT_ISOSURFACE_SETTINGS,
|
|
19
|
-
downsample_grid,
|
|
20
|
-
pad_periodic_grid,
|
|
21
|
-
} from './types'
|
|
17
|
+
import { DEFAULT_ISOSURFACE_SETTINGS, downsample_grid, pad_periodic_grid } from './types'
|
|
22
18
|
|
|
23
|
-
let {
|
|
19
|
+
let {
|
|
20
|
+
volume,
|
|
21
|
+
settings = DEFAULT_ISOSURFACE_SETTINGS,
|
|
22
|
+
}: {
|
|
24
23
|
volume: VolumetricData
|
|
25
24
|
settings?: IsosurfaceSettings
|
|
26
25
|
} = $props()
|
|
@@ -28,23 +27,22 @@
|
|
|
28
27
|
// Resolve layers: use explicit layers array if provided, else build from single-isovalue settings
|
|
29
28
|
let resolved_layers = $derived.by((): IsosurfaceLayer[] => {
|
|
30
29
|
if (settings.layers?.length) return settings.layers
|
|
31
|
-
return [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
isovalue: settings.isovalue,
|
|
33
|
+
color: settings.positive_color,
|
|
34
|
+
opacity: settings.opacity,
|
|
35
|
+
visible: true,
|
|
36
|
+
show_negative: settings.show_negative,
|
|
37
|
+
negative_color: settings.negative_color,
|
|
38
|
+
},
|
|
39
|
+
]
|
|
39
40
|
})
|
|
40
41
|
|
|
41
42
|
// Build indexed BufferGeometry from marching cubes output.
|
|
42
43
|
// Uses Three.js index buffer to avoid tripling vertex data, and
|
|
43
44
|
// computeVertexNormals() for fast GPU-friendly normals.
|
|
44
|
-
function build_geometry(
|
|
45
|
-
vertices: Vec3[],
|
|
46
|
-
faces: number[][],
|
|
47
|
-
): BufferGeometry | null {
|
|
45
|
+
function build_geometry(vertices: Vec3[], faces: number[][]): BufferGeometry | null {
|
|
48
46
|
if (vertices.length === 0 || faces.length === 0) return null
|
|
49
47
|
|
|
50
48
|
// Flatten vertices: Vec3[] → Float32Array
|
|
@@ -242,11 +240,7 @@
|
|
|
242
240
|
</T.Mesh>
|
|
243
241
|
{:else if entry.opacity < 1}
|
|
244
242
|
<!-- Two-pass rendering for correct transparency -->
|
|
245
|
-
<T.Mesh
|
|
246
|
-
geometry={entry.geometry}
|
|
247
|
-
renderOrder={entry.render_order}
|
|
248
|
-
frustumCulled={false}
|
|
249
|
-
>
|
|
243
|
+
<T.Mesh geometry={entry.geometry} renderOrder={entry.render_order} frustumCulled={false}>
|
|
250
244
|
<T.MeshStandardMaterial
|
|
251
245
|
color={entry.color}
|
|
252
246
|
transparent
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
function update_layer(idx: number, updates: Partial<IsosurfaceLayer>) {
|
|
46
46
|
if (!settings.layers) return
|
|
47
47
|
settings.layers = settings.layers.map((layer, layer_idx) =>
|
|
48
|
-
layer_idx === idx ? { ...layer, ...updates } : layer
|
|
48
|
+
layer_idx === idx ? { ...layer, ...updates } : layer,
|
|
49
49
|
)
|
|
50
50
|
}
|
|
51
51
|
</script>
|
|
@@ -68,7 +68,9 @@
|
|
|
68
68
|
<div class="pane-row compact-row">
|
|
69
69
|
{#if volumes.length > 1}
|
|
70
70
|
<label
|
|
71
|
-
{@attach tooltip({
|
|
71
|
+
{@attach tooltip({
|
|
72
|
+
content: `Select which volume to display (e.g. charge vs magnetization)`,
|
|
73
|
+
})}
|
|
72
74
|
>
|
|
73
75
|
<span>Volume:</span>
|
|
74
76
|
<select bind:value={active_volume_idx}>
|
|
@@ -79,13 +81,14 @@
|
|
|
79
81
|
</label>
|
|
80
82
|
{/if}
|
|
81
83
|
<label
|
|
82
|
-
{@attach tooltip({
|
|
84
|
+
{@attach tooltip({
|
|
85
|
+
content: `Number of isosurface shells at different density thresholds`,
|
|
86
|
+
})}
|
|
83
87
|
>
|
|
84
88
|
<span>Layers:</span>
|
|
85
89
|
<select
|
|
86
90
|
value={n_layers}
|
|
87
|
-
onchange={(event) =>
|
|
88
|
-
set_layer_count(Number(event.currentTarget.value))}
|
|
91
|
+
onchange={(event) => set_layer_count(Number(event.currentTarget.value))}
|
|
89
92
|
>
|
|
90
93
|
{#each [1, 2, 3, 4, 5] as count (count)}
|
|
91
94
|
<option value={count}>{count}</option>
|
|
@@ -95,14 +98,16 @@
|
|
|
95
98
|
<!-- Sync both settings.show_negative (single-layer fallback) and all layer entries
|
|
96
99
|
so the toggle works consistently regardless of which mode is active -->
|
|
97
100
|
<label
|
|
98
|
-
{@attach tooltip({
|
|
101
|
+
{@attach tooltip({
|
|
102
|
+
content: `Show negative lobe at −isovalue (for orbitals, ESP, magnetization)`,
|
|
103
|
+
})}
|
|
99
104
|
>
|
|
100
105
|
<span>Neg. lobe</span>
|
|
101
106
|
<input
|
|
102
107
|
type="checkbox"
|
|
103
108
|
checked={is_multi_layer
|
|
104
|
-
|
|
105
|
-
|
|
109
|
+
? (settings.layers?.some((layer) => layer.show_negative) ?? false)
|
|
110
|
+
: settings.show_negative}
|
|
106
111
|
onchange={(event) => {
|
|
107
112
|
const checked = event.currentTarget.checked
|
|
108
113
|
settings.show_negative = checked
|
|
@@ -115,9 +120,7 @@
|
|
|
115
120
|
}}
|
|
116
121
|
/>
|
|
117
122
|
</label>
|
|
118
|
-
<label
|
|
119
|
-
{@attach tooltip({ content: `Render as wireframe mesh instead of solid surface` })}
|
|
120
|
-
>
|
|
123
|
+
<label {@attach tooltip({ content: `Render as wireframe mesh instead of solid surface` })}>
|
|
121
124
|
<span>Wireframe</span>
|
|
122
125
|
<input type="checkbox" bind:checked={settings.wireframe} />
|
|
123
126
|
</label>
|
|
@@ -135,8 +138,7 @@
|
|
|
135
138
|
<input
|
|
136
139
|
type="color"
|
|
137
140
|
value={layer.color}
|
|
138
|
-
onchange={(event) =>
|
|
139
|
-
update_layer(idx, { color: event.currentTarget.value })}
|
|
141
|
+
onchange={(event) => update_layer(idx, { color: event.currentTarget.value })}
|
|
140
142
|
/>
|
|
141
143
|
<input
|
|
142
144
|
type="range"
|
|
@@ -145,9 +147,9 @@
|
|
|
145
147
|
{step}
|
|
146
148
|
value={layer.isovalue}
|
|
147
149
|
oninput={(event) =>
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
update_layer(idx, {
|
|
151
|
+
isovalue: Number(event.currentTarget.value),
|
|
152
|
+
})}
|
|
151
153
|
style="flex: 1; min-width: 60px"
|
|
152
154
|
/>
|
|
153
155
|
<span class="layer-value">{format_num(layer.isovalue, `.3~g`)}</span>
|
|
@@ -158,9 +160,9 @@
|
|
|
158
160
|
step={0.05}
|
|
159
161
|
value={layer.opacity}
|
|
160
162
|
oninput={(event) =>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
update_layer(idx, {
|
|
164
|
+
opacity: Number(event.currentTarget.value),
|
|
165
|
+
})}
|
|
164
166
|
style="width: 50px"
|
|
165
167
|
title="Opacity: {format_num(layer.opacity, `.2f`)}"
|
|
166
168
|
/>
|
|
@@ -169,23 +171,21 @@
|
|
|
169
171
|
{:else}
|
|
170
172
|
<!-- Single-layer: isovalue slider full width -->
|
|
171
173
|
<label
|
|
172
|
-
{@attach tooltip({
|
|
174
|
+
{@attach tooltip({
|
|
175
|
+
content: `Density threshold — surface is drawn where grid values equal this`,
|
|
176
|
+
})}
|
|
173
177
|
>
|
|
174
178
|
<span>Isovalue:</span>
|
|
175
|
-
<input
|
|
176
|
-
type="range"
|
|
177
|
-
min={step}
|
|
178
|
-
max={slider_max}
|
|
179
|
-
{step}
|
|
180
|
-
bind:value={settings.isovalue}
|
|
181
|
-
/>
|
|
179
|
+
<input type="range" min={step} max={slider_max} {step} bind:value={settings.isovalue} />
|
|
182
180
|
<span class="value">{format_num(settings.isovalue, `.4~g`)}</span>
|
|
183
181
|
</label>
|
|
184
182
|
|
|
185
183
|
<!-- Opacity + colors on one row -->
|
|
186
184
|
<div class="pane-row compact-row">
|
|
187
185
|
<label
|
|
188
|
-
{@attach tooltip({
|
|
186
|
+
{@attach tooltip({
|
|
187
|
+
content: `Surface transparency — lower values reveal inner structure`,
|
|
188
|
+
})}
|
|
189
189
|
>
|
|
190
190
|
<span>Opacity:</span>
|
|
191
191
|
<input
|
|
@@ -203,9 +203,7 @@
|
|
|
203
203
|
<input type="color" bind:value={settings.positive_color} />
|
|
204
204
|
</label>
|
|
205
205
|
{#if settings.show_negative}
|
|
206
|
-
<label
|
|
207
|
-
{@attach tooltip({ content: `Color for the negative (−isovalue) surface` })}
|
|
208
|
-
>
|
|
206
|
+
<label {@attach tooltip({ content: `Color for the negative (−isovalue) surface` })}>
|
|
209
207
|
<span>− Color</span>
|
|
210
208
|
<input type="color" bind:value={settings.negative_color} />
|
|
211
209
|
</label>
|
|
@@ -215,24 +213,21 @@
|
|
|
215
213
|
|
|
216
214
|
{#if volumes?.[active_volume_idx]?.periodic}
|
|
217
215
|
<label
|
|
218
|
-
{@attach tooltip({
|
|
216
|
+
{@attach tooltip({
|
|
217
|
+
content: `Extend isosurface beyond cell boundaries to close partial spheres (fraction of cell)`,
|
|
218
|
+
})}
|
|
219
219
|
>
|
|
220
220
|
Halo: {format_num(settings.halo, `.2f`)}
|
|
221
|
-
<input
|
|
222
|
-
type="range"
|
|
223
|
-
min={0}
|
|
224
|
-
max={0.5}
|
|
225
|
-
step={0.01}
|
|
226
|
-
bind:value={settings.halo}
|
|
227
|
-
/>
|
|
221
|
+
<input type="range" min={0} max={0.5} step={0.01} bind:value={settings.halo} />
|
|
228
222
|
</label>
|
|
229
223
|
{/if}
|
|
230
224
|
|
|
231
225
|
{#if volumes[active_volume_idx]}
|
|
232
226
|
<div class="grid-info">
|
|
233
|
-
{volumes[active_volume_idx].grid_dims.join(` × `)} grid | [{
|
|
234
|
-
|
|
235
|
-
|
|
227
|
+
{volumes[active_volume_idx].grid_dims.join(` × `)} grid | [{format_num(
|
|
228
|
+
data_range.min,
|
|
229
|
+
`.3~g`,
|
|
230
|
+
)}, {format_num(data_range.max, `.3~g`)}]
|
|
236
231
|
</div>
|
|
237
232
|
{/if}
|
|
238
233
|
</SettingsSection>
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Parser for VASP vaspwave.h5 charge density: charge/charge on charge/grid
|
|
2
|
+
// plus the embedded structure under structure/positions (dataset paths follow
|
|
3
|
+
// ferrox's VASPWAVE_* constants / py4vasp's VASP 6.x schema). Full files are
|
|
4
|
+
// hundreds of MB, so embedding hosts are expected to prune them server-side
|
|
5
|
+
// first; this parser sees only charge/{charge,grid} + structure/positions.
|
|
6
|
+
//
|
|
7
|
+
// Prototype scope: charge (+ magnetization) isosurfaces only — wavefunctions
|
|
8
|
+
// are out of scope. The "charge density RMS per SCF step" convergence signal
|
|
9
|
+
// is already covered by OSZICAR's rms(c) column in the vaspout.h5 parser
|
|
10
|
+
// (scf_charge_rms frame metadata); diffing charge grids between live reloads
|
|
11
|
+
// is explicitly out of scope here.
|
|
12
|
+
import { calc_lattice_params, create_frac_to_cart } from '../math';
|
|
13
|
+
import { wrap_to_unit_cell } from '../structure/pbc';
|
|
14
|
+
import { make_site } from '../structure/site';
|
|
15
|
+
import { validate_3x3_matrix } from '../trajectory/helpers';
|
|
16
|
+
import { expand_ion_types, is_hdf5_dataset, read_dataset, scale_matrix, to_number_array, to_scalar_number, to_string_array, with_h5_file, } from '../trajectory/parse/h5-utils';
|
|
17
|
+
import { grid_data_range } from './types';
|
|
18
|
+
const CHARGE_PATH = `charge/charge`;
|
|
19
|
+
const CHARGE_GRID_PATH = `charge/grid`;
|
|
20
|
+
const STRUCTURE_PREFIX = `structure/positions`;
|
|
21
|
+
// vaspwave carries charge density/wavefunctions, never a trajectory — used by
|
|
22
|
+
// file-open routing to divert from the HDF5 trajectory dispatcher.
|
|
23
|
+
export const is_vaspwave_filename = (filename) => {
|
|
24
|
+
const basename = filename.split(`/`).pop() ?? filename;
|
|
25
|
+
return /vaspwave.*\.(?:h5|hdf5)$/i.test(basename);
|
|
26
|
+
};
|
|
27
|
+
const dataset_shape = (h5_file, path) => {
|
|
28
|
+
const entity = h5_file.get(path);
|
|
29
|
+
return is_hdf5_dataset(entity) ? (entity.shape ?? null) : null;
|
|
30
|
+
};
|
|
31
|
+
const read_embedded_structure = (h5_file) => {
|
|
32
|
+
const lattice_data = read_dataset(h5_file, `${STRUCTURE_PREFIX}/lattice_vectors`);
|
|
33
|
+
if (!lattice_data) {
|
|
34
|
+
throw new Error(`vaspwave.h5 has no embedded structure (${STRUCTURE_PREFIX}/lattice_vectors) — ` +
|
|
35
|
+
`cannot place the charge grid in a lattice`);
|
|
36
|
+
}
|
|
37
|
+
const scale = to_scalar_number(read_dataset(h5_file, `${STRUCTURE_PREFIX}/scale`)) ?? 1;
|
|
38
|
+
const lattice = scale_matrix(validate_3x3_matrix(lattice_data), scale);
|
|
39
|
+
// Sites are optional for rendering (the isosurface needs only the lattice),
|
|
40
|
+
// so a pruned/torn file missing ion data still opens with an empty cell.
|
|
41
|
+
const sites = [];
|
|
42
|
+
const ion_types = to_string_array(read_dataset(h5_file, `${STRUCTURE_PREFIX}/ion_types`));
|
|
43
|
+
const ion_counts = to_number_array(read_dataset(h5_file, `${STRUCTURE_PREFIX}/number_ion_types`));
|
|
44
|
+
const frac_positions = read_dataset(h5_file, `${STRUCTURE_PREFIX}/position_ions`);
|
|
45
|
+
if (ion_types && ion_counts && frac_positions && ion_types.length === ion_counts.length) {
|
|
46
|
+
const elements = expand_ion_types(ion_types, ion_counts);
|
|
47
|
+
const frac_to_cart = create_frac_to_cart(lattice);
|
|
48
|
+
for (const [site_idx, element] of elements.entries()) {
|
|
49
|
+
const frac = frac_positions[site_idx];
|
|
50
|
+
if (!Array.isArray(frac) || frac.length < 3)
|
|
51
|
+
break; // torn positions: keep what parsed
|
|
52
|
+
const abc = wrap_to_unit_cell(frac.slice(0, 3));
|
|
53
|
+
sites.push(make_site(element, abc, frac_to_cart(abc), `${element}${site_idx + 1}`));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
sites,
|
|
58
|
+
lattice: { matrix: lattice, pbc: [true, true, true], ...calc_lattice_params(lattice) },
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
// VASP writes volumetric data C-order [components, nz, ny, nx]; the grid
|
|
62
|
+
// dataset [nx, ny, nz] disambiguates (same logic as ferrox's
|
|
63
|
+
// volumetric_grid_shape_and_order — when nx == nz both layouts match, so
|
|
64
|
+
// default to the canonical zyx order).
|
|
65
|
+
const charge_axis_order = (spatial_shape, grid_dims) => {
|
|
66
|
+
const [nx, ny, nz] = grid_dims;
|
|
67
|
+
const matches = (dims) => dims.every((dim, idx) => dim === spatial_shape[idx]);
|
|
68
|
+
if (matches([nz, ny, nx]))
|
|
69
|
+
return `zyx`;
|
|
70
|
+
if (matches([nx, ny, nz]))
|
|
71
|
+
return `xyz`;
|
|
72
|
+
throw new Error(`vaspwave.h5 ${CHARGE_GRID_PATH} [${grid_dims}] is incompatible with ` +
|
|
73
|
+
`${CHARGE_PATH} spatial shape [${spatial_shape}]`);
|
|
74
|
+
};
|
|
75
|
+
function parse_vaspwave_charge_file(h5_file) {
|
|
76
|
+
const shape = dataset_shape(h5_file, CHARGE_PATH);
|
|
77
|
+
if (!shape) {
|
|
78
|
+
throw new Error(`vaspwave.h5 file has no charge density (missing ${CHARGE_PATH})`);
|
|
79
|
+
}
|
|
80
|
+
// Only the dimension count is checked here — the spatial axis order (zyx vs
|
|
81
|
+
// xyz) is disambiguated later by charge_axis_order against CHARGE_GRID_PATH.
|
|
82
|
+
if (shape.length !== 4) {
|
|
83
|
+
throw new Error(`${CHARGE_PATH} must have 4 dimensions, got [${shape}]`);
|
|
84
|
+
}
|
|
85
|
+
const n_components = shape[0];
|
|
86
|
+
if (n_components < 1 || n_components > 2) {
|
|
87
|
+
throw new Error(`${CHARGE_PATH} has unsupported component count ${n_components}; expected 1 ` +
|
|
88
|
+
`(non-spin-polarized) or 2 (total + magnetization)`);
|
|
89
|
+
}
|
|
90
|
+
const grid_dims = to_number_array(read_dataset(h5_file, CHARGE_GRID_PATH));
|
|
91
|
+
if (grid_dims?.length !== 3) {
|
|
92
|
+
throw new Error(`vaspwave.h5 is missing ${CHARGE_GRID_PATH}; cannot determine the axis order of ${CHARGE_PATH}`);
|
|
93
|
+
}
|
|
94
|
+
const axis_order = charge_axis_order(shape.slice(1), grid_dims);
|
|
95
|
+
const [nx, ny, nz] = grid_dims;
|
|
96
|
+
const structure = read_embedded_structure(h5_file);
|
|
97
|
+
const lattice = structure.lattice.matrix;
|
|
98
|
+
const charge_data = read_dataset(h5_file, CHARGE_PATH);
|
|
99
|
+
if (!charge_data)
|
|
100
|
+
throw new Error(`Failed to read ${CHARGE_PATH} data`);
|
|
101
|
+
// Metadata shape and decoded data can disagree in torn/corrupt files — fail
|
|
102
|
+
// loudly instead of silently rendering fewer components than the file claims
|
|
103
|
+
if (charge_data.length !== n_components) {
|
|
104
|
+
throw new Error(`${CHARGE_PATH} decoded ${charge_data.length} components but its shape claims ${n_components}`);
|
|
105
|
+
}
|
|
106
|
+
const component_labels = [`charge density`, `magnetization density`];
|
|
107
|
+
const volumes = charge_data.map((component, component_idx) => {
|
|
108
|
+
const grid = Array(nx);
|
|
109
|
+
for (let x_idx = 0; x_idx < nx; x_idx++) {
|
|
110
|
+
const plane = Array(ny);
|
|
111
|
+
for (let y_idx = 0; y_idx < ny; y_idx++) {
|
|
112
|
+
const row = Array(nz);
|
|
113
|
+
for (let z_idx = 0; z_idx < nz; z_idx++) {
|
|
114
|
+
row[z_idx] =
|
|
115
|
+
axis_order === `zyx`
|
|
116
|
+
? component[z_idx][y_idx][x_idx]
|
|
117
|
+
: component[x_idx][y_idx][z_idx];
|
|
118
|
+
}
|
|
119
|
+
plane[y_idx] = row;
|
|
120
|
+
}
|
|
121
|
+
grid[x_idx] = plane;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
grid,
|
|
125
|
+
grid_dims: [nx, ny, nz],
|
|
126
|
+
lattice,
|
|
127
|
+
origin: [0, 0, 0],
|
|
128
|
+
data_range: grid_data_range(grid),
|
|
129
|
+
data_order: `x_fastest`,
|
|
130
|
+
periodic: true,
|
|
131
|
+
label: component_labels[component_idx],
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
return { structure, volumes };
|
|
135
|
+
}
|
|
136
|
+
export async function parse_vaspwave_charge(buffer, filename) {
|
|
137
|
+
return with_h5_file(buffer, filename, parse_vaspwave_charge_file);
|
|
138
|
+
}
|