matterviz 0.3.6 → 0.3.7

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