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
@@ -6,15 +6,17 @@
6
6
  import TemperatureSlider from '../convex-hull/TemperatureSlider.svelte'
7
7
  import type { PhaseData } from '../convex-hull/types'
8
8
  import Spinner from '../feedback/Spinner.svelte'
9
- import Icon from '../Icon.svelte'
9
+ import type { ExportSection } from '../io'
10
+ import ExportPane from '../io/ExportPane.svelte'
10
11
  import { format_num } from '../labels'
11
- import { set_fullscreen_bg, SettingsSection, toggle_fullscreen } from '../layout'
12
+ import { FullscreenButton, type FullscreenToggleProp, SettingsSection, toggle_fullscreen } from '../layout'
13
+ import { sync_fullscreen } from '../layout/fullscreen.svelte'
12
14
  import type { Vec2, Vec3 } from '../math'
13
15
  import {
14
16
  convex_hull_2d,
15
17
  cross_3d,
16
18
  merge_coplanar_triangles,
17
- normalize_vec3,
19
+ normalize_vec,
18
20
  } from '../math'
19
21
  import DraggablePane from '../overlays/DraggablePane.svelte'
20
22
  import { ColorBar, ScatterPlot3DControls } from '../plot'
@@ -22,25 +24,39 @@
22
24
  constrain_tooltip_position,
23
25
  pad_rect,
24
26
  rects_overlap,
25
- } from '../plot/layout'
27
+ } from '../plot/core/layout'
26
28
  import type {
27
29
  AxisConfig3D,
28
30
  CameraProjection3D,
29
31
  DataSeries3D,
30
32
  DisplayConfig3D,
31
- } from '../plot/types'
33
+ } from '../plot/core/types'
32
34
  import { Canvas, T } from '@threlte/core'
33
35
  import * as extras from '@threlte/extras'
34
36
  import { scaleLinear } from 'd3-scale'
37
+ import type { Snippet } from 'svelte'
35
38
  import { onDestroy, onMount, untrack } from 'svelte'
36
39
  import { SvelteMap, SvelteSet } from 'svelte/reactivity'
37
40
  import * as THREE from 'three'
38
41
  import type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
39
- import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js'
40
42
  import { ConvexGeometry } from 'three/examples/jsm/geometries/ConvexGeometry.js'
41
43
  import { compute_chempot_async } from './async-compute.svelte'
42
44
  import ChemPotScene3D from './ChemPotScene3D.svelte'
43
45
  import { get_chempot_color_bar_config, make_chempot_color_scale } from './color'
46
+ import {
47
+ CHEMPOT_COLOR_MODE_OPTIONS,
48
+ CHEMPOT_COLOR_SCALE_OPTIONS,
49
+ create_chempot_overrides,
50
+ } from './controls-state.svelte'
51
+ import {
52
+ export_glb_file,
53
+ export_json_file,
54
+ export_png_file,
55
+ export_svg_file,
56
+ export_view_json_file,
57
+ get_json_string,
58
+ get_view_settings,
59
+ } from './export'
44
60
  import {
45
61
  apply_element_padding,
46
62
  bbox_diagonal,
@@ -85,6 +101,11 @@
85
101
  max_interpolation_gap = CHEMPOT_DEFAULTS.max_interpolation_gap,
86
102
  hover_info = $bindable<ChemPotHoverInfo | null>(null),
87
103
  render_local_tooltip = true,
104
+ wrapper = $bindable(),
105
+ fullscreen = $bindable(false),
106
+ fullscreen_toggle = true,
107
+ controls_open = $bindable(false),
108
+ export_pane_open = $bindable(false),
88
109
  }: {
89
110
  entries: PhaseData[]
90
111
  config?: ChemPotDiagramConfig
@@ -95,54 +116,41 @@
95
116
  max_interpolation_gap?: number
96
117
  hover_info?: ChemPotHoverInfo | null
97
118
  render_local_tooltip?: boolean
119
+ // bindable: top-level wrapper element
120
+ wrapper?: HTMLDivElement
121
+ // bindable: fullscreen state
122
+ fullscreen?: boolean
123
+ // show/hide the fullscreen button (or custom snippet to render it)
124
+ fullscreen_toggle?: FullscreenToggleProp
125
+ // bindable: whether the controls pane is currently open
126
+ controls_open?: boolean
127
+ // bindable: whether the export pane is currently open
128
+ export_pane_open?: boolean
98
129
  } = $props()
99
130
 
100
- let formal_chempots_override = $state<boolean | null>(null)
101
- let label_stable_override = $state<boolean | null>(null)
102
- let element_padding_override = $state<number | null>(null)
103
- let default_min_limit_override = $state<number | null>(null)
104
- let draw_formula_meshes_override = $state<boolean | null>(null)
105
- let draw_formula_lines_override = $state<boolean | null>(null)
106
- const formal_chempots = $derived(
107
- formal_chempots_override ??
108
- (config.formal_chempots ?? CHEMPOT_DEFAULTS.formal_chempots),
109
- )
110
- const label_stable = $derived(
111
- label_stable_override ?? (config.label_stable ?? CHEMPOT_DEFAULTS.label_stable),
112
- )
113
- const element_padding = $derived(
114
- element_padding_override ??
115
- (config.element_padding ?? CHEMPOT_DEFAULTS.element_padding),
116
- )
117
- const default_min_limit = $derived(
118
- default_min_limit_override ??
119
- (config.default_min_limit ?? CHEMPOT_DEFAULTS.default_min_limit),
120
- )
121
- let formulas_to_draw_override = $state<string[] | null>(null)
122
- const formulas_to_draw = $derived(
123
- formulas_to_draw_override ?? (config.formulas_to_draw ?? []),
124
- )
125
- const draw_formula_meshes = $derived(
126
- draw_formula_meshes_override ??
127
- (config.draw_formula_meshes ?? CHEMPOT_DEFAULTS.draw_formula_meshes),
128
- )
129
- const draw_formula_lines = $derived(
130
- draw_formula_lines_override ??
131
- (config.draw_formula_lines ?? CHEMPOT_DEFAULTS.draw_formula_lines),
132
- )
133
- let color_mode_override = $state<ChemPotColorMode | null>(null)
134
- let color_scale_override = $state<D3InterpolateName | null>(null)
135
- let reverse_color_scale_override = $state<boolean | null>(null)
136
- const color_mode = $derived(
137
- color_mode_override ?? (config.color_mode ?? `arity`),
138
- )
139
- const color_scale = $derived(
140
- color_scale_override ?? (config.color_scale ?? CHEMPOT_DEFAULTS.color_scale),
141
- )
142
- const reverse_color_scale = $derived(
143
- reverse_color_scale_override ??
144
- (config.reverse_color_scale ?? CHEMPOT_DEFAULTS.reverse_color_scale),
145
- )
131
+ // Control overrides (override ?? config ?? default, cleared by Reset)
132
+ const overrides = create_chempot_overrides(() => config, [
133
+ `formal_chempots`,
134
+ `label_stable`,
135
+ `element_padding`,
136
+ `default_min_limit`,
137
+ `formulas_to_draw`,
138
+ `draw_formula_meshes`,
139
+ `draw_formula_lines`,
140
+ `color_mode`,
141
+ `color_scale`,
142
+ `reverse_color_scale`,
143
+ ], { color_mode: `arity`, formulas_to_draw: [] })
144
+ const formal_chempots = $derived(overrides.resolve(`formal_chempots`))
145
+ const label_stable = $derived(overrides.resolve(`label_stable`))
146
+ const element_padding = $derived(overrides.resolve(`element_padding`))
147
+ const default_min_limit = $derived(overrides.resolve(`default_min_limit`))
148
+ const formulas_to_draw = $derived(overrides.resolve(`formulas_to_draw`))
149
+ const draw_formula_meshes = $derived(overrides.resolve(`draw_formula_meshes`))
150
+ const draw_formula_lines = $derived(overrides.resolve(`draw_formula_lines`))
151
+ const color_mode = $derived(overrides.resolve(`color_mode`))
152
+ const color_scale = $derived(overrides.resolve(`color_scale`))
153
+ const reverse_color_scale = $derived(overrides.resolve(`reverse_color_scale`))
146
154
  const show_tooltip = $derived(config.show_tooltip ?? CHEMPOT_DEFAULTS.show_tooltip)
147
155
  const tooltip_detail_level = $derived(
148
156
  config.tooltip_detail_level ?? CHEMPOT_DEFAULTS.tooltip_detail_level,
@@ -167,11 +175,7 @@
167
175
  return deduped
168
176
  }
169
177
 
170
- let wrapper = $state<HTMLDivElement>()
171
- let fullscreen = $state(false)
172
- let export_pane_open = $state(false)
173
178
  let formula_picker_open = $state(false)
174
- let controls_open = $state(false)
175
179
 
176
180
  // Mutual exclusion: only one pane open at a time.
177
181
  // Separate effects so each reacts to its own pane opening independently —
@@ -180,8 +184,6 @@
180
184
  $effect(() => { if (export_pane_open) { formula_picker_open = false; controls_open = false } })
181
185
  $effect(() => { if (formula_picker_open) { export_pane_open = false; controls_open = false } })
182
186
  $effect(() => { if (controls_open) { export_pane_open = false; formula_picker_open = false } })
183
- let copy_status = $state(false)
184
- let copy_timeout_id: ReturnType<typeof setTimeout> | null = null
185
187
  let container_width = $state(0)
186
188
  let container_height = $state(0)
187
189
  const base_aspect_ratio = $derived(height > 0 && width > 0 ? height / width : 1)
@@ -797,7 +799,7 @@
797
799
  for (const [pa, pb] of get_domain_edges(swizzled)) {
798
800
  const ka = pa.map((coord) => coord.toFixed(4)).join(`,`)
799
801
  const kb = pb.map((coord) => coord.toFixed(4)).join(`,`)
800
- const key = ka < kb ? `${ka}|${kb}` : `${kb}|${ka}`
802
+ const key = edge_key(ka, kb)
801
803
  if (seen.has(key)) continue
802
804
  seen.add(key)
803
805
  positions.push(pa[0], pa[1], pa[2], pb[0], pb[1], pb[2])
@@ -934,7 +936,7 @@
934
936
  // coplanar neighbors, then assign each group to its most-common domain.
935
937
  if (n_faces > 1) {
936
938
  const tol = 1e-3
937
- const round = (v: number): number => Math.round(v / tol)
939
+ const round = (val: number): number => Math.round(val / tol)
938
940
  const vkey = (vert_idx: number): string =>
939
941
  `${round(pos.getX(vert_idx))},${round(pos.getY(vert_idx))},${
940
942
  round(pos.getZ(vert_idx))
@@ -953,7 +955,7 @@
953
955
  pos.getY(base + 2) - pos.getY(base),
954
956
  pos.getZ(base + 2) - pos.getZ(base),
955
957
  ]
956
- normals.push(normalize_vec3(cross_3d(e1, e2)))
958
+ normals.push(normalize_vec(cross_3d(e1, e2)))
957
959
  }
958
960
  // Build edge → face adjacency
959
961
  const edge_faces = new SvelteMap<string, number[]>()
@@ -974,12 +976,12 @@
974
976
  }
975
977
  // Union-find for coplanar adjacent faces
976
978
  const parent = Array.from({ length: n_faces }, (_, idx) => idx)
977
- const find = (x: number): number => {
978
- while (parent[x] !== x) {
979
- parent[x] = parent[parent[x]]
980
- x = parent[x]
979
+ const find = (node: number): number => {
980
+ while (parent[node] !== node) {
981
+ parent[node] = parent[parent[node]]
982
+ node = parent[node]
981
983
  }
982
- return x
984
+ return node
983
985
  }
984
986
  const union = (a_idx: number, b_idx: number): void => {
985
987
  const ra = find(a_idx), rb = find(b_idx)
@@ -1194,7 +1196,7 @@
1194
1196
 
1195
1197
  function get_touches_limits(
1196
1198
  points_3d: number[][],
1197
- lims: [number, number][],
1199
+ lims: Vec2[],
1198
1200
  ): string[] {
1199
1201
  const limit_tol = 1e-3
1200
1202
  const touches_limits: string[] = []
@@ -1486,10 +1488,10 @@
1486
1488
  // Place axis label just past the outer end of the axis (the end closer to 0).
1487
1489
  // In isometric 3D, the end near 0 projects outward at the front edge of the
1488
1490
  // bounding box, while the negative end projects inward toward the center.
1489
- const outer_end = (range: [number, number]): number =>
1491
+ const outer_end = (range: Vec2): number =>
1490
1492
  Math.abs(range[0]) <= Math.abs(range[1]) ? range[0] : range[1]
1491
1493
  // Direction from range center toward outer end (to extend the label beyond the grid)
1492
- const outer_direction = (range: [number, number]): number => {
1494
+ const outer_direction = (range: Vec2): number => {
1493
1495
  const end = outer_end(range)
1494
1496
  const mid = (range[0] + range[1]) / 2
1495
1497
  return end >= mid ? 1 : -1
@@ -1759,8 +1761,12 @@
1759
1761
  schedule_label_occlusion_update()
1760
1762
  })
1761
1763
 
1762
- $effect(() => {
1763
- set_fullscreen_bg(wrapper, fullscreen, `--chempot-3d-bg-fullscreen`)
1764
+ // Drive the browser Fullscreen API from the bindable `fullscreen` prop (parent-controllable), keep it in sync with Esc/external exits
1765
+ sync_fullscreen({
1766
+ get_wrapper: () => wrapper,
1767
+ get_fullscreen: () => fullscreen,
1768
+ set_fullscreen: (val) => (fullscreen = val),
1769
+ bg_css_var: `--chempot-3d-bg-fullscreen`,
1764
1770
  })
1765
1771
 
1766
1772
  $effect(() => {
@@ -1789,7 +1795,7 @@
1789
1795
  key: string
1790
1796
  pos: Vec3
1791
1797
  rot: Vec3
1792
- size: [number, number]
1798
+ size: Vec2
1793
1799
  color: string
1794
1800
  }[] = []
1795
1801
  if (projections.xy) {
@@ -1860,17 +1866,8 @@
1860
1866
  })
1861
1867
 
1862
1868
  function reset_controls(): void {
1863
- formal_chempots_override = null
1864
- label_stable_override = null
1865
- element_padding_override = null
1866
- default_min_limit_override = null
1867
- draw_formula_meshes_override = null
1868
- draw_formula_lines_override = null
1869
- color_mode_override = null
1870
- color_scale_override = null
1871
- reverse_color_scale_override = null
1869
+ overrides.reset()
1872
1870
  projection_elements_override = null
1873
- formulas_to_draw_override = null
1874
1871
  formula_filter_query = ``
1875
1872
  }
1876
1873
 
@@ -1902,272 +1899,94 @@
1902
1899
  const selected_formulas = new SvelteSet(formulas_to_draw)
1903
1900
  if (selected_formulas.has(formula)) selected_formulas.delete(formula)
1904
1901
  else selected_formulas.add(formula)
1905
- formulas_to_draw_override = [...selected_formulas]
1902
+ overrides.set(`formulas_to_draw`, [...selected_formulas])
1906
1903
  }
1907
1904
 
1908
1905
  function select_surface_formulas(): void {
1909
- formulas_to_draw_override = render_domains
1910
- .filter((domain) => surface_formulas.has(domain.formula))
1911
- .map((domain) => domain.formula)
1906
+ overrides.set(
1907
+ `formulas_to_draw`,
1908
+ render_domains
1909
+ .filter((domain) => surface_formulas.has(domain.formula))
1910
+ .map((domain) => domain.formula),
1911
+ )
1912
1912
  }
1913
1913
 
1914
1914
  function select_neighbor_formulas(): void {
1915
1915
  if (hover_info?.view !== `3d`) return
1916
1916
  const neighbors = domain_neighbors.get(hover_info.formula) ?? []
1917
- formulas_to_draw_override = [hover_info.formula, ...neighbors]
1918
- }
1919
-
1920
- function download_blob(blob: Blob, filename: string): void {
1921
- const url = URL.createObjectURL(blob)
1922
- const link = document.createElement(`a`)
1923
- link.href = url
1924
- link.download = filename
1925
- link.click()
1926
- URL.revokeObjectURL(url)
1917
+ overrides.set(`formulas_to_draw`, [hover_info.formula, ...neighbors])
1927
1918
  }
1928
1919
 
1929
1920
  let png_dpi = $state(150)
1930
1921
  const export_basename = $derived(`chempot-${plot_elements.join(`-`)}`)
1931
1922
 
1932
- function get_view_settings(): Record<string, unknown> {
1933
- const view_camera_position = orbit_controls_ref?.object?.position
1934
- const view_camera_target = orbit_controls_ref?.target
1935
- return {
1923
+ const current_view_settings = (): Record<string, unknown> =>
1924
+ get_view_settings({
1936
1925
  elements: plot_elements,
1937
1926
  camera_projection,
1938
1927
  auto_rotate,
1939
1928
  color_mode,
1940
1929
  color_scale,
1941
1930
  reverse_color_scale,
1942
- camera_position: view_camera_position
1943
- ? [view_camera_position.x, view_camera_position.y, view_camera_position.z]
1944
- : null,
1945
- camera_target: view_camera_target
1946
- ? [view_camera_target.x, view_camera_target.y, view_camera_target.z]
1947
- : null,
1948
- }
1949
- }
1950
-
1951
- interface OverlayTextItem {
1952
- x: number
1953
- y: number
1954
- text: string
1955
- font: string
1956
- font_size: string
1957
- font_family: string
1958
- font_weight: string
1959
- color: string
1960
- }
1961
- function get_overlay_text_items(canvas_rect: DOMRect): OverlayTextItem[] {
1962
- if (!wrapper) return []
1963
- const text_items: OverlayTextItem[] = []
1964
- for (
1965
- const element of wrapper.querySelectorAll(
1966
- `.tick-label, .axis-label, .domain-label`,
1967
- )
1968
- ) {
1969
- const html_element = element as HTMLElement
1970
- const style = getComputedStyle(html_element)
1971
- if (style.display === `none` || style.visibility === `hidden`) continue
1972
- const element_rect = html_element.getBoundingClientRect()
1973
- text_items.push({
1974
- x: element_rect.left + element_rect.width / 2 - canvas_rect.left,
1975
- y: element_rect.top + element_rect.height / 2 - canvas_rect.top,
1976
- text: html_element.textContent ?? ``,
1977
- font: style.font || `${style.fontSize} ${style.fontFamily}`,
1978
- font_size: style.fontSize || `11px`,
1979
- font_family: style.fontFamily || `sans-serif`,
1980
- font_weight: style.fontWeight || `400`,
1981
- color: style.color || `#333`,
1982
- })
1983
- }
1984
- return text_items
1985
- }
1986
-
1987
- function export_png_file(): void {
1988
- if (!wrapper) return
1989
- const gl_canvas = wrapper.querySelector(`canvas`)
1990
- if (!(gl_canvas instanceof HTMLCanvasElement)) return
1991
-
1992
- // Composite WebGL canvas + HTML overlay labels into a single image
1993
- const rect = gl_canvas.getBoundingClientRect()
1994
- const scale = Math.min(png_dpi / 72, 10)
1995
- const out = document.createElement(`canvas`)
1996
- out.width = Math.round(rect.width * scale)
1997
- out.height = Math.round(rect.height * scale)
1998
- const ctx = out.getContext(`2d`)
1999
- if (!ctx) return
2000
- ctx.scale(scale, scale)
2001
-
2002
- // Draw the WebGL canvas as background
2003
- ctx.drawImage(gl_canvas, 0, 0, rect.width, rect.height)
2004
-
2005
- // Draw all HTML overlay text (tick labels, axis labels, domain labels)
2006
- for (const text_item of get_overlay_text_items(rect)) {
2007
- ctx.font = text_item.font
2008
- ctx.fillStyle = text_item.color
2009
- ctx.textAlign = `center`
2010
- ctx.textBaseline = `middle`
2011
- ctx.fillText(text_item.text, text_item.x, text_item.y)
2012
- }
2013
-
2014
- out.toBlob((blob) => {
2015
- if (!blob) return
2016
- download_blob(blob, `${export_basename}.png`)
2017
- }, `image/png`)
2018
- }
2019
-
2020
- function xml_escape(text: string): string {
2021
- return text
2022
- .replaceAll(`&`, `&amp;`)
2023
- .replaceAll(`<`, `&lt;`)
2024
- .replaceAll(`>`, `&gt;`)
2025
- .replaceAll(`"`, `&quot;`)
2026
- .replaceAll(`'`, `&#39;`)
2027
- }
2028
-
2029
- function export_svg_file(): void {
2030
- if (!wrapper) return
2031
- const gl_canvas = wrapper.querySelector(`canvas`)
2032
- if (!(gl_canvas instanceof HTMLCanvasElement)) return
2033
- const canvas_rect = gl_canvas.getBoundingClientRect()
2034
- if (canvas_rect.width === 0 || canvas_rect.height === 0) return
2035
- const png_data_url = gl_canvas.toDataURL(`image/png`)
2036
- const text_nodes = get_overlay_text_items(canvas_rect).map((text_item) =>
2037
- `<text x="${text_item.x.toFixed(2)}" y="${
2038
- text_item.y.toFixed(2)
2039
- }" text-anchor="middle" dominant-baseline="central" fill="${
2040
- xml_escape(text_item.color)
2041
- }" font-size="${xml_escape(text_item.font_size)}" font-family="${
2042
- xml_escape(text_item.font_family)
2043
- }" font-weight="${xml_escape(text_item.font_weight)}">${
2044
- xml_escape(text_item.text)
2045
- }</text>`
2046
- )
2047
- const metadata = xml_escape(JSON.stringify(get_view_settings()))
2048
- const svg = [
2049
- `<?xml version="1.0" encoding="UTF-8"?>`,
2050
- `<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}">`,
2051
- `<metadata>${metadata}</metadata>`,
2052
- `<image href="${png_data_url}" x="0" y="0" width="${canvas_rect.width}" height="${canvas_rect.height}" />`,
2053
- ...text_nodes,
2054
- `</svg>`,
2055
- ].join(``)
2056
- download_blob(
2057
- new Blob([svg], { type: `image/svg+xml` }),
2058
- `${export_basename}.svg`,
2059
- )
2060
- }
2061
-
2062
- function export_view_json_file(): void {
2063
- const json_text = JSON.stringify(get_view_settings(), null, 2)
2064
- download_blob(
2065
- new Blob([json_text], { type: `application/json` }),
2066
- `${export_basename}-view.json`,
2067
- )
2068
- }
2069
-
2070
- function export_glb_file(): void {
2071
- const gltf_exporter = new GLTFExporter()
2072
- const export_root = new THREE.Group()
2073
- if (colored_hull_geometry) {
2074
- export_root.add(
2075
- new THREE.Mesh(
2076
- colored_hull_geometry.clone(),
2077
- new THREE.MeshBasicMaterial({
2078
- vertexColors: true,
2079
- transparent: true,
2080
- opacity: color_mode === `none` ? 0.25 : 0.4,
2081
- side: THREE.DoubleSide,
2082
- }),
2083
- ),
2084
- )
2085
- }
2086
- export_root.add(
2087
- new THREE.LineSegments(
2088
- edge_geometry.clone(),
2089
- new THREE.LineBasicMaterial({ color: 0x333333 }),
2090
- ),
2091
- )
2092
- for (const { geometry, color } of formula_mesh_data) {
2093
- export_root.add(
2094
- new THREE.Mesh(
2095
- geometry.clone(),
2096
- new THREE.MeshBasicMaterial({
2097
- color: new THREE.Color(color),
2098
- transparent: true,
2099
- opacity: 0.13,
2100
- side: THREE.DoubleSide,
2101
- }),
2102
- ),
2103
- )
2104
- }
2105
- if (draw_formula_lines) {
2106
- for (const { geometry, color } of formula_edge_data) {
2107
- export_root.add(
2108
- new THREE.LineSegments(
2109
- geometry.clone(),
2110
- new THREE.LineBasicMaterial({ color: new THREE.Color(color) }),
2111
- ),
2112
- )
2113
- }
2114
- }
2115
- gltf_exporter.parse(
2116
- export_root,
2117
- (result) => {
2118
- if (!(result instanceof ArrayBuffer)) return
2119
- download_blob(
2120
- new Blob([result], { type: `model/gltf-binary` }),
2121
- `${export_basename}.glb`,
2122
- )
2123
- },
2124
- (err) => {
2125
- console.error(`Failed to export GLB:`, err)
2126
- },
2127
- { binary: true, onlyVisible: false },
2128
- )
2129
- }
2130
-
2131
- function get_json_string(): string {
2132
- return JSON.stringify(
2133
- {
2134
- elements: diagram_data?.elements ?? [],
2135
- domains: render_domains.map((domain) => ({
2136
- formula: domain.formula,
2137
- points_3d: domain.points_3d,
2138
- })),
2139
- lims: diagram_data?.lims ?? [],
2140
- view: get_view_settings(),
2141
- },
2142
- null,
2143
- 2,
2144
- )
2145
- }
1931
+ camera_position: orbit_controls_ref?.object?.position ?? null,
1932
+ camera_target: orbit_controls_ref?.target ?? null,
1933
+ })
2146
1934
 
2147
- function export_json_file(): void {
2148
- download_blob(
2149
- new Blob([get_json_string()], { type: `application/json` }),
2150
- `${export_basename}.json`,
2151
- )
2152
- }
1935
+ const export_json_payload = (): Record<string, unknown> => ({
1936
+ elements: diagram_data?.elements ?? [],
1937
+ domains: render_domains.map((domain) => ({
1938
+ formula: domain.formula,
1939
+ points_3d: domain.points_3d,
1940
+ })),
1941
+ lims: diagram_data?.lims ?? [],
1942
+ view: current_view_settings(),
1943
+ })
2153
1944
 
2154
- async function copy_json(): Promise<void> {
2155
- try {
2156
- await navigator.clipboard.writeText(get_json_string())
2157
- copy_status = true
2158
- } catch (err) {
2159
- copy_status = false
2160
- console.error(`Failed to copy JSON to clipboard:`, err)
2161
- }
2162
- if (copy_timeout_id !== null) clearTimeout(copy_timeout_id)
2163
- copy_timeout_id = setTimeout(() => {
2164
- copy_status = false
2165
- copy_timeout_id = null
2166
- }, 1000)
2167
- }
1945
+ const export_sections = $derived<ExportSection[]>([
1946
+ {
1947
+ title: `Export Image`,
1948
+ items: [
1949
+ {
1950
+ label: `SVG`,
1951
+ on_download: () =>
1952
+ export_svg_file(wrapper, export_basename, current_view_settings()),
1953
+ },
1954
+ {
1955
+ label: `PNG`,
1956
+ show_dpi: true,
1957
+ on_download: () => export_png_file(wrapper, export_basename, png_dpi),
1958
+ },
1959
+ ],
1960
+ },
1961
+ {
1962
+ title: `Export Data`,
1963
+ items: [
1964
+ {
1965
+ label: `JSON`,
1966
+ on_download: () => export_json_file(export_json_payload(), export_basename),
1967
+ copy_text: () => get_json_string(export_json_payload()),
1968
+ },
1969
+ {
1970
+ label: `View`,
1971
+ on_download: () =>
1972
+ export_view_json_file(current_view_settings(), export_basename),
1973
+ },
1974
+ {
1975
+ label: `GLB`,
1976
+ on_download: () =>
1977
+ export_glb_file({
1978
+ hull_geometry: colored_hull_geometry,
1979
+ hull_opacity: color_mode === `none` ? 0.25 : 0.4,
1980
+ edge_geometry,
1981
+ formula_meshes: formula_mesh_data,
1982
+ formula_edges: draw_formula_lines ? formula_edge_data : [],
1983
+ }, export_basename),
1984
+ },
1985
+ ],
1986
+ },
1987
+ ])
2168
1988
 
2169
1989
  onDestroy(() => {
2170
- if (copy_timeout_id !== null) clearTimeout(copy_timeout_id)
2171
1990
  if (label_occlusion_frame !== null) cancelAnimationFrame(label_occlusion_frame)
2172
1991
  })
2173
1992
 
@@ -2214,25 +2033,13 @@
2214
2033
  }
2215
2034
 
2216
2035
  // Color mode cycling (keyboard shortcut 'c')
2217
- const color_modes: ChemPotColorMode[] = [
2218
- `none`,
2219
- `energy`,
2220
- `formation_energy`,
2221
- `arity`,
2222
- `entries`,
2223
- ]
2036
+ const color_modes = CHEMPOT_COLOR_MODE_OPTIONS.map(([value]) => value)
2224
2037
  function cycle_color_mode(): void {
2225
2038
  const idx = color_modes.indexOf(color_mode)
2226
- color_mode_override = color_modes[(idx + 1) % color_modes.length]
2039
+ overrides.set(`color_mode`, color_modes[(idx + 1) % color_modes.length])
2227
2040
  }
2228
2041
  </script>
2229
2042
 
2230
- <svelte:document
2231
- onfullscreenchange={() => {
2232
- fullscreen = document.fullscreenElement === wrapper
2233
- }}
2234
- />
2235
-
2236
2043
  <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
2237
2044
  <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
2238
2045
  <div
@@ -2252,7 +2059,7 @@
2252
2059
  ) return
2253
2060
  if (event.key === `Escape`) clear_hover_lock()
2254
2061
  else if (event.key === `c`) cycle_color_mode()
2255
- else if (event.key === `f`) toggle_fullscreen(wrapper)
2062
+ else if (event.key === `f` && fullscreen_toggle) toggle_fullscreen(wrapper)
2256
2063
  }}
2257
2064
  onpointerdown={(event) => {
2258
2065
  const target = event.target
@@ -2265,72 +2072,16 @@
2265
2072
  }}
2266
2073
  >
2267
2074
  <section>
2268
- <DraggablePane
2269
- bind:show={export_pane_open}
2270
- open_icon="Cross"
2271
- closed_icon="Export"
2075
+ <ExportPane
2076
+ bind:export_pane_open
2077
+ bind:png_dpi
2078
+ sections={export_sections}
2272
2079
  pane_props={{ class: `chempot-export-pane` }}
2273
2080
  toggle_props={{
2274
2081
  class: `chempot-export-toggle`,
2275
2082
  title: `Export chemical potential diagram`,
2276
2083
  }}
2277
- >
2278
- <h4 id="export-image">Export Image</h4>
2279
- <div class="export-row">
2280
- <label>
2281
- SVG
2282
- <button type="button" onclick={export_svg_file} title="SVG snapshot export">
2283
-
2284
- </button>
2285
- </label>
2286
- <label>
2287
- PNG
2288
- <button type="button" onclick={export_png_file} title="PNG ({png_dpi} DPI)">
2289
-
2290
- </button>
2291
- &nbsp;(DPI: <input
2292
- type="number"
2293
- min={50}
2294
- max={500}
2295
- bind:value={png_dpi}
2296
- title="Export resolution in dots per inch"
2297
- style="margin: 0 0 0 2pt"
2298
- />)
2299
- </label>
2300
- </div>
2301
- <h4 id="export-data">Export Data</h4>
2302
- <div class="export-row">
2303
- <label>
2304
- JSON
2305
- <button type="button" onclick={export_json_file} aria-label="Download JSON">
2306
-
2307
- </button>
2308
- <button
2309
- type="button"
2310
- onclick={copy_json}
2311
- aria-label="Copy JSON to clipboard"
2312
- >
2313
- {copy_status ? `✅` : `📋`}
2314
- </button>
2315
- </label>
2316
- <label>
2317
- View
2318
- <button
2319
- type="button"
2320
- onclick={export_view_json_file}
2321
- aria-label="Download view JSON"
2322
- >
2323
-
2324
- </button>
2325
- </label>
2326
- <label>
2327
- GLB
2328
- <button type="button" onclick={export_glb_file} aria-label="Download GLB">
2329
-
2330
- </button>
2331
- </label>
2332
- </div>
2333
- </DraggablePane>
2084
+ />
2334
2085
  <DraggablePane
2335
2086
  bind:show={formula_picker_open}
2336
2087
  open_icon="Cross"
@@ -2343,7 +2094,7 @@
2343
2094
  >
2344
2095
  <h4 id="formula-overlays">Formula Overlays</h4>
2345
2096
  <div class="overlay-actions">
2346
- <button type="button" onclick={() => formulas_to_draw_override = []}>
2097
+ <button type="button" onclick={() => overrides.set(`formulas_to_draw`, [])}>
2347
2098
  Clear
2348
2099
  </button>
2349
2100
  <button type="button" onclick={select_surface_formulas}>Surface</button>
@@ -2466,36 +2217,29 @@
2466
2217
  <input
2467
2218
  type="checkbox"
2468
2219
  checked={formal_chempots}
2469
- onchange={() => {
2470
- formal_chempots_override = !formal_chempots
2471
- }}
2220
+ onchange={() => overrides.set(`formal_chempots`, !formal_chempots)}
2472
2221
  /> Formal
2473
2222
  </label>
2474
2223
  <label>
2475
2224
  <input
2476
2225
  type="checkbox"
2477
2226
  checked={label_stable}
2478
- onchange={() => {
2479
- label_stable_override = !label_stable
2480
- }}
2227
+ onchange={() => overrides.set(`label_stable`, !label_stable)}
2481
2228
  /> Labels
2482
2229
  </label>
2483
2230
  <label>
2484
2231
  <input
2485
2232
  type="checkbox"
2486
2233
  checked={draw_formula_meshes}
2487
- onchange={() => {
2488
- draw_formula_meshes_override = !draw_formula_meshes
2489
- }}
2234
+ onchange={() =>
2235
+ overrides.set(`draw_formula_meshes`, !draw_formula_meshes)}
2490
2236
  /> Meshes
2491
2237
  </label>
2492
2238
  <label>
2493
2239
  <input
2494
2240
  type="checkbox"
2495
2241
  checked={draw_formula_lines}
2496
- onchange={() => {
2497
- draw_formula_lines_override = !draw_formula_lines
2498
- }}
2242
+ onchange={() => overrides.set(`draw_formula_lines`, !draw_formula_lines)}
2499
2243
  /> Lines
2500
2244
  </label>
2501
2245
  </div>
@@ -2507,9 +2251,8 @@
2507
2251
  min="0"
2508
2252
  step="0.1"
2509
2253
  value={element_padding}
2510
- oninput={(event) => {
2511
- element_padding_override = Number(event.currentTarget.value)
2512
- }}
2254
+ oninput={(event) =>
2255
+ overrides.set(`element_padding`, Number(event.currentTarget.value))}
2513
2256
  />
2514
2257
  </label>
2515
2258
  <label>
@@ -2519,11 +2262,8 @@
2519
2262
  max="0"
2520
2263
  step="1"
2521
2264
  value={default_min_limit}
2522
- oninput={(event) => {
2523
- default_min_limit_override = Number(
2524
- event.currentTarget.value,
2525
- )
2526
- }}
2265
+ oninput={(event) =>
2266
+ overrides.set(`default_min_limit`, Number(event.currentTarget.value))}
2527
2267
  />
2528
2268
  </label>
2529
2269
  </div>
@@ -2532,16 +2272,12 @@
2532
2272
  <select
2533
2273
  id="chempot-color-mode"
2534
2274
  value={color_mode}
2535
- onchange={(event) => {
2536
- color_mode_override = event.currentTarget
2537
- .value as ChemPotColorMode
2538
- }}
2275
+ onchange={(event) =>
2276
+ overrides.set(`color_mode`, event.currentTarget.value as ChemPotColorMode)}
2539
2277
  >
2540
- <option value="none">None</option>
2541
- <option value="energy">Energy/atom</option>
2542
- <option value="formation_energy">Formation energy</option>
2543
- <option value="arity">Element count</option>
2544
- <option value="entries">Entry count</option>
2278
+ {#each CHEMPOT_COLOR_MODE_OPTIONS as [value, label] (value)}
2279
+ <option {value}>{label}</option>
2280
+ {/each}
2545
2281
  </select>
2546
2282
  </div>
2547
2283
  {#if color_mode !== `none` && color_mode !== `arity`}
@@ -2550,27 +2286,22 @@
2550
2286
  <select
2551
2287
  id="chempot-color-scale"
2552
2288
  value={color_scale}
2553
- onchange={(event) => {
2554
- color_scale_override = event.currentTarget
2555
- .value as D3InterpolateName
2556
- }}
2289
+ onchange={(event) =>
2290
+ overrides.set(
2291
+ `color_scale`,
2292
+ event.currentTarget.value as D3InterpolateName,
2293
+ )}
2557
2294
  >
2558
- <option value="interpolateViridis">Viridis</option>
2559
- <option value="interpolatePlasma">Plasma</option>
2560
- <option value="interpolateInferno">Inferno</option>
2561
- <option value="interpolateMagma">Magma</option>
2562
- <option value="interpolateCividis">Cividis</option>
2563
- <option value="interpolateTurbo">Turbo</option>
2564
- <option value="interpolateRdYlBu">RdYlBu</option>
2565
- <option value="interpolateSpectral">Spectral</option>
2295
+ {#each CHEMPOT_COLOR_SCALE_OPTIONS as [value, label] (value)}
2296
+ <option {value}>{label}</option>
2297
+ {/each}
2566
2298
  </select>
2567
2299
  <label>
2568
2300
  <input
2569
2301
  type="checkbox"
2570
2302
  checked={reverse_color_scale}
2571
- onchange={() => {
2572
- reverse_color_scale_override = !reverse_color_scale
2573
- }}
2303
+ onchange={() =>
2304
+ overrides.set(`reverse_color_scale`, !reverse_color_scale)}
2574
2305
  /> Rev
2575
2306
  </label>
2576
2307
  </div>
@@ -2578,13 +2309,9 @@
2578
2309
  </SettingsSection>
2579
2310
  </ScatterPlot3DControls>
2580
2311
 
2581
- <button
2582
- type="button"
2583
- onclick={() => toggle_fullscreen(wrapper)}
2584
- title="{fullscreen ? `Exit` : `Enter`} fullscreen"
2585
- >
2586
- <Icon icon="{fullscreen ? `Exit` : ``}Fullscreen" />
2587
- </button>
2312
+ {#if fullscreen_toggle}
2313
+ <FullscreenButton {fullscreen} toggle={fullscreen_toggle} {wrapper} />
2314
+ {/if}
2588
2315
  </section>
2589
2316
  {#if show_temperature_slider && temperature !== undefined}
2590
2317
  <TemperatureSlider
@@ -2965,23 +2692,6 @@
2965
2692
  gap: 4pt;
2966
2693
  font-size: 0.9em;
2967
2694
  }
2968
- .chempot-diagram-3d :global(.export-row) {
2969
- display: flex;
2970
- flex-wrap: wrap;
2971
- gap: 4pt 10pt;
2972
- margin: 0 0 4pt;
2973
- }
2974
- .chempot-diagram-3d :global(.export-row > label) {
2975
- margin: 0;
2976
- }
2977
- .chempot-diagram-3d :global(.export-row button) {
2978
- width: 1.4em;
2979
- height: 1.4em;
2980
- padding: 0;
2981
- display: inline-flex;
2982
- align-items: center;
2983
- justify-content: center;
2984
- }
2985
2695
  .chempot-diagram-3d :global(.chempot-checks) {
2986
2696
  display: flex;
2987
2697
  flex-wrap: wrap;