matterviz 0.3.7 → 0.4.1

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 (486) hide show
  1. package/dist/Icon.svelte +7 -4
  2. package/dist/MillerIndexInput.svelte +1 -1
  3. package/dist/api/optimade.js +32 -26
  4. package/dist/app.css +0 -3
  5. package/dist/brillouin/BrillouinZone.svelte +76 -148
  6. package/dist/brillouin/BrillouinZone.svelte.d.ts +6 -14
  7. package/dist/brillouin/BrillouinZoneExportPane.svelte +43 -96
  8. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneInfoPane.svelte +9 -32
  10. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  11. package/dist/brillouin/BrillouinZoneScene.svelte +97 -205
  12. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +4 -23
  13. package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
  14. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  15. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  16. package/dist/brillouin/compute.d.ts +2 -0
  17. package/dist/brillouin/compute.js +89 -90
  18. package/dist/brillouin/geometry.d.ts +8 -0
  19. package/dist/brillouin/geometry.js +57 -0
  20. package/dist/brillouin/index.d.ts +2 -0
  21. package/dist/brillouin/index.js +2 -0
  22. package/dist/brillouin/types.d.ts +2 -2
  23. package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  25. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +109 -203
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  27. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +180 -470
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  29. package/dist/chempot-diagram/async-compute.svelte.js +3 -1
  30. package/dist/chempot-diagram/chempot-worker.js +2 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +4 -4
  34. package/dist/chempot-diagram/compute.js +20 -20
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.js +8 -7
  45. package/dist/composition/FormulaFilter.svelte +18 -11
  46. package/dist/composition/PieChart.svelte +11 -10
  47. package/dist/composition/chem-sys.d.ts +8 -0
  48. package/dist/composition/chem-sys.js +86 -0
  49. package/dist/composition/format.js +7 -4
  50. package/dist/composition/index.d.ts +1 -0
  51. package/dist/composition/index.js +1 -0
  52. package/dist/composition/parse.d.ts +0 -1
  53. package/dist/composition/parse.js +41 -31
  54. package/dist/controls.d.ts +1 -0
  55. package/dist/controls.js +0 -1
  56. package/dist/convex-hull/ConvexHull.svelte +8 -10
  57. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  58. package/dist/convex-hull/ConvexHull2D.svelte +106 -185
  59. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  60. package/dist/convex-hull/ConvexHull3D.svelte +179 -683
  61. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  62. package/dist/convex-hull/ConvexHull4D.svelte +183 -687
  63. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  64. package/dist/convex-hull/ConvexHullChrome.svelte +268 -0
  65. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  66. package/dist/convex-hull/ConvexHullControls.svelte +88 -7
  67. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  68. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  69. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  70. package/dist/convex-hull/ConvexHullStats.svelte +36 -175
  71. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  72. package/dist/convex-hull/ConvexHullTooltip.svelte +11 -2
  73. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  74. package/dist/convex-hull/GasPressureControls.svelte +4 -4
  75. package/dist/convex-hull/TemperatureSlider.svelte +2 -2
  76. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  77. package/dist/convex-hull/barycentric-coords.js +6 -33
  78. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  79. package/dist/convex-hull/canvas-interactions.svelte.js +278 -0
  80. package/dist/convex-hull/demo-temperature.d.ts +1 -1
  81. package/dist/convex-hull/demo-temperature.js +20 -22
  82. package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
  83. package/dist/convex-hull/gas-thermodynamics.js +22 -30
  84. package/dist/convex-hull/helpers.d.ts +42 -7
  85. package/dist/convex-hull/helpers.js +171 -78
  86. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  87. package/dist/convex-hull/hull-state.svelte.js +124 -0
  88. package/dist/convex-hull/index.d.ts +10 -8
  89. package/dist/convex-hull/index.js +7 -2
  90. package/dist/convex-hull/thermodynamics.js +136 -960
  91. package/dist/convex-hull/types.d.ts +13 -5
  92. package/dist/convex-hull/types.js +12 -0
  93. package/dist/coordination/CoordinationBarPlot.svelte +27 -34
  94. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  95. package/dist/element/BohrAtom.svelte +2 -1
  96. package/dist/element/index.d.ts +4 -0
  97. package/dist/element/index.js +18 -0
  98. package/dist/feedback/DragOverlay.svelte +3 -1
  99. package/dist/feedback/DragOverlay.svelte.d.ts +1 -0
  100. package/dist/feedback/StatusMessage.svelte +13 -3
  101. package/dist/fermi-surface/FermiSlice.svelte +13 -5
  102. package/dist/fermi-surface/FermiSurface.svelte +78 -151
  103. package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -14
  104. package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
  105. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  106. package/dist/fermi-surface/FermiSurfaceScene.svelte +72 -221
  107. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  108. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
  109. package/dist/fermi-surface/compute.js +67 -66
  110. package/dist/fermi-surface/export.js +6 -16
  111. package/dist/fermi-surface/index.d.ts +0 -1
  112. package/dist/fermi-surface/index.js +0 -1
  113. package/dist/fermi-surface/parse.d.ts +1 -1
  114. package/dist/fermi-surface/parse.js +71 -79
  115. package/dist/fermi-surface/types.d.ts +3 -2
  116. package/dist/heatmap-matrix/HeatmapMatrix.svelte +69 -52
  117. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +4 -3
  118. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +3 -2
  119. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  120. package/dist/heatmap-matrix/index.d.ts +3 -2
  121. package/dist/heatmap-matrix/index.js +1 -1
  122. package/dist/index.d.ts +1 -0
  123. package/dist/index.js +1 -0
  124. package/dist/io/ExportPane.svelte +166 -0
  125. package/dist/io/ExportPane.svelte.d.ts +17 -0
  126. package/dist/io/decompress.js +5 -4
  127. package/dist/io/export.d.ts +9 -5
  128. package/dist/io/export.js +77 -51
  129. package/dist/io/fetch.d.ts +2 -1
  130. package/dist/io/fetch.js +5 -1
  131. package/dist/io/file-drop.d.ts +8 -1
  132. package/dist/io/file-drop.js +48 -36
  133. package/dist/io/index.d.ts +2 -0
  134. package/dist/io/index.js +10 -0
  135. package/dist/io/types.d.ts +13 -0
  136. package/dist/io/url-drop.js +64 -33
  137. package/dist/isosurface/parse.js +52 -51
  138. package/dist/isosurface/slice.js +5 -4
  139. package/dist/isosurface/types.js +1 -1
  140. package/dist/keyboard.d.ts +3 -0
  141. package/dist/keyboard.js +23 -0
  142. package/dist/labels.d.ts +1 -1
  143. package/dist/labels.js +9 -8
  144. package/dist/layout/FullscreenButton.svelte +33 -0
  145. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  146. package/dist/layout/FullscreenToggle.svelte +8 -14
  147. package/dist/layout/PropertyFilter.svelte +3 -2
  148. package/dist/layout/SettingsSection.svelte +1 -1
  149. package/dist/layout/ViewerChrome.svelte +116 -0
  150. package/dist/layout/ViewerChrome.svelte.d.ts +17 -0
  151. package/dist/layout/fullscreen.d.ts +4 -0
  152. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  153. package/dist/layout/fullscreen.svelte.js +37 -0
  154. package/dist/layout/index.d.ts +3 -0
  155. package/dist/layout/index.js +3 -0
  156. package/dist/layout/json-tree/JsonNode.svelte +1 -1
  157. package/dist/layout/json-tree/JsonTree.svelte +2 -2
  158. package/dist/layout/json-tree/utils.js +5 -4
  159. package/dist/marching-cubes.js +8 -13
  160. package/dist/math.d.ts +12 -4
  161. package/dist/math.js +42 -30
  162. package/dist/overlays/DraggablePane.svelte +4 -4
  163. package/dist/overlays/index.d.ts +4 -0
  164. package/dist/periodic-table/PeriodicTable.svelte +27 -15
  165. package/dist/periodic-table/PropertySelect.svelte +1 -0
  166. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
  167. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  168. package/dist/phase-diagram/PhaseDiagramControls.svelte +3 -2
  169. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  170. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  171. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  172. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +47 -132
  173. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  174. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
  175. package/dist/phase-diagram/build-diagram.js +2 -2
  176. package/dist/phase-diagram/colors.js +1 -1
  177. package/dist/phase-diagram/parse.d.ts +2 -1
  178. package/dist/phase-diagram/parse.js +6 -5
  179. package/dist/phase-diagram/types.d.ts +1 -1
  180. package/dist/phase-diagram/utils.d.ts +3 -3
  181. package/dist/phase-diagram/utils.js +8 -12
  182. package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +246 -841
  183. package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +8 -16
  184. package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
  185. package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
  186. package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +8 -7
  187. package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
  188. package/dist/plot/bar/data.d.ts +40 -0
  189. package/dist/plot/bar/data.js +154 -0
  190. package/dist/plot/bar/geometry.d.ts +39 -0
  191. package/dist/plot/bar/geometry.js +60 -0
  192. package/dist/plot/bar/index.d.ts +3 -0
  193. package/dist/plot/bar/index.js +3 -0
  194. package/dist/plot/box/BoxPlot.svelte +1292 -0
  195. package/dist/plot/box/BoxPlot.svelte.d.ts +95 -0
  196. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  197. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  198. package/dist/plot/box/Violin.svelte +14 -0
  199. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  200. package/dist/plot/box/box-plot.d.ts +56 -0
  201. package/dist/plot/box/box-plot.js +129 -0
  202. package/dist/plot/box/index.d.ts +5 -0
  203. package/dist/plot/box/index.js +5 -0
  204. package/dist/plot/box/kde.d.ts +17 -0
  205. package/dist/plot/box/kde.js +160 -0
  206. package/dist/plot/box/quantile.d.ts +3 -0
  207. package/dist/plot/box/quantile.js +53 -0
  208. package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +1 -1
  209. package/dist/plot/{auto-place.js → core/auto-place.js} +6 -3
  210. package/dist/plot/core/axis-utils.d.ts +46 -0
  211. package/dist/plot/core/axis-utils.js +110 -0
  212. package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
  213. package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
  214. package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +41 -38
  215. package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +7 -6
  216. package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
  217. package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
  218. package/dist/plot/core/components/ControlPane.svelte +46 -0
  219. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  220. package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
  221. package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
  222. package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
  223. package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
  224. package/dist/plot/{Line.svelte → core/components/Line.svelte} +33 -15
  225. package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +3 -2
  226. package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +9 -6
  227. package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +5 -3
  228. package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
  229. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  230. package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
  231. package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
  232. package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
  233. package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
  234. package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
  235. package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
  236. package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
  237. package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +5 -5
  238. package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +5 -5
  239. package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +8 -8
  240. package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +5 -5
  241. package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
  242. package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
  243. package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
  244. package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
  245. package/dist/plot/core/components/index.d.ts +17 -0
  246. package/dist/plot/core/components/index.js +17 -0
  247. package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
  248. package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +21 -23
  249. package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
  250. package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
  251. package/dist/plot/core/fill-utils.d.ts +34 -0
  252. package/dist/plot/core/fill-utils.js +391 -0
  253. package/dist/plot/core/index.d.ts +10 -0
  254. package/dist/plot/core/index.js +11 -0
  255. package/dist/plot/core/interactions.d.ts +39 -0
  256. package/dist/plot/core/interactions.js +209 -0
  257. package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
  258. package/dist/plot/{layout.js → core/layout.js} +16 -8
  259. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  260. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  261. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  262. package/dist/plot/core/placed-tween.svelte.js +68 -0
  263. package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +11 -11
  264. package/dist/plot/{reference-line.js → core/reference-line.js} +29 -42
  265. package/dist/plot/core/scales.d.ts +40 -0
  266. package/dist/plot/{scales.js → core/scales.js} +94 -93
  267. package/dist/plot/core/svg.d.ts +3 -0
  268. package/dist/plot/core/svg.js +41 -0
  269. package/dist/plot/{types.d.ts → core/types.d.ts} +36 -85
  270. package/dist/plot/{types.js → core/types.js} +1 -1
  271. package/dist/plot/{utils → core/utils}/label-placement.d.ts +3 -3
  272. package/dist/plot/{utils → core/utils}/label-placement.js +3 -3
  273. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  274. package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
  275. package/dist/plot/core/utils.d.ts +12 -0
  276. package/dist/plot/core/utils.js +27 -0
  277. package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +174 -551
  278. package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
  279. package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
  280. package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
  281. package/dist/plot/histogram/index.d.ts +2 -0
  282. package/dist/plot/histogram/index.js +2 -0
  283. package/dist/plot/index.d.ts +8 -41
  284. package/dist/plot/index.js +10 -39
  285. package/dist/plot/sankey/Sankey.svelte +697 -0
  286. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  287. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  288. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  289. package/dist/plot/sankey/index.d.ts +4 -0
  290. package/dist/plot/sankey/index.js +3 -0
  291. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  292. package/dist/plot/sankey/sankey-types.js +4 -0
  293. package/dist/plot/sankey/sankey.d.ts +52 -0
  294. package/dist/plot/sankey/sankey.js +189 -0
  295. package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +64 -64
  296. package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +6 -6
  297. package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
  298. package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
  299. package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +297 -1008
  300. package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +10 -18
  301. package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
  302. package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +2 -2
  303. package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
  304. package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
  305. package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
  306. package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
  307. package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +5 -12
  308. package/dist/plot/scatter/index.d.ts +7 -0
  309. package/dist/plot/scatter/index.js +5 -0
  310. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  311. package/dist/plot/scatter/scatter-data.js +212 -0
  312. package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +25 -34
  313. package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +9 -17
  314. package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +14 -14
  315. package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +6 -6
  316. package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +129 -128
  317. package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +6 -15
  318. package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +7 -6
  319. package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +5 -4
  320. package/dist/plot/scatter-3d/index.d.ts +4 -0
  321. package/dist/plot/scatter-3d/index.js +4 -0
  322. package/dist/plot/sunburst/Sunburst.svelte +1041 -0
  323. package/dist/plot/sunburst/Sunburst.svelte.d.ts +97 -0
  324. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  325. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  326. package/dist/plot/sunburst/index.d.ts +4 -0
  327. package/dist/plot/sunburst/index.js +4 -0
  328. package/dist/plot/sunburst/render.d.ts +34 -0
  329. package/dist/plot/sunburst/render.js +122 -0
  330. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  331. package/dist/plot/sunburst/sunburst.js +269 -0
  332. package/dist/rdf/RdfPlot.svelte +2 -1
  333. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  334. package/dist/rdf/calc-rdf.js +11 -24
  335. package/dist/sanitize.js +14 -3
  336. package/dist/scene/SceneCamera.svelte +62 -0
  337. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  338. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  339. package/dist/scene/bind-renderer.svelte.js +14 -0
  340. package/dist/scene/index.d.ts +4 -0
  341. package/dist/scene/index.js +5 -0
  342. package/dist/scene/props.js +52 -0
  343. package/dist/scene/types.d.ts +26 -0
  344. package/dist/scene/types.js +1 -0
  345. package/dist/settings.d.ts +79 -3
  346. package/dist/settings.js +321 -1
  347. package/dist/spectral/Bands.svelte +47 -36
  348. package/dist/spectral/Bands.svelte.d.ts +6 -6
  349. package/dist/spectral/BandsAndDos.svelte +23 -25
  350. package/dist/spectral/BrillouinBandsDos.svelte +42 -30
  351. package/dist/spectral/Dos.svelte +15 -23
  352. package/dist/spectral/Dos.svelte.d.ts +4 -3
  353. package/dist/spectral/helpers.d.ts +8 -6
  354. package/dist/spectral/helpers.js +137 -65
  355. package/dist/state.svelte.d.ts +0 -7
  356. package/dist/state.svelte.js +0 -6
  357. package/dist/structure/Arrow.svelte +2 -4
  358. package/dist/structure/AtomLegend.svelte +8 -9
  359. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  360. package/dist/structure/CanvasTooltip.svelte +1 -0
  361. package/dist/structure/CellSelect.svelte +12 -5
  362. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  363. package/dist/structure/Cylinder.svelte +12 -8
  364. package/dist/structure/Cylinder.svelte.d.ts +4 -1
  365. package/dist/structure/Lattice.svelte +2 -2
  366. package/dist/structure/Structure.svelte +365 -423
  367. package/dist/structure/Structure.svelte.d.ts +5 -15
  368. package/dist/structure/StructureControls.svelte +217 -2
  369. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  370. package/dist/structure/StructureExportPane.svelte +54 -156
  371. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  372. package/dist/structure/StructureInfoPane.svelte +10 -9
  373. package/dist/structure/StructureInfoPane.svelte.d.ts +5 -5
  374. package/dist/structure/StructureScene.svelte +376 -208
  375. package/dist/structure/StructureScene.svelte.d.ts +22 -20
  376. package/dist/structure/{label-placement.d.ts → atom-label-placement.d.ts} +3 -3
  377. package/dist/structure/{label-placement.js → atom-label-placement.js} +15 -5
  378. package/dist/structure/atom-properties.d.ts +1 -1
  379. package/dist/structure/atom-properties.js +17 -22
  380. package/dist/structure/bond-order-perception.js +3 -5
  381. package/dist/structure/bonding.d.ts +4 -0
  382. package/dist/structure/bonding.js +134 -63
  383. package/dist/structure/export.d.ts +24 -4
  384. package/dist/structure/export.js +89 -143
  385. package/dist/structure/index.d.ts +4 -4
  386. package/dist/structure/index.js +3 -3
  387. package/dist/structure/measure.d.ts +3 -2
  388. package/dist/structure/measure.js +6 -5
  389. package/dist/structure/parse.d.ts +3 -2
  390. package/dist/structure/parse.js +419 -438
  391. package/dist/structure/partial-occupancy.d.ts +0 -1
  392. package/dist/structure/partial-occupancy.js +1 -1
  393. package/dist/structure/pbc.d.ts +1 -1
  394. package/dist/structure/pbc.js +190 -13
  395. package/dist/structure/polyhedra.d.ts +41 -0
  396. package/dist/structure/polyhedra.js +602 -0
  397. package/dist/structure/site.d.ts +4 -0
  398. package/dist/structure/site.js +1 -0
  399. package/dist/structure/supercell.js +3 -2
  400. package/dist/structure/validation.js +5 -6
  401. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  402. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  403. package/dist/symmetry/SymmetryElements.svelte +354 -0
  404. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  405. package/dist/symmetry/SymmetryStats.svelte +113 -8
  406. package/dist/symmetry/WyckoffTable.svelte +68 -7
  407. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  408. package/dist/symmetry/cell-transform.js +7 -14
  409. package/dist/symmetry/index.d.ts +14 -4
  410. package/dist/symmetry/index.js +291 -72
  411. package/dist/symmetry/spacegroups.d.ts +12 -1
  412. package/dist/symmetry/spacegroups.js +63 -14
  413. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  414. package/dist/symmetry/symmetry-elements.js +521 -0
  415. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  416. package/dist/symmetry/wyckoff-db.js +87 -0
  417. package/dist/table/HeatmapTable.svelte +66 -25
  418. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  419. package/dist/table/index.d.ts +1 -3
  420. package/dist/table/index.js +1 -1
  421. package/dist/theme/index.js +8 -8
  422. package/dist/tooltip/KCoords.svelte +45 -0
  423. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  424. package/dist/tooltip/index.d.ts +1 -0
  425. package/dist/tooltip/index.js +1 -0
  426. package/dist/trajectory/Trajectory.svelte +123 -100
  427. package/dist/trajectory/Trajectory.svelte.d.ts +11 -22
  428. package/dist/trajectory/TrajectoryExportPane.svelte +17 -25
  429. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  430. package/dist/trajectory/TrajectoryInfoPane.svelte +5 -3
  431. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  432. package/dist/trajectory/constants.js +6 -2
  433. package/dist/trajectory/extract.js +17 -37
  434. package/dist/trajectory/format-detect.d.ts +1 -1
  435. package/dist/trajectory/format-detect.js +27 -19
  436. package/dist/trajectory/frame-reader.d.ts +0 -1
  437. package/dist/trajectory/frame-reader.js +63 -162
  438. package/dist/trajectory/helpers.d.ts +10 -2
  439. package/dist/trajectory/helpers.js +56 -36
  440. package/dist/trajectory/index.js +1 -1
  441. package/dist/trajectory/parse/ase.d.ts +9 -1
  442. package/dist/trajectory/parse/ase.js +47 -32
  443. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  444. package/dist/trajectory/parse/diagnostics.js +14 -0
  445. package/dist/trajectory/parse/hdf5.js +1 -1
  446. package/dist/trajectory/parse/index.d.ts +1 -1
  447. package/dist/trajectory/parse/index.js +65 -105
  448. package/dist/trajectory/parse/lammps.d.ts +0 -2
  449. package/dist/trajectory/parse/lammps.js +8 -6
  450. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  451. package/dist/trajectory/parse/pymatgen.js +74 -0
  452. package/dist/trajectory/parse/vasp.js +38 -18
  453. package/dist/trajectory/parse/xyz.d.ts +13 -1
  454. package/dist/trajectory/parse/xyz.js +102 -94
  455. package/dist/trajectory/plotting.d.ts +1 -2
  456. package/dist/trajectory/plotting.js +16 -113
  457. package/dist/utils.d.ts +2 -0
  458. package/dist/utils.js +7 -5
  459. package/dist/xrd/XrdPlot.svelte +16 -30
  460. package/dist/xrd/broadening.d.ts +2 -1
  461. package/dist/xrd/calc-xrd.js +18 -20
  462. package/dist/xrd/index.d.ts +2 -2
  463. package/dist/xrd/parse.js +2 -2
  464. package/package.json +43 -26
  465. package/dist/element/data.json +0 -11864
  466. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  467. package/dist/fermi-surface/marching-cubes.js +0 -2
  468. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  469. package/dist/plot/axis-utils.d.ts +0 -19
  470. package/dist/plot/axis-utils.js +0 -78
  471. package/dist/plot/defaults.d.ts +0 -19
  472. package/dist/plot/defaults.js +0 -9
  473. package/dist/plot/fill-utils.d.ts +0 -46
  474. package/dist/plot/fill-utils.js +0 -322
  475. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  476. package/dist/plot/hover-lock.svelte.js +0 -46
  477. package/dist/plot/interactions.d.ts +0 -12
  478. package/dist/plot/interactions.js +0 -101
  479. package/dist/plot/scales.d.ts +0 -48
  480. package/dist/plot/svg.d.ts +0 -1
  481. package/dist/plot/svg.js +0 -11
  482. package/dist/plot/utils/series-visibility.d.ts +0 -15
  483. package/dist/plot/utils.d.ts +0 -1
  484. package/dist/plot/utils.js +0 -14
  485. /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
  486. /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
@@ -1,4 +1,5 @@
1
1
  import type { PhaseData } from '../convex-hull/types';
2
+ import { type FullscreenToggleProp } from '../layout';
2
3
  import type { ChemPotDiagramConfig, ChemPotHoverInfo } from './types';
3
4
  type $$ComponentProps = {
4
5
  entries: PhaseData[];
@@ -10,7 +11,12 @@ type $$ComponentProps = {
10
11
  max_interpolation_gap?: number;
11
12
  hover_info?: ChemPotHoverInfo | null;
12
13
  render_local_tooltip?: boolean;
14
+ wrapper?: HTMLDivElement;
15
+ fullscreen?: boolean;
16
+ fullscreen_toggle?: FullscreenToggleProp;
17
+ controls_open?: boolean;
18
+ export_pane_open?: boolean;
13
19
  };
14
- declare const ChemPotDiagram3D: import("svelte").Component<$$ComponentProps, {}, "temperature" | "height" | "width" | "hover_info">;
20
+ declare const ChemPotDiagram3D: import("svelte").Component<$$ComponentProps, {}, "height" | "width" | "temperature" | "fullscreen" | "wrapper" | "controls_open" | "export_pane_open" | "hover_info">;
15
21
  type ChemPotDiagram3D = ReturnType<typeof ChemPotDiagram3D>;
16
22
  export default ChemPotDiagram3D;
@@ -1,6 +1,7 @@
1
1
  // Async wrapper for compute_chempot_diagram via Web Worker.
2
2
  // Falls back to synchronous main-thread computation during SSR.
3
3
  import { compute_chempot_diagram, formula_key_from_composition } from './compute';
4
+ import { to_error } from '../utils';
4
5
  let worker = null;
5
6
  let next_id = 0;
6
7
  const pending = new Map();
@@ -28,6 +29,7 @@ function get_worker() {
28
29
  if (typeof Worker === `undefined`)
29
30
  return null;
30
31
  if (!worker) {
32
+ // oxlint-disable-next-line eslint-plugin-unicorn/relative-url-style -- Vite worker detection requires the `./` prefix
31
33
  worker = new Worker(new URL(`./chempot-worker.js`, import.meta.url), { type: `module` });
32
34
  worker.addEventListener(`message`, ({ data: { id, result, error } }) => {
33
35
  const req = pending.get(id);
@@ -71,7 +73,7 @@ export function compute_chempot_async(entries, config = {}) {
71
73
  }
72
74
  catch (err) {
73
75
  pending.delete(id);
74
- reject(err instanceof Error ? err : new Error(String(err)));
76
+ reject(to_error(err));
75
77
  }
76
78
  });
77
79
  return track_pending(request_key, promise);
@@ -1,4 +1,5 @@
1
1
  import { compute_chempot_diagram } from './compute';
2
+ import { to_error } from '../utils';
2
3
  self.addEventListener(`message`, (event) => {
3
4
  const { id, entries, config } = event.data;
4
5
  try {
@@ -6,6 +7,6 @@ self.addEventListener(`message`, (event) => {
6
7
  postMessage({ id, result, error: null });
7
8
  }
8
9
  catch (err) {
9
- postMessage({ id, result: null, error: err instanceof Error ? err.message : String(err) });
10
+ postMessage({ id, result: null, error: to_error(err).message });
10
11
  }
11
12
  });
@@ -1,10 +1,7 @@
1
1
  import { type D3InterpolateName } from '../colors';
2
- /** Resolve D3 interpolator with optional reverse for chempot color scales. */
3
- export declare function get_chempot_interpolator(name: D3InterpolateName, reverse: boolean): (t: number) => string;
4
- /** Build sequential color scale from values and D3 interpolator name. */
2
+ import type { Vec2 } from '../math';
5
3
  export declare function make_chempot_color_scale(values: number[], interpolator_name: D3InterpolateName, reverse: boolean): ((val: number) => string) | null;
6
- /** Resolve color bar props for chempot diagrams (interpolator + domain). */
7
4
  export declare function get_chempot_color_bar_config(color_scale: D3InterpolateName, reverse: boolean): {
8
- color_scale_fn: (t: number) => string;
9
- color_scale_domain: [number, number];
5
+ color_scale_fn: (frac: number) => string;
6
+ color_scale_domain: Vec2;
10
7
  };
@@ -1,11 +1,11 @@
1
1
  import { get_d3_interpolator } from '../colors';
2
2
  import { scaleSequential } from 'd3-scale';
3
- /** Resolve D3 interpolator with optional reverse for chempot color scales. */
4
- export function get_chempot_interpolator(name, reverse) {
3
+ // Resolve D3 interpolator with optional reverse for chempot color scales.
4
+ function get_chempot_interpolator(name, reverse) {
5
5
  const raw = get_d3_interpolator(name);
6
- return reverse ? (t) => raw(1 - t) : raw;
6
+ return reverse ? (frac) => raw(1 - frac) : raw;
7
7
  }
8
- /** Build sequential color scale from values and D3 interpolator name. */
8
+ // Build sequential color scale from values and D3 interpolator name.
9
9
  export function make_chempot_color_scale(values, interpolator_name, reverse) {
10
10
  const finite_values = values.filter(Number.isFinite);
11
11
  if (finite_values.length === 0)
@@ -23,7 +23,7 @@ export function make_chempot_color_scale(values, interpolator_name, reverse) {
23
23
  max_value,
24
24
  ]);
25
25
  }
26
- /** Resolve color bar props for chempot diagrams (interpolator + domain). */
26
+ // Resolve color bar props for chempot diagrams (interpolator + domain).
27
27
  export function get_chempot_color_bar_config(color_scale, reverse) {
28
28
  return {
29
29
  color_scale_fn: get_chempot_interpolator(color_scale, reverse),
@@ -1,4 +1,5 @@
1
1
  import type { PhaseData } from '../convex-hull/types';
2
+ import type { Vec2 } from '../math';
2
3
  import { type ChemPotDiagramConfig, type ChemPotDiagramData } from './types';
3
4
  export declare function get_energy_per_atom(entry: PhaseData): number;
4
5
  export declare function formula_key_from_composition(composition: Record<string, number>): string;
@@ -6,14 +7,13 @@ export declare function get_min_entries_and_el_refs(entries: PhaseData[]): {
6
7
  min_entries: PhaseData[];
7
8
  el_refs: Record<string, PhaseData>;
8
9
  };
9
- export declare function compute_form_energy_per_atom(entry: PhaseData, el_refs: Record<string, PhaseData>): number;
10
10
  export declare function best_form_energy_for_formula(entries: PhaseData[], formula: string, el_refs: Record<string, PhaseData>): number | undefined;
11
- export declare function renormalize_entries(entries: PhaseData[], el_refs: Record<string, PhaseData>, elements: string[]): PhaseData[];
11
+ export declare const renormalize_entries: (entries: PhaseData[], el_refs: Record<string, PhaseData>, elements: string[]) => PhaseData[];
12
12
  export declare function build_hyperplanes(min_entries: PhaseData[], el_refs: Record<string, PhaseData>, elements: string[]): {
13
13
  hyperplanes: number[][];
14
14
  hyperplane_entries: PhaseData[];
15
15
  };
16
- export declare function build_border_hyperplanes(lims: [number, number][]): number[][];
16
+ export declare function build_border_hyperplanes(lims: Vec2[]): number[][];
17
17
  export declare function compute_domains(hyperplanes: number[][], border_hyperplanes: number[][], hyperplane_entries: PhaseData[], dim: number): Record<string, number[][]>;
18
18
  export declare function apply_element_padding(domains: Record<string, number[][]>, elem_indices: number[], padding: number, default_min_limit: number): number[];
19
19
  export declare function pad_domain_points(pts: number[][], elem_indices: number[], new_lims: number[], default_min_limit: number, padding: number): number[][];
@@ -26,7 +26,7 @@ export declare function simple_pca(data: number[][], k?: number): {
26
26
  scores: number[][];
27
27
  eigenvectors: number[][];
28
28
  };
29
- export declare function orthonormal_2d(line_pts: number[][]): [number, number];
29
+ export declare function orthonormal_2d(line_pts: number[][]): Vec2;
30
30
  export declare function dedup_points(pts: number[][], tol?: number): {
31
31
  unique: number[][];
32
32
  orig_indices: number[];
@@ -84,7 +84,9 @@ export function get_min_entries_and_el_refs(entries) {
84
84
  return { min_entries, el_refs };
85
85
  }
86
86
  // Compute formation energy per atom against elemental references.
87
- export function compute_form_energy_per_atom(entry, el_refs) {
87
+ // NOTE: diverges from convex-hull's compute_e_form_per_atom (which returns null on
88
+ // missing refs); kept module-private so the divergent variant can't leak into public API.
89
+ function compute_form_energy_per_atom(entry, el_refs) {
88
90
  const atom_count = count_atoms_in_composition(entry.composition);
89
91
  const energy_per_atom = get_energy_per_atom(entry);
90
92
  let ref_energy = 0;
@@ -112,24 +114,22 @@ export function best_form_energy_for_formula(entries, formula, el_refs) {
112
114
  }
113
115
  // Renormalize entry energies to be relative to elemental references (formal chemical potentials).
114
116
  // For each entry, subtracts sum(x_i * E_ref_i) from its energy per atom.
115
- export function renormalize_entries(entries, el_refs, elements) {
116
- return entries.map((entry) => {
117
- const atoms = count_atoms_in_composition(entry.composition);
118
- let renorm_energy = 0;
119
- for (const el of elements) {
120
- const frac = atoms > 0 ? (entry.composition[el] ?? 0) / atoms : 0;
121
- const ref = el_refs[el];
122
- if (ref)
123
- renorm_energy += frac * get_energy_per_atom(ref);
124
- }
125
- const new_energy_per_atom = get_energy_per_atom(entry) - renorm_energy;
126
- return {
127
- ...entry,
128
- energy: new_energy_per_atom * atoms,
129
- energy_per_atom: new_energy_per_atom,
130
- };
131
- });
132
- }
117
+ export const renormalize_entries = (entries, el_refs, elements) => entries.map((entry) => {
118
+ const atoms = count_atoms_in_composition(entry.composition);
119
+ let renorm_energy = 0;
120
+ for (const el of elements) {
121
+ const frac = atoms > 0 ? (entry.composition[el] ?? 0) / atoms : 0;
122
+ const ref = el_refs[el];
123
+ if (ref)
124
+ renorm_energy += frac * get_energy_per_atom(ref);
125
+ }
126
+ const new_energy_per_atom = get_energy_per_atom(entry) - renorm_energy;
127
+ return {
128
+ ...entry,
129
+ energy: new_energy_per_atom * atoms,
130
+ energy_per_atom: new_energy_per_atom,
131
+ };
132
+ });
133
133
  // Build hyperplane representation for minimum entries.
134
134
  // Each row is [x_1, ..., x_n, -E_per_atom].
135
135
  // Filters to entries with negative formation energy plus all elemental refs.
@@ -782,7 +782,7 @@ export function compute_chempot_diagram(entries, config = {}) {
782
782
  if (is_projection) {
783
783
  const col_indices = display_elements.map((element) => {
784
784
  const idx = compute_elements.indexOf(element);
785
- if (idx < 0) {
785
+ if (idx === -1) {
786
786
  throw new Error(`Display element ${element} not present in compute element set`);
787
787
  }
788
788
  return idx;
@@ -0,0 +1,10 @@
1
+ import { type ChemPotDiagramConfig } from './types';
2
+ export declare function create_chempot_overrides<Key extends keyof ChemPotDiagramConfig>(config: () => ChemPotDiagramConfig, keys: readonly Key[], custom_defaults?: {
3
+ [P in Key]?: NonNullable<ChemPotDiagramConfig[P]>;
4
+ }): {
5
+ resolve: <P extends Key>(key: P) => NonNullable<ChemPotDiagramConfig[P]>;
6
+ set: <P extends Key>(key: P, value: NonNullable<ChemPotDiagramConfig[P]>) => void;
7
+ reset: () => void;
8
+ };
9
+ export declare const CHEMPOT_COLOR_MODE_OPTIONS: readonly [readonly ["none", "None"], readonly ["energy", "Energy/atom"], readonly ["formation_energy", "Formation energy"], readonly ["arity", "Element count"], readonly ["entries", "Entry count"]];
10
+ export declare const CHEMPOT_COLOR_SCALE_OPTIONS: readonly [readonly ["interpolateViridis", "Viridis"], readonly ["interpolatePlasma", "Plasma"], readonly ["interpolateInferno", "Inferno"], readonly ["interpolateMagma", "Magma"], readonly ["interpolateCividis", "Cividis"], readonly ["interpolateTurbo", "Turbo"], readonly ["interpolateRdYlBu", "RdYlBu"], readonly ["interpolateSpectral", "Spectral"]];
@@ -0,0 +1,42 @@
1
+ // Override state + shared <option> lists for the ChemPotDiagram2D/3D control panes
2
+ import { CHEMPOT_DEFAULTS } from './types';
3
+ // Per-key user overrides with `override ?? config ?? default` resolution; `reset()`
4
+ // clears all overrides (the panes' "Reset defaults" buttons). Defaults come from
5
+ // CHEMPOT_DEFAULTS unless overridden via custom_defaults; keys without either throw upfront.
6
+ export function create_chempot_overrides(config, keys, custom_defaults = {}) {
7
+ const defaults = Object.fromEntries(keys.map((key) => {
8
+ const fallback = custom_defaults[key] ?? CHEMPOT_DEFAULTS[key];
9
+ if (fallback === undefined) {
10
+ throw new Error(`create_chempot_overrides: key '${key}' is missing from both custom_defaults and CHEMPOT_DEFAULTS`);
11
+ }
12
+ return [key, fallback];
13
+ }));
14
+ let overrides = $state({});
15
+ return {
16
+ resolve: (key) => (overrides[key] ?? config()[key] ?? defaults[key]),
17
+ set: (key, value) => {
18
+ overrides[key] = value;
19
+ },
20
+ reset: () => {
21
+ overrides = {};
22
+ },
23
+ };
24
+ }
25
+ // [value, label] pairs for the color-mode and color-scale <select>s in both panes
26
+ export const CHEMPOT_COLOR_MODE_OPTIONS = [
27
+ [`none`, `None`],
28
+ [`energy`, `Energy/atom`],
29
+ [`formation_energy`, `Formation energy`],
30
+ [`arity`, `Element count`],
31
+ [`entries`, `Entry count`],
32
+ ];
33
+ export const CHEMPOT_COLOR_SCALE_OPTIONS = [
34
+ [`interpolateViridis`, `Viridis`],
35
+ [`interpolatePlasma`, `Plasma`],
36
+ [`interpolateInferno`, `Inferno`],
37
+ [`interpolateMagma`, `Magma`],
38
+ [`interpolateCividis`, `Cividis`],
39
+ [`interpolateTurbo`, `Turbo`],
40
+ [`interpolateRdYlBu`, `RdYlBu`],
41
+ [`interpolateSpectral`, `Spectral`],
42
+ ];
@@ -0,0 +1,47 @@
1
+ import * as THREE from 'three';
2
+ export declare const get_json_string: (payload: unknown) => string;
3
+ export declare const export_json_file: (payload: unknown, basename: string) => void;
4
+ interface XYZ {
5
+ x: number;
6
+ y: number;
7
+ z: number;
8
+ }
9
+ export declare function get_view_settings(opts: {
10
+ elements: string[];
11
+ camera_projection: string;
12
+ auto_rotate: number;
13
+ color_mode: string;
14
+ color_scale: string;
15
+ reverse_color_scale: boolean;
16
+ camera_position?: XYZ | null;
17
+ camera_target?: XYZ | null;
18
+ }): Record<string, unknown>;
19
+ export declare const export_view_json_file: (view_settings: Record<string, unknown>, basename: string) => void;
20
+ export interface OverlayTextItem {
21
+ x: number;
22
+ y: number;
23
+ text: string;
24
+ font: string;
25
+ font_size: string;
26
+ font_family: string;
27
+ font_weight: string;
28
+ color: string;
29
+ }
30
+ export declare function get_overlay_text_items(wrapper: HTMLElement, canvas_rect: DOMRect): OverlayTextItem[];
31
+ export declare function export_png_file(wrapper: HTMLElement | undefined, basename: string, png_dpi: number): void;
32
+ export declare function export_svg_file(wrapper: HTMLElement | undefined, basename: string, view_settings: Record<string, unknown>): void;
33
+ export interface ChemPotGlbParts {
34
+ hull_geometry?: THREE.BufferGeometry | null;
35
+ hull_opacity?: number;
36
+ edge_geometry: THREE.BufferGeometry;
37
+ formula_meshes?: {
38
+ geometry: THREE.BufferGeometry;
39
+ color: string;
40
+ }[];
41
+ formula_edges?: {
42
+ geometry: THREE.BufferGeometry;
43
+ color: string;
44
+ }[];
45
+ }
46
+ export declare function export_glb_file(parts: ChemPotGlbParts, basename: string): void;
47
+ export {};
@@ -0,0 +1,133 @@
1
+ // Export helpers for chemical potential diagrams (shared between 2D and 3D views).
2
+ import { dpi_to_scale } from '../io/export';
3
+ import { download } from '../io/fetch';
4
+ import * as THREE from 'three';
5
+ import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
6
+ export const get_json_string = (payload) => JSON.stringify(payload, null, 2);
7
+ const download_json = (payload, filename) => download(get_json_string(payload), filename, `application/json`);
8
+ export const export_json_file = (payload, basename) => download_json(payload, `${basename}.json`);
9
+ const xyz_tuple = (point) => point ? [point.x, point.y, point.z] : null;
10
+ const get_gl_canvas = (wrapper) => {
11
+ const canvas = wrapper?.querySelector(`canvas`);
12
+ return canvas instanceof HTMLCanvasElement ? canvas : null;
13
+ };
14
+ // Serializable snapshot of the current 3D view (embedded in SVG/JSON exports)
15
+ export function get_view_settings(opts) {
16
+ const { camera_position, camera_target, ...settings } = opts;
17
+ return {
18
+ ...settings,
19
+ camera_position: xyz_tuple(camera_position),
20
+ camera_target: xyz_tuple(camera_target),
21
+ };
22
+ }
23
+ export const export_view_json_file = (view_settings, basename) => download_json(view_settings, `${basename}-view.json`);
24
+ // Collect HTML overlay text (tick/axis/domain labels) positioned relative to the canvas
25
+ export function get_overlay_text_items(wrapper, canvas_rect) {
26
+ const text_items = [];
27
+ for (const element of wrapper.querySelectorAll(`.tick-label, .axis-label, .domain-label`)) {
28
+ const html_element = element;
29
+ const style = getComputedStyle(html_element);
30
+ if (style.display === `none` || style.visibility === `hidden`)
31
+ continue;
32
+ const element_rect = html_element.getBoundingClientRect();
33
+ text_items.push({
34
+ x: element_rect.left + element_rect.width / 2 - canvas_rect.left,
35
+ y: element_rect.top + element_rect.height / 2 - canvas_rect.top,
36
+ text: html_element.textContent ?? ``,
37
+ font: style.font || `${style.fontSize} ${style.fontFamily}`,
38
+ font_size: style.fontSize || `11px`,
39
+ font_family: style.fontFamily || `sans-serif`,
40
+ font_weight: style.fontWeight || `400`,
41
+ color: style.color || `#333`,
42
+ });
43
+ }
44
+ return text_items;
45
+ }
46
+ // Composite the WebGL canvas + HTML overlay labels into a single PNG download
47
+ export function export_png_file(wrapper, basename, png_dpi) {
48
+ const gl_canvas = get_gl_canvas(wrapper);
49
+ if (!gl_canvas || !wrapper)
50
+ return;
51
+ const rect = gl_canvas.getBoundingClientRect();
52
+ // A degenerate rect means the canvas is hidden/unrendered: nothing to capture
53
+ if (!(rect.width > 0) || !(rect.height > 0)) {
54
+ console.error(`Cannot export PNG: canvas has zero size (width=${rect.width}, height=${rect.height})`);
55
+ return;
56
+ }
57
+ const scale = dpi_to_scale(png_dpi);
58
+ const out = document.createElement(`canvas`);
59
+ // Floor at 1px so tiny rect x min-DPI rounding can't yield an invalid 0x0 canvas
60
+ out.width = Math.max(1, Math.round(rect.width * scale));
61
+ out.height = Math.max(1, Math.round(rect.height * scale));
62
+ const ctx = out.getContext(`2d`);
63
+ if (!ctx)
64
+ return;
65
+ ctx.scale(scale, scale);
66
+ ctx.drawImage(gl_canvas, 0, 0, rect.width, rect.height);
67
+ for (const text_item of get_overlay_text_items(wrapper, rect)) {
68
+ ctx.font = text_item.font;
69
+ ctx.fillStyle = text_item.color;
70
+ ctx.textAlign = `center`;
71
+ ctx.textBaseline = `middle`;
72
+ ctx.fillText(text_item.text, text_item.x, text_item.y);
73
+ }
74
+ out.toBlob((blob) => {
75
+ if (!blob)
76
+ return;
77
+ download(blob, `${basename}.png`, `image/png`);
78
+ }, `image/png`);
79
+ }
80
+ const xml_escape = (text) => text
81
+ .replaceAll(`&`, `&amp;`)
82
+ .replaceAll(`<`, `&lt;`)
83
+ .replaceAll(`>`, `&gt;`)
84
+ .replaceAll(`"`, `&quot;`)
85
+ .replaceAll(`'`, `&#39;`);
86
+ // SVG snapshot: rasterized canvas as embedded image + overlay labels as real text nodes
87
+ export function export_svg_file(wrapper, basename, view_settings) {
88
+ const gl_canvas = get_gl_canvas(wrapper);
89
+ if (!gl_canvas || !wrapper)
90
+ return;
91
+ const canvas_rect = gl_canvas.getBoundingClientRect();
92
+ if (canvas_rect.width === 0 || canvas_rect.height === 0)
93
+ return;
94
+ const png_data_url = gl_canvas.toDataURL(`image/png`);
95
+ const text_nodes = get_overlay_text_items(wrapper, canvas_rect).map((text_item) => `<text x="${text_item.x.toFixed(2)}" y="${text_item.y.toFixed(2)}" text-anchor="middle" dominant-baseline="central" fill="${xml_escape(text_item.color)}" font-size="${xml_escape(text_item.font_size)}" font-family="${xml_escape(text_item.font_family)}" font-weight="${xml_escape(text_item.font_weight)}">${xml_escape(text_item.text)}</text>`);
96
+ const metadata = xml_escape(JSON.stringify(view_settings));
97
+ const svg = [
98
+ `<?xml version="1.0" encoding="UTF-8"?>`,
99
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${canvas_rect.width}" height="${canvas_rect.height}" viewBox="0 0 ${canvas_rect.width} ${canvas_rect.height}">`,
100
+ `<metadata>${metadata}</metadata>`,
101
+ `<image href="${png_data_url}" x="0" y="0" width="${canvas_rect.width}" height="${canvas_rect.height}" />`,
102
+ ...text_nodes,
103
+ `</svg>`,
104
+ ].join(``);
105
+ download(svg, `${basename}.svg`, `image/svg+xml`);
106
+ }
107
+ // Rebuild the scene from its geometries and export as binary GLTF
108
+ export function export_glb_file(parts, basename) {
109
+ const { hull_geometry, hull_opacity = 0.25, edge_geometry, formula_meshes = [], formula_edges = [], } = parts;
110
+ const gltf_exporter = new GLTFExporter();
111
+ const export_root = new THREE.Group();
112
+ const add_mesh = (geometry, material) => {
113
+ const opts = { transparent: true, side: THREE.DoubleSide, ...material };
114
+ export_root.add(new THREE.Mesh(geometry.clone(), new THREE.MeshBasicMaterial(opts)));
115
+ };
116
+ const add_lines = (geometry, color) => {
117
+ export_root.add(new THREE.LineSegments(geometry.clone(), new THREE.LineBasicMaterial({ color })));
118
+ };
119
+ if (hull_geometry)
120
+ add_mesh(hull_geometry, { vertexColors: true, opacity: hull_opacity });
121
+ add_lines(edge_geometry, 0x333333);
122
+ for (const { geometry, color } of formula_meshes) {
123
+ add_mesh(geometry, { color: new THREE.Color(color), opacity: 0.13 });
124
+ }
125
+ for (const { geometry, color } of formula_edges) {
126
+ add_lines(geometry, new THREE.Color(color));
127
+ }
128
+ gltf_exporter.parse(export_root, (result) => {
129
+ if (!(result instanceof ArrayBuffer))
130
+ return;
131
+ download(result, `${basename}.glb`, `model/gltf-binary`);
132
+ }, (err) => console.error(`Failed to export GLB:`, err), { binary: true, onlyVisible: false });
133
+ }
@@ -3,4 +3,5 @@ export { default as ChemPotDiagram2D } from './ChemPotDiagram2D.svelte';
3
3
  export { default as ChemPotDiagram3D } from './ChemPotDiagram3D.svelte';
4
4
  export { compute_chempot_async } from './async-compute.svelte';
5
5
  export { compute_chempot_diagram, get_ternary_combinations } from './compute';
6
+ export * from './export';
6
7
  export * from './types';
@@ -3,4 +3,5 @@ export { default as ChemPotDiagram2D } from './ChemPotDiagram2D.svelte';
3
3
  export { default as ChemPotDiagram3D } from './ChemPotDiagram3D.svelte';
4
4
  export { compute_chempot_async } from './async-compute.svelte';
5
5
  export { compute_chempot_diagram, get_ternary_combinations } from './compute';
6
+ export * from './export';
6
7
  export * from './types';
@@ -1,13 +1,3 @@
1
- export declare function get_pointer_coords(raw_event: unknown): {
2
- clientX: number;
3
- clientY: number;
4
- } | null;
5
- /** Convert pointer event to container-relative coords for tooltip placement. */
6
- export declare function get_hover_pointer(raw_event: unknown, container_rect: DOMRect | null | undefined): {
7
- x: number;
8
- y: number;
9
- } | null;
10
- /** Add hover pointer to an info object for tooltip placement. */
11
1
  export declare function with_hover_pointer<T extends {
12
2
  pointer?: {
13
3
  x: number;
@@ -2,7 +2,7 @@
2
2
  // Handles DOM events and Threlte/Three.js event wrappers (nativeEvent, srcEvent).
3
3
  const is_pointer_like_event = (event_val) => (typeof PointerEvent !== `undefined` && event_val instanceof PointerEvent) ||
4
4
  (typeof MouseEvent !== `undefined` && event_val instanceof MouseEvent);
5
- export function get_pointer_coords(raw_event) {
5
+ function get_pointer_coords(raw_event) {
6
6
  if (is_pointer_like_event(raw_event)) {
7
7
  return raw_event;
8
8
  }
@@ -22,8 +22,8 @@ export function get_pointer_coords(raw_event) {
22
22
  }
23
23
  return null;
24
24
  }
25
- /** Convert pointer event to container-relative coords for tooltip placement. */
26
- export function get_hover_pointer(raw_event, container_rect) {
25
+ // Convert pointer event to container-relative coords for tooltip placement.
26
+ function get_hover_pointer(raw_event, container_rect) {
27
27
  const pointer_event = get_pointer_coords(raw_event);
28
28
  if (!pointer_event)
29
29
  return null;
@@ -33,7 +33,7 @@ export function get_hover_pointer(raw_event, container_rect) {
33
33
  const y = pointer_event.clientY - offset_y + 4;
34
34
  return { x, y };
35
35
  }
36
- /** Add hover pointer to an info object for tooltip placement. */
36
+ // Add hover pointer to an info object for tooltip placement.
37
37
  export function with_hover_pointer(info, raw_event, container_rect) {
38
38
  const pointer = get_hover_pointer(raw_event, container_rect);
39
39
  return { ...info, pointer: pointer ?? undefined };
@@ -1,7 +1,7 @@
1
1
  import type { D3InterpolateName } from '../colors';
2
2
  import type { PhaseData } from '../convex-hull/types';
3
- import type { Point2D } from '../math';
4
- export type ChemPotLimits = Partial<Record<string, [number, number]>>;
3
+ import type { Point2D, Vec2 } from '../math';
4
+ export type ChemPotLimits = Partial<Record<string, Vec2>>;
5
5
  export type ChemPotColorMode = `none` | `energy` | `formation_energy` | `arity` | `entries`;
6
6
  export type ChemPotProjectionMode = `single` | `grid`;
7
7
  export interface ChemPotDiagramConfig {
@@ -31,7 +31,7 @@ export interface ChemPotDiagramData {
31
31
  min_entries: PhaseData[];
32
32
  hyperplanes: number[][];
33
33
  hyperplane_entries: PhaseData[];
34
- lims: [number, number][];
34
+ lims: Vec2[];
35
35
  }
36
36
  export interface ChemPotHoverInfoBase {
37
37
  formula: string;
@@ -1,4 +1,4 @@
1
- import { rgb } from 'd3-color';
1
+ import { color as d3_color, rgb } from 'd3-color';
2
2
  import * as d3_sc from 'd3-scale-chromatic';
3
3
  import alloy_colors from './alloy-colors.json' with { type: 'json' };
4
4
  import dark_mode_colors from './dark-mode-colors.json' with { type: 'json' };
@@ -55,13 +55,14 @@ export const ELEMENT_COLOR_SCHEMES = {
55
55
  'Dark Mode': dark_mode_hex,
56
56
  };
57
57
  export const default_element_colors = { ...vesta_hex };
58
- // Helper function to detect if a value is a color string
58
+ // Detect if a value is a CSS color string. d3-color parses hex, rgb()/rgba(),
59
+ // hsl()/hsla(), and named colors case-insensitively, rejecting arbitrary words like
60
+ // `pending`. It doesn't parse var()/color()/currentcolor, so match those explicitly.
59
61
  export const is_color = (val) => {
60
62
  if (typeof val !== `string`)
61
63
  return false;
62
- // Check for hex colors, rgb/rgba, hsl/hsla, color(), var(), and named colors
63
- // Exclude incomplete function prefixes like 'rgb', 'hsl', 'var', 'color'
64
- return /^(#[0-9a-f]{3,8}|rgba?\([^)]+\)|hsla?\([^)]+\)|color\([^)]+\)|var\([^)]+\)|(?!rgb$|hsl$|var$|color$)[a-z]+)$/i.test(val.trim());
64
+ const trimmed = val.trim();
65
+ return /^(?:var|color)\([^)]+\)$|^currentcolor$/i.test(trimmed) || d3_color(trimmed) !== null;
65
66
  };
66
67
  export const PLOT_COLORS = [
67
68
  // Color series for e.g. line plots
@@ -78,8 +79,8 @@ export const PLOT_COLORS = [
78
79
  ];
79
80
  // calculate human-perceived brightness from RGB color
80
81
  export function luminance(clr) {
81
- const { r, g, b } = rgb(clr);
82
- return (0.299 * r + 0.587 * g + 0.114 * b) / 255; // https://stackoverflow.com/a/596243
82
+ const { r: red, g: green, b: blue } = rgb(clr);
83
+ return (0.299 * red + 0.587 * green + 0.114 * blue) / 255; // https://stackoverflow.com/a/596243
83
84
  }
84
85
  // get background color of passed DOM node, or recurse up the DOM tree if current node is transparent
85
86
  export function get_bg_color(elem, bg_color = null) {
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import Icon from '../Icon.svelte'
3
3
  import { get_alphabetical_formula } from './format'
4
- import { ELEM_SYMBOLS } from '../labels'
4
+ import { is_elem_symbol, type ElementSymbol } from '../element'
5
5
  import { tooltip } from 'svelte-multiselect/attachments'
6
6
  import type { HTMLAttributes } from 'svelte/elements'
7
7
  import type { FormulaSearchMode } from './index'
@@ -338,10 +338,10 @@
338
338
  normalized = normalized.replaceAll(superscript, ascii)
339
339
  }
340
340
  return normalized
341
- .replaceAll(`·`, ``)
342
- .replaceAll(`⋅`, ``)
341
+ // keep hydrate dots (deleting would glue digits: CuSO4·5H2O -> CuSO45H2O)
342
+ .replaceAll(`⋅`, `·`)
343
343
  .replaceAll(`−`, `-`)
344
- .replace(/\s+/g, ``)
344
+ .replaceAll(/\s+/g, ``)
345
345
  }
346
346
 
347
347
  function normalize_exact_formula(input: string): string {
@@ -356,12 +356,14 @@
356
356
  try {
357
357
  const tokens = parse_formula_with_wildcards(sanitized_input)
358
358
  const explicit = tokens
359
- .filter((token) => token.element !== null)
360
- .map((token) => ({ element: token.element as string, count: token.count }))
359
+ .filter((token): token is { element: ElementSymbol; count: number } =>
360
+ token.element !== null
361
+ )
362
+ .map((token) => ({ element: token.element, count: token.count }))
361
363
  const wildcard_tokens = tokens.filter((token) => token.element === null)
362
364
 
363
365
  // Merge explicit element counts before sorting.
364
- const merged_explicit: Array<{ element: string; count: number }> = []
366
+ const merged_explicit: { element: string; count: number }[] = []
365
367
  for (const token of explicit) {
366
368
  const existing = merged_explicit.find((item) =>
367
369
  item.element === token.element
@@ -425,8 +427,7 @@
425
427
  const [element_part, constraint] = without_operator.split(`:`)
426
428
  const element = element_part.trim()
427
429
  const is_wildcard = element === `*`
428
- const is_valid_element = is_wildcard ||
429
- ELEM_SYMBOLS.includes(element as (typeof ELEM_SYMBOLS)[number])
430
+ const is_valid_element = is_wildcard || is_elem_symbol(element)
430
431
  const normalized_constraint = constraint?.trim() || null
431
432
  const is_valid = is_valid_element && (normalized_constraint === null ||
432
433
  is_valid_constraint(normalized_constraint))
@@ -609,14 +610,20 @@
609
610
  const reformatted = format_for_mode(elements, next_mode)
610
611
 
611
612
  search_mode = next_mode
612
- last_synced = value = input_value = reformatted // update last_synced to prevent effect re-inference
613
+ // set last_synced too to prevent effect re-inference
614
+ last_synced = reformatted
615
+ value = reformatted
616
+ input_value = reformatted
613
617
  run_validation(reformatted, next_mode)
614
618
  onchange?.(reformatted, next_mode)
615
619
  }
616
620
 
617
621
  function set_value(new_value: string, forced_mode?: FormulaSearchMode): void {
618
622
  const mode = forced_mode ?? (mode_locked ? search_mode : infer_mode(new_value))
619
- last_synced = value = input_value = new_value // update last_synced to prevent effect re-inference
623
+ // set last_synced too to prevent effect re-inference
624
+ last_synced = new_value
625
+ value = new_value
626
+ input_value = new_value
620
627
  search_mode = mode
621
628
  if (new_value.trim()) add_to_history(new_value)
622
629
  close_history()