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.
Files changed (244) hide show
  1. package/dist/FilePicker.svelte +40 -50
  2. package/dist/api/optimade.js +10 -7
  3. package/dist/app.css +15 -0
  4. package/dist/brillouin/BrillouinZone.svelte +18 -9
  5. package/dist/brillouin/BrillouinZoneScene.svelte +20 -29
  6. package/dist/brillouin/compute.js +10 -16
  7. package/dist/brillouin/geometry.js +2 -2
  8. package/dist/chempot-diagram/ChemPotDiagram.svelte +18 -15
  9. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +17 -113
  10. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +104 -264
  11. package/dist/chempot-diagram/async-compute.svelte.js +12 -13
  12. package/dist/chempot-diagram/color.d.ts +21 -1
  13. package/dist/chempot-diagram/color.js +70 -1
  14. package/dist/chempot-diagram/compute.d.ts +7 -0
  15. package/dist/chempot-diagram/compute.js +85 -26
  16. package/dist/chempot-diagram/export.js +1 -6
  17. package/dist/chempot-diagram/temperature.js +9 -10
  18. package/dist/composition/BarChart.svelte +7 -9
  19. package/dist/composition/Composition.svelte +3 -8
  20. package/dist/composition/Formula.svelte +2 -2
  21. package/dist/composition/FormulaFilter.svelte +27 -93
  22. package/dist/composition/format.js +6 -8
  23. package/dist/composition/parse.js +50 -105
  24. package/dist/constants.d.ts +0 -1
  25. package/dist/constants.js +6 -17
  26. package/dist/convex-hull/ConvexHull2D.svelte +0 -2
  27. package/dist/convex-hull/ConvexHull3D.svelte +19 -47
  28. package/dist/convex-hull/ConvexHull4D.svelte +65 -95
  29. package/dist/convex-hull/StructurePopup.svelte +1 -1
  30. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  31. package/dist/convex-hull/helpers.js +1 -7
  32. package/dist/convex-hull/thermodynamics.js +19 -27
  33. package/dist/coordination/CoordinationBarPlot.svelte +12 -21
  34. package/dist/element/BohrAtom.svelte +0 -1
  35. package/dist/element/ElementTile.svelte +26 -44
  36. package/dist/element/data.d.ts +2 -0
  37. package/dist/element/data.js +5 -1
  38. package/dist/element/index.d.ts +1 -1
  39. package/dist/element/index.js +1 -1
  40. package/dist/fermi-surface/FermiSurface.svelte +22 -23
  41. package/dist/fermi-surface/FermiSurface.svelte.d.ts +2 -6
  42. package/dist/fermi-surface/FermiSurfaceScene.svelte +32 -77
  43. package/dist/fermi-surface/compute.js +22 -55
  44. package/dist/fermi-surface/parse.js +38 -70
  45. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  46. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  47. package/dist/file-viewer/PlotPanel.svelte +350 -0
  48. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  49. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  50. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  51. package/dist/file-viewer/detect.d.ts +11 -0
  52. package/dist/file-viewer/detect.js +381 -0
  53. package/dist/file-viewer/eligibility.d.ts +4 -0
  54. package/dist/file-viewer/eligibility.js +53 -0
  55. package/dist/file-viewer/host-protocol.d.ts +50 -0
  56. package/dist/file-viewer/host-transfer.d.ts +25 -0
  57. package/dist/file-viewer/host-transfer.js +42 -0
  58. package/dist/file-viewer/index.d.ts +5 -0
  59. package/dist/file-viewer/index.js +5 -0
  60. package/dist/file-viewer/main.d.ts +44 -0
  61. package/dist/file-viewer/main.js +535 -0
  62. package/dist/file-viewer/parse.d.ts +9 -0
  63. package/dist/file-viewer/parse.js +170 -0
  64. package/dist/file-viewer/plot-utils.d.ts +24 -0
  65. package/dist/file-viewer/plot-utils.js +191 -0
  66. package/dist/file-viewer/types.d.ts +4 -0
  67. package/dist/file-viewer/types.js +5 -0
  68. package/dist/heatmap-matrix/HeatmapMatrix.svelte +57 -84
  69. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  70. package/dist/index.d.ts +2 -2
  71. package/dist/index.js +1 -1
  72. package/dist/io/ExportPane.svelte +1 -1
  73. package/dist/io/decompress.d.ts +2 -0
  74. package/dist/io/decompress.js +3 -2
  75. package/dist/io/export.d.ts +7 -4
  76. package/dist/io/export.js +70 -18
  77. package/dist/io/file-drop.js +60 -35
  78. package/dist/io/url-drop.d.ts +2 -0
  79. package/dist/io/url-drop.js +28 -16
  80. package/dist/isosurface/Isosurface.svelte +687 -196
  81. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  82. package/dist/isosurface/IsosurfaceControls.svelte +564 -85
  83. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  84. package/dist/isosurface/VolumeSlice.svelte +224 -0
  85. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  86. package/dist/isosurface/coloring.d.ts +20 -0
  87. package/dist/isosurface/coloring.js +118 -0
  88. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  89. package/dist/isosurface/geometry.worker.d.ts +1 -0
  90. package/dist/isosurface/geometry.worker.js +59 -0
  91. package/dist/isosurface/grid.d.ts +10 -0
  92. package/dist/isosurface/grid.js +31 -0
  93. package/dist/isosurface/index.d.ts +4 -0
  94. package/dist/isosurface/index.js +4 -0
  95. package/dist/isosurface/profile.d.ts +12 -0
  96. package/dist/isosurface/profile.js +19 -0
  97. package/dist/isosurface/sampling.d.ts +34 -0
  98. package/dist/isosurface/sampling.js +408 -0
  99. package/dist/isosurface/slice-rendering.d.ts +13 -0
  100. package/dist/isosurface/slice-rendering.js +79 -0
  101. package/dist/isosurface/slice.d.ts +22 -2
  102. package/dist/isosurface/slice.js +200 -116
  103. package/dist/isosurface/types.d.ts +24 -1
  104. package/dist/isosurface/types.js +120 -8
  105. package/dist/json-path.d.ts +4 -0
  106. package/dist/json-path.js +89 -0
  107. package/dist/labels.js +1 -1
  108. package/dist/layout/InfoCard.svelte +1 -3
  109. package/dist/layout/SettingsSection.svelte +52 -61
  110. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  111. package/dist/layout/ViewerChrome.svelte +7 -1
  112. package/dist/layout/json-tree/JsonNode.svelte +14 -48
  113. package/dist/layout/json-tree/JsonTree.svelte +48 -95
  114. package/dist/layout/json-tree/JsonValue.svelte +3 -18
  115. package/dist/layout/json-tree/utils.d.ts +0 -3
  116. package/dist/layout/json-tree/utils.js +50 -179
  117. package/dist/marching-cubes.d.ts +8 -1
  118. package/dist/marching-cubes.js +115 -48
  119. package/dist/math.d.ts +3 -2
  120. package/dist/math.js +29 -38
  121. package/dist/overlays/ContextMenu.svelte +15 -32
  122. package/dist/overlays/DraggablePane.svelte +39 -58
  123. package/dist/overlays/DraggablePane.svelte.d.ts +1 -1
  124. package/dist/overlays/GlassChip.svelte +3 -1
  125. package/dist/periodic-table/PeriodicTableControls.svelte +26 -52
  126. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +18 -34
  127. package/dist/phase-diagram/build-diagram.js +1 -6
  128. package/dist/phase-diagram/svg-to-diagram.js +9 -14
  129. package/dist/plot/bar/BarPlot.svelte +38 -42
  130. package/dist/plot/bar/SpacegroupBarPlot.svelte +18 -42
  131. package/dist/plot/box/BoxPlot.svelte +27 -23
  132. package/dist/plot/core/auto-place.d.ts +1 -1
  133. package/dist/plot/core/auto-place.js +1 -1
  134. package/dist/plot/core/data-transform.d.ts +1 -2
  135. package/dist/plot/core/data-transform.js +0 -10
  136. package/dist/plot/core/layout.d.ts +12 -5
  137. package/dist/plot/core/layout.js +37 -27
  138. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  139. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  140. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  141. package/dist/plot/core/placed-tween.svelte.js +68 -21
  142. package/dist/plot/core/svg.js +0 -1
  143. package/dist/plot/core/utils/hierarchy-chart.d.ts +1 -0
  144. package/dist/plot/core/utils/hierarchy-chart.js +12 -0
  145. package/dist/plot/core/utils/hierarchy-labels.js +3 -2
  146. package/dist/plot/histogram/Histogram.svelte +21 -26
  147. package/dist/plot/sankey/sankey.js +13 -9
  148. package/dist/plot/scatter/BinnedScatterPlot.svelte +59 -43
  149. package/dist/plot/scatter/ScatterPlot.svelte +67 -52
  150. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  151. package/dist/plot/scatter/adaptive-density.js +36 -20
  152. package/dist/plot/sunburst/Sunburst.svelte +20 -20
  153. package/dist/plot/treemap/Treemap.svelte +175 -60
  154. package/dist/plot/treemap/Treemap.svelte.d.ts +6 -0
  155. package/dist/plot/treemap/index.d.ts +1 -0
  156. package/dist/plot/treemap/labels.d.ts +38 -0
  157. package/dist/plot/treemap/labels.js +80 -0
  158. package/dist/plot/treemap/treemap.d.ts +4 -2
  159. package/dist/plot/treemap/treemap.js +5 -2
  160. package/dist/rdf/RdfPlot.svelte +17 -35
  161. package/dist/rdf/calc-rdf.js +59 -44
  162. package/dist/rdf/index.d.ts +0 -1
  163. package/dist/sanitize.js +84 -26
  164. package/dist/scene/SceneCamera.svelte +1 -1
  165. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  166. package/dist/scene/index.d.ts +1 -2
  167. package/dist/scene/index.js +1 -1
  168. package/dist/scene/{props.js → props.svelte.js} +15 -1
  169. package/dist/settings.js +159 -482
  170. package/dist/spectral/Bands.svelte +151 -158
  171. package/dist/spectral/BrillouinBandsDos.svelte +4 -19
  172. package/dist/spectral/Dos.svelte +26 -24
  173. package/dist/spectral/helpers.js +40 -105
  174. package/dist/structure/AtomLegend.svelte +8 -13
  175. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  176. package/dist/structure/CellSelect.svelte +35 -10
  177. package/dist/structure/Structure.svelte +177 -99
  178. package/dist/structure/Structure.svelte.d.ts +1 -1
  179. package/dist/structure/StructureCarousel.svelte +10 -3
  180. package/dist/structure/StructureControls.svelte +8 -26
  181. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  182. package/dist/structure/StructureInfoPane.svelte +65 -76
  183. package/dist/structure/StructureScene.svelte +75 -109
  184. package/dist/structure/StructureScene.svelte.d.ts +3 -1
  185. package/dist/structure/StructureViewport.svelte +120 -55
  186. package/dist/structure/StructureViewport.svelte.d.ts +3 -1
  187. package/dist/structure/atom-properties.d.ts +1 -1
  188. package/dist/structure/atom-properties.js +4 -3
  189. package/dist/structure/bond-order-perception.js +3 -8
  190. package/dist/structure/bonding.d.ts +0 -1
  191. package/dist/structure/bonding.js +16 -23
  192. package/dist/structure/export.js +50 -74
  193. package/dist/structure/format-detect.js +5 -7
  194. package/dist/structure/index.js +6 -12
  195. package/dist/structure/parse.js +38 -100
  196. package/dist/structure/partial-occupancy.js +7 -4
  197. package/dist/structure/pbc.js +8 -10
  198. package/dist/structure/polyhedra.js +5 -4
  199. package/dist/structure/prop-groups.d.ts +85 -0
  200. package/dist/structure/prop-groups.js +18 -0
  201. package/dist/symmetry/SymmetryStats.svelte +0 -4
  202. package/dist/symmetry/WyckoffTable.svelte +5 -4
  203. package/dist/symmetry/cell-transform.js +5 -14
  204. package/dist/symmetry/index.js +6 -9
  205. package/dist/table/HeatmapTable.svelte +61 -103
  206. package/dist/table/ToggleMenu.svelte +166 -44
  207. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  208. package/dist/theme/embedded.d.ts +18 -0
  209. package/dist/theme/embedded.js +206 -0
  210. package/dist/theme/index.d.ts +4 -0
  211. package/dist/theme/index.js +1 -2
  212. package/dist/theme/themes.mjs +31 -60
  213. package/dist/tooltip/TooltipContent.svelte +1 -1
  214. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  215. package/dist/tooltip/index.d.ts +8 -1
  216. package/dist/trajectory/Trajectory.svelte +140 -120
  217. package/dist/trajectory/TrajectoryError.svelte +1 -66
  218. package/dist/trajectory/TrajectoryExportPane.svelte +0 -1
  219. package/dist/trajectory/TrajectoryInfoPane.svelte +55 -80
  220. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  221. package/dist/trajectory/extract.js +19 -29
  222. package/dist/trajectory/format-detect.d.ts +2 -0
  223. package/dist/trajectory/format-detect.js +7 -5
  224. package/dist/trajectory/frame-reader.js +3 -4
  225. package/dist/trajectory/helpers.js +16 -49
  226. package/dist/trajectory/index.js +2 -8
  227. package/dist/trajectory/parse/ase.js +1 -1
  228. package/dist/trajectory/parse/index.d.ts +4 -3
  229. package/dist/trajectory/parse/index.js +12 -17
  230. package/dist/trajectory/parse/vaspout-h5.d.ts +0 -1
  231. package/dist/trajectory/parse/vaspout-h5.js +1 -4
  232. package/dist/trajectory/parse/xyz.js +48 -2
  233. package/dist/trajectory/plotting.js +14 -37
  234. package/dist/xrd/XrdPlot.svelte +43 -68
  235. package/dist/xrd/calc-xrd.js +22 -58
  236. package/dist/xrd/parse.js +13 -22
  237. package/package.json +40 -8
  238. package/readme.md +6 -5
  239. package/dist/scene/types.d.ts +0 -26
  240. package/dist/tooltip/types.d.ts +0 -8
  241. package/dist/trajectory/constants.d.ts +0 -6
  242. package/dist/trajectory/constants.js +0 -11
  243. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  244. /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
+ &times;
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>;