matterviz 0.4.1 → 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 (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -61,6 +61,6 @@ type $$ComponentProps = EventHandlers & HTMLAttributes<HTMLDivElement> & {
61
61
  wrapper?: HTMLDivElement;
62
62
  fullscreen?: boolean;
63
63
  };
64
- declare const Trajectory: import("svelte").Component<$$ComponentProps, {}, "trajectory" | "fullscreen" | "wrapper" | "hovered" | "controls_open" | "fps" | "info_pane_open" | "display_mode" | "current_step_idx" | "visible_properties">;
64
+ declare const Trajectory: import("svelte").Component<$$ComponentProps, {}, "fullscreen" | "wrapper" | "hovered" | "controls_open" | "trajectory" | "fps" | "info_pane_open" | "display_mode" | "current_step_idx" | "visible_properties">;
65
65
  type Trajectory = ReturnType<typeof Trajectory>;
66
66
  export default Trajectory;
@@ -3,21 +3,24 @@
3
3
  import type { Snippet } from 'svelte'
4
4
  import type { HTMLAttributes } from 'svelte/elements'
5
5
 
6
- let { error_msg, on_dismiss, error_snippet, ...rest }:
7
- & HTMLAttributes<HTMLDivElement>
8
- & {
9
- error_msg: string
10
- on_dismiss: () => void
11
- // Custom error snippet for advanced error handling
12
- error_snippet?: Snippet<[{ error_msg: string; on_dismiss: () => void }]>
13
- } = $props()
6
+ let {
7
+ error_msg,
8
+ on_dismiss,
9
+ error_snippet,
10
+ ...rest
11
+ }: HTMLAttributes<HTMLDivElement> & {
12
+ error_msg: string
13
+ on_dismiss: () => void
14
+ // Custom error snippet for advanced error handling
15
+ error_snippet?: Snippet<[{ error_msg: string; on_dismiss: () => void }]>
16
+ } = $props()
14
17
  </script>
15
18
 
16
19
  <div {...rest}>
17
20
  {#if error_snippet}
18
21
  {@render error_snippet({ error_msg, on_dismiss })}
19
22
  {:else if error_msg.startsWith(`<`)}
20
- <!-- Render HTML content for unsupported format messages -->
23
+ <!-- Render HTML error messages (sanitized) -->
21
24
  {@html sanitize_html(error_msg)}
22
25
  <button onclick={on_dismiss}>Dismiss</button>
23
26
  {:else}
@@ -60,69 +63,4 @@
60
63
  div button:hover {
61
64
  background: var(--error-btn-bg-hover);
62
65
  }
63
- /* Styles for unsupported format messages */
64
- div :global(.unsupported-format) {
65
- text-align: left;
66
- max-width: 90%;
67
- max-height: 70vh;
68
- margin: 0 auto;
69
- overflow-y: auto;
70
- overflow-x: hidden;
71
- }
72
- div :global(.unsupported-format h4) {
73
- color: var(--error-color);
74
- margin: 0 0 1rem 0;
75
- font-size: 1.1rem;
76
- display: flex;
77
- align-items: center;
78
- gap: 0.5rem;
79
- }
80
- div :global(.unsupported-format h5) {
81
- margin: 0.75rem 0 0.25rem 0;
82
- font-size: 0.9rem;
83
- font-weight: 600;
84
- }
85
- div :global(.unsupported-format p) {
86
- margin: 0.25rem 0;
87
- text-align: left;
88
- font-size: 0.85rem;
89
- }
90
- div :global(.unsupported-format ul) {
91
- text-align: left;
92
- margin: 0.5rem 0;
93
- padding-left: 1.5rem;
94
- }
95
- div :global(.unsupported-format li) {
96
- margin: 0.25rem 0;
97
- }
98
- div :global(.unsupported-format .code-options) {
99
- margin: 1rem 0 0 0;
100
- display: grid;
101
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
102
- gap: 1.5rem;
103
- }
104
- div :global(.unsupported-format .code-options > div) {
105
- margin: 0;
106
- }
107
- div :global(.unsupported-format .code-options strong) {
108
- display: block;
109
- margin-bottom: 0.25rem;
110
- font-size: 0.85rem;
111
- font-weight: 600;
112
- }
113
- div :global(.unsupported-format pre) {
114
- padding: 0.5rem;
115
- margin: 0;
116
- overflow-x: auto;
117
- font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Menlo', monospace;
118
- font-size: 0.75rem;
119
- line-height: 1.2;
120
- max-height: 150px;
121
- overflow-y: auto;
122
- }
123
- div :global(.unsupported-format p code) {
124
- padding: 0.2em 0.4em;
125
- border-radius: 3px;
126
- font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Menlo', monospace;
127
- }
128
66
  </style>
@@ -9,7 +9,6 @@
9
9
  import ExportPane from '../io/ExportPane.svelte'
10
10
  import SettingsSection from '../layout/SettingsSection.svelte'
11
11
  import type { TrajectoryType } from './'
12
- import type { ComponentProps } from 'svelte'
13
12
  import { tooltip } from 'svelte-multiselect/attachments'
14
13
  import { to_error } from '../utils'
15
14
 
@@ -62,7 +61,7 @@
62
61
  if (!canvas) return 0
63
62
  const pixels = canvas.width * canvas.height * resolution_multiplier ** 2
64
63
  const bitrate = estimate_video_bitrate(pixels, video_fps)
65
- return (bitrate * export_frame_count / video_fps) / 8 / 1024 / 1024
64
+ return (bitrate * export_frame_count) / video_fps / 8 / 1024 / 1024
66
65
  })
67
66
 
68
67
  // Initialize end_frame when trajectory changes
@@ -84,9 +83,7 @@
84
83
  }
85
84
  })
86
85
 
87
- let export_frame_count = $derived(
88
- end_frame >= start_frame ? end_frame - start_frame + 1 : 0,
89
- )
86
+ let export_frame_count = $derived(end_frame >= start_frame ? end_frame - start_frame + 1 : 0)
90
87
 
91
88
  async function handle_video_export(format: `webm` | `mp4` = `webm`) {
92
89
  export_error = null
@@ -96,8 +93,8 @@
96
93
  export_error = !trajectory
97
94
  ? `No trajectory`
98
95
  : !canvas
99
- ? `Canvas not ready`
100
- : `Invalid frame range`
96
+ ? `Canvas not ready`
97
+ : `Invalid frame range`
101
98
  return
102
99
  }
103
100
 
@@ -172,13 +169,7 @@
172
169
  <label>
173
170
  Frame Rate (FPS)
174
171
  <input type="number" min={10} max={60} bind:value={video_fps} />
175
- <input
176
- type="range"
177
- min={10}
178
- max={60}
179
- bind:value={video_fps}
180
- style="accent-color: var(--accent-color)"
181
- />
172
+ <input type="range" min={10} max={60} bind:value={video_fps} />
182
173
  </label>
183
174
 
184
175
  <span class="field-label">
@@ -192,7 +183,9 @@
192
183
  class:active={resolution_multiplier === multiplier}
193
184
  onclick={() => (resolution_multiplier = multiplier)}
194
185
  {@attach tooltip({
195
- content: canvas ? `${multiplier}x (${width_px}×${height_px})` : `${multiplier}x`,
186
+ content: canvas
187
+ ? `${multiplier}x (${width_px}×${height_px})`
188
+ : `${multiplier}x`,
196
189
  })}
197
190
  >
198
191
  {multiplier}x
@@ -214,7 +207,6 @@
214
207
  min={0}
215
208
  max={Math.max(0, total_frames_available - 1)}
216
209
  bind:value={start_frame}
217
- style="accent-color: var(--accent-color)"
218
210
  />
219
211
  </label>
220
212
 
@@ -231,7 +223,6 @@
231
223
  min={start_frame}
232
224
  max={Math.max(0, total_frames_available - 1)}
233
225
  bind:value={end_frame}
234
- style="accent-color: var(--accent-color)"
235
226
  />
236
227
  </label>
237
228
  </SettingsSection>
@@ -243,13 +234,7 @@
243
234
  {/if}
244
235
 
245
236
  <div class="export-buttons">
246
- {#each [
247
- { label: `WebM`, format: `webm`, hint: `Export as WebM video` },
248
- { label: `MP4`, format: `mp4`, hint: `WebM + ffmpeg command` },
249
- ] as const as
250
- { label, format, hint }
251
- (format)
252
- }
237
+ {#each [{ label: `WebM`, format: `webm`, hint: `Export as WebM video` }, { label: `MP4`, format: `mp4`, hint: `WebM + ffmpeg command` }] as const as { label, format, hint } (format)}
253
238
  <div style="display: flex; align-items: center; gap: 4pt">
254
239
  {label}
255
240
  <button
@@ -267,15 +252,11 @@
267
252
  </div>
268
253
 
269
254
  <div class="export-info">
270
- {(export_frame_count / video_fps).toFixed(1)}s ({export_frame_count} frames: {
271
- start_frame
272
- }–{end_frame})
255
+ {(export_frame_count / video_fps).toFixed(1)}s ({export_frame_count} frames: {start_frame}–{end_frame})
273
256
  {#if file_size_mb > 0}
274
- • ~{
275
- file_size_mb < 1
257
+ • ~{file_size_mb < 1
276
258
  ? `${(file_size_mb * 1024).toFixed(0)} KB`
277
- : `${file_size_mb.toFixed(1)} MB`
278
- }
259
+ : `${file_size_mb.toFixed(1)} MB`}
279
260
  {/if}
280
261
  </div>
281
262
 
@@ -292,7 +273,8 @@
292
273
  gap: 6pt;
293
274
  white-space: nowrap;
294
275
  }
295
- .warning, .error-message {
276
+ .warning,
277
+ .error-message {
296
278
  padding: 1ex;
297
279
  border-radius: var(--traj-border-radius, var(--border-radius, 3pt));
298
280
  font-size: 0.9em;
@@ -2,17 +2,18 @@
2
2
  import type { PaneProps, PaneToggleProps } from '../overlays'
3
3
  import type { InfoItem } from '../layout'
4
4
  import InfoPaneCards from '../overlays/InfoPaneCards.svelte'
5
- import { format_num } from '../labels'
5
+ import { format_bytes, format_num } from '../labels'
6
6
  import DraggablePane from '../overlays/DraggablePane.svelte'
7
7
  import { get_electro_neg_formula } from '../composition'
8
8
  import { SETTINGS_CONFIG } from '../settings'
9
9
  import type { AnyStructure } from '../structure'
10
10
  import type { ComponentProps } from 'svelte'
11
- import type { TrajectoryType } from './index'
11
+ import type { TrajectoryFrame, TrajectoryType } from './index'
12
12
 
13
13
  let {
14
14
  trajectory,
15
15
  current_step_idx,
16
+ current_frame = null,
16
17
  current_filename,
17
18
  current_file_path,
18
19
  file_size,
@@ -24,6 +25,7 @@
24
25
  }: Omit<ComponentProps<typeof DraggablePane>, `children`> & {
25
26
  trajectory: TrajectoryType
26
27
  current_step_idx: number
28
+ current_frame?: TrajectoryFrame | null
27
29
  current_filename?: string | null
28
30
  current_file_path?: string | null
29
31
  file_size?: number | null
@@ -34,11 +36,6 @@
34
36
  } = $props()
35
37
 
36
38
  // Helper functions
37
- const format_size = (bytes: number) =>
38
- bytes > 1024 * 1024
39
- ? `${format_num(bytes / (1024 * 1024), `.2~f`)} MB`
40
- : `${format_num(bytes / 1024, `.2~f`)} KB`
41
-
42
39
  const is_valid_number = (val: unknown): val is number =>
43
40
  typeof val === `number` && isFinite(val)
44
41
 
@@ -51,8 +48,7 @@
51
48
  return `${format_num(values[0], decimals)} ${unit}`.trim()
52
49
  }
53
50
  const [min, max] = [Math.min(...values), Math.max(...values)]
54
- return `${format_num(min, decimals)} - ${format_num(max, decimals)} ${unit}`
55
- .trim()
51
+ return `${format_num(min, decimals)} - ${format_num(max, decimals)} ${unit}`.trim()
56
52
  }
57
53
 
58
54
  const safe_item = (
@@ -60,7 +56,7 @@
60
56
  value: string | null,
61
57
  key?: string,
62
58
  tooltip?: string,
63
- ): InfoItem | null => value ? { label, value, key, tooltip } : null
59
+ ): InfoItem | null => (value ? { label, value, key, tooltip } : null)
64
60
 
65
61
  // oxlint-disable-next-line eslint-plugin-unicorn/prefer-native-coercion-functions -- type predicate needed for narrowing
66
62
  const is_info_item = (item: unknown): item is InfoItem => Boolean(item)
@@ -79,204 +75,173 @@
79
75
  (!trajectory?.frames?.length && !trajectory?.total_frames) ||
80
76
  current_step_idx < 0 ||
81
77
  current_step_idx >= (trajectory.total_frames ?? trajectory.frames?.length ?? 0)
82
- ) return []
78
+ )
79
+ return []
83
80
 
84
- // For indexed trajectories, we might not have the current frame loaded
85
- const current_frame = trajectory.frames?.[current_step_idx]
81
+ // For indexed trajectories, the resolved frame may live outside sparse frame arrays.
82
+ const displayed_frame = current_frame ?? trajectory.frames?.[current_step_idx]
86
83
  const total_frames = trajectory.total_frames ?? trajectory.frames?.length ?? 0
87
84
 
88
85
  const sections: { title: string; items: InfoItem[] }[] = []
86
+ // Append a section unless every item filtered out as falsy
87
+ const push_section = (title: string, items: unknown[]) => {
88
+ const valid_items = items.filter(is_info_item)
89
+ if (valid_items.length > 0) sections.push({ title, items: valid_items })
90
+ }
89
91
 
90
- // File info section
91
- const file_items = [
92
+ push_section(`File`, [
92
93
  current_filename &&
93
- safe_item(
94
- `Name`,
95
- current_filename,
96
- `file-name`,
97
- current_file_path || undefined,
98
- ),
99
- file_size && file_size > 0 &&
100
- safe_item(`File Size`, format_size(file_size), `file-size`),
94
+ safe_item(`Name`, current_filename, `file-name`, current_file_path || undefined),
95
+ file_size &&
96
+ file_size > 0 &&
97
+ safe_item(`File Size`, format_bytes(file_size), `file-size`),
101
98
  file_object?.lastModified &&
102
- safe_item(
103
- `Modified`,
104
- new Date(file_object.lastModified).toLocaleString(),
105
- `file-modified`,
106
- ),
99
+ safe_item(
100
+ `Modified`,
101
+ new Date(file_object.lastModified).toLocaleString(),
102
+ `file-modified`,
103
+ ),
107
104
  trajectory.metadata?.source_format &&
108
- safe_item(`Format`, String(trajectory.metadata.source_format), `file-format`),
109
- ].filter(is_info_item)
105
+ safe_item(`Format`, String(trajectory.metadata.source_format), `file-format`),
106
+ ])
110
107
 
111
- if (file_items.length > 0) {
112
- sections.push({ title: `File`, items: file_items })
113
- }
114
-
115
- // Trajectory info section (always show this)
116
- const traj_items = [
108
+ push_section(`Trajectory`, [
117
109
  safe_item(
118
110
  `Total Frames`,
119
- `${format_num(total_frames, `.3~s`)} (current: ${
120
- format_num(current_step_idx + 1, `.3~s`)
121
- })`,
111
+ `${format_num(total_frames, `.3~s`)} (current: ${format_num(
112
+ current_step_idx + 1,
113
+ `.3~s`,
114
+ )})`,
122
115
  `total-frames`,
123
116
  ),
124
117
  trajectory.is_indexed &&
125
- safe_item(
126
- `Indexed`,
127
- `Yes`,
128
- `indexed-mode`,
129
- SETTINGS_CONFIG.trajectory.use_indexing.description,
130
- ),
118
+ safe_item(
119
+ `Indexed`,
120
+ `Yes`,
121
+ `indexed-mode`,
122
+ SETTINGS_CONFIG.trajectory.use_indexing.description,
123
+ ),
131
124
  trajectory.indexed_frames &&
132
- safe_item(
133
- `Index Points`,
134
- `${trajectory.indexed_frames.length}`,
135
- `index-points`,
136
- `Number of frames indexed for fast seeking`,
137
- ),
125
+ safe_item(
126
+ `Index Points`,
127
+ `${trajectory.indexed_frames.length}`,
128
+ `index-points`,
129
+ `Number of frames indexed for fast seeking`,
130
+ ),
138
131
  trajectory.plot_metadata &&
139
- safe_item(
140
- `Plot Metadata`,
141
- `${trajectory.plot_metadata.length} frames`,
142
- `plot-metadata`,
143
- `Pre-extracted metadata for plotting`,
144
- ),
145
- ].filter(is_info_item)
146
-
147
- if (traj_items.length > 0) {
148
- sections.push({ title: `Trajectory`, items: traj_items })
149
- }
132
+ safe_item(
133
+ `Plot Metadata`,
134
+ `${trajectory.plot_metadata.length} frames`,
135
+ `plot-metadata`,
136
+ `Pre-extracted metadata for plotting`,
137
+ ),
138
+ ])
150
139
 
151
140
  // Structure info section (only if we have the current frame)
152
- if (current_frame?.structure?.sites) {
153
- const { structure } = current_frame
141
+ if (displayed_frame?.structure?.sites) {
142
+ const { structure } = displayed_frame
154
143
  const lattice = `lattice` in structure ? structure.lattice : null
155
144
  const { volume, a, b, c, alpha, beta, gamma } = lattice || {}
156
145
  const formula = safe_formula(structure)
157
146
 
158
- const structure_items = [
147
+ push_section(`Structure`, [
159
148
  safe_item(`Atoms`, `${structure.sites.length}`, `atoms`),
160
149
  formula && safe_item(`Formula`, String(formula), `formula`),
161
- is_valid_number(volume) && volume > 0 &&
162
- safe_item(`Volume`, `${format_num(volume, `.3~s`)} ų`, `volume`),
163
- is_valid_number(volume) && volume > 0 && structure.sites.length > 0 &&
164
- safe_item(
165
- `Density`,
166
- `${format_num(structure.sites.length / volume, `.4~s`)} atoms/ų`,
167
- `density`,
168
- ),
150
+ is_valid_number(volume) &&
151
+ volume > 0 &&
152
+ safe_item(`Volume`, `${format_num(volume, `.3~s`)} ų`, `volume`),
153
+ is_valid_number(volume) &&
154
+ volume > 0 &&
155
+ structure.sites.length > 0 &&
156
+ safe_item(
157
+ `Density`,
158
+ `${format_num(structure.sites.length / volume, `.3~s`)} atoms/ų`,
159
+ `density`,
160
+ ),
169
161
  [a, b, c].every(is_valid_number) &&
170
- safe_item(
171
- `Cell Lengths`,
172
- `${format_num(a as number, `.3~f`)}, ${format_num(b as number, `.3~f`)}, ${
173
- format_num(c as number, `.3~f`)
174
- } Å`,
175
- `cell-lengths`,
176
- ),
162
+ safe_item(
163
+ `Cell Lengths`,
164
+ `${format_num(a as number, `.3~f`)}, ${format_num(b as number, `.3~f`)}, ${format_num(
165
+ c as number,
166
+ `.3~f`,
167
+ )} Å`,
168
+ `cell-lengths`,
169
+ ),
177
170
  [alpha, beta, gamma].every(is_valid_number) &&
178
- safe_item(
179
- `Cell Angles`,
180
- `${format_num(alpha as number, `.2~f`)}°, ${
181
- format_num(beta as number, `.2~f`)
182
- }°, ${format_num(gamma as number, `.2~f`)}°`,
183
- `cell-angles`,
184
- ),
185
- ].filter(is_info_item)
186
-
187
- if (structure_items.length > 0) {
188
- sections.push({ title: `Structure`, items: structure_items })
189
- }
171
+ safe_item(
172
+ `Cell Angles`,
173
+ `${format_num(alpha as number, `.2~f`)}°, ${format_num(
174
+ beta as number,
175
+ `.2~f`,
176
+ )}°, ${format_num(gamma as number, `.2~f`)}°`,
177
+ `cell-angles`,
178
+ ),
179
+ ])
190
180
  } else if (trajectory.is_indexed) {
191
181
  // For indexed trajectories, show a note that frame data is loaded on demand
192
- const structure_items = [
182
+ push_section(`Structure`, [
193
183
  safe_item(
194
184
  `Frame Loading`,
195
185
  `On-demand`,
196
186
  `frame-loading`,
197
187
  `Structure data loaded when frame is accessed`,
198
188
  ),
199
- ].filter(is_info_item)
200
-
201
- if (structure_items.length > 0) {
202
- sections.push({ title: `Structure`, items: structure_items })
203
- }
204
- }
205
-
206
- // Energy section (only for regular trajectories with multiple frames)
207
- if (!trajectory.is_indexed && trajectory.frames.length > 1) {
208
- const energies = extract_numeric_array(trajectory.frames, `energy`)
209
- if (energies.length > 1) {
210
- const current_energy = current_frame?.metadata?.energy
211
- const energy_range = format_range(energies, `eV`, `.3~s`)
212
-
213
- const energy_items = [
214
- is_valid_number(current_energy) &&
215
- safe_item(
216
- `Current Energy`,
217
- `${format_num(current_energy, `.3~s`)} eV`,
218
- `energy-current`,
219
- ),
220
- energy_range && safe_item(`Energy Range`, energy_range, `energy-range`),
221
- ].filter(is_info_item)
222
-
223
- if (energy_items.length > 0) {
224
- sections.push({ title: `Energy`, items: energy_items })
225
- }
226
- }
189
+ ])
227
190
  }
228
191
 
229
- // Forces section (only for regular trajectories with multiple frames)
192
+ // Energy/Forces sections (only for regular trajectories with multiple frames)
230
193
  if (!trajectory.is_indexed && trajectory.frames.length > 1) {
231
- const forces = extract_numeric_array(trajectory.frames, `force_max`)
232
- if (forces.length > 1) {
233
- const current_force = current_frame?.metadata?.force_max
234
- const force_range = format_range(forces, `eV/Å`, `.3~s`)
235
-
236
- const force_items = [
237
- is_valid_number(current_force) &&
238
- safe_item(
239
- `Max Force`,
240
- `${format_num(current_force, `.3~s`)} eV/Å`,
241
- `force-current`,
242
- ),
243
- force_range && safe_item(`Force Range`, force_range, `force-range`),
244
- ].filter(is_info_item)
245
-
246
- if (force_items.length > 0) {
247
- sections.push({ title: `Forces`, items: force_items })
248
- }
194
+ const range_sections = [
195
+ {
196
+ title: `Energy`,
197
+ prop: `energy`,
198
+ unit: `eV`,
199
+ key: `energy`,
200
+ current_label: `Current Energy`,
201
+ range_label: `Energy Range`,
202
+ },
203
+ {
204
+ title: `Forces`,
205
+ prop: `force_max`,
206
+ unit: `eV/Å`,
207
+ key: `force`,
208
+ current_label: `Max Force`,
209
+ range_label: `Force Range`,
210
+ },
211
+ ] as const
212
+ for (const { title, prop, unit, key, current_label, range_label } of range_sections) {
213
+ const values = extract_numeric_array(trajectory.frames, prop)
214
+ if (values.length <= 1) continue
215
+ const current = displayed_frame?.metadata?.[prop]
216
+ push_section(title, [
217
+ is_valid_number(current) &&
218
+ safe_item(
219
+ current_label,
220
+ `${format_num(current, `.3~s`)} ${unit}`,
221
+ `${key}-current`,
222
+ ),
223
+ safe_item(range_label, format_range(values, unit, `.3~s`), `${key}-range`),
224
+ ])
249
225
  }
250
226
  }
251
227
 
252
228
  // Volume change section (only for regular trajectories)
253
- if (
254
- !trajectory.is_indexed && current_frame?.structure &&
255
- trajectory.frames.length > 1
256
- ) {
257
- const lattice = `lattice` in current_frame.structure
258
- ? current_frame.structure.lattice
259
- : null
229
+ if (!trajectory.is_indexed && displayed_frame?.structure && trajectory.frames.length > 1) {
230
+ const lattice =
231
+ `lattice` in displayed_frame.structure ? displayed_frame.structure.lattice : null
260
232
  if (lattice) {
261
- const volumes = trajectory.frames.map((
262
- { structure },
263
- ) => (`lattice` in structure && structure.lattice?.volume))
233
+ const volumes = trajectory.frames
234
+ .map(({ structure }) => `lattice` in structure && structure.lattice?.volume)
264
235
  .filter(is_valid_number)
265
236
  .filter((volume) => volume > 0)
266
237
 
267
238
  if (volumes.length > 1) {
268
- const vol_change = (Math.max(...volumes) - Math.min(...volumes)) /
269
- Math.min(...volumes)
239
+ const vol_change =
240
+ (Math.max(...volumes) - Math.min(...volumes)) / Math.min(...volumes)
270
241
  if (Math.abs(vol_change) > 0.1 && is_valid_number(vol_change)) {
271
- const vol_items = [safe_item(
272
- `Volume Change`,
273
- `${format_num(vol_change, `.2~%`)}`,
274
- `vol-change`,
275
- )].filter(is_info_item)
276
-
277
- if (vol_items.length > 0) {
278
- sections.push({ title: `Volume`, items: vol_items })
279
- }
242
+ push_section(`Volume`, [
243
+ safe_item(`Volume Change`, `${format_num(vol_change, `.2~%`)}`, `vol-change`),
244
+ ])
280
245
  }
281
246
  }
282
247
  }
@@ -284,9 +249,7 @@
284
249
  return sections
285
250
  })
286
251
 
287
- let info_cards = $derived(
288
- info_pane_data.map(({ title, items }) => ({ title, rows: items })),
289
- )
252
+ let info_cards = $derived(info_pane_data.map(({ title, items }) => ({ title, rows: items })))
290
253
  let n_info_items = $derived(
291
254
  info_pane_data.reduce((count, { items }) => count + items.length, 0),
292
255
  )
@@ -1,10 +1,11 @@
1
1
  import type { PaneProps, PaneToggleProps } from '../overlays';
2
2
  import DraggablePane from '../overlays/DraggablePane.svelte';
3
3
  import type { ComponentProps } from 'svelte';
4
- import type { TrajectoryType } from './index';
4
+ import type { TrajectoryFrame, TrajectoryType } from './index';
5
5
  type $$ComponentProps = Omit<ComponentProps<typeof DraggablePane>, `children`> & {
6
6
  trajectory: TrajectoryType;
7
7
  current_step_idx: number;
8
+ current_frame?: TrajectoryFrame | null;
8
9
  current_filename?: string | null;
9
10
  current_file_path?: string | null;
10
11
  file_size?: number | null;