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
|
@@ -3,17 +3,15 @@ import { is_elem_symbol } from '../element';
|
|
|
3
3
|
import { ELEMENT_ELECTRONEGATIVITY_MAP, parse_composition } from './parse';
|
|
4
4
|
// Extract composition from structure object
|
|
5
5
|
const structure_to_composition = (structure) => {
|
|
6
|
-
if (!
|
|
7
|
-
throw new
|
|
6
|
+
if (!Array.isArray(structure.sites)) {
|
|
7
|
+
throw new TypeError(`Invalid structure object`);
|
|
8
8
|
}
|
|
9
9
|
const composition = {};
|
|
10
10
|
for (const site of structure.sites) {
|
|
11
|
-
if (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
composition[element] = (composition[element] ?? 0) + occu;
|
|
16
|
-
}
|
|
11
|
+
if (!Array.isArray(site.species))
|
|
12
|
+
continue;
|
|
13
|
+
for (const species of site.species) {
|
|
14
|
+
composition[species.element] = (composition[species.element] ?? 0) + (species.occu ?? 1);
|
|
17
15
|
}
|
|
18
16
|
}
|
|
19
17
|
return composition;
|
|
@@ -86,7 +84,7 @@ export const get_electro_neg_formula = (input, plain_text = false, delim = ` `,
|
|
|
86
84
|
export function get_formula_label_segments(formula) {
|
|
87
85
|
const segments = [];
|
|
88
86
|
let cursor = 0;
|
|
89
|
-
for (const match of formula.matchAll(/([A-Za-z])(
|
|
87
|
+
for (const match of formula.matchAll(/(?<letter>[A-Za-z])(?<amount>\d+(?:\.\d+)?)/g)) {
|
|
90
88
|
const match_idx = match.index ?? 0;
|
|
91
89
|
const prefix = match[1];
|
|
92
90
|
const amount = match[2];
|
|
@@ -18,4 +18,6 @@ export type ChartSegmentData = {
|
|
|
18
18
|
font_scale: number;
|
|
19
19
|
text_color: string;
|
|
20
20
|
};
|
|
21
|
+
export declare const chart_segment_suffix: (amount: number | undefined, fraction: number, show_amounts: boolean, show_percentages: boolean) => string;
|
|
22
|
+
export declare const chart_segment_label: (element: string, amount: number | undefined, fraction: number, show_amounts: boolean, show_percentages: boolean) => string;
|
|
21
23
|
export declare function get_chart_font_scale(base_scale: number, label_text: string, available_space: number, min_scale_factor?: number, base_font_size?: number): number;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { format_num } from '../labels';
|
|
1
2
|
export { default as BarChart } from './BarChart.svelte';
|
|
2
3
|
export { default as BubbleChart } from './BubbleChart.svelte';
|
|
3
4
|
export * from './chem-sys';
|
|
@@ -7,6 +8,19 @@ export { default as Formula } from './Formula.svelte';
|
|
|
7
8
|
export { default as FormulaFilter } from './FormulaFilter.svelte';
|
|
8
9
|
export * from './parse';
|
|
9
10
|
export { default as PieChart } from './PieChart.svelte';
|
|
11
|
+
// Amount/percentage suffix rendered after the element symbol in bar/pie chart
|
|
12
|
+
// segments; `=` separates amount from percentage when both are shown (Fe2=20%).
|
|
13
|
+
// format_num (not toString) so float noise like 0.30000000000000004 can't leak
|
|
14
|
+
// into labels; same format convention as format_composition_formula subscripts
|
|
15
|
+
// (`.3~s`, avoiding SI prefixes for sub-1 amounts where `s` renders 0.5 as 500m)
|
|
16
|
+
export const chart_segment_suffix = (amount, fraction, show_amounts, show_percentages) => (show_amounts && amount !== undefined
|
|
17
|
+
? format_num(amount, Math.abs(amount) < 1 ? `.3~g` : `.3~s`)
|
|
18
|
+
: ``) +
|
|
19
|
+
(show_amounts && show_percentages ? `=` : ``) +
|
|
20
|
+
(show_percentages ? format_num(fraction, `.1~%`) : ``);
|
|
21
|
+
// Full segment label used to estimate label width for font scaling; must match
|
|
22
|
+
// the text the charts actually render (element symbol + chart_segment_suffix)
|
|
23
|
+
export const chart_segment_label = (element, amount, fraction, show_amounts, show_percentages) => element + chart_segment_suffix(amount, fraction, show_amounts, show_percentages);
|
|
10
24
|
export function get_chart_font_scale(base_scale, label_text, available_space, min_scale_factor = 0.7, base_font_size = 16) {
|
|
11
25
|
const text_width = label_text.length * 0.6 * base_font_size * base_scale;
|
|
12
26
|
return available_space > 0 && text_width > available_space
|
|
@@ -2,8 +2,8 @@ import type { ElementSymbol } from '../element';
|
|
|
2
2
|
import type { CompositionType } from './';
|
|
3
3
|
export declare const ATOMIC_NUMBER_TO_SYMBOL: Record<number, ElementSymbol>;
|
|
4
4
|
export declare const SYMBOL_TO_ATOMIC_NUMBER: Partial<CompositionType>;
|
|
5
|
-
export declare const ATOMIC_WEIGHTS: Map<"
|
|
6
|
-
export declare const ELEMENT_ELECTRONEGATIVITY_MAP: Map<"
|
|
5
|
+
export declare const ATOMIC_WEIGHTS: Map<"Ac" | "Ag" | "Al" | "Am" | "Ar" | "As" | "At" | "Au" | "B" | "Ba" | "Be" | "Bh" | "Bi" | "Bk" | "Br" | "C" | "Ca" | "Cd" | "Ce" | "Cf" | "Cl" | "Cm" | "Co" | "Cr" | "Cs" | "Cu" | "Db" | "Dy" | "Er" | "Es" | "Eu" | "F" | "Fe" | "Fm" | "Fr" | "Ga" | "Gd" | "Ge" | "H" | "He" | "Hf" | "Hg" | "Ho" | "Hs" | "I" | "In" | "Ir" | "K" | "Kr" | "La" | "Li" | "Lr" | "Lu" | "Md" | "Mg" | "Mn" | "Mo" | "Mt" | "N" | "Na" | "Nb" | "Nd" | "Ne" | "Ni" | "No" | "Np" | "O" | "Os" | "P" | "Pa" | "Pb" | "Pd" | "Pm" | "Po" | "Pr" | "Pt" | "Pu" | "Ra" | "Rb" | "Re" | "Rf" | "Rh" | "Rn" | "Ru" | "S" | "Sb" | "Sc" | "Se" | "Sg" | "Si" | "Sm" | "Sn" | "Sr" | "Ta" | "Tb" | "Tc" | "Te" | "Th" | "Ti" | "Tl" | "Tm" | "U" | "V" | "W" | "Xe" | "Y" | "Yb" | "Zn" | "Zr" | "Ds" | "Rg" | "Cn" | "Nh" | "Fl" | "Mc" | "Lv" | "Ts" | "Og", number>;
|
|
6
|
+
export declare const ELEMENT_ELECTRONEGATIVITY_MAP: Map<"Ac" | "Ag" | "Al" | "Am" | "Ar" | "As" | "At" | "Au" | "B" | "Ba" | "Be" | "Bh" | "Bi" | "Bk" | "Br" | "C" | "Ca" | "Cd" | "Ce" | "Cf" | "Cl" | "Cm" | "Co" | "Cr" | "Cs" | "Cu" | "Db" | "Dy" | "Er" | "Es" | "Eu" | "F" | "Fe" | "Fm" | "Fr" | "Ga" | "Gd" | "Ge" | "H" | "He" | "Hf" | "Hg" | "Ho" | "Hs" | "I" | "In" | "Ir" | "K" | "Kr" | "La" | "Li" | "Lr" | "Lu" | "Md" | "Mg" | "Mn" | "Mo" | "Mt" | "N" | "Na" | "Nb" | "Nd" | "Ne" | "Ni" | "No" | "Np" | "O" | "Os" | "P" | "Pa" | "Pb" | "Pd" | "Pm" | "Po" | "Pr" | "Pt" | "Pu" | "Ra" | "Rb" | "Re" | "Rf" | "Rh" | "Rn" | "Ru" | "S" | "Sb" | "Sc" | "Se" | "Sg" | "Si" | "Sm" | "Sn" | "Sr" | "Ta" | "Tb" | "Tc" | "Te" | "Th" | "Ti" | "Tl" | "Tm" | "U" | "V" | "W" | "Xe" | "Y" | "Yb" | "Zn" | "Zr" | "Ds" | "Rg" | "Cn" | "Nh" | "Fl" | "Mc" | "Lv" | "Ts" | "Og", number>;
|
|
7
7
|
export declare const ELEM_NAME_TO_SYMBOL: Record<string, ElementSymbol>;
|
|
8
8
|
export declare const ELEM_SYMBOL_TO_NAME: Partial<Record<ElementSymbol, string>>;
|
|
9
9
|
export declare const atomic_num_to_symbols: (atomic_composition: Record<number, number>) => CompositionType;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { element_data
|
|
1
|
+
import { default as element_data } from '../element/data';
|
|
2
|
+
import { is_elem_symbol } from '../element/helpers';
|
|
2
3
|
import { ELEM_SYMBOLS } from '../labels';
|
|
3
4
|
// Create symbol/number/mass/electronegativity lookup maps for O(1) access
|
|
4
5
|
export const ATOMIC_NUMBER_TO_SYMBOL = {};
|
|
@@ -24,7 +25,7 @@ const is_atomic_number_composition = (obj) => {
|
|
|
24
25
|
atomic_nums.every((atomic_num) => Number.isInteger(atomic_num) && Object.hasOwn(ATOMIC_NUMBER_TO_SYMBOL, atomic_num)));
|
|
25
26
|
};
|
|
26
27
|
const format_state = (state) => (state > 0 ? `+` : ``) + state;
|
|
27
|
-
const parse_count = (count) => (count ?
|
|
28
|
+
const parse_count = (count) => (count ? Number(count) : 1);
|
|
28
29
|
const format_count = (count) => {
|
|
29
30
|
if (!Number.isFinite(count))
|
|
30
31
|
return `${count}`;
|
|
@@ -49,9 +50,7 @@ export const atomic_num_to_symbols = (atomic_composition) => {
|
|
|
49
50
|
export const atomic_symbol_to_num = (symbol_composition) => {
|
|
50
51
|
const atomic_composition = {};
|
|
51
52
|
for (const [symbol, amount] of Object.entries(symbol_composition)) {
|
|
52
|
-
|
|
53
|
-
throw new Error(`Invalid element symbol: ${symbol}`);
|
|
54
|
-
const atomic_num = SYMBOL_TO_ATOMIC_NUMBER[symbol];
|
|
53
|
+
const atomic_num = is_elem_symbol(symbol) ? SYMBOL_TO_ATOMIC_NUMBER[symbol] : undefined;
|
|
55
54
|
if (!atomic_num)
|
|
56
55
|
throw new Error(`Invalid element symbol: ${symbol}`);
|
|
57
56
|
if (amount > 0) {
|
|
@@ -63,9 +62,9 @@ export const atomic_symbol_to_num = (symbol_composition) => {
|
|
|
63
62
|
// Expand parentheses in chemical formulas
|
|
64
63
|
const expand_parentheses = (formula) => {
|
|
65
64
|
while (formula.includes(`(`)) {
|
|
66
|
-
const expanded = formula.replaceAll(/\(([^()]+)\)(
|
|
65
|
+
const expanded = formula.replaceAll(/\((?<group>[^()]+)\)(?<multiplier>\d+(?:\.\d+)?|\.\d+)?/g, (_match, group, multiplier) => {
|
|
67
66
|
const mult = parse_count(multiplier);
|
|
68
|
-
return group.replaceAll(/([A-Z][a-z]?)(
|
|
67
|
+
return group.replaceAll(/(?<element>[A-Z][a-z]?)(?<count>\d+(?:\.\d+)?|\.\d+)?/g, (_m, element, count) => {
|
|
69
68
|
const count_str = format_count(parse_count(count) * mult);
|
|
70
69
|
return element + (count_str === `1` ? `` : count_str);
|
|
71
70
|
});
|
|
@@ -87,9 +86,9 @@ export const parse_formula = (formula) => {
|
|
|
87
86
|
for (const [seg_idx, segment] of segments.entries()) {
|
|
88
87
|
// only hydrate segments (after a separator) carry a leading multiplier
|
|
89
88
|
const coeff = seg_idx > 0 ? /^(?:\d+(?:\.\d+)?|\.\d+)/.exec(segment)?.[0] : undefined;
|
|
90
|
-
const multiplier = coeff ?
|
|
89
|
+
const multiplier = coeff ? Number(coeff) : 1;
|
|
91
90
|
const expanded = expand_parentheses(segment.slice(coeff?.length ?? 0));
|
|
92
|
-
for (const match of expanded.matchAll(/([A-Z][a-z]?)(
|
|
91
|
+
for (const match of expanded.matchAll(/(?<element>[A-Z][a-z]?)(?<count>\d+(?:\.\d+)?|\.\d+)?/g)) {
|
|
93
92
|
const [, element, count] = match;
|
|
94
93
|
if (!is_elem_symbol(element))
|
|
95
94
|
throw new Error(`Invalid element symbol: ${element}`);
|
|
@@ -137,9 +136,7 @@ export const fractional_composition = (composition, by_weight = false) => {
|
|
|
137
136
|
const filtered = Object.fromEntries(Object.entries(composition).filter(([, amount]) => amount > 0));
|
|
138
137
|
if (by_weight) {
|
|
139
138
|
const element_weights = Object.fromEntries(Object.entries(filtered).map(([element, amount]) => {
|
|
140
|
-
|
|
141
|
-
throw new Error(`Unknown element: ${element}`);
|
|
142
|
-
const atomic_mass = ATOMIC_WEIGHTS.get(element);
|
|
139
|
+
const atomic_mass = is_elem_symbol(element) ? ATOMIC_WEIGHTS.get(element) : undefined;
|
|
143
140
|
if (!atomic_mass)
|
|
144
141
|
throw new Error(`Unknown element: ${element}`);
|
|
145
142
|
return [element, amount * atomic_mass];
|
|
@@ -206,12 +203,12 @@ const parse_oxidation_state = (oxidation_str) => {
|
|
|
206
203
|
return oxidation_str === `+` ? 1 : -1;
|
|
207
204
|
}
|
|
208
205
|
// Handle formats like "2+", "+2", "2-", "-2"
|
|
209
|
-
const ox_match = /([+-]?)(
|
|
206
|
+
const ox_match = /(?<sign_before>[+-]?)(?<number>\d+)(?<sign_after>[+-]?)/.exec(oxidation_str);
|
|
210
207
|
if (!ox_match)
|
|
211
208
|
return 0;
|
|
212
209
|
const [, sign_before, number, sign_after] = ox_match;
|
|
213
210
|
const sign = sign_before || sign_after || `+`;
|
|
214
|
-
return sign === `-` ? -
|
|
211
|
+
return sign === `-` ? -Number(number) : Number(number);
|
|
215
212
|
};
|
|
216
213
|
// Parse chemical formula string with oxidation states into structured data.
|
|
217
214
|
// Supports both ^2+ and [2+] syntax for oxidation states.
|
|
@@ -221,46 +218,30 @@ const parse_oxidation_state = (oxidation_str) => {
|
|
|
221
218
|
export const parse_formula_with_oxidation = (formula, strict = false) => {
|
|
222
219
|
const elements = [];
|
|
223
220
|
const cleaned_formula = expand_parentheses(formula.replaceAll(/\s/g, ``));
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
const regex = /([A-Z][a-z]?)(?:(?:\^([+-]?\d+[+-]?|[+-])|\[([+-]?\d+[+-]?|[+-])\])((?:\d+(?:\.\d+)?|\.\d+)?)|((?:\d+(?:\.\d+)?|\.\d+))(?:\^([+-]?\d+[+-]?|[+-])|\[([+-]?\d+[+-]?|[+-])\])?)?/g;
|
|
233
|
-
let match;
|
|
234
|
-
let orig_idx = 0;
|
|
235
|
-
while ((match = regex.exec(cleaned_formula)) !== null) {
|
|
236
|
-
const element = match[1];
|
|
237
|
-
// Oxidation can be in groups 2/3 (oxidation first) or 6/7 (count first)
|
|
238
|
-
// Count can be in group 4 (after oxidation) or 5 (before oxidation)
|
|
239
|
-
const oxidation_str = match[2] || match[3] || match[6] || match[7];
|
|
240
|
-
const count_str = match[4] || match[5];
|
|
241
|
-
const count = parse_count(count_str);
|
|
221
|
+
// Element symbol followed by optional oxidation state (^2+ or [2+] syntax) and
|
|
222
|
+
// optional count, in either order: Fe^2+O3, Fe[2+]O3, Fe3^2+, Fe2
|
|
223
|
+
const regex = /(?<element>[A-Z][a-z]?)(?:(?:\^(?<oxi_caret>[+-]?\d+[+-]?|[+-])|\[(?<oxi_bracket>[+-]?\d+[+-]?|[+-])\])(?<count_after>(?:\d+(?:\.\d+)?|\.\d+)?)|(?<count_before>(?:\d+(?:\.\d+)?|\.\d+))(?:\^(?<oxi_caret_2>[+-]?\d+[+-]?|[+-])|\[(?<oxi_bracket_2>[+-]?\d+[+-]?|[+-])\])?)?/g;
|
|
224
|
+
for (const match of cleaned_formula.matchAll(regex)) {
|
|
225
|
+
const groups = match.groups ?? {};
|
|
226
|
+
const element = groups.element;
|
|
227
|
+
const oxidation_str = groups.oxi_caret || groups.oxi_bracket || groups.oxi_caret_2 || groups.oxi_bracket_2;
|
|
228
|
+
const count = parse_count(groups.count_after || groups.count_before);
|
|
242
229
|
if (!is_elem_symbol(element))
|
|
243
230
|
throw new Error(`Invalid element symbol: ${element}`);
|
|
244
231
|
const oxidation_state = oxidation_str ? parse_oxidation_state(oxidation_str) : undefined;
|
|
245
|
-
// Find or add element entry
|
|
246
232
|
const existing = elements.find((el) => el.element === element);
|
|
247
|
-
if (existing) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
if (oxidation_state === undefined) {
|
|
251
|
-
// No oxidation state in current match, nothing to do
|
|
252
|
-
}
|
|
253
|
-
else if (existing.oxidation_state === undefined) {
|
|
254
|
-
// Set oxidation state on first occurrence
|
|
255
|
-
existing.oxidation_state = oxidation_state;
|
|
256
|
-
}
|
|
257
|
-
else if (strict && existing.oxidation_state !== oxidation_state) {
|
|
258
|
-
// In strict mode, throw on conflicting oxidation states
|
|
259
|
-
throw new Error(`Conflicting oxidation states for ${element}: ${format_state(existing.oxidation_state)} and ${format_state(oxidation_state)}`);
|
|
260
|
-
}
|
|
233
|
+
if (!existing) {
|
|
234
|
+
elements.push({ element, amount: count, oxidation_state, orig_idx: elements.length });
|
|
235
|
+
continue;
|
|
261
236
|
}
|
|
262
|
-
|
|
263
|
-
|
|
237
|
+
existing.amount += count;
|
|
238
|
+
if (oxidation_state === undefined)
|
|
239
|
+
continue;
|
|
240
|
+
if (existing.oxidation_state === undefined) {
|
|
241
|
+
existing.oxidation_state = oxidation_state; // Set on first occurrence
|
|
242
|
+
}
|
|
243
|
+
else if (strict && existing.oxidation_state !== oxidation_state) {
|
|
244
|
+
throw new Error(`Conflicting oxidation states for ${element}: ${format_state(existing.oxidation_state)} and ${format_state(oxidation_state)}`);
|
|
264
245
|
}
|
|
265
246
|
}
|
|
266
247
|
return elements;
|
|
@@ -297,20 +278,12 @@ export function generate_chem_sys_subspaces(input) {
|
|
|
297
278
|
let elements;
|
|
298
279
|
if (typeof input === `string`)
|
|
299
280
|
elements = extract_formula_elements(input);
|
|
300
|
-
else if (Array.isArray(input)) {
|
|
301
|
-
const uniq = [...new Set(input)];
|
|
302
|
-
for (const elem of uniq) {
|
|
303
|
-
if (!is_elem_symbol(elem))
|
|
304
|
-
throw new Error(`Invalid element symbol: ${elem}`);
|
|
305
|
-
}
|
|
306
|
-
elements = uniq;
|
|
307
|
-
}
|
|
308
281
|
else {
|
|
309
|
-
|
|
310
|
-
|
|
282
|
+
const symbols = Array.isArray(input) ? input : Object.keys(input);
|
|
283
|
+
elements = [...new Set(symbols)];
|
|
284
|
+
for (const elem of elements) {
|
|
311
285
|
if (!is_elem_symbol(elem))
|
|
312
286
|
throw new Error(`Invalid element symbol: ${elem}`);
|
|
313
|
-
elements.push(elem);
|
|
314
287
|
}
|
|
315
288
|
}
|
|
316
289
|
const sorted = [...elements].sort();
|
|
@@ -342,7 +315,7 @@ export const has_wildcards = (input) => input.includes(`*`);
|
|
|
342
315
|
// Throws if any non-wildcard token is not a valid element symbol.
|
|
343
316
|
export function parse_chemsys_with_wildcards(input) {
|
|
344
317
|
const tokens = input
|
|
345
|
-
.replaceAll(
|
|
318
|
+
.replaceAll(`-`, `,`)
|
|
346
319
|
.split(`,`)
|
|
347
320
|
.map((tok) => tok.trim())
|
|
348
321
|
.filter(Boolean);
|
|
@@ -377,32 +350,21 @@ export const ELEM_WILDCARD = {
|
|
|
377
350
|
// "**O4" -> *(1), *(1), O(4) - matches ternary oxides with 1:1:4 ratio
|
|
378
351
|
export function parse_formula_with_wildcards(formula) {
|
|
379
352
|
const tokens = [];
|
|
380
|
-
//
|
|
353
|
+
// Swap * for a placeholder so parentheses expansion treats it as a pseudo-element
|
|
381
354
|
let cleaned = formula.replaceAll(/\s/g, ``);
|
|
382
|
-
// Protect wildcards from parentheses expansion by replacing * with placeholder
|
|
383
355
|
cleaned = cleaned.replace(ELEM_WILDCARD.to_placeholder, ELEM_WILDCARD.placeholder);
|
|
384
356
|
cleaned = expand_parentheses(cleaned);
|
|
385
|
-
// Restore wildcards
|
|
386
357
|
cleaned = cleaned.replace(ELEM_WILDCARD.from_placeholder, `*`);
|
|
387
|
-
//
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
if (
|
|
394
|
-
|
|
395
|
-
const count = parse_count(match[4]);
|
|
396
|
-
tokens.push({ element: null, count });
|
|
397
|
-
}
|
|
398
|
-
else if (match[1]) {
|
|
399
|
-
// Element symbol match
|
|
400
|
-
const element = match[1];
|
|
401
|
-
const count = parse_count(match[2]);
|
|
402
|
-
if (!is_elem_symbol(element)) {
|
|
358
|
+
// Match element symbol or wildcard, each with optional decimal count
|
|
359
|
+
const regex = /(?<element>[A-Z][a-z]?)(?<count>(?:\d+(?:\.\d+)?|\.\d+)?)|(?<wildcard>\*)(?<wildcard_count>(?:\d+(?:\.\d+)?|\.\d+)?)/g;
|
|
360
|
+
for (const match of cleaned.matchAll(regex)) {
|
|
361
|
+
const { element, count, wildcard, wildcard_count } = match.groups ?? {};
|
|
362
|
+
if (wildcard)
|
|
363
|
+
tokens.push({ element: null, count: parse_count(wildcard_count) });
|
|
364
|
+
else if (element) {
|
|
365
|
+
if (!is_elem_symbol(element))
|
|
403
366
|
throw new Error(`Invalid element symbol: ${element}`);
|
|
404
|
-
}
|
|
405
|
-
tokens.push({ element, count });
|
|
367
|
+
tokens.push({ element, count: parse_count(count) });
|
|
406
368
|
}
|
|
407
369
|
}
|
|
408
370
|
return tokens;
|
|
@@ -435,48 +397,32 @@ export function matches_chemsys_wildcard(formula, explicit_elements, wildcard_co
|
|
|
435
397
|
export function matches_formula_wildcard(formula, pattern) {
|
|
436
398
|
try {
|
|
437
399
|
const composition = parse_formula(formula);
|
|
438
|
-
//
|
|
439
|
-
|
|
400
|
+
// Split pattern into merged explicit element counts (e.g. "LiLi" -> Li: 2)
|
|
401
|
+
// and wildcard counts
|
|
402
|
+
const explicit_counts = new Map();
|
|
440
403
|
const wildcard_counts = [];
|
|
441
404
|
for (const token of pattern) {
|
|
442
|
-
if (token.element === null)
|
|
405
|
+
if (token.element === null)
|
|
443
406
|
wildcard_counts.push(token.count);
|
|
444
|
-
}
|
|
445
407
|
else {
|
|
446
|
-
|
|
447
|
-
const existing = explicit_requirements.find((req) => req.element === token.element);
|
|
448
|
-
if (existing) {
|
|
449
|
-
existing.count += token.count;
|
|
450
|
-
}
|
|
451
|
-
else {
|
|
452
|
-
explicit_requirements.push({ element: token.element, count: token.count });
|
|
453
|
-
}
|
|
408
|
+
explicit_counts.set(token.element, (explicit_counts.get(token.element) ?? 0) + token.count);
|
|
454
409
|
}
|
|
455
410
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
for (const req of explicit_requirements) {
|
|
459
|
-
if (composition[req.element] !== req.count)
|
|
411
|
+
for (const [element, count] of explicit_counts) {
|
|
412
|
+
if (composition[element] !== count)
|
|
460
413
|
return false;
|
|
461
|
-
used_elements.add(req.element);
|
|
462
414
|
}
|
|
463
|
-
//
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
415
|
+
// Remaining elements are wildcard candidates. Each wildcard needs a distinct
|
|
416
|
+
// element with exactly its count, so sorting both count lists reduces the
|
|
417
|
+
// matching to a positional comparison
|
|
418
|
+
const remaining_counts = Object.entries(composition)
|
|
419
|
+
.filter(([elem]) => !explicit_counts.has(elem))
|
|
420
|
+
.map(([, count]) => count)
|
|
421
|
+
.sort((cnt_a, cnt_b) => cnt_a - cnt_b);
|
|
422
|
+
if (remaining_counts.length !== wildcard_counts.length)
|
|
469
423
|
return false;
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
const sorted_remaining = [...remaining_elements].sort((a, b) => a.count - b.count);
|
|
473
|
-
const sorted_wildcards = [...wildcard_counts].sort((a, b) => a - b);
|
|
474
|
-
// Check if counts match (simple comparison works because we need exact matches)
|
|
475
|
-
for (let idx = 0; idx < sorted_wildcards.length; idx++) {
|
|
476
|
-
if (sorted_remaining[idx].count !== sorted_wildcards[idx])
|
|
477
|
-
return false;
|
|
478
|
-
}
|
|
479
|
-
return true;
|
|
424
|
+
wildcard_counts.sort((cnt_a, cnt_b) => cnt_a - cnt_b);
|
|
425
|
+
return wildcard_counts.every((count, idx) => remaining_counts[idx] === count);
|
|
480
426
|
}
|
|
481
427
|
catch {
|
|
482
428
|
return false;
|
package/dist/constants.d.ts
CHANGED
|
@@ -13,7 +13,6 @@ export declare const STRUCT_KEYWORDS_STRICT: readonly string[];
|
|
|
13
13
|
export declare const TRAJ_KEYWORDS_REGEX: RegExp;
|
|
14
14
|
export declare const STRUCT_KEYWORDS_REGEX: RegExp;
|
|
15
15
|
export declare const STRUCT_KEYWORDS_STRICT_REGEX: RegExp;
|
|
16
|
-
export declare const TRAJ_KEYWORDS_SIMPLE_REGEX: RegExp;
|
|
17
16
|
export declare const TRAJ_EXTENSIONS: readonly string[];
|
|
18
17
|
export declare const TRAJ_EXTENSIONS_REGEX: RegExp;
|
|
19
18
|
export declare const STRUCTURE_EXTENSIONS: readonly string[];
|
package/dist/constants.js
CHANGED
|
@@ -14,11 +14,13 @@ export const COMPRESSION_EXTENSIONS = Object.freeze(Object.values(COMPRESSION_FO
|
|
|
14
14
|
export const TRAJ_KEYWORDS = Object.freeze([
|
|
15
15
|
`trajectory`,
|
|
16
16
|
`traj`,
|
|
17
|
+
`relaxation`,
|
|
17
18
|
`relax`,
|
|
18
19
|
`npt`,
|
|
19
20
|
`nvt`,
|
|
20
21
|
`nve`,
|
|
21
22
|
`qha`,
|
|
23
|
+
`dpmd`, // DeePMD trajectory outputs (before `md` so the longer token wins)
|
|
22
24
|
`md`,
|
|
23
25
|
`dynamics`,
|
|
24
26
|
`simulation`,
|
|
@@ -41,29 +43,18 @@ export const STRUCT_KEYWORDS = Object.freeze([
|
|
|
41
43
|
`phonopy`,
|
|
42
44
|
]);
|
|
43
45
|
// More restrictive keywords for JSON/YAML files (excludes generic terms like "data")
|
|
44
|
-
export const STRUCT_KEYWORDS_STRICT = Object.freeze(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
`crystal`,
|
|
49
|
-
`material`,
|
|
50
|
-
`lattice`,
|
|
51
|
-
`geometry`,
|
|
52
|
-
`unit_cell`,
|
|
53
|
-
`unitcell`,
|
|
54
|
-
`atoms`,
|
|
55
|
-
`sites`,
|
|
56
|
-
`phono3py`,
|
|
57
|
-
`phonopy`,
|
|
58
|
-
]);
|
|
59
|
-
// Regex patterns for keyword matching
|
|
46
|
+
export const STRUCT_KEYWORDS_STRICT = Object.freeze(STRUCT_KEYWORDS.filter((keyword) => keyword !== `data`));
|
|
47
|
+
// Regex patterns for keyword matching. Keywords must be delimited on both sides
|
|
48
|
+
// (`md_300K`, `si_md.log`) so bare prefixes like `md/notes.log` or `mdp_run` do not
|
|
49
|
+
// match. `relaxation` is listed explicitly (not only via the `relax` prefix).
|
|
60
50
|
export const TRAJ_KEYWORDS_REGEX = new RegExp(`(^|[-_.])(${TRAJ_KEYWORDS.join(`|`)})([-_.]|$)`, `i`);
|
|
61
51
|
export const STRUCT_KEYWORDS_REGEX = new RegExp(`(${STRUCT_KEYWORDS.join(`|`)})`, `i`);
|
|
62
52
|
export const STRUCT_KEYWORDS_STRICT_REGEX = new RegExp(`(${STRUCT_KEYWORDS_STRICT.join(`|`)})`, `i`);
|
|
63
|
-
|
|
53
|
+
// Build a case-insensitive `\.(ext1|ext2|...)$` regex from extensions (leading dots stripped)
|
|
54
|
+
const ext_regex = (exts) => new RegExp(`\\.(${exts.map((ext) => ext.slice(1)).join(`|`)})$`, `i`);
|
|
64
55
|
// File extensions for different file types
|
|
65
56
|
export const TRAJ_EXTENSIONS = Object.freeze([`.traj`, `.xtc`, `.lammpstrj`]);
|
|
66
|
-
export const TRAJ_EXTENSIONS_REGEX =
|
|
57
|
+
export const TRAJ_EXTENSIONS_REGEX = ext_regex(TRAJ_EXTENSIONS);
|
|
67
58
|
export const STRUCTURE_EXTENSIONS = Object.freeze([
|
|
68
59
|
`.cif`,
|
|
69
60
|
`.mcif`,
|
|
@@ -79,7 +70,7 @@ export const STRUCTURE_EXTENSIONS = Object.freeze([
|
|
|
79
70
|
`.sdf`,
|
|
80
71
|
`.mmcif`,
|
|
81
72
|
]);
|
|
82
|
-
export const STRUCTURE_EXTENSIONS_REGEX =
|
|
73
|
+
export const STRUCTURE_EXTENSIONS_REGEX = ext_regex(STRUCTURE_EXTENSIONS);
|
|
83
74
|
export const TRAJ_FALLBACK_EXTENSIONS = Object.freeze([
|
|
84
75
|
`.dat`,
|
|
85
76
|
`.data`,
|
|
@@ -87,13 +78,13 @@ export const TRAJ_FALLBACK_EXTENSIONS = Object.freeze([
|
|
|
87
78
|
`.out`,
|
|
88
79
|
`.json`,
|
|
89
80
|
]);
|
|
90
|
-
export const TRAJ_FALLBACK_EXTENSIONS_REGEX =
|
|
81
|
+
export const TRAJ_FALLBACK_EXTENSIONS_REGEX = ext_regex(TRAJ_FALLBACK_EXTENSIONS);
|
|
91
82
|
// Special regex patterns
|
|
92
|
-
export const VASP_FILES_REGEX = /(?:^|[\\/_.-])(poscar|contcar|potcar|incar|kpoints|outcar)(?:[\\/_.-]|$)/i;
|
|
93
|
-
export const VASP_VOLUMETRIC_REGEX = /(?:^|[\\/_.-])(chgcar|aeccar[012]?|elfcar|locpot|parchg)(?:[\\/_.-]|$)/i;
|
|
83
|
+
export const VASP_FILES_REGEX = /(?:^|[\\/_.-])(?:poscar|contcar|potcar|incar|kpoints|outcar)(?:[\\/_.-]|$)/i;
|
|
84
|
+
export const VASP_VOLUMETRIC_REGEX = /(?:^|[\\/_.-])(?:chgcar|aeccar[012]?|elfcar|locpot|parchg)(?:[\\/_.-]|$)/i;
|
|
94
85
|
export const XDATCAR_REGEX = /xdatcar/i;
|
|
95
|
-
export const CONFIG_DIRS_REGEX = /(?:^|[\\/])(
|
|
96
|
-
export const MD_SIM_EXCLUDE_REGEX = /md_simulation\.(out|txt|yml|py|csv|html|css|md|js|ts)$/i;
|
|
97
|
-
export const XYZ_EXTXYZ_REGEX = /\.(xyz|extxyz)$/i;
|
|
86
|
+
export const CONFIG_DIRS_REGEX = /(?:^|[\\/])(?:\.vscode|\.idea|\.nyc_output|\.cache|\.tmp|\.temp|node_modules|dist|build|coverage)(?:[\\/]|$)/i;
|
|
87
|
+
export const MD_SIM_EXCLUDE_REGEX = /md_simulation\.(?:out|txt|yml|py|csv|html|css|md|js|ts)$/i;
|
|
88
|
+
export const XYZ_EXTXYZ_REGEX = /\.(?:xyz|extxyz)$/i;
|
|
98
89
|
// Compression extensions regex (shared across files)
|
|
99
|
-
export const COMPRESSION_EXTENSIONS_REGEX =
|
|
90
|
+
export const COMPRESSION_EXTENSIONS_REGEX = ext_regex(COMPRESSION_EXTENSIONS);
|
|
@@ -12,10 +12,11 @@
|
|
|
12
12
|
// Union type combining all possible props from 2D, 3D, and 4D components
|
|
13
13
|
// each specific component will only use its relevant props from this super set
|
|
14
14
|
// (gas_config/gas_pressures already come from BaseConvexHullProps)
|
|
15
|
-
type ConvexHullProps = BaseConvexHullProps &
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
type ConvexHullProps = BaseConvexHullProps &
|
|
16
|
+
Hull3DProps & {
|
|
17
|
+
x_axis?: AxisConfig
|
|
18
|
+
y_axis?: AxisConfig
|
|
19
|
+
}
|
|
19
20
|
|
|
20
21
|
let {
|
|
21
22
|
entries = [],
|
|
@@ -26,9 +27,7 @@
|
|
|
26
27
|
show_unstable = $bindable(true),
|
|
27
28
|
hidden_categories = $bindable([]),
|
|
28
29
|
show_hull_faces = $bindable(true),
|
|
29
|
-
hull_face_opacity: hull_face_opacity_prop = $bindable(
|
|
30
|
-
undefined as number | undefined,
|
|
31
|
-
),
|
|
30
|
+
hull_face_opacity: hull_face_opacity_prop = $bindable(undefined as number | undefined),
|
|
32
31
|
color_mode = $bindable(`energy`),
|
|
33
32
|
color_scale = $bindable(`interpolateViridis`),
|
|
34
33
|
info_pane_open = $bindable(false),
|
|
@@ -88,8 +87,7 @@
|
|
|
88
87
|
// while each component declares only its dimension's props (2D lacks Hull3DProps, 3D/4D
|
|
89
88
|
// lack x/y_axis), so a constructor union wouldn't compile. Svelte ignores extra props.
|
|
90
89
|
const ConvexHullComponent = $derived(
|
|
91
|
-
{ 2: ConvexHull2D, 3: ConvexHull3D, 4: ConvexHull4D }[element_count] ??
|
|
92
|
-
null,
|
|
90
|
+
{ 2: ConvexHull2D, 3: ConvexHull3D, 4: ConvexHull4D }[element_count] ?? null,
|
|
93
91
|
) as Component<ConvexHullProps> | null
|
|
94
92
|
</script>
|
|
95
93
|
|
|
@@ -125,14 +123,13 @@
|
|
|
125
123
|
{:else}
|
|
126
124
|
<!-- Error state for unsupported dimensionalities -->
|
|
127
125
|
<div class="convex-hull-error">
|
|
128
|
-
<div
|
|
129
|
-
style="text-align: center; padding: 2em; color: var(--convex-hull-text-color, #666)"
|
|
130
|
-
>
|
|
126
|
+
<div style="text-align: center; padding: 2em; color: var(--convex-hull-text-color, #666)">
|
|
131
127
|
<h3 id="unsupported-chemical-system" style="margin: 0 0 1em 0">Unsupported Chemical System</h3>
|
|
132
128
|
<p style="margin: 0">
|
|
133
|
-
Convex hulls require 2, 3, or 4 elements. Found {element_count} element{
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
Convex hulls require 2, 3, or 4 elements. Found {element_count} element{element_count ===
|
|
130
|
+
1
|
|
131
|
+
? ``
|
|
132
|
+
: `s`}:
|
|
136
133
|
</p>
|
|
137
134
|
<p style="margin: 0.5em 0 0 0; font-weight: bold">
|
|
138
135
|
{elements.join(`, `)}
|
|
@@ -5,6 +5,6 @@ type ConvexHullProps = BaseConvexHullProps & Hull3DProps & {
|
|
|
5
5
|
x_axis?: AxisConfig;
|
|
6
6
|
y_axis?: AxisConfig;
|
|
7
7
|
};
|
|
8
|
-
declare const ConvexHull: Component<ConvexHullProps, {}, "display" | "
|
|
8
|
+
declare const ConvexHull: Component<ConvexHullProps, {}, "display" | "fullscreen" | "wrapper" | "controls_open" | "color_scale" | "info_pane_open" | "temperature" | "show_hull_faces" | "hull_face_opacity" | "color_mode" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "hidden_categories" | "energy_source_mode" | "stable_entries" | "unstable_entries" | "phase_stats" | "highlighted_entries" | "selected_entry" | "gas_pressures">;
|
|
9
9
|
type ConvexHull = ReturnType<typeof ConvexHull>;
|
|
10
10
|
export default ConvexHull;
|