matterviz 0.3.5 → 0.3.6

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 (855) hide show
  1. package/.vscode/launch.json +13 -0
  2. package/.vscodeignore +7 -0
  3. package/dist/assets/STLExporter-BpTH3YHE.js +8 -0
  4. package/dist/assets/browser-DdDecX_W.js +1 -0
  5. package/dist/assets/export-qgn-H9y6.js +2 -0
  6. package/dist/assets/main-DiKYzti2.css +1 -0
  7. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  8. package/dist/extension.js +31293 -0
  9. package/dist/src/lib/FilePicker.svelte +360 -0
  10. package/dist/src/lib/MillerIndexInput.svelte +66 -0
  11. package/dist/src/lib/api/mp.ts +26 -0
  12. package/dist/src/lib/api/optimade.ts +204 -0
  13. package/dist/src/lib/brillouin/BrillouinZone.svelte +549 -0
  14. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +144 -0
  15. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +146 -0
  16. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  17. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +476 -0
  18. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +92 -0
  19. package/dist/src/lib/brillouin/compute.ts +529 -0
  20. package/dist/src/lib/brillouin/index.ts +8 -0
  21. package/dist/src/lib/brillouin/types.ts +51 -0
  22. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +327 -0
  23. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
  24. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
  25. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +94 -0
  26. package/dist/src/lib/chempot-diagram/chempot-worker.ts +11 -0
  27. package/dist/src/lib/chempot-diagram/color.ts +42 -0
  28. package/dist/src/lib/chempot-diagram/compute.ts +1014 -0
  29. package/dist/src/lib/chempot-diagram/index.ts +6 -0
  30. package/dist/src/lib/chempot-diagram/pointer.ts +56 -0
  31. package/dist/src/lib/chempot-diagram/temperature.ts +77 -0
  32. package/dist/src/lib/chempot-diagram/types.ts +130 -0
  33. package/dist/src/lib/colors/index.ts +249 -0
  34. package/dist/src/lib/composition/BarChart.svelte +297 -0
  35. package/dist/src/lib/composition/BubbleChart.svelte +218 -0
  36. package/dist/src/lib/composition/Composition.svelte +165 -0
  37. package/dist/src/lib/composition/Formula.svelte +268 -0
  38. package/dist/src/lib/composition/FormulaFilter.svelte +1257 -0
  39. package/dist/src/lib/composition/PieChart.svelte +323 -0
  40. package/dist/src/lib/composition/format.ts +155 -0
  41. package/dist/src/lib/composition/index.ts +37 -0
  42. package/dist/src/lib/composition/parse.ts +605 -0
  43. package/dist/src/lib/constants.ts +134 -0
  44. package/dist/src/lib/controls.ts +42 -0
  45. package/dist/src/lib/convex-hull/ConvexHull.svelte +157 -0
  46. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +825 -0
  47. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +1801 -0
  48. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +1398 -0
  49. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +535 -0
  50. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +125 -0
  51. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +929 -0
  52. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +131 -0
  53. package/dist/src/lib/convex-hull/GasPressureControls.svelte +247 -0
  54. package/dist/src/lib/convex-hull/StructurePopup.svelte +151 -0
  55. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +140 -0
  56. package/dist/src/lib/convex-hull/barycentric-coords.ts +246 -0
  57. package/dist/src/lib/convex-hull/demo-temperature.ts +63 -0
  58. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +405 -0
  59. package/dist/src/lib/convex-hull/helpers.ts +932 -0
  60. package/dist/src/lib/convex-hull/index.ts +202 -0
  61. package/dist/src/lib/convex-hull/thermodynamics.ts +2192 -0
  62. package/dist/src/lib/convex-hull/types.ts +267 -0
  63. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +311 -0
  64. package/dist/src/lib/coordination/calc-coordination.ts +93 -0
  65. package/dist/src/lib/coordination/index.ts +9 -0
  66. package/dist/src/lib/effects.svelte.ts +48 -0
  67. package/dist/src/lib/element/BohrAtom.svelte +147 -0
  68. package/dist/src/lib/element/ElementHeading.svelte +26 -0
  69. package/dist/src/lib/element/ElementPhoto.svelte +57 -0
  70. package/dist/src/lib/element/ElementStats.svelte +80 -0
  71. package/dist/src/lib/element/ElementTile.svelte +484 -0
  72. package/dist/src/lib/element/data.json.gz.d.ts +4 -0
  73. package/dist/src/lib/element/data.ts +14 -0
  74. package/dist/src/lib/element/index.ts +8 -0
  75. package/dist/src/lib/element/types.ts +62 -0
  76. package/dist/src/lib/feedback/ClickFeedback.svelte +58 -0
  77. package/dist/src/lib/feedback/DragOverlay.svelte +42 -0
  78. package/dist/src/lib/feedback/index.ts +4 -0
  79. package/dist/src/lib/fermi-surface/FermiSlice.svelte +189 -0
  80. package/dist/src/lib/fermi-surface/FermiSurface.svelte +600 -0
  81. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +448 -0
  82. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +794 -0
  83. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
  84. package/dist/src/lib/fermi-surface/compute.ts +728 -0
  85. package/dist/src/lib/fermi-surface/constants.ts +32 -0
  86. package/dist/src/lib/fermi-surface/export.ts +64 -0
  87. package/dist/src/lib/fermi-surface/index.ts +14 -0
  88. package/dist/src/lib/fermi-surface/marching-cubes.ts +3 -0
  89. package/dist/src/lib/fermi-surface/parse.ts +574 -0
  90. package/dist/src/lib/fermi-surface/symmetry.ts +56 -0
  91. package/dist/src/lib/fermi-surface/types.ts +159 -0
  92. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
  93. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  94. package/dist/src/lib/heatmap-matrix/index.ts +167 -0
  95. package/dist/src/lib/heatmap-matrix/shared.ts +7 -0
  96. package/dist/src/lib/icons.ts +650 -0
  97. package/dist/src/lib/index.ts +61 -0
  98. package/dist/src/lib/io/decompress.ts +92 -0
  99. package/dist/src/lib/io/export.ts +385 -0
  100. package/dist/src/lib/io/fetch.ts +46 -0
  101. package/dist/src/lib/io/file-drop.ts +51 -0
  102. package/dist/src/lib/io/index.ts +7 -0
  103. package/dist/src/lib/io/is-binary.ts +24 -0
  104. package/dist/src/lib/io/types.ts +8 -0
  105. package/dist/src/lib/io/url-drop.ts +141 -0
  106. package/dist/src/lib/isosurface/Isosurface.svelte +285 -0
  107. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +277 -0
  108. package/dist/src/lib/isosurface/index.ts +7 -0
  109. package/dist/src/lib/isosurface/parse.ts +656 -0
  110. package/dist/src/lib/isosurface/slice.ts +175 -0
  111. package/dist/src/lib/isosurface/types.ts +309 -0
  112. package/dist/src/lib/labels.ts +320 -0
  113. package/dist/src/lib/layout/FullscreenToggle.svelte +50 -0
  114. package/dist/src/lib/layout/InfoCard.svelte +120 -0
  115. package/dist/src/lib/layout/InfoTag.svelte +185 -0
  116. package/dist/src/lib/layout/PropertyFilter.svelte +246 -0
  117. package/dist/src/lib/layout/SettingsSection.svelte +148 -0
  118. package/dist/src/lib/layout/SubpageGrid.svelte +82 -0
  119. package/dist/src/lib/layout/fullscreen.ts +65 -0
  120. package/dist/src/lib/layout/index.ts +11 -0
  121. package/dist/src/lib/layout/json-tree/JsonNode.svelte +548 -0
  122. package/dist/src/lib/layout/json-tree/JsonTree.svelte +1230 -0
  123. package/dist/src/lib/layout/json-tree/JsonValue.svelte +334 -0
  124. package/dist/src/lib/layout/json-tree/index.ts +3 -0
  125. package/dist/src/lib/layout/json-tree/types.ts +126 -0
  126. package/dist/src/lib/layout/json-tree/utils.ts +682 -0
  127. package/dist/src/lib/marching-cubes.ts +614 -0
  128. package/dist/src/lib/math.ts +1081 -0
  129. package/dist/src/lib/overlays/ContextMenu.svelte +162 -0
  130. package/dist/src/lib/overlays/CopyButton.svelte +45 -0
  131. package/dist/src/lib/overlays/DragControlTab.svelte +98 -0
  132. package/dist/src/lib/overlays/DraggablePane.svelte +487 -0
  133. package/dist/src/lib/overlays/InfoPaneCards.svelte +149 -0
  134. package/dist/src/lib/overlays/index.ts +3 -0
  135. package/dist/src/lib/periodic-table/PeriodicTable.svelte +469 -0
  136. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +557 -0
  137. package/dist/src/lib/periodic-table/PropertySelect.svelte +37 -0
  138. package/dist/src/lib/periodic-table/index.ts +12 -0
  139. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
  140. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +444 -0
  141. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  142. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  143. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  144. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +203 -0
  145. package/dist/src/lib/phase-diagram/build-diagram.ts +186 -0
  146. package/dist/src/lib/phase-diagram/colors.ts +58 -0
  147. package/dist/src/lib/phase-diagram/diagram-input.ts +40 -0
  148. package/dist/src/lib/phase-diagram/index.ts +13 -0
  149. package/dist/src/lib/phase-diagram/parse.ts +348 -0
  150. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +1023 -0
  151. package/dist/src/lib/phase-diagram/types.ts +144 -0
  152. package/dist/src/lib/phase-diagram/utils.ts +775 -0
  153. package/dist/src/lib/plot/AxisLabel.svelte +51 -0
  154. package/dist/src/lib/plot/BarPlot.svelte +2113 -0
  155. package/dist/src/lib/plot/BarPlotControls.svelte +66 -0
  156. package/dist/src/lib/plot/BinnedScatterPlot.svelte +1114 -0
  157. package/dist/src/lib/plot/ColorBar.svelte +721 -0
  158. package/dist/src/lib/plot/ColorScaleSelect.svelte +54 -0
  159. package/dist/src/lib/plot/ElementScatter.svelte +63 -0
  160. package/dist/src/lib/plot/FillArea.svelte +223 -0
  161. package/dist/src/lib/plot/Histogram.svelte +1558 -0
  162. package/dist/src/lib/plot/HistogramControls.svelte +212 -0
  163. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +96 -0
  164. package/dist/src/lib/plot/Line.svelte +84 -0
  165. package/dist/src/lib/plot/PlotAxis.svelte +169 -0
  166. package/dist/src/lib/plot/PlotControls.svelte +537 -0
  167. package/dist/src/lib/plot/PlotLegend.svelte +569 -0
  168. package/dist/src/lib/plot/PlotTooltip.svelte +67 -0
  169. package/dist/src/lib/plot/PortalSelect.svelte +253 -0
  170. package/dist/src/lib/plot/ReferenceLine3D.svelte +156 -0
  171. package/dist/src/lib/plot/ReferencePlane.svelte +175 -0
  172. package/dist/src/lib/plot/ScatterPlot.svelte +2778 -0
  173. package/dist/src/lib/plot/ScatterPlot3D.svelte +529 -0
  174. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +437 -0
  175. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +912 -0
  176. package/dist/src/lib/plot/ScatterPlotControls.svelte +306 -0
  177. package/dist/src/lib/plot/ScatterPoint.svelte +182 -0
  178. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +293 -0
  179. package/dist/src/lib/plot/Surface3D.svelte +197 -0
  180. package/dist/src/lib/plot/ZeroLines.svelte +97 -0
  181. package/dist/src/lib/plot/ZoomRect.svelte +23 -0
  182. package/dist/src/lib/plot/adaptive-density.ts +316 -0
  183. package/dist/src/lib/plot/auto-place.ts +184 -0
  184. package/dist/src/lib/plot/axis-utils.ts +122 -0
  185. package/dist/src/lib/plot/binned-scatter-types.ts +83 -0
  186. package/dist/src/lib/plot/data-cleaning.ts +1069 -0
  187. package/dist/src/lib/plot/data-transform.ts +69 -0
  188. package/dist/src/lib/plot/defaults.ts +9 -0
  189. package/dist/src/lib/plot/fill-utils.ts +494 -0
  190. package/dist/src/lib/plot/hover-lock.svelte.ts +60 -0
  191. package/dist/src/lib/plot/index.ts +53 -0
  192. package/dist/src/lib/plot/interactions.ts +119 -0
  193. package/dist/src/lib/plot/layout.ts +425 -0
  194. package/dist/src/lib/plot/reference-line.ts +426 -0
  195. package/dist/src/lib/plot/scales.ts +654 -0
  196. package/dist/src/lib/plot/svg.ts +23 -0
  197. package/dist/src/lib/plot/types.ts +1144 -0
  198. package/dist/src/lib/plot/utils/label-placement.ts +541 -0
  199. package/dist/src/lib/plot/utils/series-visibility.ts +140 -0
  200. package/dist/src/lib/plot/utils.ts +11 -0
  201. package/dist/src/lib/rdf/RdfPlot.svelte +247 -0
  202. package/dist/src/lib/rdf/calc-rdf.ts +167 -0
  203. package/dist/src/lib/rdf/index.ts +27 -0
  204. package/dist/src/lib/sanitize.ts +126 -0
  205. package/dist/src/lib/settings.ts +1479 -0
  206. package/dist/src/lib/spectral/Bands.svelte +1040 -0
  207. package/dist/src/lib/spectral/BandsAndDos.svelte +134 -0
  208. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +252 -0
  209. package/dist/src/lib/spectral/Dos.svelte +697 -0
  210. package/dist/src/lib/spectral/helpers.ts +1381 -0
  211. package/dist/src/lib/spectral/index.ts +8 -0
  212. package/dist/src/lib/spectral/types.ts +112 -0
  213. package/dist/src/lib/state.svelte.ts +64 -0
  214. package/dist/src/lib/structure/Arrow.svelte +72 -0
  215. package/dist/src/lib/structure/AtomLegend.svelte +815 -0
  216. package/dist/src/lib/structure/Bond.svelte +140 -0
  217. package/dist/src/lib/structure/CanvasTooltip.svelte +33 -0
  218. package/dist/src/lib/structure/CellSelect.svelte +349 -0
  219. package/dist/src/lib/structure/Cylinder.svelte +45 -0
  220. package/dist/src/lib/structure/Lattice.svelte +196 -0
  221. package/dist/src/lib/structure/Structure.svelte +2248 -0
  222. package/dist/src/lib/structure/StructureControls.svelte +1273 -0
  223. package/dist/src/lib/structure/StructureExportPane.svelte +252 -0
  224. package/dist/src/lib/structure/StructureInfoPane.svelte +737 -0
  225. package/dist/src/lib/structure/StructureScene.svelte +2255 -0
  226. package/dist/src/lib/structure/atom-properties.ts +316 -0
  227. package/dist/src/lib/structure/bond-order-perception.ts +447 -0
  228. package/dist/src/lib/structure/bonding.ts +944 -0
  229. package/dist/src/lib/structure/export.ts +861 -0
  230. package/dist/src/lib/structure/index.ts +291 -0
  231. package/dist/src/lib/structure/label-placement.ts +130 -0
  232. package/dist/src/lib/structure/measure.ts +45 -0
  233. package/dist/src/lib/structure/parse.ts +1705 -0
  234. package/dist/src/lib/structure/partial-occupancy.ts +183 -0
  235. package/dist/src/lib/structure/pbc.ts +164 -0
  236. package/dist/src/lib/structure/supercell.ts +226 -0
  237. package/dist/src/lib/structure/validation.ts +11 -0
  238. package/dist/src/lib/symmetry/SymmetryStats.svelte +226 -0
  239. package/dist/src/lib/symmetry/WyckoffTable.svelte +120 -0
  240. package/dist/src/lib/symmetry/cell-transform.ts +118 -0
  241. package/dist/src/lib/symmetry/index.ts +348 -0
  242. package/dist/src/lib/symmetry/spacegroups.ts +404 -0
  243. package/dist/src/lib/table/HeatmapTable.svelte +1833 -0
  244. package/dist/src/lib/table/ToggleMenu.svelte +385 -0
  245. package/dist/src/lib/table/index.ts +139 -0
  246. package/dist/src/lib/theme/ThemeControl.svelte +53 -0
  247. package/dist/src/lib/theme/index.ts +107 -0
  248. package/dist/src/lib/theme/themes.mjs +297 -0
  249. package/dist/src/lib/time.ts +71 -0
  250. package/dist/src/lib/tooltip/TooltipContent.svelte +58 -0
  251. package/dist/src/lib/tooltip/index.ts +2 -0
  252. package/dist/src/lib/tooltip/types.ts +13 -0
  253. package/dist/src/lib/trajectory/Trajectory.svelte +1545 -0
  254. package/dist/src/lib/trajectory/TrajectoryError.svelte +128 -0
  255. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +357 -0
  256. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +313 -0
  257. package/dist/src/lib/trajectory/constants.ts +7 -0
  258. package/dist/src/lib/trajectory/extract.ts +196 -0
  259. package/dist/src/lib/trajectory/format-detect.ts +96 -0
  260. package/dist/src/lib/trajectory/frame-reader.ts +456 -0
  261. package/dist/src/lib/trajectory/helpers.ts +217 -0
  262. package/dist/src/lib/trajectory/index.ts +218 -0
  263. package/dist/src/lib/trajectory/parse/ase.ts +109 -0
  264. package/dist/src/lib/trajectory/parse/hdf5.ts +173 -0
  265. package/dist/src/lib/trajectory/parse/index.ts +411 -0
  266. package/dist/src/lib/trajectory/parse/lammps.ts +215 -0
  267. package/dist/src/lib/trajectory/parse/vasp.ts +102 -0
  268. package/dist/src/lib/trajectory/parse/xyz.ts +143 -0
  269. package/dist/src/lib/trajectory/plotting.ts +599 -0
  270. package/dist/src/lib/trajectory/types.ts +13 -0
  271. package/dist/src/lib/utils.ts +56 -0
  272. package/dist/src/lib/xrd/XrdPlot.svelte +615 -0
  273. package/dist/src/lib/xrd/broadening.ts +130 -0
  274. package/dist/src/lib/xrd/calc-xrd.ts +397 -0
  275. package/dist/src/lib/xrd/index.ts +38 -0
  276. package/dist/src/lib/xrd/parse.ts +858 -0
  277. package/dist/webview.js +29421 -0
  278. package/icon.png +0 -0
  279. package/license +1 -1
  280. package/matterviz-0.3.2.vsix +0 -0
  281. package/matterviz-0.3.4.vsix +0 -0
  282. package/matterviz-0.3.5.vsix +0 -0
  283. package/package.json +1460 -215
  284. package/readme.md +171 -98
  285. package/scripts/sync-config.ts +101 -0
  286. package/src/declarations.d.ts +2 -0
  287. package/src/extension.ts +972 -0
  288. package/src/node-io.ts +65 -0
  289. package/src/types.ts +17 -0
  290. package/src/webview/JsonBrowser.svelte +1079 -0
  291. package/src/webview/PlotPanel.svelte +346 -0
  292. package/src/webview/detect.ts +444 -0
  293. package/src/webview/main.ts +764 -0
  294. package/src/webview/plot-utils.ts +250 -0
  295. package/test-fixtures/all-viz-types.json.gz +0 -0
  296. package/test-fixtures/plot-demo-data.json.gz +0 -0
  297. package/tests/detect.test.ts +604 -0
  298. package/tests/extension.test.ts +2041 -0
  299. package/tests/node-io.test.ts +39 -0
  300. package/tests/plot-utils.test.ts +302 -0
  301. package/tests/vite-plugin-json-gz.test.ts +114 -0
  302. package/tests/vscode-mock.ts +18 -0
  303. package/tests/webview.test.ts +231 -0
  304. package/tsconfig.json +20 -0
  305. package/vite-plugin-json-gz.ts +29 -0
  306. package/vite.config.ts +34 -0
  307. package/vite.extension.config.ts +34 -0
  308. package/dist/EmptyState.svelte.d.ts +0 -9
  309. package/dist/FilePicker.svelte +0 -360
  310. package/dist/FilePicker.svelte.d.ts +0 -17
  311. package/dist/Icon.svelte.d.ts +0 -13
  312. package/dist/MillerIndexInput.svelte +0 -66
  313. package/dist/MillerIndexInput.svelte.d.ts +0 -7
  314. package/dist/api/mp.d.ts +0 -6
  315. package/dist/api/mp.js +0 -22
  316. package/dist/api/optimade.d.ts +0 -45
  317. package/dist/api/optimade.js +0 -135
  318. package/dist/brillouin/BrillouinZone.svelte +0 -546
  319. package/dist/brillouin/BrillouinZone.svelte.d.ts +0 -83
  320. package/dist/brillouin/BrillouinZoneControls.svelte +0 -144
  321. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +0 -17
  322. package/dist/brillouin/BrillouinZoneExportPane.svelte +0 -148
  323. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +0 -15
  324. package/dist/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  325. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +0 -13
  326. package/dist/brillouin/BrillouinZoneScene.svelte +0 -476
  327. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +0 -48
  328. package/dist/brillouin/BrillouinZoneTooltip.svelte +0 -92
  329. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +0 -8
  330. package/dist/brillouin/compute.d.ts +0 -17
  331. package/dist/brillouin/compute.js +0 -426
  332. package/dist/brillouin/index.d.ts +0 -8
  333. package/dist/brillouin/index.js +0 -8
  334. package/dist/brillouin/types.d.ts +0 -48
  335. package/dist/brillouin/types.js +0 -1
  336. package/dist/chempot-diagram/ChemPotDiagram.svelte +0 -327
  337. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +0 -13
  338. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +0 -847
  339. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +0 -16
  340. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +0 -3194
  341. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +0 -16
  342. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +0 -7
  343. package/dist/chempot-diagram/async-compute.svelte.d.ts +0 -3
  344. package/dist/chempot-diagram/async-compute.svelte.js +0 -78
  345. package/dist/chempot-diagram/chempot-worker.d.ts +0 -1
  346. package/dist/chempot-diagram/chempot-worker.js +0 -11
  347. package/dist/chempot-diagram/color.d.ts +0 -10
  348. package/dist/chempot-diagram/color.js +0 -32
  349. package/dist/chempot-diagram/compute.d.ts +0 -48
  350. package/dist/chempot-diagram/compute.js +0 -812
  351. package/dist/chempot-diagram/index.d.ts +0 -6
  352. package/dist/chempot-diagram/index.js +0 -6
  353. package/dist/chempot-diagram/pointer.d.ts +0 -16
  354. package/dist/chempot-diagram/pointer.js +0 -40
  355. package/dist/chempot-diagram/temperature.d.ts +0 -15
  356. package/dist/chempot-diagram/temperature.js +0 -36
  357. package/dist/chempot-diagram/types.d.ts +0 -86
  358. package/dist/chempot-diagram/types.js +0 -28
  359. package/dist/colors/index.d.ts +0 -47
  360. package/dist/colors/index.js +0 -203
  361. package/dist/composition/BarChart.svelte +0 -297
  362. package/dist/composition/BarChart.svelte.d.ts +0 -39
  363. package/dist/composition/BubbleChart.svelte +0 -218
  364. package/dist/composition/BubbleChart.svelte.d.ts +0 -28
  365. package/dist/composition/Composition.svelte +0 -164
  366. package/dist/composition/Composition.svelte.d.ts +0 -15
  367. package/dist/composition/Formula.svelte +0 -265
  368. package/dist/composition/Formula.svelte.d.ts +0 -19
  369. package/dist/composition/FormulaFilter.svelte +0 -1259
  370. package/dist/composition/FormulaFilter.svelte.d.ts +0 -51
  371. package/dist/composition/PieChart.svelte +0 -323
  372. package/dist/composition/PieChart.svelte.d.ts +0 -37
  373. package/dist/composition/format.d.ts +0 -15
  374. package/dist/composition/format.js +0 -109
  375. package/dist/composition/index.d.ts +0 -20
  376. package/dist/composition/index.js +0 -14
  377. package/dist/composition/parse.d.ts +0 -55
  378. package/dist/composition/parse.js +0 -459
  379. package/dist/constants.d.ts +0 -29
  380. package/dist/constants.js +0 -99
  381. package/dist/controls.d.ts +0 -14
  382. package/dist/controls.js +0 -30
  383. package/dist/convex-hull/ConvexHull.svelte +0 -157
  384. package/dist/convex-hull/ConvexHull.svelte.d.ts +0 -13
  385. package/dist/convex-hull/ConvexHull2D.svelte +0 -814
  386. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +0 -11
  387. package/dist/convex-hull/ConvexHull3D.svelte +0 -1790
  388. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +0 -8
  389. package/dist/convex-hull/ConvexHull4D.svelte +0 -1386
  390. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +0 -8
  391. package/dist/convex-hull/ConvexHullControls.svelte +0 -546
  392. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +0 -48
  393. package/dist/convex-hull/ConvexHullInfoPane.svelte +0 -122
  394. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +0 -18
  395. package/dist/convex-hull/ConvexHullStats.svelte +0 -922
  396. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +0 -15
  397. package/dist/convex-hull/ConvexHullTooltip.svelte +0 -131
  398. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +0 -33
  399. package/dist/convex-hull/GasPressureControls.svelte +0 -247
  400. package/dist/convex-hull/GasPressureControls.svelte.d.ts +0 -11
  401. package/dist/convex-hull/StructurePopup.svelte +0 -116
  402. package/dist/convex-hull/StructurePopup.svelte.d.ts +0 -18
  403. package/dist/convex-hull/TemperatureSlider.svelte +0 -137
  404. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +0 -8
  405. package/dist/convex-hull/barycentric-coords.d.ts +0 -18
  406. package/dist/convex-hull/barycentric-coords.js +0 -182
  407. package/dist/convex-hull/demo-temperature.d.ts +0 -6
  408. package/dist/convex-hull/demo-temperature.js +0 -40
  409. package/dist/convex-hull/gas-thermodynamics.d.ts +0 -16
  410. package/dist/convex-hull/gas-thermodynamics.js +0 -316
  411. package/dist/convex-hull/helpers.d.ts +0 -103
  412. package/dist/convex-hull/helpers.js +0 -689
  413. package/dist/convex-hull/index.d.ts +0 -118
  414. package/dist/convex-hull/index.js +0 -57
  415. package/dist/convex-hull/thermodynamics.d.ts +0 -66
  416. package/dist/convex-hull/thermodynamics.js +0 -1752
  417. package/dist/convex-hull/types.d.ts +0 -162
  418. package/dist/convex-hull/types.js +0 -36
  419. package/dist/coordination/CoordinationBarPlot.svelte +0 -311
  420. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +0 -30
  421. package/dist/coordination/calc-coordination.d.ts +0 -15
  422. package/dist/coordination/calc-coordination.js +0 -63
  423. package/dist/coordination/index.d.ts +0 -8
  424. package/dist/coordination/index.js +0 -7
  425. package/dist/element/BohrAtom.svelte +0 -147
  426. package/dist/element/BohrAtom.svelte.d.ts +0 -20
  427. package/dist/element/ElementHeading.svelte +0 -26
  428. package/dist/element/ElementHeading.svelte.d.ts +0 -8
  429. package/dist/element/ElementPhoto.svelte +0 -57
  430. package/dist/element/ElementPhoto.svelte.d.ts +0 -9
  431. package/dist/element/ElementStats.svelte +0 -80
  432. package/dist/element/ElementStats.svelte.d.ts +0 -8
  433. package/dist/element/ElementTile.svelte +0 -484
  434. package/dist/element/ElementTile.svelte.d.ts +0 -29
  435. package/dist/element/Nucleus.svelte.d.ts +0 -17
  436. package/dist/element/data.d.ts +0 -2
  437. package/dist/element/data.js +0 -2
  438. package/dist/element/data.json.gz.d.ts +0 -2
  439. package/dist/element/index.d.ts +0 -8
  440. package/dist/element/index.js +0 -8
  441. package/dist/element/types.d.ts +0 -57
  442. package/dist/element/types.js +0 -1
  443. package/dist/feedback/ClickFeedback.svelte +0 -58
  444. package/dist/feedback/ClickFeedback.svelte.d.ts +0 -12
  445. package/dist/feedback/DragOverlay.svelte +0 -42
  446. package/dist/feedback/DragOverlay.svelte.d.ts +0 -7
  447. package/dist/feedback/Spinner.svelte.d.ts +0 -7
  448. package/dist/feedback/StatusMessage.svelte.d.ts +0 -9
  449. package/dist/feedback/index.d.ts +0 -4
  450. package/dist/feedback/index.js +0 -4
  451. package/dist/fermi-surface/FermiSlice.svelte +0 -189
  452. package/dist/fermi-surface/FermiSlice.svelte.d.ts +0 -24
  453. package/dist/fermi-surface/FermiSurface.svelte +0 -600
  454. package/dist/fermi-surface/FermiSurface.svelte.d.ts +0 -83
  455. package/dist/fermi-surface/FermiSurfaceControls.svelte +0 -452
  456. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +0 -35
  457. package/dist/fermi-surface/FermiSurfaceScene.svelte +0 -792
  458. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +0 -50
  459. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  460. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +0 -8
  461. package/dist/fermi-surface/compute.d.ts +0 -5
  462. package/dist/fermi-surface/compute.js +0 -538
  463. package/dist/fermi-surface/constants.d.ts +0 -9
  464. package/dist/fermi-surface/constants.js +0 -27
  465. package/dist/fermi-surface/export.d.ts +0 -5
  466. package/dist/fermi-surface/export.js +0 -63
  467. package/dist/fermi-surface/index.d.ts +0 -12
  468. package/dist/fermi-surface/index.js +0 -13
  469. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  470. package/dist/fermi-surface/marching-cubes.js +0 -2
  471. package/dist/fermi-surface/parse.d.ts +0 -2
  472. package/dist/fermi-surface/parse.js +0 -495
  473. package/dist/fermi-surface/symmetry.d.ts +0 -3
  474. package/dist/fermi-surface/symmetry.js +0 -46
  475. package/dist/fermi-surface/types.d.ts +0 -113
  476. package/dist/fermi-surface/types.js +0 -4
  477. package/dist/heatmap-matrix/HeatmapMatrix.svelte +0 -1527
  478. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +0 -110
  479. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  480. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +0 -30
  481. package/dist/heatmap-matrix/index.d.ts +0 -53
  482. package/dist/heatmap-matrix/index.js +0 -100
  483. package/dist/heatmap-matrix/shared.d.ts +0 -2
  484. package/dist/heatmap-matrix/shared.js +0 -4
  485. package/dist/icons.d.ts +0 -569
  486. package/dist/icons.js +0 -648
  487. package/dist/index.d.ts +0 -39
  488. package/dist/index.js +0 -39
  489. package/dist/io/decompress.d.ts +0 -10
  490. package/dist/io/decompress.js +0 -74
  491. package/dist/io/export.d.ts +0 -16
  492. package/dist/io/export.js +0 -316
  493. package/dist/io/fetch.d.ts +0 -5
  494. package/dist/io/fetch.js +0 -39
  495. package/dist/io/file-drop.d.ts +0 -7
  496. package/dist/io/file-drop.js +0 -43
  497. package/dist/io/index.d.ts +0 -7
  498. package/dist/io/index.js +0 -7
  499. package/dist/io/is-binary.d.ts +0 -1
  500. package/dist/io/is-binary.js +0 -20
  501. package/dist/io/types.d.ts +0 -8
  502. package/dist/io/types.js +0 -1
  503. package/dist/io/url-drop.d.ts +0 -2
  504. package/dist/io/url-drop.js +0 -117
  505. package/dist/isosurface/Isosurface.svelte +0 -285
  506. package/dist/isosurface/Isosurface.svelte.d.ts +0 -8
  507. package/dist/isosurface/IsosurfaceControls.svelte +0 -291
  508. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +0 -9
  509. package/dist/isosurface/index.d.ts +0 -5
  510. package/dist/isosurface/index.js +0 -6
  511. package/dist/isosurface/parse.d.ts +0 -6
  512. package/dist/isosurface/parse.js +0 -553
  513. package/dist/isosurface/slice.d.ts +0 -11
  514. package/dist/isosurface/slice.js +0 -140
  515. package/dist/isosurface/types.d.ts +0 -56
  516. package/dist/isosurface/types.js +0 -227
  517. package/dist/labels.d.ts +0 -53
  518. package/dist/labels.js +0 -274
  519. package/dist/layout/FullscreenToggle.svelte +0 -50
  520. package/dist/layout/FullscreenToggle.svelte.d.ts +0 -7
  521. package/dist/layout/InfoCard.svelte +0 -120
  522. package/dist/layout/InfoCard.svelte.d.ts +0 -21
  523. package/dist/layout/InfoTag.svelte +0 -183
  524. package/dist/layout/InfoTag.svelte.d.ts +0 -19
  525. package/dist/layout/PropertyFilter.svelte +0 -244
  526. package/dist/layout/PropertyFilter.svelte.d.ts +0 -24
  527. package/dist/layout/SettingsSection.svelte +0 -148
  528. package/dist/layout/SettingsSection.svelte.d.ts +0 -17
  529. package/dist/layout/SubpageGrid.svelte +0 -82
  530. package/dist/layout/SubpageGrid.svelte.d.ts +0 -14
  531. package/dist/layout/fullscreen.d.ts +0 -9
  532. package/dist/layout/fullscreen.js +0 -53
  533. package/dist/layout/index.d.ts +0 -10
  534. package/dist/layout/index.js +0 -8
  535. package/dist/layout/json-tree/JsonNode.svelte +0 -548
  536. package/dist/layout/json-tree/JsonNode.svelte.d.ts +0 -11
  537. package/dist/layout/json-tree/JsonTree.svelte +0 -1222
  538. package/dist/layout/json-tree/JsonTree.svelte.d.ts +0 -6
  539. package/dist/layout/json-tree/JsonValue.svelte +0 -334
  540. package/dist/layout/json-tree/JsonValue.svelte.d.ts +0 -9
  541. package/dist/layout/json-tree/index.d.ts +0 -3
  542. package/dist/layout/json-tree/index.js +0 -3
  543. package/dist/layout/json-tree/types.d.ts +0 -73
  544. package/dist/layout/json-tree/types.js +0 -3
  545. package/dist/layout/json-tree/utils.d.ts +0 -29
  546. package/dist/layout/json-tree/utils.js +0 -649
  547. package/dist/marching-cubes.d.ts +0 -14
  548. package/dist/marching-cubes.js +0 -542
  549. package/dist/math.d.ts +0 -91
  550. package/dist/math.js +0 -896
  551. package/dist/overlays/ContextMenu.svelte +0 -162
  552. package/dist/overlays/ContextMenu.svelte.d.ts +0 -25
  553. package/dist/overlays/CopyButton.svelte +0 -45
  554. package/dist/overlays/CopyButton.svelte.d.ts +0 -8
  555. package/dist/overlays/DraggablePane.svelte +0 -564
  556. package/dist/overlays/DraggablePane.svelte.d.ts +0 -36
  557. package/dist/overlays/InfoPaneCards.svelte +0 -149
  558. package/dist/overlays/InfoPaneCards.svelte.d.ts +0 -22
  559. package/dist/overlays/index.d.ts +0 -2
  560. package/dist/overlays/index.js +0 -2
  561. package/dist/periodic-table/PeriodicTable.svelte +0 -469
  562. package/dist/periodic-table/PeriodicTable.svelte.d.ts +0 -55
  563. package/dist/periodic-table/PeriodicTableControls.svelte +0 -557
  564. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +0 -24
  565. package/dist/periodic-table/PropertySelect.svelte +0 -37
  566. package/dist/periodic-table/PropertySelect.svelte.d.ts +0 -13
  567. package/dist/periodic-table/TableInset.svelte.d.ts +0 -9
  568. package/dist/periodic-table/index.d.ts +0 -10
  569. package/dist/periodic-table/index.js +0 -4
  570. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1084
  571. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +0 -44
  572. package/dist/phase-diagram/PhaseDiagramControls.svelte +0 -449
  573. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +0 -30
  574. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  575. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +0 -15
  576. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +0 -192
  577. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +0 -19
  578. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +0 -392
  579. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +0 -16
  580. package/dist/phase-diagram/TdbInfoPanel.svelte +0 -203
  581. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +0 -12
  582. package/dist/phase-diagram/build-diagram.d.ts +0 -11
  583. package/dist/phase-diagram/build-diagram.js +0 -167
  584. package/dist/phase-diagram/colors.d.ts +0 -35
  585. package/dist/phase-diagram/colors.js +0 -51
  586. package/dist/phase-diagram/diagram-input.d.ts +0 -33
  587. package/dist/phase-diagram/diagram-input.js +0 -3
  588. package/dist/phase-diagram/index.d.ts +0 -13
  589. package/dist/phase-diagram/index.js +0 -13
  590. package/dist/phase-diagram/parse.d.ts +0 -55
  591. package/dist/phase-diagram/parse.js +0 -276
  592. package/dist/phase-diagram/svg-to-diagram.d.ts +0 -2
  593. package/dist/phase-diagram/svg-to-diagram.js +0 -867
  594. package/dist/phase-diagram/types.d.ts +0 -99
  595. package/dist/phase-diagram/types.js +0 -1
  596. package/dist/phase-diagram/utils.d.ts +0 -118
  597. package/dist/phase-diagram/utils.js +0 -606
  598. package/dist/plot/AxisLabel.svelte +0 -51
  599. package/dist/plot/AxisLabel.svelte.d.ts +0 -16
  600. package/dist/plot/BarPlot.svelte +0 -2265
  601. package/dist/plot/BarPlot.svelte.d.ts +0 -83
  602. package/dist/plot/BarPlotControls.svelte +0 -66
  603. package/dist/plot/BarPlotControls.svelte.d.ts +0 -18
  604. package/dist/plot/ColorBar.svelte +0 -719
  605. package/dist/plot/ColorBar.svelte.d.ts +0 -31
  606. package/dist/plot/ColorScaleSelect.svelte +0 -54
  607. package/dist/plot/ColorScaleSelect.svelte.d.ts +0 -15
  608. package/dist/plot/ElementScatter.svelte +0 -63
  609. package/dist/plot/ElementScatter.svelte.d.ts +0 -14
  610. package/dist/plot/FillArea.svelte +0 -225
  611. package/dist/plot/FillArea.svelte.d.ts +0 -21
  612. package/dist/plot/Histogram.svelte +0 -1672
  613. package/dist/plot/Histogram.svelte.d.ts +0 -50
  614. package/dist/plot/HistogramControls.svelte +0 -212
  615. package/dist/plot/HistogramControls.svelte.d.ts +0 -22
  616. package/dist/plot/InteractiveAxisLabel.svelte +0 -94
  617. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +0 -14
  618. package/dist/plot/Line.svelte +0 -84
  619. package/dist/plot/Line.svelte.d.ts +0 -15
  620. package/dist/plot/PlotControls.svelte +0 -537
  621. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  622. package/dist/plot/PlotLegend.svelte +0 -569
  623. package/dist/plot/PlotLegend.svelte.d.ts +0 -29
  624. package/dist/plot/PlotTooltip.svelte +0 -67
  625. package/dist/plot/PlotTooltip.svelte.d.ts +0 -17
  626. package/dist/plot/PortalSelect.svelte +0 -253
  627. package/dist/plot/PortalSelect.svelte.d.ts +0 -16
  628. package/dist/plot/ReferenceLine.svelte.d.ts +0 -20
  629. package/dist/plot/ReferenceLine3D.svelte +0 -154
  630. package/dist/plot/ReferenceLine3D.svelte.d.ts +0 -14
  631. package/dist/plot/ReferencePlane.svelte +0 -178
  632. package/dist/plot/ReferencePlane.svelte.d.ts +0 -14
  633. package/dist/plot/ScatterPlot.svelte +0 -2845
  634. package/dist/plot/ScatterPlot.svelte.d.ts +0 -93
  635. package/dist/plot/ScatterPlot3D.svelte +0 -502
  636. package/dist/plot/ScatterPlot3D.svelte.d.ts +0 -94
  637. package/dist/plot/ScatterPlot3DControls.svelte +0 -437
  638. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +0 -20
  639. package/dist/plot/ScatterPlot3DScene.svelte +0 -912
  640. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +0 -74
  641. package/dist/plot/ScatterPlotControls.svelte +0 -307
  642. package/dist/plot/ScatterPlotControls.svelte.d.ts +0 -17
  643. package/dist/plot/ScatterPoint.svelte +0 -191
  644. package/dist/plot/ScatterPoint.svelte.d.ts +0 -21
  645. package/dist/plot/SpacegroupBarPlot.svelte +0 -293
  646. package/dist/plot/SpacegroupBarPlot.svelte.d.ts +0 -9
  647. package/dist/plot/Surface3D.svelte +0 -200
  648. package/dist/plot/Surface3D.svelte.d.ts +0 -13
  649. package/dist/plot/ZeroLines.svelte +0 -96
  650. package/dist/plot/ZeroLines.svelte.d.ts +0 -32
  651. package/dist/plot/ZoomRect.svelte +0 -23
  652. package/dist/plot/ZoomRect.svelte.d.ts +0 -8
  653. package/dist/plot/axis-utils.d.ts +0 -19
  654. package/dist/plot/axis-utils.js +0 -80
  655. package/dist/plot/data-cleaning.d.ts +0 -37
  656. package/dist/plot/data-cleaning.js +0 -855
  657. package/dist/plot/data-transform.d.ts +0 -16
  658. package/dist/plot/data-transform.js +0 -45
  659. package/dist/plot/defaults.d.ts +0 -19
  660. package/dist/plot/defaults.js +0 -9
  661. package/dist/plot/fill-utils.d.ts +0 -51
  662. package/dist/plot/fill-utils.js +0 -337
  663. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  664. package/dist/plot/hover-lock.svelte.js +0 -46
  665. package/dist/plot/index.d.ts +0 -37
  666. package/dist/plot/index.js +0 -37
  667. package/dist/plot/interactions.d.ts +0 -12
  668. package/dist/plot/interactions.js +0 -100
  669. package/dist/plot/layout.d.ts +0 -60
  670. package/dist/plot/layout.js +0 -230
  671. package/dist/plot/reference-line.d.ts +0 -60
  672. package/dist/plot/reference-line.js +0 -316
  673. package/dist/plot/scales.d.ts +0 -48
  674. package/dist/plot/scales.js +0 -484
  675. package/dist/plot/svg.d.ts +0 -1
  676. package/dist/plot/svg.js +0 -11
  677. package/dist/plot/types.d.ts +0 -859
  678. package/dist/plot/types.js +0 -103
  679. package/dist/plot/utils/label-placement.d.ts +0 -47
  680. package/dist/plot/utils/label-placement.js +0 -256
  681. package/dist/plot/utils/series-visibility.d.ts +0 -9
  682. package/dist/plot/utils/series-visibility.js +0 -67
  683. package/dist/plot/utils.d.ts +0 -1
  684. package/dist/plot/utils.js +0 -14
  685. package/dist/rdf/RdfPlot.svelte +0 -247
  686. package/dist/rdf/RdfPlot.svelte.d.ts +0 -27
  687. package/dist/rdf/calc-rdf.d.ts +0 -4
  688. package/dist/rdf/calc-rdf.js +0 -111
  689. package/dist/rdf/index.d.ts +0 -23
  690. package/dist/rdf/index.js +0 -2
  691. package/dist/sanitize.d.ts +0 -4
  692. package/dist/sanitize.js +0 -114
  693. package/dist/settings.d.ts +0 -255
  694. package/dist/settings.js +0 -1132
  695. package/dist/spectral/Bands.svelte +0 -1040
  696. package/dist/spectral/Bands.svelte.d.ts +0 -40
  697. package/dist/spectral/BandsAndDos.svelte +0 -128
  698. package/dist/spectral/BandsAndDos.svelte.d.ts +0 -18
  699. package/dist/spectral/BrillouinBandsDos.svelte +0 -248
  700. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +0 -20
  701. package/dist/spectral/Dos.svelte +0 -697
  702. package/dist/spectral/Dos.svelte.d.ts +0 -29
  703. package/dist/spectral/helpers.d.ts +0 -117
  704. package/dist/spectral/helpers.js +0 -1023
  705. package/dist/spectral/index.d.ts +0 -6
  706. package/dist/spectral/index.js +0 -7
  707. package/dist/spectral/types.d.ts +0 -84
  708. package/dist/spectral/types.js +0 -2
  709. package/dist/state.svelte.d.ts +0 -25
  710. package/dist/state.svelte.js +0 -45
  711. package/dist/structure/Arrow.svelte +0 -72
  712. package/dist/structure/Arrow.svelte.d.ts +0 -15
  713. package/dist/structure/AtomLegend.svelte +0 -798
  714. package/dist/structure/AtomLegend.svelte.d.ts +0 -34
  715. package/dist/structure/Bond.svelte +0 -140
  716. package/dist/structure/Bond.svelte.d.ts +0 -9
  717. package/dist/structure/CanvasTooltip.svelte +0 -33
  718. package/dist/structure/CanvasTooltip.svelte.d.ts +0 -12
  719. package/dist/structure/CellSelect.svelte +0 -351
  720. package/dist/structure/CellSelect.svelte.d.ts +0 -13
  721. package/dist/structure/Cylinder.svelte +0 -45
  722. package/dist/structure/Cylinder.svelte.d.ts +0 -10
  723. package/dist/structure/Lattice.svelte +0 -196
  724. package/dist/structure/Lattice.svelte.d.ts +0 -17
  725. package/dist/structure/Structure.svelte +0 -1999
  726. package/dist/structure/Structure.svelte.d.ts +0 -87
  727. package/dist/structure/StructureControls.svelte +0 -1298
  728. package/dist/structure/StructureControls.svelte.d.ts +0 -31
  729. package/dist/structure/StructureExportPane.svelte +0 -251
  730. package/dist/structure/StructureExportPane.svelte.d.ts +0 -17
  731. package/dist/structure/StructureInfoPane.svelte +0 -735
  732. package/dist/structure/StructureInfoPane.svelte.d.ts +0 -19
  733. package/dist/structure/StructureScene.svelte +0 -1905
  734. package/dist/structure/StructureScene.svelte.d.ts +0 -108
  735. package/dist/structure/atom-properties.d.ts +0 -37
  736. package/dist/structure/atom-properties.js +0 -200
  737. package/dist/structure/bond-order-perception.d.ts +0 -13
  738. package/dist/structure/bond-order-perception.js +0 -367
  739. package/dist/structure/bonding.d.ts +0 -42
  740. package/dist/structure/bonding.js +0 -525
  741. package/dist/structure/export.d.ts +0 -20
  742. package/dist/structure/export.js +0 -727
  743. package/dist/structure/index.d.ts +0 -125
  744. package/dist/structure/index.js +0 -171
  745. package/dist/structure/label-placement.d.ts +0 -14
  746. package/dist/structure/label-placement.js +0 -72
  747. package/dist/structure/measure.d.ts +0 -6
  748. package/dist/structure/measure.js +0 -29
  749. package/dist/structure/parse.d.ts +0 -66
  750. package/dist/structure/parse.js +0 -1363
  751. package/dist/structure/partial-occupancy.d.ts +0 -25
  752. package/dist/structure/partial-occupancy.js +0 -99
  753. package/dist/structure/pbc.d.ts +0 -9
  754. package/dist/structure/pbc.js +0 -123
  755. package/dist/structure/supercell.d.ts +0 -8
  756. package/dist/structure/supercell.js +0 -170
  757. package/dist/structure/validation.d.ts +0 -2
  758. package/dist/structure/validation.js +0 -10
  759. package/dist/symmetry/SymmetryStats.svelte +0 -226
  760. package/dist/symmetry/SymmetryStats.svelte.d.ts +0 -21
  761. package/dist/symmetry/WyckoffTable.svelte +0 -113
  762. package/dist/symmetry/WyckoffTable.svelte.d.ts +0 -11
  763. package/dist/symmetry/cell-transform.d.ts +0 -12
  764. package/dist/symmetry/cell-transform.js +0 -91
  765. package/dist/symmetry/index.d.ts +0 -43
  766. package/dist/symmetry/index.js +0 -229
  767. package/dist/symmetry/spacegroups.d.ts +0 -9
  768. package/dist/symmetry/spacegroups.js +0 -394
  769. package/dist/table/HeatmapTable.svelte +0 -1854
  770. package/dist/table/HeatmapTable.svelte.d.ts +0 -49
  771. package/dist/table/ToggleMenu.svelte +0 -376
  772. package/dist/table/ToggleMenu.svelte.d.ts +0 -11
  773. package/dist/table/index.d.ts +0 -74
  774. package/dist/table/index.js +0 -38
  775. package/dist/theme/ThemeControl.svelte +0 -53
  776. package/dist/theme/ThemeControl.svelte.d.ts +0 -9
  777. package/dist/theme/index.d.ts +0 -29
  778. package/dist/theme/index.js +0 -79
  779. package/dist/theme/themes.mjs +0 -285
  780. package/dist/time.d.ts +0 -4
  781. package/dist/time.js +0 -70
  782. package/dist/tooltip/TooltipContent.svelte +0 -58
  783. package/dist/tooltip/TooltipContent.svelte.d.ts +0 -31
  784. package/dist/tooltip/index.d.ts +0 -2
  785. package/dist/tooltip/index.js +0 -2
  786. package/dist/tooltip/types.d.ts +0 -8
  787. package/dist/tooltip/types.js +0 -1
  788. package/dist/trajectory/Trajectory.svelte +0 -1517
  789. package/dist/trajectory/Trajectory.svelte.d.ts +0 -77
  790. package/dist/trajectory/TrajectoryError.svelte +0 -128
  791. package/dist/trajectory/TrajectoryError.svelte.d.ts +0 -13
  792. package/dist/trajectory/TrajectoryExportPane.svelte +0 -357
  793. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +0 -17
  794. package/dist/trajectory/TrajectoryInfoPane.svelte +0 -313
  795. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +0 -17
  796. package/dist/trajectory/constants.d.ts +0 -6
  797. package/dist/trajectory/constants.js +0 -7
  798. package/dist/trajectory/extract.d.ts +0 -5
  799. package/dist/trajectory/extract.js +0 -162
  800. package/dist/trajectory/format-detect.d.ts +0 -9
  801. package/dist/trajectory/format-detect.js +0 -76
  802. package/dist/trajectory/frame-reader.d.ts +0 -17
  803. package/dist/trajectory/frame-reader.js +0 -332
  804. package/dist/trajectory/helpers.d.ts +0 -14
  805. package/dist/trajectory/helpers.js +0 -172
  806. package/dist/trajectory/index.d.ts +0 -63
  807. package/dist/trajectory/index.js +0 -126
  808. package/dist/trajectory/parse/ase.d.ts +0 -2
  809. package/dist/trajectory/parse/ase.js +0 -73
  810. package/dist/trajectory/parse/hdf5.d.ts +0 -2
  811. package/dist/trajectory/parse/hdf5.js +0 -127
  812. package/dist/trajectory/parse/index.d.ts +0 -12
  813. package/dist/trajectory/parse/index.js +0 -299
  814. package/dist/trajectory/parse/lammps.d.ts +0 -5
  815. package/dist/trajectory/parse/lammps.js +0 -179
  816. package/dist/trajectory/parse/vasp.d.ts +0 -2
  817. package/dist/trajectory/parse/vasp.js +0 -68
  818. package/dist/trajectory/parse/xyz.d.ts +0 -2
  819. package/dist/trajectory/parse/xyz.js +0 -110
  820. package/dist/trajectory/plotting.d.ts +0 -28
  821. package/dist/trajectory/plotting.js +0 -423
  822. package/dist/trajectory/types.d.ts +0 -11
  823. package/dist/trajectory/types.js +0 -1
  824. package/dist/utils.d.ts +0 -5
  825. package/dist/utils.js +0 -36
  826. package/dist/xrd/XrdPlot.svelte +0 -615
  827. package/dist/xrd/XrdPlot.svelte.d.ts +0 -28
  828. package/dist/xrd/broadening.d.ts +0 -20
  829. package/dist/xrd/broadening.js +0 -97
  830. package/dist/xrd/calc-xrd.d.ts +0 -37
  831. package/dist/xrd/calc-xrd.js +0 -337
  832. package/dist/xrd/index.d.ts +0 -37
  833. package/dist/xrd/index.js +0 -4
  834. package/dist/xrd/parse.d.ts +0 -13
  835. package/dist/xrd/parse.js +0 -749
  836. /package/dist/{EmptyState.svelte → src/lib/EmptyState.svelte} +0 -0
  837. /package/dist/{Icon.svelte → src/lib/Icon.svelte} +0 -0
  838. /package/dist/{app.css → src/lib/app.css} +0 -0
  839. /package/dist/{chempot-diagram → src/lib/chempot-diagram}/ChemPotScene3D.svelte +0 -0
  840. /package/dist/{colors → src/lib/colors}/alloy-colors.json +0 -0
  841. /package/dist/{colors → src/lib/colors}/dark-mode-colors.json +0 -0
  842. /package/dist/{colors → src/lib/colors}/jmol-colors.json +0 -0
  843. /package/dist/{colors → src/lib/colors}/muted-colors.json +0 -0
  844. /package/dist/{colors → src/lib/colors}/pastel-colors.json +0 -0
  845. /package/dist/{colors → src/lib/colors}/vesta-colors.json +0 -0
  846. /package/dist/{element → src/lib/element}/Nucleus.svelte +0 -0
  847. /package/dist/{element → src/lib/element}/data.json +0 -0
  848. /package/dist/{element → src/lib/element}/data.json.gz +0 -0
  849. /package/dist/{element → src/lib/element}/data.schema.json +0 -0
  850. /package/dist/{element-image-urls.json → src/lib/element-image-urls.json} +0 -0
  851. /package/dist/{feedback → src/lib/feedback}/Spinner.svelte +0 -0
  852. /package/dist/{feedback → src/lib/feedback}/StatusMessage.svelte +0 -0
  853. /package/dist/{periodic-table → src/lib/periodic-table}/TableInset.svelte +0 -0
  854. /package/dist/{plot → src/lib/plot}/ReferenceLine.svelte +0 -0
  855. /package/dist/{xrd → src/lib/xrd}/atomic_scattering_params.json +0 -0
@@ -1,1517 +0,0 @@
1
- <script lang="ts">
2
- import type { ShowControlsProp } from '../controls'
3
- import { normalize_show_controls } from '../controls'
4
- import type { ElementSymbol } from '../element'
5
- import EmptyState from '../EmptyState.svelte'
6
- import Spinner from '../feedback/Spinner.svelte'
7
- import Icon from '../Icon.svelte'
8
- import { handle_url_drop, load_from_url } from '../io'
9
- import { format_num, trajectory_property_config } from '../labels'
10
- import { sanitize_html } from '../sanitize'
11
- import { toggle_fullscreen } from '../layout'
12
- import type { ControlsConfig, DataSeries, Orientation, Point } from '../plot'
13
- import { Histogram, ScatterPlot } from '../plot'
14
- import { toggle_series_visibility } from '../plot/utils/series-visibility'
15
- import { DEFAULTS } from '../settings'
16
- import Structure from '../structure/Structure.svelte'
17
- import { scaleLinear } from 'd3-scale'
18
- import type { ComponentProps, Snippet } from 'svelte'
19
- import { untrack } from 'svelte'
20
- import { tooltip } from 'svelte-multiselect/attachments'
21
- import type { HTMLAttributes } from 'svelte/elements'
22
- import { full_data_extractor } from './extract'
23
- import type {
24
- ParseProgress,
25
- TrajectoryDataExtractor,
26
- TrajectoryFrame,
27
- TrajectoryType,
28
- TrajHandlerData,
29
- } from './index'
30
- import { TrajectoryError, TrajectoryExportPane, TrajectoryInfoPane } from './index'
31
- import type { AtomTypeMapping, LoadingOptions } from './parse'
32
- import {
33
- create_frame_loader,
34
- get_unsupported_format_message,
35
- MAX_BIN_FILE_SIZE,
36
- MAX_TEXT_FILE_SIZE,
37
- parse_trajectory_async,
38
- } from './parse'
39
- import {
40
- generate_axis_labels,
41
- generate_plot_series,
42
- generate_streaming_plot_series,
43
- should_hide_plot,
44
- } from './plotting'
45
-
46
- type EventHandlers = {
47
- on_play?: (data: TrajHandlerData) => void
48
- on_pause?: (data: TrajHandlerData) => void
49
- on_step_change?: (data: TrajHandlerData) => void
50
- on_end?: (data: TrajHandlerData) => void
51
- on_loop?: (data: TrajHandlerData) => void
52
- on_frame_rate_change?: (data: TrajHandlerData) => void
53
- on_display_mode_change?: (data: TrajHandlerData) => void
54
- on_fullscreen_change?: (data: TrajHandlerData) => void
55
- on_file_load?: (data: TrajHandlerData) => void
56
- on_error?: (data: TrajHandlerData) => void
57
- }
58
- type ControlsProps = {
59
- trajectory: TrajectoryType
60
- current_step_idx: number
61
- total_frames: number
62
- on_step_change: (idx: number) => void
63
- }
64
-
65
- let {
66
- trajectory = $bindable(),
67
- data_url,
68
- current_step_idx = $bindable(0),
69
- data_extractor = full_data_extractor,
70
- allow_file_drop = true,
71
- layout = `auto`,
72
- structure_props = {},
73
- scatter_props = {},
74
- histogram_props = {},
75
- spinner_props = {},
76
- trajectory_controls,
77
- error_snippet,
78
- show_controls,
79
- fullscreen_toggle = DEFAULTS.trajectory.fullscreen_toggle,
80
- auto_play = false,
81
- display_mode = $bindable(`structure+scatter`),
82
- step_labels = 5,
83
- visible_properties = $bindable(),
84
- ELEM_PROPERTY_LABELS,
85
- on_play,
86
- on_pause,
87
- on_step_change,
88
- on_end,
89
- on_loop,
90
- on_frame_rate_change,
91
- on_display_mode_change,
92
- on_fullscreen_change,
93
- on_file_load,
94
- on_error,
95
- fps_range = DEFAULTS.trajectory.fps_range,
96
- fps = $bindable(5),
97
- loading_options = {},
98
- atom_type_mapping,
99
- plot_skimming = true,
100
- ...rest
101
- }: EventHandlers & HTMLAttributes<HTMLDivElement> & {
102
- // trajectory data - can be provided directly or loaded from file
103
- trajectory?: TrajectoryType
104
- // URL to load trajectory from (alternative to providing trajectory directly)
105
- data_url?: string
106
- // current step index being displayed
107
- current_step_idx?: number
108
- // custom function to extract plot data from trajectory frames
109
- data_extractor?: TrajectoryDataExtractor
110
-
111
- // file drop handlers
112
- allow_file_drop?: boolean
113
- // layout configuration - 'auto' (default) adapts to element size, 'horizontal'/'vertical' forces layout
114
- layout?: `auto` | Orientation
115
- // structure viewer props (passed to Structure component)
116
- structure_props?: ComponentProps<typeof Structure>
117
- // plot props (passed to ScatterPlot component)
118
- scatter_props?: ComponentProps<typeof ScatterPlot>
119
- // histogram props (passed to Histogram component, excluding series which is handled separately)
120
- histogram_props?: Omit<ComponentProps<typeof Histogram>, `series`>
121
- // spinner props (passed to Spinner component)
122
- spinner_props?: ComponentProps<typeof Spinner>
123
- // custom snippets for additional UI elements
124
- trajectory_controls?: Snippet<[ControlsProps]>
125
- // Custom error snippet for advanced error handling
126
- error_snippet?: Snippet<[{ error_msg: string; on_dismiss: () => void }]>
127
- // Controls visibility configuration.
128
- // - 'always': controls always visible
129
- // - 'hover': controls visible on component hover (default)
130
- // - 'never': controls never visible
131
- // - object: { mode, hidden, style } for fine-grained control
132
- // Control names: 'filename', 'nav', 'step', 'fps', 'info-pane', 'export-pane', 'view-mode', 'fullscreen'
133
- show_controls?: ShowControlsProp
134
- // show/hide the fullscreen button
135
- fullscreen_toggle?: Snippet<[{ fullscreen: boolean }]> | boolean
136
- // automatically start playing when trajectory data is loaded
137
- auto_play?: boolean
138
- // display mode: 'structure+scatter' (default), 'structure' (only structure), 'scatter' (only scatter), 'histogram' (only histogram), 'structure+histogram' (structure with histogram)
139
- display_mode?:
140
- | `structure+scatter`
141
- | `structure`
142
- | `scatter`
143
- | `histogram`
144
- | `structure+histogram`
145
- // step labels configuration for slider
146
- // - positive number: number of evenly spaced ticks
147
- // - negative number: spacing between ticks (e.g. -10 = every 10th step)
148
- // - array: exact step indices to label
149
- // - undefined: no labels
150
- step_labels?: number | number[]
151
- // visible properties - bindable array of property keys currently shown in the plot
152
- // - controls which trajectory properties are plotted (e.g. ['energy', 'volume', 'force_max'])
153
- // - bindable: reflects current visibility state and can be used for external control
154
- // - if not provided, uses default visible properties (energy, force_max, stress_frobenius)
155
- // - if specified properties don't exist in data, falls back to automatic selection
156
- visible_properties?: string[]
157
- // custom labels for trajectory properties - maps property keys to display labels
158
- // - e.g. {energy: 'Total Energy', volume: 'Cell Volume', force_max: 'Max Force'}
159
- // - merged with built-in trajectory_property_config
160
- ELEM_PROPERTY_LABELS?: Record<string, string>
161
- // units configuration - developers can override these (deprecated - use ELEM_PROPERTY_LABELS instead)
162
- units?: {
163
- energy?: string
164
- energy_per_atom?: string
165
- force_max?: string
166
- force_norm?: string
167
- stress_max?: string
168
- volume?: string
169
- density?: string
170
- temperature?: string
171
- pressure?: string
172
- length?: string
173
- a?: string
174
- b?: string
175
- c?: string
176
- [key: string]: string | undefined
177
- }
178
- fps_range?: [number, number] // allowed FPS range [min_fps, max_fps]
179
- fps?: number // frame rate for playback
180
- // Loading options for large files
181
- loading_options?: LoadingOptions
182
- // Map LAMMPS atom types to element symbols (e.g. {1: 'Na', 2: 'Cl'})
183
- atom_type_mapping?: AtomTypeMapping
184
- // Disable plot skimming (mouse over plot doesn't update structure/step slider)
185
- plot_skimming?: boolean
186
- } = $props()
187
-
188
- let dragover = $state(false)
189
- let loading = $state(false)
190
- let error_msg = $state<string | null>(null)
191
- let is_playing = $state(false)
192
- let play_interval: ReturnType<typeof setInterval> | undefined = $state(undefined)
193
-
194
- // Ensure fps is within the allowed range
195
- $effect(() => {
196
- if (fps < fps_range[0]) {
197
- fps = fps_range[0]
198
- } else if (fps > fps_range[1]) {
199
- fps = fps_range[1]
200
- }
201
- })
202
- let current_filename = $state<string | undefined>(undefined)
203
- let current_file_path = $state<string | null>(null)
204
- let file_size = $state<number | undefined>(undefined)
205
- let file_object = $state<File | null>(null)
206
- let wrapper = $state<HTMLDivElement | undefined>(undefined)
207
- let info_pane_open = $state(false)
208
- let parsing_progress = $state<ParseProgress | null>(null)
209
- let element_size = $state({ width: 0, height: 0 })
210
- let filename_copied = $state(false)
211
- let orig_data = $state<string | ArrayBuffer | null>(null)
212
-
213
- let controls_config = $derived(normalize_show_controls(show_controls))
214
-
215
- // Reactive layout based on element aspect ratio (for auto mode)
216
- let actual_layout = $derived.by(() => {
217
- if (layout === `horizontal` || layout === `vertical`) return layout
218
- // For auto layout, use element dimensions to determine orientation
219
- if (element_size.width > 0 && element_size.height > 0) {
220
- return element_size.width > element_size.height ? `horizontal` : `vertical`
221
- }
222
- return `horizontal` // Fallback to horizontal if dimensions not available yet
223
- })
224
-
225
- // Get total frame count (supports both regular and indexed trajectories)
226
- let total_frames = $derived(
227
- trajectory?.total_frames || trajectory?.frames.length || 0,
228
- )
229
-
230
- // Current frame - load on demand for indexed trajectories
231
- let current_frame = $state<TrajectoryFrame | null>(null)
232
-
233
- // Auto-play when trajectory changes (handles both props and file loading)
234
- $effect(() => {
235
- if (auto_play && trajectory && !untrack(() => is_playing) && total_frames > 1) {
236
- start_playback()
237
- }
238
- })
239
-
240
- // Update current frame when step changes
241
- $effect(() => {
242
- if (trajectory && current_step_idx >= 0 && current_step_idx < total_frames) {
243
- if (trajectory.frame_loader) {
244
- // Load frame on demand (works for both indexed files and external streaming)
245
- load_frame_on_demand(current_step_idx)
246
- } else {
247
- // Use in-memory frame for regular trajectories
248
- current_frame = trajectory.frames[current_step_idx] || null
249
- }
250
- } else {
251
- current_frame = null
252
- }
253
- })
254
-
255
- // Load frame on demand - works for both indexed files and external streaming
256
- async function load_frame_on_demand(frame_idx: number) {
257
- if (!trajectory?.frame_loader) return
258
-
259
- try {
260
- const frame = await trajectory.frame_loader.load_frame(
261
- orig_data || ``, // Use original_data for indexed files, empty string for external streaming
262
- frame_idx,
263
- )
264
- current_frame = frame
265
- } catch (error) {
266
- console.error(`Failed to load frame ${frame_idx}:`, error)
267
- current_frame = null
268
- on_error?.({
269
- error_msg: `Failed to load frame ${frame_idx}: ${error}`,
270
- filename: current_filename,
271
- file_size,
272
- step_idx: frame_idx,
273
- frame_count: total_frames,
274
- })
275
- }
276
- }
277
-
278
- // Current frame structure for display
279
- let current_structure = $derived(current_frame?.structure)
280
-
281
- // Track hidden elements (persists across frame changes)
282
- let hidden_elements = $state(new Set<ElementSymbol>())
283
-
284
- let step_label_positions = $derived.by((): number[] => {
285
- if (!step_labels || total_frames <= 1) return []
286
-
287
- if (Array.isArray(step_labels)) {
288
- return step_labels.filter((idx) => idx >= 0 && idx < total_frames)
289
- }
290
-
291
- if (typeof step_labels === `number`) {
292
- if (step_labels > 0) {
293
- return scaleLinear().domain([0, total_frames - 1]).nice()
294
- .ticks(Math.min(step_labels, total_frames))
295
- .map((t) => Math.round(t))
296
- .filter((t, i, arr) => t >= 0 && t < total_frames && arr.indexOf(t) === i)
297
- }
298
- if (step_labels < 0) {
299
- const spacing = Math.abs(step_labels)
300
- const positions = Array.from(
301
- { length: Math.ceil(total_frames / spacing) },
302
- (_, idx) => idx * spacing,
303
- )
304
- return positions.at(-1) === total_frames - 1
305
- ? positions
306
- : [...positions, total_frames - 1]
307
- }
308
- }
309
- return []
310
- })
311
-
312
- // Build extended property config with custom labels if provided
313
- let extended_config = $derived.by(() => {
314
- if (!ELEM_PROPERTY_LABELS) return trajectory_property_config
315
-
316
- const custom_config: Record<string, { label: string; unit: string }> = {}
317
- for (const [key, label] of Object.entries(ELEM_PROPERTY_LABELS)) {
318
- const existing = trajectory_property_config[key] ||
319
- trajectory_property_config[key.toLowerCase()]
320
- custom_config[key] = { label, unit: existing?.unit || `` }
321
- }
322
- return { ...trajectory_property_config, ...custom_config }
323
- })
324
-
325
- // Plot series state (not derived so we can update on legend toggle)
326
- let plot_series = $state<DataSeries[]>([])
327
- // Prevent circular updates when syncing legend toggles back to bindable visible_properties.
328
- let syncing_visible_properties = false
329
-
330
- // Regenerate plot series when trajectory, config, or visible_properties change
331
- $effect(() => {
332
- if (syncing_visible_properties) return
333
- const keys_set = visible_properties ? new Set(visible_properties) : undefined
334
-
335
- if (trajectory?.plot_metadata) {
336
- plot_series = generate_streaming_plot_series(trajectory.plot_metadata, {
337
- property_config: extended_config,
338
- default_visible_properties: keys_set,
339
- })
340
- } else if (trajectory) {
341
- plot_series = generate_plot_series(trajectory, data_extractor, {
342
- property_config: extended_config,
343
- default_visible_properties: keys_set,
344
- })
345
- } else {
346
- plot_series = []
347
- }
348
- })
349
-
350
- // Update visible_properties binding when user toggles series visibility in legend
351
- $effect(() => {
352
- if (!plot_series.length) return
353
-
354
- // Extract property keys from visible series metadata
355
- const visible_keys = plot_series.flatMap((srs) => {
356
- if (!srs.visible) return []
357
- const metadata = Array.isArray(srs.metadata) ? srs.metadata[0] : srs.metadata
358
- const key = metadata?.property_key
359
- return key ? [key as string] : []
360
- })
361
-
362
- // Only update if changed (use untrack to avoid circular dependency)
363
- const current = untrack(() => visible_properties) || []
364
- const has_changed = visible_keys.length !== current.length ||
365
- !visible_keys.every((key, idx) => key === current[idx])
366
-
367
- if (has_changed) {
368
- syncing_visible_properties = true
369
- visible_properties = visible_keys
370
- queueMicrotask(() => (syncing_visible_properties = false))
371
- }
372
- })
373
-
374
- // Handler for legend toggle - updates plot_series state
375
- function handle_legend_toggle(series_idx: number) {
376
- plot_series = toggle_series_visibility(plot_series, series_idx)
377
- }
378
-
379
- let x_axis = $derived({
380
- label: `Step`,
381
- format: `.3~s`,
382
- ticks: step_label_positions,
383
- })
384
- // Generate axis labels based on first visible series on each axis
385
- let y_axis_labels = $derived(generate_axis_labels(plot_series))
386
- let y_axis = $derived({
387
- label: y_axis_labels.y1,
388
- format: `.2~s`,
389
- label_shift: { y: 10 },
390
- })
391
- let y2_axis = $derived({
392
- label: y_axis_labels.y2,
393
- format: `.2~s`,
394
- label_shift: { y: 80 },
395
- })
396
-
397
- // hide plot if all plotted values are constant (no variation)
398
- let show_plot = $derived(
399
- display_mode !== `structure` && !should_hide_plot(trajectory, plot_series),
400
- )
401
-
402
- // Determine what to show based on display mode
403
- let show_structure = $derived(![`scatter`, `histogram`].includes(display_mode))
404
- let actual_show_plot = $derived(display_mode !== `structure` && show_plot)
405
-
406
- // Check if there are any Y2 series to determine padding
407
- let has_y2_series = $derived(
408
- plot_series.some((srs) => srs.y_axis === `y2` && srs.visible),
409
- )
410
-
411
- // Step navigation functions
412
- function next_step() {
413
- if (current_step_idx < total_frames - 1) {
414
- current_step_idx++
415
- // Streaming frame loading handled by reactive effect
416
- if (trajectory) {
417
- on_step_change?.({
418
- trajectory,
419
- step_idx: current_step_idx,
420
- frame_count: total_frames,
421
- frame: current_frame || undefined,
422
- })
423
- }
424
- }
425
- }
426
-
427
- function prev_step() {
428
- if (current_step_idx > 0) {
429
- current_step_idx--
430
- // Streaming frame loading handled by reactive effect
431
- if (trajectory) {
432
- on_step_change?.({
433
- trajectory,
434
- step_idx: current_step_idx,
435
- frame_count: total_frames,
436
- frame: current_frame || undefined,
437
- })
438
- }
439
- }
440
- }
441
-
442
- function go_to_step(idx: number) {
443
- if (idx >= 0 && idx < total_frames) {
444
- current_step_idx = idx
445
- // Note: streaming frame loading is handled by reactive effect
446
- // Handle callbacks for both traditional and streaming modes
447
- if (trajectory) {
448
- on_step_change?.({
449
- trajectory,
450
- step_idx: current_step_idx,
451
- frame_count: total_frames,
452
- frame: current_frame || undefined,
453
- })
454
- }
455
- }
456
- }
457
-
458
- // Handle plot point clicks to jump to that step
459
- function handle_plot_change(data: (Point & { series: DataSeries }) | null) {
460
- if (data?.x !== undefined && typeof data.x === `number`) {
461
- go_to_step(Math.round(data.x))
462
- }
463
- }
464
-
465
- // Helper function to read file content
466
- async function read_file_content(file: File): Promise<string | ArrayBuffer> {
467
- return new Promise((resolve, reject) => {
468
- const reader = new FileReader()
469
- reader.addEventListener(`load`, () => resolve(reader.result as string | ArrayBuffer))
470
- reader.addEventListener(`error`, () => reject(new Error(`Failed to read file`)))
471
-
472
- // Read as text for text-based formats, binary for others
473
- if (file.name.toLowerCase().match(/\.(xyz|json|extxyz|lammpstrj)$/)) {
474
- reader.readAsText(file)
475
- } else reader.readAsArrayBuffer(file)
476
- })
477
- }
478
-
479
- // Play/pause functionality
480
- function toggle_play() {
481
- if (is_playing) pause_playback()
482
- else start_playback()
483
- }
484
- function start_playback() {
485
- if (total_frames <= 1) return
486
- is_playing = true
487
- if (trajectory) {
488
- on_play?.({ trajectory, step_idx: current_step_idx, frame_count: total_frames })
489
- }
490
- }
491
- function pause_playback() {
492
- is_playing = false
493
- if (trajectory) {
494
- on_pause?.({
495
- trajectory: trajectory,
496
- step_idx: current_step_idx,
497
- frame_count: total_frames,
498
- })
499
- }
500
- }
501
- $effect(() => { // Effect to manage playback interval
502
- // Only watch is_playing and frame_rate_ms, not play_interval itself
503
- const playing = is_playing
504
- const rate_ms = 1000 / fps
505
-
506
- if (playing) {
507
- // Clear existing interval if it exists - use untrack to avoid circular dependency
508
- const current_interval = untrack(() => play_interval)
509
- if (current_interval !== undefined) clearInterval(current_interval)
510
-
511
- // Create new interval with current frame rate
512
- play_interval = setInterval(() => {
513
- if (current_step_idx >= total_frames - 1) {
514
- if (trajectory) {
515
- on_end?.({
516
- trajectory,
517
- step_idx: current_step_idx,
518
- frame_count: total_frames,
519
- frame: current_frame || undefined,
520
- })
521
- }
522
- go_to_step(0) // Loop back to 1st step
523
- if (trajectory) {
524
- on_loop?.({ trajectory, frame_count: total_frames })
525
- }
526
- } else next_step()
527
- }, rate_ms)
528
- } else {
529
- // Clear interval when not playing - use untrack to avoid circular dependency
530
- const current_interval = untrack(() => play_interval)
531
- if (current_interval !== undefined) {
532
- clearInterval(current_interval)
533
- play_interval = undefined
534
- }
535
- }
536
- })
537
-
538
- // Cleanup interval on component destroy
539
- $effect(() => () => {
540
- if (play_interval !== undefined) clearInterval(play_interval)
541
- })
542
-
543
- // Handle internal file format drops
544
- async function handle_internal_file_drop(internal_data: string): Promise<boolean> {
545
- try {
546
- const file_info = JSON.parse(internal_data)
547
-
548
- // Check if this is a binary file
549
- if (file_info.is_binary) {
550
- if (file_info.content instanceof ArrayBuffer) {
551
- await load_trajectory_data(file_info.content, file_info.name)
552
- } else if (file_info.content_url) {
553
- const response = await fetch(file_info.content_url)
554
- const array_buffer = await response.arrayBuffer()
555
- await load_trajectory_data(array_buffer, file_info.name)
556
- } else {
557
- console.warn(
558
- `Binary file without ArrayBuffer or blob URL:`,
559
- file_info.name,
560
- )
561
- }
562
- } else {
563
- await load_trajectory_data(file_info.content, file_info.name)
564
- }
565
- return true
566
- } catch (error) {
567
- console.warn(`Failed to parse internal file data:`, error)
568
- return false
569
- }
570
- }
571
-
572
- // Handle file drop events with optimized large file support
573
- async function handle_file_drop(event: DragEvent) {
574
- event.preventDefault()
575
- dragover = false
576
- if (!allow_file_drop) return
577
-
578
- loading = true
579
-
580
- try {
581
- // Check for our custom internal file format first
582
- const internal_data = event.dataTransfer?.getData(
583
- `application/x-matterviz-file`,
584
- )
585
- if (internal_data) {
586
- const handled = await handle_internal_file_drop(internal_data)
587
- if (handled) return
588
- }
589
-
590
- // Handle URL-based files (e.g. from FilePicker)
591
- const handled = await handle_url_drop(event, async (content, filename) => {
592
- current_filename = filename
593
- file_size = content instanceof ArrayBuffer
594
- ? content.byteLength
595
- : new Blob([content]).size
596
- await load_trajectory_data(content, filename)
597
- }).catch(() => false)
598
-
599
- if (handled) {
600
- return
601
- }
602
-
603
- // Handle file system drops with optimized large file support
604
- const file = event.dataTransfer?.files[0]
605
- if (file) {
606
- file_size = file.size
607
- current_file_path = file.webkitRelativePath || file.name
608
- file_object = file
609
-
610
- // Read file content directly
611
- const content = await read_file_content(file)
612
- await load_trajectory_data(content, file.name)
613
- }
614
-
615
- // Check for plain text data (fallback)
616
- const text_data = event.dataTransfer?.getData(`text/plain`)
617
- if (text_data) {
618
- file_size = new Blob([text_data]).size // Calculate byte size of text data
619
- await load_trajectory_data(text_data, `trajectory.json`)
620
- return
621
- }
622
- } catch (error) {
623
- console.error(`File drop failed:`, error)
624
- error_msg = `Failed to load file: ${error}`
625
- on_error?.({ error_msg, filename: current_filename, file_size })
626
- } finally {
627
- loading = false
628
- }
629
- }
630
-
631
- $effect(() => { // Load trajectory from URL when data_url is provided
632
- if (data_url && !trajectory) {
633
- loading = true
634
- error_msg = null
635
-
636
- load_from_url(data_url, async (content, filename) => {
637
- current_filename = filename
638
- file_size = content instanceof ArrayBuffer
639
- ? content.byteLength
640
- : new Blob([content]).size
641
- await load_trajectory_data(content, filename)
642
- })
643
- .then(() => {
644
- loading = false
645
- })
646
- .catch((err: Error) => {
647
- console.error(`Failed to load trajectory from URL:`, err)
648
- error_msg = `Failed to load trajectory: ${err.message}`
649
- current_filename = undefined
650
- file_size = undefined
651
- loading = false
652
- on_error?.({
653
- error_msg,
654
- filename: current_filename || undefined,
655
- file_size: file_size || undefined,
656
- })
657
- })
658
- }
659
- })
660
-
661
- // Watch for frame rate changes
662
- $effect(() => {
663
- on_frame_rate_change?.({ trajectory, fps: fps })
664
- })
665
-
666
- async function load_trajectory_data(data: string | ArrayBuffer, filename: string) {
667
- loading = true
668
- error_msg = null
669
- parsing_progress = null
670
-
671
- // Reset previous loading state
672
- orig_data = null
673
-
674
- try {
675
- const data_size = data instanceof ArrayBuffer ? data.byteLength : data.length
676
-
677
- // Determine loading strategy based on file size
678
- const bin_file_threshold = loading_options.bin_file_threshold ??
679
- MAX_BIN_FILE_SIZE
680
- const text_file_threshold = loading_options.text_file_threshold ??
681
- MAX_TEXT_FILE_SIZE
682
- if (
683
- (data instanceof ArrayBuffer && data_size > bin_file_threshold) ||
684
- (typeof data === `string` && data_size > text_file_threshold)
685
- ) { // Large files: Use indexed loading
686
- await load_with_indexing(data, filename)
687
- } else {
688
- // Small files: Use regular loading
689
- const merged_options = { ...loading_options, atom_type_mapping }
690
- trajectory = await parse_trajectory_async(data, filename, (progress) => {
691
- parsing_progress = progress
692
- }, merged_options)
693
- }
694
-
695
- current_step_idx = 0
696
- current_filename = filename
697
-
698
- const file_size_bytes = data instanceof ArrayBuffer
699
- ? data.byteLength
700
- : new Blob([data]).size
701
- on_file_load?.({ // emit file load event
702
- trajectory,
703
- frame_count: trajectory?.frames.length ?? 0,
704
- total_atoms: trajectory?.frames[0]?.structure.sites.length ?? 0,
705
- filename,
706
- file_size: file_size_bytes,
707
- })
708
- } catch (err) {
709
- const unsupported_message = get_unsupported_format_message(
710
- filename,
711
- typeof data === `string` ? data : ``,
712
- )
713
- error_msg = unsupported_message || `Failed to parse trajectory: ${err}`
714
- current_filename = undefined
715
- file_size = undefined
716
-
717
- on_error?.({ // emit error event
718
- error_msg,
719
- filename: current_filename || undefined,
720
- file_size: file_size || undefined,
721
- })
722
- } finally {
723
- parsing_progress = null
724
- loading = false
725
- }
726
- }
727
-
728
- // Load using indexed parsing for large files
729
- async function load_with_indexing(data: string | ArrayBuffer, filename: string) {
730
- try { // Use indexed parsing for efficient large file handling
731
- const merged_options = {
732
- use_indexing: true,
733
- ...loading_options,
734
- atom_type_mapping,
735
- }
736
- trajectory = await parse_trajectory_async(data, filename, (progress) => {
737
- parsing_progress = progress
738
- }, merged_options)
739
-
740
- // Attach frame loader and original data directly to trajectory for unified access
741
- orig_data = data
742
- trajectory.frame_loader = create_frame_loader(filename)
743
- } catch (error) {
744
- console.error(`Indexed loading failed:`, error)
745
- throw error
746
- }
747
- }
748
-
749
- // Get current view mode label
750
- let current_view_label = $derived.by(() => {
751
- if (display_mode === `structure`) return `Structure Only`
752
- if (display_mode === `scatter`) return `Scatter Only`
753
- if (display_mode === `histogram`) return `Histogram Only`
754
- if (display_mode === `structure+histogram`) return `Structure + Histogram`
755
- if (display_mode === `structure+scatter`) return `Structure + Scatter`
756
- throw new Error(`Unexpected display mode: ${display_mode}`)
757
- })
758
-
759
- let view_mode_dropdown_open = $state(false)
760
-
761
- // Handle click outside to close dropdowns
762
- function handle_click_outside(event: MouseEvent) {
763
- const target = event.target as Element
764
- if (view_mode_dropdown_open) {
765
- const dropdown_wrapper = target.closest(`.view-mode-dropdown-wrapper`)
766
- // Don't close if clicking on dropdown wrapper (contains both button and menu)
767
- if (!dropdown_wrapper) view_mode_dropdown_open = false
768
- }
769
- }
770
-
771
- // Handle keyboard shortcuts
772
- function onkeydown(event: KeyboardEvent) {
773
- if (!trajectory) return
774
-
775
- // Don't handle shortcuts if user is typing in an input field (but allow if it's our step input and not focused)
776
- const target = event.target as HTMLElement
777
- const is_step_input = target.classList.contains(`step-input`)
778
- const is_input_focused = target.tagName === `INPUT` ||
779
- target.tagName === `TEXTAREA`
780
-
781
- // Skip if typing in an input that's not our step input
782
- if (is_input_focused && !is_step_input) return
783
-
784
- // If typing in step input, only handle certain navigation keys
785
- if (is_step_input && is_input_focused) {
786
- // Allow normal typing, but handle special navigation keys
787
- if ([`Escape`, `Enter`].includes(event.key)) target.blur() // Remove focus from input
788
- return
789
- }
790
-
791
- const is_cmd_or_ctrl = event.metaKey || event.ctrlKey
792
-
793
- // Navigation shortcuts
794
- if (event.key === ` `) toggle_play()
795
- else if (event.key === `ArrowLeft`) {
796
- if (is_cmd_or_ctrl) go_to_step(0)
797
- else prev_step()
798
- } else if (event.key === `ArrowRight`) {
799
- if (is_cmd_or_ctrl) go_to_step(total_frames - 1)
800
- else next_step()
801
- } else if (event.key === `Home`) go_to_step(0)
802
- else if (event.key === `End`) go_to_step(total_frames - 1)
803
- else if (event.key === `j`) {
804
- go_to_step(Math.max(0, current_step_idx - 10))
805
- } else if (event.key === `l`) {
806
- go_to_step(Math.min(total_frames - 1, current_step_idx + 10))
807
- } else if (event.key === `PageUp`) {
808
- go_to_step(Math.max(0, current_step_idx - 25))
809
- } else if (event.key === `PageDown`) {
810
- go_to_step(Math.min(total_frames - 1, current_step_idx + 25))
811
- } // Interface shortcuts
812
- else if (event.key === `f` && fullscreen_toggle) toggle_fullscreen(wrapper)
813
- // 'i' key handled by the TrajectoryInfoPane's built-in toggle
814
- // Playback speed shortcuts (only when playing)
815
- else if ((event.key === `=` || event.key === `+`) && is_playing) {
816
- fps = Math.min(fps_range[1], fps + 0.2)
817
- on_frame_rate_change?.({ trajectory, fps: fps })
818
- } else if (event.key === `-` && is_playing) {
819
- fps = Math.max(fps_range[0], fps - 0.2)
820
- on_frame_rate_change?.({ trajectory, fps: fps })
821
- } // System shortcuts
822
- else if (event.key === `Escape`) {
823
- if (document.fullscreenElement) document.exitFullscreen()
824
- else if (view_mode_dropdown_open) view_mode_dropdown_open = false
825
- // Escape key for info pane handled by DraggablePane
826
- } // Number keys 0-9 - jump to percentage of trajectory
827
- else if (event.key >= `0` && event.key <= `9`) {
828
- go_to_step(Math.floor((parseInt(event.key, 10) / 10) * (total_frames - 1)))
829
- }
830
- }
831
-
832
- // Separate state variables for each pane to match component prop types
833
- let structure_info_open = $state(false)
834
- let structure_controls_open = $state(false)
835
- let scatter_controls = $state<ControlsConfig>({ open: false })
836
- let trajectory_export_open = $state(false)
837
- let fullscreen = $state(false)
838
- </script>
839
-
840
- <svelte:document
841
- onfullscreenchange={() => {
842
- fullscreen = !!document.fullscreenElement
843
- on_fullscreen_change?.({ trajectory, fullscreen })
844
- }}
845
- />
846
-
847
- <div
848
- class:dragover
849
- class:active={is_playing || structure_info_open || structure_controls_open ||
850
- scatter_controls.open || trajectory_export_open || info_pane_open}
851
- bind:this={wrapper}
852
- bind:clientWidth={element_size.width}
853
- bind:clientHeight={element_size.height}
854
- role="button"
855
- tabindex="0"
856
- aria-label="Drop trajectory file here to load"
857
- ondrop={handle_file_drop}
858
- ondragover={(event) => {
859
- event.preventDefault()
860
- if (!allow_file_drop) return
861
- dragover = true
862
- }}
863
- ondragleave={(event) => {
864
- event.preventDefault()
865
- dragover = false
866
- }}
867
- onclick={handle_click_outside}
868
- {onkeydown}
869
- {...rest}
870
- class="trajectory {actual_layout} {rest.class ?? ``}"
871
- class:show-both-views={[`structure+scatter`, `structure+histogram`].includes(display_mode) &&
872
- actual_show_plot && show_structure}
873
- >
874
- {#if loading}
875
- {@const text = parsing_progress
876
- ? `${parsing_progress.stage} (${parsing_progress.current}%)`
877
- : `Loading trajectory...`}
878
- <Spinner
879
- {text}
880
- style="flex: 1; display: flex; align-items: center; justify-content: center"
881
- {...spinner_props}
882
- />
883
- {:else if error_msg}
884
- <TrajectoryError
885
- {error_msg}
886
- on_dismiss={() => (error_msg = null)}
887
- {error_snippet}
888
- />
889
- {:else if trajectory}
890
- <!-- Trajectory Controls -->
891
- {#if controls_config.mode !== `never`}
892
- <div
893
- class="trajectory-controls {controls_config.class}"
894
- style={controls_config.style}
895
- >
896
- {#if trajectory_controls}
897
- {@render trajectory_controls({
898
- trajectory,
899
- current_step_idx,
900
- total_frames: total_frames,
901
- on_step_change: go_to_step,
902
- })}
903
- {:else}
904
- {#if current_filename && controls_config.visible(`filename`)}
905
- <button
906
- class="filename"
907
- title="Click to copy filename <code>{current_filename}</code>"
908
- {@attach tooltip()}
909
- onclick={() => {
910
- if (current_filename) {
911
- navigator.clipboard.writeText(current_filename)
912
- filename_copied = true
913
- setTimeout(() => filename_copied = false, 1000)
914
- }
915
- }}
916
- >
917
- {current_filename}
918
- {#if filename_copied}
919
- <Icon
920
- icon="Check"
921
- style="color: var(--success-color); position: absolute; right: 3pt; top: 50%; transform: translateY(-50%); font-size: 16px; animation: fade-in 0.1s; background: var(--surface-bg-hover); border-radius: 50%"
922
- />
923
- {/if}
924
- </button>
925
- {/if}
926
-
927
- <!-- Navigation controls -->
928
- {#if controls_config.visible(`nav`)}
929
- <div class="nav-section">
930
- <button
931
- onclick={prev_step}
932
- disabled={current_step_idx === 0 || is_playing}
933
- title="Previous step"
934
- >
935
-
936
- </button>
937
- <button
938
- onclick={toggle_play}
939
- disabled={total_frames <= 1}
940
- title={is_playing ? `Pause playback` : `Play trajectory`}
941
- class="play-button"
942
- class:playing={is_playing}
943
- >
944
- {is_playing ? `⏸` : `▶`}
945
- </button>
946
- <button
947
- onclick={next_step}
948
- disabled={current_step_idx === total_frames - 1 || is_playing}
949
- title="Next step"
950
- >
951
-
952
- </button>
953
- </div>
954
- {/if}
955
-
956
- <!-- Frame slider and counter -->
957
- {#if controls_config.visible(`step`)}
958
- <div class="step-section">
959
- <input
960
- type="number"
961
- min="0"
962
- max={total_frames - 1}
963
- bind:value={current_step_idx}
964
- class="step-input"
965
- title="Enter step number to jump to"
966
- aria-label="Step input"
967
- {@attach tooltip()}
968
- />
969
- <span aria-label="total frames">/ {format_num(total_frames, `.3~s`)}</span>
970
- <div class="slider-container">
971
- <input
972
- type="range"
973
- min="0"
974
- max={total_frames - 1}
975
- bind:value={current_step_idx}
976
- class="step-slider"
977
- title="Drag to navigate steps"
978
- />
979
- {#if step_label_positions.length > 0}
980
- <div class="step-labels">
981
- {#each step_label_positions as step_idx (step_idx)}
982
- {@const position_percent = total_frames > 1
983
- ? (step_idx / (total_frames - 1)) * 100
984
- : 0}
985
- {@const adjusted_position = 1.5 + (position_percent * (100 - 2)) / 100}
986
- <div class="step-tick" style:left="{adjusted_position}%"></div>
987
- <div class="step-label" style:left="{adjusted_position}%">
988
- {format_num(step_idx, `.3~s`)}
989
- </div>
990
- {/each}
991
- </div>
992
- {/if}
993
- </div>
994
- </div>
995
- {/if}
996
-
997
- <!-- Frame rate control - only shown when playing -->
998
- {#if is_playing && controls_config.visible(`fps`)}
999
- <label
1000
- class="fps-section"
1001
- style="font-size: 0.9em; display: flex; align-items: center; gap: 5pt; margin-inline: 6pt"
1002
- >
1003
- FPS
1004
- <input
1005
- type="range"
1006
- min={fps_range[0]}
1007
- max={fps_range[1]}
1008
- bind:value={fps}
1009
- title="Frame rate: {format_num(fps, `.2~s`)} fps"
1010
- style="width: clamp(60px, 8cqw, 90px); accent-color: var(--accent-color)"
1011
- />
1012
- <input
1013
- type="number"
1014
- min={fps_range[0]}
1015
- max={fps_range[1]}
1016
- bind:value={fps}
1017
- title="Enter precise FPS value"
1018
- style="text-align: center; border: var(--tooltip-border)"
1019
- />
1020
- </label>
1021
- {/if}
1022
-
1023
- <!-- Frame info section -->
1024
- <div class="info-section">
1025
- {#if trajectory && controls_config.visible(`info-pane`)}
1026
- <TrajectoryInfoPane
1027
- {trajectory}
1028
- {current_step_idx}
1029
- {current_filename}
1030
- {current_file_path}
1031
- {file_size}
1032
- {file_object}
1033
- bind:pane_open={info_pane_open}
1034
- pane_props={{ style: `max-height: calc(${element_size.height}px - 50px)` }}
1035
- />
1036
- {/if}
1037
- <!-- Trajectory Export Pane -->
1038
- {#if controls_config.visible(`export-pane`)}
1039
- <TrajectoryExportPane
1040
- bind:export_pane_open={trajectory_export_open}
1041
- {trajectory}
1042
- {wrapper}
1043
- filename={current_filename || `trajectory`}
1044
- on_step_change={go_to_step}
1045
- pane_props={{ style: `max-height: calc(${element_size.height}px - 50px)` }}
1046
- />
1047
- {/if}
1048
- <!-- Display mode dropdown -->
1049
- {#if plot_series.length > 0 &&
1050
- controls_config.visible(`view-mode`)}
1051
- <div class="view-mode-dropdown-wrapper">
1052
- <button
1053
- onclick={() => (view_mode_dropdown_open = !view_mode_dropdown_open)}
1054
- title={current_view_label}
1055
- class="view-mode-button"
1056
- class:active={view_mode_dropdown_open}
1057
- style="background-color: transparent; padding: 0"
1058
- >
1059
- <Icon
1060
- icon={({
1061
- structure: `Atom`,
1062
- 'structure+scatter': `TwoColumns`,
1063
- 'structure+histogram': `TwoColumns`,
1064
- scatter: `ScatterPlot`,
1065
- histogram: `Histogram`,
1066
- } as const)[display_mode]}
1067
- />
1068
- <Icon icon={view_mode_dropdown_open ? `ArrowUp` : `ArrowDown`} />
1069
- </button>
1070
- {#if view_mode_dropdown_open}
1071
- <div class="view-mode-dropdown">
1072
- {#each [
1073
- { mode: `structure`, icon: `Atom`, label: `Structure-only` },
1074
- {
1075
- mode: `structure+scatter`,
1076
- icon: `TwoColumns`,
1077
- label: `Structure + Scatter`,
1078
- },
1079
- {
1080
- mode: `structure+histogram`,
1081
- icon: `TwoColumns`,
1082
- label: `Structure + Histogram`,
1083
- },
1084
- { mode: `scatter`, icon: `ScatterPlot`, label: `Scatter-only` },
1085
- {
1086
- mode: `histogram`,
1087
- icon: `Histogram`,
1088
- label: `Histogram-only`,
1089
- },
1090
- ] as const as
1091
- option
1092
- (option.mode)
1093
- }
1094
- <button
1095
- class="view-mode-option"
1096
- class:selected={display_mode === option.mode}
1097
- onclick={() => {
1098
- display_mode = option.mode
1099
- on_display_mode_change?.({ trajectory, mode: option.mode })
1100
- view_mode_dropdown_open = false
1101
- }}
1102
- >
1103
- <Icon icon={option.icon} />
1104
- <span>{option.label}</span>
1105
- </button>
1106
- {/each}
1107
- </div>
1108
- {/if}
1109
- </div>
1110
- {/if}
1111
- <!-- Fullscreen button - rightmost position -->
1112
- {#if fullscreen_toggle &&
1113
- controls_config.visible(`fullscreen`)}
1114
- <button
1115
- type="button"
1116
- onclick={() => fullscreen_toggle && toggle_fullscreen(wrapper)}
1117
- title="{fullscreen ? `Exit` : `Enter`} fullscreen"
1118
- aria-label="{fullscreen ? `Exit` : `Enter`} fullscreen"
1119
- aria-pressed={fullscreen}
1120
- class="fullscreen-button"
1121
- >
1122
- {#if typeof fullscreen_toggle === `function`}
1123
- {@render fullscreen_toggle({ fullscreen })}
1124
- {:else}
1125
- <Icon icon="{fullscreen ? `Exit` : ``}Fullscreen" />
1126
- {/if}
1127
- </button>
1128
- {/if}
1129
- </div>
1130
- {/if}
1131
- </div>
1132
- {/if}
1133
-
1134
- <div
1135
- class="content-area"
1136
- class:hide-plot={!actual_show_plot}
1137
- class:hide-structure={!show_structure}
1138
- class:show-both={[`structure+scatter`, `structure+histogram`].includes(display_mode)}
1139
- class:show-structure-only={display_mode === `structure`}
1140
- class:show-plot-only={[`scatter`, `histogram`].includes(display_mode)}
1141
- >
1142
- {#if show_structure}
1143
- <Structure
1144
- structure={current_structure}
1145
- allow_file_drop={false}
1146
- style="height: 100%; min-height: 0; z-index: 3; border-radius: 0"
1147
- {...{
1148
- show_image_atoms: false, // Default to false to avoid atoms popping in/out at cell edges
1149
- ...structure_props,
1150
- }}
1151
- bind:controls_open={structure_controls_open}
1152
- bind:info_pane_open={structure_info_open}
1153
- bind:hidden_elements
1154
- />
1155
- {/if}
1156
-
1157
- {#if actual_show_plot}
1158
- {#if display_mode === `scatter` || display_mode === `structure+scatter`}
1159
- <ScatterPlot
1160
- series={plot_series}
1161
- {x_axis}
1162
- {y_axis}
1163
- {y2_axis}
1164
- controls={scatter_controls}
1165
- current_x_value={current_step_idx}
1166
- change={plot_skimming ? handle_plot_change : undefined}
1167
- padding={{ t: 20, b: 60, l: 52, r: has_y2_series ? 100 : 20 }}
1168
- range_padding={0}
1169
- style="height: 100%"
1170
- {...scatter_props}
1171
- legend={{
1172
- ...scatter_props.legend ?? {},
1173
- on_toggle: (series_idx) => {
1174
- handle_legend_toggle(series_idx)
1175
- scatter_props.legend?.on_toggle?.(series_idx)
1176
- },
1177
- }}
1178
- class="plot {scatter_props.class ?? ``}"
1179
- >
1180
- {#snippet tooltip({ x, y, metadata, label })}
1181
- {@const formatted_y = typeof y === `number` ? format_num(y) : y}
1182
- Step: {Math.round(x)}<br />
1183
- {@html sanitize_html(metadata?.series_label || label || `Value`)}: {formatted_y}
1184
- {/snippet}
1185
- </ScatterPlot>
1186
- {:else if display_mode === `histogram` || display_mode === `structure+histogram`}
1187
- <Histogram
1188
- {...histogram_props}
1189
- series={plot_series}
1190
- x_axis={{
1191
- label: String(histogram_props.x_axis?.label ?? y_axis_labels.y1),
1192
- format: `.3~s`,
1193
- }}
1194
- y_axis={{ label: histogram_props.y_axis?.label ?? `Count`, format: `.3~s` }}
1195
- mode={histogram_props.mode ?? `overlay`}
1196
- show_legend={histogram_props.show_legend ?? plot_series.length > 1}
1197
- legend={histogram_props.legend}
1198
- on_series_toggle={(series_idx) => {
1199
- handle_legend_toggle(series_idx)
1200
- histogram_props.on_series_toggle?.(series_idx)
1201
- }}
1202
- style="height: 100%"
1203
- class="plot {histogram_props.class ?? ``}"
1204
- --ctrl-btn-top="6ex"
1205
- >
1206
- {#snippet tooltip({ value, count, property })}
1207
- {#if property}<div><strong>{property}</strong></div>{/if}
1208
- <div>Value: {format_num(value)}</div>
1209
- <div>Count: {count}</div>
1210
- {/snippet}
1211
- </Histogram>
1212
- {/if}
1213
- {/if}
1214
- </div>
1215
- {:else}
1216
- <EmptyState class="trajectory-empty-state">
1217
- <h3 id="load-trajectory">Load Trajectory</h3>
1218
- <p>
1219
- Drop a trajectory file here (.xyz, .extxyz, .json, .json.gz, XDATCAR, .traj, .h5)
1220
- or provide trajectory data via props
1221
- </p>
1222
- <strong style="display: block; margin-block: 1em 1ex">Supported formats:</strong>
1223
- <ul>
1224
- <li>Multi-frame XYZ trajectory files (.xyz, .extxyz)</li>
1225
- <li>ASE trajectory files (.traj)</li>
1226
- <li>Pymatgen trajectory JSON</li>
1227
- <li>Array of structures with metadata</li>
1228
- <li>VASP XDATCAR files</li>
1229
- <li>HDF5 trajectory files (.h5, .hdf5)</li>
1230
- <li>Compressed files (.gz)</li>
1231
- </ul>
1232
- <p>
1233
- 💡 Force vectors will be automatically displayed when present in trajectory data
1234
- </p>
1235
- </EmptyState>
1236
- {/if}
1237
- </div>
1238
-
1239
- <style>
1240
- .trajectory {
1241
- --min-height: 500px;
1242
- display: flex;
1243
- flex-direction: column;
1244
- height: var(--traj-height, 100%);
1245
- position: relative;
1246
- min-height: var(--traj-min-height, var(--min-height));
1247
- border-radius: var(--traj-border-radius, var(--border-radius, 3pt));
1248
- box-sizing: border-box;
1249
- contain: layout;
1250
- z-index: var(--traj-z-index, 1);
1251
- container-type: size; /* enable cqh for panes if explicit height is set */
1252
- :global(.plot) {
1253
- background: var(--surface-bg);
1254
- }
1255
- &.active {
1256
- z-index: 2; /* needed so info/control panes from an active viewer overlay those of the next (if there is one) */
1257
- .trajectory-controls {
1258
- z-index: 5; /* needed so info/control panes from an active viewer its own plot when active, not sure why needed */
1259
- }
1260
- }
1261
- &:fullscreen {
1262
- height: 100vh !important;
1263
- width: 100vw !important;
1264
- border-radius: 0 !important;
1265
- background: var(--surface-bg);
1266
- overflow: hidden;
1267
- }
1268
- &.horizontal .content-area {
1269
- grid-template-columns: 1fr 1fr;
1270
- grid-template-rows: 1fr;
1271
- }
1272
- &.vertical .content-area {
1273
- grid-template-columns: 1fr;
1274
- grid-template-rows: 1fr 1fr;
1275
- }
1276
- /* Display mode specific layouts */
1277
- &:is(.horizontal, .vertical) .content-area:is(.show-structure-only, .show-plot-only) {
1278
- grid-template-columns: 1fr !important;
1279
- grid-template-rows: 1fr !important;
1280
- }
1281
- &.dragover {
1282
- background-color: var(--traj-dragover-bg, var(--dragover-bg));
1283
- border: var(--traj-dragover-border, var(--dragover-border));
1284
- }
1285
- /* Mode: hover - controls visible on component hover */
1286
- &:hover .trajectory-controls.hover-visible,
1287
- &:focus-within .trajectory-controls.hover-visible {
1288
- opacity: 1;
1289
- pointer-events: auto;
1290
- }
1291
- }
1292
- /* Content area - grid container for equal sizing */
1293
- .content-area {
1294
- display: grid;
1295
- flex: 1;
1296
- min-height: 0; /* important for tall structure viewers not to overflow */
1297
- /* When plot or structure is hidden, the other takes full space */
1298
- &:is(.hide-plot, .hide-structure) {
1299
- grid-template-columns: 1fr !important;
1300
- grid-template-rows: 1fr !important;
1301
- }
1302
- }
1303
- .trajectory-controls {
1304
- display: flex;
1305
- align-items: center;
1306
- gap: clamp(2pt, 1cqw, 1ex);
1307
- padding: clamp(2pt, 0.5cqw, 1ex) clamp(4pt, 1cqw, 1.2ex);
1308
- background: var(--surface-bg-hover);
1309
- backdrop-filter: blur(4px);
1310
- position: relative;
1311
- border-radius: var(--border-radius, 3pt) var(--border-radius, 3pt) 0 0;
1312
- opacity: 0;
1313
- pointer-events: none;
1314
- transition: opacity 0.2s ease;
1315
- /* Mode: always - controls always visible */
1316
- &.always-visible {
1317
- opacity: 1;
1318
- pointer-events: auto;
1319
- }
1320
- /* Mode: never - stays hidden (default state, no additional CSS needed) */
1321
- &:focus-within {
1322
- z-index: var(--traj-controls-z-index, 999999999);
1323
- }
1324
- button {
1325
- background: var(--btn-bg);
1326
- font-size: clamp(0.8rem, 2cqw, 1rem);
1327
- &:hover:not(:disabled) {
1328
- background: var(--btn-bg-hover);
1329
- }
1330
- }
1331
- input[type='number'] {
1332
- &::-webkit-outer-spin-button,
1333
- &::-webkit-inner-spin-button {
1334
- -webkit-appearance: none;
1335
- margin: 0;
1336
- }
1337
- }
1338
- }
1339
- .nav-section {
1340
- display: flex;
1341
- align-items: center;
1342
- gap: clamp(1pt, 0.5cqw, 5pt);
1343
- }
1344
- .step-section {
1345
- display: flex;
1346
- align-items: center;
1347
- gap: clamp(0.25rem, 1.5cqw, 0.5rem);
1348
- flex: 1;
1349
- min-width: 0;
1350
- }
1351
- .step-input {
1352
- border: 1px solid rgba(99, 179, 237, 0.3);
1353
- text-align: center;
1354
- margin: 0 -5px 0 0;
1355
- padding: 2px;
1356
- }
1357
- .slider-container {
1358
- position: relative;
1359
- flex: 1;
1360
- min-width: var(--trajectory-slider-min-width, 100px);
1361
- }
1362
- .step-slider {
1363
- width: 100%;
1364
- accent-color: var(--accent-color);
1365
- }
1366
- .step-labels {
1367
- position: absolute;
1368
- left: 0;
1369
- right: 0;
1370
- }
1371
- .step-tick {
1372
- position: absolute;
1373
- transform: translateX(-50%);
1374
- width: var(--trajectory-step-tick-width, 1px);
1375
- height: var(--trajectory-step-tick-height, 4px);
1376
- background: var(--text-color-muted);
1377
- top: -9pt;
1378
- }
1379
- .step-label {
1380
- position: absolute;
1381
- transform: translateX(-50%);
1382
- font-size: clamp(0.5em, 1.2cqw, 0.65em);
1383
- color: var(--text-color-muted);
1384
- white-space: nowrap;
1385
- text-align: center;
1386
- top: -1.7ex;
1387
- }
1388
- button.filename {
1389
- align-items: center;
1390
- white-space: nowrap;
1391
- padding: var(--trajectory-filename-padding, 3pt 4pt);
1392
- border-radius: var(--trajectory-filename-border-radius, var(--border-radius, 3pt));
1393
- max-width: clamp(150px, 20cqw, 250px);
1394
- overflow: hidden;
1395
- text-overflow: ellipsis;
1396
- display: inline-block;
1397
- position: relative;
1398
- font-family: monospace;
1399
- font-size: 0.9em;
1400
- background: var(--code-bg, rgba(0, 0, 0, 0.1));
1401
- }
1402
- @keyframes fade-in {
1403
- from {
1404
- opacity: 0;
1405
- }
1406
- }
1407
- .fullscreen-button {
1408
- background: transparent !important;
1409
- padding: 0;
1410
- &:hover:not(:disabled) {
1411
- background: var(--border-color);
1412
- }
1413
- }
1414
- .info-section {
1415
- display: flex;
1416
- align-items: center;
1417
- gap: clamp(3pt, 0.6cqw, 1ex);
1418
- position: relative;
1419
- }
1420
- .info-section :global(:is(.trajectory-info-toggle, .trajectory-export-toggle)) {
1421
- font-size: clamp(1rem, 2.2cqw, 1.1rem);
1422
- }
1423
- .play-button {
1424
- min-width: clamp(32px, 4cqw, 36px);
1425
- &:hover:not(:disabled) {
1426
- background: var(--traj-play-btn-bg-hover, var(--btn-bg-hover, rgba(0, 0, 0, 0.2)));
1427
- }
1428
- &.playing {
1429
- background: var(--traj-pause-btn-bg, var(--btn-bg, rgba(0, 0, 0, 0.1)));
1430
- &:hover:not(:disabled) {
1431
- background: var(
1432
- --traj-pause-btn-bg-hover,
1433
- var(--btn-bg-hover, rgba(0, 0, 0, 0.1))
1434
- );
1435
- }
1436
- }
1437
- }
1438
- :global(.trajectory-empty-state) {
1439
- padding: 2rem;
1440
- border-radius: var(--border-radius, 3pt);
1441
- background: var(--dropzone-bg);
1442
- :where(p, ul) {
1443
- color: var(--text-color-muted);
1444
- }
1445
- :where(ul, li, strong) {
1446
- max-width: var(--trajectory-empty-state-max-width, 500px);
1447
- margin-inline: auto;
1448
- }
1449
- }
1450
- button {
1451
- &:hover:not(:disabled) {
1452
- background: var(--border-color);
1453
- }
1454
- &:disabled {
1455
- background: var(--btn-disabled-bg);
1456
- color: var(--text-color-muted);
1457
- cursor: not-allowed;
1458
- }
1459
- }
1460
- /* Responsive design */
1461
- @media (orientation: portrait) {
1462
- .trajectory {
1463
- /* Fallback class for browsers without :has() support */
1464
- &.show-both-views {
1465
- min-height: calc(var(--min-height) * 2);
1466
- }
1467
- /* Modern browsers: use :has() for same effect */
1468
- @supports selector(:has(.content-area)) {
1469
- &:has(.content-area.show-both:not(.hide-plot):not(.hide-structure)) {
1470
- min-height: calc(var(--min-height) * 2);
1471
- }
1472
- }
1473
- .content-area.show-both:not(.hide-plot):not(.hide-structure) {
1474
- grid-template-columns: 1fr !important;
1475
- grid-template-rows: 1fr 1fr !important;
1476
- }
1477
- }
1478
- }
1479
- .view-mode-dropdown-wrapper {
1480
- display: flex;
1481
- position: relative;
1482
- }
1483
- .view-mode-dropdown {
1484
- position: absolute;
1485
- top: 115%;
1486
- right: 0;
1487
- background: var(--surface-bg);
1488
- border-radius: 4px;
1489
- box-shadow: 0 8px 16px -4px rgba(0, 0, 0, 0.3), 0 4px 8px -2px rgba(0, 0, 0, 0.1);
1490
- }
1491
- .view-mode-option {
1492
- display: flex;
1493
- align-items: center;
1494
- gap: 1ex;
1495
- width: 100%;
1496
- padding: var(--trajectory-view-mode-option-padding, 5pt);
1497
- box-sizing: border-box;
1498
- background: transparent;
1499
- border-radius: 0;
1500
- text-align: left;
1501
- transition: background-color 0.15s ease;
1502
- &:first-child {
1503
- border-top-left-radius: 3px;
1504
- border-top-right-radius: 3px;
1505
- }
1506
- &.selected {
1507
- color: var(--accent-color);
1508
- }
1509
- span {
1510
- font-weight: 500;
1511
- white-space: nowrap;
1512
- overflow: hidden;
1513
- text-overflow: ellipsis;
1514
- flex: 1;
1515
- }
1516
- }
1517
- </style>