matterviz 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -0,0 +1,535 @@
1
+ // VS Code's webview postMessage API takes a single argument (no targetOrigin),
2
+ // so unicorn's require-post-message-target-origin is a false positive here.
3
+ // oxlint-disable eslint-plugin-unicorn/require-post-message-target-origin
4
+ // Import MatterViz parsing functions and components
5
+ // oxlint-disable-next-line eslint-plugin-import/no-unassigned-import -- side-effect only
6
+ import '../app.css';
7
+ import ConvexHull from '../convex-hull/ConvexHull.svelte';
8
+ import FermiSurface from '../fermi-surface/FermiSurface.svelte';
9
+ import { is_fermi_surface_data } from '../fermi-surface/types';
10
+ import IsobaricBinaryPhaseDiagram from '../phase-diagram/IsobaricBinaryPhaseDiagram.svelte';
11
+ import { merge } from '../settings';
12
+ import Bands from '../spectral/Bands.svelte';
13
+ import BandsAndDos from '../spectral/BandsAndDos.svelte';
14
+ import Dos from '../spectral/Dos.svelte';
15
+ import Structure from '../structure/Structure.svelte';
16
+ import { ensure_moyo_wasm_ready } from '../symmetry';
17
+ import { apply_theme_to_dom, is_valid_theme_name } from '../theme/index';
18
+ // oxlint-disable-next-line eslint-plugin-import/no-unassigned-import -- side-effect only
19
+ import '../theme/themes.mjs';
20
+ import { is_indexable_trajectory_filename } from '../trajectory/format-detect';
21
+ import Trajectory from '../trajectory/Trajectory.svelte';
22
+ import { build_structure_props_from_settings as structure_props } from '../structure/prop-groups';
23
+ import { mount, unmount } from 'svelte';
24
+ import TrajectoryWithDos from './TrajectoryWithDos.svelte';
25
+ import { parse_large_file_marker } from './host-transfer';
26
+ import JsonBrowser from './JsonBrowser.svelte';
27
+ import { parse_file_content } from './parse';
28
+ import { escape_html, to_error } from '../utils';
29
+ // Shared postMessage request/response plumbing for talking to the extension
30
+ // host: tags the request with a UUID, forwards responses carrying that id to
31
+ // on_response (which returns true once it settled the promise), and rejects
32
+ // on timeout. Always removes the listener + timer once settled.
33
+ function post_request(api, message, timeout_ms, timeout_error, on_response) {
34
+ return new Promise((resolve, reject) => {
35
+ const request_id = crypto.randomUUID();
36
+ const timer = setTimeout(() => {
37
+ globalThis.removeEventListener(`message`, handler);
38
+ reject(new Error(timeout_error));
39
+ }, timeout_ms);
40
+ const handler = (event) => {
41
+ if (event.data?.request_id !== request_id)
42
+ return;
43
+ if (on_response(event.data, resolve, reject)) {
44
+ globalThis.removeEventListener(`message`, handler);
45
+ clearTimeout(timer);
46
+ }
47
+ };
48
+ globalThis.addEventListener(`message`, handler);
49
+ api.postMessage({ ...message, request_id });
50
+ });
51
+ }
52
+ // VS Code Frame Loader - streams frames via extension communication
53
+ export class VSCodeFrameLoader {
54
+ file_path;
55
+ vscode_api;
56
+ constructor(file_path, vscode_api) {
57
+ this.file_path = file_path;
58
+ this.vscode_api = vscode_api;
59
+ }
60
+ // Only implement the method we actually use
61
+ async load_frame(_data, frame_index, timeout = 10) {
62
+ const message = {
63
+ command: `request_frame`,
64
+ file_path: this.file_path,
65
+ frame_index,
66
+ };
67
+ return post_request(this.vscode_api, message, timeout * 1000, `Frame ${frame_index} timeout after ${timeout}s`, (data, resolve, reject) => {
68
+ if (data.command !== `frame_response`)
69
+ return false;
70
+ if (data.error)
71
+ reject(new Error(data.error));
72
+ else
73
+ resolve(data.frame);
74
+ return true;
75
+ });
76
+ }
77
+ // Required by the FrameLoader interface but never called for host-streamed trajectories
78
+ async get_total_frames() {
79
+ throw new Error(`Not implemented`);
80
+ }
81
+ async build_frame_index() {
82
+ throw new Error(`Not implemented`);
83
+ }
84
+ async extract_plot_metadata() {
85
+ throw new Error(`Not implemented`);
86
+ }
87
+ }
88
+ // Store VSCode API instance to avoid multiple acquisitions
89
+ let vscode_api = null;
90
+ let current_app = null;
91
+ let file_change_listener_registered = false;
92
+ let file_change_generation = 0;
93
+ let file_change_queue = Promise.resolve();
94
+ let viewer_disposed = false;
95
+ let viewer_lifecycle_generation = 0;
96
+ const global_window = globalThis;
97
+ const is_current_file_change = (generation) => !viewer_disposed && generation === file_change_generation;
98
+ const is_current_lifecycle = (generation) => !viewer_disposed && generation === viewer_lifecycle_generation;
99
+ // Initialize VSCode API at module level
100
+ try {
101
+ vscode_api = globalThis.acquireVsCodeApi?.() ?? null;
102
+ }
103
+ catch (error) {
104
+ console.warn(`VSCode API already acquired or not available:`, error);
105
+ vscode_api = null;
106
+ }
107
+ // Set up VSCode-specific download override for file exports
108
+ export const setup_vscode_download = () => {
109
+ if (!vscode_api)
110
+ return;
111
+ global_window.download = (data, filename) => {
112
+ if (!filename?.trim()) {
113
+ console.error(`Invalid filename provided to download`);
114
+ return;
115
+ }
116
+ const send_message = (content, is_binary) => {
117
+ vscode_api?.postMessage({
118
+ command: `saveAs`,
119
+ content,
120
+ filename,
121
+ is_binary,
122
+ });
123
+ };
124
+ try {
125
+ if (typeof data === `string`) {
126
+ send_message(data, false);
127
+ }
128
+ else {
129
+ const reader = new FileReader();
130
+ reader.addEventListener(`load`, () => send_message(reader.result, true));
131
+ reader.addEventListener(`error`, () => {
132
+ console.error(`Failed to read binary data for download`);
133
+ vscode_api?.postMessage({
134
+ command: `error`,
135
+ text: `Failed to read binary data for download`,
136
+ });
137
+ });
138
+ reader.readAsDataURL(data);
139
+ }
140
+ }
141
+ catch (error) {
142
+ console.error(`VSCode download failed:`, error);
143
+ vscode_api?.postMessage({
144
+ command: `error`,
145
+ text: `Download failed: ${error}`,
146
+ });
147
+ }
148
+ };
149
+ };
150
+ // Unmount the existing component before replacement to prevent memory leaks.
151
+ async function unmount_current_app() {
152
+ const app = current_app;
153
+ current_app = null;
154
+ if (app)
155
+ await unmount(app);
156
+ }
157
+ // Handle file change events from extension
158
+ const handle_file_change = async (message, generation) => {
159
+ if (!is_current_file_change(generation))
160
+ return;
161
+ if (message.command === `fileDeleted`) {
162
+ // File was deleted - show error message
163
+ await unmount_current_app();
164
+ if (!is_current_file_change(generation))
165
+ return;
166
+ const container = document.querySelector(`#matterviz-app`);
167
+ if (container) {
168
+ container.innerHTML = `
169
+ <div style="padding: 2rem; text-align: center; color: var(--vscode-errorForeground);">
170
+ <h2>File Deleted</h2>
171
+ <p>The file "${escape_html(message.file_path)}" has been deleted.</p>
172
+ </div>
173
+ `;
174
+ }
175
+ return;
176
+ }
177
+ try {
178
+ if (message.theme && is_valid_theme_name(message.theme)) {
179
+ apply_theme_to_dom(message.theme);
180
+ }
181
+ const result = await parse_file_data(message.data);
182
+ if (!is_current_file_change(generation))
183
+ return;
184
+ const container = document.querySelector(`#matterviz-app`);
185
+ if (container) {
186
+ await unmount_current_app();
187
+ if (!is_current_file_change(generation))
188
+ return;
189
+ current_app = create_display(container, result);
190
+ }
191
+ vscode_api?.postMessage({ command: `info`, text: `File reloaded successfully` });
192
+ }
193
+ catch (error) {
194
+ if (!is_current_file_change(generation))
195
+ return;
196
+ console.error(`Failed to reload file:`, error);
197
+ vscode_api?.postMessage({
198
+ command: `error`,
199
+ text: `Failed to reload file: ${error}`,
200
+ });
201
+ }
202
+ };
203
+ const process_file_change = (message) => {
204
+ if (viewer_disposed)
205
+ return;
206
+ const generation = ++file_change_generation;
207
+ file_change_queue = file_change_queue
208
+ .then(() => handle_file_change(message, generation))
209
+ .catch((error) => {
210
+ if (!is_current_file_change(generation))
211
+ return;
212
+ console.error(`Failed to process file change:`, error);
213
+ vscode_api?.postMessage({
214
+ command: `error`,
215
+ text: `Failed to process file change: ${error}`,
216
+ });
217
+ });
218
+ };
219
+ // Request host-side parsing for a file too large to copy into the webview.
220
+ function request_large_file_content(file_path, timeout = 120_000) {
221
+ if (!vscode_api)
222
+ throw new Error(`VS Code API not available`);
223
+ const message = { command: `request_large_file`, file_path };
224
+ return post_request(vscode_api, message, timeout, `Large file timeout`, (data, resolve, reject) => {
225
+ if (data.command === `large_file_progress`) {
226
+ // TODO maybe forward file load progress to UI
227
+ console.info(`Progress: ${data.stage} - ${data.progress}%`);
228
+ return false;
229
+ }
230
+ if (data.command !== `large_file_response`)
231
+ return false;
232
+ if (data.error)
233
+ reject(new Error(data.error));
234
+ else if (data.parsed_trajectory && typeof data.parsed_trajectory === `object`) {
235
+ resolve(data.parsed_trajectory);
236
+ }
237
+ else
238
+ reject(new TypeError(`Malformed large-file response`));
239
+ return true;
240
+ });
241
+ }
242
+ async function parse_file_data({ content, filename, is_base64, }) {
243
+ const marker = parse_large_file_marker(content);
244
+ if (!marker)
245
+ return parse_file_content(content, filename, is_base64);
246
+ if (!is_indexable_trajectory_filename(filename)) {
247
+ throw new Error(`Large-file loading is only supported for indexed trajectories: ${filename}`);
248
+ }
249
+ console.info(`Handling large file: ${filename} (${Math.round(marker.file_size / 1024 / 1024)}MB)`);
250
+ const trajectory = await request_large_file_content(marker.file_path);
251
+ return {
252
+ type: `trajectory`,
253
+ data: trajectory,
254
+ filename,
255
+ streaming_info: { file_path: marker.file_path },
256
+ };
257
+ }
258
+ // Create error display in container
259
+ const create_error_display = (container, error, filename) => {
260
+ container.innerHTML = `
261
+ <div style="padding: 20px; text-align: center; color: var(--vscode-errorForeground, #f85149);
262
+ background: var(--vscode-editor-background, #1e1e1e); height: 100%;
263
+ display: flex; flex-direction: column; justify-content: center; align-items: center;">
264
+ <div style="font-size: 48px; margin-bottom: 20px;">❌</div>
265
+ <h2 style="margin: 0 0 15px 0;">Failed to Parse File</h2>
266
+ <div style="background: rgba(255,255,255,0.1); padding: 20px; border-radius: 8px; max-width: 600px;">
267
+ <p style="margin: 0 0 10px 0;"><strong>File:</strong> ${escape_html(filename)}</p>
268
+ <p style="margin: 0 0 10px 0;"><strong>Error:</strong> ${escape_html(error.message)}</p>
269
+ <p style="margin: 0; font-size: 14px; opacity: 0.8;">
270
+ Supported formats: XYZ, CIF, JSON, POSCAR, trajectory files (.traj, .h5, .extxyz), etc.
271
+ </p>
272
+ </div>
273
+ </div>`;
274
+ };
275
+ // Mount Svelte component and create display
276
+ export const create_display = (container, result, display_options) => {
277
+ const { filename } = result;
278
+ Object.assign(container.style, {
279
+ width: `100%`,
280
+ height: `100%`,
281
+ position: `absolute`,
282
+ top: `0`,
283
+ left: `0`,
284
+ right: `0`,
285
+ bottom: `0`,
286
+ background: `var(--vscode-editor-background, #1e1e1e)`,
287
+ color: `var(--vscode-editor-foreground, #d4d4d4)`,
288
+ overflow: `hidden`,
289
+ });
290
+ container.innerHTML = ``;
291
+ // Get defaults and create props
292
+ const defaults = merge(globalThis.matterviz_data?.defaults);
293
+ const common_props = {
294
+ allow_file_drop: false,
295
+ style: `height: 100%; border-radius: 0`,
296
+ enable_tips: false,
297
+ fullscreen_toggle: false,
298
+ };
299
+ let app;
300
+ let log_message;
301
+ if (result.type === `trajectory`) {
302
+ // Prepare trajectory data for VS Code streaming if supported
303
+ let final_trajectory = result.data;
304
+ if (vscode_api && result.streaming_info?.file_path) {
305
+ final_trajectory = {
306
+ ...final_trajectory,
307
+ is_indexed: true,
308
+ frames: final_trajectory.frames || [],
309
+ frame_loader: new VSCodeFrameLoader(result.streaming_info.file_path, vscode_api),
310
+ };
311
+ }
312
+ const { initial_step_idx, on_step_change } = display_options ?? {};
313
+ const trajectory_mount_props = {
314
+ trajectory: final_trajectory,
315
+ ...trajectory_props(defaults),
316
+ ...common_props,
317
+ ...(initial_step_idx !== undefined && { current_step_idx: initial_step_idx }),
318
+ ...(on_step_change && {
319
+ on_step_change: (data) => on_step_change(data.step_idx ?? 0, data.frame_count ?? 0),
320
+ }),
321
+ };
322
+ // vaspout.h5 files carrying results/electron_dos get a DOS panel below the trajectory
323
+ const traj_electronic = final_trajectory.metadata?.electronic;
324
+ if (traj_electronic?.dos) {
325
+ app = mount(TrajectoryWithDos, {
326
+ target: container,
327
+ props: { dos: traj_electronic.dos, trajectory_props: trajectory_mount_props },
328
+ });
329
+ }
330
+ else {
331
+ app = mount(Trajectory, { target: container, props: trajectory_mount_props });
332
+ }
333
+ log_message = `Trajectory rendered: ${filename} (${final_trajectory.frames?.length ?? 0} initial frames, ${final_trajectory.total_frames ?? `unknown`} total)`;
334
+ }
335
+ else if (result.type === `vaspout_electronic`) {
336
+ const { dos, bands } = result.data;
337
+ const spectral_props = { style: `height: 100%`, class: `vaspout-electronic` };
338
+ if (bands && dos) {
339
+ app = mount(BandsAndDos, {
340
+ target: container,
341
+ props: {
342
+ band_structs: bands,
343
+ doses: dos,
344
+ bands_props: { band_type: `electronic` },
345
+ ...spectral_props,
346
+ },
347
+ });
348
+ }
349
+ else if (bands) {
350
+ app = mount(Bands, {
351
+ target: container,
352
+ props: { band_structs: bands, band_type: `electronic`, ...spectral_props },
353
+ });
354
+ }
355
+ else {
356
+ app = mount(Dos, {
357
+ target: container,
358
+ props: { doses: dos, ...spectral_props },
359
+ });
360
+ }
361
+ const parts = [bands ? `bands` : null, dos ? `DOS` : null].filter(Boolean).join(` + `);
362
+ log_message = `Electronic structure rendered: ${filename} (${parts})`;
363
+ }
364
+ else if (result.type === `fermi_surface`) {
365
+ const props = { ...common_props };
366
+ if (is_fermi_surface_data(result.data)) {
367
+ props.fermi_data = result.data;
368
+ }
369
+ else
370
+ props.band_data = result.data;
371
+ app = mount(FermiSurface, { target: container, props });
372
+ log_message = `Fermi surface rendered: ${filename}`;
373
+ }
374
+ else if (result.type === `isosurface`) {
375
+ // VolumetricFileData has structure + volumes; render via Structure with volumetric_data
376
+ const vol_file = result.data;
377
+ app = mount(Structure, {
378
+ target: container,
379
+ props: {
380
+ structure: vol_file.structure,
381
+ volumetric_data: vol_file.volumes,
382
+ ...structure_props(defaults),
383
+ ...common_props,
384
+ },
385
+ });
386
+ log_message = `Volumetric data rendered: ${filename}`;
387
+ }
388
+ else if (result.type === `convex_hull`) {
389
+ const entries = result.data;
390
+ app = mount(ConvexHull, { target: container, props: { entries, ...common_props } });
391
+ log_message = `Convex hull rendered: ${filename} (${entries.length} entries)`;
392
+ }
393
+ else if (result.type === `phase_diagram`) {
394
+ app = mount(IsobaricBinaryPhaseDiagram, {
395
+ target: container,
396
+ props: { data: result.data, ...common_props },
397
+ });
398
+ log_message = `Phase diagram rendered: ${filename}`;
399
+ }
400
+ else if (result.type === `json_browser`) {
401
+ app = mount(JsonBrowser, {
402
+ target: container,
403
+ props: { value: result.data, defaults, filename },
404
+ });
405
+ log_message = `JSON browser opened: ${filename}`;
406
+ }
407
+ else {
408
+ // Default: structure
409
+ const structure = result.data;
410
+ app = mount(Structure, {
411
+ target: container,
412
+ props: { structure, ...structure_props(defaults), ...common_props },
413
+ });
414
+ log_message = `Structure rendered: ${filename} (${structure.sites?.length ?? 0} sites)`;
415
+ }
416
+ vscode_api?.postMessage({ command: `info`, text: log_message });
417
+ return app;
418
+ };
419
+ // Map defaults to trajectory component props
420
+ const trajectory_props = (defaults) => {
421
+ const { trajectory, plot, scatter, histogram } = defaults;
422
+ return {
423
+ ...trajectory,
424
+ structure_props: structure_props(defaults),
425
+ loading_options: {
426
+ bin_file_threshold: trajectory.bin_file_threshold,
427
+ text_file_threshold: trajectory.text_file_threshold,
428
+ use_indexing: trajectory.use_indexing,
429
+ chunk_size: trajectory.chunk_size,
430
+ max_frames_in_memory: trajectory.max_frames_in_memory,
431
+ enable_performance_monitoring: trajectory.enable_performance_monitoring,
432
+ prefetch_frames: trajectory.prefetch_frames,
433
+ cache_parsed_data: trajectory.cache_parsed_data,
434
+ },
435
+ scatter_props: {
436
+ markers: scatter.symbol_type,
437
+ line_width: scatter.line.width,
438
+ point_size: scatter.point.size,
439
+ show_legend: scatter.show_legend,
440
+ enable_zoom: plot.enable_zoom,
441
+ zoom_factor: plot.zoom_factor,
442
+ auto_fit_range: plot.auto_fit_range,
443
+ show_grid: plot.grid_lines,
444
+ show_axis_labels: plot.axis_labels,
445
+ animation_duration: plot.animation_duration,
446
+ legend: { show: scatter.show_legend },
447
+ },
448
+ histogram_props: {
449
+ mode: histogram.mode,
450
+ show_legend: histogram.show_legend,
451
+ bin_count: histogram.bin_count,
452
+ enable_zoom: plot.enable_zoom,
453
+ zoom_factor: plot.zoom_factor,
454
+ auto_fit_range: plot.auto_fit_range,
455
+ show_grid: plot.grid_lines,
456
+ show_axis_labels: plot.axis_labels,
457
+ animation_duration: plot.animation_duration,
458
+ legend: { show: histogram.show_legend },
459
+ },
460
+ spinner_props: { show_progress: trajectory.show_parsing_progress },
461
+ ELEM_PROPERTY_LABELS: {},
462
+ };
463
+ };
464
+ // Initialize the MatterViz application from data passed by the extension
465
+ async function initialize(lifecycle_generation) {
466
+ const file_data = globalThis.matterviz_data?.data;
467
+ const theme = globalThis.matterviz_data?.theme;
468
+ const moyo_wasm_url = globalThis.matterviz_data?.moyo_wasm_url;
469
+ if (!file_data?.content || !file_data.filename) {
470
+ throw new Error(`No data provided to MatterViz app`);
471
+ }
472
+ // Initialize WASM early with URL from extension (for symmetry analysis)
473
+ if (moyo_wasm_url)
474
+ await ensure_moyo_wasm_ready(moyo_wasm_url);
475
+ if (!is_current_lifecycle(lifecycle_generation))
476
+ return null;
477
+ setup_vscode_download();
478
+ if (theme)
479
+ apply_theme_to_dom(theme);
480
+ const container = document.querySelector(`#matterviz-app`);
481
+ if (!container)
482
+ throw new Error(`Target container not found in DOM`);
483
+ const result = await parse_file_data(file_data);
484
+ if (!is_current_lifecycle(lifecycle_generation))
485
+ return null;
486
+ const app = create_display(container, result);
487
+ // Store the app instance for file watching
488
+ current_app = app;
489
+ // Listen for file change messages from extension
490
+ if (vscode_api && !file_change_listener_registered) {
491
+ globalThis.addEventListener(`message`, (event) => {
492
+ if ([`fileUpdated`, `fileDeleted`].includes(event.data.command)) {
493
+ process_file_change(event.data);
494
+ }
495
+ });
496
+ file_change_listener_registered = true;
497
+ }
498
+ return app;
499
+ }
500
+ // Cleanup function to properly dispose of components
501
+ async function cleanup_matterviz() {
502
+ viewer_disposed = true;
503
+ file_change_generation++;
504
+ viewer_lifecycle_generation++;
505
+ file_change_queue = Promise.resolve();
506
+ await unmount_current_app();
507
+ }
508
+ // Export initialization and cleanup functions to global scope
509
+ global_window.initializeMatterViz = async () => {
510
+ if (!globalThis.matterviz_data) {
511
+ console.warn(`No matterviz_data found on window`);
512
+ return null;
513
+ }
514
+ viewer_disposed = false;
515
+ const lifecycle_generation = ++viewer_lifecycle_generation;
516
+ try {
517
+ // initialize() already records the app in current_app
518
+ return await initialize(lifecycle_generation);
519
+ }
520
+ catch (error) {
521
+ if (!is_current_lifecycle(lifecycle_generation))
522
+ return null;
523
+ const err = to_error(error);
524
+ const container = document.querySelector(`#matterviz-app`);
525
+ if (container) {
526
+ create_error_display(container, err, globalThis.matterviz_data?.data?.filename || `Unknown file`);
527
+ }
528
+ vscode_api?.postMessage({
529
+ command: `error`,
530
+ text: `Error rendering ${globalThis.matterviz_data?.data?.filename || `Unknown file`}: ${err.message}`,
531
+ });
532
+ return null;
533
+ }
534
+ };
535
+ global_window.cleanupMatterViz = cleanup_matterviz;
@@ -0,0 +1,9 @@
1
+ import type { ViewType } from './types';
2
+ export type { ViewType } from './types';
3
+ export interface ParseResult {
4
+ type: ViewType;
5
+ data: unknown;
6
+ filename: string;
7
+ }
8
+ export declare function base64_to_array_buffer(base64: string): ArrayBuffer;
9
+ export declare const parse_file_content: (content: string, filename: string, is_base64?: boolean) => Promise<ParseResult>;