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,170 @@
1
+ // Worker-safe file parsing with no Svelte or DOM imports.
2
+ import { COMPRESSION_EXTENSIONS_REGEX } from '../constants';
3
+ import { parse_fermi_file } from '../fermi-surface/parse';
4
+ import { decompress_data, decompress_data_binary, detect_compression_format, } from '../io/decompress';
5
+ import { parse_volumetric_file } from '../isosurface/parse';
6
+ import { is_vaspwave_filename, parse_vaspwave_charge } from '../isosurface/parse-vaspwave';
7
+ import { parse_structure_file } from '../structure/parse';
8
+ import { is_trajectory_file, parse_trajectory_data } from '../trajectory/parse';
9
+ import { FERMI_FILE_RE, VOLUMETRIC_EXT_RE, VOLUMETRIC_VASP_RE } from './types';
10
+ import { detect_view_type } from './detect';
11
+ // Maps detect.ts RenderableType to ViewType for direct rendering.
12
+ // Types not listed here fall through to json_browser (which can render all types
13
+ // via its internal mount_into, giving the user a tree view alongside the viz).
14
+ // structure and volumetric have special handling in parse_file_content below.
15
+ const DETECTION_TO_VIEW_TYPE = {
16
+ fermi_surface: `fermi_surface`,
17
+ band_grid: `fermi_surface`,
18
+ convex_hull: `convex_hull`,
19
+ phase_diagram: `phase_diagram`,
20
+ };
21
+ // Convert base64 to ArrayBuffer for binary files
22
+ export function base64_to_array_buffer(base64) {
23
+ const binary = atob(base64);
24
+ const bytes = new Uint8Array(binary.length);
25
+ for (let idx = 0; idx < binary.length; idx++) {
26
+ bytes[idx] = binary.charCodeAt(idx);
27
+ }
28
+ return bytes.buffer;
29
+ }
30
+ // Parse file content and determine if it's a structure or trajectory
31
+ export const parse_file_content = async (content, filename, is_base64 = false) => {
32
+ // Handle base64-encoded compressed/binary files by converting them first
33
+ if (is_base64) {
34
+ let buffer = base64_to_array_buffer(content);
35
+ const compression_format = detect_compression_format(filename);
36
+ if (compression_format) {
37
+ const normalized_filename = filename.replace(COMPRESSION_EXTENSIONS_REGEX, ``);
38
+ if (detect_compression_format(normalized_filename)) {
39
+ throw new Error(`Nested compression is not supported: ${filename}`);
40
+ }
41
+ filename = normalized_filename;
42
+ }
43
+ // Compressed binary formats (e.g. vaspwave.h5.gz as ferrox stores them on S3,
44
+ // or compressed ASE .traj files): decompress to binary first — generic text
45
+ // decompression would corrupt their bytes — so routing sees the inner name.
46
+ const is_binary_format = /\.(?:h5|hdf5|traj)$/i.test(filename);
47
+ if (compression_format === `zip`) {
48
+ const { unzipSync } = await import(`fflate`);
49
+ const payload = Object.entries(unzipSync(new Uint8Array(buffer))).find(([entry_name]) => !entry_name.endsWith(`/`))?.[1];
50
+ if (!payload)
51
+ throw new Error(`ZIP archive contains no files: ${filename}`);
52
+ if (is_binary_format)
53
+ buffer = payload.slice().buffer;
54
+ else
55
+ content = new TextDecoder().decode(payload);
56
+ }
57
+ else if (compression_format) {
58
+ // Unified handling for all supported compression formats
59
+ // Unsupported formats fail here with a clear extraction error
60
+ if (is_binary_format)
61
+ buffer = await decompress_data_binary(buffer, compression_format);
62
+ else
63
+ content = await decompress_data(buffer, compression_format);
64
+ }
65
+ // vaspwave.h5 holds charge density (+ wavefunctions), not a trajectory —
66
+ // route to the volumetric parser so it renders as an isosurface.
67
+ if (is_vaspwave_filename(filename)) {
68
+ const data = await parse_vaspwave_charge(buffer, filename);
69
+ return { type: `isosurface`, data, filename };
70
+ }
71
+ // Binary trajectory formats: pass buffer directly to trajectory parser
72
+ if (is_binary_format) {
73
+ const data = await parse_trajectory_data(buffer, filename);
74
+ // DOS/bands-only vaspout.h5 (e.g. phelel band paths): no frames to animate,
75
+ // route the electronic results to the spectral components instead.
76
+ // Require at least one renderable result rather than trusting the
77
+ // parser's invariant (the metadata cast is unchecked): an empty
78
+ // electronic object would otherwise mount <Dos doses={null}>.
79
+ const electronic = data.metadata?.electronic;
80
+ if (data.frames.length === 0 && (electronic?.dos || electronic?.bands)) {
81
+ return { type: `vaspout_electronic`, filename, data: electronic };
82
+ }
83
+ return { type: `trajectory`, filename, data };
84
+ }
85
+ }
86
+ // Fermi surface files (.bxsf, .frmsf)
87
+ // Use basename for regex matching in case filename retains a directory prefix
88
+ const basename = filename.split(`/`).pop() ?? filename;
89
+ if (FERMI_FILE_RE.test(basename)) {
90
+ // parse_fermi_file throws a descriptive error when parsing fails
91
+ return { type: `fermi_surface`, data: parse_fermi_file(content, filename), filename };
92
+ }
93
+ // Volumetric data files (.cube, CHGCAR, AECCAR*, ELFCAR, LOCPOT, PARCHG)
94
+ if (VOLUMETRIC_EXT_RE.test(basename) || VOLUMETRIC_VASP_RE.test(basename)) {
95
+ const data = parse_volumetric_file(content, filename);
96
+ if (data)
97
+ return { type: `isosurface`, data, filename };
98
+ throw new Error(`Failed to parse volumetric file: ${filename}`);
99
+ }
100
+ let parsed_json;
101
+ let has_parsed_json = false;
102
+ // JSON files: render typed JSON before filename heuristics. Otherwise names like
103
+ // convex-hull.json can be mistaken for trajectory keywords such as nve.
104
+ if (/\.json$/i.test(filename)) {
105
+ try {
106
+ parsed_json = JSON.parse(content);
107
+ has_parsed_json = true;
108
+ // Check if the top-level value matches a known visualization type
109
+ const detected = detect_view_type(parsed_json);
110
+ if (detected) {
111
+ // Structure JSON needs normalization (OPTIMADE, fractional coords, etc.)
112
+ if (detected === `structure`) {
113
+ try {
114
+ const structure = parse_structure_file(content, filename);
115
+ return {
116
+ type: `structure`,
117
+ data: { ...structure, id: filename.replace(/\.[^/.]+$/, ``) },
118
+ filename,
119
+ };
120
+ }
121
+ catch {
122
+ // Detailed parse failed despite structure-like shape — fall through to
123
+ // generic JSON handling below
124
+ }
125
+ }
126
+ // Volumetric JSON needs wrapping in { structure, volumes } for the isosurface renderer
127
+ if (detected === `volumetric`) {
128
+ const vol = parsed_json;
129
+ return {
130
+ type: `isosurface`,
131
+ data: { structure: { sites: [], lattice: vol.lattice }, volumes: [parsed_json] },
132
+ filename,
133
+ };
134
+ }
135
+ return {
136
+ type: DETECTION_TO_VIEW_TYPE[detected] ?? `json_browser`,
137
+ data: parsed_json,
138
+ filename,
139
+ };
140
+ }
141
+ }
142
+ catch {
143
+ // JSON parse failed, fall through to structure parser
144
+ }
145
+ }
146
+ // Try trajectory parsing if it looks like a trajectory
147
+ if (is_trajectory_file(filename, content)) {
148
+ try {
149
+ const data = await parse_trajectory_data(content, filename);
150
+ return { type: `trajectory`, data, filename };
151
+ }
152
+ catch (error) {
153
+ // Trajectory-looking filename but not trajectory-shaped JSON (e.g. nve-config.json):
154
+ // fall through to the JSON browser instead of failing the render
155
+ if (!has_parsed_json)
156
+ throw error;
157
+ }
158
+ }
159
+ // No top-level match -- show JSON browser for navigation
160
+ if (has_parsed_json)
161
+ return { type: `json_browser`, data: parsed_json, filename };
162
+ // Parse as structure (CIF, POSCAR, XYZ, etc.) — throws descriptive reasons on failure
163
+ const structure = parse_structure_file(content, filename);
164
+ // parse_structure_file throws on parse failure but can still return zero atoms (e.g. a
165
+ // CIF with cell params but no _atom_site records), which is invalid downstream
166
+ if (!structure.sites?.length)
167
+ throw new Error(`No atoms found in ${filename}`);
168
+ const data = { ...structure, id: filename.replace(/\.[^/.]+$/, ``) };
169
+ return { type: `structure`, data, filename };
170
+ };
@@ -0,0 +1,24 @@
1
+ import type { BarSeries, DataSeries, DataSeries3D } from '../plot';
2
+ export type PlotType = `scatter` | `scatter3d` | `bar` | `histogram` | `table`;
3
+ export interface ColumnInfo {
4
+ values: unknown[];
5
+ type: `numeric` | `string` | `mixed`;
6
+ n_valid: number;
7
+ }
8
+ export interface AxisMapping {
9
+ x?: string;
10
+ y?: string;
11
+ z?: string;
12
+ color?: string;
13
+ size?: string;
14
+ }
15
+ export declare function extract_columns(data: unknown): Map<string, ColumnInfo>;
16
+ export declare const col_keys: (columns: Map<string, ColumnInfo>, type: ColumnInfo[`type`]) => string[];
17
+ export declare function suggest_mapping(columns: Map<string, ColumnInfo>): {
18
+ plot_type: PlotType;
19
+ mapping: AxisMapping;
20
+ };
21
+ export declare function build_scatter_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): DataSeries;
22
+ export declare function build_scatter3d_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): DataSeries3D;
23
+ export declare function build_bar_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): BarSeries;
24
+ export declare function build_histogram_series(columns: Map<string, ColumnInfo>, mapping: AxisMapping): DataSeries;
@@ -0,0 +1,191 @@
1
+ // Utilities for extracting plottable columns from JSON data and building plot series.
2
+ // Extract columns from row-based or column-based tabular data
3
+ export function extract_columns(data) {
4
+ const columns = new Map();
5
+ if (Array.isArray(data) &&
6
+ data.length > 0 &&
7
+ typeof data[0] === `object` &&
8
+ data[0] !== null) {
9
+ // Row-based: [{ a: 1, b: 'x' }, ...]
10
+ const sample = data.slice(0, 100);
11
+ const all_keys = new Set();
12
+ for (const row of sample) {
13
+ if (row && typeof row === `object`) {
14
+ for (const key of Object.keys(row))
15
+ all_keys.add(key);
16
+ }
17
+ }
18
+ for (const key of all_keys) {
19
+ columns.set(key, classify_column(data.map((row) => row && typeof row === `object` ? row[key] : undefined)));
20
+ }
21
+ }
22
+ else if (data && typeof data === `object` && !Array.isArray(data)) {
23
+ // Column-based: { a: [1,2,3], b: ['x','y','z'] }
24
+ const array_entries = Object.entries(data).filter(([, val]) => Array.isArray(val) && val.length > 0);
25
+ if (array_entries.length < 1)
26
+ return columns;
27
+ const target_len = array_entries[0][1].length;
28
+ for (const [key, val] of array_entries) {
29
+ const arr = val;
30
+ if (arr.length === target_len) {
31
+ columns.set(key, classify_column(arr));
32
+ }
33
+ }
34
+ }
35
+ return columns;
36
+ }
37
+ function classify_column(values) {
38
+ let n_numeric = 0;
39
+ let n_string = 0;
40
+ let n_valid = 0;
41
+ for (const val of values) {
42
+ if (val == null || (typeof val === `number` && !isFinite(val)))
43
+ continue;
44
+ n_valid++;
45
+ if (typeof val === `number`)
46
+ n_numeric++;
47
+ else if (typeof val === `string`)
48
+ n_string++;
49
+ }
50
+ let type = `mixed`;
51
+ if (n_valid > 0) {
52
+ if (n_numeric >= n_valid * 0.8)
53
+ type = `numeric`;
54
+ else if (n_string >= n_valid * 0.8)
55
+ type = `string`;
56
+ }
57
+ return { values, type, n_valid };
58
+ }
59
+ // Extract column keys of a given type from a column map
60
+ export const col_keys = (columns, type) => [...columns.entries()].filter(([, col]) => col.type === type).map(([key]) => key);
61
+ // Well-known column name patterns for heuristic axis assignment
62
+ const X_NAMES = new Set([`x`, `time`, `step`, `index`, `iteration`, `frame`, `epoch`]);
63
+ const Y_NAMES = new Set([`y`, `energy`, `value`, `force`, `stress`, `loss`, `score`]);
64
+ const Z_NAMES = new Set([`z`, `altitude`, `depth`, `height`]);
65
+ // Heuristic: suggest initial axis mapping and plot type from columns
66
+ export function suggest_mapping(columns) {
67
+ const numeric_cols = col_keys(columns, `numeric`);
68
+ const string_cols = col_keys(columns, `string`);
69
+ const mapping = {};
70
+ // Assign x: prefer named numeric match, then string column (bar chart), then first numeric
71
+ const x_match = numeric_cols.find((key) => X_NAMES.has(key.toLowerCase()));
72
+ const x_string_match = string_cols.find((key) => !Y_NAMES.has(key.toLowerCase()));
73
+ mapping.x =
74
+ x_match ?? x_string_match ?? (numeric_cols.length >= 2 ? numeric_cols[0] : undefined);
75
+ // Assign y
76
+ const remaining_numeric = numeric_cols.filter((key) => key !== mapping.x);
77
+ const y_match = remaining_numeric.find((key) => Y_NAMES.has(key.toLowerCase()));
78
+ mapping.y = y_match ?? remaining_numeric[0];
79
+ // Assign z (only if 3+ numeric columns and one matches z-like name)
80
+ const after_xy = remaining_numeric.filter((key) => key !== mapping.y);
81
+ const z_match = after_xy.find((key) => Z_NAMES.has(key.toLowerCase()));
82
+ if (z_match && numeric_cols.length >= 3)
83
+ mapping.z = z_match;
84
+ // Assign color (first unassigned numeric column)
85
+ const used = new Set([mapping.x, mapping.y, mapping.z].filter(Boolean));
86
+ const color_candidate = numeric_cols.find((key) => !used.has(key));
87
+ if (color_candidate)
88
+ mapping.color = color_candidate;
89
+ // Determine plot type
90
+ let plot_type = `scatter`;
91
+ if (mapping.z) {
92
+ plot_type = `scatter3d`;
93
+ }
94
+ else if (mapping.x && columns.get(mapping.x)?.type === `string`) {
95
+ plot_type = `bar`;
96
+ }
97
+ else if ((!mapping.x || !mapping.y) && numeric_cols.length >= 1) {
98
+ plot_type = `histogram`;
99
+ mapping.x ??= mapping.y ?? numeric_cols[0];
100
+ }
101
+ else if (!mapping.x || !mapping.y) {
102
+ plot_type = `table`;
103
+ }
104
+ return { plot_type, mapping };
105
+ }
106
+ // Convert to numbers, preserving array length (non-finite values become NaN)
107
+ const to_numbers = (values) => values.map((val) => (typeof val === `number` && isFinite(val) ? val : NaN));
108
+ // Convert an arbitrary cell value to a display label, JSON-encoding objects so
109
+ // they don't stringify to the useless "[object Object]".
110
+ const to_label = (val) => {
111
+ if (val == null)
112
+ return ``;
113
+ if (typeof val === `string` ||
114
+ typeof val === `number` ||
115
+ typeof val === `boolean` ||
116
+ typeof val === `bigint`)
117
+ return String(val);
118
+ return JSON.stringify(val);
119
+ };
120
+ // Look up a column by its mapping key, returning undefined if unmapped or missing
121
+ const get_col = (columns, key) => key ? columns.get(key) : undefined;
122
+ // Optional numeric conversion for color/size channels
123
+ const optional_numbers = (col) => col ? to_numbers(col.values) : undefined;
124
+ // Filter N axis arrays to only include indices where all axes are finite,
125
+ // keeping optional color/size arrays aligned
126
+ function filter_finite(axes, color, size) {
127
+ const out = axes.map(() => []);
128
+ const color_values = color ? [] : undefined;
129
+ const size_values = size ? [] : undefined;
130
+ for (let idx = 0; idx < axes[0].length; idx++) {
131
+ if (axes.some((arr) => !isFinite(arr[idx])))
132
+ continue;
133
+ for (let dim = 0; dim < axes.length; dim++)
134
+ out[dim].push(axes[dim][idx]);
135
+ if (color && color_values)
136
+ color_values.push(color[idx]);
137
+ if (size && size_values)
138
+ size_values.push(size[idx]);
139
+ }
140
+ return { axes: out, color_values, size_values };
141
+ }
142
+ export function build_scatter_series(columns, mapping) {
143
+ const x_col = get_col(columns, mapping.x);
144
+ const y_col = get_col(columns, mapping.y);
145
+ if (!x_col || !y_col)
146
+ return { x: [], y: [] };
147
+ const { axes: [x, y], color_values, size_values, } = filter_finite([to_numbers(x_col.values), to_numbers(y_col.values)], optional_numbers(get_col(columns, mapping.color)), optional_numbers(get_col(columns, mapping.size)));
148
+ return {
149
+ x,
150
+ y,
151
+ markers: `points`,
152
+ color_values,
153
+ size_values,
154
+ point_style: { radius: 4, fill: `#4c6ef5`, stroke: `white`, stroke_width: 1 },
155
+ };
156
+ }
157
+ export function build_scatter3d_series(columns, mapping) {
158
+ const x_col = get_col(columns, mapping.x);
159
+ const y_col = get_col(columns, mapping.y);
160
+ const z_col = get_col(columns, mapping.z);
161
+ if (!x_col || !y_col || !z_col)
162
+ return { x: [], y: [], z: [] };
163
+ const { axes: [x, y, z], color_values, size_values, } = filter_finite([to_numbers(x_col.values), to_numbers(y_col.values), to_numbers(z_col.values)], optional_numbers(get_col(columns, mapping.color)), optional_numbers(get_col(columns, mapping.size)));
164
+ return { x, y, z, markers: `points`, color_values, size_values };
165
+ }
166
+ export function build_bar_series(columns, mapping) {
167
+ const x_col = get_col(columns, mapping.x);
168
+ const y_col = get_col(columns, mapping.y);
169
+ if (!x_col || !y_col)
170
+ return { x: [], y: [] };
171
+ const raw_y = to_numbers(y_col.values);
172
+ const x = [];
173
+ const y = [];
174
+ for (let idx = 0; idx < raw_y.length; idx++) {
175
+ if (!isFinite(raw_y[idx]))
176
+ continue;
177
+ x.push(to_label(x_col.values[idx]));
178
+ y.push(raw_y[idx]);
179
+ }
180
+ return { x, y, color: `#4c6ef5` };
181
+ }
182
+ export function build_histogram_series(columns, mapping) {
183
+ const col = get_col(columns, mapping.x ?? mapping.y);
184
+ if (!col)
185
+ return { x: [], y: [] };
186
+ const values = to_numbers(col.values).filter(isFinite);
187
+ return {
188
+ x: values.map((_, idx) => idx),
189
+ y: values,
190
+ };
191
+ }
@@ -0,0 +1,4 @@
1
+ export type ViewType = `trajectory` | `structure` | `fermi_surface` | `isosurface` | `convex_hull` | `phase_diagram` | `json_browser` | `vaspout_electronic`;
2
+ export declare const FERMI_FILE_RE: RegExp;
3
+ export declare const VOLUMETRIC_EXT_RE: RegExp;
4
+ export declare const VOLUMETRIC_VASP_RE: RegExp;
@@ -0,0 +1,5 @@
1
+ // Shared file-viewer types and filename patterns.
2
+ // Filename patterns for specialized file types (shared between extension host and webview)
3
+ export const FERMI_FILE_RE = /\.(?:bxsf|frmsf)$/i;
4
+ export const VOLUMETRIC_EXT_RE = /\.cube$/i;
5
+ export const VOLUMETRIC_VASP_RE = /(?:^|[\\/_.-])(?:chgcar|aeccar[012]?|elfcar|locpot|parchg)(?:[\\/_.-]|$)/i;