matterviz 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +154 -96
  3. package/dist/Icon.svelte +20 -14
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -178
  7. package/dist/brillouin/BrillouinZone.svelte +299 -198
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
  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 +327 -0
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  23. package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
  24. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  25. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  26. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  27. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  28. package/dist/chempot-diagram/chempot-worker.js +11 -0
  29. package/dist/chempot-diagram/color.d.ts +10 -0
  30. package/dist/chempot-diagram/color.js +32 -0
  31. package/dist/chempot-diagram/compute.d.ts +48 -0
  32. package/dist/chempot-diagram/compute.js +812 -0
  33. package/dist/chempot-diagram/index.d.ts +6 -0
  34. package/dist/chempot-diagram/index.js +6 -0
  35. package/dist/chempot-diagram/pointer.d.ts +16 -0
  36. package/dist/chempot-diagram/pointer.js +40 -0
  37. package/dist/chempot-diagram/temperature.d.ts +15 -0
  38. package/dist/chempot-diagram/temperature.js +36 -0
  39. package/dist/chempot-diagram/types.d.ts +86 -0
  40. package/dist/chempot-diagram/types.js +28 -0
  41. package/dist/colors/index.d.ts +3 -1
  42. package/dist/colors/index.js +9 -3
  43. package/dist/composition/BarChart.svelte +141 -77
  44. package/dist/composition/BubbleChart.svelte +107 -52
  45. package/dist/composition/Composition.svelte +100 -79
  46. package/dist/composition/Formula.svelte +108 -62
  47. package/dist/composition/FormulaFilter.svelte +973 -353
  48. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  49. package/dist/composition/PieChart.svelte +199 -99
  50. package/dist/composition/PieChart.svelte.d.ts +1 -1
  51. package/dist/composition/format.d.ts +5 -0
  52. package/dist/composition/format.js +20 -3
  53. package/dist/composition/parse.js +14 -9
  54. package/dist/convex-hull/ConvexHull.svelte +93 -38
  55. package/dist/convex-hull/ConvexHull2D.svelte +551 -393
  56. package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
  57. package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
  58. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  59. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  60. package/dist/convex-hull/ConvexHullStats.svelte +821 -249
  61. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  62. package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
  63. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  64. package/dist/convex-hull/StructurePopup.svelte +25 -4
  65. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  66. package/dist/convex-hull/barycentric-coords.js +13 -7
  67. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  68. package/dist/convex-hull/demo-temperature.js +40 -0
  69. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  70. package/dist/convex-hull/helpers.d.ts +10 -1
  71. package/dist/convex-hull/helpers.js +79 -38
  72. package/dist/convex-hull/index.d.ts +1 -0
  73. package/dist/convex-hull/index.js +1 -0
  74. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  75. package/dist/convex-hull/thermodynamics.js +163 -69
  76. package/dist/convex-hull/types.d.ts +12 -12
  77. package/dist/convex-hull/types.js +0 -12
  78. package/dist/coordination/CoordinationBarPlot.svelte +232 -176
  79. package/dist/element/BohrAtom.svelte +56 -13
  80. package/dist/element/ElementHeading.svelte +7 -2
  81. package/dist/element/ElementPhoto.svelte +15 -9
  82. package/dist/element/ElementStats.svelte +10 -4
  83. package/dist/element/ElementTile.svelte +137 -73
  84. package/dist/element/Nucleus.svelte +39 -11
  85. package/dist/element/data.js +2 -14
  86. package/dist/element/data.json.gz +0 -0
  87. package/dist/element/types.d.ts +1 -0
  88. package/dist/feedback/ClickFeedback.svelte +16 -5
  89. package/dist/feedback/DragOverlay.svelte +10 -2
  90. package/dist/feedback/Spinner.svelte +4 -2
  91. package/dist/feedback/StatusMessage.svelte +8 -2
  92. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  93. package/dist/fermi-surface/FermiSurface.svelte +336 -239
  94. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  95. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  96. package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
  97. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  98. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  99. package/dist/fermi-surface/compute.js +16 -20
  100. package/dist/fermi-surface/parse.js +37 -33
  101. package/dist/fermi-surface/symmetry.js +2 -7
  102. package/dist/fermi-surface/types.d.ts +3 -5
  103. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
  104. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  105. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  106. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  107. package/dist/heatmap-matrix/index.d.ts +53 -0
  108. package/dist/heatmap-matrix/index.js +100 -0
  109. package/dist/heatmap-matrix/shared.d.ts +2 -0
  110. package/dist/heatmap-matrix/shared.js +4 -0
  111. package/dist/icons.d.ts +111 -0
  112. package/dist/icons.js +158 -0
  113. package/dist/index.d.ts +5 -2
  114. package/dist/index.js +5 -2
  115. package/dist/io/decompress.js +1 -1
  116. package/dist/io/export.d.ts +3 -0
  117. package/dist/io/export.js +138 -140
  118. package/dist/io/file-drop.d.ts +7 -0
  119. package/dist/io/file-drop.js +43 -0
  120. package/dist/io/index.d.ts +2 -2
  121. package/dist/io/index.js +2 -112
  122. package/dist/io/is-binary.js +2 -3
  123. package/dist/io/types.d.ts +1 -0
  124. package/dist/io/url-drop.d.ts +2 -0
  125. package/dist/io/url-drop.js +117 -0
  126. package/dist/isosurface/Isosurface.svelte +220 -110
  127. package/dist/isosurface/IsosurfaceControls.svelte +65 -28
  128. package/dist/isosurface/parse.js +104 -56
  129. package/dist/isosurface/slice.d.ts +2 -1
  130. package/dist/isosurface/slice.js +8 -13
  131. package/dist/isosurface/types.d.ts +14 -1
  132. package/dist/isosurface/types.js +152 -5
  133. package/dist/labels.d.ts +2 -1
  134. package/dist/labels.js +12 -8
  135. package/dist/layout/FullscreenToggle.svelte +11 -2
  136. package/dist/layout/InfoCard.svelte +38 -6
  137. package/dist/layout/InfoTag.svelte +125 -94
  138. package/dist/layout/PropertyFilter.svelte +82 -37
  139. package/dist/layout/SettingsSection.svelte +85 -55
  140. package/dist/layout/SubpageGrid.svelte +82 -0
  141. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  142. package/dist/layout/index.d.ts +1 -0
  143. package/dist/layout/index.js +1 -0
  144. package/dist/layout/json-tree/JsonNode.svelte +266 -223
  145. package/dist/layout/json-tree/JsonTree.svelte +516 -429
  146. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  147. package/dist/layout/json-tree/JsonValue.svelte +281 -173
  148. package/dist/layout/json-tree/types.d.ts +10 -2
  149. package/dist/layout/json-tree/utils.d.ts +2 -0
  150. package/dist/layout/json-tree/utils.js +37 -2
  151. package/dist/marching-cubes.js +25 -2
  152. package/dist/math.d.ts +20 -17
  153. package/dist/math.js +474 -57
  154. package/dist/overlays/ContextMenu.svelte +66 -40
  155. package/dist/overlays/DraggablePane.svelte +331 -154
  156. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  157. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  158. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  159. package/dist/periodic-table/PropertySelect.svelte +25 -7
  160. package/dist/periodic-table/TableInset.svelte +8 -3
  161. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
  162. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  163. package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
  164. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  165. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  166. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  167. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
  168. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
  169. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
  170. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  171. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  172. package/dist/phase-diagram/build-diagram.js +9 -9
  173. package/dist/phase-diagram/colors.js +1 -3
  174. package/dist/phase-diagram/index.d.ts +2 -0
  175. package/dist/phase-diagram/index.js +2 -0
  176. package/dist/phase-diagram/parse.js +10 -9
  177. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  178. package/dist/phase-diagram/svg-to-diagram.js +869 -0
  179. package/dist/phase-diagram/types.d.ts +10 -0
  180. package/dist/phase-diagram/utils.d.ts +8 -4
  181. package/dist/phase-diagram/utils.js +219 -74
  182. package/dist/plot/AxisLabel.svelte +51 -0
  183. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  184. package/dist/plot/BarPlot.svelte +1461 -768
  185. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  186. package/dist/plot/BarPlotControls.svelte +33 -6
  187. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  188. package/dist/plot/ColorBar.svelte +533 -383
  189. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  190. package/dist/plot/ColorScaleSelect.svelte +28 -7
  191. package/dist/plot/ElementScatter.svelte +38 -16
  192. package/dist/plot/FillArea.svelte +152 -92
  193. package/dist/plot/Histogram.svelte +1162 -709
  194. package/dist/plot/Histogram.svelte.d.ts +1 -1
  195. package/dist/plot/HistogramControls.svelte +81 -18
  196. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  197. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  198. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  199. package/dist/plot/Line.svelte +63 -28
  200. package/dist/plot/PlotControls.svelte +221 -96
  201. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  202. package/dist/plot/PlotLegend.svelte +174 -91
  203. package/dist/plot/PlotTooltip.svelte +45 -6
  204. package/dist/plot/PortalSelect.svelte +175 -146
  205. package/dist/plot/ReferenceLine.svelte +77 -22
  206. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  207. package/dist/plot/ReferenceLine3D.svelte +132 -107
  208. package/dist/plot/ReferencePlane.svelte +146 -123
  209. package/dist/plot/ScatterPlot.svelte +1880 -1156
  210. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  211. package/dist/plot/ScatterPlot3D.svelte +256 -131
  212. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  213. package/dist/plot/ScatterPlot3DControls.svelte +300 -297
  214. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  215. package/dist/plot/ScatterPlot3DScene.svelte +608 -406
  216. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  217. package/dist/plot/ScatterPlotControls.svelte +150 -70
  218. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  219. package/dist/plot/ScatterPoint.svelte +98 -26
  220. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  221. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  222. package/dist/plot/Surface3D.svelte +159 -108
  223. package/dist/plot/ZeroLines.svelte +96 -0
  224. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  225. package/dist/plot/ZoomRect.svelte +23 -0
  226. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  227. package/dist/plot/axis-utils.d.ts +1 -1
  228. package/dist/plot/axis-utils.js +1 -3
  229. package/dist/plot/data-cleaning.js +12 -28
  230. package/dist/plot/data-transform.js +2 -1
  231. package/dist/plot/fill-utils.js +2 -0
  232. package/dist/plot/index.d.ts +6 -2
  233. package/dist/plot/index.js +6 -2
  234. package/dist/plot/interactions.d.ts +8 -10
  235. package/dist/plot/interactions.js +2 -3
  236. package/dist/plot/layout.d.ts +11 -2
  237. package/dist/plot/layout.js +44 -17
  238. package/dist/plot/reference-line.d.ts +5 -22
  239. package/dist/plot/reference-line.js +12 -84
  240. package/dist/plot/scales.js +24 -36
  241. package/dist/plot/types.d.ts +53 -40
  242. package/dist/plot/types.js +12 -7
  243. package/dist/plot/utils/label-placement.d.ts +32 -15
  244. package/dist/plot/utils/label-placement.js +227 -63
  245. package/dist/plot/utils/series-visibility.js +2 -3
  246. package/dist/plot/utils.d.ts +1 -0
  247. package/dist/plot/utils.js +14 -0
  248. package/dist/rdf/RdfPlot.svelte +173 -132
  249. package/dist/rdf/calc-rdf.js +4 -5
  250. package/dist/sanitize.d.ts +4 -0
  251. package/dist/sanitize.js +107 -0
  252. package/dist/settings.d.ts +21 -6
  253. package/dist/settings.js +63 -19
  254. package/dist/spectral/Bands.svelte +963 -412
  255. package/dist/spectral/Bands.svelte.d.ts +22 -2
  256. package/dist/spectral/BandsAndDos.svelte +90 -49
  257. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  258. package/dist/spectral/Dos.svelte +389 -258
  259. package/dist/spectral/helpers.d.ts +23 -1
  260. package/dist/spectral/helpers.js +119 -51
  261. package/dist/spectral/types.d.ts +2 -0
  262. package/dist/state.svelte.d.ts +1 -1
  263. package/dist/state.svelte.js +3 -2
  264. package/dist/structure/Arrow.svelte +59 -20
  265. package/dist/structure/AtomLegend.svelte +231 -129
  266. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  267. package/dist/structure/Bond.svelte +73 -47
  268. package/dist/structure/CanvasTooltip.svelte +10 -2
  269. package/dist/structure/CellSelect.svelte +148 -51
  270. package/dist/structure/Cylinder.svelte +33 -17
  271. package/dist/structure/Lattice.svelte +88 -33
  272. package/dist/structure/Structure.svelte +1077 -821
  273. package/dist/structure/Structure.svelte.d.ts +1 -1
  274. package/dist/structure/StructureControls.svelte +373 -139
  275. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  276. package/dist/structure/StructureExportPane.svelte +124 -89
  277. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  278. package/dist/structure/StructureInfoPane.svelte +304 -231
  279. package/dist/structure/StructureScene.svelte +919 -445
  280. package/dist/structure/StructureScene.svelte.d.ts +16 -7
  281. package/dist/structure/atom-properties.d.ts +6 -2
  282. package/dist/structure/atom-properties.js +42 -29
  283. package/dist/structure/bonding.js +6 -7
  284. package/dist/structure/export.js +22 -34
  285. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  286. package/dist/structure/ferrox-wasm-types.js +0 -3
  287. package/dist/structure/ferrox-wasm.d.ts +3 -2
  288. package/dist/structure/ferrox-wasm.js +2 -3
  289. package/dist/structure/index.d.ts +16 -0
  290. package/dist/structure/index.js +88 -6
  291. package/dist/structure/measure.d.ts +2 -2
  292. package/dist/structure/measure.js +4 -44
  293. package/dist/structure/parse.js +130 -155
  294. package/dist/structure/partial-occupancy.d.ts +25 -0
  295. package/dist/structure/partial-occupancy.js +99 -0
  296. package/dist/structure/pbc.d.ts +1 -0
  297. package/dist/structure/pbc.js +16 -6
  298. package/dist/structure/supercell.d.ts +2 -2
  299. package/dist/structure/supercell.js +12 -22
  300. package/dist/structure/validation.js +5 -3
  301. package/dist/symmetry/SymmetryStats.svelte +94 -37
  302. package/dist/symmetry/WyckoffTable.svelte +42 -14
  303. package/dist/symmetry/cell-transform.js +5 -3
  304. package/dist/symmetry/index.d.ts +7 -4
  305. package/dist/symmetry/index.js +87 -21
  306. package/dist/symmetry/spacegroups.js +148 -148
  307. package/dist/table/HeatmapTable.svelte +1112 -516
  308. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  309. package/dist/table/ToggleMenu.svelte +125 -90
  310. package/dist/table/index.d.ts +2 -0
  311. package/dist/table/index.js +2 -4
  312. package/dist/theme/ThemeControl.svelte +21 -12
  313. package/dist/time.js +4 -1
  314. package/dist/tooltip/TooltipContent.svelte +33 -8
  315. package/dist/trajectory/Trajectory.svelte +889 -687
  316. package/dist/trajectory/TrajectoryError.svelte +14 -3
  317. package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
  318. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  319. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  320. package/dist/trajectory/constants.d.ts +6 -0
  321. package/dist/trajectory/constants.js +7 -0
  322. package/dist/trajectory/extract.js +13 -31
  323. package/dist/trajectory/format-detect.d.ts +9 -0
  324. package/dist/trajectory/format-detect.js +76 -0
  325. package/dist/trajectory/frame-reader.d.ts +17 -0
  326. package/dist/trajectory/frame-reader.js +332 -0
  327. package/dist/trajectory/helpers.d.ts +14 -0
  328. package/dist/trajectory/helpers.js +172 -0
  329. package/dist/trajectory/index.d.ts +1 -0
  330. package/dist/trajectory/index.js +23 -14
  331. package/dist/trajectory/parse/ase.d.ts +2 -0
  332. package/dist/trajectory/parse/ase.js +77 -0
  333. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  334. package/dist/trajectory/parse/hdf5.js +129 -0
  335. package/dist/trajectory/parse/index.d.ts +12 -0
  336. package/dist/trajectory/parse/index.js +299 -0
  337. package/dist/trajectory/parse/lammps.d.ts +5 -0
  338. package/dist/trajectory/parse/lammps.js +179 -0
  339. package/dist/trajectory/parse/vasp.d.ts +2 -0
  340. package/dist/trajectory/parse/vasp.js +68 -0
  341. package/dist/trajectory/parse/xyz.d.ts +2 -0
  342. package/dist/trajectory/parse/xyz.js +110 -0
  343. package/dist/trajectory/plotting.js +13 -8
  344. package/dist/trajectory/types.d.ts +11 -0
  345. package/dist/trajectory/types.js +1 -0
  346. package/dist/utils.d.ts +3 -0
  347. package/dist/utils.js +17 -0
  348. package/dist/xrd/XrdPlot.svelte +337 -245
  349. package/dist/xrd/broadening.js +14 -9
  350. package/dist/xrd/calc-xrd.js +12 -19
  351. package/dist/xrd/parse.d.ts +1 -1
  352. package/dist/xrd/parse.js +17 -17
  353. package/package.json +103 -101
  354. package/readme.md +4 -4
  355. package/dist/trajectory/parse.d.ts +0 -42
  356. package/dist/trajectory/parse.js +0 -1267
  357. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
  358. /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"
@@ -0,0 +1,6 @@
1
+ export declare const MAX_SAFE_STRING_LENGTH: number;
2
+ export declare const MAX_METADATA_SIZE: number;
3
+ export declare const LARGE_FILE_THRESHOLD: number;
4
+ export declare const INDEX_SAMPLE_RATE = 100;
5
+ export declare const MAX_BIN_FILE_SIZE: number;
6
+ export declare const MAX_TEXT_FILE_SIZE: number;
@@ -0,0 +1,7 @@
1
+ // Constants for trajectory parsing and large file handling
2
+ export const MAX_SAFE_STRING_LENGTH = 0x1fffffe8 * 0.5; // 50% of JS max string length as safety
3
+ export const MAX_METADATA_SIZE = 50 * 1024 * 1024; // 50MB limit for metadata
4
+ export const LARGE_FILE_THRESHOLD = 400 * 1024 * 1024; // 400MB
5
+ export const INDEX_SAMPLE_RATE = 100; // Default sample rate for frame indexing
6
+ export const MAX_BIN_FILE_SIZE = 100 * 1024 * 1024; // 100MB default for ArrayBuffer files
7
+ export const MAX_TEXT_FILE_SIZE = 50 * 1024 * 1024; // 50MB default for string files
@@ -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
@@ -136,15 +122,11 @@ function property_varies(trajectory, property_key, tolerance = 1e-10) {
136
122
  // Check both direct structure properties and metadata
137
123
  let value;
138
124
  if (`lattice` in frame.structure) {
139
- const lattice = frame.structure.lattice;
140
- if (property_key in lattice &&
141
- typeof lattice[property_key] === `number`) {
142
- value = lattice[property_key];
143
- }
125
+ const lattice_value = frame.structure.lattice[property_key];
126
+ if (typeof lattice_value === `number`)
127
+ value = lattice_value;
144
128
  }
145
- if (value === undefined &&
146
- frame.metadata &&
147
- property_key in frame.metadata) {
129
+ if (value === undefined && frame.metadata && property_key in frame.metadata) {
148
130
  const metadata_value = frame.metadata[property_key];
149
131
  if (typeof metadata_value === `number`) {
150
132
  value = metadata_value;
@@ -0,0 +1,9 @@
1
+ export declare function strip_compression_extensions(filename: string): string;
2
+ export declare const FORMAT_PATTERNS: {
3
+ readonly ase: (data: unknown, filename?: string) => boolean;
4
+ readonly hdf5: (data: unknown, filename?: string) => boolean;
5
+ readonly vasp: (data: string, filename?: string) => boolean;
6
+ readonly xyz_multi: (data: string, filename?: string) => boolean;
7
+ readonly lammpstrj: (data: string, filename?: string) => boolean;
8
+ };
9
+ export declare function is_trajectory_file(filename: string, content?: string): boolean;