matterviz 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (852) hide show
  1. package/.vscode/launch.json +13 -0
  2. package/.vscodeignore +7 -0
  3. package/dist/assets/STLExporter-BpTH3YHE.js +8 -0
  4. package/dist/assets/browser-DdDecX_W.js +1 -0
  5. package/dist/assets/export-qgn-H9y6.js +2 -0
  6. package/dist/assets/main-DiKYzti2.css +1 -0
  7. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  8. package/dist/extension.js +31293 -0
  9. package/dist/src/lib/FilePicker.svelte +360 -0
  10. package/dist/src/lib/MillerIndexInput.svelte +66 -0
  11. package/dist/src/lib/api/mp.ts +26 -0
  12. package/dist/src/lib/api/optimade.ts +204 -0
  13. package/dist/src/lib/app.css +247 -0
  14. package/dist/src/lib/brillouin/BrillouinZone.svelte +549 -0
  15. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +146 -0
  17. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  18. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +476 -0
  19. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +92 -0
  20. package/dist/src/lib/brillouin/compute.ts +529 -0
  21. package/dist/src/lib/brillouin/index.ts +8 -0
  22. package/dist/src/lib/brillouin/types.ts +51 -0
  23. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +327 -0
  24. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
  25. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
  26. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +94 -0
  27. package/dist/src/lib/chempot-diagram/chempot-worker.ts +11 -0
  28. package/dist/src/lib/chempot-diagram/color.ts +42 -0
  29. package/dist/src/lib/chempot-diagram/compute.ts +1014 -0
  30. package/dist/src/lib/chempot-diagram/index.ts +6 -0
  31. package/dist/src/lib/chempot-diagram/pointer.ts +56 -0
  32. package/dist/src/lib/chempot-diagram/temperature.ts +77 -0
  33. package/dist/src/lib/chempot-diagram/types.ts +130 -0
  34. package/dist/src/lib/colors/index.ts +249 -0
  35. package/dist/src/lib/composition/BarChart.svelte +297 -0
  36. package/dist/src/lib/composition/BubbleChart.svelte +218 -0
  37. package/dist/src/lib/composition/Composition.svelte +165 -0
  38. package/dist/src/lib/composition/Formula.svelte +268 -0
  39. package/dist/src/lib/composition/FormulaFilter.svelte +1257 -0
  40. package/dist/src/lib/composition/PieChart.svelte +323 -0
  41. package/dist/src/lib/composition/format.ts +155 -0
  42. package/dist/src/lib/composition/index.ts +37 -0
  43. package/dist/src/lib/composition/parse.ts +605 -0
  44. package/dist/src/lib/constants.ts +134 -0
  45. package/dist/src/lib/controls.ts +42 -0
  46. package/dist/src/lib/convex-hull/ConvexHull.svelte +157 -0
  47. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +825 -0
  48. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +1801 -0
  49. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +1398 -0
  50. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +535 -0
  51. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +125 -0
  52. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +929 -0
  53. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +131 -0
  54. package/dist/src/lib/convex-hull/GasPressureControls.svelte +247 -0
  55. package/dist/src/lib/convex-hull/StructurePopup.svelte +151 -0
  56. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +140 -0
  57. package/dist/src/lib/convex-hull/barycentric-coords.ts +246 -0
  58. package/dist/src/lib/convex-hull/demo-temperature.ts +63 -0
  59. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +405 -0
  60. package/dist/src/lib/convex-hull/helpers.ts +932 -0
  61. package/dist/src/lib/convex-hull/index.ts +202 -0
  62. package/dist/src/lib/convex-hull/thermodynamics.ts +2192 -0
  63. package/dist/src/lib/convex-hull/types.ts +267 -0
  64. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +311 -0
  65. package/dist/src/lib/coordination/calc-coordination.ts +93 -0
  66. package/dist/src/lib/coordination/index.ts +9 -0
  67. package/dist/src/lib/effects.svelte.ts +48 -0
  68. package/dist/src/lib/element/BohrAtom.svelte +147 -0
  69. package/dist/src/lib/element/ElementHeading.svelte +26 -0
  70. package/dist/src/lib/element/ElementPhoto.svelte +57 -0
  71. package/dist/src/lib/element/ElementStats.svelte +80 -0
  72. package/dist/src/lib/element/ElementTile.svelte +484 -0
  73. package/dist/src/lib/element/data.json.gz.d.ts +4 -0
  74. package/dist/src/lib/element/data.ts +14 -0
  75. package/dist/src/lib/element/index.ts +8 -0
  76. package/dist/src/lib/element/types.ts +62 -0
  77. package/dist/src/lib/feedback/ClickFeedback.svelte +58 -0
  78. package/dist/src/lib/feedback/DragOverlay.svelte +42 -0
  79. package/dist/src/lib/feedback/index.ts +4 -0
  80. package/dist/src/lib/fermi-surface/FermiSlice.svelte +189 -0
  81. package/dist/src/lib/fermi-surface/FermiSurface.svelte +600 -0
  82. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +448 -0
  83. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +794 -0
  84. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
  85. package/dist/src/lib/fermi-surface/compute.ts +728 -0
  86. package/dist/src/lib/fermi-surface/constants.ts +32 -0
  87. package/dist/src/lib/fermi-surface/export.ts +64 -0
  88. package/dist/src/lib/fermi-surface/index.ts +14 -0
  89. package/dist/src/lib/fermi-surface/marching-cubes.ts +3 -0
  90. package/dist/src/lib/fermi-surface/parse.ts +574 -0
  91. package/dist/src/lib/fermi-surface/symmetry.ts +56 -0
  92. package/dist/src/lib/fermi-surface/types.ts +159 -0
  93. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
  94. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  95. package/dist/src/lib/heatmap-matrix/index.ts +167 -0
  96. package/dist/src/lib/heatmap-matrix/shared.ts +7 -0
  97. package/dist/src/lib/icons.ts +650 -0
  98. package/dist/src/lib/index.ts +61 -0
  99. package/dist/src/lib/io/decompress.ts +92 -0
  100. package/dist/src/lib/io/export.ts +385 -0
  101. package/dist/src/lib/io/fetch.ts +46 -0
  102. package/dist/src/lib/io/file-drop.ts +51 -0
  103. package/dist/src/lib/io/index.ts +7 -0
  104. package/dist/src/lib/io/is-binary.ts +24 -0
  105. package/dist/src/lib/io/types.ts +8 -0
  106. package/dist/src/lib/io/url-drop.ts +141 -0
  107. package/dist/src/lib/isosurface/Isosurface.svelte +285 -0
  108. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +277 -0
  109. package/dist/src/lib/isosurface/index.ts +7 -0
  110. package/dist/src/lib/isosurface/parse.ts +656 -0
  111. package/dist/src/lib/isosurface/slice.ts +175 -0
  112. package/dist/src/lib/isosurface/types.ts +309 -0
  113. package/dist/src/lib/labels.ts +320 -0
  114. package/dist/src/lib/layout/FullscreenToggle.svelte +50 -0
  115. package/dist/src/lib/layout/InfoCard.svelte +120 -0
  116. package/dist/src/lib/layout/InfoTag.svelte +185 -0
  117. package/dist/src/lib/layout/PropertyFilter.svelte +246 -0
  118. package/dist/src/lib/layout/SettingsSection.svelte +148 -0
  119. package/dist/src/lib/layout/SubpageGrid.svelte +82 -0
  120. package/dist/src/lib/layout/fullscreen.ts +65 -0
  121. package/dist/src/lib/layout/index.ts +11 -0
  122. package/dist/src/lib/layout/json-tree/JsonNode.svelte +548 -0
  123. package/dist/src/lib/layout/json-tree/JsonTree.svelte +1230 -0
  124. package/dist/src/lib/layout/json-tree/JsonValue.svelte +334 -0
  125. package/dist/src/lib/layout/json-tree/index.ts +3 -0
  126. package/dist/src/lib/layout/json-tree/types.ts +126 -0
  127. package/dist/src/lib/layout/json-tree/utils.ts +682 -0
  128. package/dist/src/lib/marching-cubes.ts +614 -0
  129. package/dist/src/lib/math.ts +1081 -0
  130. package/dist/src/lib/overlays/ContextMenu.svelte +162 -0
  131. package/dist/src/lib/overlays/CopyButton.svelte +45 -0
  132. package/dist/src/lib/overlays/DragControlTab.svelte +98 -0
  133. package/dist/src/lib/overlays/DraggablePane.svelte +487 -0
  134. package/dist/src/lib/overlays/InfoPaneCards.svelte +149 -0
  135. package/dist/src/lib/overlays/index.ts +3 -0
  136. package/dist/src/lib/periodic-table/PeriodicTable.svelte +469 -0
  137. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +557 -0
  138. package/dist/src/lib/periodic-table/PropertySelect.svelte +37 -0
  139. package/dist/src/lib/periodic-table/index.ts +12 -0
  140. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
  141. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +444 -0
  142. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  143. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  144. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  145. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +203 -0
  146. package/dist/src/lib/phase-diagram/build-diagram.ts +186 -0
  147. package/dist/src/lib/phase-diagram/colors.ts +58 -0
  148. package/dist/src/lib/phase-diagram/diagram-input.ts +40 -0
  149. package/dist/src/lib/phase-diagram/index.ts +13 -0
  150. package/dist/src/lib/phase-diagram/parse.ts +348 -0
  151. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +1023 -0
  152. package/dist/src/lib/phase-diagram/types.ts +144 -0
  153. package/dist/src/lib/phase-diagram/utils.ts +775 -0
  154. package/dist/src/lib/plot/AxisLabel.svelte +51 -0
  155. package/dist/src/lib/plot/BarPlot.svelte +2113 -0
  156. package/dist/src/lib/plot/BarPlotControls.svelte +66 -0
  157. package/dist/src/lib/plot/BinnedScatterPlot.svelte +1114 -0
  158. package/dist/src/lib/plot/ColorBar.svelte +721 -0
  159. package/dist/src/lib/plot/ColorScaleSelect.svelte +54 -0
  160. package/dist/src/lib/plot/ElementScatter.svelte +63 -0
  161. package/dist/src/lib/plot/FillArea.svelte +223 -0
  162. package/dist/src/lib/plot/Histogram.svelte +1558 -0
  163. package/dist/src/lib/plot/HistogramControls.svelte +212 -0
  164. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +96 -0
  165. package/dist/src/lib/plot/Line.svelte +84 -0
  166. package/dist/src/lib/plot/PlotAxis.svelte +169 -0
  167. package/dist/src/lib/plot/PlotControls.svelte +537 -0
  168. package/dist/src/lib/plot/PlotLegend.svelte +569 -0
  169. package/dist/src/lib/plot/PlotTooltip.svelte +67 -0
  170. package/dist/src/lib/plot/PortalSelect.svelte +253 -0
  171. package/dist/src/lib/plot/ReferenceLine3D.svelte +156 -0
  172. package/dist/src/lib/plot/ReferencePlane.svelte +175 -0
  173. package/dist/src/lib/plot/ScatterPlot.svelte +2778 -0
  174. package/dist/src/lib/plot/ScatterPlot3D.svelte +529 -0
  175. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +437 -0
  176. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +912 -0
  177. package/dist/src/lib/plot/ScatterPlotControls.svelte +306 -0
  178. package/dist/src/lib/plot/ScatterPoint.svelte +182 -0
  179. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +293 -0
  180. package/dist/src/lib/plot/Surface3D.svelte +197 -0
  181. package/dist/src/lib/plot/ZeroLines.svelte +97 -0
  182. package/dist/src/lib/plot/ZoomRect.svelte +23 -0
  183. package/dist/src/lib/plot/adaptive-density.ts +316 -0
  184. package/dist/src/lib/plot/auto-place.ts +184 -0
  185. package/dist/src/lib/plot/axis-utils.ts +122 -0
  186. package/dist/src/lib/plot/binned-scatter-types.ts +83 -0
  187. package/dist/src/lib/plot/data-cleaning.ts +1069 -0
  188. package/dist/src/lib/plot/data-transform.ts +69 -0
  189. package/dist/src/lib/plot/defaults.ts +9 -0
  190. package/dist/src/lib/plot/fill-utils.ts +494 -0
  191. package/dist/src/lib/plot/hover-lock.svelte.ts +60 -0
  192. package/dist/src/lib/plot/index.ts +53 -0
  193. package/dist/src/lib/plot/interactions.ts +119 -0
  194. package/dist/src/lib/plot/layout.ts +425 -0
  195. package/dist/src/lib/plot/reference-line.ts +426 -0
  196. package/dist/src/lib/plot/scales.ts +654 -0
  197. package/dist/src/lib/plot/svg.ts +23 -0
  198. package/dist/src/lib/plot/types.ts +1144 -0
  199. package/dist/src/lib/plot/utils/label-placement.ts +541 -0
  200. package/dist/src/lib/plot/utils/series-visibility.ts +140 -0
  201. package/dist/src/lib/plot/utils.ts +11 -0
  202. package/dist/src/lib/rdf/RdfPlot.svelte +247 -0
  203. package/dist/src/lib/rdf/calc-rdf.ts +167 -0
  204. package/dist/src/lib/rdf/index.ts +27 -0
  205. package/dist/src/lib/sanitize.ts +126 -0
  206. package/dist/src/lib/settings.ts +1479 -0
  207. package/dist/src/lib/spectral/Bands.svelte +1040 -0
  208. package/dist/src/lib/spectral/BandsAndDos.svelte +134 -0
  209. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +252 -0
  210. package/dist/src/lib/spectral/Dos.svelte +697 -0
  211. package/dist/src/lib/spectral/helpers.ts +1381 -0
  212. package/dist/src/lib/spectral/index.ts +8 -0
  213. package/dist/src/lib/spectral/types.ts +112 -0
  214. package/dist/src/lib/state.svelte.ts +64 -0
  215. package/dist/src/lib/structure/Arrow.svelte +72 -0
  216. package/dist/src/lib/structure/AtomLegend.svelte +815 -0
  217. package/dist/src/lib/structure/Bond.svelte +140 -0
  218. package/dist/src/lib/structure/CanvasTooltip.svelte +33 -0
  219. package/dist/src/lib/structure/CellSelect.svelte +349 -0
  220. package/dist/src/lib/structure/Cylinder.svelte +45 -0
  221. package/dist/src/lib/structure/Lattice.svelte +196 -0
  222. package/dist/src/lib/structure/Structure.svelte +2248 -0
  223. package/dist/src/lib/structure/StructureControls.svelte +1273 -0
  224. package/dist/src/lib/structure/StructureExportPane.svelte +252 -0
  225. package/dist/src/lib/structure/StructureInfoPane.svelte +737 -0
  226. package/dist/src/lib/structure/StructureScene.svelte +2255 -0
  227. package/dist/src/lib/structure/atom-properties.ts +316 -0
  228. package/dist/src/lib/structure/bond-order-perception.ts +447 -0
  229. package/dist/src/lib/structure/bonding.ts +944 -0
  230. package/dist/src/lib/structure/export.ts +861 -0
  231. package/dist/src/lib/structure/index.ts +291 -0
  232. package/dist/src/lib/structure/label-placement.ts +130 -0
  233. package/dist/src/lib/structure/measure.ts +45 -0
  234. package/dist/src/lib/structure/parse.ts +1705 -0
  235. package/dist/src/lib/structure/partial-occupancy.ts +183 -0
  236. package/dist/src/lib/structure/pbc.ts +164 -0
  237. package/dist/src/lib/structure/supercell.ts +226 -0
  238. package/dist/src/lib/structure/validation.ts +11 -0
  239. package/dist/src/lib/symmetry/SymmetryStats.svelte +226 -0
  240. package/dist/src/lib/symmetry/WyckoffTable.svelte +120 -0
  241. package/dist/src/lib/symmetry/cell-transform.ts +118 -0
  242. package/dist/src/lib/symmetry/index.ts +348 -0
  243. package/dist/src/lib/symmetry/spacegroups.ts +404 -0
  244. package/dist/src/lib/table/HeatmapTable.svelte +1833 -0
  245. package/dist/src/lib/table/ToggleMenu.svelte +385 -0
  246. package/dist/src/lib/table/index.ts +139 -0
  247. package/dist/src/lib/theme/ThemeControl.svelte +53 -0
  248. package/dist/src/lib/theme/index.ts +107 -0
  249. package/dist/src/lib/theme/themes.mjs +297 -0
  250. package/dist/src/lib/time.ts +71 -0
  251. package/dist/src/lib/tooltip/TooltipContent.svelte +58 -0
  252. package/dist/src/lib/tooltip/index.ts +2 -0
  253. package/dist/src/lib/tooltip/types.ts +13 -0
  254. package/dist/src/lib/trajectory/Trajectory.svelte +1545 -0
  255. package/dist/src/lib/trajectory/TrajectoryError.svelte +128 -0
  256. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +357 -0
  257. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +313 -0
  258. package/dist/src/lib/trajectory/constants.ts +7 -0
  259. package/dist/src/lib/trajectory/extract.ts +196 -0
  260. package/dist/src/lib/trajectory/format-detect.ts +96 -0
  261. package/dist/src/lib/trajectory/frame-reader.ts +456 -0
  262. package/dist/src/lib/trajectory/helpers.ts +217 -0
  263. package/dist/src/lib/trajectory/index.ts +218 -0
  264. package/dist/src/lib/trajectory/parse/ase.ts +109 -0
  265. package/dist/src/lib/trajectory/parse/hdf5.ts +173 -0
  266. package/dist/src/lib/trajectory/parse/index.ts +411 -0
  267. package/dist/src/lib/trajectory/parse/lammps.ts +215 -0
  268. package/dist/src/lib/trajectory/parse/vasp.ts +102 -0
  269. package/dist/src/lib/trajectory/parse/xyz.ts +143 -0
  270. package/dist/src/lib/trajectory/plotting.ts +599 -0
  271. package/dist/src/lib/trajectory/types.ts +13 -0
  272. package/dist/src/lib/utils.ts +56 -0
  273. package/dist/src/lib/xrd/XrdPlot.svelte +615 -0
  274. package/dist/src/lib/xrd/broadening.ts +130 -0
  275. package/dist/src/lib/xrd/calc-xrd.ts +397 -0
  276. package/dist/src/lib/xrd/index.ts +38 -0
  277. package/dist/src/lib/xrd/parse.ts +858 -0
  278. package/dist/webview.js +29421 -0
  279. package/icon.png +0 -0
  280. package/license +1 -1
  281. package/matterviz-0.3.2.vsix +0 -0
  282. package/matterviz-0.3.4.vsix +0 -0
  283. package/matterviz-0.3.5.vsix +0 -0
  284. package/package.json +1461 -231
  285. package/readme.md +171 -98
  286. package/scripts/sync-config.ts +101 -0
  287. package/src/declarations.d.ts +2 -0
  288. package/src/extension.ts +972 -0
  289. package/src/node-io.ts +65 -0
  290. package/src/types.ts +17 -0
  291. package/src/webview/JsonBrowser.svelte +1079 -0
  292. package/src/webview/PlotPanel.svelte +346 -0
  293. package/src/webview/detect.ts +444 -0
  294. package/src/webview/main.ts +764 -0
  295. package/src/webview/plot-utils.ts +250 -0
  296. package/test-fixtures/all-viz-types.json.gz +0 -0
  297. package/test-fixtures/plot-demo-data.json.gz +0 -0
  298. package/tests/detect.test.ts +604 -0
  299. package/tests/extension.test.ts +2041 -0
  300. package/tests/node-io.test.ts +39 -0
  301. package/tests/plot-utils.test.ts +302 -0
  302. package/tests/vite-plugin-json-gz.test.ts +114 -0
  303. package/tests/vscode-mock.ts +18 -0
  304. package/tests/webview.test.ts +231 -0
  305. package/tsconfig.json +20 -0
  306. package/vite-plugin-json-gz.ts +29 -0
  307. package/vite.config.ts +34 -0
  308. package/vite.extension.config.ts +34 -0
  309. package/dist/EmptyState.svelte.d.ts +0 -9
  310. package/dist/FilePicker.svelte +0 -360
  311. package/dist/FilePicker.svelte.d.ts +0 -17
  312. package/dist/Icon.svelte.d.ts +0 -13
  313. package/dist/MillerIndexInput.svelte +0 -66
  314. package/dist/MillerIndexInput.svelte.d.ts +0 -7
  315. package/dist/api/mp.d.ts +0 -6
  316. package/dist/api/mp.js +0 -22
  317. package/dist/api/optimade.d.ts +0 -45
  318. package/dist/api/optimade.js +0 -135
  319. package/dist/app.css +0 -240
  320. package/dist/brillouin/BrillouinZone.svelte +0 -543
  321. package/dist/brillouin/BrillouinZone.svelte.d.ts +0 -83
  322. package/dist/brillouin/BrillouinZoneControls.svelte +0 -144
  323. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +0 -17
  324. package/dist/brillouin/BrillouinZoneExportPane.svelte +0 -148
  325. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +0 -15
  326. package/dist/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  327. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +0 -13
  328. package/dist/brillouin/BrillouinZoneScene.svelte +0 -476
  329. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +0 -48
  330. package/dist/brillouin/BrillouinZoneTooltip.svelte +0 -92
  331. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +0 -8
  332. package/dist/brillouin/compute.d.ts +0 -17
  333. package/dist/brillouin/compute.js +0 -422
  334. package/dist/brillouin/index.d.ts +0 -8
  335. package/dist/brillouin/index.js +0 -8
  336. package/dist/brillouin/types.d.ts +0 -48
  337. package/dist/brillouin/types.js +0 -1
  338. package/dist/chempot-diagram/ChemPotDiagram.svelte +0 -327
  339. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +0 -13
  340. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +0 -847
  341. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +0 -16
  342. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +0 -3194
  343. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +0 -16
  344. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +0 -7
  345. package/dist/chempot-diagram/async-compute.svelte.d.ts +0 -3
  346. package/dist/chempot-diagram/async-compute.svelte.js +0 -77
  347. package/dist/chempot-diagram/chempot-worker.d.ts +0 -1
  348. package/dist/chempot-diagram/chempot-worker.js +0 -11
  349. package/dist/chempot-diagram/color.d.ts +0 -10
  350. package/dist/chempot-diagram/color.js +0 -32
  351. package/dist/chempot-diagram/compute.d.ts +0 -48
  352. package/dist/chempot-diagram/compute.js +0 -812
  353. package/dist/chempot-diagram/index.d.ts +0 -6
  354. package/dist/chempot-diagram/index.js +0 -6
  355. package/dist/chempot-diagram/pointer.d.ts +0 -16
  356. package/dist/chempot-diagram/pointer.js +0 -40
  357. package/dist/chempot-diagram/temperature.d.ts +0 -15
  358. package/dist/chempot-diagram/temperature.js +0 -36
  359. package/dist/chempot-diagram/types.d.ts +0 -86
  360. package/dist/chempot-diagram/types.js +0 -28
  361. package/dist/colors/index.d.ts +0 -47
  362. package/dist/colors/index.js +0 -203
  363. package/dist/composition/BarChart.svelte +0 -297
  364. package/dist/composition/BarChart.svelte.d.ts +0 -39
  365. package/dist/composition/BubbleChart.svelte +0 -218
  366. package/dist/composition/BubbleChart.svelte.d.ts +0 -28
  367. package/dist/composition/Composition.svelte +0 -164
  368. package/dist/composition/Composition.svelte.d.ts +0 -15
  369. package/dist/composition/Formula.svelte +0 -265
  370. package/dist/composition/Formula.svelte.d.ts +0 -19
  371. package/dist/composition/FormulaFilter.svelte +0 -1259
  372. package/dist/composition/FormulaFilter.svelte.d.ts +0 -51
  373. package/dist/composition/PieChart.svelte +0 -323
  374. package/dist/composition/PieChart.svelte.d.ts +0 -37
  375. package/dist/composition/format.d.ts +0 -15
  376. package/dist/composition/format.js +0 -109
  377. package/dist/composition/index.d.ts +0 -20
  378. package/dist/composition/index.js +0 -14
  379. package/dist/composition/parse.d.ts +0 -55
  380. package/dist/composition/parse.js +0 -459
  381. package/dist/constants.d.ts +0 -29
  382. package/dist/constants.js +0 -105
  383. package/dist/controls.d.ts +0 -14
  384. package/dist/controls.js +0 -30
  385. package/dist/convex-hull/ConvexHull.svelte +0 -157
  386. package/dist/convex-hull/ConvexHull.svelte.d.ts +0 -13
  387. package/dist/convex-hull/ConvexHull2D.svelte +0 -813
  388. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +0 -11
  389. package/dist/convex-hull/ConvexHull3D.svelte +0 -1788
  390. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +0 -8
  391. package/dist/convex-hull/ConvexHull4D.svelte +0 -1374
  392. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +0 -8
  393. package/dist/convex-hull/ConvexHullControls.svelte +0 -546
  394. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +0 -48
  395. package/dist/convex-hull/ConvexHullInfoPane.svelte +0 -115
  396. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +0 -18
  397. package/dist/convex-hull/ConvexHullStats.svelte +0 -905
  398. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +0 -15
  399. package/dist/convex-hull/ConvexHullTooltip.svelte +0 -131
  400. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +0 -33
  401. package/dist/convex-hull/GasPressureControls.svelte +0 -247
  402. package/dist/convex-hull/GasPressureControls.svelte.d.ts +0 -11
  403. package/dist/convex-hull/StructurePopup.svelte +0 -116
  404. package/dist/convex-hull/StructurePopup.svelte.d.ts +0 -18
  405. package/dist/convex-hull/TemperatureSlider.svelte +0 -137
  406. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +0 -8
  407. package/dist/convex-hull/barycentric-coords.d.ts +0 -18
  408. package/dist/convex-hull/barycentric-coords.js +0 -182
  409. package/dist/convex-hull/demo-temperature.d.ts +0 -6
  410. package/dist/convex-hull/demo-temperature.js +0 -40
  411. package/dist/convex-hull/gas-thermodynamics.d.ts +0 -16
  412. package/dist/convex-hull/gas-thermodynamics.js +0 -316
  413. package/dist/convex-hull/helpers.d.ts +0 -103
  414. package/dist/convex-hull/helpers.js +0 -671
  415. package/dist/convex-hull/index.d.ts +0 -118
  416. package/dist/convex-hull/index.js +0 -57
  417. package/dist/convex-hull/thermodynamics.d.ts +0 -66
  418. package/dist/convex-hull/thermodynamics.js +0 -1752
  419. package/dist/convex-hull/types.d.ts +0 -162
  420. package/dist/convex-hull/types.js +0 -36
  421. package/dist/coordination/CoordinationBarPlot.svelte +0 -311
  422. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +0 -30
  423. package/dist/coordination/calc-coordination.d.ts +0 -15
  424. package/dist/coordination/calc-coordination.js +0 -63
  425. package/dist/coordination/index.d.ts +0 -8
  426. package/dist/coordination/index.js +0 -7
  427. package/dist/element/BohrAtom.svelte +0 -149
  428. package/dist/element/BohrAtom.svelte.d.ts +0 -20
  429. package/dist/element/ElementHeading.svelte +0 -26
  430. package/dist/element/ElementHeading.svelte.d.ts +0 -8
  431. package/dist/element/ElementPhoto.svelte +0 -57
  432. package/dist/element/ElementPhoto.svelte.d.ts +0 -9
  433. package/dist/element/ElementStats.svelte +0 -80
  434. package/dist/element/ElementStats.svelte.d.ts +0 -8
  435. package/dist/element/ElementTile.svelte +0 -484
  436. package/dist/element/ElementTile.svelte.d.ts +0 -29
  437. package/dist/element/Nucleus.svelte.d.ts +0 -17
  438. package/dist/element/data.d.ts +0 -3
  439. package/dist/element/data.js +0 -2
  440. package/dist/element/data.json.gz.d.ts +0 -2
  441. package/dist/element/index.d.ts +0 -8
  442. package/dist/element/index.js +0 -8
  443. package/dist/element/types.d.ts +0 -57
  444. package/dist/element/types.js +0 -1
  445. package/dist/feedback/ClickFeedback.svelte +0 -58
  446. package/dist/feedback/ClickFeedback.svelte.d.ts +0 -12
  447. package/dist/feedback/DragOverlay.svelte +0 -42
  448. package/dist/feedback/DragOverlay.svelte.d.ts +0 -7
  449. package/dist/feedback/Spinner.svelte.d.ts +0 -7
  450. package/dist/feedback/StatusMessage.svelte.d.ts +0 -9
  451. package/dist/feedback/index.d.ts +0 -4
  452. package/dist/feedback/index.js +0 -4
  453. package/dist/fermi-surface/FermiSlice.svelte +0 -189
  454. package/dist/fermi-surface/FermiSlice.svelte.d.ts +0 -24
  455. package/dist/fermi-surface/FermiSurface.svelte +0 -597
  456. package/dist/fermi-surface/FermiSurface.svelte.d.ts +0 -83
  457. package/dist/fermi-surface/FermiSurfaceControls.svelte +0 -452
  458. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +0 -35
  459. package/dist/fermi-surface/FermiSurfaceScene.svelte +0 -792
  460. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +0 -50
  461. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  462. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +0 -8
  463. package/dist/fermi-surface/compute.d.ts +0 -5
  464. package/dist/fermi-surface/compute.js +0 -538
  465. package/dist/fermi-surface/constants.d.ts +0 -9
  466. package/dist/fermi-surface/constants.js +0 -27
  467. package/dist/fermi-surface/export.d.ts +0 -5
  468. package/dist/fermi-surface/export.js +0 -63
  469. package/dist/fermi-surface/index.d.ts +0 -12
  470. package/dist/fermi-surface/index.js +0 -13
  471. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  472. package/dist/fermi-surface/marching-cubes.js +0 -2
  473. package/dist/fermi-surface/parse.d.ts +0 -2
  474. package/dist/fermi-surface/parse.js +0 -495
  475. package/dist/fermi-surface/symmetry.d.ts +0 -3
  476. package/dist/fermi-surface/symmetry.js +0 -46
  477. package/dist/fermi-surface/types.d.ts +0 -113
  478. package/dist/fermi-surface/types.js +0 -4
  479. package/dist/heatmap-matrix/HeatmapMatrix.svelte +0 -1527
  480. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +0 -110
  481. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  482. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +0 -30
  483. package/dist/heatmap-matrix/index.d.ts +0 -53
  484. package/dist/heatmap-matrix/index.js +0 -100
  485. package/dist/heatmap-matrix/shared.d.ts +0 -2
  486. package/dist/heatmap-matrix/shared.js +0 -4
  487. package/dist/icons.d.ts +0 -569
  488. package/dist/icons.js +0 -648
  489. package/dist/index.d.ts +0 -39
  490. package/dist/index.js +0 -39
  491. package/dist/io/decompress.d.ts +0 -10
  492. package/dist/io/decompress.js +0 -69
  493. package/dist/io/export.d.ts +0 -16
  494. package/dist/io/export.js +0 -312
  495. package/dist/io/fetch.d.ts +0 -5
  496. package/dist/io/fetch.js +0 -39
  497. package/dist/io/file-drop.d.ts +0 -7
  498. package/dist/io/file-drop.js +0 -43
  499. package/dist/io/index.d.ts +0 -7
  500. package/dist/io/index.js +0 -7
  501. package/dist/io/is-binary.d.ts +0 -1
  502. package/dist/io/is-binary.js +0 -5
  503. package/dist/io/types.d.ts +0 -8
  504. package/dist/io/types.js +0 -1
  505. package/dist/io/url-drop.d.ts +0 -2
  506. package/dist/io/url-drop.js +0 -117
  507. package/dist/isosurface/Isosurface.svelte +0 -285
  508. package/dist/isosurface/Isosurface.svelte.d.ts +0 -8
  509. package/dist/isosurface/IsosurfaceControls.svelte +0 -291
  510. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +0 -9
  511. package/dist/isosurface/index.d.ts +0 -5
  512. package/dist/isosurface/index.js +0 -6
  513. package/dist/isosurface/parse.d.ts +0 -6
  514. package/dist/isosurface/parse.js +0 -553
  515. package/dist/isosurface/slice.d.ts +0 -11
  516. package/dist/isosurface/slice.js +0 -140
  517. package/dist/isosurface/types.d.ts +0 -56
  518. package/dist/isosurface/types.js +0 -227
  519. package/dist/labels.d.ts +0 -53
  520. package/dist/labels.js +0 -274
  521. package/dist/layout/FullscreenToggle.svelte +0 -50
  522. package/dist/layout/FullscreenToggle.svelte.d.ts +0 -7
  523. package/dist/layout/InfoCard.svelte +0 -120
  524. package/dist/layout/InfoCard.svelte.d.ts +0 -21
  525. package/dist/layout/InfoTag.svelte +0 -183
  526. package/dist/layout/InfoTag.svelte.d.ts +0 -19
  527. package/dist/layout/PropertyFilter.svelte +0 -244
  528. package/dist/layout/PropertyFilter.svelte.d.ts +0 -24
  529. package/dist/layout/SettingsSection.svelte +0 -148
  530. package/dist/layout/SettingsSection.svelte.d.ts +0 -17
  531. package/dist/layout/SubpageGrid.svelte +0 -82
  532. package/dist/layout/SubpageGrid.svelte.d.ts +0 -14
  533. package/dist/layout/fullscreen.d.ts +0 -9
  534. package/dist/layout/fullscreen.js +0 -53
  535. package/dist/layout/index.d.ts +0 -10
  536. package/dist/layout/index.js +0 -8
  537. package/dist/layout/json-tree/JsonNode.svelte +0 -547
  538. package/dist/layout/json-tree/JsonNode.svelte.d.ts +0 -11
  539. package/dist/layout/json-tree/JsonTree.svelte +0 -1222
  540. package/dist/layout/json-tree/JsonTree.svelte.d.ts +0 -6
  541. package/dist/layout/json-tree/JsonValue.svelte +0 -334
  542. package/dist/layout/json-tree/JsonValue.svelte.d.ts +0 -9
  543. package/dist/layout/json-tree/index.d.ts +0 -3
  544. package/dist/layout/json-tree/index.js +0 -3
  545. package/dist/layout/json-tree/types.d.ts +0 -73
  546. package/dist/layout/json-tree/types.js +0 -3
  547. package/dist/layout/json-tree/utils.d.ts +0 -29
  548. package/dist/layout/json-tree/utils.js +0 -648
  549. package/dist/marching-cubes.d.ts +0 -14
  550. package/dist/marching-cubes.js +0 -542
  551. package/dist/math.d.ts +0 -91
  552. package/dist/math.js +0 -896
  553. package/dist/overlays/ContextMenu.svelte +0 -162
  554. package/dist/overlays/ContextMenu.svelte.d.ts +0 -25
  555. package/dist/overlays/DraggablePane.svelte +0 -564
  556. package/dist/overlays/DraggablePane.svelte.d.ts +0 -36
  557. package/dist/overlays/index.d.ts +0 -2
  558. package/dist/overlays/index.js +0 -2
  559. package/dist/periodic-table/PeriodicTable.svelte +0 -469
  560. package/dist/periodic-table/PeriodicTable.svelte.d.ts +0 -55
  561. package/dist/periodic-table/PeriodicTableControls.svelte +0 -557
  562. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +0 -24
  563. package/dist/periodic-table/PropertySelect.svelte +0 -37
  564. package/dist/periodic-table/PropertySelect.svelte.d.ts +0 -13
  565. package/dist/periodic-table/TableInset.svelte.d.ts +0 -9
  566. package/dist/periodic-table/index.d.ts +0 -10
  567. package/dist/periodic-table/index.js +0 -4
  568. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  569. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +0 -44
  570. package/dist/phase-diagram/PhaseDiagramControls.svelte +0 -451
  571. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +0 -30
  572. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  573. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +0 -15
  574. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +0 -192
  575. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +0 -19
  576. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +0 -392
  577. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +0 -16
  578. package/dist/phase-diagram/TdbInfoPanel.svelte +0 -203
  579. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +0 -12
  580. package/dist/phase-diagram/build-diagram.d.ts +0 -11
  581. package/dist/phase-diagram/build-diagram.js +0 -167
  582. package/dist/phase-diagram/colors.d.ts +0 -35
  583. package/dist/phase-diagram/colors.js +0 -51
  584. package/dist/phase-diagram/diagram-input.d.ts +0 -33
  585. package/dist/phase-diagram/diagram-input.js +0 -3
  586. package/dist/phase-diagram/index.d.ts +0 -13
  587. package/dist/phase-diagram/index.js +0 -13
  588. package/dist/phase-diagram/parse.d.ts +0 -55
  589. package/dist/phase-diagram/parse.js +0 -276
  590. package/dist/phase-diagram/svg-to-diagram.d.ts +0 -2
  591. package/dist/phase-diagram/svg-to-diagram.js +0 -869
  592. package/dist/phase-diagram/types.d.ts +0 -99
  593. package/dist/phase-diagram/types.js +0 -1
  594. package/dist/phase-diagram/utils.d.ts +0 -118
  595. package/dist/phase-diagram/utils.js +0 -606
  596. package/dist/plot/AxisLabel.svelte +0 -51
  597. package/dist/plot/AxisLabel.svelte.d.ts +0 -16
  598. package/dist/plot/BarPlot.svelte +0 -2256
  599. package/dist/plot/BarPlot.svelte.d.ts +0 -82
  600. package/dist/plot/BarPlotControls.svelte +0 -66
  601. package/dist/plot/BarPlotControls.svelte.d.ts +0 -18
  602. package/dist/plot/ColorBar.svelte +0 -719
  603. package/dist/plot/ColorBar.svelte.d.ts +0 -31
  604. package/dist/plot/ColorScaleSelect.svelte +0 -54
  605. package/dist/plot/ColorScaleSelect.svelte.d.ts +0 -15
  606. package/dist/plot/ElementScatter.svelte +0 -63
  607. package/dist/plot/ElementScatter.svelte.d.ts +0 -14
  608. package/dist/plot/FillArea.svelte +0 -226
  609. package/dist/plot/FillArea.svelte.d.ts +0 -20
  610. package/dist/plot/Histogram.svelte +0 -1654
  611. package/dist/plot/Histogram.svelte.d.ts +0 -50
  612. package/dist/plot/HistogramControls.svelte +0 -212
  613. package/dist/plot/HistogramControls.svelte.d.ts +0 -22
  614. package/dist/plot/InteractiveAxisLabel.svelte +0 -94
  615. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +0 -14
  616. package/dist/plot/Line.svelte +0 -85
  617. package/dist/plot/Line.svelte.d.ts +0 -15
  618. package/dist/plot/PlotControls.svelte +0 -537
  619. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  620. package/dist/plot/PlotLegend.svelte +0 -498
  621. package/dist/plot/PlotLegend.svelte.d.ts +0 -25
  622. package/dist/plot/PlotTooltip.svelte +0 -67
  623. package/dist/plot/PlotTooltip.svelte.d.ts +0 -17
  624. package/dist/plot/PortalSelect.svelte +0 -253
  625. package/dist/plot/PortalSelect.svelte.d.ts +0 -16
  626. package/dist/plot/ReferenceLine.svelte.d.ts +0 -20
  627. package/dist/plot/ReferenceLine3D.svelte +0 -154
  628. package/dist/plot/ReferenceLine3D.svelte.d.ts +0 -14
  629. package/dist/plot/ReferencePlane.svelte +0 -178
  630. package/dist/plot/ReferencePlane.svelte.d.ts +0 -14
  631. package/dist/plot/ScatterPlot.svelte +0 -2831
  632. package/dist/plot/ScatterPlot.svelte.d.ts +0 -92
  633. package/dist/plot/ScatterPlot3D.svelte +0 -499
  634. package/dist/plot/ScatterPlot3D.svelte.d.ts +0 -94
  635. package/dist/plot/ScatterPlot3DControls.svelte +0 -437
  636. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +0 -20
  637. package/dist/plot/ScatterPlot3DScene.svelte +0 -912
  638. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +0 -74
  639. package/dist/plot/ScatterPlotControls.svelte +0 -307
  640. package/dist/plot/ScatterPlotControls.svelte.d.ts +0 -17
  641. package/dist/plot/ScatterPoint.svelte +0 -185
  642. package/dist/plot/ScatterPoint.svelte.d.ts +0 -19
  643. package/dist/plot/SpacegroupBarPlot.svelte +0 -292
  644. package/dist/plot/SpacegroupBarPlot.svelte.d.ts +0 -9
  645. package/dist/plot/Surface3D.svelte +0 -200
  646. package/dist/plot/Surface3D.svelte.d.ts +0 -13
  647. package/dist/plot/ZeroLines.svelte +0 -96
  648. package/dist/plot/ZeroLines.svelte.d.ts +0 -32
  649. package/dist/plot/ZoomRect.svelte +0 -23
  650. package/dist/plot/ZoomRect.svelte.d.ts +0 -8
  651. package/dist/plot/axis-utils.d.ts +0 -19
  652. package/dist/plot/axis-utils.js +0 -80
  653. package/dist/plot/data-cleaning.d.ts +0 -37
  654. package/dist/plot/data-cleaning.js +0 -855
  655. package/dist/plot/data-transform.d.ts +0 -16
  656. package/dist/plot/data-transform.js +0 -45
  657. package/dist/plot/defaults.d.ts +0 -19
  658. package/dist/plot/defaults.js +0 -9
  659. package/dist/plot/fill-utils.d.ts +0 -51
  660. package/dist/plot/fill-utils.js +0 -337
  661. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  662. package/dist/plot/hover-lock.svelte.js +0 -46
  663. package/dist/plot/index.d.ts +0 -43
  664. package/dist/plot/index.js +0 -37
  665. package/dist/plot/interactions.d.ts +0 -12
  666. package/dist/plot/interactions.js +0 -100
  667. package/dist/plot/layout.d.ts +0 -60
  668. package/dist/plot/layout.js +0 -230
  669. package/dist/plot/reference-line.d.ts +0 -60
  670. package/dist/plot/reference-line.js +0 -316
  671. package/dist/plot/scales.d.ts +0 -48
  672. package/dist/plot/scales.js +0 -484
  673. package/dist/plot/svg.d.ts +0 -1
  674. package/dist/plot/svg.js +0 -11
  675. package/dist/plot/types.d.ts +0 -863
  676. package/dist/plot/types.js +0 -103
  677. package/dist/plot/utils/label-placement.d.ts +0 -47
  678. package/dist/plot/utils/label-placement.js +0 -256
  679. package/dist/plot/utils/series-visibility.d.ts +0 -9
  680. package/dist/plot/utils/series-visibility.js +0 -67
  681. package/dist/plot/utils.d.ts +0 -1
  682. package/dist/plot/utils.js +0 -14
  683. package/dist/rdf/RdfPlot.svelte +0 -247
  684. package/dist/rdf/RdfPlot.svelte.d.ts +0 -27
  685. package/dist/rdf/calc-rdf.d.ts +0 -4
  686. package/dist/rdf/calc-rdf.js +0 -111
  687. package/dist/rdf/index.d.ts +0 -23
  688. package/dist/rdf/index.js +0 -2
  689. package/dist/sanitize.d.ts +0 -4
  690. package/dist/sanitize.js +0 -107
  691. package/dist/settings.d.ts +0 -253
  692. package/dist/settings.js +0 -1123
  693. package/dist/spectral/Bands.svelte +0 -1040
  694. package/dist/spectral/Bands.svelte.d.ts +0 -40
  695. package/dist/spectral/BandsAndDos.svelte +0 -128
  696. package/dist/spectral/BandsAndDos.svelte.d.ts +0 -18
  697. package/dist/spectral/BrillouinBandsDos.svelte +0 -248
  698. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +0 -20
  699. package/dist/spectral/Dos.svelte +0 -697
  700. package/dist/spectral/Dos.svelte.d.ts +0 -29
  701. package/dist/spectral/helpers.d.ts +0 -117
  702. package/dist/spectral/helpers.js +0 -1023
  703. package/dist/spectral/index.d.ts +0 -6
  704. package/dist/spectral/index.js +0 -7
  705. package/dist/spectral/types.d.ts +0 -84
  706. package/dist/spectral/types.js +0 -2
  707. package/dist/state.svelte.d.ts +0 -25
  708. package/dist/state.svelte.js +0 -45
  709. package/dist/structure/Arrow.svelte +0 -72
  710. package/dist/structure/Arrow.svelte.d.ts +0 -15
  711. package/dist/structure/AtomLegend.svelte +0 -798
  712. package/dist/structure/AtomLegend.svelte.d.ts +0 -34
  713. package/dist/structure/Bond.svelte +0 -140
  714. package/dist/structure/Bond.svelte.d.ts +0 -9
  715. package/dist/structure/CanvasTooltip.svelte +0 -33
  716. package/dist/structure/CanvasTooltip.svelte.d.ts +0 -12
  717. package/dist/structure/CellSelect.svelte +0 -351
  718. package/dist/structure/CellSelect.svelte.d.ts +0 -13
  719. package/dist/structure/Cylinder.svelte +0 -45
  720. package/dist/structure/Cylinder.svelte.d.ts +0 -10
  721. package/dist/structure/Lattice.svelte +0 -196
  722. package/dist/structure/Lattice.svelte.d.ts +0 -17
  723. package/dist/structure/Structure.svelte +0 -1857
  724. package/dist/structure/Structure.svelte.d.ts +0 -83
  725. package/dist/structure/StructureControls.svelte +0 -1184
  726. package/dist/structure/StructureControls.svelte.d.ts +0 -31
  727. package/dist/structure/StructureExportPane.svelte +0 -251
  728. package/dist/structure/StructureExportPane.svelte.d.ts +0 -17
  729. package/dist/structure/StructureInfoPane.svelte +0 -434
  730. package/dist/structure/StructureInfoPane.svelte.d.ts +0 -18
  731. package/dist/structure/StructureScene.svelte +0 -1574
  732. package/dist/structure/StructureScene.svelte.d.ts +0 -104
  733. package/dist/structure/atom-properties.d.ts +0 -37
  734. package/dist/structure/atom-properties.js +0 -198
  735. package/dist/structure/bonding.d.ts +0 -33
  736. package/dist/structure/bonding.js +0 -304
  737. package/dist/structure/export.d.ts +0 -20
  738. package/dist/structure/export.js +0 -725
  739. package/dist/structure/ferrox-wasm-types.d.ts +0 -46
  740. package/dist/structure/ferrox-wasm-types.js +0 -18
  741. package/dist/structure/ferrox-wasm.d.ts +0 -94
  742. package/dist/structure/ferrox-wasm.js +0 -249
  743. package/dist/structure/index.d.ts +0 -110
  744. package/dist/structure/index.js +0 -168
  745. package/dist/structure/measure.d.ts +0 -6
  746. package/dist/structure/measure.js +0 -29
  747. package/dist/structure/parse.d.ts +0 -65
  748. package/dist/structure/parse.js +0 -1374
  749. package/dist/structure/partial-occupancy.d.ts +0 -25
  750. package/dist/structure/partial-occupancy.js +0 -99
  751. package/dist/structure/pbc.d.ts +0 -9
  752. package/dist/structure/pbc.js +0 -123
  753. package/dist/structure/supercell.d.ts +0 -8
  754. package/dist/structure/supercell.js +0 -137
  755. package/dist/structure/validation.d.ts +0 -2
  756. package/dist/structure/validation.js +0 -10
  757. package/dist/symmetry/SymmetryStats.svelte +0 -226
  758. package/dist/symmetry/SymmetryStats.svelte.d.ts +0 -21
  759. package/dist/symmetry/WyckoffTable.svelte +0 -113
  760. package/dist/symmetry/WyckoffTable.svelte.d.ts +0 -11
  761. package/dist/symmetry/cell-transform.d.ts +0 -12
  762. package/dist/symmetry/cell-transform.js +0 -77
  763. package/dist/symmetry/index.d.ts +0 -43
  764. package/dist/symmetry/index.js +0 -229
  765. package/dist/symmetry/spacegroups.d.ts +0 -9
  766. package/dist/symmetry/spacegroups.js +0 -394
  767. package/dist/table/HeatmapTable.svelte +0 -1854
  768. package/dist/table/HeatmapTable.svelte.d.ts +0 -49
  769. package/dist/table/ToggleMenu.svelte +0 -376
  770. package/dist/table/ToggleMenu.svelte.d.ts +0 -11
  771. package/dist/table/index.d.ts +0 -74
  772. package/dist/table/index.js +0 -38
  773. package/dist/theme/ThemeControl.svelte +0 -53
  774. package/dist/theme/ThemeControl.svelte.d.ts +0 -9
  775. package/dist/theme/index.d.ts +0 -29
  776. package/dist/theme/index.js +0 -79
  777. package/dist/theme/themes.mjs +0 -285
  778. package/dist/time.d.ts +0 -4
  779. package/dist/time.js +0 -70
  780. package/dist/tooltip/TooltipContent.svelte +0 -58
  781. package/dist/tooltip/TooltipContent.svelte.d.ts +0 -31
  782. package/dist/tooltip/index.d.ts +0 -2
  783. package/dist/tooltip/index.js +0 -2
  784. package/dist/tooltip/types.d.ts +0 -8
  785. package/dist/tooltip/types.js +0 -1
  786. package/dist/trajectory/Trajectory.svelte +0 -1517
  787. package/dist/trajectory/Trajectory.svelte.d.ts +0 -77
  788. package/dist/trajectory/TrajectoryError.svelte +0 -128
  789. package/dist/trajectory/TrajectoryError.svelte.d.ts +0 -13
  790. package/dist/trajectory/TrajectoryExportPane.svelte +0 -357
  791. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +0 -17
  792. package/dist/trajectory/TrajectoryInfoPane.svelte +0 -387
  793. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +0 -17
  794. package/dist/trajectory/constants.d.ts +0 -6
  795. package/dist/trajectory/constants.js +0 -7
  796. package/dist/trajectory/extract.d.ts +0 -5
  797. package/dist/trajectory/extract.js +0 -162
  798. package/dist/trajectory/format-detect.d.ts +0 -9
  799. package/dist/trajectory/format-detect.js +0 -76
  800. package/dist/trajectory/frame-reader.d.ts +0 -17
  801. package/dist/trajectory/frame-reader.js +0 -332
  802. package/dist/trajectory/helpers.d.ts +0 -14
  803. package/dist/trajectory/helpers.js +0 -172
  804. package/dist/trajectory/index.d.ts +0 -63
  805. package/dist/trajectory/index.js +0 -126
  806. package/dist/trajectory/parse/ase.d.ts +0 -2
  807. package/dist/trajectory/parse/ase.js +0 -77
  808. package/dist/trajectory/parse/hdf5.d.ts +0 -2
  809. package/dist/trajectory/parse/hdf5.js +0 -129
  810. package/dist/trajectory/parse/index.d.ts +0 -12
  811. package/dist/trajectory/parse/index.js +0 -299
  812. package/dist/trajectory/parse/lammps.d.ts +0 -5
  813. package/dist/trajectory/parse/lammps.js +0 -179
  814. package/dist/trajectory/parse/vasp.d.ts +0 -2
  815. package/dist/trajectory/parse/vasp.js +0 -68
  816. package/dist/trajectory/parse/xyz.d.ts +0 -2
  817. package/dist/trajectory/parse/xyz.js +0 -110
  818. package/dist/trajectory/plotting.d.ts +0 -28
  819. package/dist/trajectory/plotting.js +0 -423
  820. package/dist/trajectory/types.d.ts +0 -11
  821. package/dist/trajectory/types.js +0 -1
  822. package/dist/utils.d.ts +0 -5
  823. package/dist/utils.js +0 -36
  824. package/dist/xrd/XrdPlot.svelte +0 -615
  825. package/dist/xrd/XrdPlot.svelte.d.ts +0 -28
  826. package/dist/xrd/broadening.d.ts +0 -20
  827. package/dist/xrd/broadening.js +0 -97
  828. package/dist/xrd/calc-xrd.d.ts +0 -37
  829. package/dist/xrd/calc-xrd.js +0 -337
  830. package/dist/xrd/index.d.ts +0 -37
  831. package/dist/xrd/index.js +0 -4
  832. package/dist/xrd/parse.d.ts +0 -13
  833. package/dist/xrd/parse.js +0 -749
  834. /package/dist/{EmptyState.svelte → src/lib/EmptyState.svelte} +0 -0
  835. /package/dist/{Icon.svelte → src/lib/Icon.svelte} +0 -0
  836. /package/dist/{chempot-diagram → src/lib/chempot-diagram}/ChemPotScene3D.svelte +0 -0
  837. /package/dist/{colors → src/lib/colors}/alloy-colors.json +0 -0
  838. /package/dist/{colors → src/lib/colors}/dark-mode-colors.json +0 -0
  839. /package/dist/{colors → src/lib/colors}/jmol-colors.json +0 -0
  840. /package/dist/{colors → src/lib/colors}/muted-colors.json +0 -0
  841. /package/dist/{colors → src/lib/colors}/pastel-colors.json +0 -0
  842. /package/dist/{colors → src/lib/colors}/vesta-colors.json +0 -0
  843. /package/dist/{element → src/lib/element}/Nucleus.svelte +0 -0
  844. /package/dist/{element → src/lib/element}/data.json +0 -0
  845. /package/dist/{element → src/lib/element}/data.json.gz +0 -0
  846. /package/dist/{element → src/lib/element}/data.schema.json +0 -0
  847. /package/dist/{element-image-urls.json → src/lib/element-image-urls.json} +0 -0
  848. /package/dist/{feedback → src/lib/feedback}/Spinner.svelte +0 -0
  849. /package/dist/{feedback → src/lib/feedback}/StatusMessage.svelte +0 -0
  850. /package/dist/{periodic-table → src/lib/periodic-table}/TableInset.svelte +0 -0
  851. /package/dist/{plot → src/lib/plot}/ReferenceLine.svelte +0 -0
  852. /package/dist/{xrd → src/lib/xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,932 @@
1
+ import { type D3InterpolateName, get_d3_interpolator } from '$lib/colors'
2
+ import { ELEM_SYMBOL_TO_NAME } from '$lib/composition'
3
+ import type { EnergyModeInfo } from '$lib/convex-hull'
4
+ import type { ElementSymbol } from '$lib/element'
5
+ import { format_fractional, format_num, symbol_map } from '$lib/labels'
6
+ import { scaleSequential } from 'd3-scale'
7
+ import { symbol } from 'd3-shape'
8
+ import {
9
+ analyze_gas_data as _analyze_gas_data,
10
+ apply_gas_corrections as _apply_gas_corrections,
11
+ } from './gas-thermodynamics'
12
+ import type {
13
+ ConvexHullConfig,
14
+ GasAnalysis,
15
+ GasThermodynamicsConfig,
16
+ HighlightStyle,
17
+ MarkerSymbol,
18
+ PhaseData,
19
+ } from './types'
20
+ import { DEFAULT_GAS_TEMP } from './types'
21
+ export { DEFAULT_GAS_TEMP }
22
+
23
+ // Tolerance for classifying a phase as on the convex hull (eV/atom)
24
+ export const HULL_STABILITY_TOL = 1e-6
25
+
26
+ // Clamp raw hull distance and compute stability for a single entry.
27
+ // Excluded entries keep their raw (possibly negative) distance and are never stable.
28
+ export function compute_hull_stability(
29
+ raw_distance: number,
30
+ exclude_from_hull?: boolean,
31
+ tol: number = HULL_STABILITY_TOL,
32
+ ): { e_above_hull: number; is_stable: boolean } {
33
+ if (exclude_from_hull) return { e_above_hull: raw_distance, is_stable: false }
34
+ const e_above_hull = Math.abs(raw_distance) < tol ? 0 : Math.max(0, raw_distance)
35
+ return { e_above_hull, is_stable: e_above_hull <= tol }
36
+ }
37
+
38
+ type StabilityEntry = { is_stable?: boolean; e_above_hull?: number }
39
+
40
+ export const entry_is_stable = (
41
+ entry: StabilityEntry,
42
+ tol: number = HULL_STABILITY_TOL,
43
+ ): boolean =>
44
+ entry.is_stable === true ||
45
+ (entry.is_stable !== false && Math.abs(entry.e_above_hull ?? Infinity) <= tol)
46
+
47
+ // Check if entry is on the convex hull (stable or e_above_hull ≈ 0)
48
+ export const is_on_hull = (entry: PhaseData, tol: number = HULL_STABILITY_TOL): boolean =>
49
+ !entry.exclude_from_hull && entry_is_stable(entry, tol)
50
+
51
+ export const get_arity = (entry: PhaseData): number =>
52
+ Object.values(entry.composition).filter((count) => count > 0).length
53
+
54
+ export const is_unary_entry = (entry: PhaseData) => get_arity(entry) === 1
55
+
56
+ export const entry_is_unstable = (entry: StabilityEntry): boolean => !entry_is_stable(entry)
57
+
58
+ export const entry_is_visible = (
59
+ entry: StabilityEntry,
60
+ show_stable: boolean,
61
+ show_unstable: boolean,
62
+ ): boolean => (entry_is_stable(entry) ? show_stable : show_unstable)
63
+
64
+ export const visible_entries = <Entry extends StabilityEntry>(
65
+ entries: readonly Entry[],
66
+ show_stable: boolean,
67
+ show_unstable: boolean,
68
+ ): Entry[] => entries.filter((entry) => entry_is_visible(entry, show_stable, show_unstable))
69
+
70
+ // Energy color scale factory (shared)
71
+ export function get_energy_color_scale(
72
+ color_mode: `stability` | `energy`,
73
+ color_scale: D3InterpolateName,
74
+ plot_entries: { e_above_hull?: number }[],
75
+ ): ((value: number) => string) | null {
76
+ if (color_mode !== `energy` || plot_entries.length === 0) return null
77
+ let lo = Number.POSITIVE_INFINITY
78
+ let hi_raw = 0.1
79
+ for (const entry of plot_entries) {
80
+ const val = entry.e_above_hull
81
+ if (typeof val !== `number` || !Number.isFinite(val)) continue
82
+ lo = Math.min(lo, val)
83
+ hi_raw = Math.max(hi_raw, val)
84
+ }
85
+ if (!Number.isFinite(lo)) return null
86
+ const hi = Math.max(hi_raw, lo + 1e-6)
87
+ const interpolator = get_d3_interpolator(color_scale)
88
+ return scaleSequential(interpolator).domain([lo, hi])
89
+ }
90
+
91
+ // Point color resolver (shared)
92
+ export function get_point_color_for_entry(
93
+ entry: { is_stable?: boolean; e_above_hull?: number },
94
+ color_mode: `stability` | `energy`,
95
+ colors: ConvexHullConfig[`colors`] | undefined,
96
+ energy_scale: ((value: number) => string) | null,
97
+ ): string {
98
+ const is_stable = entry_is_stable(entry)
99
+ if (color_mode === `stability`) {
100
+ return is_stable ? colors?.stable || `#0072B2` : colors?.unstable || `#E69F00`
101
+ }
102
+ return energy_scale && typeof entry.e_above_hull === `number`
103
+ ? energy_scale(entry.e_above_hull)
104
+ : `#666`
105
+ }
106
+
107
+ // Robust drag-and-drop JSON parsing for convex hull entries
108
+ export async function parse_hull_entries_from_drop(
109
+ event: DragEvent,
110
+ ): Promise<PhaseData[] | null> {
111
+ event.preventDefault()
112
+ const file = event.dataTransfer?.files?.[0]
113
+ if (!file?.name.endsWith(`.json`)) return null
114
+ try {
115
+ const data = JSON.parse(await file.text()) as PhaseData[]
116
+ if (!Array.isArray(data) || data.length === 0) return null
117
+ if (!data[0].composition || typeof data[0].energy !== `number`) return null
118
+ return data
119
+ } catch (error) {
120
+ console.error(`Error parsing dropped file:`, error)
121
+ return null
122
+ }
123
+ }
124
+
125
+ // Compute a consistent max energy threshold for controls (shared)
126
+ export function calc_max_hull_dist_in_data(processed_entries: PhaseData[]): number {
127
+ if (processed_entries.length === 0) return 0.5
128
+ let max_hull_dist = 0
129
+ for (const entry of processed_entries) {
130
+ const val = entry.e_above_hull
131
+ if (typeof val === `number` && Number.isFinite(val)) {
132
+ max_hull_dist = Math.max(max_hull_dist, val)
133
+ }
134
+ }
135
+ const max_val = max_hull_dist + 0.001
136
+ return Math.max(0.1, max_val)
137
+ }
138
+
139
+ // Smart threshold for showing unstable entries based on entry count.
140
+ // Few entries (≤25): show all. Many entries (≥100): use static default. Between: interpolate.
141
+ export function compute_auto_hull_dist_threshold(
142
+ n_entries: number,
143
+ max_hull_dist_in_data: number,
144
+ static_default: number,
145
+ ): number {
146
+ const [LOW, HIGH] = [25, 100]
147
+ if (n_entries <= LOW) return max_hull_dist_in_data
148
+ if (n_entries >= HIGH) return static_default
149
+ const t = (n_entries - LOW) / (HIGH - LOW)
150
+ return max_hull_dist_in_data * (1 - t) + static_default * t
151
+ }
152
+
153
+ export function auto_threshold_reset(default_threshold: number) {
154
+ let source: unknown
155
+ let auto_threshold = default_threshold
156
+ let initialized = false
157
+ return (next_source: unknown, current_threshold: number, next_auto_threshold: number) => {
158
+ if (initialized && next_source === source) return undefined
159
+ const user_changed = initialized && Math.abs(current_threshold - auto_threshold) > 0.001
160
+ source = next_source
161
+ auto_threshold = next_auto_threshold
162
+ initialized = true
163
+ return user_changed ? undefined : next_auto_threshold
164
+ }
165
+ }
166
+
167
+ export function current_entry<Entry extends { entry_id?: string }>(
168
+ entry: Entry | null | undefined,
169
+ entries: readonly Entry[],
170
+ ): Entry | null {
171
+ if (!entry) return null
172
+ if (entry.entry_id) {
173
+ return entries.find((candidate) => candidate.entry_id === entry.entry_id) ?? null
174
+ }
175
+ return entries.includes(entry) ? entry : null
176
+ }
177
+
178
+ // Build a tooltip text for any phase entry (shared)
179
+ export function build_entry_tooltip_text(entry: PhaseData): string {
180
+ const is_element = is_unary_entry(entry)
181
+ const elem_symbol = is_element ? Object.keys(entry.composition)[0] : ``
182
+
183
+ const elem_name = is_element ? (ELEM_SYMBOL_TO_NAME[elem_symbol as ElementSymbol] ?? ``) : ``
184
+
185
+ let text = is_element
186
+ ? `${elem_symbol}${elem_name ? ` (${elem_name})` : ``}\n`
187
+ : `${entry.name || entry.reduced_formula || ``}\n`
188
+
189
+ if (!is_element) {
190
+ const total = Object.values(entry.composition).reduce((sum, amt) => sum + amt, 0)
191
+ if (total > 0) {
192
+ const fractions = Object.entries(entry.composition)
193
+ .filter(([, amt]) => amt > 0)
194
+ .map(([el, amt]) => `${el}: ${format_fractional(amt / total)}`)
195
+ if (fractions.length > 1) {
196
+ text += `Composition: ${fractions.join(`, `)}\n`
197
+ }
198
+ }
199
+ }
200
+
201
+ if (entry.e_above_hull !== undefined) {
202
+ const e_hull_str = format_num(entry.e_above_hull, `.3~`)
203
+ text += `E<sub>above hull</sub>: ${e_hull_str} eV/atom\n`
204
+ }
205
+ // Fallback to energy_per_atom if e_form_per_atom is absent
206
+ const e_form_display = entry.e_form_per_atom ?? entry.energy_per_atom
207
+ if (e_form_display !== undefined) {
208
+ const e_form_str = format_num(e_form_display, `.3~`)
209
+ text += `E<sub>form</sub>: ${e_form_str} eV/atom`
210
+ }
211
+ if (entry.entry_id) text += `\nID: ${entry.entry_id}`
212
+ return text
213
+ }
214
+
215
+ // Generic mouse hit-testing for projected 3D points (shared)
216
+ export function find_hull_entry_at_mouse<
217
+ T extends {
218
+ x: number
219
+ y: number
220
+ z: number
221
+ size?: number
222
+ is_stable?: boolean
223
+ e_above_hull?: number
224
+ },
225
+ >(
226
+ canvas: HTMLCanvasElement | undefined,
227
+ event: MouseEvent,
228
+ plot_entries: T[],
229
+ project_point: (x: number, y: number, z: number) => { x: number; y: number },
230
+ ): T | null {
231
+ if (!canvas) return null
232
+ const rect = canvas.getBoundingClientRect()
233
+ const mouse_x = event.clientX - rect.left
234
+ const mouse_y = event.clientY - rect.top
235
+ const container_scale = Math.min(canvas.clientWidth || 600, canvas.clientHeight || 600) / 600
236
+ for (const entry of plot_entries) {
237
+ const projected = project_point(entry.x, entry.y, entry.z)
238
+ const distance = Math.hypot(mouse_x - projected.x, mouse_y - projected.y)
239
+ const base = entry.size ?? (entry_is_stable(entry) ? 6 : 4)
240
+ if (distance < base * container_scale + 5) return entry
241
+ }
242
+ return null
243
+ }
244
+
245
+ // Calculate which side of the viewport has more space for modal placement
246
+ export function calculate_modal_side(wrapper: HTMLDivElement | undefined): boolean {
247
+ if (!wrapper) return true
248
+ const rect = wrapper.getBoundingClientRect()
249
+ const viewport_width = globalThis.innerWidth
250
+ const space_on_right = viewport_width - rect.right
251
+ const space_on_left = rect.left
252
+ return space_on_right >= space_on_left
253
+ }
254
+
255
+ // Compute energy source mode information for convex hull entries. Returns energy mode information including capability flags and resolved mode.
256
+ // This determines whether we can use precomputed energies or need to compute on-the-fly.
257
+ export function compute_energy_mode_info(
258
+ entries: PhaseData[], // Array of phase entries to analyze
259
+ find_lowest_energy_unary_refs_fn: (entries: PhaseData[]) => Record<string, PhaseData>, // Function to find unary references
260
+ energy_source_mode: `precomputed` | `on-the-fly`, // User-specified energy source mode preference
261
+ ): EnergyModeInfo {
262
+ const has_precomputed_e_form =
263
+ entries.length > 0 && entries.every((entry) => typeof entry.e_form_per_atom === `number`)
264
+ const has_precomputed_hull =
265
+ entries.length > 0 && entries.every((entry) => typeof entry.e_above_hull === `number`)
266
+
267
+ const unary_refs = find_lowest_energy_unary_refs_fn(entries)
268
+
269
+ const elements_in_entries = new Set<string>()
270
+ for (const entry of entries) {
271
+ for (const el of Object.keys(entry.composition)) elements_in_entries.add(el)
272
+ }
273
+ let can_compute_e_form = true
274
+ for (const el of elements_in_entries) {
275
+ if (!unary_refs[el]) {
276
+ can_compute_e_form = false
277
+ break
278
+ }
279
+ }
280
+ const can_compute_hull = can_compute_e_form
281
+
282
+ // Resolve mode to avoid inconsistent states:
283
+ // - If full precomputed available, honor user toggle
284
+ // - Else if we can compute both, use on-the-fly automatically
285
+ // - Else fall back to precomputed (best-effort)
286
+ const energy_mode =
287
+ has_precomputed_e_form && has_precomputed_hull
288
+ ? energy_source_mode
289
+ : can_compute_e_form && can_compute_hull
290
+ ? `on-the-fly`
291
+ : `precomputed`
292
+
293
+ return {
294
+ has_precomputed_e_form,
295
+ has_precomputed_hull,
296
+ can_compute_e_form,
297
+ can_compute_hull,
298
+ energy_mode,
299
+ unary_refs,
300
+ }
301
+ }
302
+
303
+ // Compute effective entries with formation energies based on the energy mode.
304
+ // Returns entries with formation energies populated (either precomputed or on-the-fly)
305
+ export function get_effective_entries(
306
+ entries: PhaseData[], // Original phase entries
307
+ energy_mode: `precomputed` | `on-the-fly`, // Energy source mode (precomputed or on-the-fly)
308
+ unary_refs: Record<string, PhaseData>, // Unary reference entries for energy computation
309
+ compute_e_form_fn: (
310
+ entry: PhaseData,
311
+ unary_refs: Record<string, PhaseData>,
312
+ ) => number | null, // Function to compute formation energy per atom
313
+ ): PhaseData[] {
314
+ if (energy_mode === `precomputed`) return entries
315
+
316
+ return entries.map((entry) => {
317
+ const e_form = compute_e_form_fn(entry, unary_refs)
318
+ if (e_form === null) return entry
319
+ return { ...entry, e_form_per_atom: e_form }
320
+ })
321
+ }
322
+
323
+ // Copy text to clipboard with visual feedback
324
+ export async function copy_entry_to_clipboard(
325
+ entry: PhaseData,
326
+ position: { x: number; y: number },
327
+ on_feedback: (visible: boolean, pos: { x: number; y: number }) => void,
328
+ ): Promise<void> {
329
+ const text = build_entry_tooltip_text(entry)
330
+ await navigator.clipboard.writeText(text)
331
+ on_feedback(true, position)
332
+ setTimeout(() => on_feedback(false, position), 1500)
333
+ }
334
+
335
+ export const DEFAULT_HIGHLIGHT_STYLE: Required<HighlightStyle> = {
336
+ effect: `pulse`,
337
+ color: `#ff4444`, // Bright red for visibility
338
+ size_multiplier: 1.8, // Moderate base size
339
+ opacity: 0.85, // High visibility
340
+ pulse_speed: 3, // Smooth pulsing
341
+ }
342
+
343
+ export const merge_highlight_style = (
344
+ custom_style: HighlightStyle | undefined,
345
+ ): Required<HighlightStyle> => ({
346
+ ...DEFAULT_HIGHLIGHT_STYLE,
347
+ ...custom_style,
348
+ })
349
+
350
+ // Check if entry matches any item in highlighted_list (by structure_id or entry_id)
351
+ export function is_entry_highlighted<T extends { entry_id?: string; structure_id?: string }>(
352
+ entry: T,
353
+ highlighted_list: (string | T)[],
354
+ ): boolean {
355
+ if (!highlighted_list.length) return false
356
+ const { entry_id, structure_id } = entry
357
+ if (!entry_id && !structure_id) return false
358
+
359
+ return highlighted_list.some((item) => {
360
+ if (typeof item === `string`) {
361
+ return item === entry_id || item === structure_id
362
+ }
363
+ // Object: match by structure_id if present, else fall back to entry_id
364
+ return item?.structure_id
365
+ ? structure_id === item.structure_id
366
+ : item?.entry_id === entry_id
367
+ })
368
+ }
369
+
370
+ // Calculate fractional composition (normalized composition) for an entry
371
+ export function get_fractional_composition(
372
+ composition: Record<string, number>,
373
+ ): Record<string, number> {
374
+ const total = Object.values(composition).reduce((sum, amt) => sum + amt, 0)
375
+ if (total <= 0) return {} // Return empty object if total is zero or negative (invalid composition)
376
+ const fractional: Record<string, number> = {}
377
+ for (const [elem, amt] of Object.entries(composition)) {
378
+ // Only include positive amounts in fractional composition
379
+ if (amt > 0) fractional[elem] = amt / total
380
+ }
381
+ return fractional
382
+ }
383
+
384
+ export interface PolymorphStats {
385
+ total: number
386
+ higher: number
387
+ lower: number
388
+ equal: number
389
+ }
390
+
391
+ // Energy metric types for consistent polymorph comparison
392
+ type EnergyMetric = `e_form_per_atom` | `energy_per_atom` | `e_above_hull` | null
393
+
394
+ // Check if value is a finite number
395
+ const is_finite = (val: unknown): val is number =>
396
+ typeof val === `number` && Number.isFinite(val)
397
+
398
+ // Compute energy_per_atom from total energy and composition
399
+ function compute_energy_per_atom(entry: PhaseData): number | null {
400
+ if (!is_finite(entry.energy)) return null
401
+ const total_atoms = Object.values(entry.composition).reduce((sum, amt) => sum + amt, 0)
402
+ return total_atoms > 0 ? entry.energy / total_atoms : null
403
+ }
404
+
405
+ // Get energy value for an entry using a specific metric
406
+ // NOTE: We prioritize absolute energies (e_form_per_atom, energy_per_atom) over e_above_hull
407
+ // because polymorphs of the same composition on the hull all have e_above_hull=0
408
+ function get_entry_energy_by_metric(entry: PhaseData, metric: EnergyMetric): number | null {
409
+ if (metric === `e_form_per_atom` && is_finite(entry.e_form_per_atom)) {
410
+ return entry.e_form_per_atom
411
+ }
412
+ if (metric === `energy_per_atom`) {
413
+ return is_finite(entry.energy_per_atom)
414
+ ? entry.energy_per_atom
415
+ : compute_energy_per_atom(entry)
416
+ }
417
+ if (metric === `e_above_hull` && is_finite(entry.e_above_hull)) {
418
+ return entry.e_above_hull
419
+ }
420
+ return null
421
+ }
422
+
423
+ function get_label_representative_energy(entry: PhaseData): number {
424
+ if (is_finite(entry.e_form_per_atom)) return entry.e_form_per_atom
425
+ if (is_finite(entry.energy_per_atom)) return entry.energy_per_atom
426
+ const energy_per_atom = compute_energy_per_atom(entry)
427
+ if (energy_per_atom !== null) return energy_per_atom
428
+ if (is_finite(entry.energy)) return entry.energy
429
+ if (is_finite(entry.e_above_hull)) return entry.e_above_hull
430
+ return Number.POSITIVE_INFINITY
431
+ }
432
+
433
+ function get_fractional_composition_key(composition: Record<string, number>): string {
434
+ return Object.entries(get_fractional_composition(composition))
435
+ .sort(([elem_a], [elem_b]) => elem_a.localeCompare(elem_b))
436
+ .map(([elem, frac]) => `${elem}:${frac.toFixed(6)}`)
437
+ .join(`|`)
438
+ }
439
+
440
+ // Pick one label target per normalized composition. Multiple polymorphs, supercell
441
+ // formulas, or same-composition entries often project to the same screen position.
442
+ export function get_composition_label_entries<T extends PhaseData>(entries: Iterable<T>): T[] {
443
+ const label_entry_by_composition = new Map<string, T>()
444
+
445
+ for (const entry of entries) {
446
+ const comp_key = get_fractional_composition_key(entry.composition)
447
+ if (!comp_key) continue
448
+
449
+ const existing = label_entry_by_composition.get(comp_key)
450
+ if (
451
+ !existing ||
452
+ get_label_representative_energy(entry) < get_label_representative_energy(existing)
453
+ ) {
454
+ label_entry_by_composition.set(comp_key, entry)
455
+ }
456
+ }
457
+
458
+ return Array.from(label_entry_by_composition.values())
459
+ }
460
+
461
+ // Determine which energy metric to use for a composition group
462
+ // Returns the first metric that ALL entries in the group can provide
463
+ function select_group_energy_metric(polymorphs: PhaseData[]): EnergyMetric {
464
+ // Try e_form_per_atom first (best for comparing polymorphs)
465
+ if (polymorphs.every((entry) => is_finite(entry.e_form_per_atom))) {
466
+ return `e_form_per_atom`
467
+ }
468
+ // Try energy_per_atom (either direct field or computed from total energy)
469
+ if (
470
+ polymorphs.every(
471
+ (entry) => is_finite(entry.energy_per_atom) || compute_energy_per_atom(entry) !== null,
472
+ )
473
+ )
474
+ return `energy_per_atom`
475
+ // Last resort: e_above_hull (will fail to differentiate stable polymorphs with e_above_hull=0)
476
+ if (polymorphs.every((entry) => is_finite(entry.e_above_hull))) {
477
+ return `e_above_hull`
478
+ }
479
+
480
+ return null // No valid metric available for this group
481
+ }
482
+
483
+ // Pre-compute polymorph statistics for all entries at once (O(n²) but done once)
484
+ // Returns a Map keyed by entry_id for O(1) lookups during hover
485
+ export function compute_all_polymorph_stats(
486
+ all_entries: PhaseData[],
487
+ ): Map<string, PolymorphStats> {
488
+ const stats_map = new Map<string, PolymorphStats>()
489
+ const zero_stats = { total: 0, higher: 0, lower: 0, equal: 0 }
490
+
491
+ // Group entries by fractional composition (normalized stoichiometry)
492
+ const composition_groups = new Map<string, PhaseData[]>()
493
+ for (const entry of all_entries) {
494
+ const comp_key = get_fractional_composition_key(entry.composition)
495
+ const group = composition_groups.get(comp_key) ?? []
496
+ if (group.length === 0) composition_groups.set(comp_key, group)
497
+ group.push(entry)
498
+ }
499
+
500
+ // Calculate stats for each polymorph group
501
+ for (const polymorphs of composition_groups.values()) {
502
+ // Select one consistent metric for the entire composition group
503
+ const group_metric = select_group_energy_metric(polymorphs)
504
+
505
+ // If no valid metric available, set all entries in group to zero stats
506
+ if (group_metric === null) {
507
+ for (const entry of polymorphs) {
508
+ if (entry.entry_id) stats_map.set(entry.entry_id, zero_stats)
509
+ }
510
+ continue
511
+ }
512
+
513
+ // Compare entries using the consistent group metric
514
+ for (const entry of polymorphs) {
515
+ if (!entry.entry_id) continue
516
+
517
+ const entry_energy = get_entry_energy_by_metric(entry, group_metric)
518
+ if (entry_energy === null) {
519
+ stats_map.set(entry.entry_id, zero_stats)
520
+ continue
521
+ }
522
+
523
+ let [total, higher, lower, equal] = [0, 0, 0, 0]
524
+ for (const other of polymorphs) {
525
+ if (other === entry || other.entry_id === entry.entry_id) continue
526
+
527
+ const other_energy = get_entry_energy_by_metric(other, group_metric)
528
+ if (other_energy === null) continue
529
+
530
+ total++
531
+ if (other_energy > entry_energy) higher++
532
+ else if (other_energy < entry_energy) lower++
533
+ else equal++
534
+ }
535
+
536
+ stats_map.set(entry.entry_id, { total, higher, lower, equal })
537
+ }
538
+ }
539
+
540
+ return stats_map
541
+ }
542
+
543
+ function apply_alpha_to_color(color: string, alpha: number): string {
544
+ // Handle existing rgba format
545
+ if (color.includes(`rgba`)) return color.replace(/[\d.]+\)$/, `${alpha})`)
546
+
547
+ if (color.includes(`rgb(`)) {
548
+ // Convert rgb to rgba
549
+ return color.replace(/rgb\(/, `rgba(`).replace(/\)$/, `, ${alpha})`)
550
+ }
551
+
552
+ const hex_match = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(color) // Convert hex to rgba
553
+ if (hex_match) {
554
+ let hex = hex_match[1]
555
+ // Expand short form (e.g. "03F") to full form (e.g. "0033FF")
556
+ if (hex.length === 3)
557
+ hex = hex
558
+ .split(``)
559
+ .map((char) => char + char)
560
+ .join(``)
561
+
562
+ const red = parseInt(hex.slice(0, 2), 16)
563
+ const green = parseInt(hex.slice(2, 4), 16)
564
+ const blue = parseInt(hex.slice(4, 6), 16)
565
+ return `rgba(${red}, ${green}, ${blue}, ${alpha})`
566
+ }
567
+
568
+ return color // Return unchanged if format not recognized
569
+ }
570
+
571
+ export function draw_highlight_effect(
572
+ ctx: CanvasRenderingContext2D,
573
+ projected: { x: number; y: number },
574
+ size: number,
575
+ container_scale: number,
576
+ pulse_time: number,
577
+ style: Required<HighlightStyle>,
578
+ ): void {
579
+ const { effect, color: hl_color, size_multiplier, opacity, pulse_speed } = style
580
+
581
+ if (effect === `pulse`) {
582
+ // Smooth pulsating effect with moderate size and opacity changes
583
+ const pulse_val = 0.5 + 0.5 * Math.sin(pulse_time * pulse_speed)
584
+ const hl_size = size * (size_multiplier + 0.5 * pulse_val)
585
+ const hl_opacity = opacity * (0.5 + 0.5 * pulse_val)
586
+
587
+ // Draw pulsating ring
588
+ ctx.lineWidth = (1.5 + pulse_val) * container_scale
589
+ ctx.beginPath()
590
+ ctx.arc(projected.x, projected.y, hl_size, 0, 2 * Math.PI)
591
+ ctx.fillStyle = apply_alpha_to_color(hl_color, hl_opacity * 0.3)
592
+ ctx.strokeStyle = apply_alpha_to_color(hl_color, hl_opacity)
593
+ ctx.fill()
594
+ ctx.stroke()
595
+ } else if (effect === `glow`) {
596
+ // Soft glow effect with layered circles for depth
597
+ const hl_size = size * size_multiplier
598
+
599
+ // Outer soft glow
600
+ ctx.beginPath()
601
+ ctx.arc(projected.x, projected.y, hl_size * 1.3, 0, 2 * Math.PI)
602
+ ctx.fillStyle = apply_alpha_to_color(hl_color, opacity * 0.15)
603
+ ctx.fill()
604
+
605
+ // Inner glow with stroke
606
+ ctx.lineWidth = 1.5 * container_scale
607
+ ctx.beginPath()
608
+ ctx.arc(projected.x, projected.y, hl_size, 0, 2 * Math.PI)
609
+ ctx.fillStyle = apply_alpha_to_color(hl_color, opacity * 0.4)
610
+ ctx.strokeStyle = apply_alpha_to_color(hl_color, opacity * 0.8)
611
+ ctx.fill()
612
+ ctx.stroke()
613
+ } else if (effect === `size`) {
614
+ // Simple size highlight with stroke
615
+ const hl_size = size * size_multiplier
616
+ ctx.lineWidth = 2 * container_scale
617
+ ctx.beginPath()
618
+ ctx.arc(projected.x, projected.y, hl_size, 0, 2 * Math.PI)
619
+ ctx.strokeStyle = hl_color
620
+ ctx.stroke()
621
+ }
622
+ // effect === `color` is handled in the main drawing code
623
+ }
624
+
625
+ // Draw selection highlight for currently selected entry (with pulsing animation)
626
+ export function draw_selection_highlight(
627
+ ctx: CanvasRenderingContext2D,
628
+ projected: { x: number; y: number },
629
+ base_size: number,
630
+ container_scale: number,
631
+ pulse_time: number,
632
+ pulse_opacity: number,
633
+ ): void {
634
+ const highlight_size = base_size * (1.8 + 0.3 * Math.sin(pulse_time * 4))
635
+ ctx.fillStyle = apply_alpha_to_color(`rgba(102, 240, 255, 1)`, pulse_opacity * 0.6)
636
+ ctx.strokeStyle = apply_alpha_to_color(`rgba(102, 240, 255, 1)`, pulse_opacity)
637
+ ctx.lineWidth = 2 * container_scale
638
+ ctx.beginPath()
639
+ ctx.arc(projected.x, projected.y, highlight_size, 0, 2 * Math.PI)
640
+ ctx.fill()
641
+ ctx.stroke()
642
+ }
643
+
644
+ // Get text color for canvas rendering. Canvas 2D context doesn't understand CSS functions
645
+ // like light-dark() or var(), so we fall back to appropriate colors based on dark mode.
646
+ export function get_canvas_text_color(
647
+ dark_mode: boolean,
648
+ element?: HTMLElement | null,
649
+ ): string {
650
+ const fallback = dark_mode ? `#ffffff` : `#212121`
651
+ if (typeof document === `undefined`) return fallback
652
+ const css_value = getComputedStyle(element ?? document.documentElement)
653
+ .getPropertyValue(`--text-color`)
654
+ ?.trim()
655
+ // Check for unsupported CSS functions that canvas can't render
656
+ return css_value && !/light-dark|var\(/i.test(css_value) ? css_value : fallback
657
+ }
658
+
659
+ // Create a Path2D for a marker symbol. Uses d3-shape for consistent rendering with ScatterPlot.
660
+ export function create_marker_path(size: number, marker: MarkerSymbol = `circle`): Path2D {
661
+ const safe_size = Number.isFinite(size) ? size : 0
662
+ const rounded_size = Math.max(0, Number(safe_size.toFixed(3)))
663
+
664
+ // Capitalize first letter to get D3 symbol name (e.g. 'circle' -> 'Circle')
665
+ const d3_name = marker.charAt(0).toUpperCase() + marker.slice(1)
666
+ const symbol_type = symbol_map[d3_name as keyof typeof symbol_map]
667
+ const symbol_area = Math.PI * rounded_size * rounded_size
668
+ const path_data = symbol_type ? symbol().type(symbol_type).size(symbol_area)() : null
669
+ const path = new Path2D(path_data ?? undefined)
670
+
671
+ if (!path_data) {
672
+ path.arc(0, 0, rounded_size, 0, 2 * Math.PI)
673
+ }
674
+
675
+ return path
676
+ }
677
+
678
+ // Temperature-dependent free energy helpers (use integer K values for exact matching)
679
+
680
+ // Result of analyzing entries for temperature-dependent data
681
+ export interface TemperatureAnalysis {
682
+ has_temp_data: boolean
683
+ available_temperatures: number[] // sorted unique T values (union across all entries)
684
+ }
685
+
686
+ // Analyze entries for temperature-dependent free energy data.
687
+ // Returns available temperatures (union of all T values across entries) if any entries have temp data.
688
+ export function analyze_temperature_data(entries: PhaseData[]): TemperatureAnalysis {
689
+ const unique_temperatures = new Set<number>()
690
+ for (const entry of entries) {
691
+ if (!entry_has_temp_data(entry)) continue
692
+ for (const temperature of entry.temperatures ?? []) unique_temperatures.add(temperature)
693
+ }
694
+ const available_temperatures = [...unique_temperatures].sort((a, b) => a - b)
695
+ return {
696
+ has_temp_data: available_temperatures.length > 0,
697
+ available_temperatures,
698
+ }
699
+ }
700
+
701
+ // Check if an entry has valid temperature-dependent data (matching array lengths, non-empty)
702
+ function entry_has_temp_data(entry: PhaseData): boolean {
703
+ const { temperatures, free_energies } = entry
704
+ return Boolean(
705
+ temperatures?.length &&
706
+ free_energies?.length &&
707
+ temperatures.length === free_energies.length,
708
+ )
709
+ }
710
+
711
+ // Check if entry has data at exact temperature T
712
+ export const entry_has_temperature = (entry: PhaseData, T: number): boolean =>
713
+ entry_has_temp_data(entry) && (entry.temperatures?.includes(T) ?? false)
714
+
715
+ // Get energy at temperature T (throws if T not found - validate with entry_has_temperature first)
716
+ export function get_energy_at_temperature(entry: PhaseData, T: number): number {
717
+ const temps = entry.temperatures ?? []
718
+ const energies = entry.free_energies ?? []
719
+ const idx = temps.indexOf(T)
720
+ if (idx === -1) {
721
+ throw new Error(`Temperature ${T}K not found in entry temperatures`)
722
+ }
723
+ return energies[idx]
724
+ }
725
+
726
+ // Find bracketing temperatures for interpolation (T_low < T < T_high)
727
+ // Returns null if T is outside the range or no valid bracket exists
728
+ function find_bracket_temperatures(
729
+ entry: PhaseData,
730
+ T: number,
731
+ ): { T_low: number; T_high: number; E_low: number; E_high: number } | null {
732
+ const temps = entry.temperatures ?? []
733
+ const energies = entry.free_energies ?? []
734
+ if (temps.length < 2) return null
735
+
736
+ // Find the largest T_low < T and smallest T_high > T
737
+ let T_low = -Infinity
738
+ let T_high = Infinity
739
+ let E_low = 0
740
+ let E_high = 0
741
+
742
+ // Must scan all temperatures to find the tightest bracket (arrays may be unsorted)
743
+ for (const [idx, temp] of temps.entries()) {
744
+ if (temp < T && temp > T_low) {
745
+ T_low = temp
746
+ E_low = energies[idx]
747
+ } else if (temp > T && temp < T_high) {
748
+ T_high = temp
749
+ E_high = energies[idx]
750
+ }
751
+ }
752
+
753
+ // Must have valid brackets on both sides
754
+ if (!isFinite(T_low) || !isFinite(T_high)) return null
755
+ return { T_low, T_high, E_low, E_high }
756
+ }
757
+
758
+ // Check if we can interpolate energy at temperature T
759
+ // Requires temperatures both above and below T within max_gap
760
+ export function can_interpolate_at_temperature(
761
+ entry: PhaseData,
762
+ T: number,
763
+ max_gap: number,
764
+ ): boolean {
765
+ const bracket = find_bracket_temperatures(entry, T)
766
+ if (!bracket) return false
767
+ return bracket.T_high - bracket.T_low <= max_gap
768
+ }
769
+
770
+ // Linearly interpolate energy at temperature T
771
+ // Returns null if interpolation is not possible
772
+ export function interpolate_energy_at_temperature(
773
+ entry: PhaseData,
774
+ T: number,
775
+ max_gap: number,
776
+ ): number | null {
777
+ const bracket = find_bracket_temperatures(entry, T)
778
+ if (!bracket) return null
779
+ if (bracket.T_high - bracket.T_low > max_gap) return null
780
+
781
+ // Linear interpolation: E(T) = E_low + (E_high - E_low) * (T - T_low) / (T_high - T_low)
782
+ const fraction = (T - bracket.T_low) / (bracket.T_high - bracket.T_low)
783
+ return bracket.E_low + (bracket.E_high - bracket.E_low) * fraction
784
+ }
785
+
786
+ // Options for temperature filtering
787
+ export interface TemperatureFilterOptions {
788
+ // Enable linear interpolation for missing temperatures (default: true)
789
+ interpolate?: boolean
790
+ // Maximum temperature gap (in Kelvin) allowed for interpolation (default: 500K)
791
+ max_interpolation_gap?: number
792
+ }
793
+
794
+ const DEFAULT_TEMP_FILTER_OPTIONS: Required<TemperatureFilterOptions> = {
795
+ interpolate: true,
796
+ max_interpolation_gap: 500,
797
+ }
798
+
799
+ // Filter entries for temperature T, replacing energy with G(T) where available.
800
+ // - Entries WITH temp data at T: use G(T) as energy
801
+ // - Entries WITHOUT any temp data: keep with static energy (e.g., pure element refs)
802
+ // - Entries WITH temp data but MISSING T: interpolate if enabled and possible, else excluded
803
+ export function filter_entries_at_temperature(
804
+ entries: PhaseData[],
805
+ T: number,
806
+ options: TemperatureFilterOptions = {},
807
+ ): PhaseData[] {
808
+ const { interpolate, max_interpolation_gap } = {
809
+ ...DEFAULT_TEMP_FILTER_OPTIONS,
810
+ ...options,
811
+ }
812
+
813
+ return entries.flatMap((entry) => {
814
+ // No temp data - keep with static energy
815
+ if (!entry_has_temp_data(entry)) return [entry]
816
+
817
+ // Exact temperature match - use G(T)
818
+ // Set both energy and energy_per_atom so downstream formation energy
819
+ // calculations use the temperature-dependent value (not stale 0K energy_per_atom)
820
+ if (entry_has_temperature(entry, T)) {
821
+ // free_energies stores per-atom values (E_0K/atom + F_vib/atom),
822
+ // so energy is already per-atom — set both fields to the same value
823
+ const energy = get_energy_at_temperature(entry, T)
824
+ return [{ ...entry, energy, energy_per_atom: energy }]
825
+ }
826
+
827
+ // Try interpolation if enabled
828
+ if (interpolate) {
829
+ const energy = interpolate_energy_at_temperature(entry, T, max_interpolation_gap)
830
+ if (energy !== null) {
831
+ // interpolated energy is also per-atom (interpolated from per-atom free_energies)
832
+ return [{ ...entry, energy, energy_per_atom: energy }]
833
+ }
834
+ }
835
+
836
+ // Exclude entry (has temp data but can't get energy at T)
837
+ return []
838
+ })
839
+ }
840
+
841
+ // Gas-dependent chemical potential helpers
842
+
843
+ // Analyze entries for gas-dependent elements (safe wrapper with optional config)
844
+ // Returns information about which gases are relevant for the chemical system.
845
+ export function safe_analyze_gas_data(
846
+ entries: PhaseData[],
847
+ config?: GasThermodynamicsConfig,
848
+ ): GasAnalysis {
849
+ if (!config?.enabled_gases?.length) {
850
+ return {
851
+ has_gas_dependent_elements: false,
852
+ gas_elements: [],
853
+ relevant_gases: [],
854
+ }
855
+ }
856
+ return _analyze_gas_data(entries, config)
857
+ }
858
+
859
+ // Apply gas chemical potential corrections to entries (safe wrapper with optional config)
860
+ // This adjusts formation energies based on gas atmosphere conditions (T, P).
861
+ // Should be applied after temperature filtering.
862
+ export function safe_apply_gas_corrections(
863
+ entries: PhaseData[],
864
+ config: GasThermodynamicsConfig | undefined,
865
+ T: number,
866
+ ): PhaseData[] {
867
+ if (!config?.enabled_gases?.length) return entries
868
+ return _apply_gas_corrections(entries, config, T)
869
+ }
870
+
871
+ // Get gas-corrected entries in one call (consolidates analysis + correction)
872
+ // Merges gas_pressures with config.pressures and applies corrections if the
873
+ // chemical system contains gas-dependent elements. Returns original entries
874
+ // if no gas config or no relevant gases.
875
+ export function get_gas_corrected_entries(
876
+ entries: PhaseData[],
877
+ gas_config: GasThermodynamicsConfig | undefined,
878
+ gas_pressures: Partial<Record<string, number>>,
879
+ temperature: number,
880
+ ): {
881
+ entries: PhaseData[]
882
+ analysis: GasAnalysis
883
+ merged_config: GasThermodynamicsConfig | undefined
884
+ } {
885
+ if (!gas_config?.enabled_gases?.length) {
886
+ return {
887
+ entries,
888
+ analysis: {
889
+ has_gas_dependent_elements: false,
890
+ gas_elements: [],
891
+ relevant_gases: [],
892
+ },
893
+ merged_config: undefined,
894
+ }
895
+ }
896
+
897
+ const merged_config: GasThermodynamicsConfig = {
898
+ ...gas_config,
899
+ pressures: { ...gas_config.pressures, ...gas_pressures },
900
+ }
901
+ const analysis = _analyze_gas_data(entries, merged_config)
902
+
903
+ if (!analysis.has_gas_dependent_elements) {
904
+ return { entries, analysis, merged_config }
905
+ }
906
+
907
+ return {
908
+ entries: _apply_gas_corrections(entries, merged_config, temperature),
909
+ analysis,
910
+ merged_config,
911
+ }
912
+ }
913
+
914
+ // Derive a display label for a convex hull entry, falling back to composition
915
+ // when reduced_formula and name are both missing.
916
+ export function get_entry_label(
917
+ entry: { reduced_formula?: string; name?: string; composition: Record<string, number> },
918
+ elements?: ElementSymbol[],
919
+ ): string {
920
+ if (entry.reduced_formula) return entry.reduced_formula
921
+ if (entry.name) return entry.name
922
+ let pairs = Object.entries(entry.composition).filter(([, amt]) => amt > 0)
923
+ if (elements) {
924
+ pairs = pairs.sort(
925
+ ([el1], [el2]) =>
926
+ elements.indexOf(el1 as ElementSymbol) - elements.indexOf(el2 as ElementSymbol),
927
+ )
928
+ }
929
+ return pairs
930
+ .map(([el, amt]) => (Math.abs(amt - 1) < 1e-6 ? el : `${el}${format_num(amt, `.2~`)}`))
931
+ .join(``)
932
+ }