matterviz 0.4.2 → 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/FilePicker.svelte +40 -50
- package/dist/api/optimade.js +10 -7
- package/dist/app.css +15 -0
- package/dist/brillouin/BrillouinZone.svelte +18 -9
- package/dist/brillouin/BrillouinZoneScene.svelte +20 -29
- package/dist/brillouin/compute.js +10 -16
- package/dist/brillouin/geometry.js +2 -2
- package/dist/chempot-diagram/ChemPotDiagram.svelte +18 -15
- package/dist/chempot-diagram/ChemPotDiagram2D.svelte +17 -113
- package/dist/chempot-diagram/ChemPotDiagram3D.svelte +104 -264
- package/dist/chempot-diagram/async-compute.svelte.js +12 -13
- 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/export.js +1 -6
- package/dist/chempot-diagram/temperature.js +9 -10
- package/dist/composition/BarChart.svelte +7 -9
- package/dist/composition/Composition.svelte +3 -8
- package/dist/composition/Formula.svelte +2 -2
- package/dist/composition/FormulaFilter.svelte +27 -93
- package/dist/composition/format.js +6 -8
- package/dist/composition/parse.js +50 -105
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +6 -17
- package/dist/convex-hull/ConvexHull2D.svelte +0 -2
- package/dist/convex-hull/ConvexHull3D.svelte +19 -47
- package/dist/convex-hull/ConvexHull4D.svelte +65 -95
- package/dist/convex-hull/StructurePopup.svelte +1 -1
- package/dist/convex-hull/gas-thermodynamics.js +21 -53
- package/dist/convex-hull/helpers.js +1 -7
- package/dist/convex-hull/thermodynamics.js +19 -27
- package/dist/coordination/CoordinationBarPlot.svelte +12 -21
- package/dist/element/BohrAtom.svelte +0 -1
- package/dist/element/ElementTile.svelte +26 -44
- package/dist/element/data.d.ts +2 -0
- package/dist/element/data.js +5 -1
- package/dist/element/index.d.ts +1 -1
- package/dist/element/index.js +1 -1
- package/dist/fermi-surface/FermiSurface.svelte +22 -23
- package/dist/fermi-surface/FermiSurface.svelte.d.ts +2 -6
- package/dist/fermi-surface/FermiSurfaceScene.svelte +32 -77
- package/dist/fermi-surface/compute.js +22 -55
- package/dist/fermi-surface/parse.js +38 -70
- 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 +57 -84
- package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/io/ExportPane.svelte +1 -1
- package/dist/io/decompress.d.ts +2 -0
- package/dist/io/decompress.js +3 -2
- package/dist/io/export.d.ts +7 -4
- package/dist/io/export.js +70 -18
- package/dist/io/file-drop.js +60 -35
- package/dist/io/url-drop.d.ts +2 -0
- package/dist/io/url-drop.js +28 -16
- package/dist/isosurface/Isosurface.svelte +687 -196
- package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
- package/dist/isosurface/IsosurfaceControls.svelte +564 -85
- 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/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.js +1 -1
- package/dist/layout/InfoCard.svelte +1 -3
- package/dist/layout/SettingsSection.svelte +52 -61
- package/dist/layout/SettingsSection.svelte.d.ts +6 -7
- package/dist/layout/ViewerChrome.svelte +7 -1
- package/dist/layout/json-tree/JsonNode.svelte +14 -48
- package/dist/layout/json-tree/JsonTree.svelte +48 -95
- package/dist/layout/json-tree/JsonValue.svelte +3 -18
- package/dist/layout/json-tree/utils.d.ts +0 -3
- package/dist/layout/json-tree/utils.js +50 -179
- package/dist/marching-cubes.d.ts +8 -1
- package/dist/marching-cubes.js +115 -48
- package/dist/math.d.ts +3 -2
- package/dist/math.js +29 -38
- package/dist/overlays/ContextMenu.svelte +15 -32
- package/dist/overlays/DraggablePane.svelte +39 -58
- package/dist/overlays/DraggablePane.svelte.d.ts +1 -1
- package/dist/overlays/GlassChip.svelte +3 -1
- package/dist/periodic-table/PeriodicTableControls.svelte +26 -52
- package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +18 -34
- package/dist/phase-diagram/build-diagram.js +1 -6
- package/dist/phase-diagram/svg-to-diagram.js +9 -14
- package/dist/plot/bar/BarPlot.svelte +38 -42
- package/dist/plot/bar/SpacegroupBarPlot.svelte +18 -42
- package/dist/plot/box/BoxPlot.svelte +27 -23
- package/dist/plot/core/auto-place.d.ts +1 -1
- package/dist/plot/core/auto-place.js +1 -1
- package/dist/plot/core/data-transform.d.ts +1 -2
- package/dist/plot/core/data-transform.js +0 -10
- package/dist/plot/core/layout.d.ts +12 -5
- package/dist/plot/core/layout.js +37 -27
- 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/svg.js +0 -1
- package/dist/plot/core/utils/hierarchy-chart.d.ts +1 -0
- package/dist/plot/core/utils/hierarchy-chart.js +12 -0
- package/dist/plot/core/utils/hierarchy-labels.js +3 -2
- package/dist/plot/histogram/Histogram.svelte +21 -26
- package/dist/plot/sankey/sankey.js +13 -9
- package/dist/plot/scatter/BinnedScatterPlot.svelte +59 -43
- package/dist/plot/scatter/ScatterPlot.svelte +67 -52
- package/dist/plot/scatter/adaptive-density.d.ts +1 -1
- package/dist/plot/scatter/adaptive-density.js +36 -20
- package/dist/plot/sunburst/Sunburst.svelte +20 -20
- package/dist/plot/treemap/Treemap.svelte +175 -60
- package/dist/plot/treemap/Treemap.svelte.d.ts +6 -0
- package/dist/plot/treemap/index.d.ts +1 -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 +4 -2
- package/dist/plot/treemap/treemap.js +5 -2
- package/dist/rdf/RdfPlot.svelte +17 -35
- package/dist/rdf/calc-rdf.js +59 -44
- package/dist/rdf/index.d.ts +0 -1
- package/dist/sanitize.js +84 -26
- package/dist/scene/SceneCamera.svelte +1 -1
- package/dist/scene/SceneCamera.svelte.d.ts +1 -1
- 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.js +159 -482
- package/dist/spectral/Bands.svelte +151 -158
- package/dist/spectral/BrillouinBandsDos.svelte +4 -19
- package/dist/spectral/Dos.svelte +26 -24
- package/dist/spectral/helpers.js +40 -105
- package/dist/structure/AtomLegend.svelte +8 -13
- package/dist/structure/AtomLegend.svelte.d.ts +2 -3
- package/dist/structure/CellSelect.svelte +35 -10
- package/dist/structure/Structure.svelte +177 -99
- package/dist/structure/Structure.svelte.d.ts +1 -1
- package/dist/structure/StructureCarousel.svelte +10 -3
- package/dist/structure/StructureControls.svelte +8 -26
- package/dist/structure/StructureControls.svelte.d.ts +1 -1
- package/dist/structure/StructureInfoPane.svelte +65 -76
- package/dist/structure/StructureScene.svelte +75 -109
- package/dist/structure/StructureScene.svelte.d.ts +3 -1
- package/dist/structure/StructureViewport.svelte +120 -55
- package/dist/structure/StructureViewport.svelte.d.ts +3 -1
- package/dist/structure/atom-properties.d.ts +1 -1
- package/dist/structure/atom-properties.js +4 -3
- package/dist/structure/bond-order-perception.js +3 -8
- package/dist/structure/bonding.d.ts +0 -1
- package/dist/structure/bonding.js +16 -23
- package/dist/structure/export.js +50 -74
- package/dist/structure/format-detect.js +5 -7
- package/dist/structure/index.js +6 -12
- package/dist/structure/parse.js +38 -100
- package/dist/structure/partial-occupancy.js +7 -4
- package/dist/structure/pbc.js +8 -10
- package/dist/structure/polyhedra.js +5 -4
- package/dist/structure/prop-groups.d.ts +85 -0
- package/dist/structure/prop-groups.js +18 -0
- package/dist/symmetry/SymmetryStats.svelte +0 -4
- package/dist/symmetry/WyckoffTable.svelte +5 -4
- package/dist/symmetry/cell-transform.js +5 -14
- package/dist/symmetry/index.js +6 -9
- package/dist/table/HeatmapTable.svelte +61 -103
- package/dist/table/ToggleMenu.svelte +166 -44
- package/dist/table/ToggleMenu.svelte.d.ts +1 -1
- package/dist/theme/embedded.d.ts +18 -0
- package/dist/theme/embedded.js +206 -0
- package/dist/theme/index.d.ts +4 -0
- package/dist/theme/index.js +1 -2
- package/dist/theme/themes.mjs +31 -60
- package/dist/tooltip/TooltipContent.svelte +1 -1
- package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
- package/dist/tooltip/index.d.ts +8 -1
- package/dist/trajectory/Trajectory.svelte +140 -120
- package/dist/trajectory/TrajectoryError.svelte +1 -66
- package/dist/trajectory/TrajectoryExportPane.svelte +0 -1
- package/dist/trajectory/TrajectoryInfoPane.svelte +55 -80
- package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
- package/dist/trajectory/extract.js +19 -29
- package/dist/trajectory/format-detect.d.ts +2 -0
- package/dist/trajectory/format-detect.js +7 -5
- package/dist/trajectory/frame-reader.js +3 -4
- package/dist/trajectory/helpers.js +16 -49
- package/dist/trajectory/index.js +2 -8
- package/dist/trajectory/parse/ase.js +1 -1
- package/dist/trajectory/parse/index.d.ts +4 -3
- package/dist/trajectory/parse/index.js +12 -17
- package/dist/trajectory/parse/vaspout-h5.d.ts +0 -1
- package/dist/trajectory/parse/vaspout-h5.js +1 -4
- package/dist/trajectory/parse/xyz.js +48 -2
- package/dist/trajectory/plotting.js +14 -37
- package/dist/xrd/XrdPlot.svelte +43 -68
- package/dist/xrd/calc-xrd.js +22 -58
- package/dist/xrd/parse.js +13 -22
- package/package.json +40 -8
- package/readme.md +6 -5
- 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
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type DefaultSettings } from '../settings';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
value: unknown;
|
|
4
|
+
defaults?: DefaultSettings;
|
|
5
|
+
filename?: string;
|
|
6
|
+
};
|
|
7
|
+
declare const JsonBrowser: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type JsonBrowser = ReturnType<typeof JsonBrowser>;
|
|
9
|
+
export default JsonBrowser;
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Icon from '../Icon.svelte'
|
|
3
|
+
import { BarPlot, Histogram, ScatterPlot } from '../plot'
|
|
4
|
+
import ScatterPlot3D from '../plot/scatter-3d/ScatterPlot3D.svelte'
|
|
5
|
+
import type { Label, RowData } from '../table'
|
|
6
|
+
import HeatmapTable from '../table/HeatmapTable.svelte'
|
|
7
|
+
import {
|
|
8
|
+
build_bar_series,
|
|
9
|
+
build_histogram_series,
|
|
10
|
+
build_scatter3d_series,
|
|
11
|
+
build_scatter_series,
|
|
12
|
+
col_keys,
|
|
13
|
+
extract_columns,
|
|
14
|
+
suggest_mapping,
|
|
15
|
+
} from './plot-utils'
|
|
16
|
+
import type { PlotType, AxisMapping } from './plot-utils'
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
data,
|
|
20
|
+
initial_type,
|
|
21
|
+
onclose,
|
|
22
|
+
}: {
|
|
23
|
+
data: unknown
|
|
24
|
+
initial_type?: PlotType
|
|
25
|
+
onclose?: () => void
|
|
26
|
+
} = $props()
|
|
27
|
+
|
|
28
|
+
let columns = $derived(extract_columns(data))
|
|
29
|
+
let suggestion = $derived(suggest_mapping(columns))
|
|
30
|
+
|
|
31
|
+
let plot_type = $state<PlotType>(`scatter`)
|
|
32
|
+
let mapping = $state<AxisMapping>({})
|
|
33
|
+
|
|
34
|
+
// Initialize from suggestion (or explicit initial_type) when columns change
|
|
35
|
+
$effect(() => {
|
|
36
|
+
plot_type = initial_type ?? suggestion.plot_type
|
|
37
|
+
mapping = { ...suggestion.mapping }
|
|
38
|
+
zoom_level = 1
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
let numeric_keys = $derived(col_keys(columns, `numeric`))
|
|
42
|
+
let string_keys = $derived(col_keys(columns, `string`))
|
|
43
|
+
// X options: numeric for scatter/histogram, numeric + string for bar
|
|
44
|
+
let x_keys = $derived(plot_type === `bar` ? [...string_keys, ...numeric_keys] : numeric_keys)
|
|
45
|
+
|
|
46
|
+
// Build the appropriate series from current mapping
|
|
47
|
+
let scatter_series = $derived(
|
|
48
|
+
plot_type === `scatter` ? [build_scatter_series(columns, mapping)] : [],
|
|
49
|
+
)
|
|
50
|
+
let scatter3d_series = $derived(
|
|
51
|
+
plot_type === `scatter3d` ? [build_scatter3d_series(columns, mapping)] : [],
|
|
52
|
+
)
|
|
53
|
+
let bar_series = $derived(plot_type === `bar` ? [build_bar_series(columns, mapping)] : [])
|
|
54
|
+
let histogram_series = $derived(
|
|
55
|
+
plot_type === `histogram` ? [build_histogram_series(columns, mapping)] : [],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
// Prepare table data (row-based format for HeatmapTable)
|
|
59
|
+
let table_data = $derived.by<RowData[]>(() => {
|
|
60
|
+
if (plot_type !== `table` || data == null) return []
|
|
61
|
+
if (Array.isArray(data)) return data as RowData[]
|
|
62
|
+
const rec = data as Record<string, unknown[]>
|
|
63
|
+
const keys = Object.keys(rec).filter((key) => Array.isArray(rec[key]))
|
|
64
|
+
if (keys.length === 0) return []
|
|
65
|
+
return Array.from(
|
|
66
|
+
{ length: (rec[keys[0]] as unknown[]).length },
|
|
67
|
+
(_, idx) =>
|
|
68
|
+
Object.fromEntries(keys.map((key) => [key, (rec[key] as unknown[])[idx]])) as RowData,
|
|
69
|
+
)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
// Generate column labels from extracted columns for HeatmapTable
|
|
73
|
+
let table_columns = $derived<Label[]>(
|
|
74
|
+
[...columns.entries()].map(([key, col]) => {
|
|
75
|
+
if (col.type !== `numeric`) return { label: key, color_scale: null }
|
|
76
|
+
const is_integer = col.values.every(
|
|
77
|
+
(val) => val == null || (typeof val === `number` && Number.isInteger(val)),
|
|
78
|
+
)
|
|
79
|
+
return {
|
|
80
|
+
label: key,
|
|
81
|
+
color_scale: `interpolateViridis` as const,
|
|
82
|
+
format: is_integer ? `,d` : `.4~g`,
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
function col_label(key: string): string {
|
|
88
|
+
const col = columns.get(key)
|
|
89
|
+
const prefix = col?.type === `numeric` ? `#` : `A`
|
|
90
|
+
return `${prefix} ${key}`
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Available plot types based on columns
|
|
94
|
+
let available_types = $derived.by<{ value: PlotType; label: string }[]>(() => {
|
|
95
|
+
const types: { value: PlotType; label: string }[] = []
|
|
96
|
+
if (numeric_keys.length >= 2) types.push({ value: `scatter`, label: `Scatter` })
|
|
97
|
+
if (numeric_keys.length >= 3) {
|
|
98
|
+
types.push({ value: `scatter3d`, label: `Scatter 3D` })
|
|
99
|
+
}
|
|
100
|
+
if (string_keys.length >= 1 && numeric_keys.length >= 1) {
|
|
101
|
+
types.push({ value: `bar`, label: `Bar` })
|
|
102
|
+
}
|
|
103
|
+
if (numeric_keys.length >= 1) {
|
|
104
|
+
types.push({ value: `histogram`, label: `Histogram` })
|
|
105
|
+
}
|
|
106
|
+
types.push({ value: `table`, label: `Table` })
|
|
107
|
+
return types
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
// Data point count for the toolbar badge
|
|
111
|
+
let data_count = $derived.by(() => {
|
|
112
|
+
if (Array.isArray(data)) return data.length
|
|
113
|
+
const first_col = [...columns.values()][0]
|
|
114
|
+
return first_col?.values.length ?? 0
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
// Pinch-to-zoom: trackpad pinch fires wheel events with ctrlKey=true
|
|
118
|
+
let zoom_level = $state(1)
|
|
119
|
+
function on_pinch_zoom(event: WheelEvent): void {
|
|
120
|
+
if (!event.ctrlKey) return
|
|
121
|
+
event.preventDefault()
|
|
122
|
+
const delta = -event.deltaY * 0.01
|
|
123
|
+
zoom_level = Math.min(5, Math.max(0.25, zoom_level + delta))
|
|
124
|
+
}
|
|
125
|
+
function reset_zoom(): void {
|
|
126
|
+
zoom_level = 1
|
|
127
|
+
}
|
|
128
|
+
</script>
|
|
129
|
+
|
|
130
|
+
{#if columns.size > 0}
|
|
131
|
+
<div class="plot-panel">
|
|
132
|
+
<div class="toolbar">
|
|
133
|
+
{#if onclose}
|
|
134
|
+
<button class="close-btn" onclick={onclose} title="Back to overview (Esc)">
|
|
135
|
+
×
|
|
136
|
+
</button>
|
|
137
|
+
{/if}
|
|
138
|
+
<select bind:value={plot_type}>
|
|
139
|
+
{#each available_types as opt (opt.value)}
|
|
140
|
+
<option value={opt.value}>{opt.label}</option>
|
|
141
|
+
{/each}
|
|
142
|
+
</select>
|
|
143
|
+
|
|
144
|
+
{#snippet axis_select(label: string, axis: keyof AxisMapping, keys: string[])}
|
|
145
|
+
<label>
|
|
146
|
+
{label}
|
|
147
|
+
<select bind:value={mapping[axis]}>
|
|
148
|
+
<option value={undefined}>--</option>
|
|
149
|
+
{#each keys as key (key)}
|
|
150
|
+
<option value={key}>{col_label(key)}</option>
|
|
151
|
+
{/each}
|
|
152
|
+
</select>
|
|
153
|
+
</label>
|
|
154
|
+
{/snippet}
|
|
155
|
+
|
|
156
|
+
{#if plot_type !== `table`}
|
|
157
|
+
{@render axis_select(`X`, `x`, x_keys)}
|
|
158
|
+
{/if}
|
|
159
|
+
{#if plot_type !== `histogram` && plot_type !== `table`}
|
|
160
|
+
{@render axis_select(`Y`, `y`, numeric_keys)}
|
|
161
|
+
{/if}
|
|
162
|
+
{#if plot_type === `scatter3d`}
|
|
163
|
+
{@render axis_select(`Z`, `z`, numeric_keys)}
|
|
164
|
+
{/if}
|
|
165
|
+
{#if plot_type === `scatter` || plot_type === `scatter3d`}
|
|
166
|
+
{@render axis_select(`Color`, `color`, numeric_keys)}
|
|
167
|
+
{@render axis_select(`Size`, `size`, numeric_keys)}
|
|
168
|
+
{/if}
|
|
169
|
+
<span class="data-badge">
|
|
170
|
+
{data_count.toLocaleString()} rows · {columns.size} cols
|
|
171
|
+
</span>
|
|
172
|
+
{#if zoom_level !== 1}
|
|
173
|
+
<span class="zoom-control">
|
|
174
|
+
<input
|
|
175
|
+
type="number"
|
|
176
|
+
aria-label="Zoom percentage"
|
|
177
|
+
min="25"
|
|
178
|
+
max="500"
|
|
179
|
+
step="25"
|
|
180
|
+
value={Math.round(zoom_level * 100)}
|
|
181
|
+
oninput={(event) => {
|
|
182
|
+
const pct = Number(event.currentTarget.value)
|
|
183
|
+
if (pct >= 25 && pct <= 500) zoom_level = pct / 100
|
|
184
|
+
}}
|
|
185
|
+
/>%
|
|
186
|
+
<button class="zoom-reset-btn" onclick={reset_zoom} title="Reset zoom">
|
|
187
|
+
<Icon icon="Reset" style="width: 12px; height: 12px" />
|
|
188
|
+
</button>
|
|
189
|
+
</span>
|
|
190
|
+
{/if}
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
194
|
+
<div class="plot-viewport" onwheel={on_pinch_zoom} ondblclick={reset_zoom}>
|
|
195
|
+
<div
|
|
196
|
+
class="plot-container"
|
|
197
|
+
style:transform="scale({zoom_level})"
|
|
198
|
+
style:transform-origin="top left"
|
|
199
|
+
style:width="{100 / zoom_level}%"
|
|
200
|
+
style:height="{100 / zoom_level}%"
|
|
201
|
+
>
|
|
202
|
+
{#if plot_type === `scatter`}
|
|
203
|
+
<ScatterPlot
|
|
204
|
+
series={scatter_series}
|
|
205
|
+
x_axis={{ label: mapping.x ?? `x` }}
|
|
206
|
+
y_axis={{ label: mapping.y ?? `y` }}
|
|
207
|
+
color_bar={mapping.color ? { title: mapping.color } : undefined}
|
|
208
|
+
style="height: 100%"
|
|
209
|
+
/>
|
|
210
|
+
{:else if plot_type === `scatter3d`}
|
|
211
|
+
<ScatterPlot3D
|
|
212
|
+
series={scatter3d_series}
|
|
213
|
+
x_axis={{ label: mapping.x ?? `x` }}
|
|
214
|
+
y_axis={{ label: mapping.y ?? `y` }}
|
|
215
|
+
z_axis={{ label: mapping.z ?? `z` }}
|
|
216
|
+
color_bar={mapping.color ? { title: mapping.color } : undefined}
|
|
217
|
+
style="height: 100%"
|
|
218
|
+
/>
|
|
219
|
+
{:else if plot_type === `bar`}
|
|
220
|
+
<BarPlot
|
|
221
|
+
series={bar_series}
|
|
222
|
+
x_axis={{ label: mapping.x ?? `x` }}
|
|
223
|
+
y_axis={{ label: mapping.y ?? `y` }}
|
|
224
|
+
style="height: 100%"
|
|
225
|
+
/>
|
|
226
|
+
{:else if plot_type === `histogram`}
|
|
227
|
+
<Histogram
|
|
228
|
+
series={histogram_series}
|
|
229
|
+
x_axis={{ label: mapping.x ?? mapping.y ?? `value` }}
|
|
230
|
+
y_axis={{ label: `Count` }}
|
|
231
|
+
style="height: 100%"
|
|
232
|
+
/>
|
|
233
|
+
{:else if plot_type === `table`}
|
|
234
|
+
<HeatmapTable
|
|
235
|
+
data={table_data}
|
|
236
|
+
columns={table_columns}
|
|
237
|
+
search
|
|
238
|
+
export_data
|
|
239
|
+
allow_better_toggle
|
|
240
|
+
show_controls
|
|
241
|
+
scroll_style="max-height: 100%"
|
|
242
|
+
style="height: 100%; text-align: left"
|
|
243
|
+
/>
|
|
244
|
+
{/if}
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
{:else}
|
|
249
|
+
<div class="plot-panel empty">
|
|
250
|
+
<p>No plottable columns found</p>
|
|
251
|
+
</div>
|
|
252
|
+
{/if}
|
|
253
|
+
|
|
254
|
+
<style>
|
|
255
|
+
.plot-panel {
|
|
256
|
+
display: flex;
|
|
257
|
+
flex-direction: column;
|
|
258
|
+
height: 100%;
|
|
259
|
+
overflow: hidden;
|
|
260
|
+
}
|
|
261
|
+
.toolbar {
|
|
262
|
+
display: flex;
|
|
263
|
+
flex-wrap: wrap;
|
|
264
|
+
gap: 4px 14px;
|
|
265
|
+
padding: 6px 10px;
|
|
266
|
+
background: var(--vscode-editor-background, #1e1e1e);
|
|
267
|
+
border-bottom: 1px solid var(--vscode-panel-border, #333);
|
|
268
|
+
align-items: center;
|
|
269
|
+
font-size: 12px;
|
|
270
|
+
}
|
|
271
|
+
.toolbar label {
|
|
272
|
+
display: flex;
|
|
273
|
+
align-items: center;
|
|
274
|
+
gap: 3px;
|
|
275
|
+
color: var(--vscode-foreground, #ccc);
|
|
276
|
+
font-weight: 500;
|
|
277
|
+
}
|
|
278
|
+
.close-btn {
|
|
279
|
+
background: none;
|
|
280
|
+
border: none;
|
|
281
|
+
color: var(--vscode-foreground, #ccc);
|
|
282
|
+
font-size: 16px;
|
|
283
|
+
cursor: pointer;
|
|
284
|
+
padding: 0 4px;
|
|
285
|
+
line-height: 1;
|
|
286
|
+
opacity: 0.5;
|
|
287
|
+
&:hover {
|
|
288
|
+
opacity: 1;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
.toolbar select {
|
|
292
|
+
background: var(--vscode-input-background, #3c3c3c);
|
|
293
|
+
color: var(--vscode-input-foreground, #ccc);
|
|
294
|
+
border: 1px solid var(--vscode-input-border, #555);
|
|
295
|
+
border-radius: 3px;
|
|
296
|
+
padding: 2px 4px;
|
|
297
|
+
font-size: 11px;
|
|
298
|
+
max-width: 140px;
|
|
299
|
+
}
|
|
300
|
+
.plot-viewport {
|
|
301
|
+
flex: 1;
|
|
302
|
+
min-height: 0;
|
|
303
|
+
overflow: auto;
|
|
304
|
+
}
|
|
305
|
+
.plot-container {
|
|
306
|
+
width: 100%;
|
|
307
|
+
height: 100%;
|
|
308
|
+
}
|
|
309
|
+
.data-badge {
|
|
310
|
+
color: var(--vscode-descriptionForeground, #888);
|
|
311
|
+
font-size: 11px;
|
|
312
|
+
margin-left: auto;
|
|
313
|
+
}
|
|
314
|
+
.zoom-control {
|
|
315
|
+
display: flex;
|
|
316
|
+
align-items: center;
|
|
317
|
+
gap: 2px;
|
|
318
|
+
color: var(--vscode-foreground, #ccc);
|
|
319
|
+
font-size: 11px;
|
|
320
|
+
input {
|
|
321
|
+
width: 3.5em;
|
|
322
|
+
box-sizing: border-box;
|
|
323
|
+
background: var(--vscode-input-background, #3c3c3c);
|
|
324
|
+
color: var(--vscode-input-foreground, #ccc);
|
|
325
|
+
border: 1px solid var(--vscode-input-border, #555);
|
|
326
|
+
border-radius: 3px;
|
|
327
|
+
padding: 1px 3px;
|
|
328
|
+
font-size: 11px;
|
|
329
|
+
text-align: right;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
.zoom-reset-btn {
|
|
333
|
+
background: none;
|
|
334
|
+
border: none;
|
|
335
|
+
color: var(--vscode-foreground, #ccc);
|
|
336
|
+
cursor: pointer;
|
|
337
|
+
padding: 2px;
|
|
338
|
+
display: flex;
|
|
339
|
+
opacity: 0.7;
|
|
340
|
+
&:hover {
|
|
341
|
+
opacity: 1;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
.empty {
|
|
345
|
+
display: flex;
|
|
346
|
+
align-items: center;
|
|
347
|
+
justify-content: center;
|
|
348
|
+
color: var(--vscode-descriptionForeground, #888);
|
|
349
|
+
}
|
|
350
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PlotType } from './plot-utils';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: unknown;
|
|
4
|
+
initial_type?: PlotType;
|
|
5
|
+
onclose?: () => void;
|
|
6
|
+
};
|
|
7
|
+
declare const PlotPanel: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type PlotPanel = ReturnType<typeof PlotPanel>;
|
|
9
|
+
export default PlotPanel;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// Trajectory viewer with an electronic DOS panel below it, for vaspout.h5
|
|
3
|
+
// files that carry results/electron_dos alongside the ionic trajectory.
|
|
4
|
+
// Single component so create_display keeps returning one mountable app.
|
|
5
|
+
import type { DosInput } from '../spectral'
|
|
6
|
+
import Dos from '../spectral/Dos.svelte'
|
|
7
|
+
import Trajectory from '../trajectory/Trajectory.svelte'
|
|
8
|
+
import type { ComponentProps } from 'svelte'
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
dos,
|
|
12
|
+
trajectory_props,
|
|
13
|
+
}: {
|
|
14
|
+
dos: DosInput
|
|
15
|
+
trajectory_props: ComponentProps<typeof Trajectory>
|
|
16
|
+
} = $props()
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<div class="trajectory-with-dos">
|
|
20
|
+
<Trajectory {...trajectory_props} style={`${trajectory_props.style ?? ``}; min-height: 0`} />
|
|
21
|
+
<Dos doses={dos} style="min-height: 0" />
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<style>
|
|
25
|
+
.trajectory-with-dos {
|
|
26
|
+
display: grid;
|
|
27
|
+
grid-template-rows: minmax(0, 2fr) minmax(0, 1fr);
|
|
28
|
+
height: 100%;
|
|
29
|
+
}
|
|
30
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DosInput } from '../spectral';
|
|
2
|
+
import Trajectory from '../trajectory/Trajectory.svelte';
|
|
3
|
+
import type { ComponentProps } from 'svelte';
|
|
4
|
+
type $$ComponentProps = {
|
|
5
|
+
dos: DosInput;
|
|
6
|
+
trajectory_props: ComponentProps<typeof Trajectory>;
|
|
7
|
+
};
|
|
8
|
+
declare const TrajectoryWithDos: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
9
|
+
type TrajectoryWithDos = ReturnType<typeof TrajectoryWithDos>;
|
|
10
|
+
export default TrajectoryWithDos;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { resolve_path } from '../json-path';
|
|
2
|
+
export type RenderableType = `structure` | `fermi_surface` | `band_grid` | `convex_hull` | `volumetric` | `phase_diagram` | `band_structure` | `dos` | `bands_and_dos` | `brillouin_zone` | `xrd` | `table` | `plot`;
|
|
3
|
+
export declare const TYPE_LABELS: Record<RenderableType, string>;
|
|
4
|
+
export declare const TYPE_COLORS: Record<RenderableType, string>;
|
|
5
|
+
export declare function is_plottable_data(obj: unknown): boolean;
|
|
6
|
+
export declare function detect_view_type(value: unknown): RenderableType | null;
|
|
7
|
+
interface RenderablePath {
|
|
8
|
+
type: RenderableType;
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function scan_renderable_paths(obj: unknown, prefix?: string, max_depth?: number): Map<string, RenderablePath>;
|