matterviz 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EmptyState.svelte +10 -4
- package/dist/FilePicker.svelte +48 -60
- package/dist/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +2 -2
- package/dist/api/optimade.js +10 -7
- package/dist/app.css +68 -0
- package/dist/brillouin/BrillouinZone.svelte +90 -91
- package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
- package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
- package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
- package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
- package/dist/brillouin/compute.js +10 -16
- package/dist/brillouin/geometry.js +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
- package/dist/chempot-diagram/async-compute.svelte.js +13 -14
- package/dist/chempot-diagram/color.d.ts +21 -1
- package/dist/chempot-diagram/color.js +70 -1
- package/dist/chempot-diagram/compute.d.ts +7 -0
- package/dist/chempot-diagram/compute.js +85 -26
- package/dist/chempot-diagram/controls-state.svelte.js +1 -1
- package/dist/chempot-diagram/export.js +1 -6
- package/dist/chempot-diagram/temperature.js +9 -10
- package/dist/colors/index.d.ts +0 -4
- package/dist/colors/index.js +19 -20
- package/dist/composition/BarChart.svelte +30 -26
- package/dist/composition/BubbleChart.svelte +17 -17
- package/dist/composition/Composition.svelte +10 -19
- package/dist/composition/Formula.svelte +20 -27
- package/dist/composition/FormulaFilter.svelte +115 -184
- package/dist/composition/PieChart.svelte +55 -41
- package/dist/composition/format.js +7 -9
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +14 -0
- package/dist/composition/parse.d.ts +2 -2
- package/dist/composition/parse.js +61 -115
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +17 -26
- package/dist/convex-hull/ConvexHull.svelte +12 -15
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull2D.svelte +93 -94
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +127 -186
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +131 -180
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
- package/dist/convex-hull/ConvexHullControls.svelte +46 -48
- package/dist/convex-hull/ConvexHullStats.svelte +193 -195
- package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
- package/dist/convex-hull/GasPressureControls.svelte +5 -12
- package/dist/convex-hull/StructurePopup.svelte +18 -22
- package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
- package/dist/convex-hull/TemperatureSlider.svelte +4 -10
- package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
- package/dist/convex-hull/gas-thermodynamics.js +21 -53
- package/dist/convex-hull/helpers.d.ts +8 -10
- package/dist/convex-hull/helpers.js +37 -43
- package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
- package/dist/convex-hull/thermodynamics.js +37 -44
- package/dist/coordination/CoordinationBarPlot.svelte +49 -53
- package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
- package/dist/coordination/calc-coordination.d.ts +1 -1
- package/dist/coordination/calc-coordination.js +28 -25
- package/dist/element/BohrAtom.svelte +5 -9
- package/dist/element/ElementHeading.svelte +4 -1
- package/dist/element/ElementPhoto.svelte +11 -9
- package/dist/element/ElementStats.svelte +12 -10
- package/dist/element/ElementTile.svelte +44 -67
- package/dist/element/Nucleus.svelte +4 -2
- package/dist/element/data.d.ts +3 -2
- package/dist/element/data.js +5 -1
- package/dist/element/helpers.d.ts +4 -0
- package/dist/element/helpers.js +18 -0
- package/dist/element/index.d.ts +2 -5
- package/dist/element/index.js +4 -19
- package/dist/feedback/DragOverlay.svelte +5 -5
- package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
- package/dist/feedback/StatusMessage.svelte +7 -4
- package/dist/fermi-surface/FermiSlice.svelte +21 -18
- package/dist/fermi-surface/FermiSurface.svelte +35 -44
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
- package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
- package/dist/fermi-surface/compute.js +25 -58
- package/dist/fermi-surface/parse.js +54 -88
- package/dist/file-viewer/JsonBrowser.svelte +1043 -0
- package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
- package/dist/file-viewer/PlotPanel.svelte +350 -0
- package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
- package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
- package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
- package/dist/file-viewer/detect.d.ts +11 -0
- package/dist/file-viewer/detect.js +381 -0
- package/dist/file-viewer/eligibility.d.ts +4 -0
- package/dist/file-viewer/eligibility.js +53 -0
- package/dist/file-viewer/host-protocol.d.ts +50 -0
- package/dist/file-viewer/host-transfer.d.ts +25 -0
- package/dist/file-viewer/host-transfer.js +42 -0
- package/dist/file-viewer/index.d.ts +5 -0
- package/dist/file-viewer/index.js +5 -0
- package/dist/file-viewer/main.d.ts +44 -0
- package/dist/file-viewer/main.js +535 -0
- package/dist/file-viewer/parse.d.ts +9 -0
- package/dist/file-viewer/parse.js +170 -0
- package/dist/file-viewer/plot-utils.d.ts +24 -0
- package/dist/file-viewer/plot-utils.js +191 -0
- package/dist/file-viewer/types.d.ts +4 -0
- package/dist/file-viewer/types.js +5 -0
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
- package/dist/heatmap-matrix/index.d.ts +5 -0
- package/dist/icons.d.ts +4 -0
- package/dist/icons.js +4 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/io/ExportPane.svelte +11 -7
- package/dist/io/decompress.d.ts +4 -1
- package/dist/io/decompress.js +24 -36
- package/dist/io/export.d.ts +11 -4
- package/dist/io/export.js +75 -19
- package/dist/io/fetch.d.ts +0 -3
- package/dist/io/fetch.js +0 -11
- package/dist/io/file-drop.js +60 -35
- package/dist/io/index.d.ts +0 -1
- package/dist/io/index.js +2 -9
- package/dist/io/is-binary.d.ts +9 -0
- package/dist/io/is-binary.js +45 -1
- package/dist/io/url-drop.d.ts +2 -0
- package/dist/io/url-drop.js +40 -40
- package/dist/isosurface/Isosurface.svelte +700 -215
- package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
- package/dist/isosurface/IsosurfaceControls.svelte +590 -116
- package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
- package/dist/isosurface/VolumeSlice.svelte +224 -0
- package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
- package/dist/isosurface/coloring.d.ts +20 -0
- package/dist/isosurface/coloring.js +118 -0
- package/dist/isosurface/geometry-worker-types.d.ts +38 -0
- package/dist/isosurface/geometry.worker.d.ts +1 -0
- package/dist/isosurface/geometry.worker.js +59 -0
- package/dist/isosurface/grid.d.ts +10 -0
- package/dist/isosurface/grid.js +31 -0
- package/dist/isosurface/index.d.ts +4 -0
- package/dist/isosurface/index.js +4 -0
- package/dist/isosurface/parse-vaspwave.d.ts +3 -0
- package/dist/isosurface/parse-vaspwave.js +138 -0
- package/dist/isosurface/parse.js +6 -6
- package/dist/isosurface/profile.d.ts +12 -0
- package/dist/isosurface/profile.js +19 -0
- package/dist/isosurface/sampling.d.ts +34 -0
- package/dist/isosurface/sampling.js +408 -0
- package/dist/isosurface/slice-rendering.d.ts +13 -0
- package/dist/isosurface/slice-rendering.js +79 -0
- package/dist/isosurface/slice.d.ts +22 -2
- package/dist/isosurface/slice.js +200 -116
- package/dist/isosurface/types.d.ts +24 -1
- package/dist/isosurface/types.js +120 -8
- package/dist/json-path.d.ts +4 -0
- package/dist/json-path.js +89 -0
- package/dist/labels.d.ts +6 -2
- package/dist/labels.js +44 -14
- package/dist/layout/FullscreenButton.svelte +2 -1
- package/dist/layout/FullscreenToggle.svelte +10 -4
- package/dist/layout/InfoCard.svelte +8 -21
- package/dist/layout/InfoTag.svelte +1 -3
- package/dist/layout/NumberRangeInput.svelte +46 -0
- package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
- package/dist/layout/PropertyFilter.svelte +2 -6
- package/dist/layout/SettingsSection.svelte +57 -62
- package/dist/layout/SettingsSection.svelte.d.ts +6 -7
- package/dist/layout/SubpageGrid.svelte +3 -1
- package/dist/layout/ViewerChrome.svelte +16 -11
- package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
- package/dist/layout/fullscreen.js +3 -5
- package/dist/layout/fullscreen.svelte.js +1 -2
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.js +1 -0
- package/dist/layout/json-tree/JsonNode.svelte +22 -59
- package/dist/layout/json-tree/JsonTree.svelte +101 -172
- package/dist/layout/json-tree/JsonValue.svelte +9 -32
- package/dist/layout/json-tree/utils.d.ts +0 -3
- package/dist/layout/json-tree/utils.js +50 -188
- package/dist/marching-cubes.d.ts +8 -1
- package/dist/marching-cubes.js +115 -48
- package/dist/math.d.ts +5 -2
- package/dist/math.js +48 -38
- package/dist/overlays/ContextMenu.svelte +19 -34
- package/dist/overlays/CopyButton.svelte +11 -5
- package/dist/overlays/DragControlTab.svelte +6 -1
- package/dist/overlays/DraggablePane.svelte +110 -74
- package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
- package/dist/overlays/GlassChip.svelte +32 -0
- package/dist/overlays/GlassChip.svelte.d.ts +8 -0
- package/dist/overlays/InfoPaneCards.svelte +11 -23
- package/dist/overlays/index.d.ts +7 -0
- package/dist/overlays/index.js +26 -0
- package/dist/overlays/portal.d.ts +2 -0
- package/dist/overlays/portal.js +14 -0
- package/dist/periodic-table/PeriodicTable.svelte +113 -145
- package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
- package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
- package/dist/periodic-table/TableInset.svelte +9 -4
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
- package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
- package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
- package/dist/phase-diagram/build-diagram.js +4 -9
- package/dist/phase-diagram/diagram-input.d.ts +1 -2
- package/dist/phase-diagram/parse.js +15 -15
- package/dist/phase-diagram/svg-to-diagram.js +28 -27
- package/dist/phase-diagram/utils.js +2 -3
- package/dist/plot/bar/BarPlot.svelte +461 -426
- package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
- package/dist/plot/bar/BarPlotControls.svelte +1 -3
- package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
- package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
- package/dist/plot/bar/data.d.ts +5 -4
- package/dist/plot/bar/data.js +2 -1
- package/dist/plot/box/BoxPlot.svelte +322 -226
- package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
- package/dist/plot/box/Violin.svelte.d.ts +1 -0
- package/dist/plot/box/box-plot.js +1 -1
- package/dist/plot/core/auto-place.d.ts +1 -1
- package/dist/plot/core/auto-place.js +2 -2
- package/dist/plot/core/axis-utils.d.ts +12 -7
- package/dist/plot/core/axis-utils.js +48 -48
- package/dist/plot/core/components/AxisLabel.svelte +82 -20
- package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
- package/dist/plot/core/components/ColorBar.svelte +101 -106
- package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
- package/dist/plot/core/components/FillArea.svelte +10 -17
- package/dist/plot/core/components/HierarchyControls.svelte +249 -0
- package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
- package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
- package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
- package/dist/plot/core/components/Line.svelte +18 -9
- package/dist/plot/core/components/Line.svelte.d.ts +2 -0
- package/dist/plot/core/components/PlotAxis.svelte +40 -17
- package/dist/plot/core/components/PlotControls.svelte +65 -41
- package/dist/plot/core/components/PlotLegend.svelte +31 -35
- package/dist/plot/core/components/PlotMarginals.svelte +616 -0
- package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
- package/dist/plot/core/components/PlotTooltip.svelte +1 -1
- package/dist/plot/core/components/PortalSelect.svelte +4 -8
- package/dist/plot/core/components/ReferenceLine.svelte +27 -24
- package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
- package/dist/plot/core/components/ReferencePlane.svelte +7 -8
- package/dist/plot/core/components/ZeroLines.svelte +4 -8
- package/dist/plot/core/components/ZoomRect.svelte +1 -2
- package/dist/plot/core/components/index.d.ts +1 -0
- package/dist/plot/core/components/index.js +1 -0
- package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
- package/dist/plot/core/data-cleaning-signal.js +467 -0
- package/dist/plot/core/data-cleaning.d.ts +2 -42
- package/dist/plot/core/data-cleaning.js +27 -474
- package/dist/plot/core/data-transform.d.ts +1 -2
- package/dist/plot/core/data-transform.js +9 -15
- package/dist/plot/core/fill-utils.d.ts +3 -1
- package/dist/plot/core/fill-utils.js +28 -6
- package/dist/plot/core/index.d.ts +1 -0
- package/dist/plot/core/index.js +1 -0
- package/dist/plot/core/interactions.js +0 -2
- package/dist/plot/core/layout.d.ts +15 -6
- package/dist/plot/core/layout.js +57 -38
- package/dist/plot/core/marginals.d.ts +170 -0
- package/dist/plot/core/marginals.js +436 -0
- package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
- package/dist/plot/core/pan-zoom.svelte.js +34 -17
- package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
- package/dist/plot/core/placed-tween.svelte.js +68 -21
- package/dist/plot/core/reference-line.js +1 -1
- package/dist/plot/core/scales.d.ts +23 -0
- package/dist/plot/core/scales.js +39 -13
- package/dist/plot/core/svg.js +0 -1
- package/dist/plot/core/types/fills.d.ts +101 -0
- package/dist/plot/core/types/fills.js +15 -0
- package/dist/plot/core/types/plot-3d.d.ts +87 -0
- package/dist/plot/core/types/plot-3d.js +4 -0
- package/dist/plot/core/types/reference-lines.d.ts +140 -0
- package/dist/plot/core/types/reference-lines.js +9 -0
- package/dist/plot/core/types.d.ts +29 -324
- package/dist/plot/core/types.js +23 -20
- package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
- package/dist/plot/core/utils/hierarchy-chart.js +191 -0
- package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
- package/dist/plot/core/utils/hierarchy-labels.js +100 -0
- package/dist/plot/core/utils/label-placement.js +2 -2
- package/dist/plot/histogram/Histogram.svelte +314 -340
- package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
- package/dist/plot/histogram/HistogramControls.svelte +30 -28
- package/dist/plot/histogram/histogram.d.ts +31 -0
- package/dist/plot/histogram/histogram.js +70 -0
- package/dist/plot/histogram/index.d.ts +1 -0
- package/dist/plot/histogram/index.js +1 -0
- package/dist/plot/index.d.ts +1 -0
- package/dist/plot/index.js +1 -0
- package/dist/plot/sankey/Sankey.svelte +78 -69
- package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
- package/dist/plot/sankey/SankeyControls.svelte +22 -16
- package/dist/plot/sankey/sankey.js +13 -9
- package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
- package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
- package/dist/plot/scatter/ElementScatter.svelte +4 -1
- package/dist/plot/scatter/ScatterPlot.svelte +517 -410
- package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
- package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
- package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
- package/dist/plot/scatter/ScatterPoint.svelte +16 -9
- package/dist/plot/scatter/adaptive-density.d.ts +1 -1
- package/dist/plot/scatter/adaptive-density.js +36 -20
- package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
- package/dist/plot/scatter/binned-scatter-types.js +6 -1
- package/dist/plot/scatter/scatter-data.d.ts +1 -1
- package/dist/plot/scatter/scatter-data.js +8 -7
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
- package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
- package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
- package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
- package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
- package/dist/plot/sunburst/Sunburst.svelte +269 -347
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
- package/dist/plot/sunburst/index.d.ts +1 -1
- package/dist/plot/sunburst/index.js +2 -1
- package/dist/plot/sunburst/render.d.ts +2 -2
- package/dist/plot/sunburst/render.js +47 -22
- package/dist/plot/sunburst/sunburst.d.ts +5 -1
- package/dist/plot/sunburst/sunburst.js +10 -3
- package/dist/plot/treemap/Treemap.svelte +1022 -0
- package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
- package/dist/plot/treemap/index.d.ts +4 -0
- package/dist/plot/treemap/index.js +4 -0
- package/dist/plot/treemap/labels.d.ts +38 -0
- package/dist/plot/treemap/labels.js +80 -0
- package/dist/plot/treemap/treemap.d.ts +28 -0
- package/dist/plot/treemap/treemap.js +102 -0
- package/dist/rdf/RdfPlot.svelte +37 -59
- package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
- package/dist/rdf/calc-rdf.js +63 -52
- package/dist/rdf/index.d.ts +0 -1
- package/dist/sanitize.js +85 -27
- package/dist/scene/SceneCamera.svelte +1 -1
- package/dist/scene/SceneCamera.svelte.d.ts +1 -1
- package/dist/scene/bind-renderer.svelte.js +14 -6
- package/dist/scene/index.d.ts +1 -2
- package/dist/scene/index.js +1 -1
- package/dist/scene/{props.js → props.svelte.js} +15 -1
- package/dist/settings.d.ts +19 -9
- package/dist/settings.js +229 -525
- package/dist/spectral/Bands.svelte +207 -221
- package/dist/spectral/BandsAndDos.svelte +11 -9
- package/dist/spectral/BrillouinBandsDos.svelte +19 -42
- package/dist/spectral/Dos.svelte +92 -93
- package/dist/spectral/helpers.d.ts +3 -3
- package/dist/spectral/helpers.js +65 -140
- package/dist/state.svelte.js +5 -18
- package/dist/structure/Arrow.svelte +5 -18
- package/dist/structure/ArrowInstances.svelte +160 -0
- package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
- package/dist/structure/AtomLegend.svelte +120 -85
- package/dist/structure/AtomLegend.svelte.d.ts +2 -3
- package/dist/structure/Bond.svelte +31 -23
- package/dist/structure/CanvasTooltip.svelte +15 -3
- package/dist/structure/CellSelect.svelte +45 -35
- package/dist/structure/Cylinder.svelte +24 -40
- package/dist/structure/InstancedAtoms.svelte +114 -0
- package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
- package/dist/structure/Lattice.svelte +85 -149
- package/dist/structure/SiteLabels.svelte +122 -0
- package/dist/structure/SiteLabels.svelte.d.ts +18 -0
- package/dist/structure/Structure.svelte +636 -504
- package/dist/structure/Structure.svelte.d.ts +4 -2
- package/dist/structure/StructureCarousel.svelte +637 -0
- package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
- package/dist/structure/StructureControls.svelte +165 -425
- package/dist/structure/StructureControls.svelte.d.ts +1 -1
- package/dist/structure/StructureExportPane.svelte +17 -21
- package/dist/structure/StructureInfoPane.svelte +128 -133
- package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
- package/dist/structure/StructureScene.svelte +535 -578
- package/dist/structure/StructureScene.svelte.d.ts +6 -2
- package/dist/structure/StructureViewport.svelte +451 -0
- package/dist/structure/StructureViewport.svelte.d.ts +65 -0
- package/dist/structure/atom-label-placement.d.ts +16 -12
- package/dist/structure/atom-label-placement.js +70 -37
- package/dist/structure/atom-properties.d.ts +2 -0
- package/dist/structure/atom-properties.js +105 -38
- package/dist/structure/bond-order-perception.js +3 -8
- package/dist/structure/bonding.d.ts +9 -3
- package/dist/structure/bonding.js +95 -46
- package/dist/structure/edit-history.d.ts +6 -0
- package/dist/structure/edit-history.js +27 -0
- package/dist/structure/export.d.ts +1 -0
- package/dist/structure/export.js +89 -105
- package/dist/structure/format-detect.d.ts +1 -0
- package/dist/structure/format-detect.js +20 -0
- package/dist/structure/geometry.d.ts +9 -0
- package/dist/structure/geometry.js +27 -0
- package/dist/structure/index.d.ts +16 -1
- package/dist/structure/index.js +15 -10
- package/dist/structure/measure.d.ts +1 -1
- package/dist/structure/measure.js +6 -12
- package/dist/structure/parse.d.ts +2 -1
- package/dist/structure/parse.js +272 -313
- package/dist/structure/partial-occupancy.js +10 -5
- package/dist/structure/pbc.js +85 -107
- package/dist/structure/polyhedra.d.ts +0 -1
- package/dist/structure/polyhedra.js +7 -21
- package/dist/structure/prop-groups.d.ts +85 -0
- package/dist/structure/prop-groups.js +18 -0
- package/dist/structure/supercell.d.ts +1 -2
- package/dist/structure/supercell.js +7 -13
- package/dist/symmetry/SymmetryElements.svelte +11 -15
- package/dist/symmetry/SymmetryStats.svelte +55 -71
- package/dist/symmetry/WyckoffTable.svelte +10 -28
- package/dist/symmetry/cell-transform.js +6 -14
- package/dist/symmetry/index.d.ts +1 -0
- package/dist/symmetry/index.js +13 -10
- package/dist/symmetry/spacegroups.js +3 -2
- package/dist/table/HeatmapTable.svelte +1142 -447
- package/dist/table/HeatmapTable.svelte.d.ts +12 -2
- package/dist/table/ToggleMenu.svelte +168 -53
- package/dist/table/ToggleMenu.svelte.d.ts +1 -1
- package/dist/table/index.d.ts +21 -6
- package/dist/table/index.js +34 -21
- package/dist/theme/ThemeControl.svelte +16 -8
- package/dist/theme/embedded.d.ts +18 -0
- package/dist/theme/embedded.js +206 -0
- package/dist/theme/index.d.ts +5 -5
- package/dist/theme/index.js +5 -12
- package/dist/theme/themes.mjs +44 -66
- package/dist/tooltip/KCoords.svelte +4 -1
- package/dist/tooltip/TooltipContent.svelte +3 -6
- package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
- package/dist/tooltip/index.d.ts +8 -1
- package/dist/trajectory/Trajectory.svelte +613 -386
- package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
- package/dist/trajectory/TrajectoryError.svelte +12 -74
- package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
- package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
- package/dist/trajectory/extract.js +61 -49
- package/dist/trajectory/format-detect.d.ts +2 -0
- package/dist/trajectory/format-detect.js +17 -13
- package/dist/trajectory/frame-reader.d.ts +2 -0
- package/dist/trajectory/frame-reader.js +35 -32
- package/dist/trajectory/helpers.d.ts +2 -0
- package/dist/trajectory/helpers.js +34 -56
- package/dist/trajectory/index.d.ts +1 -0
- package/dist/trajectory/index.js +5 -8
- package/dist/trajectory/parse/ase.js +1 -1
- package/dist/trajectory/parse/h5-utils.d.ts +13 -0
- package/dist/trajectory/parse/h5-utils.js +109 -0
- package/dist/trajectory/parse/hdf5.d.ts +1 -1
- package/dist/trajectory/parse/hdf5.js +116 -106
- package/dist/trajectory/parse/index.d.ts +6 -6
- package/dist/trajectory/parse/index.js +25 -33
- package/dist/trajectory/parse/lammps.js +8 -12
- package/dist/trajectory/parse/vasp.js +10 -7
- package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
- package/dist/trajectory/parse/vaspout-electronic.js +207 -0
- package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
- package/dist/trajectory/parse/vaspout-h5.js +281 -0
- package/dist/trajectory/parse/xyz.js +59 -9
- package/dist/trajectory/plotting.d.ts +8 -9
- package/dist/trajectory/plotting.js +113 -64
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +7 -0
- package/dist/xrd/XrdPlot.svelte +79 -118
- package/dist/xrd/broadening.js +2 -1
- package/dist/xrd/calc-xrd.js +24 -62
- package/dist/xrd/parse.d.ts +0 -1
- package/dist/xrd/parse.js +69 -95
- package/package.json +94 -34
- package/readme.md +6 -5
- package/dist/api/mp.d.ts +0 -6
- package/dist/api/mp.js +0 -22
- package/dist/plot/sunburst/SunburstControls.svelte +0 -200
- package/dist/scene/types.d.ts +0 -26
- package/dist/tooltip/types.d.ts +0 -8
- package/dist/trajectory/constants.d.ts +0 -6
- package/dist/trajectory/constants.js +0 -11
- /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
- /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as math from '../math';
|
|
2
|
-
import {
|
|
2
|
+
import { Matrix4 } from 'three';
|
|
3
3
|
export const LABEL_OFFSET_EPS = 1e-9;
|
|
4
4
|
const LABEL_OFFSET_DIRECTIONS = [
|
|
5
5
|
[0, -1, 0],
|
|
@@ -44,39 +44,72 @@ export const choose_site_label_offset = (bond_directions, base_offset) => {
|
|
|
44
44
|
}
|
|
45
45
|
return math.scale(best_direction, offset_length);
|
|
46
46
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
.
|
|
67
|
-
.
|
|
68
|
-
.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
47
|
+
// Per-frame screen projector for label overlays. `update()` precomputes the
|
|
48
|
+
// combined model-view-projection once per frame; `place()` then resolves each
|
|
49
|
+
// label with a single clip-space transform and zero allocations (labels run
|
|
50
|
+
// per site per frame, so the old 3-projections-per-label path with fresh
|
|
51
|
+
// Vector3s dominated frame time on large supercells).
|
|
52
|
+
//
|
|
53
|
+
// Placement semantics match the previous label_screen_position helper: the
|
|
54
|
+
// label sits `atom_screen_radius + margin` px from the atom center along the
|
|
55
|
+
// screen direction of its offset. The projected radius is measured along the
|
|
56
|
+
// camera's right axis, which for both projections equals
|
|
57
|
+
// visual_radius * projection[5] * (height/2) / clip_w.
|
|
58
|
+
export class LabelProjector {
|
|
59
|
+
#mvp = new Matrix4(); // projection * view * anchor (local -> clip space)
|
|
60
|
+
#view = new Matrix4(); // view * anchor (local -> view space, for behind-camera test)
|
|
61
|
+
#half_width = 0;
|
|
62
|
+
#half_height = 0;
|
|
63
|
+
#radius_scale = 0; // clip-space multiplier for projected atom radius
|
|
64
|
+
#margin = 0;
|
|
65
|
+
update(camera, anchor_world_matrix, size, margin) {
|
|
66
|
+
this.#view.multiplyMatrices(camera.matrixWorldInverse, anchor_world_matrix);
|
|
67
|
+
this.#mvp.multiplyMatrices(camera.projectionMatrix, this.#view);
|
|
68
|
+
this.#half_width = size.width / 2;
|
|
69
|
+
this.#half_height = size.height / 2;
|
|
70
|
+
// projectionMatrix[5] = cot(fov/2) for perspective, 2/(top-bottom) for ortho
|
|
71
|
+
this.#radius_scale = camera.projectionMatrix.elements[5] * this.#half_height;
|
|
72
|
+
this.#margin = margin;
|
|
73
|
+
}
|
|
74
|
+
// position + offset: label anchor and preferred direction in anchor-local
|
|
75
|
+
// space; visual_radius: atom radius in the same units
|
|
76
|
+
place(position, offset, visual_radius, out) {
|
|
77
|
+
const [pos_x, pos_y, pos_z] = position;
|
|
78
|
+
const mvp = this.#mvp.elements;
|
|
79
|
+
const view = this.#view.elements;
|
|
80
|
+
// Behind-camera test in view space (camera looks down -z)
|
|
81
|
+
const view_z = view[2] * pos_x + view[6] * pos_y + view[10] * pos_z + view[14];
|
|
82
|
+
if (view_z > 0) {
|
|
83
|
+
out.visible = false;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const clip_x = mvp[0] * pos_x + mvp[4] * pos_y + mvp[8] * pos_z + mvp[12];
|
|
87
|
+
const clip_y = mvp[1] * pos_x + mvp[5] * pos_y + mvp[9] * pos_z + mvp[13];
|
|
88
|
+
const clip_w = mvp[3] * pos_x + mvp[7] * pos_y + mvp[11] * pos_z + mvp[15];
|
|
89
|
+
const screen_x = (clip_x / clip_w) * this.#half_width + this.#half_width;
|
|
90
|
+
const screen_y = (-clip_y / clip_w) * this.#half_height + this.#half_height;
|
|
91
|
+
// Screen direction of the offset: project position + offset and take the
|
|
92
|
+
// screen-space delta. Projecting the second point (instead of just rotating
|
|
93
|
+
// the offset into view space) keeps perspective foreshortening exact for
|
|
94
|
+
// offsets with a depth component, matching the pre-projector behavior.
|
|
95
|
+
const [off_x, off_y, off_z] = offset;
|
|
96
|
+
const end_x = pos_x + off_x;
|
|
97
|
+
const end_y = pos_y + off_y;
|
|
98
|
+
const end_z = pos_z + off_z;
|
|
99
|
+
const end_clip_x = mvp[0] * end_x + mvp[4] * end_y + mvp[8] * end_z + mvp[12];
|
|
100
|
+
const end_clip_y = mvp[1] * end_x + mvp[5] * end_y + mvp[9] * end_z + mvp[13];
|
|
101
|
+
const end_clip_w = mvp[3] * end_x + mvp[7] * end_y + mvp[11] * end_z + mvp[15];
|
|
102
|
+
const delta_x = (end_clip_x / end_clip_w) * this.#half_width + this.#half_width - screen_x;
|
|
103
|
+
const delta_y = (-end_clip_y / end_clip_w) * this.#half_height + this.#half_height - screen_y;
|
|
104
|
+
const dir_len = Math.hypot(delta_x, delta_y);
|
|
105
|
+
// Offsets along the view axis have no screen direction; nudge upward like
|
|
106
|
+
// the previous implementation (screen y grows downward)
|
|
107
|
+
const dir_x = dir_len > LABEL_OFFSET_EPS ? delta_x / dir_len : 0;
|
|
108
|
+
const dir_y = dir_len > LABEL_OFFSET_EPS ? delta_y / dir_len : off_y >= 0 ? -1 : 1;
|
|
109
|
+
const atom_screen_radius = (visual_radius * this.#radius_scale) / clip_w;
|
|
110
|
+
const screen_gap = Math.abs(atom_screen_radius) + this.#margin;
|
|
111
|
+
out.x = screen_x + dir_x * screen_gap;
|
|
112
|
+
out.y = screen_y + dir_y * screen_gap;
|
|
113
|
+
out.visible = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ColorScaleType, D3InterpolateName } from '../colors';
|
|
2
|
+
import type { CoordinationData } from '../coordination/calc-coordination';
|
|
2
3
|
import type { AtomColorMode } from '../settings';
|
|
3
4
|
import type { AnyStructure, Site } from './';
|
|
4
5
|
import type { BondingStrategy } from './bonding';
|
|
@@ -29,6 +30,7 @@ export declare const apply_categorical_color_scale: (vals: string[], scale?: str
|
|
|
29
30
|
unique_values: string[];
|
|
30
31
|
};
|
|
31
32
|
export declare const get_orig_site_idx: (site: Site | undefined, site_idx: number) => number;
|
|
33
|
+
export declare function calc_structure_coordination(structure: AnyStructure, strategy?: BondingStrategy): CoordinationData;
|
|
32
34
|
export declare function get_coordination_colors(structure: AnyStructure, strategy?: BondingStrategy, scale?: string, type?: ColorScaleType): AtomPropertyColors;
|
|
33
35
|
export declare function get_wyckoff_colors(structure: AnyStructure, sym_data: SymmetryDataWithOrigMap | null, scale?: string): AtomPropertyColors;
|
|
34
36
|
export declare function get_custom_colors(structure: AnyStructure, fn: (site: Site, idx: number) => number | string, scale?: string, type?: ColorScaleType): AtomPropertyColors;
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
// Utility functions for computing atom properties and applying color scales
|
|
2
2
|
import { get_d3_interpolator } from '../colors';
|
|
3
|
-
import { calc_coordination_nums } from '../coordination';
|
|
3
|
+
import { calc_coordination_nums } from '../coordination/calc-coordination';
|
|
4
|
+
import { element_by_symbol } from '../element/data';
|
|
4
5
|
import * as math from '../math';
|
|
5
|
-
import {
|
|
6
|
+
import { get_majority_element } from './bonding';
|
|
7
|
+
import { wrap_frac_coord } from './pbc';
|
|
6
8
|
import { rgb } from 'd3-color';
|
|
7
9
|
import * as d3_sc from 'd3-scale-chromatic';
|
|
8
10
|
const GRAY = `#808080`;
|
|
9
11
|
const DEFAULT_COLOR_SCALE = `interpolateViridis`;
|
|
12
|
+
// Cap on periodic image shells per axis when expanding for coordination. Guards
|
|
13
|
+
// against image explosion in very thin / highly oblique cells (coordination is ~O(n²)).
|
|
14
|
+
const MAX_IMAGE_SHELLS = 3;
|
|
15
|
+
// Max bond distance each strategy can form, mirroring the defaults in bonding.ts
|
|
16
|
+
// (electroneg_ratio.max_distance_ratio, solid_angle.max_distance). Used to size PBC
|
|
17
|
+
// image expansion just tightly enough that coordination never misses a bonded neighbor.
|
|
18
|
+
const ELECTRONEG_MAX_RATIO = 2;
|
|
19
|
+
const SOLID_ANGLE_MAX_DIST = 5; // Å
|
|
10
20
|
export const get_d3_color_scales = () => Object.keys(d3_sc).filter((key) => key.startsWith(`interpolate`));
|
|
11
21
|
const to_hex = (interp_fn, frac) => rgb(interp_fn(frac)).formatHex();
|
|
12
22
|
const build_image_site = (site, frac_to_cart, offset, orig_idx) => {
|
|
@@ -22,12 +32,6 @@ const build_image_site = (site, frac_to_cart, offset, orig_idx) => {
|
|
|
22
32
|
properties: { ...site.properties, orig_site_idx: orig_idx },
|
|
23
33
|
};
|
|
24
34
|
};
|
|
25
|
-
const get_all_offsets = (pbc) => [-1, 0, 1]
|
|
26
|
-
.flatMap((dx) => [-1, 0, 1].flatMap((dy) => [-1, 0, 1].map((dz) => [dx, dy, dz])))
|
|
27
|
-
.filter(([dx, dy, dz]) => !(dx === 0 && dy === 0 && dz === 0) &&
|
|
28
|
-
(pbc[0] || dx === 0) &&
|
|
29
|
-
(pbc[1] || dy === 0) &&
|
|
30
|
-
(pbc[2] || dz === 0));
|
|
31
35
|
const make_categorical = (vals, scale, sort_fn) => {
|
|
32
36
|
const interp_fn = get_d3_interpolator(scale);
|
|
33
37
|
const uniq = sort_fn
|
|
@@ -75,46 +79,109 @@ export const get_orig_site_idx = (site, site_idx) => typeof site?.properties?.or
|
|
|
75
79
|
: typeof site?.properties?.orig_site_idx === `number`
|
|
76
80
|
? site.properties.orig_site_idx
|
|
77
81
|
: site_idx;
|
|
78
|
-
// Expand structure with
|
|
79
|
-
|
|
82
|
+
// Expand a periodic structure with the neighbor images needed for correct
|
|
83
|
+
// coordination. Each atom's `reach` (the largest bond `strategy` can form for it —
|
|
84
|
+
// electroneg_ratio's (r + r_max)·ratio or solid_angle's flat cap) sizes how many whole
|
|
85
|
+
// cells to image per periodic axis, measured over the perpendicular cell height (not
|
|
86
|
+
// the lattice vector length, so oblique cells work), keeping only images within `reach`
|
|
87
|
+
// of the [0,1] cell and capping at MAX_IMAGE_SHELLS/axis (warns + may undercount beyond
|
|
88
|
+
// that — near-degenerate cells only). Smaller atoms image less; atoms with no covalent
|
|
89
|
+
// radius form no bonds and get no images.
|
|
90
|
+
function expand_structure_for_pbc(structure, strategy) {
|
|
80
91
|
if (!(`lattice` in structure) || !structure.lattice || structure.sites.length === 0) {
|
|
81
92
|
return structure;
|
|
82
93
|
}
|
|
83
94
|
const { sites, lattice } = structure;
|
|
84
|
-
const frac_to_cart = math.create_frac_to_cart(lattice.matrix);
|
|
85
95
|
const pbc = lattice.pbc ?? [true, true, true];
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return all_offsets
|
|
97
|
-
.filter(([dx, dy, dz]) => (dx === 0 || (dx === -1 ? norm[0] <= cutoff[0] : norm[0] >= 1 - cutoff[0])) &&
|
|
98
|
-
(dy === 0 || (dy === -1 ? norm[1] <= cutoff[1] : norm[1] >= 1 - cutoff[1])) &&
|
|
99
|
-
(dz === 0 || (dz === -1 ? norm[2] <= cutoff[2] : norm[2] >= 1 - cutoff[2])))
|
|
100
|
-
.map((offset) => build_image_site(site, frac_to_cart, offset, orig_idx));
|
|
96
|
+
if (!pbc.some(Boolean))
|
|
97
|
+
return structure;
|
|
98
|
+
const frac_to_cart = math.create_frac_to_cart(lattice.matrix);
|
|
99
|
+
// Wrap into [0,1) along PERIODIC axes only so the near-cell filter and image
|
|
100
|
+
// building share one position (else boundary atoms image on the wrong side and lose
|
|
101
|
+
// neighbors). Vacuum axes keep their real coord — wrapping would fold apart atoms
|
|
102
|
+
// together and invent bonds.
|
|
103
|
+
const cell_sites = sites.map((site) => {
|
|
104
|
+
const abc = site.abc.map((coord, axis) => pbc[axis] ? wrap_frac_coord(coord) : coord);
|
|
105
|
+
return { ...site, abc, xyz: frac_to_cart(abc) };
|
|
101
106
|
});
|
|
102
|
-
|
|
107
|
+
// Covalent radius per atom (0 = unknown → forms no bonds → needs no images)
|
|
108
|
+
const radii = cell_sites.map((site) => {
|
|
109
|
+
const elem = get_majority_element(site);
|
|
110
|
+
return (elem ? element_by_symbol.get(elem)?.covalent_radius : undefined) ?? 0;
|
|
111
|
+
});
|
|
112
|
+
let max_radius = 0;
|
|
113
|
+
for (const radius of radii)
|
|
114
|
+
if (radius > max_radius)
|
|
115
|
+
max_radius = radius;
|
|
116
|
+
const reach_of = (radius) => strategy === `solid_angle`
|
|
117
|
+
? SOLID_ANGLE_MAX_DIST
|
|
118
|
+
: (radius + max_radius) * ELECTRONEG_MAX_RATIO;
|
|
119
|
+
const heights = math.cell_heights(lattice.matrix);
|
|
120
|
+
// Axes we image along: periodic and non-degenerate (finite height). Non-live axes
|
|
121
|
+
// (vacuum or degenerate) contribute no images — 0 shells + ∞ cutoff so their only
|
|
122
|
+
// copy (shift 0) always passes the near-cell filter. Loop-invariant, so hoisted out.
|
|
123
|
+
const live_axis = heights.map((height, axis) => pbc[axis] && Number.isFinite(height));
|
|
124
|
+
const image_near_cell = (frac, shift, axis_cutoff) => {
|
|
125
|
+
const shifted = frac + shift;
|
|
126
|
+
return shifted >= -axis_cutoff && shifted <= 1 + axis_cutoff;
|
|
127
|
+
};
|
|
128
|
+
let capped = false;
|
|
129
|
+
const image_sites = [];
|
|
130
|
+
for (const [orig_idx, site] of cell_sites.entries()) {
|
|
131
|
+
const radius = radii[orig_idx];
|
|
132
|
+
if (radius === 0)
|
|
133
|
+
continue; // no covalent radius → no bonds → no images
|
|
134
|
+
const reach = reach_of(radius);
|
|
135
|
+
// `cutoff` = fractional reach for the near-cell filter (keep an image shifted by `s`
|
|
136
|
+
// iff abc+s lands within `cutoff` of [0,1]); `n_shells` bounds the loop so no
|
|
137
|
+
// in-reach copy is missed.
|
|
138
|
+
const cutoff = heights.map((height, axis) => (live_axis[axis] ? reach / height : Infinity));
|
|
139
|
+
const n_shells = heights.map((height, axis) => {
|
|
140
|
+
if (!live_axis[axis])
|
|
141
|
+
return 0;
|
|
142
|
+
const shells = Math.floor(1 + reach / height);
|
|
143
|
+
if (shells > MAX_IMAGE_SHELLS)
|
|
144
|
+
capped = true;
|
|
145
|
+
return Math.min(MAX_IMAGE_SHELLS, shells);
|
|
146
|
+
});
|
|
147
|
+
const [frac_a, frac_b, frac_c] = site.abc; // periodic axes wrapped into [0, 1)
|
|
148
|
+
for (let dx = -n_shells[0]; dx <= n_shells[0]; dx++) {
|
|
149
|
+
if (!image_near_cell(frac_a, dx, cutoff[0]))
|
|
150
|
+
continue;
|
|
151
|
+
for (let dy = -n_shells[1]; dy <= n_shells[1]; dy++) {
|
|
152
|
+
if (!image_near_cell(frac_b, dy, cutoff[1]))
|
|
153
|
+
continue;
|
|
154
|
+
for (let dz = -n_shells[2]; dz <= n_shells[2]; dz++) {
|
|
155
|
+
if (dx === 0 && dy === 0 && dz === 0)
|
|
156
|
+
continue;
|
|
157
|
+
if (!image_near_cell(frac_c, dz, cutoff[2]))
|
|
158
|
+
continue;
|
|
159
|
+
image_sites.push(build_image_site(site, frac_to_cart, [dx, dy, dz], orig_idx));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (capped) {
|
|
165
|
+
console.warn(`[coordination] cell is very thin or oblique relative to bond reach; capping ` +
|
|
166
|
+
`PBC images at ${MAX_IMAGE_SHELLS} shells/axis, coordination near cell ` +
|
|
167
|
+
`boundaries may be undercounted`);
|
|
168
|
+
}
|
|
169
|
+
return { ...structure, sites: [...cell_sites, ...image_sites] };
|
|
103
170
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
171
|
+
// PBC-aware coordination: expand periodic cells with image atoms (so boundary atoms get
|
|
172
|
+
// full coordination), counting only original atoms as centers. Shared by the 3D viewer and
|
|
173
|
+
// CoordinationBarPlot so both report identical numbers.
|
|
174
|
+
export function calc_structure_coordination(structure, strategy = `electroneg_ratio`) {
|
|
107
175
|
const has_lattice = `lattice` in structure && structure.lattice !== undefined;
|
|
108
176
|
const pbc = has_lattice ? structure.lattice.pbc : undefined;
|
|
109
177
|
const has_pbc = has_lattice && (pbc === undefined || pbc.some(Boolean));
|
|
110
|
-
//
|
|
111
|
-
const coord_structure = has_pbc ? expand_structure_for_pbc(structure) : structure;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
.map((site) => site.coordination_num);
|
|
178
|
+
// Image atoms still count as neighbors but aren't iterated as centers (big speedup)
|
|
179
|
+
const coord_structure = has_pbc ? expand_structure_for_pbc(structure, strategy) : structure;
|
|
180
|
+
return calc_coordination_nums(coord_structure, strategy, structure.sites.length);
|
|
181
|
+
}
|
|
182
|
+
export function get_coordination_colors(structure, strategy = `electroneg_ratio`, scale = DEFAULT_COLOR_SCALE, type = `continuous`) {
|
|
183
|
+
// sites is already limited to the original atoms (calc_coordination_nums center_count)
|
|
184
|
+
const coord_nums = calc_structure_coordination(structure, strategy).sites.map((site) => site.coordination_num);
|
|
118
185
|
const { colors, unique_values } = apply_color_scale(coord_nums, scale, type);
|
|
119
186
|
return build_prop_colors(coord_nums, colors, unique_values);
|
|
120
187
|
}
|
|
@@ -52,12 +52,10 @@ function formal_charge(symbol, bond_valence) {
|
|
|
52
52
|
const is_main_group = (symbol) => symbol in ATOMIC_VALENCE;
|
|
53
53
|
// Cap per-fragment valence enumeration (3^k for catenated S/Se/Te/P chains).
|
|
54
54
|
const MAX_VALENCE_COMBOS = 4096;
|
|
55
|
+
// Edges are bounds-checked by perceive_bond_orders before reaching here.
|
|
55
56
|
function split_fragments(n_atoms, edges) {
|
|
56
57
|
const adjacency = Array.from({ length: n_atoms }, () => []);
|
|
57
58
|
for (const [atom_idx_1, atom_idx_2] of edges) {
|
|
58
|
-
if (adjacency[atom_idx_1] === undefined || adjacency[atom_idx_2] === undefined) {
|
|
59
|
-
throw new Error(`Invalid edge ${atom_idx_1}-${atom_idx_2} for ${n_atoms} atoms`);
|
|
60
|
-
}
|
|
61
59
|
adjacency[atom_idx_1].push(atom_idx_2);
|
|
62
60
|
adjacency[atom_idx_2].push(atom_idx_1);
|
|
63
61
|
}
|
|
@@ -140,9 +138,6 @@ function assign_bond_orders(edges, target_valence) {
|
|
|
140
138
|
function find_rings(n_atoms, edges) {
|
|
141
139
|
const adjacency = Array.from({ length: n_atoms }, () => new Set());
|
|
142
140
|
for (const [atom_idx_1, atom_idx_2] of edges) {
|
|
143
|
-
if (adjacency[atom_idx_1] === undefined || adjacency[atom_idx_2] === undefined) {
|
|
144
|
-
throw new Error(`Invalid edge ${atom_idx_1}-${atom_idx_2} for ${n_atoms} atoms`);
|
|
145
|
-
}
|
|
146
141
|
adjacency[atom_idx_1].add(atom_idx_2);
|
|
147
142
|
adjacency[atom_idx_2].add(atom_idx_1);
|
|
148
143
|
}
|
|
@@ -200,7 +195,6 @@ function find_rings(n_atoms, edges) {
|
|
|
200
195
|
}
|
|
201
196
|
return [...uniq.values()];
|
|
202
197
|
}
|
|
203
|
-
const order_to_bond_order = (order) => order >= 3 ? 3 : order === 2 ? 2 : 1;
|
|
204
198
|
// Conservative planarity check: degenerate first-3-atom planes are non-planar.
|
|
205
199
|
function ring_is_planar(ring, sites) {
|
|
206
200
|
if (ring.length < 3)
|
|
@@ -294,7 +288,8 @@ export function perceive_bond_orders(sites, bonds, opts = {}) {
|
|
|
294
288
|
if (!solved)
|
|
295
289
|
continue;
|
|
296
290
|
local_edges.forEach((edge, edge_idx) => {
|
|
297
|
-
const
|
|
291
|
+
const solved_order = solved[edge_idx];
|
|
292
|
+
const order = solved_order >= 3 ? 3 : solved_order === 2 ? 2 : 1;
|
|
298
293
|
result.set(edge.bond, { ...edge.bond, bond_order: order, perceived: true });
|
|
299
294
|
});
|
|
300
295
|
// Hückel aromatic post-pass, retaining Kekulé orders for display toggles.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ElementSymbol } from '../element';
|
|
2
2
|
import type { Vec3 } from '../math';
|
|
3
3
|
import type { AnyStructure, BondOrder, BondPair, Site, StructureBond } from './';
|
|
4
|
-
export declare const element_lookup: Map<"S" | "K" | "B" | "H" | "He" | "Li" | "Be" | "C" | "N" | "O" | "F" | "Ne" | "Na" | "Mg" | "Al" | "Si" | "P" | "Cl" | "Ar" | "Ca" | "Sc" | "Ti" | "V" | "Cr" | "Mn" | "Fe" | "Co" | "Ni" | "Cu" | "Zn" | "Ga" | "Ge" | "As" | "Se" | "Br" | "Kr" | "Rb" | "Sr" | "Y" | "Zr" | "Nb" | "Mo" | "Tc" | "Ru" | "Rh" | "Pd" | "Ag" | "Cd" | "In" | "Sn" | "Sb" | "Te" | "I" | "Xe" | "Cs" | "Ba" | "La" | "Ce" | "Pr" | "Nd" | "Pm" | "Sm" | "Eu" | "Gd" | "Tb" | "Dy" | "Ho" | "Er" | "Tm" | "Yb" | "Lu" | "Hf" | "Ta" | "W" | "Re" | "Os" | "Ir" | "Pt" | "Au" | "Hg" | "Tl" | "Pb" | "Bi" | "Po" | "At" | "Rn" | "Fr" | "Ra" | "Ac" | "Th" | "Pa" | "U" | "Np" | "Pu" | "Am" | "Cm" | "Bk" | "Cf" | "Es" | "Fm" | "Md" | "No" | "Lr" | "Rf" | "Db" | "Sg" | "Bh" | "Hs" | "Mt" | "Ds" | "Rg" | "Cn" | "Nh" | "Fl" | "Mc" | "Lv" | "Ts" | "Og", import("../element").ChemicalElement>;
|
|
5
4
|
export declare const get_majority_element: (site: Site | undefined) => ElementSymbol | null;
|
|
5
|
+
export declare const is_spectator_center: (element: string) => boolean;
|
|
6
|
+
export declare function has_framework_potential(elements: Iterable<string>): boolean;
|
|
6
7
|
export declare const normalize_structure_bond: (site_idx_1: number, site_idx_2: number, order: BondOrder, cell_shift?: Vec3) => StructureBond;
|
|
7
8
|
export declare const get_bond_key: (idx_1: number, idx_2: number, cell_shift?: Vec3) => string;
|
|
8
9
|
export declare function remap_bonds_after_deletion(bonds: readonly StructureBond[], deleted_indices: ReadonlySet<number>): StructureBond[];
|
|
@@ -39,12 +40,14 @@ export declare function apply_explicit_bond_metadata(structure: AnyStructure, bo
|
|
|
39
40
|
export declare function scale_and_offset_bond_matrix(transform_matrix: Float32Array, offset: number, radius_scale: number): Float32Array;
|
|
40
41
|
export declare function get_bond_render_matrices(bond: BondPair, bond_thickness: number): Float32Array[];
|
|
41
42
|
export declare function compute_bond_transform(pos_1: Vec3, pos_2: Vec3): Float32Array;
|
|
43
|
+
export declare const pack_cell_key: (x: number, y: number, z: number) => number;
|
|
42
44
|
export declare const BONDING_STRATEGIES: {
|
|
43
45
|
readonly electroneg_ratio: typeof electroneg_ratio;
|
|
44
46
|
readonly solid_angle: typeof solid_angle;
|
|
45
47
|
};
|
|
46
48
|
export type BondingStrategy = keyof typeof BONDING_STRATEGIES;
|
|
47
49
|
export type BondingAlgo = (typeof BONDING_STRATEGIES)[BondingStrategy];
|
|
50
|
+
export declare function compute_bonds(structure: AnyStructure, strategy: BondingStrategy, options?: Record<string, unknown>): BondPair[];
|
|
48
51
|
export declare function electroneg_ratio(structure: AnyStructure, { electronegativity_threshold, // Max electronegativity difference for bonding
|
|
49
52
|
max_distance_ratio, // Max distance as multiple of sum of covalent radii
|
|
50
53
|
min_bond_dist, // Minimum bond distance in Angstroms
|
|
@@ -52,7 +55,8 @@ metal_metal_penalty, // Strength penalty for metal-metal bonds
|
|
|
52
55
|
metal_nonmetal_bonus, // Strength bonus for metal-nonmetal bonds
|
|
53
56
|
similar_electronegativity_bonus, // Bonus for similar electronegativity
|
|
54
57
|
same_species_penalty, // Penalty for bonds between same element
|
|
55
|
-
strength_threshold,
|
|
58
|
+
strength_threshold, // Minimum bond strength to include in results
|
|
59
|
+
center_count, }?: {
|
|
56
60
|
electronegativity_threshold?: number | undefined;
|
|
57
61
|
max_distance_ratio?: number | undefined;
|
|
58
62
|
min_bond_dist?: number | undefined;
|
|
@@ -61,12 +65,14 @@ strength_threshold, }?: {
|
|
|
61
65
|
similar_electronegativity_bonus?: number | undefined;
|
|
62
66
|
same_species_penalty?: number | undefined;
|
|
63
67
|
strength_threshold?: number | undefined;
|
|
68
|
+
center_count?: number | undefined;
|
|
64
69
|
}): BondPair[];
|
|
65
|
-
export declare function solid_angle(structure: AnyStructure, { min_solid_angle, min_face_area, max_distance, min_bond_dist, strength_threshold, }?: {
|
|
70
|
+
export declare function solid_angle(structure: AnyStructure, { min_solid_angle, min_face_area, max_distance, min_bond_dist, strength_threshold, center_count, }?: {
|
|
66
71
|
min_solid_angle?: number | undefined;
|
|
67
72
|
min_face_area?: number | undefined;
|
|
68
73
|
max_distance?: number | undefined;
|
|
69
74
|
min_bond_dist?: number | undefined;
|
|
70
75
|
strength_threshold?: number | undefined;
|
|
76
|
+
center_count?: number | undefined;
|
|
71
77
|
}): BondPair[];
|
|
72
78
|
export {};
|