matterviz 0.3.6 → 0.4.0

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 (926) hide show
  1. package/dist/EmptyState.svelte.d.ts +9 -0
  2. package/dist/FilePicker.svelte +360 -0
  3. package/dist/FilePicker.svelte.d.ts +17 -0
  4. package/dist/Icon.svelte +44 -0
  5. package/dist/Icon.svelte.d.ts +13 -0
  6. package/dist/MillerIndexInput.svelte +66 -0
  7. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  8. package/dist/api/mp.d.ts +6 -0
  9. package/dist/api/mp.js +22 -0
  10. package/dist/api/optimade.d.ts +45 -0
  11. package/dist/api/optimade.js +141 -0
  12. package/dist/app.css +244 -0
  13. package/dist/brillouin/BrillouinZone.svelte +554 -0
  14. package/dist/brillouin/BrillouinZone.svelte.d.ts +84 -0
  15. package/dist/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +17 -0
  17. package/dist/brillouin/BrillouinZoneExportPane.svelte +146 -0
  18. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +15 -0
  19. package/dist/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  20. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +13 -0
  21. package/dist/brillouin/BrillouinZoneScene.svelte +522 -0
  22. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +49 -0
  23. package/dist/brillouin/BrillouinZoneTooltip.svelte +83 -0
  24. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +8 -0
  25. package/dist/brillouin/compute.d.ts +17 -0
  26. package/dist/brillouin/compute.js +422 -0
  27. package/dist/brillouin/index.d.ts +8 -0
  28. package/dist/brillouin/index.js +7 -0
  29. package/dist/brillouin/types.d.ts +43 -0
  30. package/dist/brillouin/types.js +1 -0
  31. package/dist/chempot-diagram/ChemPotDiagram.svelte +328 -0
  32. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  33. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +843 -0
  34. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  35. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3191 -0
  36. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  37. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  38. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  39. package/dist/chempot-diagram/async-compute.svelte.js +80 -0
  40. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  41. package/dist/chempot-diagram/chempot-worker.js +12 -0
  42. package/dist/chempot-diagram/color.d.ts +10 -0
  43. package/dist/chempot-diagram/color.js +32 -0
  44. package/dist/chempot-diagram/compute.d.ts +48 -0
  45. package/dist/chempot-diagram/compute.js +804 -0
  46. package/dist/chempot-diagram/index.d.ts +6 -0
  47. package/dist/chempot-diagram/index.js +6 -0
  48. package/dist/chempot-diagram/pointer.d.ts +16 -0
  49. package/dist/chempot-diagram/pointer.js +40 -0
  50. package/dist/chempot-diagram/temperature.d.ts +15 -0
  51. package/dist/chempot-diagram/temperature.js +34 -0
  52. package/dist/chempot-diagram/types.d.ts +81 -0
  53. package/dist/chempot-diagram/types.js +28 -0
  54. package/dist/colors/index.d.ts +47 -0
  55. package/dist/colors/index.js +204 -0
  56. package/dist/composition/BarChart.svelte +297 -0
  57. package/dist/composition/BarChart.svelte.d.ts +39 -0
  58. package/dist/composition/BubbleChart.svelte +218 -0
  59. package/dist/composition/BubbleChart.svelte.d.ts +28 -0
  60. package/dist/composition/Composition.svelte +165 -0
  61. package/dist/composition/Composition.svelte.d.ts +15 -0
  62. package/dist/composition/Formula.svelte +268 -0
  63. package/dist/composition/Formula.svelte.d.ts +19 -0
  64. package/dist/composition/FormulaFilter.svelte +1263 -0
  65. package/dist/composition/FormulaFilter.svelte.d.ts +51 -0
  66. package/dist/composition/PieChart.svelte +324 -0
  67. package/dist/composition/PieChart.svelte.d.ts +37 -0
  68. package/dist/composition/chem-sys.d.ts +8 -0
  69. package/dist/composition/chem-sys.js +85 -0
  70. package/dist/composition/format.d.ts +15 -0
  71. package/dist/composition/format.js +111 -0
  72. package/dist/composition/index.d.ts +21 -0
  73. package/dist/composition/index.js +15 -0
  74. package/dist/composition/parse.d.ts +56 -0
  75. package/dist/composition/parse.js +486 -0
  76. package/dist/constants.d.ts +29 -0
  77. package/dist/constants.js +99 -0
  78. package/dist/controls.d.ts +14 -0
  79. package/dist/controls.js +30 -0
  80. package/dist/convex-hull/ConvexHull.svelte +157 -0
  81. package/dist/convex-hull/ConvexHull.svelte.d.ts +13 -0
  82. package/dist/convex-hull/ConvexHull2D.svelte +827 -0
  83. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +11 -0
  84. package/dist/convex-hull/ConvexHull3D.svelte +1801 -0
  85. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +8 -0
  86. package/dist/convex-hull/ConvexHull4D.svelte +1394 -0
  87. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +8 -0
  88. package/dist/convex-hull/ConvexHullControls.svelte +535 -0
  89. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +48 -0
  90. package/dist/convex-hull/ConvexHullInfoPane.svelte +125 -0
  91. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +20 -0
  92. package/dist/convex-hull/ConvexHullStats.svelte +929 -0
  93. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +17 -0
  94. package/dist/convex-hull/ConvexHullTooltip.svelte +131 -0
  95. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +33 -0
  96. package/dist/convex-hull/GasPressureControls.svelte +247 -0
  97. package/dist/convex-hull/GasPressureControls.svelte.d.ts +11 -0
  98. package/dist/convex-hull/StructurePopup.svelte +151 -0
  99. package/dist/convex-hull/StructurePopup.svelte.d.ts +18 -0
  100. package/dist/convex-hull/TemperatureSlider.svelte +140 -0
  101. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +8 -0
  102. package/dist/convex-hull/barycentric-coords.d.ts +18 -0
  103. package/dist/convex-hull/barycentric-coords.js +182 -0
  104. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  105. package/dist/convex-hull/demo-temperature.js +38 -0
  106. package/dist/convex-hull/gas-thermodynamics.d.ts +16 -0
  107. package/dist/convex-hull/gas-thermodynamics.js +306 -0
  108. package/dist/convex-hull/helpers.d.ts +117 -0
  109. package/dist/convex-hull/helpers.js +718 -0
  110. package/dist/convex-hull/index.d.ts +119 -0
  111. package/dist/convex-hull/index.js +58 -0
  112. package/dist/convex-hull/thermodynamics.d.ts +67 -0
  113. package/dist/convex-hull/thermodynamics.js +1757 -0
  114. package/dist/convex-hull/types.d.ts +162 -0
  115. package/dist/convex-hull/types.js +36 -0
  116. package/dist/coordination/CoordinationBarPlot.svelte +311 -0
  117. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +30 -0
  118. package/dist/coordination/calc-coordination.d.ts +15 -0
  119. package/dist/coordination/calc-coordination.js +63 -0
  120. package/dist/coordination/index.d.ts +8 -0
  121. package/dist/coordination/index.js +7 -0
  122. package/dist/effects.svelte.d.ts +12 -0
  123. package/dist/effects.svelte.js +37 -0
  124. package/dist/element/BohrAtom.svelte.d.ts +20 -0
  125. package/dist/element/ElementHeading.svelte +26 -0
  126. package/dist/element/ElementHeading.svelte.d.ts +8 -0
  127. package/dist/element/ElementPhoto.svelte +57 -0
  128. package/dist/element/ElementPhoto.svelte.d.ts +9 -0
  129. package/dist/element/ElementStats.svelte +80 -0
  130. package/dist/element/ElementStats.svelte.d.ts +8 -0
  131. package/dist/element/ElementTile.svelte +484 -0
  132. package/dist/element/ElementTile.svelte.d.ts +29 -0
  133. package/dist/element/Nucleus.svelte.d.ts +17 -0
  134. package/dist/element/data.d.ts +2 -0
  135. package/dist/element/data.js +2 -0
  136. package/dist/element/index.d.ts +8 -0
  137. package/dist/element/index.js +7 -0
  138. package/dist/element/types.d.ts +57 -0
  139. package/dist/element/types.js +1 -0
  140. package/dist/feedback/ClickFeedback.svelte +58 -0
  141. package/dist/feedback/ClickFeedback.svelte.d.ts +12 -0
  142. package/dist/feedback/DragOverlay.svelte +42 -0
  143. package/dist/feedback/DragOverlay.svelte.d.ts +7 -0
  144. package/dist/feedback/Spinner.svelte.d.ts +7 -0
  145. package/dist/feedback/StatusMessage.svelte.d.ts +9 -0
  146. package/dist/feedback/index.d.ts +4 -0
  147. package/dist/feedback/index.js +4 -0
  148. package/dist/fermi-surface/FermiSlice.svelte +197 -0
  149. package/dist/fermi-surface/FermiSlice.svelte.d.ts +24 -0
  150. package/dist/fermi-surface/FermiSurface.svelte +606 -0
  151. package/dist/fermi-surface/FermiSurface.svelte.d.ts +83 -0
  152. package/dist/fermi-surface/FermiSurfaceControls.svelte +448 -0
  153. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +35 -0
  154. package/dist/fermi-surface/FermiSurfaceScene.svelte +797 -0
  155. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +50 -0
  156. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +85 -0
  157. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +8 -0
  158. package/dist/fermi-surface/compute.d.ts +5 -0
  159. package/dist/fermi-surface/compute.js +538 -0
  160. package/dist/fermi-surface/constants.d.ts +9 -0
  161. package/dist/fermi-surface/constants.js +27 -0
  162. package/dist/fermi-surface/export.d.ts +5 -0
  163. package/dist/fermi-surface/export.js +51 -0
  164. package/dist/fermi-surface/index.d.ts +12 -0
  165. package/dist/fermi-surface/index.js +13 -0
  166. package/dist/fermi-surface/marching-cubes.d.ts +2 -0
  167. package/dist/fermi-surface/marching-cubes.js +2 -0
  168. package/dist/fermi-surface/parse.d.ts +2 -0
  169. package/dist/fermi-surface/parse.js +494 -0
  170. package/dist/fermi-surface/symmetry.d.ts +3 -0
  171. package/dist/fermi-surface/symmetry.js +46 -0
  172. package/dist/fermi-surface/types.d.ts +111 -0
  173. package/dist/fermi-surface/types.js +4 -0
  174. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1547 -0
  175. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  176. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  177. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  178. package/dist/heatmap-matrix/index.d.ts +53 -0
  179. package/dist/heatmap-matrix/index.js +100 -0
  180. package/dist/heatmap-matrix/shared.d.ts +2 -0
  181. package/dist/heatmap-matrix/shared.js +4 -0
  182. package/dist/icons.d.ts +569 -0
  183. package/dist/icons.js +648 -0
  184. package/dist/index.d.ts +39 -0
  185. package/dist/index.js +39 -0
  186. package/dist/io/decompress.d.ts +11 -0
  187. package/dist/io/decompress.js +76 -0
  188. package/dist/io/export.d.ts +16 -0
  189. package/dist/io/export.js +338 -0
  190. package/dist/io/fetch.d.ts +5 -0
  191. package/dist/io/fetch.js +43 -0
  192. package/dist/io/file-drop.d.ts +7 -0
  193. package/dist/io/file-drop.js +42 -0
  194. package/dist/io/index.d.ts +7 -0
  195. package/dist/io/index.js +6 -0
  196. package/dist/io/is-binary.d.ts +1 -0
  197. package/dist/io/is-binary.js +20 -0
  198. package/dist/io/types.d.ts +8 -0
  199. package/dist/io/types.js +1 -0
  200. package/dist/io/url-drop.d.ts +2 -0
  201. package/dist/io/url-drop.js +154 -0
  202. package/dist/isosurface/Isosurface.svelte +285 -0
  203. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  204. package/dist/isosurface/IsosurfaceControls.svelte +277 -0
  205. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  206. package/dist/isosurface/index.d.ts +5 -0
  207. package/dist/isosurface/index.js +6 -0
  208. package/dist/isosurface/parse.d.ts +6 -0
  209. package/dist/isosurface/parse.js +552 -0
  210. package/dist/isosurface/slice.d.ts +11 -0
  211. package/dist/isosurface/slice.js +141 -0
  212. package/dist/isosurface/types.d.ts +56 -0
  213. package/dist/isosurface/types.js +227 -0
  214. package/dist/keyboard.d.ts +3 -0
  215. package/dist/keyboard.js +23 -0
  216. package/dist/labels.d.ts +53 -0
  217. package/dist/labels.js +278 -0
  218. package/dist/layout/FullscreenToggle.svelte +50 -0
  219. package/dist/layout/FullscreenToggle.svelte.d.ts +7 -0
  220. package/dist/layout/InfoCard.svelte +120 -0
  221. package/dist/layout/InfoCard.svelte.d.ts +21 -0
  222. package/dist/layout/InfoTag.svelte +185 -0
  223. package/dist/layout/InfoTag.svelte.d.ts +19 -0
  224. package/dist/layout/PropertyFilter.svelte +247 -0
  225. package/dist/layout/PropertyFilter.svelte.d.ts +24 -0
  226. package/dist/layout/SettingsSection.svelte +148 -0
  227. package/dist/layout/SettingsSection.svelte.d.ts +17 -0
  228. package/dist/layout/SubpageGrid.svelte +82 -0
  229. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  230. package/dist/layout/fullscreen.d.ts +9 -0
  231. package/dist/layout/fullscreen.js +53 -0
  232. package/dist/layout/index.d.ts +10 -0
  233. package/dist/layout/index.js +8 -0
  234. package/dist/layout/json-tree/JsonNode.svelte +548 -0
  235. package/dist/layout/json-tree/JsonNode.svelte.d.ts +11 -0
  236. package/dist/layout/json-tree/JsonTree.svelte +1230 -0
  237. package/dist/layout/json-tree/JsonTree.svelte.d.ts +6 -0
  238. package/dist/layout/json-tree/JsonValue.svelte.d.ts +9 -0
  239. package/dist/layout/json-tree/index.d.ts +3 -0
  240. package/dist/layout/json-tree/index.js +3 -0
  241. package/dist/layout/json-tree/types.d.ts +74 -0
  242. package/dist/layout/json-tree/types.js +2 -0
  243. package/dist/layout/json-tree/utils.d.ts +29 -0
  244. package/dist/layout/json-tree/utils.js +642 -0
  245. package/dist/marching-cubes.d.ts +14 -0
  246. package/dist/marching-cubes.js +535 -0
  247. package/dist/math.d.ts +105 -0
  248. package/dist/math.js +920 -0
  249. package/dist/overlays/ContextMenu.svelte +162 -0
  250. package/dist/overlays/ContextMenu.svelte.d.ts +25 -0
  251. package/dist/overlays/CopyButton.svelte +45 -0
  252. package/dist/overlays/CopyButton.svelte.d.ts +8 -0
  253. package/dist/overlays/DragControlTab.svelte +98 -0
  254. package/dist/overlays/DragControlTab.svelte.d.ts +8 -0
  255. package/dist/overlays/DraggablePane.svelte +487 -0
  256. package/dist/overlays/DraggablePane.svelte.d.ts +36 -0
  257. package/dist/overlays/InfoPaneCards.svelte +149 -0
  258. package/dist/overlays/InfoPaneCards.svelte.d.ts +22 -0
  259. package/dist/overlays/index.d.ts +3 -0
  260. package/dist/overlays/index.js +3 -0
  261. package/dist/periodic-table/PeriodicTable.svelte +480 -0
  262. package/dist/periodic-table/PeriodicTable.svelte.d.ts +55 -0
  263. package/dist/periodic-table/PeriodicTableControls.svelte +557 -0
  264. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +24 -0
  265. package/dist/periodic-table/PropertySelect.svelte +38 -0
  266. package/dist/periodic-table/PropertySelect.svelte.d.ts +13 -0
  267. package/dist/periodic-table/TableInset.svelte.d.ts +9 -0
  268. package/dist/periodic-table/index.d.ts +10 -0
  269. package/dist/periodic-table/index.js +4 -0
  270. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1092 -0
  271. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +44 -0
  272. package/dist/phase-diagram/PhaseDiagramControls.svelte +444 -0
  273. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +30 -0
  274. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +127 -0
  275. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  276. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  277. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +19 -0
  278. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  279. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +16 -0
  280. package/dist/phase-diagram/TdbInfoPanel.svelte +203 -0
  281. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +12 -0
  282. package/dist/phase-diagram/build-diagram.d.ts +11 -0
  283. package/dist/phase-diagram/build-diagram.js +160 -0
  284. package/dist/phase-diagram/colors.d.ts +35 -0
  285. package/dist/phase-diagram/colors.js +51 -0
  286. package/dist/phase-diagram/diagram-input.d.ts +29 -0
  287. package/dist/phase-diagram/diagram-input.js +3 -0
  288. package/dist/phase-diagram/index.d.ts +13 -0
  289. package/dist/phase-diagram/index.js +11 -0
  290. package/dist/phase-diagram/parse.d.ts +55 -0
  291. package/dist/phase-diagram/parse.js +273 -0
  292. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  293. package/dist/phase-diagram/svg-to-diagram.js +867 -0
  294. package/dist/phase-diagram/types.d.ts +93 -0
  295. package/dist/phase-diagram/types.js +1 -0
  296. package/dist/phase-diagram/utils.d.ts +118 -0
  297. package/dist/phase-diagram/utils.js +600 -0
  298. package/dist/plot/bar/BarPlot.svelte +1755 -0
  299. package/dist/plot/bar/BarPlot.svelte.d.ts +84 -0
  300. package/dist/plot/bar/BarPlotControls.svelte +67 -0
  301. package/dist/plot/bar/BarPlotControls.svelte.d.ts +18 -0
  302. package/dist/plot/bar/SpacegroupBarPlot.svelte +293 -0
  303. package/dist/plot/bar/SpacegroupBarPlot.svelte.d.ts +9 -0
  304. package/dist/plot/bar/data.d.ts +40 -0
  305. package/dist/plot/bar/data.js +154 -0
  306. package/dist/plot/bar/geometry.d.ts +39 -0
  307. package/dist/plot/bar/geometry.js +60 -0
  308. package/dist/plot/bar/index.d.ts +3 -0
  309. package/dist/plot/bar/index.js +3 -0
  310. package/dist/plot/box/BoxPlot.svelte +1462 -0
  311. package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
  312. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  313. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  314. package/dist/plot/box/Violin.svelte +14 -0
  315. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  316. package/dist/plot/box/box-plot.d.ts +55 -0
  317. package/dist/plot/box/box-plot.js +126 -0
  318. package/dist/plot/box/index.d.ts +5 -0
  319. package/dist/plot/box/index.js +5 -0
  320. package/dist/plot/box/kde.d.ts +16 -0
  321. package/dist/plot/box/kde.js +160 -0
  322. package/dist/plot/box/quantile.d.ts +3 -0
  323. package/dist/plot/box/quantile.js +53 -0
  324. package/dist/plot/core/auto-place.d.ts +43 -0
  325. package/dist/plot/core/auto-place.js +122 -0
  326. package/dist/plot/core/axis-utils.d.ts +46 -0
  327. package/dist/plot/core/axis-utils.js +110 -0
  328. package/dist/plot/core/components/AxisLabel.svelte +51 -0
  329. package/dist/plot/core/components/AxisLabel.svelte.d.ts +16 -0
  330. package/dist/plot/core/components/ColorBar.svelte +724 -0
  331. package/dist/plot/core/components/ColorBar.svelte.d.ts +31 -0
  332. package/dist/plot/core/components/ColorScaleSelect.svelte +55 -0
  333. package/dist/plot/core/components/ColorScaleSelect.svelte.d.ts +15 -0
  334. package/dist/plot/core/components/ControlPane.svelte +46 -0
  335. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  336. package/dist/plot/core/components/FillArea.svelte +234 -0
  337. package/dist/plot/core/components/FillArea.svelte.d.ts +21 -0
  338. package/dist/plot/core/components/InteractiveAxisLabel.svelte +96 -0
  339. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +14 -0
  340. package/dist/plot/core/components/Line.svelte +101 -0
  341. package/dist/plot/core/components/Line.svelte.d.ts +15 -0
  342. package/dist/plot/core/components/PlotAxis.svelte +171 -0
  343. package/dist/plot/core/components/PlotAxis.svelte.d.ts +25 -0
  344. package/dist/plot/core/components/PlotControls.svelte +525 -0
  345. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  346. package/dist/plot/core/components/PlotLegend.svelte +580 -0
  347. package/dist/plot/core/components/PlotLegend.svelte.d.ts +30 -0
  348. package/dist/plot/core/components/PlotTooltip.svelte +83 -0
  349. package/dist/plot/core/components/PlotTooltip.svelte.d.ts +25 -0
  350. package/dist/plot/core/components/PortalSelect.svelte +257 -0
  351. package/dist/plot/core/components/PortalSelect.svelte.d.ts +16 -0
  352. package/dist/plot/core/components/ReferenceLine.svelte +204 -0
  353. package/dist/plot/core/components/ReferenceLine.svelte.d.ts +20 -0
  354. package/dist/plot/core/components/ReferenceLine3D.svelte +156 -0
  355. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +14 -0
  356. package/dist/plot/core/components/ReferencePlane.svelte +175 -0
  357. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +14 -0
  358. package/dist/plot/core/components/ZeroLines.svelte +97 -0
  359. package/dist/plot/core/components/ZeroLines.svelte.d.ts +33 -0
  360. package/dist/plot/core/components/ZoomRect.svelte +23 -0
  361. package/dist/plot/core/components/ZoomRect.svelte.d.ts +8 -0
  362. package/dist/plot/core/components/index.d.ts +17 -0
  363. package/dist/plot/core/components/index.js +17 -0
  364. package/dist/plot/core/data-cleaning.d.ts +107 -0
  365. package/dist/plot/core/data-cleaning.js +853 -0
  366. package/dist/plot/core/data-transform.d.ts +16 -0
  367. package/dist/plot/core/data-transform.js +45 -0
  368. package/dist/plot/core/fill-utils.d.ts +33 -0
  369. package/dist/plot/core/fill-utils.js +388 -0
  370. package/dist/plot/core/hover-lock.svelte.d.ts +14 -0
  371. package/dist/plot/core/hover-lock.svelte.js +45 -0
  372. package/dist/plot/core/index.d.ts +10 -0
  373. package/dist/plot/core/index.js +11 -0
  374. package/dist/plot/core/interactions.d.ts +35 -0
  375. package/dist/plot/core/interactions.js +195 -0
  376. package/dist/plot/core/layout.d.ts +79 -0
  377. package/dist/plot/core/layout.js +281 -0
  378. package/dist/plot/core/reference-line.d.ts +60 -0
  379. package/dist/plot/core/reference-line.js +301 -0
  380. package/dist/plot/core/scales.d.ts +48 -0
  381. package/dist/plot/core/scales.js +480 -0
  382. package/dist/plot/core/svg.d.ts +2 -0
  383. package/dist/plot/core/svg.js +41 -0
  384. package/dist/plot/core/types.d.ts +771 -0
  385. package/dist/plot/core/types.js +99 -0
  386. package/dist/plot/core/utils/label-placement.d.ts +68 -0
  387. package/dist/plot/core/utils/label-placement.js +326 -0
  388. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  389. package/dist/plot/core/utils/series-visibility.js +112 -0
  390. package/dist/plot/core/utils.d.ts +11 -0
  391. package/dist/plot/core/utils.js +27 -0
  392. package/dist/plot/histogram/Histogram.svelte +1418 -0
  393. package/dist/plot/histogram/Histogram.svelte.d.ts +50 -0
  394. package/dist/plot/histogram/HistogramControls.svelte +212 -0
  395. package/dist/plot/histogram/HistogramControls.svelte.d.ts +22 -0
  396. package/dist/plot/histogram/index.d.ts +2 -0
  397. package/dist/plot/histogram/index.js +2 -0
  398. package/dist/plot/index.d.ts +8 -0
  399. package/dist/plot/index.js +10 -0
  400. package/dist/plot/sankey/Sankey.svelte +700 -0
  401. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  402. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  403. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  404. package/dist/plot/sankey/index.d.ts +4 -0
  405. package/dist/plot/sankey/index.js +3 -0
  406. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  407. package/dist/plot/sankey/sankey-types.js +4 -0
  408. package/dist/plot/sankey/sankey.d.ts +52 -0
  409. package/dist/plot/sankey/sankey.js +187 -0
  410. package/dist/plot/scatter/BinnedScatterPlot.svelte +1116 -0
  411. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +66 -0
  412. package/dist/plot/scatter/ElementScatter.svelte +63 -0
  413. package/dist/plot/scatter/ElementScatter.svelte.d.ts +14 -0
  414. package/dist/plot/scatter/ScatterPlot.svelte +2357 -0
  415. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +96 -0
  416. package/dist/plot/scatter/ScatterPlotControls.svelte +307 -0
  417. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +17 -0
  418. package/dist/plot/scatter/ScatterPoint.svelte +182 -0
  419. package/dist/plot/scatter/ScatterPoint.svelte.d.ts +22 -0
  420. package/dist/plot/scatter/adaptive-density.d.ts +79 -0
  421. package/dist/plot/scatter/adaptive-density.js +217 -0
  422. package/dist/plot/scatter/binned-scatter-types.d.ts +59 -0
  423. package/dist/plot/scatter/binned-scatter-types.js +1 -0
  424. package/dist/plot/scatter/index.d.ts +7 -0
  425. package/dist/plot/scatter/index.js +5 -0
  426. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  427. package/dist/plot/scatter/scatter-data.js +212 -0
  428. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +531 -0
  429. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +95 -0
  430. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +438 -0
  431. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +20 -0
  432. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +912 -0
  433. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +74 -0
  434. package/dist/plot/scatter-3d/Surface3D.svelte +197 -0
  435. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +13 -0
  436. package/dist/plot/scatter-3d/index.d.ts +4 -0
  437. package/dist/plot/scatter-3d/index.js +4 -0
  438. package/dist/plot/sunburst/Sunburst.svelte +1045 -0
  439. package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
  440. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  441. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  442. package/dist/plot/sunburst/index.d.ts +4 -0
  443. package/dist/plot/sunburst/index.js +4 -0
  444. package/dist/plot/sunburst/render.d.ts +34 -0
  445. package/dist/plot/sunburst/render.js +122 -0
  446. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  447. package/dist/plot/sunburst/sunburst.js +266 -0
  448. package/dist/rdf/RdfPlot.svelte +248 -0
  449. package/dist/rdf/RdfPlot.svelte.d.ts +27 -0
  450. package/dist/rdf/calc-rdf.d.ts +4 -0
  451. package/dist/rdf/calc-rdf.js +98 -0
  452. package/dist/rdf/index.d.ts +23 -0
  453. package/dist/rdf/index.js +2 -0
  454. package/dist/sanitize.d.ts +6 -0
  455. package/dist/sanitize.js +116 -0
  456. package/dist/settings.d.ts +319 -0
  457. package/dist/settings.js +1394 -0
  458. package/dist/spectral/Bands.svelte +1050 -0
  459. package/dist/spectral/Bands.svelte.d.ts +39 -0
  460. package/dist/spectral/BandsAndDos.svelte +134 -0
  461. package/dist/spectral/BandsAndDos.svelte.d.ts +18 -0
  462. package/dist/spectral/BrillouinBandsDos.svelte +264 -0
  463. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +20 -0
  464. package/dist/spectral/Dos.svelte +688 -0
  465. package/dist/spectral/Dos.svelte.d.ts +29 -0
  466. package/dist/spectral/helpers.d.ts +121 -0
  467. package/dist/spectral/helpers.js +1098 -0
  468. package/dist/spectral/index.d.ts +6 -0
  469. package/dist/spectral/index.js +6 -0
  470. package/dist/spectral/types.d.ts +84 -0
  471. package/dist/spectral/types.js +2 -0
  472. package/dist/state.svelte.d.ts +25 -0
  473. package/dist/state.svelte.js +45 -0
  474. package/dist/structure/Arrow.svelte +72 -0
  475. package/dist/structure/Arrow.svelte.d.ts +15 -0
  476. package/dist/structure/AtomLegend.svelte +814 -0
  477. package/dist/structure/AtomLegend.svelte.d.ts +35 -0
  478. package/dist/structure/Bond.svelte +140 -0
  479. package/dist/structure/Bond.svelte.d.ts +9 -0
  480. package/dist/structure/CanvasTooltip.svelte +33 -0
  481. package/dist/structure/CanvasTooltip.svelte.d.ts +12 -0
  482. package/dist/structure/CellSelect.svelte +348 -0
  483. package/dist/structure/CellSelect.svelte.d.ts +13 -0
  484. package/dist/structure/Cylinder.svelte +49 -0
  485. package/dist/structure/Cylinder.svelte.d.ts +13 -0
  486. package/dist/structure/Lattice.svelte +196 -0
  487. package/dist/structure/Lattice.svelte.d.ts +17 -0
  488. package/dist/structure/Structure.svelte +2254 -0
  489. package/dist/structure/Structure.svelte.d.ts +89 -0
  490. package/dist/structure/StructureControls.svelte +1273 -0
  491. package/dist/structure/StructureControls.svelte.d.ts +31 -0
  492. package/dist/structure/StructureExportPane.svelte +252 -0
  493. package/dist/structure/StructureExportPane.svelte.d.ts +17 -0
  494. package/dist/structure/StructureInfoPane.svelte +736 -0
  495. package/dist/structure/StructureInfoPane.svelte.d.ts +19 -0
  496. package/dist/structure/StructureScene.svelte +2256 -0
  497. package/dist/structure/StructureScene.svelte.d.ts +111 -0
  498. package/dist/structure/atom-properties.d.ts +37 -0
  499. package/dist/structure/atom-properties.js +200 -0
  500. package/dist/structure/bond-order-perception.d.ts +13 -0
  501. package/dist/structure/bond-order-perception.js +384 -0
  502. package/dist/structure/bonding.d.ts +69 -0
  503. package/dist/structure/bonding.js +724 -0
  504. package/dist/structure/export.d.ts +20 -0
  505. package/dist/structure/export.js +731 -0
  506. package/dist/structure/index.d.ts +124 -0
  507. package/dist/structure/index.js +167 -0
  508. package/dist/structure/label-placement.d.ts +14 -0
  509. package/dist/structure/label-placement.js +72 -0
  510. package/dist/structure/measure.d.ts +7 -0
  511. package/dist/structure/measure.js +30 -0
  512. package/dist/structure/parse.d.ts +66 -0
  513. package/dist/structure/parse.js +1410 -0
  514. package/dist/structure/partial-occupancy.d.ts +25 -0
  515. package/dist/structure/partial-occupancy.js +99 -0
  516. package/dist/structure/pbc.d.ts +9 -0
  517. package/dist/structure/pbc.js +127 -0
  518. package/dist/structure/supercell.d.ts +8 -0
  519. package/dist/structure/supercell.js +170 -0
  520. package/dist/structure/validation.d.ts +2 -0
  521. package/dist/structure/validation.js +10 -0
  522. package/dist/symmetry/SymmetryStats.svelte +226 -0
  523. package/dist/symmetry/SymmetryStats.svelte.d.ts +21 -0
  524. package/dist/symmetry/WyckoffTable.svelte +120 -0
  525. package/dist/symmetry/WyckoffTable.svelte.d.ts +11 -0
  526. package/dist/symmetry/cell-transform.d.ts +12 -0
  527. package/dist/symmetry/cell-transform.js +91 -0
  528. package/dist/symmetry/index.d.ts +43 -0
  529. package/dist/symmetry/index.js +226 -0
  530. package/dist/symmetry/spacegroups.d.ts +16 -0
  531. package/dist/symmetry/spacegroups.js +429 -0
  532. package/dist/table/HeatmapTable.svelte +1885 -0
  533. package/dist/table/HeatmapTable.svelte.d.ts +49 -0
  534. package/dist/table/ToggleMenu.svelte +385 -0
  535. package/dist/table/ToggleMenu.svelte.d.ts +11 -0
  536. package/dist/table/index.d.ts +72 -0
  537. package/dist/table/index.js +38 -0
  538. package/dist/theme/ThemeControl.svelte +53 -0
  539. package/dist/theme/ThemeControl.svelte.d.ts +9 -0
  540. package/dist/theme/index.d.ts +29 -0
  541. package/dist/theme/index.js +79 -0
  542. package/dist/time.d.ts +4 -0
  543. package/dist/time.js +70 -0
  544. package/dist/tooltip/KCoords.svelte +45 -0
  545. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  546. package/dist/tooltip/TooltipContent.svelte +58 -0
  547. package/dist/tooltip/TooltipContent.svelte.d.ts +31 -0
  548. package/dist/tooltip/index.d.ts +3 -0
  549. package/dist/tooltip/index.js +2 -0
  550. package/dist/tooltip/types.d.ts +8 -0
  551. package/dist/tooltip/types.js +1 -0
  552. package/dist/trajectory/Trajectory.svelte +1571 -0
  553. package/dist/trajectory/Trajectory.svelte.d.ts +78 -0
  554. package/dist/trajectory/TrajectoryError.svelte +128 -0
  555. package/dist/trajectory/TrajectoryError.svelte.d.ts +13 -0
  556. package/dist/trajectory/TrajectoryExportPane.svelte +358 -0
  557. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +17 -0
  558. package/dist/trajectory/TrajectoryInfoPane.svelte +314 -0
  559. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +17 -0
  560. package/dist/trajectory/constants.d.ts +6 -0
  561. package/dist/trajectory/constants.js +7 -0
  562. package/dist/trajectory/extract.d.ts +5 -0
  563. package/dist/trajectory/extract.js +162 -0
  564. package/dist/trajectory/format-detect.d.ts +10 -0
  565. package/dist/trajectory/format-detect.js +90 -0
  566. package/dist/trajectory/frame-reader.d.ts +17 -0
  567. package/dist/trajectory/frame-reader.js +299 -0
  568. package/dist/trajectory/helpers.d.ts +15 -0
  569. package/dist/trajectory/helpers.js +164 -0
  570. package/dist/trajectory/index.d.ts +63 -0
  571. package/dist/trajectory/index.js +126 -0
  572. package/dist/trajectory/parse/ase.d.ts +2 -0
  573. package/dist/trajectory/parse/ase.js +73 -0
  574. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  575. package/dist/trajectory/parse/hdf5.js +127 -0
  576. package/dist/trajectory/parse/index.d.ts +12 -0
  577. package/dist/trajectory/parse/index.js +306 -0
  578. package/dist/trajectory/parse/lammps.d.ts +5 -0
  579. package/dist/trajectory/parse/lammps.js +179 -0
  580. package/dist/trajectory/parse/vasp.d.ts +2 -0
  581. package/dist/trajectory/parse/vasp.js +87 -0
  582. package/dist/trajectory/parse/xyz.d.ts +26 -0
  583. package/dist/trajectory/parse/xyz.js +123 -0
  584. package/dist/trajectory/plotting.d.ts +28 -0
  585. package/dist/trajectory/plotting.js +423 -0
  586. package/dist/trajectory/types.d.ts +11 -0
  587. package/dist/trajectory/types.js +1 -0
  588. package/dist/utils.d.ts +7 -0
  589. package/dist/utils.js +47 -0
  590. package/dist/xrd/XrdPlot.svelte +616 -0
  591. package/dist/xrd/XrdPlot.svelte.d.ts +28 -0
  592. package/dist/xrd/broadening.d.ts +20 -0
  593. package/dist/xrd/broadening.js +97 -0
  594. package/dist/xrd/calc-xrd.d.ts +37 -0
  595. package/dist/xrd/calc-xrd.js +339 -0
  596. package/dist/xrd/index.d.ts +37 -0
  597. package/dist/xrd/index.js +4 -0
  598. package/dist/xrd/parse.d.ts +13 -0
  599. package/dist/xrd/parse.js +749 -0
  600. package/license +1 -1
  601. package/package.json +237 -1458
  602. package/readme.md +98 -171
  603. package/.vscode/launch.json +0 -13
  604. package/.vscodeignore +0 -7
  605. package/dist/assets/STLExporter-BpTH3YHE.js +0 -8
  606. package/dist/assets/browser-DdDecX_W.js +0 -1
  607. package/dist/assets/export-qgn-H9y6.js +0 -2
  608. package/dist/assets/main-DiKYzti2.css +0 -1
  609. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  610. package/dist/extension.js +0 -31293
  611. package/dist/src/lib/FilePicker.svelte +0 -360
  612. package/dist/src/lib/Icon.svelte +0 -41
  613. package/dist/src/lib/MillerIndexInput.svelte +0 -66
  614. package/dist/src/lib/api/mp.ts +0 -26
  615. package/dist/src/lib/api/optimade.ts +0 -204
  616. package/dist/src/lib/app.css +0 -247
  617. package/dist/src/lib/brillouin/BrillouinZone.svelte +0 -549
  618. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +0 -144
  619. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +0 -146
  620. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  621. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +0 -476
  622. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +0 -92
  623. package/dist/src/lib/brillouin/compute.ts +0 -529
  624. package/dist/src/lib/brillouin/index.ts +0 -8
  625. package/dist/src/lib/brillouin/types.ts +0 -51
  626. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +0 -327
  627. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +0 -846
  628. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +0 -3193
  629. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +0 -94
  630. package/dist/src/lib/chempot-diagram/chempot-worker.ts +0 -11
  631. package/dist/src/lib/chempot-diagram/color.ts +0 -42
  632. package/dist/src/lib/chempot-diagram/compute.ts +0 -1014
  633. package/dist/src/lib/chempot-diagram/index.ts +0 -6
  634. package/dist/src/lib/chempot-diagram/pointer.ts +0 -56
  635. package/dist/src/lib/chempot-diagram/temperature.ts +0 -77
  636. package/dist/src/lib/chempot-diagram/types.ts +0 -130
  637. package/dist/src/lib/colors/index.ts +0 -249
  638. package/dist/src/lib/composition/BarChart.svelte +0 -297
  639. package/dist/src/lib/composition/BubbleChart.svelte +0 -218
  640. package/dist/src/lib/composition/Composition.svelte +0 -165
  641. package/dist/src/lib/composition/Formula.svelte +0 -268
  642. package/dist/src/lib/composition/FormulaFilter.svelte +0 -1257
  643. package/dist/src/lib/composition/PieChart.svelte +0 -323
  644. package/dist/src/lib/composition/format.ts +0 -155
  645. package/dist/src/lib/composition/index.ts +0 -37
  646. package/dist/src/lib/composition/parse.ts +0 -605
  647. package/dist/src/lib/constants.ts +0 -134
  648. package/dist/src/lib/controls.ts +0 -42
  649. package/dist/src/lib/convex-hull/ConvexHull.svelte +0 -157
  650. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +0 -825
  651. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +0 -1801
  652. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +0 -1398
  653. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +0 -535
  654. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +0 -125
  655. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +0 -929
  656. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +0 -131
  657. package/dist/src/lib/convex-hull/GasPressureControls.svelte +0 -247
  658. package/dist/src/lib/convex-hull/StructurePopup.svelte +0 -151
  659. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +0 -140
  660. package/dist/src/lib/convex-hull/barycentric-coords.ts +0 -246
  661. package/dist/src/lib/convex-hull/demo-temperature.ts +0 -63
  662. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +0 -405
  663. package/dist/src/lib/convex-hull/helpers.ts +0 -932
  664. package/dist/src/lib/convex-hull/index.ts +0 -202
  665. package/dist/src/lib/convex-hull/thermodynamics.ts +0 -2192
  666. package/dist/src/lib/convex-hull/types.ts +0 -267
  667. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +0 -311
  668. package/dist/src/lib/coordination/calc-coordination.ts +0 -93
  669. package/dist/src/lib/coordination/index.ts +0 -9
  670. package/dist/src/lib/effects.svelte.ts +0 -48
  671. package/dist/src/lib/element/ElementHeading.svelte +0 -26
  672. package/dist/src/lib/element/ElementPhoto.svelte +0 -57
  673. package/dist/src/lib/element/ElementStats.svelte +0 -80
  674. package/dist/src/lib/element/ElementTile.svelte +0 -484
  675. package/dist/src/lib/element/data.ts +0 -14
  676. package/dist/src/lib/element/index.ts +0 -8
  677. package/dist/src/lib/element/types.ts +0 -62
  678. package/dist/src/lib/feedback/ClickFeedback.svelte +0 -58
  679. package/dist/src/lib/feedback/DragOverlay.svelte +0 -42
  680. package/dist/src/lib/feedback/index.ts +0 -4
  681. package/dist/src/lib/fermi-surface/FermiSlice.svelte +0 -189
  682. package/dist/src/lib/fermi-surface/FermiSurface.svelte +0 -600
  683. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +0 -448
  684. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +0 -794
  685. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  686. package/dist/src/lib/fermi-surface/compute.ts +0 -728
  687. package/dist/src/lib/fermi-surface/constants.ts +0 -32
  688. package/dist/src/lib/fermi-surface/export.ts +0 -64
  689. package/dist/src/lib/fermi-surface/index.ts +0 -14
  690. package/dist/src/lib/fermi-surface/marching-cubes.ts +0 -3
  691. package/dist/src/lib/fermi-surface/parse.ts +0 -574
  692. package/dist/src/lib/fermi-surface/symmetry.ts +0 -56
  693. package/dist/src/lib/fermi-surface/types.ts +0 -159
  694. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +0 -1545
  695. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  696. package/dist/src/lib/heatmap-matrix/index.ts +0 -167
  697. package/dist/src/lib/heatmap-matrix/shared.ts +0 -7
  698. package/dist/src/lib/icons.ts +0 -650
  699. package/dist/src/lib/index.ts +0 -61
  700. package/dist/src/lib/io/decompress.ts +0 -92
  701. package/dist/src/lib/io/export.ts +0 -385
  702. package/dist/src/lib/io/fetch.ts +0 -46
  703. package/dist/src/lib/io/file-drop.ts +0 -51
  704. package/dist/src/lib/io/index.ts +0 -7
  705. package/dist/src/lib/io/is-binary.ts +0 -24
  706. package/dist/src/lib/io/types.ts +0 -8
  707. package/dist/src/lib/io/url-drop.ts +0 -141
  708. package/dist/src/lib/isosurface/Isosurface.svelte +0 -285
  709. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +0 -277
  710. package/dist/src/lib/isosurface/index.ts +0 -7
  711. package/dist/src/lib/isosurface/parse.ts +0 -656
  712. package/dist/src/lib/isosurface/slice.ts +0 -175
  713. package/dist/src/lib/isosurface/types.ts +0 -309
  714. package/dist/src/lib/labels.ts +0 -320
  715. package/dist/src/lib/layout/FullscreenToggle.svelte +0 -50
  716. package/dist/src/lib/layout/InfoCard.svelte +0 -120
  717. package/dist/src/lib/layout/InfoTag.svelte +0 -185
  718. package/dist/src/lib/layout/PropertyFilter.svelte +0 -246
  719. package/dist/src/lib/layout/SettingsSection.svelte +0 -148
  720. package/dist/src/lib/layout/SubpageGrid.svelte +0 -82
  721. package/dist/src/lib/layout/fullscreen.ts +0 -65
  722. package/dist/src/lib/layout/index.ts +0 -11
  723. package/dist/src/lib/layout/json-tree/JsonNode.svelte +0 -548
  724. package/dist/src/lib/layout/json-tree/JsonTree.svelte +0 -1230
  725. package/dist/src/lib/layout/json-tree/index.ts +0 -3
  726. package/dist/src/lib/layout/json-tree/types.ts +0 -126
  727. package/dist/src/lib/layout/json-tree/utils.ts +0 -682
  728. package/dist/src/lib/marching-cubes.ts +0 -614
  729. package/dist/src/lib/math.ts +0 -1081
  730. package/dist/src/lib/overlays/ContextMenu.svelte +0 -162
  731. package/dist/src/lib/overlays/CopyButton.svelte +0 -45
  732. package/dist/src/lib/overlays/DragControlTab.svelte +0 -98
  733. package/dist/src/lib/overlays/DraggablePane.svelte +0 -487
  734. package/dist/src/lib/overlays/InfoPaneCards.svelte +0 -149
  735. package/dist/src/lib/overlays/index.ts +0 -3
  736. package/dist/src/lib/periodic-table/PeriodicTable.svelte +0 -469
  737. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +0 -557
  738. package/dist/src/lib/periodic-table/PropertySelect.svelte +0 -37
  739. package/dist/src/lib/periodic-table/index.ts +0 -12
  740. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  741. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +0 -444
  742. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  743. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +0 -184
  744. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +0 -391
  745. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +0 -203
  746. package/dist/src/lib/phase-diagram/build-diagram.ts +0 -186
  747. package/dist/src/lib/phase-diagram/colors.ts +0 -58
  748. package/dist/src/lib/phase-diagram/diagram-input.ts +0 -40
  749. package/dist/src/lib/phase-diagram/index.ts +0 -13
  750. package/dist/src/lib/phase-diagram/parse.ts +0 -348
  751. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +0 -1023
  752. package/dist/src/lib/phase-diagram/types.ts +0 -144
  753. package/dist/src/lib/phase-diagram/utils.ts +0 -775
  754. package/dist/src/lib/plot/AxisLabel.svelte +0 -51
  755. package/dist/src/lib/plot/BarPlot.svelte +0 -2113
  756. package/dist/src/lib/plot/BarPlotControls.svelte +0 -66
  757. package/dist/src/lib/plot/BinnedScatterPlot.svelte +0 -1114
  758. package/dist/src/lib/plot/ColorBar.svelte +0 -721
  759. package/dist/src/lib/plot/ColorScaleSelect.svelte +0 -54
  760. package/dist/src/lib/plot/ElementScatter.svelte +0 -63
  761. package/dist/src/lib/plot/FillArea.svelte +0 -223
  762. package/dist/src/lib/plot/Histogram.svelte +0 -1558
  763. package/dist/src/lib/plot/HistogramControls.svelte +0 -212
  764. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +0 -96
  765. package/dist/src/lib/plot/Line.svelte +0 -84
  766. package/dist/src/lib/plot/PlotAxis.svelte +0 -169
  767. package/dist/src/lib/plot/PlotControls.svelte +0 -537
  768. package/dist/src/lib/plot/PlotLegend.svelte +0 -569
  769. package/dist/src/lib/plot/PlotTooltip.svelte +0 -67
  770. package/dist/src/lib/plot/PortalSelect.svelte +0 -253
  771. package/dist/src/lib/plot/ReferenceLine.svelte +0 -204
  772. package/dist/src/lib/plot/ReferenceLine3D.svelte +0 -156
  773. package/dist/src/lib/plot/ReferencePlane.svelte +0 -175
  774. package/dist/src/lib/plot/ScatterPlot.svelte +0 -2778
  775. package/dist/src/lib/plot/ScatterPlot3D.svelte +0 -529
  776. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +0 -437
  777. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +0 -912
  778. package/dist/src/lib/plot/ScatterPlotControls.svelte +0 -306
  779. package/dist/src/lib/plot/ScatterPoint.svelte +0 -182
  780. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +0 -293
  781. package/dist/src/lib/plot/Surface3D.svelte +0 -197
  782. package/dist/src/lib/plot/ZeroLines.svelte +0 -97
  783. package/dist/src/lib/plot/ZoomRect.svelte +0 -23
  784. package/dist/src/lib/plot/adaptive-density.ts +0 -316
  785. package/dist/src/lib/plot/auto-place.ts +0 -184
  786. package/dist/src/lib/plot/axis-utils.ts +0 -122
  787. package/dist/src/lib/plot/binned-scatter-types.ts +0 -83
  788. package/dist/src/lib/plot/data-cleaning.ts +0 -1069
  789. package/dist/src/lib/plot/data-transform.ts +0 -69
  790. package/dist/src/lib/plot/defaults.ts +0 -9
  791. package/dist/src/lib/plot/fill-utils.ts +0 -494
  792. package/dist/src/lib/plot/hover-lock.svelte.ts +0 -60
  793. package/dist/src/lib/plot/index.ts +0 -53
  794. package/dist/src/lib/plot/interactions.ts +0 -119
  795. package/dist/src/lib/plot/layout.ts +0 -425
  796. package/dist/src/lib/plot/reference-line.ts +0 -426
  797. package/dist/src/lib/plot/scales.ts +0 -654
  798. package/dist/src/lib/plot/svg.ts +0 -23
  799. package/dist/src/lib/plot/types.ts +0 -1144
  800. package/dist/src/lib/plot/utils/label-placement.ts +0 -541
  801. package/dist/src/lib/plot/utils/series-visibility.ts +0 -140
  802. package/dist/src/lib/plot/utils.ts +0 -11
  803. package/dist/src/lib/rdf/RdfPlot.svelte +0 -247
  804. package/dist/src/lib/rdf/calc-rdf.ts +0 -167
  805. package/dist/src/lib/rdf/index.ts +0 -27
  806. package/dist/src/lib/sanitize.ts +0 -126
  807. package/dist/src/lib/settings.ts +0 -1479
  808. package/dist/src/lib/spectral/Bands.svelte +0 -1040
  809. package/dist/src/lib/spectral/BandsAndDos.svelte +0 -134
  810. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +0 -252
  811. package/dist/src/lib/spectral/Dos.svelte +0 -697
  812. package/dist/src/lib/spectral/helpers.ts +0 -1381
  813. package/dist/src/lib/spectral/index.ts +0 -8
  814. package/dist/src/lib/spectral/types.ts +0 -112
  815. package/dist/src/lib/state.svelte.ts +0 -64
  816. package/dist/src/lib/structure/Arrow.svelte +0 -72
  817. package/dist/src/lib/structure/AtomLegend.svelte +0 -815
  818. package/dist/src/lib/structure/Bond.svelte +0 -140
  819. package/dist/src/lib/structure/CanvasTooltip.svelte +0 -33
  820. package/dist/src/lib/structure/CellSelect.svelte +0 -349
  821. package/dist/src/lib/structure/Cylinder.svelte +0 -45
  822. package/dist/src/lib/structure/Lattice.svelte +0 -196
  823. package/dist/src/lib/structure/Structure.svelte +0 -2248
  824. package/dist/src/lib/structure/StructureControls.svelte +0 -1273
  825. package/dist/src/lib/structure/StructureExportPane.svelte +0 -252
  826. package/dist/src/lib/structure/StructureInfoPane.svelte +0 -737
  827. package/dist/src/lib/structure/StructureScene.svelte +0 -2255
  828. package/dist/src/lib/structure/atom-properties.ts +0 -316
  829. package/dist/src/lib/structure/bond-order-perception.ts +0 -447
  830. package/dist/src/lib/structure/bonding.ts +0 -944
  831. package/dist/src/lib/structure/export.ts +0 -861
  832. package/dist/src/lib/structure/index.ts +0 -291
  833. package/dist/src/lib/structure/label-placement.ts +0 -130
  834. package/dist/src/lib/structure/measure.ts +0 -45
  835. package/dist/src/lib/structure/parse.ts +0 -1705
  836. package/dist/src/lib/structure/partial-occupancy.ts +0 -183
  837. package/dist/src/lib/structure/pbc.ts +0 -164
  838. package/dist/src/lib/structure/supercell.ts +0 -226
  839. package/dist/src/lib/structure/validation.ts +0 -11
  840. package/dist/src/lib/symmetry/SymmetryStats.svelte +0 -226
  841. package/dist/src/lib/symmetry/WyckoffTable.svelte +0 -120
  842. package/dist/src/lib/symmetry/cell-transform.ts +0 -118
  843. package/dist/src/lib/symmetry/index.ts +0 -348
  844. package/dist/src/lib/symmetry/spacegroups.ts +0 -404
  845. package/dist/src/lib/table/HeatmapTable.svelte +0 -1833
  846. package/dist/src/lib/table/ToggleMenu.svelte +0 -385
  847. package/dist/src/lib/table/index.ts +0 -139
  848. package/dist/src/lib/theme/ThemeControl.svelte +0 -53
  849. package/dist/src/lib/theme/index.ts +0 -107
  850. package/dist/src/lib/time.ts +0 -71
  851. package/dist/src/lib/tooltip/TooltipContent.svelte +0 -58
  852. package/dist/src/lib/tooltip/index.ts +0 -2
  853. package/dist/src/lib/tooltip/types.ts +0 -13
  854. package/dist/src/lib/trajectory/Trajectory.svelte +0 -1545
  855. package/dist/src/lib/trajectory/TrajectoryError.svelte +0 -128
  856. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +0 -357
  857. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +0 -313
  858. package/dist/src/lib/trajectory/constants.ts +0 -7
  859. package/dist/src/lib/trajectory/extract.ts +0 -196
  860. package/dist/src/lib/trajectory/format-detect.ts +0 -96
  861. package/dist/src/lib/trajectory/frame-reader.ts +0 -456
  862. package/dist/src/lib/trajectory/helpers.ts +0 -217
  863. package/dist/src/lib/trajectory/index.ts +0 -218
  864. package/dist/src/lib/trajectory/parse/ase.ts +0 -109
  865. package/dist/src/lib/trajectory/parse/hdf5.ts +0 -173
  866. package/dist/src/lib/trajectory/parse/index.ts +0 -411
  867. package/dist/src/lib/trajectory/parse/lammps.ts +0 -215
  868. package/dist/src/lib/trajectory/parse/vasp.ts +0 -102
  869. package/dist/src/lib/trajectory/parse/xyz.ts +0 -143
  870. package/dist/src/lib/trajectory/plotting.ts +0 -599
  871. package/dist/src/lib/trajectory/types.ts +0 -13
  872. package/dist/src/lib/utils.ts +0 -56
  873. package/dist/src/lib/xrd/XrdPlot.svelte +0 -615
  874. package/dist/src/lib/xrd/broadening.ts +0 -130
  875. package/dist/src/lib/xrd/calc-xrd.ts +0 -397
  876. package/dist/src/lib/xrd/index.ts +0 -38
  877. package/dist/src/lib/xrd/parse.ts +0 -858
  878. package/dist/webview.js +0 -29421
  879. package/icon.png +0 -0
  880. package/matterviz-0.3.2.vsix +0 -0
  881. package/matterviz-0.3.4.vsix +0 -0
  882. package/matterviz-0.3.5.vsix +0 -0
  883. package/scripts/sync-config.ts +0 -101
  884. package/src/declarations.d.ts +0 -2
  885. package/src/extension.ts +0 -972
  886. package/src/node-io.ts +0 -65
  887. package/src/types.ts +0 -17
  888. package/src/webview/JsonBrowser.svelte +0 -1079
  889. package/src/webview/PlotPanel.svelte +0 -346
  890. package/src/webview/detect.ts +0 -444
  891. package/src/webview/main.ts +0 -764
  892. package/src/webview/plot-utils.ts +0 -250
  893. package/test-fixtures/all-viz-types.json.gz +0 -0
  894. package/test-fixtures/plot-demo-data.json.gz +0 -0
  895. package/tests/detect.test.ts +0 -604
  896. package/tests/extension.test.ts +0 -2041
  897. package/tests/node-io.test.ts +0 -39
  898. package/tests/plot-utils.test.ts +0 -302
  899. package/tests/vite-plugin-json-gz.test.ts +0 -114
  900. package/tests/vscode-mock.ts +0 -18
  901. package/tests/webview.test.ts +0 -231
  902. package/tsconfig.json +0 -20
  903. package/vite-plugin-json-gz.ts +0 -29
  904. package/vite.config.ts +0 -34
  905. package/vite.extension.config.ts +0 -34
  906. /package/dist/{src/lib/EmptyState.svelte → EmptyState.svelte} +0 -0
  907. /package/dist/{src/lib/chempot-diagram → chempot-diagram}/ChemPotScene3D.svelte +0 -0
  908. /package/dist/{src/lib/colors → colors}/alloy-colors.json +0 -0
  909. /package/dist/{src/lib/colors → colors}/dark-mode-colors.json +0 -0
  910. /package/dist/{src/lib/colors → colors}/jmol-colors.json +0 -0
  911. /package/dist/{src/lib/colors → colors}/muted-colors.json +0 -0
  912. /package/dist/{src/lib/colors → colors}/pastel-colors.json +0 -0
  913. /package/dist/{src/lib/colors → colors}/vesta-colors.json +0 -0
  914. /package/dist/{src/lib/element → element}/BohrAtom.svelte +0 -0
  915. /package/dist/{src/lib/element → element}/Nucleus.svelte +0 -0
  916. /package/dist/{src/lib/element → element}/data.json +0 -0
  917. /package/dist/{src/lib/element → element}/data.json.gz +0 -0
  918. /package/dist/{src/lib/element → element}/data.json.gz.d.ts +0 -0
  919. /package/dist/{src/lib/element → element}/data.schema.json +0 -0
  920. /package/dist/{src/lib/element-image-urls.json → element-image-urls.json} +0 -0
  921. /package/dist/{src/lib/feedback → feedback}/Spinner.svelte +0 -0
  922. /package/dist/{src/lib/feedback → feedback}/StatusMessage.svelte +0 -0
  923. /package/dist/{src/lib/layout → layout}/json-tree/JsonValue.svelte +0 -0
  924. /package/dist/{src/lib/periodic-table → periodic-table}/TableInset.svelte +0 -0
  925. /package/dist/{src/lib/theme → theme}/themes.mjs +0 -0
  926. /package/dist/{src/lib/xrd → xrd}/atomic_scattering_params.json +0 -0
@@ -0,0 +1,804 @@
1
+ // Core computational logic for chemical potential diagrams.
2
+ // Ports pymatgen's ChemicalPotentialDiagram algorithm to TypeScript.
3
+ // Reference: pymatgen/analysis/chempot_diagram.py
4
+ import { convex_hull_2d, EPS, polygon_centroid, solve_linear_system } from '../math';
5
+ import { CHEMPOT_DEFAULTS } from './types';
6
+ // Inlined from $lib/composition/parse to keep this module worker-safe
7
+ // ($lib/composition barrel transitively imports binary .json.gz data
8
+ // that the worker bundler can't handle).
9
+ const count_atoms_in_composition = (composition) => Object.values(composition).reduce((sum, count) => sum + (count ?? 0), 0);
10
+ const gcd = (num_a, num_b) => num_b === 0 ? num_a : gcd(num_b, num_a % num_b);
11
+ const get_reduced_formula = (composition) => {
12
+ const amounts = Object.values(composition).filter((amt) => amt > 0);
13
+ if (amounts.length === 0)
14
+ return {};
15
+ let scale = 1;
16
+ if (!amounts.every((amt) => Number.isInteger(amt))) {
17
+ scale = 0;
18
+ for (let mult = 1; mult <= 100; mult++) {
19
+ if (amounts.every((amt) => Math.abs(amt * mult - Math.round(amt * mult)) < 0.03)) {
20
+ scale = mult;
21
+ break;
22
+ }
23
+ }
24
+ if (scale === 0)
25
+ return composition;
26
+ }
27
+ const int_amounts = amounts.map((amt) => Math.round(amt * scale));
28
+ const divisor = int_amounts.reduce((acc, amt) => gcd(acc, amt));
29
+ if (scale === 1 && divisor <= 1)
30
+ return composition;
31
+ const factor = scale / divisor;
32
+ return Object.fromEntries(Object.entries(composition)
33
+ .filter(([, amt]) => amt > 0)
34
+ .map(([elem, amt]) => [elem, Math.round(amt * factor)]));
35
+ };
36
+ // === Entry Helpers ===
37
+ // Get energy per atom for a PhaseData entry
38
+ export function get_energy_per_atom(entry) {
39
+ if (typeof entry.energy_per_atom === `number`)
40
+ return entry.energy_per_atom;
41
+ const atoms = count_atoms_in_composition(entry.composition);
42
+ if (atoms <= 0) {
43
+ throw new Error(`Invalid composition with non-positive atom count: ${JSON.stringify(entry.composition)}`);
44
+ }
45
+ return entry.energy / atoms;
46
+ }
47
+ // Cache for reduced formula strings -- avoids recomputing get_reduced_formula
48
+ // in hot loops. Key is object identity (WeakMap), value is the formula string.
49
+ const formula_cache = new WeakMap();
50
+ // Get a stable reduced formula string from composition dict (cached)
51
+ export function formula_key_from_composition(composition) {
52
+ const cached = formula_cache.get(composition);
53
+ if (cached)
54
+ return cached;
55
+ const reduced = get_reduced_formula(composition);
56
+ const key = Object.entries(reduced)
57
+ .filter(([, amt]) => amt > 0)
58
+ .sort(([a], [b]) => a.localeCompare(b))
59
+ .map(([el, amt]) => (amt === 1 ? el : `${el}${amt}`))
60
+ .join(``);
61
+ formula_cache.set(composition, key);
62
+ return key;
63
+ }
64
+ // === Core Algorithm ===
65
+ // Group entries by reduced formula, keep only the minimum-energy entry per composition.
66
+ // Also extract elemental reference entries.
67
+ export function get_min_entries_and_el_refs(entries) {
68
+ const by_formula = new Map();
69
+ for (const entry of entries) {
70
+ const key = formula_key_from_composition(entry.composition);
71
+ const epa = get_energy_per_atom(entry);
72
+ const existing = by_formula.get(key);
73
+ if (!existing || epa < existing.epa) {
74
+ by_formula.set(key, { entry, epa });
75
+ }
76
+ }
77
+ const min_entries = Array.from(by_formula.values(), ({ entry }) => entry);
78
+ const el_refs = {};
79
+ for (const entry of min_entries) {
80
+ const positive = Object.entries(entry.composition).filter(([, amt]) => amt > 0);
81
+ if (positive.length === 1)
82
+ el_refs[positive[0][0]] = entry;
83
+ }
84
+ return { min_entries, el_refs };
85
+ }
86
+ // Compute formation energy per atom against elemental references.
87
+ export function compute_form_energy_per_atom(entry, el_refs) {
88
+ const atom_count = count_atoms_in_composition(entry.composition);
89
+ const energy_per_atom = get_energy_per_atom(entry);
90
+ let ref_energy = 0;
91
+ for (const [element, amount] of Object.entries(entry.composition)) {
92
+ if (amount <= 0)
93
+ continue;
94
+ const fraction = amount / atom_count;
95
+ const ref_entry = el_refs[element];
96
+ if (ref_entry)
97
+ ref_energy += fraction * get_energy_per_atom(ref_entry);
98
+ }
99
+ return energy_per_atom - ref_energy;
100
+ }
101
+ // Find minimum formation energy per atom across entries of one formula.
102
+ export function best_form_energy_for_formula(entries, formula, el_refs) {
103
+ let best_value;
104
+ for (const entry of entries) {
105
+ if (formula_key_from_composition(entry.composition) !== formula)
106
+ continue;
107
+ const e_form = entry.e_form_per_atom ?? compute_form_energy_per_atom(entry, el_refs);
108
+ if (best_value === undefined || e_form < best_value)
109
+ best_value = e_form;
110
+ }
111
+ return best_value;
112
+ }
113
+ // Renormalize entry energies to be relative to elemental references (formal chemical potentials).
114
+ // For each entry, subtracts sum(x_i * E_ref_i) from its energy per atom.
115
+ export const renormalize_entries = (entries, el_refs, elements) => entries.map((entry) => {
116
+ const atoms = count_atoms_in_composition(entry.composition);
117
+ let renorm_energy = 0;
118
+ for (const el of elements) {
119
+ const frac = atoms > 0 ? (entry.composition[el] ?? 0) / atoms : 0;
120
+ const ref = el_refs[el];
121
+ if (ref)
122
+ renorm_energy += frac * get_energy_per_atom(ref);
123
+ }
124
+ const new_energy_per_atom = get_energy_per_atom(entry) - renorm_energy;
125
+ return {
126
+ ...entry,
127
+ energy: new_energy_per_atom * atoms,
128
+ energy_per_atom: new_energy_per_atom,
129
+ };
130
+ });
131
+ // Build hyperplane representation for minimum entries.
132
+ // Each row is [x_1, ..., x_n, -E_per_atom].
133
+ // Filters to entries with negative formation energy plus all elemental refs.
134
+ export function build_hyperplanes(min_entries, el_refs, elements) {
135
+ const n_elems = elements.length;
136
+ const element_ref_energies = elements.map((element) => {
137
+ const ref_entry = el_refs[element];
138
+ return ref_entry ? get_energy_per_atom(ref_entry) : 0;
139
+ });
140
+ const always_include = new Set(Object.values(el_refs));
141
+ const tol = 1e-6; // PhaseDiagram.formation_energy_tol
142
+ const use_precomputed_hull = min_entries.every((entry) => typeof entry.is_stable === `boolean` || typeof entry.e_above_hull === `number`);
143
+ const hyperplanes = [];
144
+ const hyperplane_entries = [];
145
+ for (const entry of min_entries) {
146
+ const atom_count = count_atoms_in_composition(entry.composition);
147
+ const composition = entry.composition;
148
+ const energy_per_atom = get_energy_per_atom(entry);
149
+ const row = Array(n_elems + 1).fill(0);
150
+ let ref_energy = 0;
151
+ for (let elem_idx = 0; elem_idx < n_elems; elem_idx++) {
152
+ const element = elements[elem_idx];
153
+ const fraction = atom_count > 0 ? (composition[element] ?? 0) / atom_count : 0;
154
+ row[elem_idx] = fraction;
155
+ ref_energy += fraction * element_ref_energies[elem_idx];
156
+ }
157
+ const form_energy = energy_per_atom - ref_energy;
158
+ const on_precomputed_hull = use_precomputed_hull &&
159
+ !entry.exclude_from_hull &&
160
+ (entry.is_stable === true ||
161
+ (typeof entry.e_above_hull === `number` && entry.e_above_hull <= tol));
162
+ const include_entry = use_precomputed_hull
163
+ ? on_precomputed_hull || always_include.has(entry)
164
+ : form_energy < -tol || always_include.has(entry);
165
+ if (include_entry) {
166
+ row[n_elems] = -energy_per_atom;
167
+ hyperplanes.push(row);
168
+ hyperplane_entries.push(entry);
169
+ }
170
+ }
171
+ return { hyperplanes, hyperplane_entries };
172
+ }
173
+ // Build border hyperplanes from per-element limits.
174
+ // For each axis with limits [lo, hi], creates two halfspace rows.
175
+ export function build_border_hyperplanes(lims) {
176
+ const dim = lims.length;
177
+ const borders = [];
178
+ for (let idx = 0; idx < dim; idx++) {
179
+ // Lower bound: -mu_i + lo <= 0 → [-1, 0, ..., lo]
180
+ const lower = Array(dim + 1).fill(0);
181
+ lower[idx] = -1;
182
+ lower[dim] = lims[idx][0];
183
+ borders.push(lower);
184
+ // Upper bound: mu_i - hi <= 0 → [1, 0, ..., -hi]
185
+ const upper = Array(dim + 1).fill(0);
186
+ upper[idx] = 1;
187
+ upper[dim] = -lims[idx][1];
188
+ borders.push(upper);
189
+ }
190
+ return borders;
191
+ }
192
+ // Inline 2x2 linear solve (Cramer's rule). Returns false if singular.
193
+ // Writes solution into out[0], out[1].
194
+ function solve_2x2(a00, a01, b0, a10, a11, b1, out) {
195
+ const det = a00 * a11 - a01 * a10;
196
+ if (Math.abs(det) < EPS)
197
+ return false;
198
+ out[0] = (b0 * a11 - b1 * a01) / det;
199
+ out[1] = (a00 * b1 - a10 * b0) / det;
200
+ return true;
201
+ }
202
+ // Inline 3x3 linear solve via Cramer's rule. Returns false if singular.
203
+ // Takes three halfspace rows directly to avoid array allocation in the hot loop.
204
+ function solve_3x3(a, b, c, offsets, out) {
205
+ const det = a[0] * (b[1] * c[2] - b[2] * c[1]) -
206
+ a[1] * (b[0] * c[2] - b[2] * c[0]) +
207
+ a[2] * (b[0] * c[1] - b[1] * c[0]);
208
+ if (Math.abs(det) < EPS)
209
+ return false;
210
+ const inv = 1 / det;
211
+ out[0] =
212
+ (offsets[0] * (b[1] * c[2] - b[2] * c[1]) -
213
+ a[1] * (offsets[1] * c[2] - b[2] * offsets[2]) +
214
+ a[2] * (offsets[1] * c[1] - b[1] * offsets[2])) *
215
+ inv;
216
+ out[1] =
217
+ (a[0] * (offsets[1] * c[2] - b[2] * offsets[2]) -
218
+ offsets[0] * (b[0] * c[2] - b[2] * c[0]) +
219
+ a[2] * (b[0] * offsets[2] - offsets[1] * c[0])) *
220
+ inv;
221
+ out[2] =
222
+ (a[0] * (b[1] * offsets[2] - offsets[1] * c[1]) -
223
+ a[1] * (b[0] * offsets[2] - offsets[1] * c[0]) +
224
+ offsets[0] * (b[0] * c[1] - b[1] * c[0])) *
225
+ inv;
226
+ return true;
227
+ }
228
+ // Compute chemical potential domains via vertex enumeration.
229
+ // This replaces scipy's HalfspaceIntersection.
230
+ // For each combination of dim halfspaces, solves the linear system to find a
231
+ // candidate vertex, checks feasibility against all halfspaces, then assigns
232
+ // vertices to the phases whose hyperplanes are active at that vertex.
233
+ export function compute_domains(hyperplanes, border_hyperplanes, hyperplane_entries, dim) {
234
+ const n_entries = hyperplanes.length;
235
+ const all_hs = [...hyperplanes, ...border_hyperplanes];
236
+ const n_total = all_hs.length;
237
+ const tol = 1e-6;
238
+ // Pre-compute formula keys for entry hyperplanes (avoid repeated work in hot loop)
239
+ const entry_formulas = hyperplane_entries.map((entry) => formula_key_from_composition(entry.composition));
240
+ const domains = {};
241
+ for (const formula of entry_formulas) {
242
+ if (!domains[formula])
243
+ domains[formula] = [];
244
+ }
245
+ // Pre-allocate reusable buffers to avoid GC pressure in the combo loop
246
+ const mu = Array(dim).fill(0);
247
+ const offsets = Array(dim).fill(0);
248
+ // For dim <= 3, use inline solvers; for larger dims, build A on the fly
249
+ const A_rows = dim > 3 ? Array.from({ length: dim }, () => Array(dim).fill(0)) : [];
250
+ // Generate all combinations of dim indices from n_total halfspaces
251
+ const combo = Array(dim).fill(0);
252
+ for (let idx = 0; idx < dim; idx++)
253
+ combo[idx] = idx;
254
+ function advance_combo() {
255
+ let pos = dim - 1;
256
+ while (pos >= 0 && combo[pos] >= n_total - dim + pos)
257
+ pos--;
258
+ if (pos < 0)
259
+ return false;
260
+ combo[pos]++;
261
+ for (let idx = pos + 1; idx < dim; idx++)
262
+ combo[idx] = combo[idx - 1] + 1;
263
+ return true;
264
+ }
265
+ while (true) {
266
+ // Combinations containing only border halfspaces cannot be assigned to any
267
+ // entry domain, so skip solving them entirely.
268
+ let has_entry_hyperplane = false;
269
+ if (dim === 2) {
270
+ has_entry_hyperplane = combo[0] < n_entries || combo[1] < n_entries;
271
+ }
272
+ else if (dim === 3) {
273
+ has_entry_hyperplane =
274
+ combo[0] < n_entries || combo[1] < n_entries || combo[2] < n_entries;
275
+ }
276
+ else {
277
+ for (let row = 0; row < dim; row++) {
278
+ if (combo[row] < n_entries) {
279
+ has_entry_hyperplane = true;
280
+ break;
281
+ }
282
+ }
283
+ }
284
+ if (!has_entry_hyperplane) {
285
+ if (!advance_combo())
286
+ break;
287
+ continue;
288
+ }
289
+ // Compute offsets (negated last column of selected halfspaces)
290
+ for (let row = 0; row < dim; row++)
291
+ offsets[row] = -all_hs[combo[row]][dim];
292
+ // Solve for vertex using dimension-specialized solvers
293
+ let solved = false;
294
+ if (dim === 2) {
295
+ const h0 = all_hs[combo[0]];
296
+ const h1 = all_hs[combo[1]];
297
+ solved = solve_2x2(h0[0], h0[1], offsets[0], h1[0], h1[1], offsets[1], mu);
298
+ }
299
+ else if (dim === 3) {
300
+ solved = solve_3x3(all_hs[combo[0]], all_hs[combo[1]], all_hs[combo[2]], offsets, mu);
301
+ }
302
+ else {
303
+ // General case: build A matrix and use LU solver
304
+ for (let row = 0; row < dim; row++) {
305
+ const hs = all_hs[combo[row]];
306
+ for (let col = 0; col < dim; col++)
307
+ A_rows[row][col] = hs[col];
308
+ }
309
+ const result = solve_linear_system(A_rows, offsets);
310
+ if (result) {
311
+ for (let idx = 0; idx < dim; idx++)
312
+ mu[idx] = result[idx];
313
+ solved = true;
314
+ }
315
+ }
316
+ if (solved) {
317
+ // Feasibility check: all halfspaces must be satisfied (a·mu + b <= tol)
318
+ const selected_hs_idx_0 = dim > 0 ? combo[0] : -1;
319
+ const selected_hs_idx_1 = dim > 1 ? combo[1] : -1;
320
+ const selected_hs_idx_2 = dim > 2 ? combo[2] : -1;
321
+ for (let idx = 0; idx < n_total; idx++) {
322
+ if (dim <= 3) {
323
+ if (idx === selected_hs_idx_0 ||
324
+ idx === selected_hs_idx_1 ||
325
+ idx === selected_hs_idx_2)
326
+ continue;
327
+ }
328
+ else {
329
+ let is_active_halfspace = false;
330
+ for (let combo_idx = 0; combo_idx < dim; combo_idx++) {
331
+ if (combo[combo_idx] === idx) {
332
+ is_active_halfspace = true;
333
+ break;
334
+ }
335
+ }
336
+ if (is_active_halfspace)
337
+ continue;
338
+ }
339
+ const hs = all_hs[idx];
340
+ let val = hs[dim];
341
+ if (dim === 2) {
342
+ val += hs[0] * mu[0] + hs[1] * mu[1];
343
+ }
344
+ else if (dim === 3) {
345
+ val += hs[0] * mu[0] + hs[1] * mu[1] + hs[2] * mu[2];
346
+ }
347
+ else {
348
+ for (let jdx = 0; jdx < dim; jdx++)
349
+ val += hs[jdx] * mu[jdx];
350
+ }
351
+ if (val > tol) {
352
+ solved = false;
353
+ break;
354
+ }
355
+ }
356
+ if (solved) {
357
+ // Assign vertex to entries whose hyperplanes are active
358
+ const vertex = dim === 2 ? [mu[0], mu[1]] : dim === 3 ? [mu[0], mu[1], mu[2]] : [...mu];
359
+ for (let idx = 0; idx < dim; idx++) {
360
+ const hs_idx = combo[idx];
361
+ if (hs_idx < n_entries) {
362
+ domains[entry_formulas[hs_idx]].push([...vertex]);
363
+ }
364
+ }
365
+ }
366
+ }
367
+ // Advance to next combination (lexicographic order)
368
+ if (!advance_combo())
369
+ break;
370
+ }
371
+ return Object.fromEntries(Object.entries(domains).filter(([, domain]) => domain.length > 0));
372
+ }
373
+ // Apply element padding: replace coordinates close to default_min_limit with
374
+ // actual_min - padding for cleaner visual bounds. Single pass over all points.
375
+ export function apply_element_padding(domains, elem_indices, padding, default_min_limit) {
376
+ const replace_threshold = Math.max(Math.abs(padding), EPS);
377
+ // Single-pass: track min per axis, skipping default_min_limit values
378
+ const mins = elem_indices.map(() => Infinity);
379
+ for (const pts of Object.values(domains)) {
380
+ for (const pt of pts) {
381
+ for (let idx = 0; idx < elem_indices.length; idx++) {
382
+ const val = pt[elem_indices[idx]];
383
+ if (Math.abs(val - default_min_limit) > replace_threshold && val < mins[idx]) {
384
+ mins[idx] = val;
385
+ }
386
+ }
387
+ }
388
+ }
389
+ return mins.map((min_val) => (Number.isFinite(min_val) ? min_val : default_min_limit) - padding);
390
+ }
391
+ // Replace default_min_limit coordinates with padded limits for display
392
+ export function pad_domain_points(pts, elem_indices, new_lims, default_min_limit, padding) {
393
+ const replace_threshold = Math.max(Math.abs(padding), EPS);
394
+ return pts.map((pt) => {
395
+ const padded = [...pt];
396
+ for (let idx = 0; idx < elem_indices.length; idx++) {
397
+ const col = elem_indices[idx];
398
+ if (Math.abs(padded[col] - default_min_limit) < replace_threshold) {
399
+ padded[col] = new_lims[idx];
400
+ }
401
+ }
402
+ return padded;
403
+ });
404
+ }
405
+ // Build per-axis min/max ranges for a set of points
406
+ export function build_axis_ranges(points, elements) {
407
+ return elements.map((element, axis_idx) => {
408
+ let [min_val, max_val] = [Infinity, -Infinity];
409
+ for (const point of points) {
410
+ const val = point[axis_idx];
411
+ if (val < min_val)
412
+ min_val = val;
413
+ if (val > max_val)
414
+ max_val = val;
415
+ }
416
+ return { element: element ?? `\u03BC${axis_idx}`, min_val, max_val };
417
+ });
418
+ }
419
+ // === Label Placement Helpers ===
420
+ // Simple PCA: center data, compute covariance, eigendecompose, project to top-k.
421
+ // Used in 3D for finding domain polygon orientation for label placement.
422
+ export function simple_pca(data, k = 2) {
423
+ const n_rows = data.length;
424
+ const n_cols = data[0]?.length ?? 0;
425
+ if (n_rows === 0 || n_cols === 0) {
426
+ return { scores: [], eigenvectors: [] };
427
+ }
428
+ // Center the data
429
+ const means = Array(n_cols).fill(0);
430
+ for (const row of data) {
431
+ for (let col = 0; col < n_cols; col++)
432
+ means[col] += row[col];
433
+ }
434
+ for (let col = 0; col < n_cols; col++)
435
+ means[col] /= n_rows;
436
+ const centered = data.map((row) => row.map((val, col) => val - means[col]));
437
+ // Covariance matrix
438
+ const cov = Array.from({ length: n_cols }, () => Array(n_cols).fill(0));
439
+ for (const row of centered) {
440
+ for (let idx = 0; idx < n_cols; idx++) {
441
+ for (let jdx = idx; jdx < n_cols; jdx++) {
442
+ cov[idx][jdx] += row[idx] * row[jdx];
443
+ }
444
+ }
445
+ }
446
+ for (let idx = 0; idx < n_cols; idx++) {
447
+ cov[idx][idx] /= n_rows;
448
+ for (let jdx = idx + 1; jdx < n_cols; jdx++) {
449
+ cov[idx][jdx] /= n_rows;
450
+ cov[jdx][idx] = cov[idx][jdx];
451
+ }
452
+ }
453
+ // Power iteration for top-k eigenvectors (sufficient for k=2 on small matrices)
454
+ const eigenvectors = [];
455
+ const work_cov = cov.map((row) => [...row]);
456
+ for (let comp = 0; comp < k; comp++) {
457
+ let vec = Array(n_cols).fill(0);
458
+ vec[comp % n_cols] = 1; // initial guess
459
+ for (let iter = 0; iter < 100; iter++) {
460
+ // Matrix-vector multiply
461
+ const new_vec = Array(n_cols).fill(0);
462
+ for (let idx = 0; idx < n_cols; idx++) {
463
+ for (let jdx = 0; jdx < n_cols; jdx++) {
464
+ new_vec[idx] += work_cov[idx][jdx] * vec[jdx];
465
+ }
466
+ }
467
+ // Normalize
468
+ const norm = Math.hypot(...new_vec);
469
+ if (norm < EPS)
470
+ break;
471
+ const prev = vec;
472
+ vec = new_vec.map((val) => val / norm);
473
+ // Early exit when eigenvector has converged
474
+ if (prev.every((val, idx) => Math.abs(val - vec[idx]) < EPS))
475
+ break;
476
+ }
477
+ // Rayleigh quotient for deflation
478
+ const eigenvalue = vec.reduce((sum, val, idx) => {
479
+ let mv = 0;
480
+ for (let jdx = 0; jdx < n_cols; jdx++)
481
+ mv += work_cov[idx][jdx] * vec[jdx];
482
+ return sum + val * mv;
483
+ }, 0);
484
+ eigenvectors.push(vec);
485
+ // Deflate: remove this component from the covariance matrix
486
+ for (let idx = 0; idx < n_cols; idx++) {
487
+ for (let jdx = 0; jdx < n_cols; jdx++) {
488
+ work_cov[idx][jdx] -= eigenvalue * vec[idx] * vec[jdx];
489
+ }
490
+ }
491
+ }
492
+ // Project data onto eigenvectors
493
+ const scores = centered.map((row) => eigenvectors.map((ev) => row.reduce((sum, val, idx) => sum + val * ev[idx], 0)));
494
+ return { scores, eigenvectors };
495
+ }
496
+ // Compute orthonormal vector to a 2D line segment (for label offset in 2D diagrams)
497
+ export function orthonormal_2d(line_pts) {
498
+ const dx = line_pts[1][0] - line_pts[0][0];
499
+ const dy = line_pts[1][1] - line_pts[0][1];
500
+ const perp = [-dy, dx];
501
+ const len = Math.hypot(perp[0], perp[1]);
502
+ if (len < EPS)
503
+ return [0, 1];
504
+ return [perp[0] / len, perp[1] / len];
505
+ }
506
+ // Deduplicate points within tolerance, returning unique points and index mapping
507
+ export function dedup_points(pts, tol = 1e-4) {
508
+ const unique = [];
509
+ const orig_indices = [];
510
+ for (let idx = 0; idx < pts.length; idx++) {
511
+ const pt = pts[idx];
512
+ const is_dup = unique.some((existing) => existing.every((val, dim) => Math.abs(val - pt[dim]) < tol));
513
+ if (!is_dup) {
514
+ unique.push(pt);
515
+ orig_indices.push(idx);
516
+ }
517
+ }
518
+ return { unique, orig_indices };
519
+ }
520
+ // For a 3D domain, compute convex hull boundary edges and annotation location.
521
+ // Deduplicates vertices first, then uses PCA to project to 2D for the convex
522
+ // hull computation. Returns only the outer boundary edges, not interior lines.
523
+ export function get_3d_domain_simplexes_and_ann_loc(points_3d) {
524
+ // Deduplicate vertices to avoid cluttered interior edges
525
+ const { unique, orig_indices } = dedup_points(points_3d);
526
+ if (unique.length < 3) {
527
+ if (unique.length === 2) {
528
+ const midpoint = unique[0].map((val, dim) => (val + unique[1][dim]) / 2);
529
+ return { simplex_indices: [[orig_indices[0], orig_indices[1]]], ann_loc: midpoint };
530
+ }
531
+ return { simplex_indices: [], ann_loc: unique[0] ?? points_3d[0] ?? [0, 0, 0] };
532
+ }
533
+ const { scores, eigenvectors } = simple_pca(unique, 2);
534
+ // 2D convex hull of PCA-projected unique points → only boundary edges
535
+ const pts_2d = scores.map((row) => [row[0], row[1]]);
536
+ const hull = convex_hull_2d(pts_2d);
537
+ const centroid = polygon_centroid(hull);
538
+ // Map centroid back to 3D
539
+ const n_dims = unique[0].length;
540
+ const mean_3d = Array.from({ length: n_dims }, (_, dim) => unique.reduce((sum, pt) => sum + pt[dim], 0) / unique.length);
541
+ const centroid_x = centroid[0] ?? 0;
542
+ const centroid_y = centroid[1] ?? 0;
543
+ const first_eigenvector = eigenvectors[0] ?? Array(n_dims).fill(0);
544
+ const second_eigenvector = eigenvectors[1] ?? Array(n_dims).fill(0);
545
+ const ann_loc = mean_3d.map((m, dim) => m + centroid_x * first_eigenvector[dim] + centroid_y * second_eigenvector[dim]);
546
+ // Map hull vertices back to original point indices using nearest projected
547
+ // vertex instead of stringified coordinates to avoid precision aliasing.
548
+ function nearest_projected_idx(target) {
549
+ let [nearest_idx, min_sq_dist] = [0, Infinity];
550
+ for (let idx = 0; idx < pts_2d.length; idx++) {
551
+ const dx = pts_2d[idx][0] - target[0];
552
+ const dy = pts_2d[idx][1] - target[1];
553
+ const sq_dist = dx * dx + dy * dy;
554
+ if (sq_dist < min_sq_dist) {
555
+ min_sq_dist = sq_dist;
556
+ nearest_idx = idx;
557
+ }
558
+ }
559
+ return nearest_idx;
560
+ }
561
+ const simplex_indices = [];
562
+ for (let hull_idx = 0; hull_idx < hull.length; hull_idx++) {
563
+ const pt_a = hull[hull_idx];
564
+ const pt_b = hull[(hull_idx + 1) % hull.length];
565
+ const ui_a = nearest_projected_idx(pt_a);
566
+ const ui_b = nearest_projected_idx(pt_b);
567
+ // Map back to original array indices
568
+ simplex_indices.push([orig_indices[ui_a], orig_indices[ui_b]]);
569
+ }
570
+ return { simplex_indices, ann_loc };
571
+ }
572
+ // === Label Sizing ===
573
+ // Bounding box diagonal of a set of N-D points (Euclidean distance between
574
+ // the min and max corners). Returns 0 for fewer than 2 points.
575
+ export function bbox_diagonal(points) {
576
+ if (points.length < 2)
577
+ return 0;
578
+ let sq_sum = 0;
579
+ for (let col = 0; col < points[0].length; col++) {
580
+ let lo = Infinity, hi = -Infinity;
581
+ for (const pt of points) {
582
+ lo = Math.min(lo, pt[col]);
583
+ hi = Math.max(hi, pt[col]);
584
+ }
585
+ sq_sum += (hi - lo) ** 2;
586
+ }
587
+ return Math.sqrt(sq_sum);
588
+ }
589
+ // Map an array of raw size values to font sizes via linear interpolation.
590
+ // Returns a new array of font sizes in [min_font, max_font].
591
+ // If all sizes are equal, returns the midpoint for all.
592
+ export function scale_to_font_range(sizes, min_font, max_font) {
593
+ const min_size = Math.min(...sizes);
594
+ const max_size = Math.max(...sizes);
595
+ const range = max_size - min_size;
596
+ const mid = (min_font + max_font) / 2;
597
+ return sizes.map((size) => range > 0 ? min_font + ((max_font - min_font) * (size - min_size)) / range : mid);
598
+ }
599
+ export function get_visible_domain_labels(face_positions, face_domain_map, label_font_size_by_formula, pinned_labels = []) {
600
+ const n_faces = Math.min(Math.floor(face_positions.length / 9), face_domain_map.length);
601
+ const accum = new Map();
602
+ for (let face_idx = 0; face_idx < n_faces; face_idx++) {
603
+ const formula = face_domain_map[face_idx];
604
+ if (!formula || !label_font_size_by_formula.has(formula))
605
+ continue;
606
+ const base = face_idx * 9;
607
+ const ax = face_positions[base];
608
+ const ay = face_positions[base + 1];
609
+ const az = face_positions[base + 2];
610
+ const bx = face_positions[base + 3];
611
+ const by = face_positions[base + 4];
612
+ const bz = face_positions[base + 5];
613
+ const cx = face_positions[base + 6];
614
+ const cy = face_positions[base + 7];
615
+ const cz = face_positions[base + 8];
616
+ const abx = bx - ax;
617
+ const aby = by - ay;
618
+ const abz = bz - az;
619
+ const acx = cx - ax;
620
+ const acy = cy - ay;
621
+ const acz = cz - az;
622
+ const cross_x = aby * acz - abz * acy;
623
+ const cross_y = abz * acx - abx * acz;
624
+ const cross_z = abx * acy - aby * acx;
625
+ const area = Math.hypot(cross_x, cross_y, cross_z) / 2;
626
+ if (area <= EPS)
627
+ continue;
628
+ const centroid_x = (ax + bx + cx) / 3;
629
+ const centroid_y = (ay + by + cy) / 3;
630
+ const centroid_z = (az + bz + cz) / 3;
631
+ const entry = accum.get(formula) ?? { area: 0, x: 0, y: 0, z: 0 };
632
+ entry.area += area;
633
+ entry.x += centroid_x * area;
634
+ entry.y += centroid_y * area;
635
+ entry.z += centroid_z * area;
636
+ accum.set(formula, entry);
637
+ }
638
+ const visible_labels = [...accum.entries()]
639
+ .filter(([, entry]) => entry.area > EPS)
640
+ .map(([formula, entry]) => ({
641
+ formula,
642
+ position: [entry.x / entry.area, entry.y / entry.area, entry.z / entry.area],
643
+ label_font_size: label_font_size_by_formula.get(formula) ?? 12,
644
+ }));
645
+ for (const label of pinned_labels) {
646
+ if (!visible_labels.some((visible_label) => visible_label.formula === label.formula)) {
647
+ visible_labels.push(label);
648
+ }
649
+ }
650
+ return visible_labels.sort((label_a, label_b) => label_a.formula.localeCompare(label_b.formula));
651
+ }
652
+ // === Ternary Combinations ===
653
+ // Generate all C(n,3) ternary element combinations from a sorted element list.
654
+ // Each triplet is sorted alphabetically. Returns empty array for fewer than 3 elements.
655
+ export function get_ternary_combinations(elements) {
656
+ const sorted = [...elements].sort();
657
+ const n_elems = sorted.length;
658
+ if (n_elems < 3)
659
+ return [];
660
+ const combos = [];
661
+ for (let first = 0; first < n_elems - 2; first++) {
662
+ for (let second = first + 1; second < n_elems - 1; second++) {
663
+ for (let third = second + 1; third < n_elems; third++) {
664
+ combos.push([sorted[first], sorted[second], sorted[third]]);
665
+ }
666
+ }
667
+ }
668
+ return combos;
669
+ }
670
+ let nd_cache = null;
671
+ // Content-based fingerprint for N-D result caching. Uses sorted formula keys
672
+ // so deserialized Web Worker copies match and different compositions never collide.
673
+ export function make_nd_cache_key(entries, formal_chempots, default_min_limit, limits) {
674
+ const keyed = entries
675
+ .map((entry) => [
676
+ formula_key_from_composition(entry.composition),
677
+ entry.energy,
678
+ entry.is_stable ?? ``,
679
+ entry.e_above_hull ?? ``,
680
+ entry.exclude_from_hull ?? ``,
681
+ ].join(`:`))
682
+ .sort();
683
+ return `${keyed.join(`,`)}|${formal_chempots}|${default_min_limit}|${JSON.stringify(limits ?? {})}`;
684
+ }
685
+ // === Main Pipeline ===
686
+ // Compute the full chemical potential diagram from entries and config.
687
+ // Returns domains, elements, refs, and all intermediate data.
688
+ //
689
+ // Supports two modes based on config.elements vs data dimensionality:
690
+ // - **Subsystem mode**: config.elements matches data element count → filter entries
691
+ // to subsystem, compute in reduced dimensionality (fast for ternary from ternary data)
692
+ // - **Projection mode**: config.elements has fewer elements than data → compute in
693
+ // full N-D, then project domain vertices to selected display axes (column extraction).
694
+ // This matches pymatgen's ChemicalPotentialDiagram behavior for multinary systems.
695
+ export function compute_chempot_diagram(entries, config = {}) {
696
+ const { formal_chempots = CHEMPOT_DEFAULTS.formal_chempots, default_min_limit = CHEMPOT_DEFAULTS.default_min_limit, limits, } = config;
697
+ // Detect all unique elements across all input entries (single pass, low allocation)
698
+ const all_data_elements_set = new Set();
699
+ for (const entry of entries) {
700
+ for (const [element, amount] of Object.entries(entry.composition)) {
701
+ if (amount > 0)
702
+ all_data_elements_set.add(element);
703
+ }
704
+ }
705
+ const all_data_elements = Array.from(all_data_elements_set).sort();
706
+ // Display elements: user-specified order (controls axis mapping), or auto-detect
707
+ const display_elements = config.elements?.length ? [...config.elements] : all_data_elements;
708
+ // Projection mode: display fewer axes than the data has elements
709
+ // In this mode, compute in full N-D and project afterward
710
+ const is_projection = display_elements.length < all_data_elements.length &&
711
+ display_elements.every((el) => all_data_elements.includes(el));
712
+ // Computation elements: full element set for projection, display set for subsystem
713
+ const compute_elements = is_projection ? all_data_elements : display_elements;
714
+ // Try cache for projection mode (same entries + config = same N-D domains)
715
+ const cache_key = is_projection
716
+ ? make_nd_cache_key(entries, formal_chempots, default_min_limit, limits)
717
+ : ``;
718
+ let nd_result = is_projection && nd_cache?.key === cache_key ? nd_cache.result : null;
719
+ if (!nd_result) {
720
+ // In subsystem mode, filter entries to only those within the element set
721
+ let working_entries = entries;
722
+ if (!is_projection && config.elements?.length) {
723
+ const target_set = new Set(config.elements);
724
+ working_entries = entries.filter((entry) => {
725
+ for (const [element, amount] of Object.entries(entry.composition)) {
726
+ if (amount > 0 && !target_set.has(element))
727
+ return false;
728
+ }
729
+ return true;
730
+ });
731
+ }
732
+ // Sort entries by composition (Schwartzian transform to avoid recomputing keys)
733
+ const sorted_entries = working_entries
734
+ .map((entry) => ({ entry, key: formula_key_from_composition(entry.composition) }))
735
+ .sort((a, b) => a.key.localeCompare(b.key))
736
+ .map(({ entry }) => entry);
737
+ // Get min entries and elemental references
738
+ let { min_entries, el_refs } = get_min_entries_and_el_refs(sorted_entries);
739
+ const dim = compute_elements.length;
740
+ if (dim < 2) {
741
+ throw new Error(`ChemicalPotentialDiagram requires 2+ elements, got ${dim}`);
742
+ }
743
+ // Check all elemental refs exist for the computation elements
744
+ const missing_refs = compute_elements.filter((el) => !el_refs[el]);
745
+ if (missing_refs.length > 0) {
746
+ throw new Error(`Missing elemental reference entries for: ${missing_refs.join(`, `)}`);
747
+ }
748
+ // Renormalize if using formal chemical potentials
749
+ if (formal_chempots) {
750
+ min_entries = renormalize_entries(min_entries, el_refs, compute_elements);
751
+ const renorm_result = get_min_entries_and_el_refs(min_entries);
752
+ el_refs = renorm_result.el_refs;
753
+ }
754
+ // Build limits array for computation elements
755
+ const compute_lims = compute_elements.map((el) => {
756
+ if (limits?.[el])
757
+ return limits[el];
758
+ return [default_min_limit, 0];
759
+ });
760
+ // Build hyperplanes and compute domains in full dimensionality
761
+ const { hyperplanes, hyperplane_entries } = build_hyperplanes(min_entries, el_refs, compute_elements);
762
+ const border_hyperplanes = build_border_hyperplanes(compute_lims);
763
+ const domains = compute_domains(hyperplanes, border_hyperplanes, hyperplane_entries, dim);
764
+ nd_result = {
765
+ domains,
766
+ el_refs,
767
+ min_entries,
768
+ hyperplanes,
769
+ hyperplane_entries,
770
+ compute_lims,
771
+ };
772
+ // Cache for projection mode reuse
773
+ if (is_projection) {
774
+ nd_cache = { key: cache_key, result: nd_result };
775
+ }
776
+ }
777
+ let domains = nd_result.domains;
778
+ let output_lims = nd_result.compute_lims;
779
+ // Project domain vertices from N-D to display axes (column extraction)
780
+ if (is_projection) {
781
+ const col_indices = display_elements.map((element) => {
782
+ const idx = compute_elements.indexOf(element);
783
+ if (idx === -1) {
784
+ throw new Error(`Display element ${element} not present in compute element set`);
785
+ }
786
+ return idx;
787
+ });
788
+ const projected = {};
789
+ for (const [formula, pts] of Object.entries(domains)) {
790
+ projected[formula] = pts.map((pt) => col_indices.map((idx) => pt[idx]));
791
+ }
792
+ domains = projected;
793
+ output_lims = col_indices.map((col_idx) => nd_result.compute_lims[col_idx]);
794
+ }
795
+ return {
796
+ domains,
797
+ elements: display_elements,
798
+ el_refs: nd_result.el_refs,
799
+ min_entries: nd_result.min_entries,
800
+ hyperplanes: nd_result.hyperplanes,
801
+ hyperplane_entries: nd_result.hyperplane_entries,
802
+ lims: output_lims,
803
+ };
804
+ }