matterviz 0.3.7 → 0.4.1
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/Icon.svelte +7 -4
- package/dist/MillerIndexInput.svelte +1 -1
- package/dist/api/optimade.js +32 -26
- package/dist/app.css +0 -3
- package/dist/brillouin/BrillouinZone.svelte +76 -148
- package/dist/brillouin/BrillouinZone.svelte.d.ts +6 -14
- package/dist/brillouin/BrillouinZoneExportPane.svelte +43 -96
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +9 -32
- package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
- package/dist/brillouin/BrillouinZoneScene.svelte +97 -205
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +4 -23
- package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
- package/dist/brillouin/ReciprocalVectors.svelte +39 -0
- package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
- package/dist/brillouin/compute.d.ts +2 -0
- package/dist/brillouin/compute.js +89 -90
- package/dist/brillouin/geometry.d.ts +8 -0
- package/dist/brillouin/geometry.js +57 -0
- package/dist/brillouin/index.d.ts +2 -0
- package/dist/brillouin/index.js +2 -0
- package/dist/brillouin/types.d.ts +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
- package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +109 -203
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +180 -470
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
- package/dist/chempot-diagram/async-compute.svelte.js +3 -1
- package/dist/chempot-diagram/chempot-worker.js +2 -1
- package/dist/chempot-diagram/color.d.ts +3 -6
- package/dist/chempot-diagram/color.js +5 -5
- package/dist/chempot-diagram/compute.d.ts +4 -4
- package/dist/chempot-diagram/compute.js +20 -20
- package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
- package/dist/chempot-diagram/controls-state.svelte.js +42 -0
- package/dist/chempot-diagram/export.d.ts +47 -0
- package/dist/chempot-diagram/export.js +133 -0
- package/dist/chempot-diagram/index.d.ts +1 -0
- package/dist/chempot-diagram/index.js +1 -0
- package/dist/chempot-diagram/pointer.d.ts +0 -10
- package/dist/chempot-diagram/pointer.js +4 -4
- package/dist/chempot-diagram/types.d.ts +3 -3
- package/dist/colors/index.js +8 -7
- package/dist/composition/FormulaFilter.svelte +18 -11
- package/dist/composition/PieChart.svelte +11 -10
- package/dist/composition/chem-sys.d.ts +8 -0
- package/dist/composition/chem-sys.js +86 -0
- package/dist/composition/format.js +7 -4
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +1 -0
- package/dist/composition/parse.d.ts +0 -1
- package/dist/composition/parse.js +41 -31
- package/dist/controls.d.ts +1 -0
- package/dist/controls.js +0 -1
- package/dist/convex-hull/ConvexHull.svelte +8 -10
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
- package/dist/convex-hull/ConvexHull2D.svelte +106 -185
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +179 -683
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +183 -687
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullChrome.svelte +268 -0
- package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
- package/dist/convex-hull/ConvexHullControls.svelte +88 -7
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
- package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
- package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
- package/dist/convex-hull/ConvexHullStats.svelte +36 -175
- package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
- package/dist/convex-hull/ConvexHullTooltip.svelte +11 -2
- package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
- package/dist/convex-hull/GasPressureControls.svelte +4 -4
- package/dist/convex-hull/TemperatureSlider.svelte +2 -2
- package/dist/convex-hull/barycentric-coords.d.ts +2 -4
- package/dist/convex-hull/barycentric-coords.js +6 -33
- package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
- package/dist/convex-hull/canvas-interactions.svelte.js +278 -0
- package/dist/convex-hull/demo-temperature.d.ts +1 -1
- package/dist/convex-hull/demo-temperature.js +20 -22
- package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
- package/dist/convex-hull/gas-thermodynamics.js +22 -30
- package/dist/convex-hull/helpers.d.ts +42 -7
- package/dist/convex-hull/helpers.js +171 -78
- package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
- package/dist/convex-hull/hull-state.svelte.js +124 -0
- package/dist/convex-hull/index.d.ts +10 -8
- package/dist/convex-hull/index.js +7 -2
- package/dist/convex-hull/thermodynamics.js +136 -960
- package/dist/convex-hull/types.d.ts +13 -5
- package/dist/convex-hull/types.js +12 -0
- package/dist/coordination/CoordinationBarPlot.svelte +27 -34
- package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
- package/dist/element/BohrAtom.svelte +2 -1
- package/dist/element/index.d.ts +4 -0
- package/dist/element/index.js +18 -0
- package/dist/feedback/DragOverlay.svelte +3 -1
- package/dist/feedback/DragOverlay.svelte.d.ts +1 -0
- package/dist/feedback/StatusMessage.svelte +13 -3
- package/dist/fermi-surface/FermiSlice.svelte +13 -5
- package/dist/fermi-surface/FermiSurface.svelte +78 -151
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -14
- package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +72 -221
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
- package/dist/fermi-surface/compute.js +67 -66
- package/dist/fermi-surface/export.js +6 -16
- package/dist/fermi-surface/index.d.ts +0 -1
- package/dist/fermi-surface/index.js +0 -1
- package/dist/fermi-surface/parse.d.ts +1 -1
- package/dist/fermi-surface/parse.js +71 -79
- package/dist/fermi-surface/types.d.ts +3 -2
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +69 -52
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +4 -3
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +3 -2
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
- package/dist/heatmap-matrix/index.d.ts +3 -2
- package/dist/heatmap-matrix/index.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/io/ExportPane.svelte +166 -0
- package/dist/io/ExportPane.svelte.d.ts +17 -0
- package/dist/io/decompress.js +5 -4
- package/dist/io/export.d.ts +9 -5
- package/dist/io/export.js +77 -51
- package/dist/io/fetch.d.ts +2 -1
- package/dist/io/fetch.js +5 -1
- package/dist/io/file-drop.d.ts +8 -1
- package/dist/io/file-drop.js +48 -36
- package/dist/io/index.d.ts +2 -0
- package/dist/io/index.js +10 -0
- package/dist/io/types.d.ts +13 -0
- package/dist/io/url-drop.js +64 -33
- package/dist/isosurface/parse.js +52 -51
- package/dist/isosurface/slice.js +5 -4
- package/dist/isosurface/types.js +1 -1
- package/dist/keyboard.d.ts +3 -0
- package/dist/keyboard.js +23 -0
- package/dist/labels.d.ts +1 -1
- package/dist/labels.js +9 -8
- package/dist/layout/FullscreenButton.svelte +33 -0
- package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
- package/dist/layout/FullscreenToggle.svelte +8 -14
- package/dist/layout/PropertyFilter.svelte +3 -2
- package/dist/layout/SettingsSection.svelte +1 -1
- package/dist/layout/ViewerChrome.svelte +116 -0
- package/dist/layout/ViewerChrome.svelte.d.ts +17 -0
- package/dist/layout/fullscreen.d.ts +4 -0
- package/dist/layout/fullscreen.svelte.d.ts +8 -0
- package/dist/layout/fullscreen.svelte.js +37 -0
- package/dist/layout/index.d.ts +3 -0
- package/dist/layout/index.js +3 -0
- package/dist/layout/json-tree/JsonNode.svelte +1 -1
- package/dist/layout/json-tree/JsonTree.svelte +2 -2
- package/dist/layout/json-tree/utils.js +5 -4
- package/dist/marching-cubes.js +8 -13
- package/dist/math.d.ts +12 -4
- package/dist/math.js +42 -30
- package/dist/overlays/DraggablePane.svelte +4 -4
- package/dist/overlays/index.d.ts +4 -0
- package/dist/periodic-table/PeriodicTable.svelte +27 -15
- package/dist/periodic-table/PropertySelect.svelte +1 -0
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramControls.svelte +3 -2
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +47 -132
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
- package/dist/phase-diagram/build-diagram.js +2 -2
- package/dist/phase-diagram/colors.js +1 -1
- package/dist/phase-diagram/parse.d.ts +2 -1
- package/dist/phase-diagram/parse.js +6 -5
- package/dist/phase-diagram/types.d.ts +1 -1
- package/dist/phase-diagram/utils.d.ts +3 -3
- package/dist/phase-diagram/utils.js +8 -12
- package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +246 -841
- package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +8 -16
- package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
- package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
- package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +8 -7
- package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
- package/dist/plot/bar/data.d.ts +40 -0
- package/dist/plot/bar/data.js +154 -0
- package/dist/plot/bar/geometry.d.ts +39 -0
- package/dist/plot/bar/geometry.js +60 -0
- package/dist/plot/bar/index.d.ts +3 -0
- package/dist/plot/bar/index.js +3 -0
- package/dist/plot/box/BoxPlot.svelte +1292 -0
- package/dist/plot/box/BoxPlot.svelte.d.ts +95 -0
- package/dist/plot/box/BoxPlotControls.svelte +109 -0
- package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
- package/dist/plot/box/Violin.svelte +14 -0
- package/dist/plot/box/Violin.svelte.d.ts +70 -0
- package/dist/plot/box/box-plot.d.ts +56 -0
- package/dist/plot/box/box-plot.js +129 -0
- package/dist/plot/box/index.d.ts +5 -0
- package/dist/plot/box/index.js +5 -0
- package/dist/plot/box/kde.d.ts +17 -0
- package/dist/plot/box/kde.js +160 -0
- package/dist/plot/box/quantile.d.ts +3 -0
- package/dist/plot/box/quantile.js +53 -0
- package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +1 -1
- package/dist/plot/{auto-place.js → core/auto-place.js} +6 -3
- package/dist/plot/core/axis-utils.d.ts +46 -0
- package/dist/plot/core/axis-utils.js +110 -0
- package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
- package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
- package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +41 -38
- package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +7 -6
- package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
- package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
- package/dist/plot/core/components/ControlPane.svelte +46 -0
- package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
- package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
- package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
- package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
- package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
- package/dist/plot/{Line.svelte → core/components/Line.svelte} +33 -15
- package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +3 -2
- package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +9 -6
- package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +5 -3
- package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
- package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
- package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
- package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
- package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
- package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
- package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
- package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
- package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
- package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +5 -5
- package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +5 -5
- package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +8 -8
- package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +5 -5
- package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
- package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
- package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
- package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
- package/dist/plot/core/components/index.d.ts +17 -0
- package/dist/plot/core/components/index.js +17 -0
- package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
- package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +21 -23
- package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
- package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
- package/dist/plot/core/fill-utils.d.ts +34 -0
- package/dist/plot/core/fill-utils.js +391 -0
- package/dist/plot/core/index.d.ts +10 -0
- package/dist/plot/core/index.js +11 -0
- package/dist/plot/core/interactions.d.ts +39 -0
- package/dist/plot/core/interactions.js +209 -0
- package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
- package/dist/plot/{layout.js → core/layout.js} +16 -8
- package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
- package/dist/plot/core/pan-zoom.svelte.js +221 -0
- package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
- package/dist/plot/core/placed-tween.svelte.js +68 -0
- package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +11 -11
- package/dist/plot/{reference-line.js → core/reference-line.js} +29 -42
- package/dist/plot/core/scales.d.ts +40 -0
- package/dist/plot/{scales.js → core/scales.js} +94 -93
- package/dist/plot/core/svg.d.ts +3 -0
- package/dist/plot/core/svg.js +41 -0
- package/dist/plot/{types.d.ts → core/types.d.ts} +36 -85
- package/dist/plot/{types.js → core/types.js} +1 -1
- package/dist/plot/{utils → core/utils}/label-placement.d.ts +3 -3
- package/dist/plot/{utils → core/utils}/label-placement.js +3 -3
- package/dist/plot/core/utils/series-visibility.d.ts +26 -0
- package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
- package/dist/plot/core/utils.d.ts +12 -0
- package/dist/plot/core/utils.js +27 -0
- package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +174 -551
- package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
- package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
- package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
- package/dist/plot/histogram/index.d.ts +2 -0
- package/dist/plot/histogram/index.js +2 -0
- package/dist/plot/index.d.ts +8 -41
- package/dist/plot/index.js +10 -39
- package/dist/plot/sankey/Sankey.svelte +697 -0
- package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
- package/dist/plot/sankey/SankeyControls.svelte +98 -0
- package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
- package/dist/plot/sankey/index.d.ts +4 -0
- package/dist/plot/sankey/index.js +3 -0
- package/dist/plot/sankey/sankey-types.d.ts +42 -0
- package/dist/plot/sankey/sankey-types.js +4 -0
- package/dist/plot/sankey/sankey.d.ts +52 -0
- package/dist/plot/sankey/sankey.js +189 -0
- package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +64 -64
- package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +6 -6
- package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
- package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
- package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +297 -1008
- package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +10 -18
- package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
- package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +2 -2
- package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
- package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
- package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
- package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
- package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +5 -12
- package/dist/plot/scatter/index.d.ts +7 -0
- package/dist/plot/scatter/index.js +5 -0
- package/dist/plot/scatter/scatter-data.d.ts +19 -0
- package/dist/plot/scatter/scatter-data.js +212 -0
- package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +25 -34
- package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +9 -17
- package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +14 -14
- package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +6 -6
- package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +129 -128
- package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +6 -15
- package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +7 -6
- package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +5 -4
- package/dist/plot/scatter-3d/index.d.ts +4 -0
- package/dist/plot/scatter-3d/index.js +4 -0
- package/dist/plot/sunburst/Sunburst.svelte +1041 -0
- package/dist/plot/sunburst/Sunburst.svelte.d.ts +97 -0
- package/dist/plot/sunburst/SunburstControls.svelte +200 -0
- package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
- package/dist/plot/sunburst/index.d.ts +4 -0
- package/dist/plot/sunburst/index.js +4 -0
- package/dist/plot/sunburst/render.d.ts +34 -0
- package/dist/plot/sunburst/render.js +122 -0
- package/dist/plot/sunburst/sunburst.d.ts +62 -0
- package/dist/plot/sunburst/sunburst.js +269 -0
- package/dist/rdf/RdfPlot.svelte +2 -1
- package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
- package/dist/rdf/calc-rdf.js +11 -24
- package/dist/sanitize.js +14 -3
- package/dist/scene/SceneCamera.svelte +62 -0
- package/dist/scene/SceneCamera.svelte.d.ts +19 -0
- package/dist/scene/bind-renderer.svelte.d.ts +2 -0
- package/dist/scene/bind-renderer.svelte.js +14 -0
- package/dist/scene/index.d.ts +4 -0
- package/dist/scene/index.js +5 -0
- package/dist/scene/props.js +52 -0
- package/dist/scene/types.d.ts +26 -0
- package/dist/scene/types.js +1 -0
- package/dist/settings.d.ts +79 -3
- package/dist/settings.js +321 -1
- package/dist/spectral/Bands.svelte +47 -36
- package/dist/spectral/Bands.svelte.d.ts +6 -6
- package/dist/spectral/BandsAndDos.svelte +23 -25
- package/dist/spectral/BrillouinBandsDos.svelte +42 -30
- package/dist/spectral/Dos.svelte +15 -23
- package/dist/spectral/Dos.svelte.d.ts +4 -3
- package/dist/spectral/helpers.d.ts +8 -6
- package/dist/spectral/helpers.js +137 -65
- package/dist/state.svelte.d.ts +0 -7
- package/dist/state.svelte.js +0 -6
- package/dist/structure/Arrow.svelte +2 -4
- package/dist/structure/AtomLegend.svelte +8 -9
- package/dist/structure/AtomLegend.svelte.d.ts +1 -1
- package/dist/structure/CanvasTooltip.svelte +1 -0
- package/dist/structure/CellSelect.svelte +12 -5
- package/dist/structure/CellSelect.svelte.d.ts +2 -1
- package/dist/structure/Cylinder.svelte +12 -8
- package/dist/structure/Cylinder.svelte.d.ts +4 -1
- package/dist/structure/Lattice.svelte +2 -2
- package/dist/structure/Structure.svelte +365 -423
- package/dist/structure/Structure.svelte.d.ts +5 -15
- package/dist/structure/StructureControls.svelte +217 -2
- package/dist/structure/StructureControls.svelte.d.ts +5 -3
- package/dist/structure/StructureExportPane.svelte +54 -156
- package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
- package/dist/structure/StructureInfoPane.svelte +10 -9
- package/dist/structure/StructureInfoPane.svelte.d.ts +5 -5
- package/dist/structure/StructureScene.svelte +376 -208
- package/dist/structure/StructureScene.svelte.d.ts +22 -20
- package/dist/structure/{label-placement.d.ts → atom-label-placement.d.ts} +3 -3
- package/dist/structure/{label-placement.js → atom-label-placement.js} +15 -5
- package/dist/structure/atom-properties.d.ts +1 -1
- package/dist/structure/atom-properties.js +17 -22
- package/dist/structure/bond-order-perception.js +3 -5
- package/dist/structure/bonding.d.ts +4 -0
- package/dist/structure/bonding.js +134 -63
- package/dist/structure/export.d.ts +24 -4
- package/dist/structure/export.js +89 -143
- package/dist/structure/index.d.ts +4 -4
- package/dist/structure/index.js +3 -3
- package/dist/structure/measure.d.ts +3 -2
- package/dist/structure/measure.js +6 -5
- package/dist/structure/parse.d.ts +3 -2
- package/dist/structure/parse.js +419 -438
- package/dist/structure/partial-occupancy.d.ts +0 -1
- package/dist/structure/partial-occupancy.js +1 -1
- package/dist/structure/pbc.d.ts +1 -1
- package/dist/structure/pbc.js +190 -13
- package/dist/structure/polyhedra.d.ts +41 -0
- package/dist/structure/polyhedra.js +602 -0
- package/dist/structure/site.d.ts +4 -0
- package/dist/structure/site.js +1 -0
- package/dist/structure/supercell.js +3 -2
- package/dist/structure/validation.js +5 -6
- package/dist/symmetry/SymmetryElementControls.svelte +69 -0
- package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
- package/dist/symmetry/SymmetryElements.svelte +354 -0
- package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
- package/dist/symmetry/SymmetryStats.svelte +113 -8
- package/dist/symmetry/WyckoffTable.svelte +68 -7
- package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
- package/dist/symmetry/cell-transform.js +7 -14
- package/dist/symmetry/index.d.ts +14 -4
- package/dist/symmetry/index.js +291 -72
- package/dist/symmetry/spacegroups.d.ts +12 -1
- package/dist/symmetry/spacegroups.js +63 -14
- package/dist/symmetry/symmetry-elements.d.ts +33 -0
- package/dist/symmetry/symmetry-elements.js +521 -0
- package/dist/symmetry/wyckoff-db.d.ts +9 -0
- package/dist/symmetry/wyckoff-db.js +87 -0
- package/dist/table/HeatmapTable.svelte +66 -25
- package/dist/table/HeatmapTable.svelte.d.ts +1 -1
- package/dist/table/index.d.ts +1 -3
- package/dist/table/index.js +1 -1
- package/dist/theme/index.js +8 -8
- package/dist/tooltip/KCoords.svelte +45 -0
- package/dist/tooltip/KCoords.svelte.d.ts +8 -0
- package/dist/tooltip/index.d.ts +1 -0
- package/dist/tooltip/index.js +1 -0
- package/dist/trajectory/Trajectory.svelte +123 -100
- package/dist/trajectory/Trajectory.svelte.d.ts +11 -22
- package/dist/trajectory/TrajectoryExportPane.svelte +17 -25
- package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
- package/dist/trajectory/TrajectoryInfoPane.svelte +5 -3
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
- package/dist/trajectory/constants.js +6 -2
- package/dist/trajectory/extract.js +17 -37
- package/dist/trajectory/format-detect.d.ts +1 -1
- package/dist/trajectory/format-detect.js +27 -19
- package/dist/trajectory/frame-reader.d.ts +0 -1
- package/dist/trajectory/frame-reader.js +63 -162
- package/dist/trajectory/helpers.d.ts +10 -2
- package/dist/trajectory/helpers.js +56 -36
- package/dist/trajectory/index.js +1 -1
- package/dist/trajectory/parse/ase.d.ts +9 -1
- package/dist/trajectory/parse/ase.js +47 -32
- package/dist/trajectory/parse/diagnostics.d.ts +3 -0
- package/dist/trajectory/parse/diagnostics.js +14 -0
- package/dist/trajectory/parse/hdf5.js +1 -1
- package/dist/trajectory/parse/index.d.ts +1 -1
- package/dist/trajectory/parse/index.js +65 -105
- package/dist/trajectory/parse/lammps.d.ts +0 -2
- package/dist/trajectory/parse/lammps.js +8 -6
- package/dist/trajectory/parse/pymatgen.d.ts +2 -0
- package/dist/trajectory/parse/pymatgen.js +74 -0
- package/dist/trajectory/parse/vasp.js +38 -18
- package/dist/trajectory/parse/xyz.d.ts +13 -1
- package/dist/trajectory/parse/xyz.js +102 -94
- package/dist/trajectory/plotting.d.ts +1 -2
- package/dist/trajectory/plotting.js +16 -113
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +7 -5
- package/dist/xrd/XrdPlot.svelte +16 -30
- package/dist/xrd/broadening.d.ts +2 -1
- package/dist/xrd/calc-xrd.js +18 -20
- package/dist/xrd/index.d.ts +2 -2
- package/dist/xrd/parse.js +2 -2
- package/package.json +43 -26
- package/dist/element/data.json +0 -11864
- package/dist/fermi-surface/marching-cubes.d.ts +0 -2
- package/dist/fermi-surface/marching-cubes.js +0 -2
- package/dist/plot/PlotControls.svelte.d.ts +0 -4
- package/dist/plot/axis-utils.d.ts +0 -19
- package/dist/plot/axis-utils.js +0 -78
- package/dist/plot/defaults.d.ts +0 -19
- package/dist/plot/defaults.js +0 -9
- package/dist/plot/fill-utils.d.ts +0 -46
- package/dist/plot/fill-utils.js +0 -322
- package/dist/plot/hover-lock.svelte.d.ts +0 -14
- package/dist/plot/hover-lock.svelte.js +0 -46
- package/dist/plot/interactions.d.ts +0 -12
- package/dist/plot/interactions.js +0 -101
- package/dist/plot/scales.d.ts +0 -48
- package/dist/plot/svg.d.ts +0 -1
- package/dist/plot/svg.js +0 -11
- package/dist/plot/utils/series-visibility.d.ts +0 -15
- package/dist/plot/utils.d.ts +0 -1
- package/dist/plot/utils.js +0 -14
- /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
- /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<!-- Legend + per-kind visibility toggles for symmetry-element overlays. Renders one
|
|
2
|
+
checkbox per element kind present in `elements`, with a color swatch matching the
|
|
3
|
+
overlay render colors and the element count. Bind `show_kinds` and pass it through to
|
|
4
|
+
SymmetryElements (via symmetry_elements_props on the structure viewer). -->
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import type { ShowSymmetryKinds, SymmetryElement } from './symmetry-elements'
|
|
7
|
+
import {
|
|
8
|
+
count_symmetry_elements,
|
|
9
|
+
DEFAULT_SHOW_SYM_KINDS,
|
|
10
|
+
SYM_ELEM_KIND_INFO,
|
|
11
|
+
SYM_ELEM_KINDS,
|
|
12
|
+
} from './symmetry-elements'
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
elements = [],
|
|
16
|
+
show_kinds = $bindable({ ...DEFAULT_SHOW_SYM_KINDS }),
|
|
17
|
+
...rest
|
|
18
|
+
}: {
|
|
19
|
+
elements?: SymmetryElement[]
|
|
20
|
+
show_kinds?: ShowSymmetryKinds
|
|
21
|
+
[key: string]: unknown
|
|
22
|
+
} = $props()
|
|
23
|
+
|
|
24
|
+
const counts = $derived(count_symmetry_elements(elements))
|
|
25
|
+
const present_kinds = $derived(SYM_ELEM_KINDS.filter((kind) => counts[kind]))
|
|
26
|
+
|
|
27
|
+
function toggle_kind(kind: (typeof SYM_ELEM_KINDS)[number], checked: boolean) {
|
|
28
|
+
// Reassign (not mutate) so bound parents always see the change
|
|
29
|
+
show_kinds = { ...show_kinds, [kind]: checked }
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
{#if present_kinds.length > 0}
|
|
34
|
+
<div class="sym-elem-controls" {...rest}>
|
|
35
|
+
{#each present_kinds as kind (kind)}
|
|
36
|
+
<label>
|
|
37
|
+
<input
|
|
38
|
+
type="checkbox"
|
|
39
|
+
checked={show_kinds[kind] ?? false}
|
|
40
|
+
onchange={(evt) => toggle_kind(kind, evt.currentTarget.checked)}
|
|
41
|
+
/>
|
|
42
|
+
<span class="swatch" style:background={SYM_ELEM_KIND_INFO[kind].color}></span>
|
|
43
|
+
{SYM_ELEM_KIND_INFO[kind].label} ({counts[kind]})
|
|
44
|
+
</label>
|
|
45
|
+
{/each}
|
|
46
|
+
</div>
|
|
47
|
+
{/if}
|
|
48
|
+
|
|
49
|
+
<style>
|
|
50
|
+
.sym-elem-controls {
|
|
51
|
+
display: flex;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
gap: 3pt;
|
|
54
|
+
}
|
|
55
|
+
label {
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
gap: 6pt;
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
font-size: 0.95em;
|
|
61
|
+
}
|
|
62
|
+
.swatch {
|
|
63
|
+
width: 0.9em;
|
|
64
|
+
height: 0.9em;
|
|
65
|
+
border-radius: 2px;
|
|
66
|
+
border: 1px solid var(--border-color, #ccc);
|
|
67
|
+
flex-shrink: 0;
|
|
68
|
+
}
|
|
69
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ShowSymmetryKinds, SymmetryElement } from './symmetry-elements';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
elements?: SymmetryElement[];
|
|
4
|
+
show_kinds?: ShowSymmetryKinds;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
};
|
|
7
|
+
declare const SymmetryElementControls: import("svelte").Component<$$ComponentProps, {}, "show_kinds">;
|
|
8
|
+
type SymmetryElementControls = ReturnType<typeof SymmetryElementControls>;
|
|
9
|
+
export default SymmetryElementControls;
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
<!-- Render crystallographic symmetry elements (rotation/screw axes, mirror/glide
|
|
2
|
+
planes, inversion centers, rotoinversion axes) inside a Threlte scene. Elements come
|
|
3
|
+
from symmetry_elements_from_ops and are expressed in fractional coordinates of the cell
|
|
4
|
+
described by `lattice` — make sure both refer to the SAME cell (moyo operations are in
|
|
5
|
+
the input-cell frame, so pass the original structure's lattice).
|
|
6
|
+
|
|
7
|
+
Visual conventions (loosely following ITA diagram conventions: translation-carrying
|
|
8
|
+
elements are dashed/striped):
|
|
9
|
+
- rotation axes: solid cylinders, colored by order
|
|
10
|
+
- screw axes: DASHED cylinders (short dashes, gaps narrower than dashes; same order
|
|
11
|
+
colors, slightly thinner)
|
|
12
|
+
- mirror planes: solid translucent fills with opaque outlines
|
|
13
|
+
- glide planes: STRIPED translucent fills (stripes run along the glide-translation
|
|
14
|
+
direction) with opaque outlines
|
|
15
|
+
- inversion centers / rotoinversion markers: small faceted octahedra — themselves
|
|
16
|
+
centrosymmetric, and clearly distinct from the smooth spheres used for atoms
|
|
17
|
+
|
|
18
|
+
For performance, geometries are merged per material group (one draw call per distinct
|
|
19
|
+
color/opacity instead of one mesh per element) and disposed on change/unmount. -->
|
|
20
|
+
<script lang="ts">
|
|
21
|
+
import type { Matrix3x3, Vec2, Vec3 } from '../math'
|
|
22
|
+
import * as math from '../math'
|
|
23
|
+
import type { ShowSymmetryKinds, SymmetryElement } from './symmetry-elements'
|
|
24
|
+
import {
|
|
25
|
+
clip_line_to_cell,
|
|
26
|
+
clip_plane_to_cell,
|
|
27
|
+
dash_segments,
|
|
28
|
+
DEFAULT_SHOW_SYM_KINDS,
|
|
29
|
+
frac_to_cart_direction,
|
|
30
|
+
} from './symmetry-elements'
|
|
31
|
+
import { T } from '@threlte/core'
|
|
32
|
+
import {
|
|
33
|
+
BufferAttribute,
|
|
34
|
+
BufferGeometry,
|
|
35
|
+
ClampToEdgeWrapping,
|
|
36
|
+
CylinderGeometry,
|
|
37
|
+
DataTexture,
|
|
38
|
+
DoubleSide,
|
|
39
|
+
LinearFilter,
|
|
40
|
+
Matrix4,
|
|
41
|
+
OctahedronGeometry,
|
|
42
|
+
Quaternion,
|
|
43
|
+
RepeatWrapping,
|
|
44
|
+
RGBAFormat,
|
|
45
|
+
Vector3,
|
|
46
|
+
} from 'three'
|
|
47
|
+
import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js'
|
|
48
|
+
|
|
49
|
+
let {
|
|
50
|
+
elements = [],
|
|
51
|
+
lattice,
|
|
52
|
+
// Per-kind visibility. Defaults to rotation axes ONLY: drawing every kind at once
|
|
53
|
+
// buries the structure under overlays for high-symmetry cells. Toggle additional
|
|
54
|
+
// kinds individually (e.g. via SymmetryElementControls).
|
|
55
|
+
show_kinds = DEFAULT_SHOW_SYM_KINDS,
|
|
56
|
+
// hide 2-fold axes that are sub-elements of higher-order axes on the same line
|
|
57
|
+
hide_redundant_axes = true,
|
|
58
|
+
axis_radius = 0.04,
|
|
59
|
+
screw_radius = 0.03,
|
|
60
|
+
// [dash, gap] in Å for dashed screw axes — gap narrower than dash so the line
|
|
61
|
+
// reads as continuous-but-broken rather than sparse
|
|
62
|
+
screw_dash = [0.25, 0.1] as Vec2,
|
|
63
|
+
inversion_radius = 0.12,
|
|
64
|
+
plane_opacity = 0.2,
|
|
65
|
+
glide_opacity = 0.15,
|
|
66
|
+
// opaque polygon outlines make overlapping translucent planes legible
|
|
67
|
+
show_plane_edges = true,
|
|
68
|
+
plane_edge_opacity = 0.9,
|
|
69
|
+
// stripe period in Å for glide-plane fills (stripes run along the glide direction)
|
|
70
|
+
glide_stripe_period = 0.7,
|
|
71
|
+
axis_colors = { 2: `#e63946`, 3: `#2a9d8f`, 4: `#3a6fb0`, 6: `#9c27b0` },
|
|
72
|
+
mirror_color = `#ffb703`,
|
|
73
|
+
glide_color = `#8ecae6`,
|
|
74
|
+
inversion_color = `#555555`,
|
|
75
|
+
}: {
|
|
76
|
+
elements?: SymmetryElement[]
|
|
77
|
+
lattice: Matrix3x3
|
|
78
|
+
show_kinds?: ShowSymmetryKinds
|
|
79
|
+
hide_redundant_axes?: boolean
|
|
80
|
+
axis_radius?: number
|
|
81
|
+
screw_radius?: number
|
|
82
|
+
screw_dash?: Vec2
|
|
83
|
+
inversion_radius?: number
|
|
84
|
+
plane_opacity?: number
|
|
85
|
+
glide_opacity?: number
|
|
86
|
+
show_plane_edges?: boolean
|
|
87
|
+
plane_edge_opacity?: number
|
|
88
|
+
glide_stripe_period?: number
|
|
89
|
+
axis_colors?: Record<number, string>
|
|
90
|
+
mirror_color?: string
|
|
91
|
+
glide_color?: string
|
|
92
|
+
inversion_color?: string
|
|
93
|
+
} = $props()
|
|
94
|
+
|
|
95
|
+
const UP = new Vector3(0, 1, 0)
|
|
96
|
+
const UNIT_SCALE = new Vector3(1, 1, 1)
|
|
97
|
+
|
|
98
|
+
// 1D stripe alpha texture for glide fills (three.js alphaMap samples the GREEN
|
|
99
|
+
// channel): ~55% full-alpha stripe, ~45% faint background so the plane stays
|
|
100
|
+
// contiguous between stripes. Repeats along U; V is constant.
|
|
101
|
+
const stripe_texture = (() => {
|
|
102
|
+
const width = 16
|
|
103
|
+
const data = new Uint8Array(width * 4)
|
|
104
|
+
for (let px = 0; px < width; px++) {
|
|
105
|
+
const val = px < 9 ? 255 : 56
|
|
106
|
+
data.set([val, val, val, 255], px * 4)
|
|
107
|
+
}
|
|
108
|
+
const tex = new DataTexture(data, width, 1, RGBAFormat)
|
|
109
|
+
tex.wrapS = RepeatWrapping
|
|
110
|
+
tex.wrapT = ClampToEdgeWrapping
|
|
111
|
+
tex.magFilter = LinearFilter
|
|
112
|
+
tex.minFilter = LinearFilter
|
|
113
|
+
tex.needsUpdate = true
|
|
114
|
+
return tex
|
|
115
|
+
})()
|
|
116
|
+
|
|
117
|
+
// Key identifying the geometric line of an axis element (direction + intercept)
|
|
118
|
+
const line_key = (elem: SymmetryElement): string => {
|
|
119
|
+
const axis = elem.axis
|
|
120
|
+
if (!axis) return ``
|
|
121
|
+
const lambda = math.dot(elem.point, axis) / math.dot(axis, axis)
|
|
122
|
+
const intercept = elem.point.map((val, idx) => val - lambda * axis[idx])
|
|
123
|
+
return `${axis.join(`,`)}|${intercept.map((val) => val.toFixed(4)).join(`,`)}`
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
type MaterialGroup = {
|
|
127
|
+
geometry: BufferGeometry
|
|
128
|
+
color: string
|
|
129
|
+
opacity?: number
|
|
130
|
+
striped?: boolean
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Cylinder of given radius/length centered at `center` pointing along unit `dir`
|
|
134
|
+
const oriented_cylinder = (
|
|
135
|
+
center: Vector3,
|
|
136
|
+
dir_unit: Vector3,
|
|
137
|
+
radius: number,
|
|
138
|
+
length: number,
|
|
139
|
+
): CylinderGeometry =>
|
|
140
|
+
new CylinderGeometry(radius, radius, length, 12).applyMatrix4(
|
|
141
|
+
new Matrix4().compose(
|
|
142
|
+
center,
|
|
143
|
+
new Quaternion().setFromUnitVectors(UP, dir_unit),
|
|
144
|
+
UNIT_SCALE,
|
|
145
|
+
),
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
// Axes (cylinders) + rotoinversion center markers (spheres), merged per color/radius.
|
|
149
|
+
// Pure rotations render solid; screw axes render DASHED so the two are
|
|
150
|
+
// distinguishable at a glance (translation-carrying elements are dashed, as in ITA
|
|
151
|
+
// diagrams).
|
|
152
|
+
const axis_groups: MaterialGroup[] = $derived.by(() => {
|
|
153
|
+
const axis_elements = elements.filter(
|
|
154
|
+
(elem) =>
|
|
155
|
+
(elem.kind === `rotation` || elem.kind === `screw` ||
|
|
156
|
+
elem.kind === `rotoinversion`) &&
|
|
157
|
+
show_kinds[elem.kind] && elem.axis,
|
|
158
|
+
)
|
|
159
|
+
// Drop 2-fold axes coincident with a higher-order axis (4 contains 2, 6 contains
|
|
160
|
+
// 2 and 3, -4 contains 2, …) to reduce visual clutter. Computed over the VISIBLE
|
|
161
|
+
// elements only, so 2-folds reappear when their enclosing higher-order kind is
|
|
162
|
+
// toggled off.
|
|
163
|
+
const max_order_by_line = new Map<string, number>()
|
|
164
|
+
for (const elem of axis_elements) {
|
|
165
|
+
const key = line_key(elem)
|
|
166
|
+
max_order_by_line.set(key, Math.max(max_order_by_line.get(key) ?? 0, elem.order))
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const parts_by_group = new Map<string, BufferGeometry[]>()
|
|
170
|
+
for (const elem of axis_elements) {
|
|
171
|
+
if (
|
|
172
|
+
hide_redundant_axes && elem.order < (max_order_by_line.get(line_key(elem)) ?? 0)
|
|
173
|
+
) continue
|
|
174
|
+
const clipped = clip_line_to_cell(elem.point, elem.axis as Vec3, lattice)
|
|
175
|
+
if (!clipped) continue
|
|
176
|
+
const [start, end] = clipped
|
|
177
|
+
const span = new Vector3(...math.subtract(end, start))
|
|
178
|
+
const length = span.length()
|
|
179
|
+
if (length < 1e-6) continue
|
|
180
|
+
const dir_unit = span.clone().normalize()
|
|
181
|
+
const start_vec = new Vector3(...start)
|
|
182
|
+
|
|
183
|
+
// Radius is baked into each geometry, so one merged group per color suffices
|
|
184
|
+
const color = axis_colors[elem.order] ?? `#777777`
|
|
185
|
+
const group = parts_by_group.get(color) ?? []
|
|
186
|
+
|
|
187
|
+
if (elem.kind === `screw`) {
|
|
188
|
+
// Dashed cylinder: segments along the axis, touching both cell faces
|
|
189
|
+
for (const dash of dash_segments(length, screw_dash[0], screw_dash[1])) {
|
|
190
|
+
const center = start_vec.clone().addScaledVector(dir_unit, dash.center)
|
|
191
|
+
group.push(oriented_cylinder(center, dir_unit, screw_radius, dash.length))
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
const center = start_vec.clone().addScaledVector(dir_unit, length / 2)
|
|
195
|
+
group.push(oriented_cylinder(center, dir_unit, axis_radius, length))
|
|
196
|
+
}
|
|
197
|
+
if (elem.kind === `rotoinversion`) {
|
|
198
|
+
const [cx, cy, cz] = frac_to_cart_direction(elem.point, lattice)
|
|
199
|
+
group.push(new OctahedronGeometry(inversion_radius * 0.8).translate(cx, cy, cz))
|
|
200
|
+
}
|
|
201
|
+
parts_by_group.set(color, group)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return [...parts_by_group.entries()].flatMap(([color, geometries]) => {
|
|
205
|
+
const merged = mergeGeometries(geometries)
|
|
206
|
+
geometries.forEach((geo) => geo.dispose())
|
|
207
|
+
return merged ? [{ geometry: merged, color }] : []
|
|
208
|
+
})
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
// Visible mirror/glide planes clipped to the cell — computed once, shared by the
|
|
212
|
+
// fill and outline groups below. stripe_dir is the unit Cartesian glide direction
|
|
213
|
+
// (null for mirrors and translation-less entries).
|
|
214
|
+
const visible_planes = $derived.by(() => {
|
|
215
|
+
const planes: {
|
|
216
|
+
polygon: Vec3[]
|
|
217
|
+
color: string
|
|
218
|
+
opacity: number
|
|
219
|
+
stripe_dir: Vec3 | null
|
|
220
|
+
}[] = []
|
|
221
|
+
for (const elem of elements) {
|
|
222
|
+
if ((elem.kind !== `mirror` && elem.kind !== `glide`) || !elem.axis) continue
|
|
223
|
+
if (!show_kinds[elem.kind]) continue
|
|
224
|
+
const polygon = clip_plane_to_cell(elem.point, elem.axis, lattice)
|
|
225
|
+
if (polygon.length < 3) continue
|
|
226
|
+
const is_mirror = elem.kind === `mirror`
|
|
227
|
+
planes.push({
|
|
228
|
+
polygon,
|
|
229
|
+
color: is_mirror ? mirror_color : glide_color,
|
|
230
|
+
opacity: is_mirror ? plane_opacity : glide_opacity,
|
|
231
|
+
stripe_dir: elem.translation
|
|
232
|
+
? math.normalize_vec(frac_to_cart_direction(elem.translation, lattice))
|
|
233
|
+
: null,
|
|
234
|
+
})
|
|
235
|
+
}
|
|
236
|
+
return planes
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
// Plane FILLS: triangles concatenated per color+opacity into one geometry. Glide
|
|
240
|
+
// fills carry per-vertex UVs whose U coordinate measures Cartesian distance along
|
|
241
|
+
// the glide-translation direction, so the stripe alphaMap renders stripes running
|
|
242
|
+
// along the glide direction — the pattern shows both that the plane glides and
|
|
243
|
+
// where it translates.
|
|
244
|
+
const plane_groups: MaterialGroup[] = $derived.by(() => {
|
|
245
|
+
const groups = new Map<string, { positions: number[]; uvs: number[] }>()
|
|
246
|
+
for (const { polygon, color, opacity, stripe_dir } of visible_planes) {
|
|
247
|
+
const group_key = `${color}|${opacity}|${stripe_dir ? 1 : 0}`
|
|
248
|
+
const group = groups.get(group_key) ?? { positions: [], uvs: [] }
|
|
249
|
+
// Stripe coordinate: Cartesian distance along the glide direction / period
|
|
250
|
+
const stripe_u = (vert: Vec3): number =>
|
|
251
|
+
stripe_dir ? math.dot(vert, stripe_dir) / glide_stripe_period : 0
|
|
252
|
+
// Fan triangulation of the convex polygon
|
|
253
|
+
for (let idx = 1; idx < polygon.length - 1; idx++) {
|
|
254
|
+
for (const vert of [polygon[0], polygon[idx], polygon[idx + 1]]) {
|
|
255
|
+
group.positions.push(...vert)
|
|
256
|
+
group.uvs.push(stripe_u(vert), 0.5)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
groups.set(group_key, group)
|
|
260
|
+
}
|
|
261
|
+
return [...groups.entries()].map(([group_key, { positions, uvs }]) => {
|
|
262
|
+
const geometry = new BufferGeometry()
|
|
263
|
+
geometry.setAttribute(`position`, new BufferAttribute(new Float32Array(positions), 3))
|
|
264
|
+
geometry.setAttribute(`uv`, new BufferAttribute(new Float32Array(uvs), 2))
|
|
265
|
+
geometry.computeVertexNormals()
|
|
266
|
+
const [color, opacity, striped] = group_key.split(`|`)
|
|
267
|
+
return { geometry, color, opacity: Number(opacity), striped: striped === `1` }
|
|
268
|
+
})
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
// Opaque plane OUTLINES (line segments per color): crisp borders keep overlapping
|
|
272
|
+
// translucent planes individually legible instead of blending into a single wash.
|
|
273
|
+
const plane_edge_groups: MaterialGroup[] = $derived.by(() => {
|
|
274
|
+
if (!show_plane_edges) return []
|
|
275
|
+
const segments_by_color = new Map<string, number[]>()
|
|
276
|
+
for (const { polygon, color } of visible_planes) {
|
|
277
|
+
const positions = segments_by_color.get(color) ?? []
|
|
278
|
+
for (let idx = 0; idx < polygon.length; idx++) {
|
|
279
|
+
positions.push(...polygon[idx], ...polygon[(idx + 1) % polygon.length])
|
|
280
|
+
}
|
|
281
|
+
segments_by_color.set(color, positions)
|
|
282
|
+
}
|
|
283
|
+
return [...segments_by_color.entries()].map(([color, positions]) => {
|
|
284
|
+
const geometry = new BufferGeometry()
|
|
285
|
+
geometry.setAttribute(`position`, new BufferAttribute(new Float32Array(positions), 3))
|
|
286
|
+
return { geometry, color }
|
|
287
|
+
})
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
// Inversion centers: faceted octahedra (centrosymmetric, unlike the smooth spheres
|
|
291
|
+
// used for atoms) merged into a single geometry
|
|
292
|
+
const inversion_group: MaterialGroup | null = $derived.by(() => {
|
|
293
|
+
if (!show_kinds.inversion) return null
|
|
294
|
+
const markers = elements
|
|
295
|
+
.filter((elem) => elem.kind === `inversion`)
|
|
296
|
+
.map((elem) => {
|
|
297
|
+
const [cx, cy, cz] = frac_to_cart_direction(elem.point, lattice)
|
|
298
|
+
return new OctahedronGeometry(inversion_radius).translate(cx, cy, cz)
|
|
299
|
+
})
|
|
300
|
+
if (markers.length === 0) return null
|
|
301
|
+
const merged = mergeGeometries(markers)
|
|
302
|
+
markers.forEach((geo) => geo.dispose())
|
|
303
|
+
return merged ? { geometry: merged, color: inversion_color } : null
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
// Dispose each group's merged geometries when that group recomputes or on unmount. One
|
|
307
|
+
// $effect per group (rather than a single combined one): the deriveds recompute
|
|
308
|
+
// independently — e.g. tweaking a plane-only prop rebuilds plane_groups but not
|
|
309
|
+
// axis_groups — and a combined effect would dispose the still-mounted axis geometry.
|
|
310
|
+
const dispose_geometries = (groups: { geometry: BufferGeometry }[]) => () =>
|
|
311
|
+
groups.forEach((group) => group.geometry.dispose())
|
|
312
|
+
$effect(() => dispose_geometries(axis_groups))
|
|
313
|
+
$effect(() => dispose_geometries(plane_groups))
|
|
314
|
+
$effect(() => dispose_geometries(plane_edge_groups))
|
|
315
|
+
$effect(() => dispose_geometries(inversion_group ? [inversion_group] : []))
|
|
316
|
+
|
|
317
|
+
// Dispose the (non-reactive) stripe texture on unmount
|
|
318
|
+
$effect(() => () => stripe_texture.dispose())
|
|
319
|
+
</script>
|
|
320
|
+
|
|
321
|
+
{#each axis_groups as group, idx (idx)}
|
|
322
|
+
<T.Mesh geometry={group.geometry}>
|
|
323
|
+
<T.MeshStandardMaterial color={group.color} />
|
|
324
|
+
</T.Mesh>
|
|
325
|
+
{/each}
|
|
326
|
+
|
|
327
|
+
{#each plane_groups as group, idx (idx)}
|
|
328
|
+
<T.Mesh geometry={group.geometry}>
|
|
329
|
+
<T.MeshStandardMaterial
|
|
330
|
+
color={group.color}
|
|
331
|
+
transparent
|
|
332
|
+
opacity={group.opacity}
|
|
333
|
+
alphaMap={group.striped ? stripe_texture : null}
|
|
334
|
+
side={DoubleSide}
|
|
335
|
+
depthWrite={false}
|
|
336
|
+
/>
|
|
337
|
+
</T.Mesh>
|
|
338
|
+
{/each}
|
|
339
|
+
|
|
340
|
+
{#each plane_edge_groups as group, idx (idx)}
|
|
341
|
+
<T.LineSegments geometry={group.geometry}>
|
|
342
|
+
<T.LineBasicMaterial
|
|
343
|
+
color={group.color}
|
|
344
|
+
transparent={plane_edge_opacity < 1}
|
|
345
|
+
opacity={plane_edge_opacity}
|
|
346
|
+
/>
|
|
347
|
+
</T.LineSegments>
|
|
348
|
+
{/each}
|
|
349
|
+
|
|
350
|
+
{#if inversion_group}
|
|
351
|
+
<T.Mesh geometry={inversion_group.geometry}>
|
|
352
|
+
<T.MeshStandardMaterial color={inversion_group.color} />
|
|
353
|
+
</T.Mesh>
|
|
354
|
+
{/if}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Matrix3x3, Vec2 } from '../math';
|
|
2
|
+
import type { ShowSymmetryKinds, SymmetryElement } from './symmetry-elements';
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
elements?: SymmetryElement[];
|
|
5
|
+
lattice: Matrix3x3;
|
|
6
|
+
show_kinds?: ShowSymmetryKinds;
|
|
7
|
+
hide_redundant_axes?: boolean;
|
|
8
|
+
axis_radius?: number;
|
|
9
|
+
screw_radius?: number;
|
|
10
|
+
screw_dash?: Vec2;
|
|
11
|
+
inversion_radius?: number;
|
|
12
|
+
plane_opacity?: number;
|
|
13
|
+
glide_opacity?: number;
|
|
14
|
+
show_plane_edges?: boolean;
|
|
15
|
+
plane_edge_opacity?: number;
|
|
16
|
+
glide_stripe_period?: number;
|
|
17
|
+
axis_colors?: Record<number, string>;
|
|
18
|
+
mirror_color?: string;
|
|
19
|
+
glide_color?: string;
|
|
20
|
+
inversion_color?: string;
|
|
21
|
+
};
|
|
22
|
+
declare const SymmetryElements: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
23
|
+
type SymmetryElements = ReturnType<typeof SymmetryElements>;
|
|
24
|
+
export default SymmetryElements;
|
|
@@ -5,7 +5,15 @@
|
|
|
5
5
|
import type { HTMLAttributes } from 'svelte/elements'
|
|
6
6
|
import { SETTINGS_CONFIG } from '../settings'
|
|
7
7
|
import type { SymmetrySettings } from './index'
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
count_structure_free_params,
|
|
10
|
+
default_sym_settings,
|
|
11
|
+
enrich_wyckoff_rows,
|
|
12
|
+
spacegroup_settings,
|
|
13
|
+
spacegroup_wyckoff_positions,
|
|
14
|
+
wyckoff_positions_from_moyo,
|
|
15
|
+
wyckoff_sequence,
|
|
16
|
+
} from './index'
|
|
9
17
|
import * as spg from './spacegroups'
|
|
10
18
|
|
|
11
19
|
type SymmetrySnippet = Snippet<
|
|
@@ -29,10 +37,35 @@
|
|
|
29
37
|
header?: SymmetrySnippet
|
|
30
38
|
} = $props()
|
|
31
39
|
|
|
32
|
-
|
|
33
|
-
|
|
40
|
+
// Space-group Wyckoff database + all settings (empty when WASM is not initialized,
|
|
41
|
+
// e.g. SSR or unit tests — the stats below degrade gracefully)
|
|
42
|
+
const wyckoff_db = $derived(
|
|
43
|
+
sym_data ? spacegroup_wyckoff_positions(sym_data.hall_number) : [],
|
|
34
44
|
)
|
|
35
|
-
const
|
|
45
|
+
const settings_entries = $derived(sym_data ? spacegroup_settings(sym_data.number) : [])
|
|
46
|
+
const current_setting = $derived(
|
|
47
|
+
settings_entries.find((entry) => entry.hall_number === sym_data?.hall_number),
|
|
48
|
+
)
|
|
49
|
+
const occupied_rows = $derived(
|
|
50
|
+
sym_data ? enrich_wyckoff_rows(wyckoff_positions_from_moyo(sym_data), wyckoff_db) : [],
|
|
51
|
+
)
|
|
52
|
+
const wyckoff_count = $derived(occupied_rows.length)
|
|
53
|
+
const wyckoff_seq = $derived(wyckoff_sequence(occupied_rows))
|
|
54
|
+
// Internal degrees of freedom (null when ITA coordinates are unavailable)
|
|
55
|
+
const free_params = $derived(count_structure_free_params(occupied_rows))
|
|
56
|
+
const display_hm_symbol = $derived(sym_data?.hm_symbol?.replaceAll(/\s+/g, ``) ?? `?`)
|
|
57
|
+
// Crystal system, plus the lattice system in parens when it differs (e.g. trigonal
|
|
58
|
+
// space groups split into rhombohedral R-centered and hexagonal P lattices)
|
|
59
|
+
const crystal_system_label = $derived.by(() => {
|
|
60
|
+
if (!sym_data) return `?`
|
|
61
|
+
const crystal_sys = spg.spacegroup_to_crystal_sys(sym_data.number)
|
|
62
|
+
const lattice_sys = spg.spacegroup_num_to_lattice_system(sym_data.number)
|
|
63
|
+
if (!crystal_sys) return `?`
|
|
64
|
+
const suffix = lattice_sys && lattice_sys !== crystal_sys
|
|
65
|
+
? ` (${lattice_sys} lattice)`
|
|
66
|
+
: ``
|
|
67
|
+
return `${crystal_sys}${suffix}`
|
|
68
|
+
})
|
|
36
69
|
|
|
37
70
|
const sym_ops_counts = $derived.by(() => {
|
|
38
71
|
const EPS = 1e-10
|
|
@@ -63,7 +96,7 @@
|
|
|
63
96
|
space_group:
|
|
64
97
|
`International Tables Space group number (1-230) - unique identifier for each space group. Higher numbers indicate more symmetries in the crystal.`,
|
|
65
98
|
crystal_system:
|
|
66
|
-
`Crystal system classification based on the unit cell symmetry. Seven systems: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, and cubic.`,
|
|
99
|
+
`Crystal system classification based on the unit cell symmetry. Seven systems: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, and cubic. For trigonal space groups, the lattice system (rhombohedral for R-centered groups, hexagonal otherwise) is shown in parentheses when it differs from the crystal system.`,
|
|
67
100
|
hermann_mauguin:
|
|
68
101
|
`Hermann-Mauguin symbol describes symmetry operations. Format: Lattice type + Point group symmetry. Example: P4/mmm = Primitive + 4-fold rotation + mirror planes`,
|
|
69
102
|
hall_number:
|
|
@@ -74,6 +107,12 @@
|
|
|
74
107
|
`Total symmetry operations that map the crystal structure onto itself. Includes rotations, translations, and combinations.`,
|
|
75
108
|
distinct_orbits:
|
|
76
109
|
`Number of unique Wyckoff positions (symmetry-equivalent atomic sites) in the crystal structure.`,
|
|
110
|
+
wyckoff_sequence:
|
|
111
|
+
`Wyckoff sequence: letters of all occupied Wyckoff positions in descending alphabetical order, with superscript counts for letters occupied by multiple orbits. A standard structure-type fingerprint (complements the Pearson symbol).`,
|
|
112
|
+
free_params:
|
|
113
|
+
`Internal degrees of freedom: number of free fractional-coordinate parameters (x, y, z in the ITA representative coordinates) summed over occupied Wyckoff orbits. 0 means all atomic positions are fully fixed by symmetry.`,
|
|
114
|
+
settings:
|
|
115
|
+
`All settings of this space group in the International Tables (origin choices, unique axes, cell choices, hexagonal vs rhombohedral axes). The setting detected for this structure is highlighted.`,
|
|
77
116
|
translations: `Number of translations in the crystal structure.`,
|
|
78
117
|
rotations: `Number of rotations in the crystal structure.`,
|
|
79
118
|
roto_translations: `Number of roto-translations in the crystal structure.`,
|
|
@@ -83,7 +122,7 @@
|
|
|
83
122
|
function get_step_from_order_of_magnitude(value: number): number {
|
|
84
123
|
if (!Number.isFinite(value) || value <= 0) return 1e-5
|
|
85
124
|
const exponent = Math.floor(Math.log10(value))
|
|
86
|
-
return
|
|
125
|
+
return 10 ** exponent
|
|
87
126
|
}
|
|
88
127
|
|
|
89
128
|
const symprec_step = $derived(get_step_from_order_of_magnitude(settings.symprec))
|
|
@@ -151,10 +190,14 @@
|
|
|
151
190
|
Space Group <strong>{sym_data.number} ({display_hm_symbol})</strong>
|
|
152
191
|
</div>
|
|
153
192
|
<div title={tooltips?.crystal_system} {@attach tooltip()}>
|
|
154
|
-
Crystal System <strong>{
|
|
193
|
+
Crystal System <strong>{crystal_system_label}</strong>
|
|
155
194
|
</div>
|
|
156
195
|
<div title={tooltips?.hall_number} {@attach tooltip()}>
|
|
157
|
-
Hall Number <strong>
|
|
196
|
+
Hall Number <strong>
|
|
197
|
+
{sym_data.hall_number}{
|
|
198
|
+
current_setting ? ` (${current_setting.hall_symbol})` : ``
|
|
199
|
+
}
|
|
200
|
+
</strong>
|
|
158
201
|
</div>
|
|
159
202
|
<div title={tooltips?.pearson_symbol} {@attach tooltip()}>
|
|
160
203
|
Pearson <strong>{sym_data.pearson_symbol}</strong>
|
|
@@ -162,6 +205,16 @@
|
|
|
162
205
|
<div title={tooltips?.distinct_orbits} {@attach tooltip()}>
|
|
163
206
|
Wyckoff Positions <strong>{wyckoff_count}</strong>
|
|
164
207
|
</div>
|
|
208
|
+
{#if wyckoff_seq}
|
|
209
|
+
<div title={tooltips?.wyckoff_sequence} {@attach tooltip()}>
|
|
210
|
+
Wyckoff Sequence <strong>{wyckoff_seq}</strong>
|
|
211
|
+
</div>
|
|
212
|
+
{/if}
|
|
213
|
+
{#if free_params !== null}
|
|
214
|
+
<div title={tooltips?.free_params} {@attach tooltip()}>
|
|
215
|
+
Free Parameters <strong>{free_params}</strong>
|
|
216
|
+
</div>
|
|
217
|
+
{/if}
|
|
165
218
|
<div
|
|
166
219
|
class="sym-ops-summary"
|
|
167
220
|
title="{sym_ops_counts.translations} translations + {sym_ops_counts.rotations} rotations + {sym_ops_counts.roto_translations} roto-translations"
|
|
@@ -173,6 +226,39 @@
|
|
|
173
226
|
}RT)
|
|
174
227
|
</div>
|
|
175
228
|
</div>
|
|
229
|
+
{#if settings_entries.length > 1}
|
|
230
|
+
<details class="settings-explorer">
|
|
231
|
+
<summary title={tooltips?.settings} {@attach tooltip()}>
|
|
232
|
+
{settings_entries.length} settings of space group {sym_data.number}
|
|
233
|
+
</summary>
|
|
234
|
+
<table>
|
|
235
|
+
<thead>
|
|
236
|
+
<tr>
|
|
237
|
+
<th>Hall #</th>
|
|
238
|
+
<th>H-M full</th>
|
|
239
|
+
<th>Hall symbol</th>
|
|
240
|
+
<th>Setting</th>
|
|
241
|
+
<th>Centering</th>
|
|
242
|
+
</tr>
|
|
243
|
+
</thead>
|
|
244
|
+
<tbody>
|
|
245
|
+
{#each settings_entries as entry (entry.hall_number)}
|
|
246
|
+
{@const is_current = entry.hall_number === sym_data.hall_number}
|
|
247
|
+
<tr
|
|
248
|
+
class:current={is_current}
|
|
249
|
+
title={is_current ? `Setting detected for this structure` : null}
|
|
250
|
+
>
|
|
251
|
+
<td>{entry.hall_number}</td>
|
|
252
|
+
<td>{entry.hm_full}</td>
|
|
253
|
+
<td>{entry.hall_symbol}</td>
|
|
254
|
+
<td>{entry.setting || `—`}</td>
|
|
255
|
+
<td>{entry.centering}</td>
|
|
256
|
+
</tr>
|
|
257
|
+
{/each}
|
|
258
|
+
</tbody>
|
|
259
|
+
</table>
|
|
260
|
+
</details>
|
|
261
|
+
{/if}
|
|
176
262
|
{:else}
|
|
177
263
|
<div class="no-data">
|
|
178
264
|
<p>No symmetry data available</p>
|
|
@@ -210,6 +296,25 @@
|
|
|
210
296
|
.stats-grid strong {
|
|
211
297
|
margin: var(--sym-stats-strong-margin, 0 0 0 3pt);
|
|
212
298
|
}
|
|
299
|
+
.settings-explorer {
|
|
300
|
+
margin-block: var(--sym-stats-grid-margin-block, 1ex);
|
|
301
|
+
}
|
|
302
|
+
.settings-explorer summary {
|
|
303
|
+
cursor: pointer;
|
|
304
|
+
color: var(--text-muted, #666);
|
|
305
|
+
}
|
|
306
|
+
.settings-explorer table {
|
|
307
|
+
margin-top: 1ex;
|
|
308
|
+
border-collapse: collapse;
|
|
309
|
+
}
|
|
310
|
+
.settings-explorer :is(th, td) {
|
|
311
|
+
padding: 1px 8px;
|
|
312
|
+
text-align: left;
|
|
313
|
+
}
|
|
314
|
+
.settings-explorer tr.current {
|
|
315
|
+
background: color-mix(in srgb, var(--accent-color, #0066cc) 18%, transparent);
|
|
316
|
+
font-weight: bold;
|
|
317
|
+
}
|
|
213
318
|
.no-data {
|
|
214
319
|
display: flex;
|
|
215
320
|
align-items: center;
|