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
@@ -59,8 +59,7 @@
59
59
 
60
60
  // Convert pressure to log scale slider position (0-100)
61
61
  const pressure_to_slider = (P: number): number =>
62
- ((Math.max(LOG_P_MIN, Math.min(LOG_P_MAX, Math.log10(P))) - LOG_P_MIN) /
63
- LOG_P_RANGE) * 100
62
+ ((Math.max(LOG_P_MIN, Math.min(LOG_P_MAX, Math.log10(P))) - LOG_P_MIN) / LOG_P_RANGE) * 100
64
63
 
65
64
  // Convert slider position (0-100) to pressure
66
65
  const slider_to_pressure = (value: number): number =>
@@ -68,7 +67,7 @@
68
67
 
69
68
  // Format gas name for display (subscript numbers)
70
69
  const format_gas_name = (gas: GasSpecies): string =>
71
- gas.replaceAll(/(\d+)/g, `<sub>$1</sub>`)
70
+ gas.replaceAll(/(?<digits>\d+)/g, `<sub>$1</sub>`)
72
71
 
73
72
  // Format pressure as plain text (no HTML) for the number input
74
73
  function format_pressure(P: number): string {
@@ -102,24 +101,18 @@
102
101
  }
103
102
 
104
103
  function set_pressure_direct(gas: GasSpecies, value: number): void {
105
- const clamped = Math.max(
106
- 10 ** LOG_P_MIN,
107
- Math.min(10 ** LOG_P_MAX, value),
108
- )
104
+ const clamped = Math.max(10 ** LOG_P_MIN, Math.min(10 ** LOG_P_MAX, value))
109
105
  pressures = { ...pressures, [gas]: clamped }
110
106
  }
111
107
  </script>
112
108
 
113
109
  {#if enabled_gases.length > 0}
114
- <div {...rest} class="pressure-controls {position} {rest.class ?? ``}">
110
+ <div {...rest} class={[`pressure-controls`, position, rest.class]}>
115
111
  {#each enabled_gases as gas (gas)}
116
112
  {@const P = get_pressure(gas)}
117
113
  {@const mu = get_mu(gas)}
118
114
  {@const tooltip_content = `${gas} partial pressure for μ(T,P)\nμ = ${format_chemical_potential(mu, 3)}`}
119
- <div
120
- class="pressure-slider"
121
- {@attach tooltip({ content: tooltip_content })}
122
- >
115
+ <div class="pressure-slider" {@attach tooltip({ content: tooltip_content })}>
123
116
  <label class="pressure-label">
124
117
  <input
125
118
  type="text"
@@ -3,7 +3,7 @@
3
3
  import { get_electro_neg_formula } from '../composition'
4
4
  import Icon from '../Icon.svelte'
5
5
  import { format_num } from '../labels'
6
- import { DragControlTab } from '../overlays'
6
+ import { DragControlTab, GlassChip } from '../overlays'
7
7
  import { sanitize_formula } from '../sanitize'
8
8
  import { Structure } from '../structure'
9
9
  import type { StructurePopupContext, StructurePopupStats } from './types'
@@ -17,6 +17,8 @@
17
17
  width = 500,
18
18
  height = 400,
19
19
  onclose,
20
+ close_on_outside = true,
21
+ show_drag_handle = true,
20
22
  stats,
21
23
  top_left,
22
24
  children,
@@ -28,14 +30,17 @@
28
30
  width?: number
29
31
  height?: number
30
32
  onclose?: () => void
33
+ close_on_outside?: boolean
34
+ show_drag_handle?: boolean
31
35
  stats?: StructurePopupStats
32
36
  top_left?: Snippet<[StructurePopupContext]>
33
37
  children?: Snippet<[StructurePopupContext]>
34
38
  popup_div?: HTMLDivElement
35
39
  } = $props()
36
40
 
37
- const formula_html = $derived.by(() =>
38
- sanitize_formula(get_electro_neg_formula(stats?.formula ?? structure, true)))
41
+ const formula_html = $derived(
42
+ sanitize_formula(get_electro_neg_formula(stats?.formula ?? structure, true)),
43
+ )
39
44
  const context = $derived({ structure, stats, formula_html })
40
45
  </script>
41
46
 
@@ -48,6 +53,7 @@
48
53
  <svelte:window
49
54
  onkeydown={(event) => event.key === `Escape` && onclose?.()}
50
55
  onmousedown={(event) => {
56
+ if (!close_on_outside) return
51
57
  if (!popup_div || !(event.target instanceof Node)) return
52
58
  if (!popup_div.contains(event.target)) onclose?.()
53
59
  }}
@@ -58,34 +64,36 @@
58
64
  handle_selector: `.drag-handle`,
59
65
  })}
60
66
  {...rest}
61
- class="structure-popup {place_right ? `right` : `left`} {rest.class ?? ``}"
67
+ class={[`structure-popup`, place_right ? `right` : `left`, rest.class]}
62
68
  role="dialog"
63
69
  aria-modal="true"
64
70
  tabindex="-1"
65
71
  bind:this={popup_div}
66
72
  >
67
- <DragControlTab />
73
+ {#if show_drag_handle}
74
+ <DragControlTab />
75
+ {/if}
68
76
  <div class="structure-popup-content">
69
77
  {#if top_left || stats}
70
- <div class="structure-stats">
78
+ <GlassChip class="structure-stats">
71
79
  {#if top_left}
72
80
  {@render top_left(context)}
73
81
  {:else if stats}
74
82
  {#if stats.id}
75
- ID = {stats.id}<br>
83
+ ID = {stats.id}<br />
76
84
  {/if}
77
85
  {#if formula_html}
78
- {@html formula_html}<br>
86
+ {@html formula_html}<br />
79
87
  {/if}
80
88
  {#if stats.e_above_hull != null}
81
- E<sub>above hull</sub> = {format_num(stats.e_above_hull, `.3~`)} eV/atom<br>
89
+ E<sub>above hull</sub> = {format_num(stats.e_above_hull, `.3~`)} eV/atom<br />
82
90
  {/if}
83
91
  {#if stats.e_form != null}
84
92
  E<sub>form</sub> = {format_num(stats.e_form, `.3~`)}
85
93
  eV/atom
86
94
  {/if}
87
95
  {/if}
88
- </div>
96
+ </GlassChip>
89
97
  {/if}
90
98
 
91
99
  <Structure
@@ -136,16 +144,4 @@
136
144
  .close-btn:hover {
137
145
  background: var(--pane-btn-bg-hover);
138
146
  }
139
- .structure-stats {
140
- position: absolute;
141
- top: 10px;
142
- left: 10px;
143
- background: transparent;
144
- backdrop-filter: blur(8px);
145
- color: var(--text-color);
146
- padding: 4px 8px;
147
- border-radius: 6px;
148
- font-size: 0.85em;
149
- z-index: 2;
150
- }
151
147
  </style>
@@ -8,6 +8,8 @@ type $$ComponentProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
8
8
  width?: number;
9
9
  height?: number;
10
10
  onclose?: () => void;
11
+ close_on_outside?: boolean;
12
+ show_drag_handle?: boolean;
11
13
  stats?: StructurePopupStats;
12
14
  top_left?: Snippet<[StructurePopupContext]>;
13
15
  children?: Snippet<[StructurePopupContext]>;
@@ -16,15 +16,11 @@
16
16
  let last_update_time = 0
17
17
  const THROTTLE_MS = 100
18
18
 
19
- const temp_index = $derived(
20
- Math.max(0, available_temperatures.indexOf(temperature)),
21
- )
19
+ const temp_index = $derived(Math.max(0, available_temperatures.indexOf(temperature)))
22
20
  const display_index = $derived(preview_index ?? temp_index)
23
21
  const display_temp = $derived(available_temperatures[display_index] ?? temperature)
24
22
 
25
- function handle_slider_input(
26
- event: Event & { currentTarget: HTMLInputElement },
27
- ): void {
23
+ function handle_slider_input(event: Event & { currentTarget: HTMLInputElement }): void {
28
24
  const new_index = Number(event.currentTarget.value)
29
25
  preview_index = new_index
30
26
  // Throttle parent updates during drag to prevent scene flashing
@@ -35,9 +31,7 @@
35
31
  }
36
32
  }
37
33
 
38
- function handle_slider_end(
39
- event: Event & { currentTarget: HTMLInputElement },
40
- ): void {
34
+ function handle_slider_end(event: Event & { currentTarget: HTMLInputElement }): void {
41
35
  const new_temp = available_temperatures[Number(event.currentTarget.value)]
42
36
  if (new_temp !== undefined) temperature = new_temp
43
37
  preview_index = null
@@ -53,7 +47,7 @@
53
47
 
54
48
  <div
55
49
  {...rest}
56
- class="temperature-slider {rest.class ?? ``}"
50
+ class={[`temperature-slider`, rest.class]}
57
51
  {@attach tooltip({ content: `Temperature for G(T) free energies` })}
58
52
  >
59
53
  <label class="temp-label">
@@ -123,7 +123,8 @@ export function create_canvas_interactions(inputs) {
123
123
  };
124
124
  const handle_wheel = (event) => {
125
125
  event.preventDefault();
126
- inputs.set_zoom(Math.max(zoom_min, Math.min(zoom_max, inputs.zoom() * (event.deltaY > 0 ? 0.98 : 1.02))));
126
+ const zoomed = inputs.zoom() * (event.deltaY > 0 ? 0.98 : 1.02);
127
+ inputs.set_zoom(Math.max(zoom_min, Math.min(zoom_max, zoomed)));
127
128
  };
128
129
  const handle_hover = (event) => {
129
130
  if (is_dragging)
@@ -24,47 +24,23 @@ export const GAS_STOICHIOMETRY = {
24
24
  CO2: { C: 1, O: 2 },
25
25
  H2O: { H: 2, O: 1 },
26
26
  };
27
- // Default T*S data for common gases (in eV/molecule)
27
+ // Default Thermodynamic Data (abstracted - users can provide their own)
28
+ // Temperature grid (K) shared by all tabulated T*S data below
29
+ // oxfmt-ignore
30
+ const TS_TEMPERATURES = [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000];
31
+ // Default T*S values (eV/molecule) at TS_TEMPERATURES, interpolated between grid points.
28
32
  // Source: Barin Thermochemical Tables and NBS Thermochemical Tables
29
33
  // Data compiled to match PIRO (https://github.com/GENESIS-EFRC/piro)
30
- // Note: These values are T*S in eV/molecule
34
+ // F2 not in Barin/NBS tables used by PIRO - approximated from similar homonuclear diatomics (O2, N2)
31
35
  // oxfmt-ignore
32
36
  const DEFAULT_TS_DATA = {
33
- O2: {
34
- temperatures: [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
35
- values: [0, 0.317, 0.3192, 0.4433, 0.5718, 0.7041, 0.8396, 0.9781, 1.119, 1.2623, 1.4075, 1.5547, 1.7036, 1.8541, 2.006, 2.1594, 2.3141, 2.47, 2.6271, 2.7854],
36
- },
37
- H2: {
38
- temperatures: [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
39
- values: [0, 0.2019, 0.2034, 0.2886, 0.3776, 0.4697, 0.5645, 0.6614, 0.7605, 0.8614, 0.964, 1.0683, 1.1741, 1.2815, 1.3902, 1.5003, 1.6116, 1.7242, 1.838, 1.9528],
40
- },
41
- N2: {
42
- temperatures: [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
43
- values: [0, 0.2959, 0.2981, 0.4149, 0.5356, 0.6596, 0.7866, 0.9161, 1.0481, 1.1822, 1.3184, 1.4563, 1.596, 1.7372, 1.8799, 2.0239, 2.1693, 2.3158, 2.4634, 2.6122],
44
- },
45
- CO: {
46
- temperatures: [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
47
- values: [0, 0.3054, 0.3076, 0.4275, 0.5515, 0.6788, 0.8092, 0.9423, 1.0778, 1.2155, 1.3552, 1.4967, 1.64, 1.7848, 1.9311, 2.0788, 2.2277, 2.3779, 2.5291, 2.6815],
48
- },
49
- CO2: {
50
- temperatures: [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
51
- values: [0, 0.2202, 0.2218, 0.3113, 0.4057, 0.5042, 0.6064, 0.7116, 0.8197, 0.9303, 1.0432, 1.1582, 1.2751, 1.3938, 1.5141, 1.636, 1.7593, 1.8839, 2.0098, 2.1369],
52
- },
53
- H2O: {
54
- temperatures: [0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
55
- values: [0, 0.1946, 0.1961, 0.2749, 0.357, 0.4419, 0.5293, 0.6189, 0.7107, 0.8045, 0.9001, 0.9975, 1.0966, 1.1972, 1.2994, 1.403, 1.5079, 1.6142, 1.7216, 1.8303],
56
- },
57
- F2: {
58
- // F2 not in Barin/NBS tables used by PIRO - approximated from similar homonuclear diatomics (O2, N2)
59
- temperatures: [
60
- 0, 298, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600,
61
- 1700, 1800, 1900, 2000,
62
- ],
63
- values: [
64
- 0, 0.31, 0.312, 0.435, 0.56, 0.69, 0.82, 0.96, 1.1, 1.24, 1.38, 1.53, 1.68, 1.83,
65
- 1.98, 2.13, 2.29, 2.45, 2.61, 2.77,
66
- ],
67
- },
37
+ O2: [0, 0.317, 0.3192, 0.4433, 0.5718, 0.7041, 0.8396, 0.9781, 1.119, 1.2623, 1.4075, 1.5547, 1.7036, 1.8541, 2.006, 2.1594, 2.3141, 2.47, 2.6271, 2.7854],
38
+ H2: [0, 0.2019, 0.2034, 0.2886, 0.3776, 0.4697, 0.5645, 0.6614, 0.7605, 0.8614, 0.964, 1.0683, 1.1741, 1.2815, 1.3902, 1.5003, 1.6116, 1.7242, 1.838, 1.9528],
39
+ N2: [0, 0.2959, 0.2981, 0.4149, 0.5356, 0.6596, 0.7866, 0.9161, 1.0481, 1.1822, 1.3184, 1.4563, 1.596, 1.7372, 1.8799, 2.0239, 2.1693, 2.3158, 2.4634, 2.6122],
40
+ CO: [0, 0.3054, 0.3076, 0.4275, 0.5515, 0.6788, 0.8092, 0.9423, 1.0778, 1.2155, 1.3552, 1.4967, 1.64, 1.7848, 1.9311, 2.0788, 2.2277, 2.3779, 2.5291, 2.6815],
41
+ CO2: [0, 0.2202, 0.2218, 0.3113, 0.4057, 0.5042, 0.6064, 0.7116, 0.8197, 0.9303, 1.0432, 1.1582, 1.2751, 1.3938, 1.5141, 1.636, 1.7593, 1.8839, 2.0098, 2.1369],
42
+ H2O: [0, 0.1946, 0.1961, 0.2749, 0.357, 0.4419, 0.5293, 0.6189, 0.7107, 0.8045, 0.9001, 0.9975, 1.0966, 1.1972, 1.2994, 1.403, 1.5079, 1.6142, 1.7216, 1.8303],
43
+ F2: [0, 0.31, 0.312, 0.435, 0.56, 0.69, 0.82, 0.96, 1.1, 1.24, 1.38, 1.53, 1.68, 1.83, 1.98, 2.13, 2.29, 2.45, 2.61, 2.77],
68
44
  };
69
45
  // Formation enthalpies H_f at 0K in eV/molecule
70
46
  // These are the reference energies for formation from elements
@@ -76,27 +52,19 @@ const DEFAULT_ENTHALPY = {
76
52
  H2O: -0.82547,
77
53
  // O2, N2, H2, F2 are reference states with H_f = 0
78
54
  };
79
- // Interpolation Helpers
80
- // Linearly interpolate T*S value at given temperature
81
- function interpolate_ts(data, T) {
82
- const { temperatures, values } = data;
83
- // Clamp to valid range
84
- if (T <= temperatures[0])
55
+ // Linearly interpolate T*S value at given temperature (clamped to the tabulated range)
56
+ function interpolate_ts(values, T) {
57
+ const temps = TS_TEMPERATURES;
58
+ if (T <= temps[0])
85
59
  return values[0];
86
- if (T >= temperatures[temperatures.length - 1]) {
60
+ if (T >= temps[temps.length - 1])
87
61
  return values[values.length - 1];
88
- }
89
62
  // Find bracketing indices
90
63
  let idx = 0;
91
- while (idx < temperatures.length - 1 && temperatures[idx + 1] < T)
64
+ while (idx < temps.length - 1 && temps[idx + 1] < T)
92
65
  idx++;
93
- const T_low = temperatures[idx];
94
- const T_high = temperatures[idx + 1];
95
- const v_low = values[idx];
96
- const v_high = values[idx + 1];
97
- // Linear interpolation
98
- const fraction = (T - T_low) / (T_high - T_low);
99
- return v_low + fraction * (v_high - v_low);
66
+ const fraction = (T - temps[idx]) / (temps[idx + 1] - temps[idx]);
67
+ return values[idx] + fraction * (values[idx + 1] - values[idx]);
100
68
  }
101
69
  // Default Provider Implementation
102
70
  // Create the default gas thermodynamics provider using built-in data
@@ -3,12 +3,11 @@ import type { EnergyModeInfo } from './';
3
3
  import type { ElementSymbol } from '../element';
4
4
  import type { AnyStructure } from '../structure';
5
5
  import type { ConvexHullConfig, EntryCategoryConfig, GasAnalysis, GasThermodynamicsConfig, HighlightStyle, MarkerSymbol, PhaseData } from './types';
6
- import { DEFAULT_GAS_TEMP } from './types';
7
- export { DEFAULT_GAS_TEMP };
6
+ export { DEFAULT_GAS_TEMP } from './types';
8
7
  export declare const HULL_STABILITY_TOL = 0.000001;
9
- export declare function compute_hull_stability(raw_distance: number, exclude_from_hull?: boolean, tol?: number): {
10
- e_above_hull: number;
11
- is_stable: boolean;
8
+ export declare function compute_hull_stability(raw_distance: number | null | undefined, exclude_from_hull?: boolean, tol?: number): {
9
+ e_above_hull: number | undefined;
10
+ is_stable: boolean | undefined;
12
11
  };
13
12
  type StabilityEntry = {
14
13
  is_stable?: boolean;
@@ -17,8 +16,11 @@ type StabilityEntry = {
17
16
  export declare const extract_structure_from_entry: (entries: PhaseData[], entry: {
18
17
  entry_id?: string;
19
18
  }) => AnyStructure | null;
19
+ export declare const array_min: (values: readonly number[]) => number;
20
+ export declare const array_max: (values: readonly number[]) => number;
20
21
  export declare const hull_distance_range: (entries: PhaseData[]) => [number, number];
21
22
  export declare const entry_is_stable: (entry: StabilityEntry, tol?: number) => boolean;
23
+ export declare const entry_within_hull_dist: (entry: StabilityEntry, max_dist: number) => boolean;
22
24
  export declare const is_on_hull: (entry: PhaseData, tol?: number) => boolean;
23
25
  export declare const get_arity: (entry: PhaseData) => number;
24
26
  export declare const is_unary_entry: (entry: PhaseData) => boolean;
@@ -142,8 +144,4 @@ export declare function get_gas_corrected_entries(entries: PhaseData[], gas_conf
142
144
  analysis: GasAnalysis;
143
145
  merged_config: GasThermodynamicsConfig | undefined;
144
146
  };
145
- export declare function get_entry_label(entry: {
146
- reduced_formula?: string;
147
- name?: string;
148
- composition: Record<string, number>;
149
- }, elements?: ElementSymbol[]): string;
147
+ export declare function get_entry_label(entry: Pick<PhaseData, `reduced_formula` | `name` | `composition`>, elements?: ElementSymbol[]): string;
@@ -3,14 +3,19 @@ import { ELEM_SYMBOL_TO_NAME } from '../composition';
3
3
  import { format_fractional, format_num, symbol_map } from '../labels';
4
4
  import { scaleSequential } from 'd3-scale';
5
5
  import { symbol } from 'd3-shape';
6
- import { analyze_gas_data as _analyze_gas_data, apply_gas_corrections as _apply_gas_corrections, } from './gas-thermodynamics';
7
- import { DEFAULT_GAS_TEMP, MAGNETIC_ORDERING_CATEGORY } from './types';
8
- export { DEFAULT_GAS_TEMP };
6
+ import { analyze_gas_data, apply_gas_corrections } from './gas-thermodynamics';
7
+ import { MAGNETIC_ORDERING_CATEGORY } from './types';
8
+ export { DEFAULT_GAS_TEMP } from './types';
9
9
  // Tolerance for classifying a phase as on the convex hull (eV/atom)
10
10
  export const HULL_STABILITY_TOL = 1e-6;
11
11
  // Clamp raw hull distance and compute stability for a single entry.
12
12
  // Excluded entries keep their raw (possibly negative) distance and are never stable.
13
13
  export function compute_hull_stability(raw_distance, exclude_from_hull, tol = HULL_STABILITY_TOL) {
14
+ // unknown distance (degenerate hull / point outside hull projection / missing energy):
15
+ // not 0/stable — leave both undefined so it isn't mislabeled on-hull
16
+ if (raw_distance == null || !Number.isFinite(raw_distance)) {
17
+ return { e_above_hull: undefined, is_stable: undefined };
18
+ }
14
19
  if (exclude_from_hull)
15
20
  return { e_above_hull: raw_distance, is_stable: false };
16
21
  const e_above_hull = Math.abs(raw_distance) < tol ? 0 : Math.max(0, raw_distance);
@@ -24,15 +29,23 @@ export const extract_structure_from_entry = (entries, entry) => {
24
29
  const orig_entry = entries.find((ent) => ent.entry_id === entry.entry_id);
25
30
  return orig_entry?.structure || null;
26
31
  };
27
- // [min, max] energy above hull across entries, for ColorBar ranges (max floored at 0.1)
32
+ // Loop-based min/max Math.min/max(...arr) blows the stack on large (>~100k) arrays
33
+ export const array_min = (values) => values.reduce((min, val) => (val < min ? val : min), Infinity);
34
+ export const array_max = (values) => values.reduce((max, val) => (val > max ? val : max), -Infinity);
35
+ // [min, max] energy above hull across entries, for ColorBar ranges (max floored at 0.1).
36
+ // Filter to finite values: NaN/undefined distances would otherwise produce a broken range.
28
37
  export const hull_distance_range = (entries) => {
29
38
  const dists = entries
30
39
  .map((entry) => entry.e_above_hull)
31
- .filter((val) => typeof val === `number`);
32
- return dists.length > 0 ? [Math.min(...dists), Math.max(...dists, 0.1)] : [0, 0.1];
40
+ .filter((val) => typeof val === `number` && Number.isFinite(val));
41
+ return dists.length > 0 ? [array_min(dists), Math.max(array_max(dists), 0.1)] : [0, 0.1];
33
42
  };
34
43
  export const entry_is_stable = (entry, tol = HULL_STABILITY_TOL) => entry.is_stable === true ||
35
44
  (entry.is_stable !== false && Math.abs(entry.e_above_hull ?? Infinity) <= tol);
45
+ // Whether to plot an entry at a given max hull distance: stable, or a finite distance
46
+ // within max_dist. Unknown distance (undefined) is excluded, not treated as 0/stable.
47
+ export const entry_within_hull_dist = (entry, max_dist) => entry_is_stable(entry) ||
48
+ (typeof entry.e_above_hull === `number` && entry.e_above_hull <= max_dist);
36
49
  // Check if entry is on the convex hull (stable or e_above_hull ≈ 0)
37
50
  export const is_on_hull = (entry, tol = HULL_STABILITY_TOL) => !entry.exclude_from_hull && entry_is_stable(entry, tol);
38
51
  export const get_arity = (entry) => Object.values(entry.composition).filter((count) => count > 0).length;
@@ -211,15 +224,9 @@ export function build_entry_tooltip_text(entry, category = MAGNETIC_ORDERING_CAT
211
224
  ? `${elem_symbol}${elem_name ? ` (${elem_name})` : ``}\n`
212
225
  : `${entry.name ?? entry.reduced_formula ?? ``}\n`;
213
226
  if (!is_element) {
214
- const total = Object.values(entry.composition).reduce((sum, amt) => sum + amt, 0);
215
- if (total > 0) {
216
- const fractions = Object.entries(entry.composition)
217
- .filter(([, amt]) => amt > 0)
218
- .map(([el, amt]) => `${el}: ${format_fractional(amt / total)}`);
219
- if (fractions.length > 1) {
220
- text += `Composition: ${fractions.join(`, `)}\n`;
221
- }
222
- }
227
+ const fractions = Object.entries(get_fractional_composition(entry.composition)).map(([elem, frac]) => `${elem}: ${format_fractional(frac)}`);
228
+ if (fractions.length > 1)
229
+ text += `Composition: ${fractions.join(`, `)}\n`;
223
230
  }
224
231
  if (entry.e_above_hull !== undefined) {
225
232
  const e_hull_str = format_num(entry.e_above_hull, `.3~`);
@@ -283,28 +290,22 @@ energy_source_mode) {
283
290
  for (const el of Object.keys(entry.composition))
284
291
  elements_in_entries.add(el);
285
292
  }
286
- let can_compute_e_form = true;
287
- for (const el of elements_in_entries) {
288
- if (!unary_refs[el]) {
289
- can_compute_e_form = false;
290
- break;
291
- }
292
- }
293
- const can_compute_hull = can_compute_e_form;
293
+ const can_compute_e_form = [...elements_in_entries].every((el) => el in unary_refs);
294
294
  // Resolve mode to avoid inconsistent states:
295
295
  // - If full precomputed available, honor user toggle
296
- // - Else if we can compute both, use on-the-fly automatically
296
+ // - Else if we can compute, use on-the-fly automatically
297
297
  // - Else fall back to precomputed (best-effort)
298
298
  const energy_mode = has_precomputed_e_form && has_precomputed_hull
299
299
  ? energy_source_mode
300
- : can_compute_e_form && can_compute_hull
300
+ : can_compute_e_form
301
301
  ? `on-the-fly`
302
302
  : `precomputed`;
303
303
  return {
304
304
  has_precomputed_e_form,
305
305
  has_precomputed_hull,
306
306
  can_compute_e_form,
307
- can_compute_hull,
307
+ // hull needs the same unary references as e_form, so the two always agree
308
+ can_compute_hull: can_compute_e_form,
308
309
  energy_mode,
309
310
  unary_refs,
310
311
  };
@@ -752,8 +753,7 @@ export function filter_entries_at_temperature(entries, T, options = {}) {
752
753
  return [{ ...entry, energy, energy_per_atom: energy }];
753
754
  }
754
755
  }
755
- // Exclude entry (has temp data but can't get energy at T)
756
- return [];
756
+ return []; // Exclude entry (has temp data but can't get energy at T)
757
757
  });
758
758
  }
759
759
  // Get gas-corrected entries in one call (consolidates analysis + correction)
@@ -762,29 +762,23 @@ export function filter_entries_at_temperature(entries, T, options = {}) {
762
762
  // if no gas config or no relevant gases.
763
763
  export function get_gas_corrected_entries(entries, gas_config, gas_pressures, temperature) {
764
764
  if (!gas_config?.enabled_gases?.length) {
765
- return {
766
- entries,
767
- analysis: {
768
- has_gas_dependent_elements: false,
769
- gas_elements: [],
770
- relevant_gases: [],
771
- },
772
- merged_config: undefined,
765
+ const analysis = {
766
+ has_gas_dependent_elements: false,
767
+ gas_elements: [],
768
+ relevant_gases: [],
773
769
  };
770
+ return { entries, analysis, merged_config: undefined };
774
771
  }
775
772
  const merged_config = {
776
773
  ...gas_config,
777
774
  pressures: { ...gas_config.pressures, ...gas_pressures },
778
775
  };
779
- const analysis = _analyze_gas_data(entries, merged_config);
776
+ const analysis = analyze_gas_data(entries, merged_config);
780
777
  if (!analysis.has_gas_dependent_elements) {
781
778
  return { entries, analysis, merged_config };
782
779
  }
783
- return {
784
- entries: _apply_gas_corrections(entries, merged_config, temperature),
785
- analysis,
786
- merged_config,
787
- };
780
+ const corr_entries = apply_gas_corrections(entries, merged_config, temperature);
781
+ return { entries: corr_entries, analysis, merged_config };
788
782
  }
789
783
  // Derive a display label for a convex hull entry, falling back to composition
790
784
  // when reduced_formula and name are both missing.
@@ -793,7 +787,7 @@ export function get_entry_label(entry, elements) {
793
787
  return entry.reduced_formula;
794
788
  if (entry.name)
795
789
  return entry.name;
796
- let pairs = Object.entries(entry.composition).filter(([, amt]) => amt > 0);
790
+ let pairs = Object.entries(entry.composition).filter(([, amt]) => (amt ?? 0) > 0);
797
791
  if (elements) {
798
792
  pairs = pairs.sort(([el1], [el2]) => elements.indexOf(el1) - elements.indexOf(el2));
799
793
  }
@@ -36,7 +36,7 @@ export declare function create_hull_data_pipeline<Entry extends PhaseData>(input
36
36
  })[];
37
37
  readonly pd_data: import("./types").ProcessedPhaseData;
38
38
  readonly polymorph_stats_map: Map<string, helpers.PolymorphStats>;
39
- readonly elements: ("S" | "K" | "B" | "H" | "He" | "Li" | "Be" | "C" | "N" | "O" | "F" | "Ne" | "Na" | "Mg" | "Al" | "Si" | "P" | "Cl" | "Ar" | "Ca" | "Sc" | "Ti" | "V" | "Cr" | "Mn" | "Fe" | "Co" | "Ni" | "Cu" | "Zn" | "Ga" | "Ge" | "As" | "Se" | "Br" | "Kr" | "Rb" | "Sr" | "Y" | "Zr" | "Nb" | "Mo" | "Tc" | "Ru" | "Rh" | "Pd" | "Ag" | "Cd" | "In" | "Sn" | "Sb" | "Te" | "I" | "Xe" | "Cs" | "Ba" | "La" | "Ce" | "Pr" | "Nd" | "Pm" | "Sm" | "Eu" | "Gd" | "Tb" | "Dy" | "Ho" | "Er" | "Tm" | "Yb" | "Lu" | "Hf" | "Ta" | "W" | "Re" | "Os" | "Ir" | "Pt" | "Au" | "Hg" | "Tl" | "Pb" | "Bi" | "Po" | "At" | "Rn" | "Fr" | "Ra" | "Ac" | "Th" | "Pa" | "U" | "Np" | "Pu" | "Am" | "Cm" | "Bk" | "Cf" | "Es" | "Fm" | "Md" | "No" | "Lr" | "Rf" | "Db" | "Sg" | "Bh" | "Hs" | "Mt" | "Ds" | "Rg" | "Cn" | "Nh" | "Fl" | "Mc" | "Lv" | "Ts" | "Og")[];
39
+ readonly elements: ("Ac" | "Ag" | "Al" | "Am" | "Ar" | "As" | "At" | "Au" | "B" | "Ba" | "Be" | "Bh" | "Bi" | "Bk" | "Br" | "C" | "Ca" | "Cd" | "Ce" | "Cf" | "Cl" | "Cm" | "Co" | "Cr" | "Cs" | "Cu" | "Db" | "Dy" | "Er" | "Es" | "Eu" | "F" | "Fe" | "Fm" | "Fr" | "Ga" | "Gd" | "Ge" | "H" | "He" | "Hf" | "Hg" | "Ho" | "Hs" | "I" | "In" | "Ir" | "K" | "Kr" | "La" | "Li" | "Lr" | "Lu" | "Md" | "Mg" | "Mn" | "Mo" | "Mt" | "N" | "Na" | "Nb" | "Nd" | "Ne" | "Ni" | "No" | "Np" | "O" | "Os" | "P" | "Pa" | "Pb" | "Pd" | "Pm" | "Po" | "Pr" | "Pt" | "Pu" | "Ra" | "Rb" | "Re" | "Rf" | "Rh" | "Rn" | "Ru" | "S" | "Sb" | "Sc" | "Se" | "Sg" | "Si" | "Sm" | "Sn" | "Sr" | "Ta" | "Tb" | "Tc" | "Te" | "Th" | "Ti" | "Tl" | "Tm" | "U" | "V" | "W" | "Xe" | "Y" | "Yb" | "Zn" | "Zr" | "Ds" | "Rg" | "Cn" | "Nh" | "Fl" | "Mc" | "Lv" | "Ts" | "Og")[];
40
40
  readonly max_hull_dist_in_data: number;
41
41
  readonly auto_default_threshold: number;
42
42
  readonly plot_entries: Entry[];