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
package/dist/EmptyState.svelte
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
import type { Snippet } from 'svelte'
|
|
3
3
|
import type { HTMLAttributes } from 'svelte/elements'
|
|
4
4
|
|
|
5
|
-
let {
|
|
5
|
+
let {
|
|
6
|
+
message,
|
|
7
|
+
children,
|
|
8
|
+
...rest
|
|
9
|
+
}: {
|
|
6
10
|
// Simple text message to display. Ignored if children snippet is provided.
|
|
7
11
|
message?: string
|
|
8
12
|
// Custom content to render. Takes precedence over message prop.
|
|
@@ -10,7 +14,7 @@
|
|
|
10
14
|
} & HTMLAttributes<HTMLDivElement> = $props()
|
|
11
15
|
</script>
|
|
12
16
|
|
|
13
|
-
<div {...rest} class=
|
|
17
|
+
<div {...rest} class={[`empty-state`, rest.class]}>
|
|
14
18
|
{#if children}
|
|
15
19
|
{@render children()}
|
|
16
20
|
{:else if message}
|
|
@@ -34,10 +38,12 @@
|
|
|
34
38
|
.empty-state :global(.status-message) {
|
|
35
39
|
--status-message-border: none; /* Remove inner border from StatusMessage */
|
|
36
40
|
}
|
|
37
|
-
.empty-state > :global(:is(p, h3, ul, strong)),
|
|
41
|
+
.empty-state > :global(:is(p, h3, ul, strong)),
|
|
42
|
+
.empty-state > .message {
|
|
38
43
|
max-width: var(--empty-state-max-width, 500px);
|
|
39
44
|
}
|
|
40
|
-
.empty-state :global(p),
|
|
45
|
+
.empty-state :global(p),
|
|
46
|
+
.empty-state > .message {
|
|
41
47
|
color: var(--text-color-muted);
|
|
42
48
|
margin: 0;
|
|
43
49
|
}
|
package/dist/FilePicker.svelte
CHANGED
|
@@ -56,12 +56,23 @@
|
|
|
56
56
|
// Timer for distinguishing click from double-click (per-component state)
|
|
57
57
|
let click_timer: ReturnType<typeof setTimeout> | null = null
|
|
58
58
|
let click_timer_file: string | null = null
|
|
59
|
+
const file_key = (file: FileInfo): string => file.url || file.name
|
|
59
60
|
|
|
60
61
|
const clear_click_timer = () => {
|
|
61
|
-
if (click_timer) clearTimeout(click_timer)
|
|
62
|
+
if (click_timer !== null) clearTimeout(click_timer)
|
|
62
63
|
click_timer = null
|
|
63
64
|
click_timer_file = null
|
|
64
65
|
}
|
|
66
|
+
const is_activation_key = (event: KeyboardEvent): boolean =>
|
|
67
|
+
event.key === `Enter` || event.key === ` `
|
|
68
|
+
|
|
69
|
+
const schedule_single_click = (file: FileInfo, event: MouseEvent) => {
|
|
70
|
+
click_timer_file = file_key(file)
|
|
71
|
+
click_timer = setTimeout(() => {
|
|
72
|
+
clear_click_timer()
|
|
73
|
+
on_click?.(file, event)
|
|
74
|
+
}, CLICK_DELAY)
|
|
75
|
+
}
|
|
65
76
|
|
|
66
77
|
// Helper function to get the base file type (removing .gz extension)
|
|
67
78
|
const get_base_file_type = (file: FileInfo): string => {
|
|
@@ -94,38 +105,29 @@
|
|
|
94
105
|
)
|
|
95
106
|
|
|
96
107
|
const toggle_filter = (kind: FilterKind, filter: string) => {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
} else {
|
|
101
|
-
active_type_filter = active_type_filter === filter ? null : filter
|
|
102
|
-
active_category_filter = null
|
|
103
|
-
}
|
|
108
|
+
const active_filter = kind === `category` ? active_category_filter : active_type_filter
|
|
109
|
+
active_category_filter = kind === `category` && active_filter !== filter ? filter : null
|
|
110
|
+
active_type_filter = kind === `type` && active_filter !== filter ? filter : null
|
|
104
111
|
}
|
|
105
112
|
|
|
106
113
|
const handle_drag_start = (file: FileInfo) => (event: DragEvent) => {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
// Also set plain text as fallback for external applications
|
|
119
|
-
event.dataTransfer?.setData(`text/plain`, file_url)
|
|
120
|
-
|
|
114
|
+
const url = file_key(file)
|
|
115
|
+
event.dataTransfer?.setData(
|
|
116
|
+
`application/json`,
|
|
117
|
+
JSON.stringify({
|
|
118
|
+
name: file.name,
|
|
119
|
+
url,
|
|
120
|
+
type: file.type || get_base_file_type(file),
|
|
121
|
+
category: file.category,
|
|
122
|
+
}),
|
|
123
|
+
)
|
|
124
|
+
event.dataTransfer?.setData(`text/plain`, url)
|
|
121
125
|
on_drag_start?.(file, event)
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
// Get unique file types/categories for format/category filters
|
|
125
129
|
let uniq_formats = $derived([...new Set(files.map(get_base_file_type))].sort())
|
|
126
|
-
let uniq_categories = $derived(
|
|
127
|
-
[...new Set(files.map(get_category_id))].filter(Boolean).sort(),
|
|
128
|
-
)
|
|
130
|
+
let uniq_categories = $derived([...new Set(files.map(get_category_id))].sort())
|
|
129
131
|
</script>
|
|
130
132
|
|
|
131
133
|
<div class="file-picker" class:vertical={layout === `vertical`} {...rest}>
|
|
@@ -135,11 +137,8 @@
|
|
|
135
137
|
<span
|
|
136
138
|
class="legend-item"
|
|
137
139
|
class:active={is_active}
|
|
138
|
-
onclick={() =>
|
|
139
|
-
onkeydown={(
|
|
140
|
-
(evt.key === `Enter` || evt.key === ` `) &&
|
|
141
|
-
category &&
|
|
142
|
-
toggle_filter(`category`, category)}
|
|
140
|
+
onclick={() => toggle_filter(`category`, category)}
|
|
141
|
+
onkeydown={(event) => is_activation_key(event) && toggle_filter(`category`, category)}
|
|
143
142
|
role="button"
|
|
144
143
|
tabindex="0"
|
|
145
144
|
aria-pressed={is_active}
|
|
@@ -148,8 +147,7 @@
|
|
|
148
147
|
{category}
|
|
149
148
|
</span>
|
|
150
149
|
{/each}
|
|
151
|
-
{#if show_category_filters && uniq_categories.length > 0 &&
|
|
152
|
-
uniq_formats.length > 0}
|
|
150
|
+
{#if show_category_filters && uniq_categories.length > 0 && uniq_formats.length > 0}
|
|
153
151
|
<span class="divider"></span>
|
|
154
152
|
{/if}
|
|
155
153
|
|
|
@@ -159,16 +157,13 @@
|
|
|
159
157
|
class="legend-item format-item"
|
|
160
158
|
class:active={is_active}
|
|
161
159
|
onclick={() => toggle_filter(`type`, format)}
|
|
162
|
-
onkeydown={(
|
|
163
|
-
(evt.key === `Enter` || evt.key === ` `) && toggle_filter(`type`, format)}
|
|
160
|
+
onkeydown={(event) => is_activation_key(event) && toggle_filter(`type`, format)}
|
|
164
161
|
role="button"
|
|
165
162
|
tabindex="0"
|
|
166
163
|
{@attach tooltip({ content: `Filter to show only ${format.toUpperCase()} files` })}
|
|
167
164
|
>
|
|
168
|
-
<span
|
|
169
|
-
|
|
170
|
-
style:background-color={file_type_colors[format]}
|
|
171
|
-
></span> {format.toUpperCase()}
|
|
165
|
+
<span class="format-circle" style:background-color={file_type_colors[format]}></span>
|
|
166
|
+
{format.toUpperCase()}
|
|
172
167
|
</span>
|
|
173
168
|
{/each}
|
|
174
169
|
|
|
@@ -176,7 +171,7 @@
|
|
|
176
171
|
<button
|
|
177
172
|
{@attach tooltip({ content: `Clear all filters` })}
|
|
178
173
|
class="clear-filter"
|
|
179
|
-
onclick={() => [active_category_filter, active_type_filter] = [null, null]}
|
|
174
|
+
onclick={() => ([active_category_filter, active_type_filter] = [null, null])}
|
|
180
175
|
>
|
|
181
176
|
✕
|
|
182
177
|
</button>
|
|
@@ -194,26 +189,17 @@
|
|
|
194
189
|
ondragend={() => on_drag_end?.()}
|
|
195
190
|
onclick={(event) => {
|
|
196
191
|
clear_click_timer()
|
|
197
|
-
if (on_dblclick)
|
|
198
|
-
|
|
199
|
-
const target_file = file.name
|
|
200
|
-
click_timer_file = target_file
|
|
201
|
-
click_timer = setTimeout(() => {
|
|
202
|
-
if (click_timer_file === target_file) {
|
|
203
|
-
clear_click_timer()
|
|
204
|
-
on_click?.(file, event)
|
|
205
|
-
}
|
|
206
|
-
}, CLICK_DELAY)
|
|
207
|
-
} else {
|
|
208
|
-
on_click?.(file, event)
|
|
209
|
-
}
|
|
192
|
+
if (on_dblclick) schedule_single_click(file, event)
|
|
193
|
+
else on_click?.(file, event)
|
|
210
194
|
}}
|
|
211
195
|
ondblclick={(event) => {
|
|
196
|
+
const pending = click_timer_file
|
|
212
197
|
clear_click_timer()
|
|
213
|
-
on_dblclick?.(file, event)
|
|
198
|
+
if (pending !== null && pending === file_key(file)) on_dblclick?.(file, event)
|
|
199
|
+
else schedule_single_click(file, event)
|
|
214
200
|
}}
|
|
215
201
|
onkeydown={(event) => {
|
|
216
|
-
if (
|
|
202
|
+
if (is_activation_key(event)) {
|
|
217
203
|
event.preventDefault()
|
|
218
204
|
clear_click_timer()
|
|
219
205
|
on_click?.(file, event)
|
|
@@ -222,17 +208,19 @@
|
|
|
222
208
|
role="button"
|
|
223
209
|
tabindex="0"
|
|
224
210
|
title={on_click
|
|
225
|
-
|
|
226
|
-
|
|
211
|
+
? `Click to load or drag this ${base_type.toUpperCase()} file`
|
|
212
|
+
: `Drag this ${base_type.toUpperCase()} file`}
|
|
227
213
|
>
|
|
228
214
|
{#if file.label}
|
|
229
215
|
<span
|
|
230
216
|
class="file-type-badge"
|
|
231
217
|
style:background-color={file_type_colors[base_type] ?? `rgba(128,128,128,0.8)`}
|
|
232
|
-
|
|
218
|
+
>{base_type.toUpperCase()}</span
|
|
219
|
+
>
|
|
233
220
|
{/if}
|
|
234
221
|
<div class="file-name">
|
|
235
|
-
{file.category ? `${file.category_icon} ` : ``}{file.label ??
|
|
222
|
+
{file.category && file.category_icon ? `${file.category_icon} ` : ``}{file.label ??
|
|
223
|
+
file.name}
|
|
236
224
|
</div>
|
|
237
225
|
</div>
|
|
238
226
|
{/each}
|
|
@@ -318,9 +306,9 @@
|
|
|
318
306
|
.file-item {
|
|
319
307
|
display: flex;
|
|
320
308
|
align-items: center;
|
|
321
|
-
padding:
|
|
309
|
+
padding: 2pt 8pt;
|
|
322
310
|
border: 1px solid light-dark(rgba(0, 0, 0, 0.15), rgba(255, 255, 255, 0.2));
|
|
323
|
-
border-radius:
|
|
311
|
+
border-radius: 9px;
|
|
324
312
|
cursor: grab;
|
|
325
313
|
background: light-dark(rgba(0, 0, 0, 0.02), rgba(255, 255, 255, 0.1));
|
|
326
314
|
transition: all 0.2s ease;
|
package/dist/Icon.svelte
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
import { ICON_DATA, type IconName } from './icons'
|
|
4
4
|
|
|
5
5
|
type IconData = { path: string; viewBox: string; stroke?: string }
|
|
6
|
-
let {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
let {
|
|
7
|
+
icon,
|
|
8
|
+
path,
|
|
9
|
+
viewBox = `0 0 24 24`,
|
|
10
|
+
stroke,
|
|
11
|
+
...rest
|
|
12
|
+
}: { icon?: IconName } & Partial<IconData> & SVGAttributes<SVGSVGElement> = $props()
|
|
10
13
|
|
|
11
14
|
const data: IconData = $derived.by(() => {
|
|
12
15
|
if (path) return { path, viewBox, stroke }
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
}
|
|
21
21
|
// Fall back to compact single-digit format: "001", "-101"
|
|
22
22
|
const compact = input.replaceAll(/\s+/g, ``)
|
|
23
|
-
const match = compact.match(/^(
|
|
23
|
+
const match = compact.match(/^(?<h>-?\d)(?<k>-?\d)(?<l>-?\d)$/)
|
|
24
24
|
if (match) return [Number(match[1]), Number(match[2]), Number(match[3])] as Vec3
|
|
25
25
|
return null
|
|
26
26
|
}
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
font-size: 0.85em;
|
|
54
54
|
}
|
|
55
55
|
input {
|
|
56
|
-
width:
|
|
56
|
+
width: 5.5em;
|
|
57
57
|
padding: 0.15em 0.3em;
|
|
58
58
|
border: 1px solid var(--border-color, #ccc);
|
|
59
59
|
border-radius: 4px;
|
package/dist/api/optimade.js
CHANGED
|
@@ -110,12 +110,16 @@ export function detect_provider_from_slug(slug, providers) {
|
|
|
110
110
|
const prefix = decoded_slug.split(`-`)[0].toLowerCase();
|
|
111
111
|
return providers.find((provider) => provider.id === prefix)?.id ?? ``;
|
|
112
112
|
}
|
|
113
|
-
|
|
113
|
+
// Resolve a provider id to its versioned API base URL (throws on unknown provider)
|
|
114
|
+
async function get_api_base(provider, providers) {
|
|
114
115
|
const provider_config = providers.find((entry) => entry.id === provider);
|
|
115
116
|
if (!provider_config)
|
|
116
117
|
throw new Error(`Unknown provider: ${provider}`);
|
|
117
118
|
const base_url = await resolve_provider_url(provider_config.attributes.base_url);
|
|
118
|
-
|
|
119
|
+
return base_url.endsWith(`/v1`) ? base_url : `${base_url}/v1`;
|
|
120
|
+
}
|
|
121
|
+
export async function fetch_optimade_structure(structure_id, provider, providers) {
|
|
122
|
+
const api_base = await get_api_base(provider, providers);
|
|
119
123
|
const encoded_id = encode_structure_id(structure_id);
|
|
120
124
|
const response = await fetch_with_cors_proxy(`${api_base}/structures/${encoded_id}`);
|
|
121
125
|
const data = await response.json();
|
|
@@ -124,12 +128,11 @@ export async function fetch_optimade_structure(structure_id, provider, providers
|
|
|
124
128
|
return Array.isArray(data.data) ? data.data[0] : data.data;
|
|
125
129
|
}
|
|
126
130
|
export async function fetch_suggested_structures(provider, providers, limit = 12) {
|
|
127
|
-
const provider_config = providers.find((entry) => entry.id === provider);
|
|
128
|
-
if (!provider_config)
|
|
129
|
-
throw new Error(`Unknown provider: ${provider}`);
|
|
130
131
|
try {
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
// Keep get_api_base inside try: suggestions are optional, so unknown providers and
|
|
133
|
+
// URL-resolution failures both soft-fail to []. Note: unknown provider threw
|
|
134
|
+
// pre-cleanup, which left the sole caller's loading state stuck on rejection.
|
|
135
|
+
const api_base = await get_api_base(provider, providers);
|
|
133
136
|
const response = await fetch_with_cors_proxy(`${api_base}/structures?page_limit=${limit}&page_offset=0`);
|
|
134
137
|
const data = await response.json();
|
|
135
138
|
return Array.isArray(data.data) ? data.data : [];
|
package/dist/app.css
CHANGED
|
@@ -18,6 +18,28 @@
|
|
|
18
18
|
--sms-selected-bg: light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.15));
|
|
19
19
|
--border-radius: 3pt;
|
|
20
20
|
|
|
21
|
+
/* Single source of truth for viewer control-button icon size, shared by all viewer chromes
|
|
22
|
+
(Structure/Brillouin/Fermi/ConvexHull/Trajectory). Scales with the container but is capped so
|
|
23
|
+
toolbar icons don't grow oversized in fullscreen. Uses rem (not em) so the size is consistent
|
|
24
|
+
across viewers regardless of their local font-size (e.g. Trajectory's controls run at 0.85em).
|
|
25
|
+
Override per viewer by setting this on its wrapper. */
|
|
26
|
+
--ctrl-btn-icon-size: clamp(0.7rem, 2cqmin, 0.85rem);
|
|
27
|
+
|
|
28
|
+
/* In-viewer overlay stack (inside one viewer container, above its WebGL
|
|
29
|
+
canvas): 1 viewport labels · 2 glass chips · 4–6 carousel chrome
|
|
30
|
+
(legend/resize-handle/pager) · 10 draggable panes · 100 dropdowns +
|
|
31
|
+
toasts · 1000 canvas tooltips + error banners. Components fall back to
|
|
32
|
+
these tiers; override per instance via their dedicated --*-z-index vars.
|
|
33
|
+
NOTE (WKWebView/Tauri): overlays that can overlap a WebGL canvas also
|
|
34
|
+
need their own compositing layer (will-change: transform) — after hiding
|
|
35
|
+
and re-showing the window, WebKit reattaches canvas layers above
|
|
36
|
+
non-composited overlays regardless of z-index. */
|
|
37
|
+
--z-index-viewer-label: 1;
|
|
38
|
+
--z-index-viewer-chip: 2;
|
|
39
|
+
--z-index-viewer-pane: 10;
|
|
40
|
+
--z-index-viewer-dropdown: 100;
|
|
41
|
+
--z-index-viewer-tooltip: 1000;
|
|
42
|
+
|
|
21
43
|
/* App-wide overlay stack: controls < fullscreen/nav < dialogs < floating options.
|
|
22
44
|
These must exceed Threlte HTML overlays, which use very high z-index values. */
|
|
23
45
|
--z-index-overlay-controls: 100000000;
|
|
@@ -204,6 +226,52 @@
|
|
|
204
226
|
input:is([type='checkbox'], [type='radio'], [type='range'], [type='color']) {
|
|
205
227
|
border: none;
|
|
206
228
|
}
|
|
229
|
+
input[type='range'] {
|
|
230
|
+
--range-track-bg: var(--range-track-bg-override, var(--surface-bg, #2a2f3a));
|
|
231
|
+
--range-track-border: var(--range-track-border-override, var(--border-color, #404040));
|
|
232
|
+
--range-thumb-bg: var(--range-thumb-bg-override, var(--accent-color, #4a9eff));
|
|
233
|
+
-webkit-appearance: none;
|
|
234
|
+
appearance: none;
|
|
235
|
+
background: transparent;
|
|
236
|
+
accent-color: var(--range-thumb-bg);
|
|
237
|
+
cursor: pointer;
|
|
238
|
+
}
|
|
239
|
+
input[type='range']::-webkit-slider-runnable-track {
|
|
240
|
+
height: var(--range-track-height, 0.45rem);
|
|
241
|
+
border-radius: 999px;
|
|
242
|
+
background: var(--range-track-bg);
|
|
243
|
+
box-shadow: inset 0 0 0 1px var(--range-track-border);
|
|
244
|
+
}
|
|
245
|
+
input[type='range']::-webkit-slider-thumb {
|
|
246
|
+
-webkit-appearance: none;
|
|
247
|
+
inline-size: var(--range-thumb-size, 0.9rem);
|
|
248
|
+
block-size: var(--range-thumb-size, 0.9rem);
|
|
249
|
+
margin-top: calc(
|
|
250
|
+
(var(--range-track-height, 0.45rem) - var(--range-thumb-size, 0.9rem)) / 2
|
|
251
|
+
);
|
|
252
|
+
border-radius: 50%;
|
|
253
|
+
background: var(--range-thumb-bg);
|
|
254
|
+
box-shadow: 0 0 0 2px var(--surface-bg, #1f242d);
|
|
255
|
+
}
|
|
256
|
+
input[type='range']::-moz-range-track {
|
|
257
|
+
height: var(--range-track-height, 0.45rem);
|
|
258
|
+
border-radius: 999px;
|
|
259
|
+
background: var(--range-track-bg);
|
|
260
|
+
box-shadow: inset 0 0 0 1px var(--range-track-border);
|
|
261
|
+
}
|
|
262
|
+
input[type='range']::-moz-range-progress {
|
|
263
|
+
height: var(--range-track-height, 0.45rem);
|
|
264
|
+
border-radius: 999px;
|
|
265
|
+
background: var(--range-thumb-bg);
|
|
266
|
+
}
|
|
267
|
+
input[type='range']::-moz-range-thumb {
|
|
268
|
+
inline-size: var(--range-thumb-size, 0.9rem);
|
|
269
|
+
block-size: var(--range-thumb-size, 0.9rem);
|
|
270
|
+
border: 0;
|
|
271
|
+
border-radius: 50%;
|
|
272
|
+
background: var(--range-thumb-bg);
|
|
273
|
+
box-shadow: 0 0 0 2px var(--surface-bg, #1f242d);
|
|
274
|
+
}
|
|
207
275
|
input[type='number'] {
|
|
208
276
|
min-width: 40px;
|
|
209
277
|
width: auto;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import EmptyState from '../EmptyState.svelte'
|
|
4
4
|
import { StatusMessage } from '../feedback'
|
|
5
5
|
import Spinner from '../feedback/Spinner.svelte'
|
|
6
|
-
import
|
|
6
|
+
import * as io from '../io'
|
|
7
7
|
import { type FullscreenToggleProp, toggle_fullscreen, ViewerChrome } from '../layout'
|
|
8
8
|
import { sync_fullscreen } from '../layout/fullscreen.svelte'
|
|
9
9
|
import type { Vec3 } from '../math'
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
surface_color = $bindable(`#4488ff`),
|
|
54
54
|
surface_opacity = $bindable(0.3),
|
|
55
55
|
edge_color = $bindable(`#000000`),
|
|
56
|
-
edge_width = $bindable(0.
|
|
56
|
+
edge_width = $bindable(0.002),
|
|
57
57
|
show_vectors = $bindable(true),
|
|
58
58
|
vector_scale = $bindable(1.0),
|
|
59
59
|
camera_projection = $bindable(`perspective`),
|
|
@@ -91,72 +91,68 @@
|
|
|
91
91
|
on_point_hover,
|
|
92
92
|
on_hover,
|
|
93
93
|
...rest
|
|
94
|
-
}:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
// Deprecated alias for on_point_hover (honored when on_point_hover is unset)
|
|
157
|
-
on_hover?: (data: BZHoverData | null) => void
|
|
158
|
-
}
|
|
159
|
-
& HTMLAttributes<HTMLDivElement> = $props()
|
|
94
|
+
}: {
|
|
95
|
+
structure?: Crystal
|
|
96
|
+
bz_order?: number
|
|
97
|
+
bz_data?: BrillouinZoneData
|
|
98
|
+
controls_open?: boolean
|
|
99
|
+
info_pane_open?: boolean
|
|
100
|
+
surface_color?: string
|
|
101
|
+
surface_opacity?: number
|
|
102
|
+
edge_color?: string
|
|
103
|
+
edge_width?: number
|
|
104
|
+
show_vectors?: boolean
|
|
105
|
+
vector_scale?: number
|
|
106
|
+
camera_projection?: CameraProjection
|
|
107
|
+
// Irreducible BZ options
|
|
108
|
+
show_ibz?: boolean
|
|
109
|
+
ibz_color?: string
|
|
110
|
+
ibz_opacity?: number
|
|
111
|
+
ibz_data?: IrreducibleBZData | null
|
|
112
|
+
// Controls visibility configuration.
|
|
113
|
+
// - 'always': controls always visible
|
|
114
|
+
// - 'hover': controls visible on component hover (default)
|
|
115
|
+
// - 'never': controls never visible
|
|
116
|
+
// - object: { mode, hidden, style } for fine-grained control
|
|
117
|
+
//
|
|
118
|
+
// Control names: 'filename', 'fullscreen', 'info-pane', 'export-pane', 'controls'
|
|
119
|
+
show_controls?: ShowControlsProp
|
|
120
|
+
fullscreen?: boolean
|
|
121
|
+
width?: number
|
|
122
|
+
height?: number
|
|
123
|
+
wrapper?: HTMLDivElement
|
|
124
|
+
png_dpi?: number
|
|
125
|
+
hovered?: boolean
|
|
126
|
+
dragover?: boolean
|
|
127
|
+
allow_file_drop?: boolean
|
|
128
|
+
fullscreen_toggle?: FullscreenToggleProp
|
|
129
|
+
data_url?: string
|
|
130
|
+
on_file_drop?: (content: string | ArrayBuffer, filename: string) => void
|
|
131
|
+
spinner_props?: ComponentProps<typeof Spinner>
|
|
132
|
+
loading?: boolean
|
|
133
|
+
error_msg?: string
|
|
134
|
+
structure_string?: string
|
|
135
|
+
// K-path points in Cartesian reciprocal space coordinates (not fractional coords)
|
|
136
|
+
// Should be computed using the reciprocal lattice matrix (includes 2π factor)
|
|
137
|
+
k_path_points?: Vec3[]
|
|
138
|
+
// K-path labels with positions in Cartesian reciprocal space coordinates
|
|
139
|
+
// Each position should match a corresponding point in k_path_points
|
|
140
|
+
k_path_labels?: { position: Vec3; label: string | null }[]
|
|
141
|
+
// Currently hovered k-point in Cartesian reciprocal space coordinates
|
|
142
|
+
hovered_k_point?: Vec3 | null
|
|
143
|
+
// Index of the currently hovered q-point in the band structure
|
|
144
|
+
hovered_qpoint_index?: number | null
|
|
145
|
+
// Called with the q-point index when the user hovers the k-path in the BZ (null on leave)
|
|
146
|
+
on_kpath_hover?: (qpoint_index: number | null) => void
|
|
147
|
+
children?: Snippet<[{ structure?: Crystal; bz_data?: BrillouinZoneData }]>
|
|
148
|
+
tooltip_config?: BZTooltipProp
|
|
149
|
+
on_file_load?: (data: BZHandlerData) => void
|
|
150
|
+
on_error?: (data: BZHandlerData) => void
|
|
151
|
+
on_fullscreen_change?: (data: BZHandlerData) => void
|
|
152
|
+
on_point_hover?: (data: BZHoverData | null) => void
|
|
153
|
+
// Deprecated alias for on_point_hover (honored when on_point_hover is unset)
|
|
154
|
+
on_hover?: (data: BZHoverData | null) => void
|
|
155
|
+
} & HTMLAttributes<HTMLDivElement> = $props()
|
|
160
156
|
|
|
161
157
|
let scene = $state(undefined)
|
|
162
158
|
let camera = $state(undefined)
|
|
@@ -181,9 +177,7 @@
|
|
|
181
177
|
|
|
182
178
|
// Parse and load structure from content
|
|
183
179
|
function parse_structure(content: string | ArrayBuffer, filename: string) {
|
|
184
|
-
const text = content instanceof ArrayBuffer
|
|
185
|
-
? new TextDecoder().decode(content)
|
|
186
|
-
: content
|
|
180
|
+
const text = content instanceof ArrayBuffer ? new TextDecoder().decode(content) : content
|
|
187
181
|
const parsed = parse_any_structure(text, filename)
|
|
188
182
|
if (!parsed) throw new Error(`Failed to parse structure from ${filename}`)
|
|
189
183
|
|
|
@@ -198,9 +192,7 @@
|
|
|
198
192
|
try {
|
|
199
193
|
parse_structure(content, filename)
|
|
200
194
|
} catch (err) {
|
|
201
|
-
error_msg = `Failed to parse ${filename}: ${
|
|
202
|
-
to_error(err).message
|
|
203
|
-
}`
|
|
195
|
+
error_msg = `Failed to parse ${filename}: ${to_error(err).message}`
|
|
204
196
|
on_error?.({ error_msg, filename })
|
|
205
197
|
}
|
|
206
198
|
}
|
|
@@ -241,9 +233,7 @@
|
|
|
241
233
|
analyze_structure_symmetry(structure, {})
|
|
242
234
|
.then((sym_data) => {
|
|
243
235
|
if (stale) return
|
|
244
|
-
const point_group_ops = extract_point_group_from_operations(
|
|
245
|
-
sym_data.operations,
|
|
246
|
-
)
|
|
236
|
+
const point_group_ops = extract_point_group_from_operations(sym_data.operations)
|
|
247
237
|
ibz_data = compute_irreducible_bz(captured_bz, point_group_ops)
|
|
248
238
|
})
|
|
249
239
|
.catch((err) => {
|
|
@@ -258,24 +248,29 @@
|
|
|
258
248
|
})
|
|
259
249
|
|
|
260
250
|
// Load structure from URL or string
|
|
251
|
+
let data_url_load_id = 0
|
|
261
252
|
$effect(() => {
|
|
262
253
|
const handle_error = (err: unknown, source: string) => {
|
|
263
254
|
error_msg = to_error(err).message
|
|
264
255
|
on_error?.({ error_msg, filename: source })
|
|
265
256
|
}
|
|
266
257
|
|
|
267
|
-
|
|
258
|
+
const requested_url = data_url
|
|
259
|
+
if (requested_url && !structure) {
|
|
260
|
+
const load_id = ++data_url_load_id
|
|
268
261
|
loading = true
|
|
269
262
|
error_msg = undefined
|
|
270
|
-
load_from_url(
|
|
271
|
-
|
|
272
|
-
(content, filename)
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
.finally(() =>
|
|
263
|
+
io.load_from_url(requested_url, (content, filename) => {
|
|
264
|
+
if (load_id !== data_url_load_id) return
|
|
265
|
+
return on_file_drop ? on_file_drop(content, filename) : safe_parse(content, filename)
|
|
266
|
+
})
|
|
267
|
+
.catch((err) => {
|
|
268
|
+
if (load_id !== data_url_load_id) return
|
|
269
|
+
handle_error(err, io.basename_from_url(requested_url))
|
|
270
|
+
})
|
|
271
|
+
.finally(() => {
|
|
272
|
+
if (load_id === data_url_load_id) loading = false
|
|
273
|
+
})
|
|
279
274
|
} else if (structure_string && !data_url) {
|
|
280
275
|
loading = true
|
|
281
276
|
error_msg = undefined
|
|
@@ -289,7 +284,7 @@
|
|
|
289
284
|
}
|
|
290
285
|
})
|
|
291
286
|
|
|
292
|
-
const handle_file_drop = create_file_drop_handler({
|
|
287
|
+
const handle_file_drop = io.create_file_drop_handler({
|
|
293
288
|
allow: () => allow_file_drop,
|
|
294
289
|
on_drop: (content, filename) => (on_file_drop || safe_parse)(content, filename),
|
|
295
290
|
on_error: (msg) => {
|
|
@@ -307,7 +302,8 @@
|
|
|
307
302
|
if (
|
|
308
303
|
target instanceof HTMLElement &&
|
|
309
304
|
(target.tagName === `INPUT` || target.tagName === `TEXTAREA`)
|
|
310
|
-
)
|
|
305
|
+
)
|
|
306
|
+
return
|
|
311
307
|
|
|
312
308
|
if (event.key === `f` && fullscreen_toggle) toggle_fullscreen(wrapper)
|
|
313
309
|
else if (event.key === `i`) info_pane_open = !info_pane_open
|
|
@@ -338,10 +334,13 @@
|
|
|
338
334
|
onmouseenter={() => (hovered = true)}
|
|
339
335
|
onmouseleave={() => (hovered = false)}
|
|
340
336
|
ondrop={handle_file_drop}
|
|
341
|
-
{...drag_over_handlers({
|
|
337
|
+
{...io.drag_over_handlers({
|
|
338
|
+
allow: () => allow_file_drop,
|
|
339
|
+
set_dragover: (over) => (dragover = over),
|
|
340
|
+
})}
|
|
342
341
|
{onkeydown}
|
|
343
342
|
{...rest}
|
|
344
|
-
class=
|
|
343
|
+
class={[`brillouin-zone`, rest.class]}
|
|
345
344
|
>
|
|
346
345
|
{@render children?.({ structure, bz_data })}
|
|
347
346
|
{#if loading}
|