matterviz 0.4.0 → 0.4.2

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 (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -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 +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  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.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -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,38 @@
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),
80
+ // === Control overrides (override ?? config ?? default, cleared by Reset) ===
81
+ const overrides = create_chempot_overrides(
82
+ () => config,
83
+ [
84
+ `formal_chempots`,
85
+ `label_stable`,
86
+ `element_padding`,
87
+ `default_min_limit`,
88
+ `color_mode`,
89
+ `color_scale`,
90
+ `reverse_color_scale`,
91
+ ],
98
92
  )
93
+ const formal_chempots = $derived(overrides.resolve(`formal_chempots`))
94
+ const label_stable = $derived(overrides.resolve(`label_stable`))
95
+ const element_padding = $derived(overrides.resolve(`element_padding`))
96
+ const default_min_limit = $derived(overrides.resolve(`default_min_limit`))
97
+ const color_mode = $derived(overrides.resolve(`color_mode`))
98
+ const color_scale = $derived(overrides.resolve(`color_scale`))
99
+ const reverse_color_scale = $derived(overrides.resolve(`reverse_color_scale`))
99
100
  const arity_colors = [`#3498db`, `#2ecc71`, `#e67e22`, `#9b59b6`] as const
100
101
  const show_tooltip = $derived(config.show_tooltip ?? CHEMPOT_DEFAULTS.show_tooltip)
101
102
  const effective_config = $derived({
@@ -122,19 +123,7 @@
122
123
  if (next_temperature !== temperature) temperature = next_temperature
123
124
  })
124
125
 
125
- const show_temperature_slider = $derived(
126
- has_temp_data && available_temperatures.length > 0,
127
- )
128
-
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
- }
126
+ const show_temperature_slider = $derived(has_temp_data && available_temperatures.length > 0)
138
127
 
139
128
  // === Diagram computation (off main thread via Web Worker) ===
140
129
  let diagram_data = $state<ChemPotDiagramData | null>(null)
@@ -159,12 +148,12 @@
159
148
  diagram_data = null
160
149
  diagram_computing = false
161
150
  })
162
- return () => { cancelled = true }
151
+ return () => {
152
+ cancelled = true
153
+ }
163
154
  })
164
155
 
165
- const plot_elements = $derived(
166
- (diagram_data?.elements ?? config.elements ?? []).slice(0, 2),
167
- )
156
+ const plot_elements = $derived((diagram_data?.elements ?? config.elements ?? []).slice(0, 2))
168
157
 
169
158
  const draw_domains = $derived.by(() => {
170
159
  if (!diagram_data || plot_elements.length < 2) return {}
@@ -202,9 +191,7 @@
202
191
  }
203
192
  type NumericColorMode = Exclude<ChemPotColorMode, `none` | `arity`>
204
193
 
205
- const raw_el_refs = $derived(
206
- get_min_entries_and_el_refs(temp_filtered_entries).el_refs,
207
- )
194
+ const raw_el_refs = $derived(get_min_entries_and_el_refs(temp_filtered_entries).el_refs)
208
195
  const entry_energy_stats_by_formula = $derived.by(
209
196
  (): SvelteMap<string, FormulaEnergyStats> => {
210
197
  const stats = new SvelteMap<string, FormulaEnergyStats>()
@@ -240,11 +227,7 @@
240
227
  return entry_energy_stats_by_formula.get(formula)?.min_energy_per_atom ?? null
241
228
  }
242
229
  if (active_color_mode === `formation_energy`) {
243
- return best_form_energy_for_formula(
244
- temp_filtered_entries,
245
- formula,
246
- raw_el_refs,
247
- ) ?? null
230
+ return best_form_energy_for_formula(temp_filtered_entries, formula, raw_el_refs) ?? null
248
231
  }
249
232
  return entry_energy_stats_by_formula.get(formula)?.matching_entry_count ?? 0
250
233
  }
@@ -286,24 +269,22 @@
286
269
  }
287
270
  return colors
288
271
  })
289
- const color_range = $derived.by(
290
- (): { min: number; max: number; label: string } | null => {
291
- const values = domain_color_values?.values ?? []
292
- if (values.length === 0) return null
293
- let min_val = values[0], max_val = values[0]
294
- for (let idx = 1; idx < values.length; idx++) {
295
- if (values[idx] < min_val) min_val = values[idx]
296
- if (values[idx] > max_val) max_val = values[idx]
297
- }
298
- return {
299
- min: min_val,
300
- max: Math.max(max_val, min_val + 1e-6),
301
- label: color_mode === `none` || color_mode === `arity`
302
- ? ``
303
- : color_mode_labels[color_mode],
304
- }
305
- },
306
- )
272
+ const color_range = $derived.by((): { min: number; max: number; label: string } | null => {
273
+ const values = domain_color_values?.values ?? []
274
+ if (values.length === 0) return null
275
+ let min_val = values[0],
276
+ max_val = values[0]
277
+ for (let idx = 1; idx < values.length; idx++) {
278
+ if (values[idx] < min_val) min_val = values[idx]
279
+ if (values[idx] > max_val) max_val = values[idx]
280
+ }
281
+ return {
282
+ min: min_val,
283
+ max: Math.max(max_val, min_val + 1e-6),
284
+ label:
285
+ color_mode === `none` || color_mode === `arity` ? `` : color_mode_labels[color_mode],
286
+ }
287
+ })
307
288
 
308
289
  // === Convert domains to ScatterPlot DataSeries ===
309
290
  const series = $derived<DataSeries[]>(
@@ -340,8 +321,8 @@
340
321
  const result: { formula: string; data_x: number; data_y: number }[] = []
341
322
  for (const [formula, pts] of Object.entries(draw_domains)) {
342
323
  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
324
+ const center_x = pts.reduce((sum, point) => sum + point[0], 0) / pts.length
325
+ const center_y = pts.reduce((sum, point) => sum + point[1], 0) / pts.length
345
326
  let offset_x = 0
346
327
  let offset_y = 0
347
328
  if (pts.length >= 2) {
@@ -361,12 +342,8 @@
361
342
  // === Hover info for external consumers ===
362
343
  let locked_hover_formula = $state<string | null>(null)
363
344
 
364
- function set_hover_info(
365
- formula: string,
366
- pts: number[][],
367
- event: MouseEvent,
368
- ): void {
369
- const bounds = scatter_wrapper?.getBoundingClientRect()
345
+ function set_hover_info(formula: string, pts: number[][], event: MouseEvent): void {
346
+ const bounds = wrapper?.getBoundingClientRect()
370
347
  hover_info = with_hover_pointer<ChemPotHoverInfo>(
371
348
  {
372
349
  formula,
@@ -398,9 +375,7 @@
398
375
  set_hover_info(formula, pts, data.event)
399
376
  }
400
377
 
401
- function handle_click(
402
- data: { point: { series_idx: number }; event: MouseEvent },
403
- ): void {
378
+ function handle_click(data: { point: { series_idx: number }; event: MouseEvent }): void {
404
379
  const entry = domain_entries[data.point.series_idx]
405
380
  if (!entry) return
406
381
  const [formula, pts] = entry
@@ -417,60 +392,58 @@
417
392
  const pointer = hover_info?.pointer
418
393
  if (!pointer) return { x: 4, y: 4 }
419
394
  return constrain_tooltip_position(
420
- pointer.x, pointer.y,
395
+ pointer.x,
396
+ pointer.y,
421
397
  tooltip_el?.offsetWidth ?? 150,
422
398
  tooltip_el?.offsetHeight ?? 40,
423
- render_width, render_height,
399
+ render_width,
400
+ render_height,
424
401
  { offset: 0 },
425
402
  )
426
403
  })
427
404
 
428
405
  // === 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
406
  const get_svg_element = (): SVGSVGElement | null =>
435
- scatter_wrapper?.querySelector<SVGSVGElement>(`svg`) ?? null
436
-
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
- }
407
+ wrapper?.querySelector<SVGSVGElement>(`svg`) ?? null
470
408
 
471
- onDestroy(() => {
472
- if (copy_timeout_id !== null) clearTimeout(copy_timeout_id)
409
+ const export_basename = $derived(`chempot-${plot_elements.join(`-`)}`)
410
+ const json_payload = $derived({
411
+ elements: diagram_data?.elements ?? [],
412
+ domains: draw_domains,
413
+ lims: diagram_data?.lims ?? [],
473
414
  })
415
+
416
+ const export_sections = $derived<ExportSection[]>([
417
+ {
418
+ title: `Export Image`,
419
+ items: [
420
+ {
421
+ label: `SVG`,
422
+ on_download: () => {
423
+ const svg = get_svg_element()
424
+ if (svg) export_svg_as_svg(svg, `${export_basename}.svg`)
425
+ },
426
+ },
427
+ {
428
+ label: `PNG`,
429
+ on_download: () => {
430
+ const svg = get_svg_element()
431
+ if (svg) export_svg_as_png(svg, `${export_basename}.png`)
432
+ },
433
+ },
434
+ ],
435
+ },
436
+ {
437
+ title: `Export Data`,
438
+ items: [
439
+ {
440
+ label: `JSON`,
441
+ on_download: () => export_json_file(json_payload, export_basename),
442
+ copy_text: () => get_json_string(json_payload),
443
+ },
444
+ ],
445
+ },
446
+ ])
474
447
  </script>
475
448
 
476
449
  {#snippet domain_labels(props: UserContentProps)}
@@ -487,68 +460,16 @@
487
460
  {/snippet}
488
461
 
489
462
  {#snippet export_toggle()}
490
- <DraggablePane
491
- bind:show={export_pane_open}
492
- open_icon="Cross"
493
- closed_icon="Export"
463
+ <ExportPane
464
+ bind:export_pane_open
465
+ sections={export_sections}
494
466
  pane_props={{ class: `chempot-export-pane` }}
495
467
  toggle_props={{
496
468
  class: `chempot-export-toggle`,
497
469
  title: `Export chemical potential diagram`,
498
- style:
499
- `position: absolute; top: var(--ctrl-btn-top, 5pt); right: 36px; z-index: 10`,
470
+ style: `position: absolute; top: var(--ctrl-btn-top, 5pt); right: 36px; z-index: 10`,
500
471
  }}
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>
472
+ />
552
473
  {/snippet}
553
474
 
554
475
  {#snippet chempot_controls(_props: unknown)}
@@ -558,9 +479,7 @@
558
479
  <input
559
480
  type="checkbox"
560
481
  checked={formal_chempots}
561
- onchange={() => {
562
- formal_chempots_override = !formal_chempots
563
- }}
482
+ onchange={() => overrides.set(`formal_chempots`, !formal_chempots)}
564
483
  />
565
484
  </label>
566
485
  <label>
@@ -568,9 +487,7 @@
568
487
  <input
569
488
  type="checkbox"
570
489
  checked={label_stable}
571
- onchange={() => {
572
- label_stable_override = !label_stable
573
- }}
490
+ onchange={() => overrides.set(`label_stable`, !label_stable)}
574
491
  />
575
492
  </label>
576
493
  <label>
@@ -580,9 +497,8 @@
580
497
  min="0"
581
498
  step="0.1"
582
499
  value={element_padding}
583
- oninput={(event) => {
584
- element_padding_override = Number(event.currentTarget.value) || 0
585
- }}
500
+ oninput={(event) =>
501
+ overrides.set(`element_padding`, Number(event.currentTarget.value) || 0)}
586
502
  />
587
503
  </label>
588
504
  <label>
@@ -595,9 +511,10 @@
595
511
  oninput={(event) => {
596
512
  const raw = event.currentTarget.value
597
513
  const parsed = parseFloat(raw)
598
- default_min_limit_override = raw === `` || isNaN(parsed)
599
- ? default_min_limit
600
- : parsed
514
+ overrides.set(
515
+ `default_min_limit`,
516
+ raw === `` || isNaN(parsed) ? default_min_limit : parsed,
517
+ )
601
518
  }}
602
519
  />
603
520
  </label>
@@ -605,15 +522,12 @@
605
522
  <span>Color mode:</span>
606
523
  <select
607
524
  value={color_mode}
608
- onchange={(event) => {
609
- color_mode_override = event.currentTarget.value as typeof color_mode
610
- }}
525
+ onchange={(event) =>
526
+ overrides.set(`color_mode`, event.currentTarget.value as typeof color_mode)}
611
527
  >
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>
528
+ {#each CHEMPOT_COLOR_MODE_OPTIONS as [value, label] (value)}
529
+ <option {value}>{label}</option>
530
+ {/each}
617
531
  </select>
618
532
  </label>
619
533
  {#if color_mode !== `none` && color_mode !== `arity`}
@@ -621,32 +535,24 @@
621
535
  <span>Color scale:</span>
622
536
  <select
623
537
  value={color_scale}
624
- onchange={(event) => {
625
- color_scale_override = event.currentTarget.value as D3InterpolateName
626
- }}
538
+ onchange={(event) =>
539
+ overrides.set(`color_scale`, event.currentTarget.value as D3InterpolateName)}
627
540
  >
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>
541
+ {#each CHEMPOT_COLOR_SCALE_OPTIONS as [value, label] (value)}
542
+ <option {value}>{label}</option>
543
+ {/each}
636
544
  </select>
637
545
  <span class="reverse-scale-toggle">
638
546
  <span>Reverse:</span>
639
547
  <input
640
548
  type="checkbox"
641
549
  checked={reverse_color_scale}
642
- onchange={() => {
643
- reverse_color_scale_override = !reverse_color_scale
644
- }}
550
+ onchange={() => overrides.set(`reverse_color_scale`, !reverse_color_scale)}
645
551
  />
646
552
  </span>
647
553
  </label>
648
554
  {/if}
649
- <button type="button" onclick={reset_controls}>Reset defaults</button>
555
+ <button type="button" onclick={overrides.reset}>Reset defaults</button>
650
556
  {/snippet}
651
557
 
652
558
  {#if diagram_computing}
@@ -672,9 +578,9 @@
672
578
  onpointerdown={(event) => {
673
579
  const target = event.target
674
580
  if (!locked_hover_formula) return
675
- const is_background_click = target === scatter_wrapper ||
676
- (target instanceof SVGElement &&
677
- target.closest(`g[data-series-id]`) === null)
581
+ const is_background_click =
582
+ target === wrapper ||
583
+ (target instanceof SVGElement && target.closest(`g[data-series-id]`) === null)
678
584
  if (is_background_click) {
679
585
  clear_hover_lock()
680
586
  }
@@ -682,7 +588,8 @@
682
588
  >
683
589
  {@render export_toggle()}
684
590
  <ScatterPlot
685
- bind:wrapper={scatter_wrapper}
591
+ bind:wrapper
592
+ bind:fullscreen
686
593
  {series}
687
594
  bind:x_axis
688
595
  bind:y_axis
@@ -696,9 +603,9 @@
696
603
  />
697
604
  {#if color_mode !== `none` && color_mode !== `arity` && color_range}
698
605
  {@const color_bar_config = get_chempot_color_bar_config(
699
- color_scale,
700
- reverse_color_scale,
701
- )}
606
+ color_scale,
607
+ reverse_color_scale,
608
+ )}
702
609
  <ColorBar
703
610
  title={color_range.label}
704
611
  range={[color_range.min, color_range.max]}
@@ -751,7 +658,9 @@
751
658
  }
752
659
  .chempot-diagram-2d > :global(.pane-toggle) {
753
660
  opacity: 0;
754
- transition: opacity 0.2s, background-color 0.2s;
661
+ transition:
662
+ opacity 0.2s,
663
+ background-color 0.2s;
755
664
  }
756
665
  .chempot-diagram-2d:hover > :global(.pane-toggle),
757
666
  .chempot-diagram-2d > :global(.pane-toggle:focus-visible),
@@ -765,15 +674,6 @@
765
674
  margin: 4pt 0;
766
675
  font-size: 0.95em;
767
676
  }
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
677
  .chempot-diagram-2d :global(.chempot-temp-slider) {
778
678
  top: var(--chempot-temp-slider-top, calc(1ex + 108px));
779
679
  right: 4px;
@@ -807,10 +707,7 @@
807
707
  }
808
708
  .tooltip {
809
709
  position: absolute;
810
- background: var(
811
- --tooltip-bg,
812
- light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.9))
813
- );
710
+ background: var(--tooltip-bg, light-dark(rgba(255, 255, 255, 0.95), rgba(0, 0, 0, 0.9)));
814
711
  color: var(--tooltip-text, var(--text-color, #fff));
815
712
  padding: 4px 8px;
816
713
  border-radius: 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" | "fullscreen" | "wrapper" | "export_pane_open" | "temperature" | "hover_info">;
15
18
  type ChemPotDiagram2D = ReturnType<typeof ChemPotDiagram2D>;
16
19
  export default ChemPotDiagram2D;