matterviz 0.3.2 → 0.3.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 -2
- package/dist/FilePicker.svelte +123 -82
- package/dist/Icon.svelte +18 -12
- package/dist/MillerIndexInput.svelte +27 -21
- package/dist/api/optimade.js +6 -6
- package/dist/app.css +216 -207
- package/dist/brillouin/BrillouinZone.svelte +292 -149
- package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
- package/dist/brillouin/BrillouinZoneExportPane.svelte +69 -42
- package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
- package/dist/brillouin/BrillouinZoneScene.svelte +275 -163
- package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
- package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
- package/dist/brillouin/compute.js +11 -6
- package/dist/chempot-diagram/ChemPotDiagram.svelte +162 -27
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +451 -281
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2148 -1642
- package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -5
- package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
- package/dist/chempot-diagram/async-compute.svelte.js +77 -0
- package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
- package/dist/chempot-diagram/chempot-worker.js +11 -0
- package/dist/chempot-diagram/color.js +1 -2
- package/dist/chempot-diagram/compute.d.ts +10 -0
- package/dist/chempot-diagram/compute.js +250 -88
- package/dist/chempot-diagram/index.d.ts +2 -1
- package/dist/chempot-diagram/index.js +2 -1
- package/dist/chempot-diagram/temperature.js +8 -9
- package/dist/chempot-diagram/types.d.ts +3 -0
- package/dist/chempot-diagram/types.js +1 -0
- package/dist/colors/index.d.ts +1 -1
- package/dist/colors/index.js +5 -3
- package/dist/composition/BarChart.svelte +128 -55
- package/dist/composition/BubbleChart.svelte +102 -49
- package/dist/composition/Composition.svelte +100 -79
- package/dist/composition/Formula.svelte +108 -62
- package/dist/composition/FormulaFilter.svelte +665 -537
- package/dist/composition/PieChart.svelte +183 -108
- package/dist/composition/format.d.ts +5 -0
- package/dist/composition/format.js +20 -3
- package/dist/composition/parse.js +14 -9
- package/dist/convex-hull/ConvexHull.svelte +93 -40
- package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull2D.svelte +549 -360
- package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull3D.svelte +1296 -827
- package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHull4D.svelte +1004 -688
- package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullControls.svelte +115 -28
- package/dist/convex-hull/ConvexHullControls.svelte.d.ts +1 -1
- package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
- package/dist/convex-hull/ConvexHullStats.svelte +425 -328
- package/dist/convex-hull/ConvexHullTooltip.svelte +40 -16
- package/dist/convex-hull/GasPressureControls.svelte +104 -61
- package/dist/convex-hull/StructurePopup.svelte +25 -4
- package/dist/convex-hull/TemperatureSlider.svelte +45 -25
- package/dist/convex-hull/barycentric-coords.js +13 -7
- package/dist/convex-hull/demo-temperature.js +8 -4
- package/dist/convex-hull/gas-thermodynamics.js +17 -12
- package/dist/convex-hull/helpers.d.ts +9 -0
- package/dist/convex-hull/helpers.js +77 -34
- package/dist/convex-hull/thermodynamics.js +61 -56
- package/dist/convex-hull/types.d.ts +9 -14
- package/dist/convex-hull/types.js +0 -17
- package/dist/coordination/CoordinationBarPlot.svelte +227 -154
- package/dist/element/BohrAtom.svelte +55 -12
- package/dist/element/ElementHeading.svelte +7 -2
- package/dist/element/ElementPhoto.svelte +15 -9
- package/dist/element/ElementStats.svelte +10 -4
- package/dist/element/ElementTile.svelte +137 -73
- package/dist/element/Nucleus.svelte +39 -11
- package/dist/feedback/ClickFeedback.svelte +16 -5
- package/dist/feedback/DragOverlay.svelte +10 -2
- package/dist/feedback/Spinner.svelte +4 -2
- package/dist/feedback/StatusMessage.svelte +8 -2
- package/dist/fermi-surface/FermiSlice.svelte +118 -88
- package/dist/fermi-surface/FermiSurface.svelte +328 -187
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
- package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceScene.svelte +535 -342
- package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
- package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
- package/dist/fermi-surface/compute.js +16 -20
- package/dist/fermi-surface/parse.js +24 -14
- package/dist/fermi-surface/symmetry.js +2 -7
- package/dist/fermi-surface/types.d.ts +3 -5
- package/dist/heatmap-matrix/HeatmapMatrix.svelte +1019 -765
- package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +1 -1
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +76 -22
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +2 -3
- package/dist/icons.js +47 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/io/decompress.js +1 -1
- package/dist/io/export.d.ts +3 -0
- package/dist/io/export.js +129 -143
- package/dist/io/is-binary.js +2 -3
- package/dist/io/url-drop.js +1 -2
- package/dist/isosurface/Isosurface.svelte +202 -148
- package/dist/isosurface/IsosurfaceControls.svelte +46 -28
- package/dist/isosurface/parse.js +34 -29
- package/dist/isosurface/slice.js +5 -10
- package/dist/isosurface/types.d.ts +2 -1
- package/dist/isosurface/types.js +61 -12
- package/dist/labels.js +11 -8
- package/dist/layout/FullscreenToggle.svelte +11 -2
- package/dist/layout/InfoCard.svelte +38 -6
- package/dist/layout/InfoTag.svelte +63 -32
- package/dist/layout/PropertyFilter.svelte +82 -37
- package/dist/layout/SettingsSection.svelte +85 -55
- package/dist/layout/SubpageGrid.svelte +10 -2
- package/dist/layout/json-tree/JsonNode.svelte +183 -138
- package/dist/layout/json-tree/JsonTree.svelte +499 -413
- package/dist/layout/json-tree/JsonValue.svelte +127 -99
- package/dist/layout/json-tree/utils.js +4 -2
- package/dist/marching-cubes.js +25 -2
- package/dist/math.d.ts +13 -17
- package/dist/math.js +133 -67
- package/dist/overlays/ContextMenu.svelte +65 -40
- package/dist/overlays/DraggablePane.svelte +211 -139
- package/dist/periodic-table/PeriodicTable.svelte +278 -145
- package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
- package/dist/periodic-table/PropertySelect.svelte +25 -7
- package/dist/periodic-table/TableInset.svelte +8 -3
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +446 -309
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramControls.svelte +102 -43
- package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +63 -40
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte +71 -28
- package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +1 -1
- package/dist/phase-diagram/PhaseDiagramTooltip.svelte +158 -101
- package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
- package/dist/phase-diagram/build-diagram.js +9 -9
- package/dist/phase-diagram/colors.js +1 -3
- package/dist/phase-diagram/parse.js +10 -9
- package/dist/phase-diagram/svg-to-diagram.js +53 -49
- package/dist/phase-diagram/utils.d.ts +1 -0
- package/dist/phase-diagram/utils.js +80 -25
- package/dist/plot/AxisLabel.svelte +28 -3
- package/dist/plot/BarPlot.svelte +1182 -734
- package/dist/plot/BarPlot.svelte.d.ts +2 -2
- package/dist/plot/BarPlotControls.svelte +31 -5
- package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
- package/dist/plot/ColorBar.svelte +479 -329
- package/dist/plot/ColorScaleSelect.svelte +27 -6
- package/dist/plot/ElementScatter.svelte +36 -15
- package/dist/plot/FillArea.svelte +152 -95
- package/dist/plot/Histogram.svelte +934 -571
- package/dist/plot/Histogram.svelte.d.ts +1 -1
- package/dist/plot/HistogramControls.svelte +53 -9
- package/dist/plot/HistogramControls.svelte.d.ts +1 -1
- package/dist/plot/InteractiveAxisLabel.svelte +34 -11
- package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
- package/dist/plot/Line.svelte +63 -28
- package/dist/plot/PlotControls.svelte +157 -114
- package/dist/plot/PlotControls.svelte.d.ts +1 -1
- package/dist/plot/PlotLegend.svelte +174 -91
- package/dist/plot/PlotTooltip.svelte +45 -6
- package/dist/plot/PortalSelect.svelte +175 -147
- package/dist/plot/ReferenceLine.svelte +76 -22
- package/dist/plot/ReferenceLine3D.svelte +132 -107
- package/dist/plot/ReferencePlane.svelte +146 -121
- package/dist/plot/ScatterPlot.svelte +1681 -1091
- package/dist/plot/ScatterPlot.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlot3D.svelte +256 -131
- package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlot3DControls.svelte +113 -63
- package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
- package/dist/plot/ScatterPlot3DScene.svelte +608 -403
- package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
- package/dist/plot/ScatterPlotControls.svelte +65 -25
- package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
- package/dist/plot/ScatterPoint.svelte +98 -26
- package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
- package/dist/plot/SpacegroupBarPlot.svelte +142 -85
- package/dist/plot/Surface3D.svelte +159 -108
- package/dist/plot/ZeroLines.svelte +55 -3
- package/dist/plot/ZoomRect.svelte +4 -2
- package/dist/plot/axis-utils.js +1 -3
- package/dist/plot/data-cleaning.js +12 -28
- package/dist/plot/data-transform.js +2 -1
- package/dist/plot/fill-utils.js +2 -0
- package/dist/plot/layout.d.ts +4 -1
- package/dist/plot/layout.js +33 -14
- package/dist/plot/reference-line.d.ts +2 -2
- package/dist/plot/reference-line.js +7 -5
- package/dist/plot/scales.js +24 -36
- package/dist/plot/types.d.ts +11 -23
- package/dist/plot/types.js +6 -11
- package/dist/plot/utils/label-placement.d.ts +32 -15
- package/dist/plot/utils/label-placement.js +227 -66
- package/dist/plot/utils/series-visibility.js +2 -3
- package/dist/rdf/RdfPlot.svelte +143 -91
- package/dist/rdf/calc-rdf.js +4 -5
- package/dist/sanitize.d.ts +4 -0
- package/dist/sanitize.js +107 -0
- package/dist/settings.d.ts +18 -6
- package/dist/settings.js +46 -16
- package/dist/spectral/Bands.svelte +632 -453
- package/dist/spectral/BandsAndDos.svelte +90 -49
- package/dist/spectral/BrillouinBandsDos.svelte +151 -93
- package/dist/spectral/Dos.svelte +389 -258
- package/dist/spectral/helpers.js +55 -43
- package/dist/state.svelte.d.ts +1 -1
- package/dist/state.svelte.js +3 -2
- package/dist/structure/Arrow.svelte +59 -20
- package/dist/structure/AtomLegend.svelte +215 -134
- package/dist/structure/Bond.svelte +73 -47
- package/dist/structure/CanvasTooltip.svelte +10 -2
- package/dist/structure/CellSelect.svelte +72 -45
- package/dist/structure/Cylinder.svelte +33 -17
- package/dist/structure/Lattice.svelte +88 -33
- package/dist/structure/Structure.svelte +1063 -797
- package/dist/structure/Structure.svelte.d.ts +1 -1
- package/dist/structure/StructureControls.svelte +349 -118
- package/dist/structure/StructureExportPane.svelte +124 -89
- package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
- package/dist/structure/StructureInfoPane.svelte +304 -237
- package/dist/structure/StructureScene.svelte +879 -443
- package/dist/structure/StructureScene.svelte.d.ts +15 -7
- package/dist/structure/atom-properties.js +8 -8
- package/dist/structure/bonding.js +6 -7
- package/dist/structure/export.js +14 -29
- package/dist/structure/ferrox-wasm.js +1 -1
- package/dist/structure/index.d.ts +13 -3
- package/dist/structure/index.js +83 -23
- package/dist/structure/measure.d.ts +2 -2
- package/dist/structure/measure.js +4 -44
- package/dist/structure/parse.js +113 -141
- package/dist/structure/partial-occupancy.js +7 -10
- package/dist/structure/pbc.d.ts +1 -0
- package/dist/structure/pbc.js +16 -6
- package/dist/structure/supercell.d.ts +2 -2
- package/dist/structure/supercell.js +12 -22
- package/dist/structure/validation.js +1 -2
- package/dist/symmetry/SymmetryStats.svelte +84 -41
- package/dist/symmetry/WyckoffTable.svelte +26 -6
- package/dist/symmetry/cell-transform.js +5 -3
- package/dist/symmetry/index.js +8 -7
- package/dist/symmetry/spacegroups.js +148 -148
- package/dist/table/HeatmapTable.svelte +790 -554
- package/dist/table/HeatmapTable.svelte.d.ts +1 -1
- package/dist/table/ToggleMenu.svelte +125 -92
- package/dist/table/index.js +2 -4
- package/dist/theme/ThemeControl.svelte +21 -12
- package/dist/time.js +4 -1
- package/dist/tooltip/TooltipContent.svelte +33 -8
- package/dist/trajectory/Trajectory.svelte +758 -558
- package/dist/trajectory/TrajectoryError.svelte +14 -3
- package/dist/trajectory/TrajectoryExportPane.svelte +137 -83
- package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
- package/dist/trajectory/extract.js +10 -26
- package/dist/trajectory/format-detect.js +5 -5
- package/dist/trajectory/frame-reader.d.ts +1 -1
- package/dist/trajectory/frame-reader.js +5 -12
- package/dist/trajectory/helpers.d.ts +0 -1
- package/dist/trajectory/helpers.js +2 -17
- package/dist/trajectory/index.js +14 -12
- package/dist/trajectory/parse/ase.js +5 -4
- package/dist/trajectory/parse/hdf5.js +26 -18
- package/dist/trajectory/parse/index.js +13 -18
- package/dist/trajectory/parse/lammps.js +17 -7
- package/dist/trajectory/parse/vasp.js +5 -2
- package/dist/trajectory/parse/xyz.js +8 -7
- package/dist/trajectory/plotting.js +13 -8
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +13 -0
- package/dist/xrd/XrdPlot.svelte +337 -247
- package/dist/xrd/broadening.js +14 -9
- package/dist/xrd/calc-xrd.js +12 -18
- package/dist/xrd/parse.d.ts +1 -1
- package/dist/xrd/parse.js +17 -17
- package/package.json +99 -103
- package/readme.md +1 -1
- /package/dist/theme/{themes.js → themes.mjs} +0 -0
package/dist/EmptyState.svelte
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte'
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements'
|
|
4
|
+
|
|
5
|
+
let { message, children, ...rest }: {
|
|
6
|
+
// Simple text message to display. Ignored if children snippet is provided.
|
|
7
|
+
message?: string
|
|
8
|
+
// Custom content to render. Takes precedence over message prop.
|
|
9
|
+
children?: Snippet
|
|
10
|
+
} & HTMLAttributes<HTMLDivElement> = $props()
|
|
3
11
|
</script>
|
|
4
12
|
|
|
5
13
|
<div {...rest} class="empty-state {rest.class ?? ``}">
|
package/dist/FilePicker.svelte
CHANGED
|
@@ -1,90 +1,131 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FileInfo } from './io'
|
|
3
|
+
import { tooltip } from 'svelte-multiselect'
|
|
4
|
+
import type { HTMLAttributes } from 'svelte/elements'
|
|
5
|
+
|
|
6
|
+
// Delay for distinguishing click from double-click (ms)
|
|
7
|
+
const CLICK_DELAY = 250
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
files = [],
|
|
11
|
+
active_files = [],
|
|
12
|
+
show_category_filters = false,
|
|
13
|
+
layout = `wrap`,
|
|
14
|
+
on_drag_start,
|
|
15
|
+
on_drag_end,
|
|
16
|
+
on_click,
|
|
17
|
+
on_dblclick,
|
|
18
|
+
type_mapper,
|
|
19
|
+
file_type_colors = {
|
|
20
|
+
cif: `rgba(100, 149, 237, 0.8)`,
|
|
21
|
+
xyz: `rgba(50, 205, 50, 0.8)`,
|
|
22
|
+
extxyz: `rgba(50, 205, 50, 0.8)`,
|
|
23
|
+
poscar: `rgba(255, 140, 0, 0.8)`,
|
|
24
|
+
json: `rgba(138, 43, 226, 0.8)`,
|
|
25
|
+
traj: `rgba(255, 192, 203, 0.8)`,
|
|
26
|
+
hdf5: `rgba(255, 69, 0, 0.8)`,
|
|
27
|
+
gz: `rgba(169, 169, 169, 0.8)`,
|
|
28
|
+
md: `rgba(255, 215, 0, 0.8)`,
|
|
29
|
+
yaml: `rgba(255, 0, 255, 0.8)`,
|
|
30
|
+
xdatcar: `rgba(255, 215, 0, 0.8)`,
|
|
31
|
+
tdb: `rgba(0, 188, 212, 0.8)`,
|
|
32
|
+
chgcar: `rgba(59, 130, 246, 0.8)`,
|
|
33
|
+
parchg: `rgba(99, 102, 241, 0.8)`,
|
|
34
|
+
locpot: `rgba(245, 158, 11, 0.8)`,
|
|
35
|
+
elfcar: `rgba(16, 185, 129, 0.8)`,
|
|
36
|
+
cube: `rgba(168, 85, 247, 0.8)`,
|
|
37
|
+
},
|
|
38
|
+
...rest
|
|
39
|
+
}: HTMLAttributes<HTMLDivElement> & {
|
|
40
|
+
files?: FileInfo[]
|
|
41
|
+
active_files?: string[]
|
|
42
|
+
show_category_filters?: boolean
|
|
43
|
+
layout?: `wrap` | `vertical`
|
|
44
|
+
on_drag_start?: (file: FileInfo, event: DragEvent) => void
|
|
45
|
+
on_drag_end?: () => void
|
|
46
|
+
on_click?: (file: FileInfo, event: MouseEvent | KeyboardEvent) => void
|
|
47
|
+
on_dblclick?: (file: FileInfo, event: MouseEvent) => void
|
|
48
|
+
type_mapper?: (file: FileInfo) => string
|
|
49
|
+
file_type_colors?: Record<string, string>
|
|
50
|
+
} = $props()
|
|
51
|
+
|
|
52
|
+
let active_category_filter = $state<string | null>(null)
|
|
53
|
+
let active_type_filter = $state<string | null>(null)
|
|
54
|
+
type FilterKind = `category` | `type`
|
|
55
|
+
|
|
56
|
+
// Timer for distinguishing click from double-click (per-component state)
|
|
57
|
+
let click_timer: ReturnType<typeof setTimeout> | null = null
|
|
58
|
+
let click_timer_file: string | null = null
|
|
59
|
+
|
|
60
|
+
const clear_click_timer = () => {
|
|
61
|
+
if (click_timer) clearTimeout(click_timer)
|
|
62
|
+
click_timer = null
|
|
63
|
+
click_timer_file = null
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Helper function to get the base file type (removing .gz extension)
|
|
67
|
+
const get_base_file_type = (file: FileInfo): string => {
|
|
68
|
+
if (type_mapper) return type_mapper(file)
|
|
69
|
+
if (file.type) return file.type.toLowerCase()
|
|
70
|
+
|
|
71
|
+
let base_name = file.name.toLowerCase()
|
|
72
|
+
if (base_name.endsWith(`.gz`)) base_name = base_name.slice(0, -3)
|
|
73
|
+
return base_name.split(`.`).pop() || `file`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Helper function to create normalized category identifier for filtering
|
|
77
|
+
const get_category_id = (file: FileInfo): string => {
|
|
78
|
+
if (!file.category) return `(uncategorized)`
|
|
79
|
+
return `${file.category_icon ?? ``} ${file.category}`.trim()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Filter files based on active filters
|
|
83
|
+
let filtered_files = $derived(
|
|
84
|
+
files.filter((file) => {
|
|
85
|
+
if (active_category_filter) {
|
|
86
|
+
return get_category_id(file) === active_category_filter
|
|
87
|
+
}
|
|
88
|
+
if (active_type_filter) {
|
|
89
|
+
const normalized_type = get_base_file_type(file)
|
|
90
|
+
return normalized_type === active_type_filter
|
|
91
|
+
}
|
|
92
|
+
return true
|
|
93
|
+
}),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
const toggle_filter = (kind: FilterKind, filter: string) => {
|
|
62
97
|
if (kind === `category`) {
|
|
63
|
-
|
|
64
|
-
|
|
98
|
+
active_category_filter = active_category_filter === filter ? null : filter
|
|
99
|
+
active_type_filter = null
|
|
100
|
+
} else {
|
|
101
|
+
active_type_filter = active_type_filter === filter ? null : filter
|
|
102
|
+
active_category_filter = null
|
|
65
103
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const handle_drag_start = (file) => (event) => {
|
|
72
|
-
const file_url = file.url || file.name; // Get the URL to drag (falling back to name)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const handle_drag_start = (file: FileInfo) => (event: DragEvent) => {
|
|
107
|
+
const file_url = file.url || file.name // Get the URL to drag (falling back to name)
|
|
108
|
+
|
|
73
109
|
const payload = JSON.stringify({
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
})
|
|
110
|
+
name: file.name,
|
|
111
|
+
url: file_url,
|
|
112
|
+
type: file.type || get_base_file_type(file),
|
|
113
|
+
category: file.category,
|
|
114
|
+
})
|
|
79
115
|
// Set file data as JSON for applications that can handle it
|
|
80
|
-
event.dataTransfer?.setData(`application/json`, payload)
|
|
116
|
+
event.dataTransfer?.setData(`application/json`, payload)
|
|
117
|
+
|
|
81
118
|
// Also set plain text as fallback for external applications
|
|
82
|
-
event.dataTransfer?.setData(`text/plain`, file_url)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
119
|
+
event.dataTransfer?.setData(`text/plain`, file_url)
|
|
120
|
+
|
|
121
|
+
on_drag_start?.(file, event)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Get unique file types/categories for format/category filters
|
|
125
|
+
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
|
+
)
|
|
88
129
|
</script>
|
|
89
130
|
|
|
90
131
|
<div class="file-picker" class:vertical={layout === `vertical`} {...rest}>
|
package/dist/Icon.svelte
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { SVGAttributes } from 'svelte/elements'
|
|
3
|
+
import { ICON_DATA, type IconName } from './icons'
|
|
4
|
+
import { sanitize_icon_svg } from './sanitize'
|
|
5
|
+
|
|
6
|
+
type IconData = { path: string; viewBox: string; stroke?: string }
|
|
7
|
+
let { icon, path, viewBox = `0 0 24 24`, stroke, ...rest }:
|
|
8
|
+
& { icon?: IconName }
|
|
9
|
+
& Partial<IconData>
|
|
10
|
+
& SVGAttributes<SVGSVGElement> = $props()
|
|
11
|
+
|
|
12
|
+
const data: IconData = $derived.by(() => {
|
|
13
|
+
if (path) return { path, viewBox: viewBox ?? `0 0 24 24`, stroke }
|
|
14
|
+
if (icon && icon in ICON_DATA) return ICON_DATA[icon]
|
|
15
|
+
if (icon) console.error(`Icon '${icon}' not found`)
|
|
16
|
+
return ICON_DATA.Alert
|
|
17
|
+
})
|
|
12
18
|
</script>
|
|
13
19
|
|
|
14
20
|
<svg
|
|
@@ -19,7 +25,7 @@ const data = $derived.by(() => {
|
|
|
19
25
|
{...rest}
|
|
20
26
|
>
|
|
21
27
|
{#if data.path.trim().startsWith(`<`)}
|
|
22
|
-
{@html data.path}
|
|
28
|
+
{@html sanitize_icon_svg(data.path)}
|
|
23
29
|
{:else}
|
|
24
30
|
<path d={data.path} />
|
|
25
31
|
{/if}
|
|
@@ -1,28 +1,34 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// Compact single-field input for Miller indices (hkl).
|
|
3
|
+
// Accepts "001", "111", "-101", "1 0 1", "10, 0, 1" and emits a Vec3 tuple.
|
|
4
|
+
import type { Vec3 } from './math'
|
|
5
|
+
|
|
6
|
+
let { value = $bindable([0, 0, 1]) }: { value?: Vec3 } = $props()
|
|
7
|
+
|
|
8
|
+
// Format: compact "001" for single-digit, spaced "10 0 1" for multi-digit
|
|
9
|
+
let hkl_text = $derived(
|
|
10
|
+
value.every((v) => Math.abs(v) < 10) ? value.join(``) : value.join(` `),
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// Parse hkl string: supports compact "001"/"-101" and spaced/comma "10, 0, 1"
|
|
14
|
+
function parse_hkl(input: string): Vec3 | null {
|
|
6
15
|
// Try spaced/comma format first (handles multi-digit)
|
|
7
|
-
const spaced = input.trim().split(/[,\s]+/)
|
|
16
|
+
const spaced = input.trim().split(/[,\s]+/)
|
|
8
17
|
if (spaced.length === 3) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return nums;
|
|
18
|
+
const nums = spaced.map(Number)
|
|
19
|
+
if (nums.every((n) => !isNaN(n))) return nums as Vec3
|
|
12
20
|
}
|
|
13
21
|
// Fall back to compact single-digit format: "001", "-101"
|
|
14
|
-
const compact = input.replace(/\s+/g, ``)
|
|
15
|
-
const match = compact.match(/^(-?\d)(-?\d)(-?\d)$/)
|
|
16
|
-
if (match)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
function handle_input(event) {
|
|
21
|
-
const parsed = parse_hkl(event.target.value)
|
|
22
|
-
if (parsed)
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
export {};
|
|
22
|
+
const compact = input.replace(/\s+/g, ``)
|
|
23
|
+
const match = compact.match(/^(-?\d)(-?\d)(-?\d)$/)
|
|
24
|
+
if (match) return [Number(match[1]), Number(match[2]), Number(match[3])] as Vec3
|
|
25
|
+
return null
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function handle_input(event: Event) {
|
|
29
|
+
const parsed = parse_hkl((event.target as HTMLInputElement).value)
|
|
30
|
+
if (parsed) value = parsed
|
|
31
|
+
}
|
|
26
32
|
</script>
|
|
27
33
|
|
|
28
34
|
<label class="miller-input">
|
package/dist/api/optimade.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// deno-lint-ignore-file no-await-in-loop
|
|
2
1
|
// OPTIMADE API utilities for fetching structure data
|
|
3
2
|
// Based on OPTIMADE 1.2.0 specification
|
|
4
3
|
// Multiple CORS proxies for fallback reliability
|
|
@@ -18,7 +17,7 @@ const RESOLVED_URLS_CACHE_DURATION = 10 * 60 * 1000;
|
|
|
18
17
|
async function fetch_with_cors_proxy(url) {
|
|
19
18
|
try {
|
|
20
19
|
const direct_response = await fetch(url, {
|
|
21
|
-
headers: {
|
|
20
|
+
headers: { Accept: `application/vnd.api+json`, 'User-Agent': `MatterViz/1.0` },
|
|
22
21
|
});
|
|
23
22
|
if (direct_response.ok)
|
|
24
23
|
return direct_response;
|
|
@@ -29,7 +28,7 @@ async function fetch_with_cors_proxy(url) {
|
|
|
29
28
|
for (const proxy of CORS_PROXIES) {
|
|
30
29
|
try {
|
|
31
30
|
const response = await fetch(`${proxy}${encodeURIComponent(url)}`, {
|
|
32
|
-
headers: {
|
|
31
|
+
headers: { Accept: `application/vnd.api+json`, 'User-Agent': `MatterViz/1.0` },
|
|
33
32
|
});
|
|
34
33
|
if (response.ok)
|
|
35
34
|
return response;
|
|
@@ -43,14 +42,15 @@ async function fetch_with_cors_proxy(url) {
|
|
|
43
42
|
async function resolve_provider_url(provider_base_url) {
|
|
44
43
|
const now = Date.now();
|
|
45
44
|
if (resolved_provider_urls[provider_base_url] &&
|
|
46
|
-
|
|
45
|
+
now - resolved_urls_cache_time < RESOLVED_URLS_CACHE_DURATION) {
|
|
47
46
|
return resolved_provider_urls[provider_base_url];
|
|
48
47
|
}
|
|
49
48
|
for (const endpoint of [`/links`, `/v1/links`]) {
|
|
50
49
|
try {
|
|
51
50
|
const response = await fetch_with_cors_proxy(`${provider_base_url}${endpoint}`);
|
|
52
51
|
const data = await response.json();
|
|
53
|
-
const self_link = data.data?.find((link) => link.type === `links` &&
|
|
52
|
+
const self_link = data.data?.find((link) => link.type === `links` &&
|
|
53
|
+
link.attributes?.base_url &&
|
|
54
54
|
link.attributes.link_type === `child`);
|
|
55
55
|
if (self_link?.attributes.base_url) {
|
|
56
56
|
resolved_provider_urls[provider_base_url] = self_link.attributes.base_url;
|
|
@@ -68,7 +68,7 @@ async function resolve_provider_url(provider_base_url) {
|
|
|
68
68
|
}
|
|
69
69
|
export async function fetch_optimade_providers() {
|
|
70
70
|
const now = Date.now();
|
|
71
|
-
if (cached_providers &&
|
|
71
|
+
if (cached_providers && now - providers_cache_time < CACHE_DURATION) {
|
|
72
72
|
return cached_providers;
|
|
73
73
|
}
|
|
74
74
|
try {
|