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
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// Worker-safe file parsing with no Svelte or DOM imports.
|
|
2
|
+
import { COMPRESSION_EXTENSIONS_REGEX } from '../constants';
|
|
3
|
+
import { parse_fermi_file } from '../fermi-surface/parse';
|
|
4
|
+
import { decompress_data, decompress_data_binary, detect_compression_format, } from '../io/decompress';
|
|
5
|
+
import { parse_volumetric_file } from '../isosurface/parse';
|
|
6
|
+
import { is_vaspwave_filename, parse_vaspwave_charge } from '../isosurface/parse-vaspwave';
|
|
7
|
+
import { parse_structure_file } from '../structure/parse';
|
|
8
|
+
import { is_trajectory_file, parse_trajectory_data } from '../trajectory/parse';
|
|
9
|
+
import { FERMI_FILE_RE, VOLUMETRIC_EXT_RE, VOLUMETRIC_VASP_RE } from './types';
|
|
10
|
+
import { detect_view_type } from './detect';
|
|
11
|
+
// Maps detect.ts RenderableType to ViewType for direct rendering.
|
|
12
|
+
// Types not listed here fall through to json_browser (which can render all types
|
|
13
|
+
// via its internal mount_into, giving the user a tree view alongside the viz).
|
|
14
|
+
// structure and volumetric have special handling in parse_file_content below.
|
|
15
|
+
const DETECTION_TO_VIEW_TYPE = {
|
|
16
|
+
fermi_surface: `fermi_surface`,
|
|
17
|
+
band_grid: `fermi_surface`,
|
|
18
|
+
convex_hull: `convex_hull`,
|
|
19
|
+
phase_diagram: `phase_diagram`,
|
|
20
|
+
};
|
|
21
|
+
// Convert base64 to ArrayBuffer for binary files
|
|
22
|
+
export function base64_to_array_buffer(base64) {
|
|
23
|
+
const binary = atob(base64);
|
|
24
|
+
const bytes = new Uint8Array(binary.length);
|
|
25
|
+
for (let idx = 0; idx < binary.length; idx++) {
|
|
26
|
+
bytes[idx] = binary.charCodeAt(idx);
|
|
27
|
+
}
|
|
28
|
+
return bytes.buffer;
|
|
29
|
+
}
|
|
30
|
+
// Parse file content and determine if it's a structure or trajectory
|
|
31
|
+
export const parse_file_content = async (content, filename, is_base64 = false) => {
|
|
32
|
+
// Handle base64-encoded compressed/binary files by converting them first
|
|
33
|
+
if (is_base64) {
|
|
34
|
+
let buffer = base64_to_array_buffer(content);
|
|
35
|
+
const compression_format = detect_compression_format(filename);
|
|
36
|
+
if (compression_format) {
|
|
37
|
+
const normalized_filename = filename.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
|
|
38
|
+
if (detect_compression_format(normalized_filename)) {
|
|
39
|
+
throw new Error(`Nested compression is not supported: ${filename}`);
|
|
40
|
+
}
|
|
41
|
+
filename = normalized_filename;
|
|
42
|
+
}
|
|
43
|
+
// Compressed binary formats (e.g. vaspwave.h5.gz as ferrox stores them on S3,
|
|
44
|
+
// or compressed ASE .traj files): decompress to binary first — generic text
|
|
45
|
+
// decompression would corrupt their bytes — so routing sees the inner name.
|
|
46
|
+
const is_binary_format = /\.(?:h5|hdf5|traj)$/i.test(filename);
|
|
47
|
+
if (compression_format === `zip`) {
|
|
48
|
+
const { unzipSync } = await import(`fflate`);
|
|
49
|
+
const payload = Object.entries(unzipSync(new Uint8Array(buffer))).find(([entry_name]) => !entry_name.endsWith(`/`))?.[1];
|
|
50
|
+
if (!payload)
|
|
51
|
+
throw new Error(`ZIP archive contains no files: ${filename}`);
|
|
52
|
+
if (is_binary_format)
|
|
53
|
+
buffer = payload.slice().buffer;
|
|
54
|
+
else
|
|
55
|
+
content = new TextDecoder().decode(payload);
|
|
56
|
+
}
|
|
57
|
+
else if (compression_format) {
|
|
58
|
+
// Unified handling for all supported compression formats
|
|
59
|
+
// Unsupported formats fail here with a clear extraction error
|
|
60
|
+
if (is_binary_format)
|
|
61
|
+
buffer = await decompress_data_binary(buffer, compression_format);
|
|
62
|
+
else
|
|
63
|
+
content = await decompress_data(buffer, compression_format);
|
|
64
|
+
}
|
|
65
|
+
// vaspwave.h5 holds charge density (+ wavefunctions), not a trajectory —
|
|
66
|
+
// route to the volumetric parser so it renders as an isosurface.
|
|
67
|
+
if (is_vaspwave_filename(filename)) {
|
|
68
|
+
const data = await parse_vaspwave_charge(buffer, filename);
|
|
69
|
+
return { type: `isosurface`, data, filename };
|
|
70
|
+
}
|
|
71
|
+
// Binary trajectory formats: pass buffer directly to trajectory parser
|
|
72
|
+
if (is_binary_format) {
|
|
73
|
+
const data = await parse_trajectory_data(buffer, filename);
|
|
74
|
+
// DOS/bands-only vaspout.h5 (e.g. phelel band paths): no frames to animate,
|
|
75
|
+
// route the electronic results to the spectral components instead.
|
|
76
|
+
// Require at least one renderable result rather than trusting the
|
|
77
|
+
// parser's invariant (the metadata cast is unchecked): an empty
|
|
78
|
+
// electronic object would otherwise mount <Dos doses={null}>.
|
|
79
|
+
const electronic = data.metadata?.electronic;
|
|
80
|
+
if (data.frames.length === 0 && (electronic?.dos || electronic?.bands)) {
|
|
81
|
+
return { type: `vaspout_electronic`, filename, data: electronic };
|
|
82
|
+
}
|
|
83
|
+
return { type: `trajectory`, filename, data };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Fermi surface files (.bxsf, .frmsf)
|
|
87
|
+
// Use basename for regex matching in case filename retains a directory prefix
|
|
88
|
+
const basename = filename.split(`/`).pop() ?? filename;
|
|
89
|
+
if (FERMI_FILE_RE.test(basename)) {
|
|
90
|
+
// parse_fermi_file throws a descriptive error when parsing fails
|
|
91
|
+
return { type: `fermi_surface`, data: parse_fermi_file(content, filename), filename };
|
|
92
|
+
}
|
|
93
|
+
// Volumetric data files (.cube, CHGCAR, AECCAR*, ELFCAR, LOCPOT, PARCHG)
|
|
94
|
+
if (VOLUMETRIC_EXT_RE.test(basename) || VOLUMETRIC_VASP_RE.test(basename)) {
|
|
95
|
+
const data = parse_volumetric_file(content, filename);
|
|
96
|
+
if (data)
|
|
97
|
+
return { type: `isosurface`, data, filename };
|
|
98
|
+
throw new Error(`Failed to parse volumetric file: ${filename}`);
|
|
99
|
+
}
|
|
100
|
+
let parsed_json;
|
|
101
|
+
let has_parsed_json = false;
|
|
102
|
+
// JSON files: render typed JSON before filename heuristics. Otherwise names like
|
|
103
|
+
// convex-hull.json can be mistaken for trajectory keywords such as nve.
|
|
104
|
+
if (/\.json$/i.test(filename)) {
|
|
105
|
+
try {
|
|
106
|
+
parsed_json = JSON.parse(content);
|
|
107
|
+
has_parsed_json = true;
|
|
108
|
+
// Check if the top-level value matches a known visualization type
|
|
109
|
+
const detected = detect_view_type(parsed_json);
|
|
110
|
+
if (detected) {
|
|
111
|
+
// Structure JSON needs normalization (OPTIMADE, fractional coords, etc.)
|
|
112
|
+
if (detected === `structure`) {
|
|
113
|
+
try {
|
|
114
|
+
const structure = parse_structure_file(content, filename);
|
|
115
|
+
return {
|
|
116
|
+
type: `structure`,
|
|
117
|
+
data: { ...structure, id: filename.replace(/\.[^/.]+$/, ``) },
|
|
118
|
+
filename,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Detailed parse failed despite structure-like shape — fall through to
|
|
123
|
+
// generic JSON handling below
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Volumetric JSON needs wrapping in { structure, volumes } for the isosurface renderer
|
|
127
|
+
if (detected === `volumetric`) {
|
|
128
|
+
const vol = parsed_json;
|
|
129
|
+
return {
|
|
130
|
+
type: `isosurface`,
|
|
131
|
+
data: { structure: { sites: [], lattice: vol.lattice }, volumes: [parsed_json] },
|
|
132
|
+
filename,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
type: DETECTION_TO_VIEW_TYPE[detected] ?? `json_browser`,
|
|
137
|
+
data: parsed_json,
|
|
138
|
+
filename,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// JSON parse failed, fall through to structure parser
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Try trajectory parsing if it looks like a trajectory
|
|
147
|
+
if (is_trajectory_file(filename, content)) {
|
|
148
|
+
try {
|
|
149
|
+
const data = await parse_trajectory_data(content, filename);
|
|
150
|
+
return { type: `trajectory`, data, filename };
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
// Trajectory-looking filename but not trajectory-shaped JSON (e.g. nve-config.json):
|
|
154
|
+
// fall through to the JSON browser instead of failing the render
|
|
155
|
+
if (!has_parsed_json)
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// No top-level match -- show JSON browser for navigation
|
|
160
|
+
if (has_parsed_json)
|
|
161
|
+
return { type: `json_browser`, data: parsed_json, filename };
|
|
162
|
+
// Parse as structure (CIF, POSCAR, XYZ, etc.) — throws descriptive reasons on failure
|
|
163
|
+
const structure = parse_structure_file(content, filename);
|
|
164
|
+
// parse_structure_file throws on parse failure but can still return zero atoms (e.g. a
|
|
165
|
+
// CIF with cell params but no _atom_site records), which is invalid downstream
|
|
166
|
+
if (!structure.sites?.length)
|
|
167
|
+
throw new Error(`No atoms found in ${filename}`);
|
|
168
|
+
const data = { ...structure, id: filename.replace(/\.[^/.]+$/, ``) };
|
|
169
|
+
return { type: `structure`, data, filename };
|
|
170
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BarSeries, DataSeries, DataSeries3D } from '../plot';
|
|
2
|
+
export type PlotType = `scatter` | `scatter3d` | `bar` | `histogram` | `table`;
|
|
3
|
+
export interface ColumnInfo {
|
|
4
|
+
values: unknown[];
|
|
5
|
+
type: `numeric` | `string` | `mixed`;
|
|
6
|
+
n_valid: number;
|
|
7
|
+
}
|
|
8
|
+
export interface AxisMapping {
|
|
9
|
+
x?: string;
|
|
10
|
+
y?: string;
|
|
11
|
+
z?: string;
|
|
12
|
+
color?: string;
|
|
13
|
+
size?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function extract_columns(data: unknown): Map<string, ColumnInfo>;
|
|
16
|
+
export declare const col_keys: (columns: Map<string, ColumnInfo>, type: ColumnInfo[`type`]) => string[];
|
|
17
|
+
export declare function suggest_mapping(columns: Map<string, ColumnInfo>): {
|
|
18
|
+
plot_type: PlotType;
|
|
19
|
+
mapping: AxisMapping;
|
|
20
|
+
};
|
|
21
|
+
export declare function build_scatter_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): DataSeries;
|
|
22
|
+
export declare function build_scatter3d_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): DataSeries3D;
|
|
23
|
+
export declare function build_bar_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): BarSeries;
|
|
24
|
+
export declare function build_histogram_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): DataSeries;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// Utilities for extracting plottable columns from JSON data and building plot series.
|
|
2
|
+
// Extract columns from row-based or column-based tabular data
|
|
3
|
+
export function extract_columns(data) {
|
|
4
|
+
const columns = new Map();
|
|
5
|
+
if (Array.isArray(data) &&
|
|
6
|
+
data.length > 0 &&
|
|
7
|
+
typeof data[0] === `object` &&
|
|
8
|
+
data[0] !== null) {
|
|
9
|
+
// Row-based: [{ a: 1, b: 'x' }, ...]
|
|
10
|
+
const sample = data.slice(0, 100);
|
|
11
|
+
const all_keys = new Set();
|
|
12
|
+
for (const row of sample) {
|
|
13
|
+
if (row && typeof row === `object`) {
|
|
14
|
+
for (const key of Object.keys(row))
|
|
15
|
+
all_keys.add(key);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const key of all_keys) {
|
|
19
|
+
columns.set(key, classify_column(data.map((row) => row && typeof row === `object` ? row[key] : undefined)));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else if (data && typeof data === `object` && !Array.isArray(data)) {
|
|
23
|
+
// Column-based: { a: [1,2,3], b: ['x','y','z'] }
|
|
24
|
+
const array_entries = Object.entries(data).filter(([, val]) => Array.isArray(val) && val.length > 0);
|
|
25
|
+
if (array_entries.length < 1)
|
|
26
|
+
return columns;
|
|
27
|
+
const target_len = array_entries[0][1].length;
|
|
28
|
+
for (const [key, val] of array_entries) {
|
|
29
|
+
const arr = val;
|
|
30
|
+
if (arr.length === target_len) {
|
|
31
|
+
columns.set(key, classify_column(arr));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return columns;
|
|
36
|
+
}
|
|
37
|
+
function classify_column(values) {
|
|
38
|
+
let n_numeric = 0;
|
|
39
|
+
let n_string = 0;
|
|
40
|
+
let n_valid = 0;
|
|
41
|
+
for (const val of values) {
|
|
42
|
+
if (val == null || (typeof val === `number` && !isFinite(val)))
|
|
43
|
+
continue;
|
|
44
|
+
n_valid++;
|
|
45
|
+
if (typeof val === `number`)
|
|
46
|
+
n_numeric++;
|
|
47
|
+
else if (typeof val === `string`)
|
|
48
|
+
n_string++;
|
|
49
|
+
}
|
|
50
|
+
let type = `mixed`;
|
|
51
|
+
if (n_valid > 0) {
|
|
52
|
+
if (n_numeric >= n_valid * 0.8)
|
|
53
|
+
type = `numeric`;
|
|
54
|
+
else if (n_string >= n_valid * 0.8)
|
|
55
|
+
type = `string`;
|
|
56
|
+
}
|
|
57
|
+
return { values, type, n_valid };
|
|
58
|
+
}
|
|
59
|
+
// Extract column keys of a given type from a column map
|
|
60
|
+
export const col_keys = (columns, type) => [...columns.entries()].filter(([, col]) => col.type === type).map(([key]) => key);
|
|
61
|
+
// Well-known column name patterns for heuristic axis assignment
|
|
62
|
+
const X_NAMES = new Set([`x`, `time`, `step`, `index`, `iteration`, `frame`, `epoch`]);
|
|
63
|
+
const Y_NAMES = new Set([`y`, `energy`, `value`, `force`, `stress`, `loss`, `score`]);
|
|
64
|
+
const Z_NAMES = new Set([`z`, `altitude`, `depth`, `height`]);
|
|
65
|
+
// Heuristic: suggest initial axis mapping and plot type from columns
|
|
66
|
+
export function suggest_mapping(columns) {
|
|
67
|
+
const numeric_cols = col_keys(columns, `numeric`);
|
|
68
|
+
const string_cols = col_keys(columns, `string`);
|
|
69
|
+
const mapping = {};
|
|
70
|
+
// Assign x: prefer named numeric match, then string column (bar chart), then first numeric
|
|
71
|
+
const x_match = numeric_cols.find((key) => X_NAMES.has(key.toLowerCase()));
|
|
72
|
+
const x_string_match = string_cols.find((key) => !Y_NAMES.has(key.toLowerCase()));
|
|
73
|
+
mapping.x =
|
|
74
|
+
x_match ?? x_string_match ?? (numeric_cols.length >= 2 ? numeric_cols[0] : undefined);
|
|
75
|
+
// Assign y
|
|
76
|
+
const remaining_numeric = numeric_cols.filter((key) => key !== mapping.x);
|
|
77
|
+
const y_match = remaining_numeric.find((key) => Y_NAMES.has(key.toLowerCase()));
|
|
78
|
+
mapping.y = y_match ?? remaining_numeric[0];
|
|
79
|
+
// Assign z (only if 3+ numeric columns and one matches z-like name)
|
|
80
|
+
const after_xy = remaining_numeric.filter((key) => key !== mapping.y);
|
|
81
|
+
const z_match = after_xy.find((key) => Z_NAMES.has(key.toLowerCase()));
|
|
82
|
+
if (z_match && numeric_cols.length >= 3)
|
|
83
|
+
mapping.z = z_match;
|
|
84
|
+
// Assign color (first unassigned numeric column)
|
|
85
|
+
const used = new Set([mapping.x, mapping.y, mapping.z].filter(Boolean));
|
|
86
|
+
const color_candidate = numeric_cols.find((key) => !used.has(key));
|
|
87
|
+
if (color_candidate)
|
|
88
|
+
mapping.color = color_candidate;
|
|
89
|
+
// Determine plot type
|
|
90
|
+
let plot_type = `scatter`;
|
|
91
|
+
if (mapping.z) {
|
|
92
|
+
plot_type = `scatter3d`;
|
|
93
|
+
}
|
|
94
|
+
else if (mapping.x && columns.get(mapping.x)?.type === `string`) {
|
|
95
|
+
plot_type = `bar`;
|
|
96
|
+
}
|
|
97
|
+
else if ((!mapping.x || !mapping.y) && numeric_cols.length >= 1) {
|
|
98
|
+
plot_type = `histogram`;
|
|
99
|
+
mapping.x ??= mapping.y ?? numeric_cols[0];
|
|
100
|
+
}
|
|
101
|
+
else if (!mapping.x || !mapping.y) {
|
|
102
|
+
plot_type = `table`;
|
|
103
|
+
}
|
|
104
|
+
return { plot_type, mapping };
|
|
105
|
+
}
|
|
106
|
+
// Convert to numbers, preserving array length (non-finite values become NaN)
|
|
107
|
+
const to_numbers = (values) => values.map((val) => (typeof val === `number` && isFinite(val) ? val : NaN));
|
|
108
|
+
// Convert an arbitrary cell value to a display label, JSON-encoding objects so
|
|
109
|
+
// they don't stringify to the useless "[object Object]".
|
|
110
|
+
const to_label = (val) => {
|
|
111
|
+
if (val == null)
|
|
112
|
+
return ``;
|
|
113
|
+
if (typeof val === `string` ||
|
|
114
|
+
typeof val === `number` ||
|
|
115
|
+
typeof val === `boolean` ||
|
|
116
|
+
typeof val === `bigint`)
|
|
117
|
+
return String(val);
|
|
118
|
+
return JSON.stringify(val);
|
|
119
|
+
};
|
|
120
|
+
// Look up a column by its mapping key, returning undefined if unmapped or missing
|
|
121
|
+
const get_col = (columns, key) => key ? columns.get(key) : undefined;
|
|
122
|
+
// Optional numeric conversion for color/size channels
|
|
123
|
+
const optional_numbers = (col) => col ? to_numbers(col.values) : undefined;
|
|
124
|
+
// Filter N axis arrays to only include indices where all axes are finite,
|
|
125
|
+
// keeping optional color/size arrays aligned
|
|
126
|
+
function filter_finite(axes, color, size) {
|
|
127
|
+
const out = axes.map(() => []);
|
|
128
|
+
const color_values = color ? [] : undefined;
|
|
129
|
+
const size_values = size ? [] : undefined;
|
|
130
|
+
for (let idx = 0; idx < axes[0].length; idx++) {
|
|
131
|
+
if (axes.some((arr) => !isFinite(arr[idx])))
|
|
132
|
+
continue;
|
|
133
|
+
for (let dim = 0; dim < axes.length; dim++)
|
|
134
|
+
out[dim].push(axes[dim][idx]);
|
|
135
|
+
if (color && color_values)
|
|
136
|
+
color_values.push(color[idx]);
|
|
137
|
+
if (size && size_values)
|
|
138
|
+
size_values.push(size[idx]);
|
|
139
|
+
}
|
|
140
|
+
return { axes: out, color_values, size_values };
|
|
141
|
+
}
|
|
142
|
+
export function build_scatter_series(columns, mapping) {
|
|
143
|
+
const x_col = get_col(columns, mapping.x);
|
|
144
|
+
const y_col = get_col(columns, mapping.y);
|
|
145
|
+
if (!x_col || !y_col)
|
|
146
|
+
return { x: [], y: [] };
|
|
147
|
+
const { axes: [x, y], color_values, size_values, } = filter_finite([to_numbers(x_col.values), to_numbers(y_col.values)], optional_numbers(get_col(columns, mapping.color)), optional_numbers(get_col(columns, mapping.size)));
|
|
148
|
+
return {
|
|
149
|
+
x,
|
|
150
|
+
y,
|
|
151
|
+
markers: `points`,
|
|
152
|
+
color_values,
|
|
153
|
+
size_values,
|
|
154
|
+
point_style: { radius: 4, fill: `#4c6ef5`, stroke: `white`, stroke_width: 1 },
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function build_scatter3d_series(columns, mapping) {
|
|
158
|
+
const x_col = get_col(columns, mapping.x);
|
|
159
|
+
const y_col = get_col(columns, mapping.y);
|
|
160
|
+
const z_col = get_col(columns, mapping.z);
|
|
161
|
+
if (!x_col || !y_col || !z_col)
|
|
162
|
+
return { x: [], y: [], z: [] };
|
|
163
|
+
const { axes: [x, y, z], color_values, size_values, } = filter_finite([to_numbers(x_col.values), to_numbers(y_col.values), to_numbers(z_col.values)], optional_numbers(get_col(columns, mapping.color)), optional_numbers(get_col(columns, mapping.size)));
|
|
164
|
+
return { x, y, z, markers: `points`, color_values, size_values };
|
|
165
|
+
}
|
|
166
|
+
export function build_bar_series(columns, mapping) {
|
|
167
|
+
const x_col = get_col(columns, mapping.x);
|
|
168
|
+
const y_col = get_col(columns, mapping.y);
|
|
169
|
+
if (!x_col || !y_col)
|
|
170
|
+
return { x: [], y: [] };
|
|
171
|
+
const raw_y = to_numbers(y_col.values);
|
|
172
|
+
const x = [];
|
|
173
|
+
const y = [];
|
|
174
|
+
for (let idx = 0; idx < raw_y.length; idx++) {
|
|
175
|
+
if (!isFinite(raw_y[idx]))
|
|
176
|
+
continue;
|
|
177
|
+
x.push(to_label(x_col.values[idx]));
|
|
178
|
+
y.push(raw_y[idx]);
|
|
179
|
+
}
|
|
180
|
+
return { x, y, color: `#4c6ef5` };
|
|
181
|
+
}
|
|
182
|
+
export function build_histogram_series(columns, mapping) {
|
|
183
|
+
const col = get_col(columns, mapping.x ?? mapping.y);
|
|
184
|
+
if (!col)
|
|
185
|
+
return { x: [], y: [] };
|
|
186
|
+
const values = to_numbers(col.values).filter(isFinite);
|
|
187
|
+
return {
|
|
188
|
+
x: values.map((_, idx) => idx),
|
|
189
|
+
y: values,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type ViewType = `trajectory` | `structure` | `fermi_surface` | `isosurface` | `convex_hull` | `phase_diagram` | `json_browser` | `vaspout_electronic`;
|
|
2
|
+
export declare const FERMI_FILE_RE: RegExp;
|
|
3
|
+
export declare const VOLUMETRIC_EXT_RE: RegExp;
|
|
4
|
+
export declare const VOLUMETRIC_VASP_RE: RegExp;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Shared file-viewer types and filename patterns.
|
|
2
|
+
// Filename patterns for specialized file types (shared between extension host and webview)
|
|
3
|
+
export const FERMI_FILE_RE = /\.(?:bxsf|frmsf)$/i;
|
|
4
|
+
export const VOLUMETRIC_EXT_RE = /\.cube$/i;
|
|
5
|
+
export const VOLUMETRIC_VASP_RE = /(?:^|[\\/_.-])(?:chgcar|aeccar[012]?|elfcar|locpot|parchg)(?:[\\/_.-]|$)/i;
|