matterviz 0.3.2 → 0.3.4

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 (281) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +123 -82
  3. package/dist/Icon.svelte +18 -12
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -207
  7. package/dist/brillouin/BrillouinZone.svelte +292 -149
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +69 -42
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +275 -163
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  15. package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
  16. package/dist/brillouin/compute.js +11 -6
  17. package/dist/chempot-diagram/ChemPotDiagram.svelte +162 -27
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +451 -281
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2148 -1642
  20. package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -5
  21. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  22. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  23. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  24. package/dist/chempot-diagram/chempot-worker.js +11 -0
  25. package/dist/chempot-diagram/color.js +1 -2
  26. package/dist/chempot-diagram/compute.d.ts +10 -0
  27. package/dist/chempot-diagram/compute.js +250 -88
  28. package/dist/chempot-diagram/index.d.ts +2 -1
  29. package/dist/chempot-diagram/index.js +2 -1
  30. package/dist/chempot-diagram/temperature.js +8 -9
  31. package/dist/chempot-diagram/types.d.ts +3 -0
  32. package/dist/chempot-diagram/types.js +1 -0
  33. package/dist/colors/index.d.ts +1 -1
  34. package/dist/colors/index.js +5 -3
  35. package/dist/composition/BarChart.svelte +128 -55
  36. package/dist/composition/BubbleChart.svelte +102 -49
  37. package/dist/composition/Composition.svelte +100 -79
  38. package/dist/composition/Formula.svelte +108 -62
  39. package/dist/composition/FormulaFilter.svelte +665 -537
  40. package/dist/composition/PieChart.svelte +183 -108
  41. package/dist/composition/format.d.ts +5 -0
  42. package/dist/composition/format.js +20 -3
  43. package/dist/composition/parse.js +14 -9
  44. package/dist/convex-hull/ConvexHull.svelte +93 -40
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +549 -360
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +1296 -827
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +1004 -688
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  53. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +1 -1
  54. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  55. package/dist/convex-hull/ConvexHullStats.svelte +425 -328
  56. package/dist/convex-hull/ConvexHullTooltip.svelte +40 -16
  57. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  58. package/dist/convex-hull/StructurePopup.svelte +25 -4
  59. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  60. package/dist/convex-hull/barycentric-coords.js +13 -7
  61. package/dist/convex-hull/demo-temperature.js +8 -4
  62. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  63. package/dist/convex-hull/helpers.d.ts +9 -0
  64. package/dist/convex-hull/helpers.js +77 -34
  65. package/dist/convex-hull/thermodynamics.js +61 -56
  66. package/dist/convex-hull/types.d.ts +9 -14
  67. package/dist/convex-hull/types.js +0 -17
  68. package/dist/coordination/CoordinationBarPlot.svelte +227 -154
  69. package/dist/element/BohrAtom.svelte +55 -12
  70. package/dist/element/ElementHeading.svelte +7 -2
  71. package/dist/element/ElementPhoto.svelte +15 -9
  72. package/dist/element/ElementStats.svelte +10 -4
  73. package/dist/element/ElementTile.svelte +137 -73
  74. package/dist/element/Nucleus.svelte +39 -11
  75. package/dist/element/data.js +1 -1
  76. package/dist/feedback/ClickFeedback.svelte +16 -5
  77. package/dist/feedback/DragOverlay.svelte +10 -2
  78. package/dist/feedback/Spinner.svelte +4 -2
  79. package/dist/feedback/StatusMessage.svelte +8 -2
  80. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  81. package/dist/fermi-surface/FermiSurface.svelte +328 -187
  82. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  83. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  84. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  85. package/dist/fermi-surface/FermiSurfaceScene.svelte +535 -342
  86. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  87. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  88. package/dist/fermi-surface/compute.js +16 -20
  89. package/dist/fermi-surface/parse.js +24 -14
  90. package/dist/fermi-surface/symmetry.js +2 -7
  91. package/dist/fermi-surface/types.d.ts +3 -5
  92. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1019 -765
  93. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +1 -1
  94. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +76 -22
  95. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +2 -3
  96. package/dist/icons.js +47 -0
  97. package/dist/index.d.ts +2 -1
  98. package/dist/index.js +2 -1
  99. package/dist/io/decompress.js +1 -1
  100. package/dist/io/export.d.ts +3 -0
  101. package/dist/io/export.js +129 -143
  102. package/dist/io/is-binary.js +2 -3
  103. package/dist/io/url-drop.js +1 -2
  104. package/dist/isosurface/Isosurface.svelte +202 -148
  105. package/dist/isosurface/IsosurfaceControls.svelte +46 -28
  106. package/dist/isosurface/parse.js +34 -29
  107. package/dist/isosurface/slice.js +5 -10
  108. package/dist/isosurface/types.d.ts +2 -1
  109. package/dist/isosurface/types.js +61 -12
  110. package/dist/labels.js +11 -8
  111. package/dist/layout/FullscreenToggle.svelte +11 -2
  112. package/dist/layout/InfoCard.svelte +38 -6
  113. package/dist/layout/InfoTag.svelte +63 -32
  114. package/dist/layout/PropertyFilter.svelte +82 -37
  115. package/dist/layout/SettingsSection.svelte +85 -55
  116. package/dist/layout/SubpageGrid.svelte +10 -2
  117. package/dist/layout/json-tree/JsonNode.svelte +183 -138
  118. package/dist/layout/json-tree/JsonTree.svelte +499 -413
  119. package/dist/layout/json-tree/JsonValue.svelte +127 -99
  120. package/dist/layout/json-tree/utils.js +4 -2
  121. package/dist/marching-cubes.js +25 -2
  122. package/dist/math.d.ts +13 -17
  123. package/dist/math.js +133 -67
  124. package/dist/overlays/ContextMenu.svelte +65 -40
  125. package/dist/overlays/DraggablePane.svelte +211 -139
  126. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  127. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  128. package/dist/periodic-table/PropertySelect.svelte +25 -7
  129. package/dist/periodic-table/TableInset.svelte +8 -3
  130. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +446 -309
  131. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  132. package/dist/phase-diagram/PhaseDiagramControls.svelte +102 -43
  133. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  134. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +63 -40
  135. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +71 -28
  136. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +1 -1
  137. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +158 -101
  138. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  139. package/dist/phase-diagram/build-diagram.js +9 -9
  140. package/dist/phase-diagram/colors.js +1 -3
  141. package/dist/phase-diagram/parse.js +10 -9
  142. package/dist/phase-diagram/svg-to-diagram.js +53 -49
  143. package/dist/phase-diagram/utils.d.ts +1 -0
  144. package/dist/phase-diagram/utils.js +80 -25
  145. package/dist/plot/AxisLabel.svelte +28 -3
  146. package/dist/plot/BarPlot.svelte +1182 -734
  147. package/dist/plot/BarPlot.svelte.d.ts +2 -2
  148. package/dist/plot/BarPlotControls.svelte +31 -5
  149. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  150. package/dist/plot/ColorBar.svelte +479 -329
  151. package/dist/plot/ColorScaleSelect.svelte +27 -6
  152. package/dist/plot/ElementScatter.svelte +36 -15
  153. package/dist/plot/FillArea.svelte +152 -95
  154. package/dist/plot/Histogram.svelte +934 -571
  155. package/dist/plot/Histogram.svelte.d.ts +1 -1
  156. package/dist/plot/HistogramControls.svelte +53 -9
  157. package/dist/plot/HistogramControls.svelte.d.ts +1 -1
  158. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  159. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  160. package/dist/plot/Line.svelte +63 -28
  161. package/dist/plot/PlotControls.svelte +157 -114
  162. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  163. package/dist/plot/PlotLegend.svelte +174 -91
  164. package/dist/plot/PlotTooltip.svelte +45 -6
  165. package/dist/plot/PortalSelect.svelte +175 -147
  166. package/dist/plot/ReferenceLine.svelte +76 -22
  167. package/dist/plot/ReferenceLine3D.svelte +132 -107
  168. package/dist/plot/ReferencePlane.svelte +146 -121
  169. package/dist/plot/ScatterPlot.svelte +1681 -1091
  170. package/dist/plot/ScatterPlot.svelte.d.ts +2 -2
  171. package/dist/plot/ScatterPlot3D.svelte +256 -131
  172. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  173. package/dist/plot/ScatterPlot3DControls.svelte +113 -63
  174. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  175. package/dist/plot/ScatterPlot3DScene.svelte +608 -403
  176. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  177. package/dist/plot/ScatterPlotControls.svelte +65 -25
  178. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  179. package/dist/plot/ScatterPoint.svelte +98 -26
  180. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  181. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  182. package/dist/plot/Surface3D.svelte +159 -108
  183. package/dist/plot/ZeroLines.svelte +55 -3
  184. package/dist/plot/ZoomRect.svelte +4 -2
  185. package/dist/plot/axis-utils.js +1 -3
  186. package/dist/plot/data-cleaning.js +12 -28
  187. package/dist/plot/data-transform.js +2 -1
  188. package/dist/plot/fill-utils.js +2 -0
  189. package/dist/plot/layout.d.ts +4 -1
  190. package/dist/plot/layout.js +33 -14
  191. package/dist/plot/reference-line.d.ts +2 -2
  192. package/dist/plot/reference-line.js +7 -5
  193. package/dist/plot/scales.js +24 -36
  194. package/dist/plot/types.d.ts +11 -23
  195. package/dist/plot/types.js +6 -11
  196. package/dist/plot/utils/label-placement.d.ts +32 -15
  197. package/dist/plot/utils/label-placement.js +227 -66
  198. package/dist/plot/utils/series-visibility.js +2 -3
  199. package/dist/rdf/RdfPlot.svelte +143 -91
  200. package/dist/rdf/calc-rdf.js +4 -5
  201. package/dist/sanitize.d.ts +4 -0
  202. package/dist/sanitize.js +107 -0
  203. package/dist/settings.d.ts +18 -6
  204. package/dist/settings.js +46 -16
  205. package/dist/spectral/Bands.svelte +632 -453
  206. package/dist/spectral/BandsAndDos.svelte +90 -49
  207. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  208. package/dist/spectral/Dos.svelte +389 -258
  209. package/dist/spectral/helpers.js +55 -43
  210. package/dist/state.svelte.d.ts +1 -1
  211. package/dist/state.svelte.js +3 -2
  212. package/dist/structure/Arrow.svelte +59 -20
  213. package/dist/structure/AtomLegend.svelte +215 -134
  214. package/dist/structure/Bond.svelte +73 -47
  215. package/dist/structure/CanvasTooltip.svelte +10 -2
  216. package/dist/structure/CellSelect.svelte +72 -45
  217. package/dist/structure/Cylinder.svelte +33 -17
  218. package/dist/structure/Lattice.svelte +88 -33
  219. package/dist/structure/Structure.svelte +1063 -797
  220. package/dist/structure/Structure.svelte.d.ts +1 -1
  221. package/dist/structure/StructureControls.svelte +349 -118
  222. package/dist/structure/StructureExportPane.svelte +124 -89
  223. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  224. package/dist/structure/StructureInfoPane.svelte +304 -237
  225. package/dist/structure/StructureScene.svelte +879 -443
  226. package/dist/structure/StructureScene.svelte.d.ts +15 -7
  227. package/dist/structure/atom-properties.js +8 -8
  228. package/dist/structure/bonding.js +6 -7
  229. package/dist/structure/export.js +14 -29
  230. package/dist/structure/ferrox-wasm.js +1 -1
  231. package/dist/structure/index.d.ts +13 -3
  232. package/dist/structure/index.js +83 -23
  233. package/dist/structure/measure.d.ts +2 -2
  234. package/dist/structure/measure.js +4 -44
  235. package/dist/structure/parse.js +113 -141
  236. package/dist/structure/partial-occupancy.js +7 -10
  237. package/dist/structure/pbc.d.ts +1 -0
  238. package/dist/structure/pbc.js +16 -6
  239. package/dist/structure/supercell.d.ts +2 -2
  240. package/dist/structure/supercell.js +12 -22
  241. package/dist/structure/validation.js +1 -2
  242. package/dist/symmetry/SymmetryStats.svelte +84 -41
  243. package/dist/symmetry/WyckoffTable.svelte +26 -6
  244. package/dist/symmetry/cell-transform.js +5 -3
  245. package/dist/symmetry/index.js +8 -7
  246. package/dist/symmetry/spacegroups.js +148 -148
  247. package/dist/table/HeatmapTable.svelte +790 -554
  248. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  249. package/dist/table/ToggleMenu.svelte +125 -92
  250. package/dist/table/index.js +2 -4
  251. package/dist/theme/ThemeControl.svelte +21 -12
  252. package/dist/time.js +4 -1
  253. package/dist/tooltip/TooltipContent.svelte +33 -8
  254. package/dist/trajectory/Trajectory.svelte +758 -558
  255. package/dist/trajectory/TrajectoryError.svelte +14 -3
  256. package/dist/trajectory/TrajectoryExportPane.svelte +137 -83
  257. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  258. package/dist/trajectory/extract.js +10 -26
  259. package/dist/trajectory/format-detect.js +5 -5
  260. package/dist/trajectory/frame-reader.d.ts +1 -1
  261. package/dist/trajectory/frame-reader.js +5 -12
  262. package/dist/trajectory/helpers.d.ts +0 -1
  263. package/dist/trajectory/helpers.js +2 -17
  264. package/dist/trajectory/index.js +14 -12
  265. package/dist/trajectory/parse/ase.js +5 -4
  266. package/dist/trajectory/parse/hdf5.js +26 -18
  267. package/dist/trajectory/parse/index.js +13 -18
  268. package/dist/trajectory/parse/lammps.js +17 -7
  269. package/dist/trajectory/parse/vasp.js +5 -2
  270. package/dist/trajectory/parse/xyz.js +8 -7
  271. package/dist/trajectory/plotting.js +13 -8
  272. package/dist/utils.d.ts +1 -0
  273. package/dist/utils.js +13 -0
  274. package/dist/xrd/XrdPlot.svelte +337 -247
  275. package/dist/xrd/broadening.js +14 -9
  276. package/dist/xrd/calc-xrd.js +12 -18
  277. package/dist/xrd/parse.d.ts +1 -1
  278. package/dist/xrd/parse.js +17 -17
  279. package/package.json +99 -103
  280. package/readme.md +1 -1
  281. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,175 +1,304 @@
1
- <script lang="ts">import Icon from '../Icon.svelte';
2
- import { format_num } from '../labels';
3
- import DraggablePane from '../overlays/DraggablePane.svelte';
4
- import { get_electro_neg_formula } from '../composition';
5
- import { SETTINGS_CONFIG } from '../settings';
6
- import {} from '../structure';
7
- import { tooltip as create_tooltip } from 'svelte-multiselect/attachments';
8
- import { SvelteSet } from 'svelte/reactivity';
9
- let { trajectory, current_step_idx, current_filename, current_file_path, file_size, file_object, pane_open = $bindable(false), toggle_props, pane_props, ...rest } = $props();
10
- let copied_items = new SvelteSet();
11
- async function copy_item(label, value, key) {
1
+ <script lang="ts">
2
+ import type { InfoItem } from '../layout'
3
+ import Icon from '../Icon.svelte'
4
+ import { format_num } from '../labels'
5
+ import { sanitize_html } from '../sanitize'
6
+ import DraggablePane from '../overlays/DraggablePane.svelte'
7
+ import { get_electro_neg_formula } from '../composition'
8
+ import { SETTINGS_CONFIG } from '../settings'
9
+ import { type AnyStructure } from '../structure'
10
+ import type { ComponentProps } from 'svelte'
11
+ import { tooltip as create_tooltip } from 'svelte-multiselect/attachments'
12
+ import { SvelteSet } from 'svelte/reactivity'
13
+ import type { TrajectoryType } from './index'
14
+
15
+ let {
16
+ trajectory,
17
+ current_step_idx,
18
+ current_filename,
19
+ current_file_path,
20
+ file_size,
21
+ file_object,
22
+ pane_open = $bindable(false),
23
+ toggle_props,
24
+ pane_props,
25
+ ...rest
26
+ }: Omit<ComponentProps<typeof DraggablePane>, `children`> & {
27
+ trajectory: TrajectoryType
28
+ current_step_idx: number
29
+ current_filename?: string | null
30
+ current_file_path?: string | null
31
+ file_size?: number | null
32
+ file_object?: File | null
33
+ pane_open?: boolean
34
+ toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
35
+ pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
36
+ } = $props()
37
+
38
+ let copied_items = new SvelteSet<string>()
39
+
40
+ async function copy_item(label: string, value: string | number, key: string) {
12
41
  try {
13
- await navigator.clipboard.writeText(`${label}: ${value}`);
14
- copied_items.add(key);
15
- setTimeout(() => {
16
- copied_items.delete(key);
17
- }, 1000);
42
+ await navigator.clipboard.writeText(`${label}: ${value}`)
43
+ copied_items.add(key)
44
+ setTimeout(() => {
45
+ copied_items.delete(key)
46
+ }, 1000)
47
+ } catch (error) {
48
+ console.error(`Failed to copy to clipboard:`, error)
18
49
  }
19
- catch (error) {
20
- console.error(`Failed to copy to clipboard:`, error);
21
- }
22
- }
23
- // Helper functions
24
- const format_size = (bytes) => bytes > 1024 * 1024
25
- ? `${format_num(bytes / (1024 * 1024), `.2~f`)} MB`
26
- : `${format_num(bytes / 1024, `.2~f`)} KB`;
27
- const is_valid_number = (val) => typeof val === `number` && isFinite(val);
28
- const extract_numeric_array = (frames, prop) => frames.map((frame) => frame.metadata?.[prop]).filter(is_valid_number);
29
- const format_range = (values, unit = ``, decimals = `.2~f`) => {
30
- if (!values.length)
31
- return null;
50
+ }
51
+
52
+ // Helper functions
53
+ const format_size = (bytes: number) =>
54
+ bytes > 1024 * 1024
55
+ ? `${format_num(bytes / (1024 * 1024), `.2~f`)} MB`
56
+ : `${format_num(bytes / 1024, `.2~f`)} KB`
57
+
58
+ const is_valid_number = (val: unknown): val is number =>
59
+ typeof val === `number` && isFinite(val)
60
+
61
+ const extract_numeric_array = (frames: typeof trajectory.frames, prop: string) =>
62
+ frames.map((frame) => frame.metadata?.[prop]).filter(is_valid_number)
63
+
64
+ const format_range = (values: number[], unit = ``, decimals = `.2~f`) => {
65
+ if (!values.length) return null
32
66
  if (values.length === 1) {
33
- return `${format_num(values[0], decimals)} ${unit}`.trim();
67
+ return `${format_num(values[0], decimals)} ${unit}`.trim()
34
68
  }
35
- const [min, max] = [Math.min(...values), Math.max(...values)];
69
+ const [min, max] = [Math.min(...values), Math.max(...values)]
36
70
  return `${format_num(min, decimals)} - ${format_num(max, decimals)} ${unit}`
37
- .trim();
38
- };
39
- const safe_item = (label, value, key, tooltip) => value ? { label, value, key, tooltip } : null;
40
- const is_info_item = (item) => Boolean(item);
41
- const safe_formula = (structure) => {
71
+ .trim()
72
+ }
73
+
74
+ const safe_item = (
75
+ label: string,
76
+ value: string | null,
77
+ key?: string,
78
+ tooltip?: string,
79
+ ): InfoItem | null => value ? { label, value, key, tooltip } : null
80
+
81
+ const is_info_item = (item: unknown): item is InfoItem => Boolean(item)
82
+
83
+ const safe_formula = (structure: AnyStructure) => {
42
84
  try {
43
- return get_electro_neg_formula(structure);
44
- }
45
- catch {
46
- return null;
85
+ return get_electro_neg_formula(structure)
86
+ } catch {
87
+ return null
47
88
  }
48
- };
49
- // Get trajectory info organized by sections
50
- let info_pane_data = $derived.by(() => {
51
- if ((!trajectory?.frames?.length && !trajectory?.total_frames) ||
52
- current_step_idx < 0 ||
53
- current_step_idx >= (trajectory.total_frames ?? trajectory.frames?.length ?? 0))
54
- return [];
89
+ }
90
+
91
+ // Get trajectory info organized by sections
92
+ let info_pane_data = $derived.by(() => {
93
+ if (
94
+ (!trajectory?.frames?.length && !trajectory?.total_frames) ||
95
+ current_step_idx < 0 ||
96
+ current_step_idx >= (trajectory.total_frames ?? trajectory.frames?.length ?? 0)
97
+ ) return []
98
+
55
99
  // For indexed trajectories, we might not have the current frame loaded
56
- const current_frame = trajectory.frames?.[current_step_idx];
57
- const total_frames = trajectory.total_frames ?? trajectory.frames?.length ?? 0;
58
- const sections = [];
100
+ const current_frame = trajectory.frames?.[current_step_idx]
101
+ const total_frames = trajectory.total_frames ?? trajectory.frames?.length ?? 0
102
+
103
+ const sections: { title: string; items: InfoItem[] }[] = []
104
+
59
105
  // File info section
60
106
  const file_items = [
61
- current_filename &&
62
- safe_item(`Name`, current_filename, `file-name`, current_file_path || undefined),
63
- file_size && file_size > 0 &&
64
- safe_item(`File Size`, format_size(file_size), `file-size`),
65
- file_object?.lastModified &&
66
- safe_item(`Modified`, new Date(file_object.lastModified).toLocaleString(), `file-modified`),
67
- trajectory.metadata?.source_format &&
68
- safe_item(`Format`, String(trajectory.metadata.source_format), `file-format`),
69
- ].filter(is_info_item);
107
+ current_filename &&
108
+ safe_item(
109
+ `Name`,
110
+ current_filename,
111
+ `file-name`,
112
+ current_file_path || undefined,
113
+ ),
114
+ file_size && file_size > 0 &&
115
+ safe_item(`File Size`, format_size(file_size), `file-size`),
116
+ file_object?.lastModified &&
117
+ safe_item(
118
+ `Modified`,
119
+ new Date(file_object.lastModified).toLocaleString(),
120
+ `file-modified`,
121
+ ),
122
+ trajectory.metadata?.source_format &&
123
+ safe_item(`Format`, String(trajectory.metadata.source_format), `file-format`),
124
+ ].filter(is_info_item)
125
+
70
126
  if (file_items.length > 0) {
71
- sections.push({ title: `File`, items: file_items });
127
+ sections.push({ title: `File`, items: file_items })
72
128
  }
129
+
73
130
  // Trajectory info section (always show this)
74
131
  const traj_items = [
75
- safe_item(`Total Frames`, `${format_num(total_frames, `.3~s`)} (current: ${format_num(current_step_idx + 1, `.3~s`)})`, `total-frames`),
76
- trajectory.is_indexed &&
77
- safe_item(`Indexed`, `Yes`, `indexed-mode`, SETTINGS_CONFIG.trajectory.use_indexing.description),
78
- trajectory.indexed_frames &&
79
- safe_item(`Index Points`, `${trajectory.indexed_frames.length}`, `index-points`, `Number of frames indexed for fast seeking`),
80
- trajectory.plot_metadata &&
81
- safe_item(`Plot Metadata`, `${trajectory.plot_metadata.length} frames`, `plot-metadata`, `Pre-extracted metadata for plotting`),
82
- ].filter(is_info_item);
132
+ safe_item(
133
+ `Total Frames`,
134
+ `${format_num(total_frames, `.3~s`)} (current: ${
135
+ format_num(current_step_idx + 1, `.3~s`)
136
+ })`,
137
+ `total-frames`,
138
+ ),
139
+ trajectory.is_indexed &&
140
+ safe_item(
141
+ `Indexed`,
142
+ `Yes`,
143
+ `indexed-mode`,
144
+ SETTINGS_CONFIG.trajectory.use_indexing.description,
145
+ ),
146
+ trajectory.indexed_frames &&
147
+ safe_item(
148
+ `Index Points`,
149
+ `${trajectory.indexed_frames.length}`,
150
+ `index-points`,
151
+ `Number of frames indexed for fast seeking`,
152
+ ),
153
+ trajectory.plot_metadata &&
154
+ safe_item(
155
+ `Plot Metadata`,
156
+ `${trajectory.plot_metadata.length} frames`,
157
+ `plot-metadata`,
158
+ `Pre-extracted metadata for plotting`,
159
+ ),
160
+ ].filter(is_info_item)
161
+
83
162
  if (traj_items.length > 0) {
84
- sections.push({ title: `Trajectory`, items: traj_items });
163
+ sections.push({ title: `Trajectory`, items: traj_items })
85
164
  }
165
+
86
166
  // Structure info section (only if we have the current frame)
87
167
  if (current_frame?.structure?.sites) {
88
- const { structure } = current_frame;
89
- const lattice = `lattice` in structure ? structure.lattice : null;
90
- const { volume, a, b, c, alpha, beta, gamma } = lattice || {};
91
- const formula = safe_formula(structure);
92
- const structure_items = [
93
- safe_item(`Atoms`, `${structure.sites.length}`, `atoms`),
94
- formula && safe_item(`Formula`, String(formula), `formula`),
95
- is_valid_number(volume) && volume > 0 &&
96
- safe_item(`Volume`, `${format_num(volume, `.3~s`)} ų`, `volume`),
97
- is_valid_number(volume) && volume > 0 && structure.sites.length > 0 &&
98
- safe_item(`Density`, `${format_num(structure.sites.length / volume, `.4~s`)} atoms/ų`, `density`),
99
- [a, b, c].every(is_valid_number) &&
100
- safe_item(`Cell Lengths`, `${format_num(a, `.3~f`)}, ${format_num(b, `.3~f`)}, ${format_num(c, `.3~f`)} Å`, `cell-lengths`),
101
- [alpha, beta, gamma].every(is_valid_number) &&
102
- safe_item(`Cell Angles`, `${format_num(alpha, `.2~f`)}°, ${format_num(beta, `.2~f`)}°, ${format_num(gamma, `.2~f`)}°`, `cell-angles`),
103
- ].filter(is_info_item);
104
- if (structure_items.length > 0) {
105
- sections.push({ title: `Structure`, items: structure_items });
106
- }
107
- }
108
- else if (trajectory.is_indexed) {
109
- // For indexed trajectories, show a note that frame data is loaded on demand
110
- const structure_items = [
111
- safe_item(`Frame Loading`, `On-demand`, `frame-loading`, `Structure data loaded when frame is accessed`),
112
- ].filter(is_info_item);
113
- if (structure_items.length > 0) {
114
- sections.push({ title: `Structure`, items: structure_items });
115
- }
168
+ const { structure } = current_frame
169
+ const lattice = `lattice` in structure ? structure.lattice : null
170
+ const { volume, a, b, c, alpha, beta, gamma } = lattice || {}
171
+ const formula = safe_formula(structure)
172
+
173
+ const structure_items = [
174
+ safe_item(`Atoms`, `${structure.sites.length}`, `atoms`),
175
+ formula && safe_item(`Formula`, String(formula), `formula`),
176
+ is_valid_number(volume) && volume > 0 &&
177
+ safe_item(`Volume`, `${format_num(volume, `.3~s`)} ų`, `volume`),
178
+ is_valid_number(volume) && volume > 0 && structure.sites.length > 0 &&
179
+ safe_item(
180
+ `Density`,
181
+ `${format_num(structure.sites.length / volume, `.4~s`)} atoms/ų`,
182
+ `density`,
183
+ ),
184
+ [a, b, c].every(is_valid_number) &&
185
+ safe_item(
186
+ `Cell Lengths`,
187
+ `${format_num(a as number, `.3~f`)}, ${format_num(b as number, `.3~f`)}, ${
188
+ format_num(c as number, `.3~f`)
189
+ } Å`,
190
+ `cell-lengths`,
191
+ ),
192
+ [alpha, beta, gamma].every(is_valid_number) &&
193
+ safe_item(
194
+ `Cell Angles`,
195
+ `${format_num(alpha as number, `.2~f`)}°, ${
196
+ format_num(beta as number, `.2~f`)
197
+ }°, ${format_num(gamma as number, `.2~f`)}°`,
198
+ `cell-angles`,
199
+ ),
200
+ ].filter(is_info_item)
201
+
202
+ if (structure_items.length > 0) {
203
+ sections.push({ title: `Structure`, items: structure_items })
204
+ }
205
+ } else if (trajectory.is_indexed) {
206
+ // For indexed trajectories, show a note that frame data is loaded on demand
207
+ const structure_items = [
208
+ safe_item(
209
+ `Frame Loading`,
210
+ `On-demand`,
211
+ `frame-loading`,
212
+ `Structure data loaded when frame is accessed`,
213
+ ),
214
+ ].filter(is_info_item)
215
+
216
+ if (structure_items.length > 0) {
217
+ sections.push({ title: `Structure`, items: structure_items })
218
+ }
116
219
  }
220
+
117
221
  // Energy section (only for regular trajectories with multiple frames)
118
222
  if (!trajectory.is_indexed && trajectory.frames.length > 1) {
119
- const energies = extract_numeric_array(trajectory.frames, `energy`);
120
- if (energies.length > 1) {
121
- const current_energy = current_frame?.metadata?.energy;
122
- const energy_range = format_range(energies, `eV`, `.3~s`);
123
- const energy_items = [
124
- is_valid_number(current_energy) &&
125
- safe_item(`Current Energy`, `${format_num(current_energy, `.3~s`)} eV`, `energy-current`),
126
- energy_range && safe_item(`Energy Range`, energy_range, `energy-range`),
127
- ].filter(is_info_item);
128
- if (energy_items.length > 0) {
129
- sections.push({ title: `Energy`, items: energy_items });
130
- }
223
+ const energies = extract_numeric_array(trajectory.frames, `energy`)
224
+ if (energies.length > 1) {
225
+ const current_energy = current_frame?.metadata?.energy
226
+ const energy_range = format_range(energies, `eV`, `.3~s`)
227
+
228
+ const energy_items = [
229
+ is_valid_number(current_energy) &&
230
+ safe_item(
231
+ `Current Energy`,
232
+ `${format_num(current_energy, `.3~s`)} eV`,
233
+ `energy-current`,
234
+ ),
235
+ energy_range && safe_item(`Energy Range`, energy_range, `energy-range`),
236
+ ].filter(is_info_item)
237
+
238
+ if (energy_items.length > 0) {
239
+ sections.push({ title: `Energy`, items: energy_items })
131
240
  }
241
+ }
132
242
  }
243
+
133
244
  // Forces section (only for regular trajectories with multiple frames)
134
245
  if (!trajectory.is_indexed && trajectory.frames.length > 1) {
135
- const forces = extract_numeric_array(trajectory.frames, `force_max`);
136
- if (forces.length > 1) {
137
- const current_force = current_frame?.metadata?.force_max;
138
- const force_range = format_range(forces, `eV/Å`, `.3~s`);
139
- const force_items = [
140
- is_valid_number(current_force) &&
141
- safe_item(`Max Force`, `${format_num(current_force, `.3~s`)} eV/Å`, `force-current`),
142
- force_range && safe_item(`Force Range`, force_range, `force-range`),
143
- ].filter(is_info_item);
144
- if (force_items.length > 0) {
145
- sections.push({ title: `Forces`, items: force_items });
146
- }
246
+ const forces = extract_numeric_array(trajectory.frames, `force_max`)
247
+ if (forces.length > 1) {
248
+ const current_force = current_frame?.metadata?.force_max
249
+ const force_range = format_range(forces, `eV/Å`, `.3~s`)
250
+
251
+ const force_items = [
252
+ is_valid_number(current_force) &&
253
+ safe_item(
254
+ `Max Force`,
255
+ `${format_num(current_force, `.3~s`)} eV/Å`,
256
+ `force-current`,
257
+ ),
258
+ force_range && safe_item(`Force Range`, force_range, `force-range`),
259
+ ].filter(is_info_item)
260
+
261
+ if (force_items.length > 0) {
262
+ sections.push({ title: `Forces`, items: force_items })
147
263
  }
264
+ }
148
265
  }
266
+
149
267
  // Volume change section (only for regular trajectories)
150
- if (!trajectory.is_indexed && current_frame?.structure &&
151
- trajectory.frames.length > 1) {
152
- const lattice = `lattice` in current_frame.structure
153
- ? current_frame.structure.lattice
154
- : null;
155
- if (lattice) {
156
- const volumes = trajectory.frames.map(({ structure }) => (`lattice` in structure && structure.lattice?.volume))
157
- .filter(is_valid_number)
158
- .filter((v) => v > 0);
159
- if (volumes.length > 1) {
160
- const vol_change = (Math.max(...volumes) - Math.min(...volumes)) /
161
- Math.min(...volumes);
162
- if (Math.abs(vol_change) > 0.1 && is_valid_number(vol_change)) {
163
- const vol_items = [safe_item(`Volume Change`, `${format_num(vol_change, `.2~%`)}`, `vol-change`)].filter(is_info_item);
164
- if (vol_items.length > 0) {
165
- sections.push({ title: `Volume`, items: vol_items });
166
- }
167
- }
268
+ if (
269
+ !trajectory.is_indexed && current_frame?.structure &&
270
+ trajectory.frames.length > 1
271
+ ) {
272
+ const lattice = `lattice` in current_frame.structure
273
+ ? current_frame.structure.lattice
274
+ : null
275
+ if (lattice) {
276
+ const volumes = trajectory.frames.map((
277
+ { structure },
278
+ ) => (`lattice` in structure && structure.lattice?.volume))
279
+ .filter(is_valid_number)
280
+ .filter((v) => v > 0)
281
+
282
+ if (volumes.length > 1) {
283
+ const vol_change = (Math.max(...volumes) - Math.min(...volumes)) /
284
+ Math.min(...volumes)
285
+ if (Math.abs(vol_change) > 0.1 && is_valid_number(vol_change)) {
286
+ const vol_items = [safe_item(
287
+ `Volume Change`,
288
+ `${format_num(vol_change, `.2~%`)}`,
289
+ `vol-change`,
290
+ )].filter(is_info_item)
291
+
292
+ if (vol_items.length > 0) {
293
+ sections.push({ title: `Volume`, items: vol_items })
168
294
  }
295
+ }
169
296
  }
297
+ }
170
298
  }
171
- return sections;
172
- });
299
+
300
+ return sections
301
+ })
173
302
  </script>
174
303
 
175
304
  <DraggablePane
@@ -207,8 +336,8 @@ let info_pane_data = $derived.by(() => {
207
336
  }
208
337
  }}
209
338
  >
210
- <span>{@html label}</span>
211
- <span title={tooltip} {@attach create_tooltip()}>{@html value}</span>
339
+ <span>{@html sanitize_html(label)}</span>
340
+ <span title={tooltip} {@attach create_tooltip()}>{@html sanitize_html(value)}</span>
212
341
  {#if copied_items.has(key ?? label)}
213
342
  <Icon
214
343
  icon="Check"
@@ -15,8 +15,7 @@ export const energy_data_extractor = (frame, _trajectory) => {
15
15
  `total_energy`,
16
16
  ];
17
17
  for (const field of energy_fields) {
18
- if (field in frame.metadata &&
19
- typeof frame.metadata[field] === `number`) {
18
+ if (field in frame.metadata && typeof frame.metadata[field] === `number`) {
20
19
  data[field] = frame.metadata[field];
21
20
  }
22
21
  }
@@ -36,36 +35,26 @@ export const force_stress_data_extractor = (frame, _trajectory) => {
36
35
  const force_magnitudes = forces.map((force) => Math.hypot(...force));
37
36
  data.force_max = Math.max(...force_magnitudes);
38
37
  // Calculate RMS (root mean square) of force magnitudes
39
- data.force_norm = Math.sqrt(force_magnitudes.reduce((sum, f) => sum + f ** 2, 0) /
40
- force_magnitudes.length);
38
+ data.force_norm = Math.sqrt(force_magnitudes.reduce((sum, f) => sum + f ** 2, 0) / force_magnitudes.length);
41
39
  }
42
40
  }
43
41
  else {
44
42
  // Fallback to metadata values if forces array not available
45
- if (frame.metadata.force_max &&
46
- typeof frame.metadata.force_max === `number`) {
43
+ if (frame.metadata.force_max && typeof frame.metadata.force_max === `number`) {
47
44
  data.force_max = frame.metadata.force_max;
48
45
  }
49
46
  // Prefer force_norm if available, fall back to force_rms
50
- if (frame.metadata.force_norm &&
51
- typeof frame.metadata.force_norm === `number`) {
47
+ if (frame.metadata.force_norm && typeof frame.metadata.force_norm === `number`) {
52
48
  data.force_norm = frame.metadata.force_norm;
53
49
  }
54
- else if (frame.metadata.force_rms &&
55
- typeof frame.metadata.force_rms === `number`) {
50
+ else if (frame.metadata.force_rms && typeof frame.metadata.force_rms === `number`) {
56
51
  data.force_norm = frame.metadata.force_rms; // Use force_rms as fallback
57
52
  }
58
53
  }
59
54
  // Extract other stress and pressure properties (no duplicates expected)
60
- const other_stress_fields = [
61
- `stress_max`,
62
- `stress_frobenius`,
63
- `stress_trace`,
64
- `pressure`,
65
- ];
55
+ const other_stress_fields = [`stress_max`, `stress_frobenius`, `stress_trace`, `pressure`];
66
56
  for (const field of other_stress_fields) {
67
- if (field in frame.metadata &&
68
- typeof frame.metadata[field] === `number`) {
57
+ if (field in frame.metadata && typeof frame.metadata[field] === `number`) {
69
58
  data[field] = frame.metadata[field];
70
59
  }
71
60
  }
@@ -92,8 +81,7 @@ export const structural_data_extractor = (frame, _trajectory) => {
92
81
  // Extract other structural properties, avoiding volume duplicate
93
82
  const structural_fields = [`temperature`];
94
83
  for (const field of structural_fields) {
95
- if (field in frame.metadata &&
96
- typeof frame.metadata[field] === `number`)
84
+ if (field in frame.metadata && typeof frame.metadata[field] === `number`)
97
85
  data[field] = frame.metadata[field];
98
86
  }
99
87
  // Handle density separately - prefer metadata, but calculate if not available
@@ -109,9 +97,7 @@ export const structural_data_extractor = (frame, _trajectory) => {
109
97
  }
110
98
  }
111
99
  // Only use metadata volume if lattice volume is not available
112
- if (!data.volume &&
113
- frame.metadata.volume &&
114
- typeof frame.metadata.volume === `number`) {
100
+ if (!data.volume && frame.metadata.volume && typeof frame.metadata.volume === `number`) {
115
101
  data.volume = frame.metadata.volume;
116
102
  }
117
103
  // Note: pressure is handled by force_stress_data_extractor to avoid duplication
@@ -140,9 +126,7 @@ function property_varies(trajectory, property_key, tolerance = 1e-10) {
140
126
  if (typeof lattice_value === `number`)
141
127
  value = lattice_value;
142
128
  }
143
- if (value === undefined &&
144
- frame.metadata &&
145
- property_key in frame.metadata) {
129
+ if (value === undefined && frame.metadata && property_key in frame.metadata) {
146
130
  const metadata_value = frame.metadata[property_key];
147
131
  if (typeof metadata_value === `number`) {
148
132
  value = metadata_value;
@@ -31,10 +31,10 @@ export const FORMAT_PATTERNS = {
31
31
  if (basename === `xdatcar` || basename.startsWith(`xdatcar`))
32
32
  return true;
33
33
  const lines = data.trim().split(/\r?\n/);
34
- return lines.length >= 10 &&
34
+ return (lines.length >= 10 &&
35
35
  lines.some((line) => line.includes(`Direct configuration=`)) &&
36
36
  !isNaN(parseFloat(lines[1])) &&
37
- lines.slice(2, 5).every((line) => line.trim().split(/\s+/).length === 3);
37
+ lines.slice(2, 5).every((line) => line.trim().split(/\s+/).length === 3));
38
38
  },
39
39
  xyz_multi: (data, filename) => {
40
40
  const base = filename ? strip_compression_extensions(filename) : ``;
@@ -44,7 +44,7 @@ export const FORMAT_PATTERNS = {
44
44
  },
45
45
  lammpstrj: (data, filename) => {
46
46
  const base = filename ? strip_compression_extensions(filename) : ``;
47
- if (!/\.lammpstrj$/.test(base))
47
+ if (!base.endsWith(`.lammpstrj`))
48
48
  return false;
49
49
  return data.includes(`ITEM: TIMESTEP`) && data.includes(`ITEM: ATOMS`);
50
50
  },
@@ -71,6 +71,6 @@ export function is_trajectory_file(filename, content) {
71
71
  return TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name);
72
72
  }
73
73
  // For other extensions, require both keywords and specific extensions
74
- return TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name) &&
75
- TRAJ_FALLBACK_EXTENSIONS_REGEX.test(base_name);
74
+ return (TRAJ_KEYWORDS_SIMPLE_REGEX.test(base_name) &&
75
+ TRAJ_FALLBACK_EXTENSIONS_REGEX.test(base_name));
76
76
  }
@@ -1,6 +1,6 @@
1
1
  import type { FrameIndex, FrameLoader, ParseProgress, TrajectoryFrame, TrajectoryMetadata } from './index';
2
2
  export declare class TrajFrameReader implements FrameLoader {
3
- private format;
3
+ private readonly format;
4
4
  private global_numbers?;
5
5
  constructor(filename: string);
6
6
  get_total_frames(data: string | ArrayBuffer): Promise<number>;
@@ -9,7 +9,6 @@ export class TrajFrameReader {
9
9
  const base_filename = strip_compression_extensions(filename);
10
10
  this.format = base_filename.endsWith(`.traj`) ? `ase` : `xyz`;
11
11
  }
12
- // deno-lint-ignore require-await
13
12
  async get_total_frames(data) {
14
13
  if (this.format === `xyz`) {
15
14
  if (data instanceof ArrayBuffer)
@@ -91,7 +90,6 @@ export class TrajFrameReader {
91
90
  }
92
91
  return frame_index;
93
92
  }
94
- // deno-lint-ignore require-await
95
93
  async load_frame(data, frame_number) {
96
94
  const actual_data_type = data instanceof ArrayBuffer ? `ArrayBuffer` : typeof data;
97
95
  if (this.format === `xyz`) {
@@ -213,7 +211,8 @@ export class TrajFrameReader {
213
211
  const x_coord = parseFloat(parts[1]);
214
212
  const y_coord = parseFloat(parts[2]);
215
213
  const z_coord = parseFloat(parts[3]);
216
- if (!Number.isFinite(x_coord) || !Number.isFinite(y_coord) ||
214
+ if (!Number.isFinite(x_coord) ||
215
+ !Number.isFinite(y_coord) ||
217
216
  !Number.isFinite(z_coord)) {
218
217
  console.warn(`Skipping XYZ atom with invalid coordinates in indexed frame ${frame_number} at line ${line_idx + 2 + idx}`);
219
218
  continue;
@@ -245,8 +244,7 @@ export class TrajFrameReader {
245
244
  const positions = positions_ref?.ndarray
246
245
  ? read_ndarray_from_view(view, positions_ref)
247
246
  : positions_ref;
248
- const numbers_ref = frame_data[`numbers.`] || frame_data.numbers ||
249
- this.global_numbers;
247
+ const numbers_ref = frame_data[`numbers.`] || frame_data.numbers || this.global_numbers;
250
248
  const numbers = numbers_ref?.ndarray
251
249
  ? read_ndarray_from_view(view, numbers_ref).flat()
252
250
  : numbers_ref;
@@ -288,7 +286,7 @@ export class TrajFrameReader {
288
286
  if (match)
289
287
  properties[key] = parseFloat(match[1]);
290
288
  });
291
- const step_match = comment.match(/(?:step|frame)\s*[=:]?\s*(\d+)/i);
289
+ const step_match = /(?:step|frame)\s*[=:]?\s*(\d+)/i.exec(comment);
292
290
  const step = step_match ? parseInt(step_match[1]) : frame_number;
293
291
  return { frame_number, step, properties };
294
292
  }
@@ -297,12 +295,7 @@ export class TrajFrameReader {
297
295
  const step = frame_number;
298
296
  if (frame_data.calculator && typeof frame_data.calculator === `object`) {
299
297
  const calculator = frame_data.calculator;
300
- const calc_properties = [
301
- `energy`,
302
- `potential_energy`,
303
- `kinetic_energy`,
304
- `total_energy`,
305
- ];
298
+ const calc_properties = [`energy`, `potential_energy`, `kinetic_energy`, `total_energy`];
306
299
  for (const prop of calc_properties) {
307
300
  if (prop in calculator && typeof calculator[prop] === `number`) {
308
301
  properties[prop] = calculator[prop];
@@ -6,7 +6,6 @@ export declare function is_valid_element_symbol(symbol: string): symbol is Eleme
6
6
  export declare function coerce_element_symbol(symbol: string): ElementSymbol | undefined;
7
7
  export declare function validate_3x3_matrix(data: unknown): math.Matrix3x3;
8
8
  export declare const convert_atomic_numbers: (numbers: number[]) => ElementSymbol[];
9
- export declare const get_inverse_matrix: (matrix: math.Matrix3x3) => math.Matrix3x3;
10
9
  export declare const create_structure: (positions: number[][], elements: ElementSymbol[], lattice_matrix?: math.Matrix3x3, pbc?: Pbc, force_data?: number[][]) => AnyStructure;
11
10
  export declare const create_trajectory_frame: (positions: number[][], elements: ElementSymbol[], lattice_matrix: math.Matrix3x3 | undefined, pbc: Pbc | undefined, step: number, metadata?: Record<string, unknown>) => TrajectoryFrame;
12
11
  export declare const read_ndarray_from_view: (view: DataView, ref: {