matterviz 0.4.0 → 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 (326) hide show
  1. package/dist/brillouin/BrillouinZone.svelte +68 -145
  2. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -14
  3. package/dist/brillouin/BrillouinZoneExportPane.svelte +43 -96
  4. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  5. package/dist/brillouin/BrillouinZoneInfoPane.svelte +9 -32
  6. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  7. package/dist/brillouin/BrillouinZoneScene.svelte +49 -203
  8. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  9. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  10. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  11. package/dist/brillouin/compute.d.ts +2 -0
  12. package/dist/brillouin/compute.js +80 -77
  13. package/dist/brillouin/geometry.d.ts +8 -0
  14. package/dist/brillouin/geometry.js +57 -0
  15. package/dist/brillouin/index.d.ts +2 -0
  16. package/dist/brillouin/index.js +2 -0
  17. package/dist/brillouin/types.d.ts +2 -2
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +100 -191
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +176 -464
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  23. package/dist/chempot-diagram/color.d.ts +3 -6
  24. package/dist/chempot-diagram/color.js +5 -5
  25. package/dist/chempot-diagram/compute.d.ts +3 -3
  26. package/dist/chempot-diagram/compute.js +3 -1
  27. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  28. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  29. package/dist/chempot-diagram/export.d.ts +47 -0
  30. package/dist/chempot-diagram/export.js +133 -0
  31. package/dist/chempot-diagram/index.d.ts +1 -0
  32. package/dist/chempot-diagram/index.js +1 -0
  33. package/dist/chempot-diagram/pointer.d.ts +0 -10
  34. package/dist/chempot-diagram/pointer.js +4 -4
  35. package/dist/chempot-diagram/types.d.ts +3 -3
  36. package/dist/colors/index.js +2 -2
  37. package/dist/composition/FormulaFilter.svelte +6 -5
  38. package/dist/composition/PieChart.svelte +5 -5
  39. package/dist/composition/chem-sys.js +3 -2
  40. package/dist/composition/format.js +3 -2
  41. package/dist/composition/parse.d.ts +0 -1
  42. package/dist/composition/parse.js +17 -19
  43. package/dist/controls.d.ts +1 -0
  44. package/dist/controls.js +0 -1
  45. package/dist/convex-hull/ConvexHull.svelte +8 -10
  46. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  47. package/dist/convex-hull/ConvexHull2D.svelte +94 -175
  48. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  49. package/dist/convex-hull/ConvexHull3D.svelte +176 -680
  50. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  51. package/dist/convex-hull/ConvexHull4D.svelte +180 -680
  52. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  53. package/dist/convex-hull/ConvexHullChrome.svelte +268 -0
  54. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  55. package/dist/convex-hull/ConvexHullControls.svelte +88 -7
  56. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  57. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  58. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  59. package/dist/convex-hull/ConvexHullStats.svelte +29 -168
  60. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  61. package/dist/convex-hull/ConvexHullTooltip.svelte +11 -2
  62. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  63. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  64. package/dist/convex-hull/barycentric-coords.js +6 -33
  65. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  66. package/dist/convex-hull/canvas-interactions.svelte.js +278 -0
  67. package/dist/convex-hull/helpers.d.ts +39 -7
  68. package/dist/convex-hull/helpers.js +154 -69
  69. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  70. package/dist/convex-hull/hull-state.svelte.js +124 -0
  71. package/dist/convex-hull/index.d.ts +9 -7
  72. package/dist/convex-hull/index.js +7 -2
  73. package/dist/convex-hull/thermodynamics.js +91 -920
  74. package/dist/convex-hull/types.d.ts +12 -4
  75. package/dist/convex-hull/types.js +12 -0
  76. package/dist/coordination/CoordinationBarPlot.svelte +4 -11
  77. package/dist/element/BohrAtom.svelte +2 -1
  78. package/dist/element/ElementTile.svelte.d.ts +1 -1
  79. package/dist/element/index.d.ts +4 -0
  80. package/dist/element/index.js +18 -0
  81. package/dist/feedback/DragOverlay.svelte +3 -1
  82. package/dist/feedback/DragOverlay.svelte.d.ts +1 -0
  83. package/dist/feedback/StatusMessage.svelte +13 -3
  84. package/dist/fermi-surface/FermiSurface.svelte +67 -146
  85. package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -14
  86. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  87. package/dist/fermi-surface/FermiSurfaceScene.svelte +72 -224
  88. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  89. package/dist/fermi-surface/compute.js +11 -10
  90. package/dist/fermi-surface/export.js +4 -15
  91. package/dist/fermi-surface/index.d.ts +0 -1
  92. package/dist/fermi-surface/index.js +0 -1
  93. package/dist/fermi-surface/parse.d.ts +1 -1
  94. package/dist/fermi-surface/parse.js +64 -75
  95. package/dist/fermi-surface/types.d.ts +2 -2
  96. package/dist/heatmap-matrix/HeatmapMatrix.svelte +55 -40
  97. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +4 -3
  98. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +3 -2
  99. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  100. package/dist/heatmap-matrix/index.d.ts +3 -2
  101. package/dist/index.d.ts +1 -0
  102. package/dist/index.js +1 -0
  103. package/dist/io/ExportPane.svelte +166 -0
  104. package/dist/io/ExportPane.svelte.d.ts +17 -0
  105. package/dist/io/decompress.js +1 -2
  106. package/dist/io/export.d.ts +5 -1
  107. package/dist/io/export.js +32 -28
  108. package/dist/io/fetch.d.ts +2 -1
  109. package/dist/io/file-drop.d.ts +7 -0
  110. package/dist/io/file-drop.js +13 -0
  111. package/dist/io/index.d.ts +2 -0
  112. package/dist/io/index.js +10 -0
  113. package/dist/io/types.d.ts +13 -0
  114. package/dist/isosurface/parse.js +46 -44
  115. package/dist/labels.js +1 -1
  116. package/dist/layout/FullscreenButton.svelte +33 -0
  117. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  118. package/dist/layout/FullscreenToggle.svelte +8 -14
  119. package/dist/layout/ViewerChrome.svelte +116 -0
  120. package/dist/layout/ViewerChrome.svelte.d.ts +17 -0
  121. package/dist/layout/fullscreen.d.ts +4 -0
  122. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  123. package/dist/layout/fullscreen.svelte.js +37 -0
  124. package/dist/layout/index.d.ts +3 -0
  125. package/dist/layout/index.js +3 -0
  126. package/dist/math.d.ts +7 -3
  127. package/dist/math.js +18 -21
  128. package/dist/overlays/index.d.ts +4 -0
  129. package/dist/periodic-table/PeriodicTable.svelte +9 -8
  130. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  131. package/dist/phase-diagram/PhaseDiagramControls.svelte +3 -2
  132. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  133. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  134. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  135. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +47 -132
  136. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  137. package/dist/phase-diagram/colors.js +1 -1
  138. package/dist/phase-diagram/parse.d.ts +2 -1
  139. package/dist/plot/bar/BarPlot.svelte +79 -316
  140. package/dist/plot/bar/BarPlot.svelte.d.ts +7 -15
  141. package/dist/plot/bar/BarPlotControls.svelte.d.ts +1 -1
  142. package/dist/plot/bar/SpacegroupBarPlot.svelte +2 -1
  143. package/dist/plot/box/BoxPlot.svelte +76 -246
  144. package/dist/plot/box/BoxPlot.svelte.d.ts +4 -3
  145. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  146. package/dist/plot/box/Violin.svelte.d.ts +1 -1
  147. package/dist/plot/box/box-plot.d.ts +3 -2
  148. package/dist/plot/box/box-plot.js +5 -2
  149. package/dist/plot/box/kde.d.ts +2 -1
  150. package/dist/plot/box/kde.js +4 -4
  151. package/dist/plot/core/auto-place.d.ts +1 -1
  152. package/dist/plot/core/auto-place.js +4 -1
  153. package/dist/plot/core/components/ColorBar.svelte +5 -5
  154. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  155. package/dist/plot/core/components/Line.svelte +3 -2
  156. package/dist/plot/core/components/Line.svelte.d.ts +3 -2
  157. package/dist/plot/core/components/PlotAxis.svelte +2 -1
  158. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  159. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  160. package/dist/plot/core/components/ReferenceLine3D.svelte +2 -2
  161. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  162. package/dist/plot/core/components/ReferencePlane.svelte +2 -2
  163. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  164. package/dist/plot/core/data-cleaning.js +18 -18
  165. package/dist/plot/core/fill-utils.d.ts +4 -3
  166. package/dist/plot/core/fill-utils.js +6 -3
  167. package/dist/plot/core/interactions.d.ts +5 -1
  168. package/dist/plot/core/interactions.js +14 -0
  169. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  170. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  171. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  172. package/dist/plot/core/placed-tween.svelte.js +68 -0
  173. package/dist/plot/core/reference-line.d.ts +10 -10
  174. package/dist/plot/core/reference-line.js +6 -6
  175. package/dist/plot/core/scales.d.ts +17 -25
  176. package/dist/plot/core/scales.js +10 -8
  177. package/dist/plot/core/svg.d.ts +2 -1
  178. package/dist/plot/core/types.d.ts +18 -7
  179. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  180. package/dist/plot/core/utils/label-placement.js +3 -3
  181. package/dist/plot/core/utils.d.ts +2 -1
  182. package/dist/plot/histogram/Histogram.svelte +77 -314
  183. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  184. package/dist/plot/sankey/Sankey.svelte +2 -5
  185. package/dist/plot/sankey/Sankey.svelte.d.ts +1 -1
  186. package/dist/plot/sankey/sankey.js +3 -1
  187. package/dist/plot/scatter/BinnedScatterPlot.svelte +3 -5
  188. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +4 -4
  189. package/dist/plot/scatter/ScatterPlot.svelte +160 -450
  190. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +7 -15
  191. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  192. package/dist/plot/scatter/binned-scatter-types.d.ts +4 -11
  193. package/dist/plot/scatter/index.d.ts +1 -1
  194. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +15 -26
  195. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  196. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +9 -10
  197. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  198. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +122 -121
  199. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  200. package/dist/plot/scatter-3d/Surface3D.svelte +6 -5
  201. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  202. package/dist/plot/sunburst/Sunburst.svelte +16 -20
  203. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  204. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +1 -1
  205. package/dist/plot/sunburst/sunburst.js +4 -1
  206. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  207. package/dist/sanitize.js +13 -2
  208. package/dist/scene/SceneCamera.svelte +62 -0
  209. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  210. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  211. package/dist/scene/bind-renderer.svelte.js +14 -0
  212. package/dist/scene/index.d.ts +4 -0
  213. package/dist/scene/index.js +5 -0
  214. package/dist/scene/props.js +52 -0
  215. package/dist/scene/types.d.ts +26 -0
  216. package/dist/scene/types.js +1 -0
  217. package/dist/settings.d.ts +14 -2
  218. package/dist/settings.js +59 -1
  219. package/dist/spectral/Bands.svelte +8 -7
  220. package/dist/spectral/Bands.svelte.d.ts +3 -2
  221. package/dist/spectral/BandsAndDos.svelte +22 -24
  222. package/dist/spectral/BrillouinBandsDos.svelte +3 -3
  223. package/dist/spectral/Dos.svelte +5 -4
  224. package/dist/spectral/Dos.svelte.d.ts +2 -1
  225. package/dist/spectral/helpers.d.ts +6 -6
  226. package/dist/spectral/helpers.js +43 -37
  227. package/dist/state.svelte.d.ts +0 -7
  228. package/dist/state.svelte.js +0 -6
  229. package/dist/structure/Arrow.svelte +2 -4
  230. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  231. package/dist/structure/CanvasTooltip.svelte +1 -0
  232. package/dist/structure/CellSelect.svelte +11 -3
  233. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  234. package/dist/structure/Lattice.svelte +2 -2
  235. package/dist/structure/Structure.svelte +291 -355
  236. package/dist/structure/Structure.svelte.d.ts +5 -15
  237. package/dist/structure/StructureControls.svelte +217 -2
  238. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  239. package/dist/structure/StructureExportPane.svelte +54 -156
  240. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  241. package/dist/structure/StructureInfoPane.svelte +5 -3
  242. package/dist/structure/StructureInfoPane.svelte.d.ts +5 -5
  243. package/dist/structure/StructureScene.svelte +365 -198
  244. package/dist/structure/StructureScene.svelte.d.ts +22 -20
  245. package/dist/structure/{label-placement.d.ts → atom-label-placement.d.ts} +3 -3
  246. package/dist/structure/{label-placement.js → atom-label-placement.js} +12 -2
  247. package/dist/structure/atom-properties.d.ts +1 -1
  248. package/dist/structure/atom-properties.js +11 -16
  249. package/dist/structure/bond-order-perception.js +2 -4
  250. package/dist/structure/bonding.d.ts +3 -0
  251. package/dist/structure/bonding.js +91 -48
  252. package/dist/structure/export.d.ts +24 -4
  253. package/dist/structure/export.js +64 -122
  254. package/dist/structure/index.d.ts +2 -0
  255. package/dist/structure/index.js +2 -0
  256. package/dist/structure/parse.d.ts +3 -2
  257. package/dist/structure/parse.js +333 -370
  258. package/dist/structure/partial-occupancy.d.ts +0 -1
  259. package/dist/structure/partial-occupancy.js +1 -1
  260. package/dist/structure/pbc.d.ts +1 -1
  261. package/dist/structure/pbc.js +186 -13
  262. package/dist/structure/polyhedra.d.ts +41 -0
  263. package/dist/structure/polyhedra.js +602 -0
  264. package/dist/structure/site.d.ts +4 -0
  265. package/dist/structure/site.js +1 -0
  266. package/dist/structure/supercell.js +3 -2
  267. package/dist/structure/validation.js +5 -6
  268. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  269. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  270. package/dist/symmetry/SymmetryElements.svelte +354 -0
  271. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  272. package/dist/symmetry/SymmetryStats.svelte +111 -6
  273. package/dist/symmetry/WyckoffTable.svelte +68 -7
  274. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  275. package/dist/symmetry/cell-transform.js +7 -14
  276. package/dist/symmetry/index.d.ts +14 -4
  277. package/dist/symmetry/index.js +301 -80
  278. package/dist/symmetry/spacegroups.d.ts +5 -1
  279. package/dist/symmetry/spacegroups.js +15 -1
  280. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  281. package/dist/symmetry/symmetry-elements.js +521 -0
  282. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  283. package/dist/symmetry/wyckoff-db.js +87 -0
  284. package/dist/table/HeatmapTable.svelte +4 -15
  285. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  286. package/dist/trajectory/Trajectory.svelte +58 -61
  287. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  288. package/dist/trajectory/TrajectoryExportPane.svelte +15 -24
  289. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  290. package/dist/trajectory/TrajectoryInfoPane.svelte +3 -2
  291. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  292. package/dist/trajectory/constants.js +6 -2
  293. package/dist/trajectory/extract.js +17 -37
  294. package/dist/trajectory/format-detect.d.ts +0 -1
  295. package/dist/trajectory/format-detect.js +3 -9
  296. package/dist/trajectory/frame-reader.d.ts +0 -1
  297. package/dist/trajectory/frame-reader.js +62 -128
  298. package/dist/trajectory/helpers.d.ts +10 -2
  299. package/dist/trajectory/helpers.js +56 -36
  300. package/dist/trajectory/parse/ase.d.ts +9 -1
  301. package/dist/trajectory/parse/ase.js +47 -32
  302. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  303. package/dist/trajectory/parse/diagnostics.js +14 -0
  304. package/dist/trajectory/parse/index.d.ts +1 -1
  305. package/dist/trajectory/parse/index.js +54 -102
  306. package/dist/trajectory/parse/lammps.d.ts +0 -2
  307. package/dist/trajectory/parse/lammps.js +8 -6
  308. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  309. package/dist/trajectory/parse/pymatgen.js +74 -0
  310. package/dist/trajectory/parse/vasp.js +4 -3
  311. package/dist/trajectory/parse/xyz.d.ts +9 -21
  312. package/dist/trajectory/parse/xyz.js +28 -33
  313. package/dist/trajectory/plotting.d.ts +0 -1
  314. package/dist/trajectory/plotting.js +3 -100
  315. package/dist/utils.d.ts +1 -0
  316. package/dist/utils.js +1 -1
  317. package/dist/xrd/XrdPlot.svelte +14 -29
  318. package/dist/xrd/broadening.d.ts +2 -1
  319. package/dist/xrd/calc-xrd.js +6 -11
  320. package/dist/xrd/index.d.ts +2 -2
  321. package/package.json +29 -16
  322. package/dist/element/data.json +0 -11864
  323. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  324. package/dist/fermi-surface/marching-cubes.js +0 -2
  325. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  326. package/dist/plot/core/hover-lock.svelte.js +0 -45
@@ -5,17 +5,21 @@
5
5
  import TemperatureSlider from '../convex-hull/TemperatureSlider.svelte'
6
6
  import type { PhaseData } from '../convex-hull/types'
7
7
  import Spinner from '../feedback/Spinner.svelte'
8
+ import type { ExportSection } from '../io'
9
+ import ExportPane from '../io/ExportPane.svelte'
8
10
  import { export_svg_as_png, export_svg_as_svg } from '../io/export'
9
- import { download } from '../io/fetch'
10
- import DraggablePane from '../overlays/DraggablePane.svelte'
11
11
  import { ColorBar, ScatterPlot } from '../plot'
12
12
  import { constrain_tooltip_position } from '../plot/core/layout'
13
13
  import type { DataSeries, UserContentProps } from '../plot/core/types'
14
14
  import { sanitize_html } from '../sanitize'
15
- import { onDestroy } from 'svelte'
16
15
  import { SvelteMap } from 'svelte/reactivity'
17
16
  import { compute_chempot_async } from './async-compute.svelte'
18
17
  import { get_chempot_color_bar_config, make_chempot_color_scale } from './color'
18
+ import {
19
+ CHEMPOT_COLOR_MODE_OPTIONS,
20
+ CHEMPOT_COLOR_SCALE_OPTIONS,
21
+ create_chempot_overrides,
22
+ } from './controls-state.svelte'
19
23
  import {
20
24
  apply_element_padding,
21
25
  best_form_energy_for_formula,
@@ -26,6 +30,7 @@
26
30
  orthonormal_2d,
27
31
  pad_domain_points,
28
32
  } from './compute'
33
+ import { export_json_file, get_json_string } from './export'
29
34
  import { with_hover_pointer } from './pointer'
30
35
  import { get_temp_filter_payload, get_valid_temperature } from './temperature'
31
36
  import type {
@@ -47,6 +52,9 @@
47
52
  max_interpolation_gap = CHEMPOT_DEFAULTS.max_interpolation_gap,
48
53
  hover_info = $bindable<ChemPotHoverInfo | null>(null),
49
54
  render_local_tooltip = true,
55
+ wrapper = $bindable(),
56
+ fullscreen = $bindable(false),
57
+ export_pane_open = $bindable(false),
50
58
  }: {
51
59
  entries: PhaseData[]
52
60
  config?: ChemPotDiagramConfig
@@ -57,45 +65,35 @@
57
65
  max_interpolation_gap?: number
58
66
  hover_info?: ChemPotHoverInfo | null
59
67
  render_local_tooltip?: boolean
68
+ // bindable: plot wrapper element (used for export and pointer hit-testing)
69
+ wrapper?: HTMLDivElement
70
+ // bindable: fullscreen state (managed by the internal ScatterPlot)
71
+ fullscreen?: boolean
72
+ // bindable: whether the export pane is currently open
73
+ export_pane_open?: boolean
60
74
  } = $props()
61
75
  let container_width = $state(0)
62
76
  const base_aspect_ratio = $derived(height > 0 && width > 0 ? height / width : 1)
63
77
  const render_width = $derived(container_width > 0 ? container_width : width)
64
78
  const render_height = $derived(Math.round(render_width * base_aspect_ratio))
65
79
 
66
- // === Control overrides ===
67
- let formal_chempots_override = $state<boolean | null>(null)
68
- let label_stable_override = $state<boolean | null>(null)
69
- let element_padding_override = $state<number | null>(null)
70
- let default_min_limit_override = $state<number | null>(null)
71
- const formal_chempots = $derived(
72
- formal_chempots_override ??
73
- (config.formal_chempots ?? CHEMPOT_DEFAULTS.formal_chempots),
74
- )
75
- const label_stable = $derived(
76
- label_stable_override ?? (config.label_stable ?? CHEMPOT_DEFAULTS.label_stable),
77
- )
78
- const element_padding = $derived(
79
- element_padding_override ??
80
- (config.element_padding ?? CHEMPOT_DEFAULTS.element_padding),
81
- )
82
- const default_min_limit = $derived(
83
- default_min_limit_override ??
84
- (config.default_min_limit ?? CHEMPOT_DEFAULTS.default_min_limit),
85
- )
86
- let color_mode_override = $state<ChemPotColorMode | null>(null)
87
- let color_scale_override = $state<D3InterpolateName | null>(null)
88
- let reverse_color_scale_override = $state<boolean | null>(null)
89
- const color_mode = $derived(
90
- color_mode_override ?? (config.color_mode ?? CHEMPOT_DEFAULTS.color_mode),
91
- )
92
- const color_scale = $derived(
93
- color_scale_override ?? (config.color_scale ?? CHEMPOT_DEFAULTS.color_scale),
94
- )
95
- const reverse_color_scale = $derived(
96
- reverse_color_scale_override ??
97
- (config.reverse_color_scale ?? CHEMPOT_DEFAULTS.reverse_color_scale),
98
- )
80
+ // === Control overrides (override ?? config ?? default, cleared by Reset) ===
81
+ const overrides = create_chempot_overrides(() => config, [
82
+ `formal_chempots`,
83
+ `label_stable`,
84
+ `element_padding`,
85
+ `default_min_limit`,
86
+ `color_mode`,
87
+ `color_scale`,
88
+ `reverse_color_scale`,
89
+ ])
90
+ const formal_chempots = $derived(overrides.resolve(`formal_chempots`))
91
+ const label_stable = $derived(overrides.resolve(`label_stable`))
92
+ const element_padding = $derived(overrides.resolve(`element_padding`))
93
+ const default_min_limit = $derived(overrides.resolve(`default_min_limit`))
94
+ const color_mode = $derived(overrides.resolve(`color_mode`))
95
+ const color_scale = $derived(overrides.resolve(`color_scale`))
96
+ const reverse_color_scale = $derived(overrides.resolve(`reverse_color_scale`))
99
97
  const arity_colors = [`#3498db`, `#2ecc71`, `#e67e22`, `#9b59b6`] as const
100
98
  const show_tooltip = $derived(config.show_tooltip ?? CHEMPOT_DEFAULTS.show_tooltip)
101
99
  const effective_config = $derived({
@@ -126,15 +124,6 @@
126
124
  has_temp_data && available_temperatures.length > 0,
127
125
  )
128
126
 
129
- function reset_controls(): void {
130
- formal_chempots_override = null
131
- label_stable_override = null
132
- element_padding_override = null
133
- default_min_limit_override = null
134
- color_mode_override = null
135
- color_scale_override = null
136
- reverse_color_scale_override = null
137
- }
138
127
 
139
128
  // === Diagram computation (off main thread via Web Worker) ===
140
129
  let diagram_data = $state<ChemPotDiagramData | null>(null)
@@ -340,8 +329,8 @@
340
329
  const result: { formula: string; data_x: number; data_y: number }[] = []
341
330
  for (const [formula, pts] of Object.entries(draw_domains)) {
342
331
  if (pts.length === 0) continue
343
- const center_x = pts.reduce((s, p) => s + p[0], 0) / pts.length
344
- const center_y = pts.reduce((s, p) => s + p[1], 0) / pts.length
332
+ const center_x = pts.reduce((sum, point) => sum + point[0], 0) / pts.length
333
+ const center_y = pts.reduce((sum, point) => sum + point[1], 0) / pts.length
345
334
  let offset_x = 0
346
335
  let offset_y = 0
347
336
  if (pts.length >= 2) {
@@ -366,7 +355,7 @@
366
355
  pts: number[][],
367
356
  event: MouseEvent,
368
357
  ): void {
369
- const bounds = scatter_wrapper?.getBoundingClientRect()
358
+ const bounds = wrapper?.getBoundingClientRect()
370
359
  hover_info = with_hover_pointer<ChemPotHoverInfo>(
371
360
  {
372
361
  formula,
@@ -426,51 +415,45 @@
426
415
  })
427
416
 
428
417
  // === Export ===
429
- let scatter_wrapper = $state<HTMLDivElement>()
430
- let export_pane_open = $state(false)
431
- let copy_status = $state(false)
432
- let copy_timeout_id: ReturnType<typeof setTimeout> | null = null
433
-
434
418
  const get_svg_element = (): SVGSVGElement | null =>
435
- scatter_wrapper?.querySelector<SVGSVGElement>(`svg`) ?? null
419
+ wrapper?.querySelector<SVGSVGElement>(`svg`) ?? null
436
420
 
437
- const get_json_string = (): string =>
438
- JSON.stringify(
439
- {
440
- elements: diagram_data?.elements ?? [],
441
- domains: draw_domains,
442
- lims: diagram_data?.lims ?? [],
443
- },
444
- null,
445
- 2,
446
- )
447
-
448
- function export_json_file(): void {
449
- download(
450
- get_json_string(),
451
- `chempot-${plot_elements.join(`-`)}.json`,
452
- `application/json`,
453
- )
454
- }
455
-
456
- async function copy_json(): Promise<void> {
457
- try {
458
- await navigator.clipboard.writeText(get_json_string())
459
- copy_status = true
460
- } catch (err) {
461
- copy_status = false
462
- console.error(`Failed to copy JSON to clipboard:`, err)
463
- }
464
- if (copy_timeout_id !== null) clearTimeout(copy_timeout_id)
465
- copy_timeout_id = setTimeout(() => {
466
- copy_status = false
467
- copy_timeout_id = null
468
- }, 1000)
469
- }
470
-
471
- onDestroy(() => {
472
- if (copy_timeout_id !== null) clearTimeout(copy_timeout_id)
421
+ const export_basename = $derived(`chempot-${plot_elements.join(`-`)}`)
422
+ const json_payload = $derived({
423
+ elements: diagram_data?.elements ?? [],
424
+ domains: draw_domains,
425
+ lims: diagram_data?.lims ?? [],
473
426
  })
427
+
428
+ const export_sections = $derived<ExportSection[]>([
429
+ {
430
+ title: `Export Image`,
431
+ items: [
432
+ {
433
+ label: `SVG`,
434
+ on_download: () => {
435
+ const svg = get_svg_element()
436
+ if (svg) export_svg_as_svg(svg, `${export_basename}.svg`)
437
+ },
438
+ },
439
+ {
440
+ label: `PNG`,
441
+ on_download: () => {
442
+ const svg = get_svg_element()
443
+ if (svg) export_svg_as_png(svg, `${export_basename}.png`)
444
+ },
445
+ },
446
+ ],
447
+ },
448
+ {
449
+ title: `Export Data`,
450
+ items: [{
451
+ label: `JSON`,
452
+ on_download: () => export_json_file(json_payload, export_basename),
453
+ copy_text: () => get_json_string(json_payload),
454
+ }],
455
+ },
456
+ ])
474
457
  </script>
475
458
 
476
459
  {#snippet domain_labels(props: UserContentProps)}
@@ -487,10 +470,9 @@
487
470
  {/snippet}
488
471
 
489
472
  {#snippet export_toggle()}
490
- <DraggablePane
491
- bind:show={export_pane_open}
492
- open_icon="Cross"
493
- closed_icon="Export"
473
+ <ExportPane
474
+ bind:export_pane_open
475
+ sections={export_sections}
494
476
  pane_props={{ class: `chempot-export-pane` }}
495
477
  toggle_props={{
496
478
  class: `chempot-export-toggle`,
@@ -498,57 +480,7 @@
498
480
  style:
499
481
  `position: absolute; top: var(--ctrl-btn-top, 5pt); right: 36px; z-index: 10`,
500
482
  }}
501
- >
502
- <h4 id="export-image">Export Image</h4>
503
- <div class="export-row">
504
- <label>
505
- SVG
506
- <button
507
- type="button"
508
- onclick={() => {
509
- const svg = get_svg_element()
510
- if (svg) {
511
- export_svg_as_svg(svg, `chempot-${plot_elements.join(`-`)}.svg`)
512
- }
513
- }}
514
- aria-label="Download SVG"
515
- >
516
-
517
- </button>
518
- </label>
519
- <label>
520
- PNG
521
- <button
522
- type="button"
523
- onclick={() => {
524
- const svg = get_svg_element()
525
- if (svg) {
526
- export_svg_as_png(svg, `chempot-${plot_elements.join(`-`)}.png`)
527
- }
528
- }}
529
- aria-label="Download PNG"
530
- >
531
-
532
- </button>
533
- </label>
534
- </div>
535
- <h4 id="export-data">Export Data</h4>
536
- <div class="export-row">
537
- <label>
538
- JSON
539
- <button type="button" onclick={export_json_file} aria-label="Download JSON">
540
-
541
- </button>
542
- <button
543
- type="button"
544
- onclick={copy_json}
545
- aria-label="Copy JSON to clipboard"
546
- >
547
- {copy_status ? `✅` : `📋`}
548
- </button>
549
- </label>
550
- </div>
551
- </DraggablePane>
483
+ />
552
484
  {/snippet}
553
485
 
554
486
  {#snippet chempot_controls(_props: unknown)}
@@ -558,9 +490,7 @@
558
490
  <input
559
491
  type="checkbox"
560
492
  checked={formal_chempots}
561
- onchange={() => {
562
- formal_chempots_override = !formal_chempots
563
- }}
493
+ onchange={() => overrides.set(`formal_chempots`, !formal_chempots)}
564
494
  />
565
495
  </label>
566
496
  <label>
@@ -568,9 +498,7 @@
568
498
  <input
569
499
  type="checkbox"
570
500
  checked={label_stable}
571
- onchange={() => {
572
- label_stable_override = !label_stable
573
- }}
501
+ onchange={() => overrides.set(`label_stable`, !label_stable)}
574
502
  />
575
503
  </label>
576
504
  <label>
@@ -580,9 +508,8 @@
580
508
  min="0"
581
509
  step="0.1"
582
510
  value={element_padding}
583
- oninput={(event) => {
584
- element_padding_override = Number(event.currentTarget.value) || 0
585
- }}
511
+ oninput={(event) =>
512
+ overrides.set(`element_padding`, Number(event.currentTarget.value) || 0)}
586
513
  />
587
514
  </label>
588
515
  <label>
@@ -595,9 +522,10 @@
595
522
  oninput={(event) => {
596
523
  const raw = event.currentTarget.value
597
524
  const parsed = parseFloat(raw)
598
- default_min_limit_override = raw === `` || isNaN(parsed)
599
- ? default_min_limit
600
- : parsed
525
+ overrides.set(
526
+ `default_min_limit`,
527
+ raw === `` || isNaN(parsed) ? default_min_limit : parsed,
528
+ )
601
529
  }}
602
530
  />
603
531
  </label>
@@ -605,15 +533,12 @@
605
533
  <span>Color mode:</span>
606
534
  <select
607
535
  value={color_mode}
608
- onchange={(event) => {
609
- color_mode_override = event.currentTarget.value as typeof color_mode
610
- }}
536
+ onchange={(event) =>
537
+ overrides.set(`color_mode`, event.currentTarget.value as typeof color_mode)}
611
538
  >
612
- <option value="none">None</option>
613
- <option value="energy">Energy/atom</option>
614
- <option value="formation_energy">Formation energy</option>
615
- <option value="arity">Element count</option>
616
- <option value="entries">Entry count</option>
539
+ {#each CHEMPOT_COLOR_MODE_OPTIONS as [value, label] (value)}
540
+ <option {value}>{label}</option>
541
+ {/each}
617
542
  </select>
618
543
  </label>
619
544
  {#if color_mode !== `none` && color_mode !== `arity`}
@@ -621,32 +546,24 @@
621
546
  <span>Color scale:</span>
622
547
  <select
623
548
  value={color_scale}
624
- onchange={(event) => {
625
- color_scale_override = event.currentTarget.value as D3InterpolateName
626
- }}
549
+ onchange={(event) =>
550
+ overrides.set(`color_scale`, event.currentTarget.value as D3InterpolateName)}
627
551
  >
628
- <option value="interpolateViridis">Viridis</option>
629
- <option value="interpolatePlasma">Plasma</option>
630
- <option value="interpolateInferno">Inferno</option>
631
- <option value="interpolateMagma">Magma</option>
632
- <option value="interpolateCividis">Cividis</option>
633
- <option value="interpolateTurbo">Turbo</option>
634
- <option value="interpolateRdYlBu">RdYlBu</option>
635
- <option value="interpolateSpectral">Spectral</option>
552
+ {#each CHEMPOT_COLOR_SCALE_OPTIONS as [value, label] (value)}
553
+ <option {value}>{label}</option>
554
+ {/each}
636
555
  </select>
637
556
  <span class="reverse-scale-toggle">
638
557
  <span>Reverse:</span>
639
558
  <input
640
559
  type="checkbox"
641
560
  checked={reverse_color_scale}
642
- onchange={() => {
643
- reverse_color_scale_override = !reverse_color_scale
644
- }}
561
+ onchange={() => overrides.set(`reverse_color_scale`, !reverse_color_scale)}
645
562
  />
646
563
  </span>
647
564
  </label>
648
565
  {/if}
649
- <button type="button" onclick={reset_controls}>Reset defaults</button>
566
+ <button type="button" onclick={overrides.reset}>Reset defaults</button>
650
567
  {/snippet}
651
568
 
652
569
  {#if diagram_computing}
@@ -672,7 +589,7 @@
672
589
  onpointerdown={(event) => {
673
590
  const target = event.target
674
591
  if (!locked_hover_formula) return
675
- const is_background_click = target === scatter_wrapper ||
592
+ const is_background_click = target === wrapper ||
676
593
  (target instanceof SVGElement &&
677
594
  target.closest(`g[data-series-id]`) === null)
678
595
  if (is_background_click) {
@@ -682,7 +599,8 @@
682
599
  >
683
600
  {@render export_toggle()}
684
601
  <ScatterPlot
685
- bind:wrapper={scatter_wrapper}
602
+ bind:wrapper
603
+ bind:fullscreen
686
604
  {series}
687
605
  bind:x_axis
688
606
  bind:y_axis
@@ -765,15 +683,6 @@
765
683
  margin: 4pt 0;
766
684
  font-size: 0.95em;
767
685
  }
768
- .chempot-diagram-2d :global(.export-row) {
769
- display: flex;
770
- flex-wrap: wrap;
771
- gap: 4pt 10pt;
772
- margin: 0 0 4pt;
773
- }
774
- .chempot-diagram-2d :global(.export-row > label) {
775
- margin: 0;
776
- }
777
686
  .chempot-diagram-2d :global(.chempot-temp-slider) {
778
687
  top: var(--chempot-temp-slider-top, calc(1ex + 108px));
779
688
  right: 4px;
@@ -10,7 +10,10 @@ type $$ComponentProps = {
10
10
  max_interpolation_gap?: number;
11
11
  hover_info?: ChemPotHoverInfo | null;
12
12
  render_local_tooltip?: boolean;
13
+ wrapper?: HTMLDivElement;
14
+ fullscreen?: boolean;
15
+ export_pane_open?: boolean;
13
16
  };
14
- declare const ChemPotDiagram2D: import("svelte").Component<$$ComponentProps, {}, "temperature" | "height" | "width" | "hover_info">;
17
+ declare const ChemPotDiagram2D: import("svelte").Component<$$ComponentProps, {}, "height" | "width" | "temperature" | "fullscreen" | "wrapper" | "export_pane_open" | "hover_info">;
15
18
  type ChemPotDiagram2D = ReturnType<typeof ChemPotDiagram2D>;
16
19
  export default ChemPotDiagram2D;