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
@@ -3,6 +3,6 @@ import type { ConvexHullEntry, HighlightStyle } from './types';
3
3
  type $$ComponentProps = BaseConvexHullProps<ConvexHullEntry> & Hull3DProps & {
4
4
  highlight_style?: HighlightStyle;
5
5
  };
6
- declare const ConvexHull4D: import("svelte").Component<$$ComponentProps, {}, "temperature" | "fullscreen" | "show_hull_faces" | "hull_face_opacity" | "hull_face_color_mode" | "color_mode" | "color_scale" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "info_pane_open" | "legend_pane_open" | "wrapper" | "energy_source_mode" | "stable_entries" | "unstable_entries" | "phase_stats" | "highlighted_entries" | "selected_entry" | "gas_pressures">;
6
+ declare const ConvexHull4D: import("svelte").Component<$$ComponentProps, {}, "fullscreen" | "wrapper" | "controls_open" | "color_scale" | "info_pane_open" | "temperature" | "show_hull_faces" | "hull_face_opacity" | "hull_face_color_mode" | "color_mode" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "hidden_categories" | "energy_source_mode" | "stable_entries" | "unstable_entries" | "phase_stats" | "highlighted_entries" | "selected_entry" | "gas_pressures">;
7
7
  type ConvexHull4D = ReturnType<typeof ConvexHull4D>;
8
8
  export default ConvexHull4D;
@@ -0,0 +1,264 @@
1
+ <script lang="ts">
2
+ import type { ShowControlsState } from '../controls'
3
+ // Shared ConvexHull3D/4D chrome: control-buttons toolbar (reset, info pane, fullscreen,
4
+ // legend controls) plus the hover tooltip, copy feedback, drag overlay and structure
5
+ // popup driven by the shared canvas-interactions scaffold
6
+ import { ClickFeedback, DragOverlay } from '../feedback'
7
+ import Icon from '../Icon.svelte'
8
+ import { FullscreenButton, type FullscreenToggleProp } from '../layout'
9
+ import { PlotTooltip } from '../plot'
10
+ import type { ComponentProps, Snippet } from 'svelte'
11
+ import type { create_canvas_interactions } from './canvas-interactions.svelte'
12
+ import ConvexHullControls from './ConvexHullControls.svelte'
13
+ import ConvexHullInfoPane from './ConvexHullInfoPane.svelte'
14
+ import ConvexHullTooltip from './ConvexHullTooltip.svelte'
15
+ import type { create_hull_data_pipeline } from './hull-state.svelte'
16
+ import type { ConvexHullTooltipProp } from './index'
17
+ import { CONVEX_HULL_STYLE } from './index'
18
+ import StructurePopup from './StructurePopup.svelte'
19
+ import type { ConvexHullEntry, HighlightStyle, HullFaceColorMode } from './types'
20
+ import { MAGNETIC_ORDERING_CATEGORY } from './types'
21
+
22
+ type ControlsProps = ComponentProps<typeof ConvexHullControls>
23
+
24
+ let {
25
+ interactions, // canvas-interactions scaffold: hover/drag/popup/copy-feedback state
26
+ hull_data, // hull-state pipeline: energy-mode flags, polymorph stats, thresholds
27
+ controls_config,
28
+ reset_all,
29
+ reset_title,
30
+ enable_info_pane = true,
31
+ phase_stats,
32
+ label_threshold,
33
+ fullscreen = false,
34
+ fullscreen_toggle = true,
35
+ wrapper = undefined,
36
+ camera,
37
+ merged_controls,
38
+ stable_entries,
39
+ unstable_entries,
40
+ get_point_color,
41
+ merged_highlight_style,
42
+ is_highlighted,
43
+ tooltip = undefined,
44
+ selected_entry,
45
+ show_hull_faces = $bindable(),
46
+ hull_face_color = $bindable(),
47
+ hull_face_opacity = $bindable(),
48
+ hull_face_color_mode = $bindable(),
49
+ info_pane_open = $bindable(false),
50
+ controls_open = $bindable(false),
51
+ color_mode = $bindable(`stability`),
52
+ color_scale = $bindable(`interpolateViridis`),
53
+ show_stable = $bindable(true),
54
+ show_unstable = $bindable(true),
55
+ entry_category = MAGNETIC_ORDERING_CATEGORY,
56
+ hidden_categories = $bindable([]),
57
+ show_stable_labels = $bindable(true),
58
+ show_unstable_labels = $bindable(false),
59
+ max_hull_dist_show_phases = $bindable(0),
60
+ max_hull_dist_show_labels = $bindable(0.1),
61
+ energy_source_mode = $bindable(`precomputed`),
62
+ }: Pick<
63
+ ControlsProps,
64
+ | `camera`
65
+ | `merged_controls`
66
+ | `stable_entries`
67
+ | `unstable_entries`
68
+ | `color_mode`
69
+ | `color_scale`
70
+ | `show_stable`
71
+ | `show_unstable`
72
+ | `entry_category`
73
+ | `hidden_categories`
74
+ | `show_stable_labels`
75
+ | `show_unstable_labels`
76
+ | `max_hull_dist_show_phases`
77
+ | `max_hull_dist_show_labels`
78
+ | `energy_source_mode`
79
+ | `controls_open`
80
+ | `show_hull_faces`
81
+ | `hull_face_color`
82
+ | `hull_face_opacity`
83
+ | `hull_face_color_mode`
84
+ > &
85
+ Pick<ComponentProps<typeof ConvexHullInfoPane>, `phase_stats` | `label_threshold`> & {
86
+ interactions: ReturnType<typeof create_canvas_interactions>
87
+ hull_data: ReturnType<typeof create_hull_data_pipeline<ConvexHullEntry>>
88
+ controls_config: ShowControlsState
89
+ reset_all: () => void
90
+ reset_title: string
91
+ enable_info_pane?: boolean
92
+ fullscreen?: boolean
93
+ fullscreen_toggle?: FullscreenToggleProp
94
+ wrapper?: HTMLDivElement
95
+ get_point_color: (entry: ConvexHullEntry) => string
96
+ merged_highlight_style: HighlightStyle
97
+ is_highlighted: (entry: ConvexHullEntry) => boolean
98
+ tooltip?: ConvexHullTooltipProp<ConvexHullEntry>
99
+ selected_entry: ConvexHullEntry | null
100
+ info_pane_open?: boolean
101
+ } = $props()
102
+ </script>
103
+
104
+ <!-- Control buttons (top-right corner) -->
105
+ {#if controls_config.mode !== `never`}
106
+ <section class="control-buttons {controls_config.class}">
107
+ {#if controls_config.visible(`reset`)}
108
+ <button type="button" onclick={reset_all} title={reset_title} class="reset-camera-btn">
109
+ <Icon icon="Reset" />
110
+ </button>
111
+ {/if}
112
+
113
+ {#if enable_info_pane && phase_stats && controls_config.visible(`info-pane`)}
114
+ <ConvexHullInfoPane
115
+ bind:pane_open={info_pane_open}
116
+ {phase_stats}
117
+ {stable_entries}
118
+ {unstable_entries}
119
+ {show_stable}
120
+ {show_unstable}
121
+ {entry_category}
122
+ {hidden_categories}
123
+ {max_hull_dist_show_phases}
124
+ {max_hull_dist_show_labels}
125
+ {label_threshold}
126
+ toggle_props={{ class: `info-btn` }}
127
+ />
128
+ {/if}
129
+
130
+ {#if fullscreen_toggle && controls_config.visible(`fullscreen`)}
131
+ <FullscreenButton {fullscreen} toggle={fullscreen_toggle} {wrapper} />
132
+ {/if}
133
+
134
+ <!-- Legend controls pane -->
135
+ {#if controls_config.visible(`controls`)}
136
+ <ConvexHullControls
137
+ bind:controls_open
138
+ bind:color_mode
139
+ bind:color_scale
140
+ bind:show_stable
141
+ bind:show_unstable
142
+ {entry_category}
143
+ bind:hidden_categories
144
+ bind:show_stable_labels
145
+ bind:show_unstable_labels
146
+ bind:max_hull_dist_show_phases
147
+ bind:max_hull_dist_show_labels
148
+ max_hull_dist_in_data={hull_data.max_hull_dist_in_data}
149
+ {stable_entries}
150
+ {unstable_entries}
151
+ {camera}
152
+ {merged_controls}
153
+ toggle_props={{ class: `legend-controls-btn` }}
154
+ {show_hull_faces}
155
+ on_hull_faces_change={(value: boolean) => (show_hull_faces = value)}
156
+ {hull_face_color}
157
+ on_hull_face_color_change={(value: string) => (hull_face_color = value)}
158
+ {hull_face_opacity}
159
+ on_hull_face_opacity_change={(value: number) => (hull_face_opacity = value)}
160
+ {hull_face_color_mode}
161
+ on_hull_face_color_mode_change={(value: HullFaceColorMode) =>
162
+ (hull_face_color_mode = value)}
163
+ bind:energy_source_mode
164
+ has_precomputed_e_form={hull_data.has_precomputed_e_form}
165
+ can_compute_e_form={hull_data.can_compute_e_form}
166
+ has_precomputed_hull={hull_data.has_precomputed_hull}
167
+ can_compute_hull={hull_data.can_compute_hull}
168
+ />
169
+ {/if}
170
+ </section>
171
+ {/if}
172
+
173
+ <!-- Hover tooltip -->
174
+ {#if interactions.hover_data}
175
+ {@const { entry, position } = interactions.hover_data}
176
+ {@const entry_highlight = is_highlighted(entry) ? merged_highlight_style : undefined}
177
+ {@const tooltip_style = `z-index: ${CONVEX_HULL_STYLE.z_index.tooltip}; backdrop-filter: blur(4px);
178
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);`}
179
+ <PlotTooltip
180
+ x={position.x}
181
+ y={position.y}
182
+ offset={{ x: 10, y: -10 }}
183
+ bg_color={get_point_color(entry)}
184
+ fixed
185
+ style={tooltip_style}
186
+ >
187
+ <ConvexHullTooltip
188
+ {entry}
189
+ polymorph_stats_map={hull_data.polymorph_stats_map}
190
+ highlight_style={entry_highlight}
191
+ {entry_category}
192
+ {tooltip}
193
+ />
194
+ </PlotTooltip>
195
+ {/if}
196
+
197
+ <!-- Copy-to-clipboard feedback (double-click on point) -->
198
+ <ClickFeedback
199
+ bind:visible={interactions.copy_feedback.visible}
200
+ position={interactions.copy_feedback.position}
201
+ />
202
+
203
+ <!-- z-index 1: above auto-stacked siblings after the chrome (3D gizmo, gas controls), below z-2 sliders -->
204
+ <DragOverlay
205
+ visible={interactions.drag_over}
206
+ message="Drop JSON file to load phase diagram data"
207
+ style="z-index: 1"
208
+ />
209
+
210
+ {#if interactions.modal_open && interactions.selected_structure}
211
+ <StructurePopup
212
+ structure={interactions.selected_structure}
213
+ place_right={interactions.modal_place_right}
214
+ stats={{
215
+ id: selected_entry?.entry_id,
216
+ e_above_hull: selected_entry?.e_above_hull,
217
+ e_form: selected_entry?.e_form_per_atom,
218
+ }}
219
+ onclose={interactions.close_structure_popup}
220
+ />
221
+ {/if}
222
+
223
+ <style>
224
+ .control-buttons {
225
+ position: absolute;
226
+ top: 1ex;
227
+ right: 1ex;
228
+ display: flex;
229
+ gap: 8px;
230
+ transition: opacity 0.2s ease-in-out;
231
+ }
232
+ .control-buttons.hover-visible {
233
+ opacity: 0;
234
+ pointer-events: none;
235
+ }
236
+ :global(.convex-hull-3d:hover) > .control-buttons.hover-visible,
237
+ :global(.convex-hull-3d:focus-within) > .control-buttons.hover-visible,
238
+ :global(.convex-hull-4d:hover) > .control-buttons.hover-visible,
239
+ :global(.convex-hull-4d:focus-within) > .control-buttons.hover-visible {
240
+ opacity: 1;
241
+ pointer-events: auto;
242
+ }
243
+ .control-buttons.always-visible {
244
+ opacity: 1;
245
+ pointer-events: auto;
246
+ }
247
+ .control-buttons :global(.draggable-pane) {
248
+ z-index: 1001 !important;
249
+ }
250
+ .control-buttons :global(button) {
251
+ background: transparent;
252
+ border: none;
253
+ padding: 4px;
254
+ cursor: pointer;
255
+ border-radius: 3px;
256
+ color: var(--text-color, currentColor);
257
+ transition: background-color 0.2s;
258
+ display: flex;
259
+ font-size: var(--ctrl-btn-icon-size, clamp(0.7rem, 2cqmin, 0.85rem));
260
+ }
261
+ .control-buttons :global(button):hover {
262
+ background-color: color-mix(in srgb, currentColor 8%, transparent);
263
+ }
264
+ </style>
@@ -0,0 +1,30 @@
1
+ import type { ShowControlsState } from '../controls';
2
+ import { type FullscreenToggleProp } from '../layout';
3
+ import type { ComponentProps } from 'svelte';
4
+ import type { create_canvas_interactions } from './canvas-interactions.svelte';
5
+ import ConvexHullControls from './ConvexHullControls.svelte';
6
+ import ConvexHullInfoPane from './ConvexHullInfoPane.svelte';
7
+ import type { create_hull_data_pipeline } from './hull-state.svelte';
8
+ import type { ConvexHullTooltipProp } from './index';
9
+ import type { ConvexHullEntry, HighlightStyle } from './types';
10
+ type ControlsProps = ComponentProps<typeof ConvexHullControls>;
11
+ type $$ComponentProps = Pick<ControlsProps, `camera` | `merged_controls` | `stable_entries` | `unstable_entries` | `color_mode` | `color_scale` | `show_stable` | `show_unstable` | `entry_category` | `hidden_categories` | `show_stable_labels` | `show_unstable_labels` | `max_hull_dist_show_phases` | `max_hull_dist_show_labels` | `energy_source_mode` | `controls_open` | `show_hull_faces` | `hull_face_color` | `hull_face_opacity` | `hull_face_color_mode`> & Pick<ComponentProps<typeof ConvexHullInfoPane>, `phase_stats` | `label_threshold`> & {
12
+ interactions: ReturnType<typeof create_canvas_interactions>;
13
+ hull_data: ReturnType<typeof create_hull_data_pipeline<ConvexHullEntry>>;
14
+ controls_config: ShowControlsState;
15
+ reset_all: () => void;
16
+ reset_title: string;
17
+ enable_info_pane?: boolean;
18
+ fullscreen?: boolean;
19
+ fullscreen_toggle?: FullscreenToggleProp;
20
+ wrapper?: HTMLDivElement;
21
+ get_point_color: (entry: ConvexHullEntry) => string;
22
+ merged_highlight_style: HighlightStyle;
23
+ is_highlighted: (entry: ConvexHullEntry) => boolean;
24
+ tooltip?: ConvexHullTooltipProp<ConvexHullEntry>;
25
+ selected_entry: ConvexHullEntry | null;
26
+ info_pane_open?: boolean;
27
+ };
28
+ declare const ConvexHullChrome: import("svelte").Component<$$ComponentProps, {}, "controls_open" | "color_scale" | "info_pane_open" | "show_hull_faces" | "hull_face_color" | "hull_face_opacity" | "hull_face_color_mode" | "color_mode" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "hidden_categories" | "energy_source_mode">;
29
+ type ConvexHullChrome = ReturnType<typeof ConvexHullChrome>;
30
+ export default ConvexHullChrome;
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import type { PaneProps, PaneToggleProps } from '../overlays'
2
3
  import type { D3InterpolateName } from '../colors'
3
4
  import { format_num } from '../labels'
4
5
  import DraggablePane from '../overlays/DraggablePane.svelte'
@@ -7,12 +8,14 @@
7
8
  import type { ComponentProps } from 'svelte'
8
9
  import { tooltip } from 'svelte-multiselect/attachments'
9
10
  import type { HTMLAttributes } from 'svelte/elements'
11
+ import { get_entry_category, marker_path_data } from './helpers'
10
12
  import type {
11
13
  ConvexHullControlsType,
12
14
  ConvexHullEntry,
15
+ EntryCategoryConfig,
13
16
  HullFaceColorMode,
14
17
  } from './types'
15
- import { HULL_FACE_COLOR_MODES } from './types'
18
+ import { HULL_FACE_COLOR_MODES, MAGNETIC_ORDERING_CATEGORY } from './types'
16
19
 
17
20
  interface CameraState {
18
21
  elevation?: number // Elevation angle in degrees (for ternary)
@@ -25,25 +28,26 @@
25
28
  }
26
29
 
27
30
  // Face color mode display labels and tooltips
28
- const FACE_COLOR_MODES: Record<HullFaceColorMode, { label: string; tip: string }> =
29
- {
30
- uniform: { label: `Uniform`, tip: `Single uniform color for all faces` },
31
- formation_energy: {
32
- label: `Energy`,
33
- tip: `Color by average formation energy of face vertices`,
34
- },
35
- dominant_element: {
36
- label: `Element`,
37
- tip: `Color by element with highest concentration at face centroid`,
38
- },
39
- facet_index: { label: `Index`, tip: `Distinct categorical color per facet` },
40
- }
31
+ const FACE_COLOR_MODES: Record<HullFaceColorMode, { label: string; tip: string }> = {
32
+ uniform: { label: `Uniform`, tip: `Single uniform color for all faces` },
33
+ formation_energy: {
34
+ label: `Energy`,
35
+ tip: `Color by average formation energy of face vertices`,
36
+ },
37
+ dominant_element: {
38
+ label: `Element`,
39
+ tip: `Color by element with highest concentration at face centroid`,
40
+ },
41
+ facet_index: { label: `Index`, tip: `Distinct categorical color per facet` },
42
+ }
41
43
 
42
44
  let {
43
45
  color_mode = $bindable(`stability`),
44
46
  color_scale = $bindable(`interpolateViridis`),
45
47
  show_stable = $bindable(true),
46
48
  show_unstable = $bindable(true),
49
+ entry_category = MAGNETIC_ORDERING_CATEGORY,
50
+ hidden_categories = $bindable([]),
47
51
  show_stable_labels = $bindable(true),
48
52
  show_unstable_labels = $bindable(false),
49
53
  show_hull_faces = undefined,
@@ -76,6 +80,9 @@
76
80
  color_scale?: D3InterpolateName
77
81
  show_stable?: boolean
78
82
  show_unstable?: boolean
83
+ // Categorical classification rendered as filter toggles (null disables the row)
84
+ entry_category?: EntryCategoryConfig | null
85
+ hidden_categories?: string[]
79
86
  show_stable_labels?: boolean
80
87
  show_unstable_labels?: boolean
81
88
  // 3D specific controls
@@ -105,16 +112,41 @@
105
112
  merged_controls: ConvexHullControlsType
106
113
  // Pane state
107
114
  controls_open?: boolean
108
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
109
- pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
115
+ toggle_props?: PaneToggleProps
116
+ pane_props?: PaneProps
110
117
  } = $props()
111
118
 
112
119
  // Focus the multiselect input next to the "Color scale" label
113
- function focus_multiselect(
114
- evt: Event & { currentTarget: HTMLElement },
115
- ): void {
120
+ function focus_multiselect(evt: Event & { currentTarget: HTMLElement }): void {
116
121
  evt.currentTarget.nextElementSibling?.querySelector<HTMLInputElement>(`input`)?.focus()
117
122
  }
123
+
124
+ // Category filters: only show category values present in the (threshold-filtered) data
125
+ const category_counts = $derived.by(() => {
126
+ const counts: Record<string, number> = {}
127
+ for (const entry of [...stable_entries, ...unstable_entries]) {
128
+ const value = get_entry_category(entry, entry_category)
129
+ if (value) counts[value] = (counts[value] ?? 0) + 1
130
+ }
131
+ return counts
132
+ })
133
+ const category_values_in_data = $derived(
134
+ Object.keys(entry_category?.markers ?? {}).filter(
135
+ (value) => (category_counts[value] ?? 0) > 0,
136
+ ),
137
+ )
138
+ const toggle_category = (value: string) => {
139
+ hidden_categories = hidden_categories.includes(value)
140
+ ? hidden_categories.filter((hidden) => hidden !== value)
141
+ : [...hidden_categories, value]
142
+ }
143
+ const SWATCH_RADIUS = 4.4 // marker swatch radius, sized to fit the 12x12 viewBox
144
+ // Keyboard activation for legend toggles (preventDefault stops Space scrolling the page)
145
+ const legend_keydown = (action: () => void) => (evt: KeyboardEvent) => {
146
+ if (![`Enter`, ` `].includes(evt.key)) return
147
+ evt.preventDefault()
148
+ action()
149
+ }
118
150
  </script>
119
151
 
120
152
  <DraggablePane
@@ -138,13 +170,12 @@
138
170
  </h4>
139
171
 
140
172
  <!-- Energy source selection (only if both options are available) -->
141
- {#if has_precomputed_e_form && has_precomputed_hull && can_compute_e_form &&
142
- can_compute_hull}
173
+ {#if has_precomputed_e_form && has_precomputed_hull && can_compute_e_form && can_compute_hull}
143
174
  <div class="control-row">
144
175
  <span class="control-label">Energy source</span>
145
176
  <button
146
177
  class="toggle-btn {energy_source_mode === `precomputed` ? `active` : ``}"
147
- onclick={() => energy_source_mode = `precomputed`}
178
+ onclick={() => (energy_source_mode = `precomputed`)}
148
179
  {@attach tooltip({
149
180
  allow_html: true,
150
181
  content: `Use precomputed formation energies (E<sub>form</sub>)`,
@@ -154,11 +185,10 @@
154
185
  </button>
155
186
  <button
156
187
  class="toggle-btn {energy_source_mode === `on-the-fly` ? `active` : ``}"
157
- onclick={() => energy_source_mode = `on-the-fly`}
188
+ onclick={() => (energy_source_mode = `on-the-fly`)}
158
189
  {@attach tooltip({
159
190
  allow_html: true,
160
- content:
161
- `Compute formation energies and hull distances on the fly. Note: Missing pure-element reference entries default to E<sub>form</sub> = 0 eV/atom if not provided explicitly.`,
191
+ content: `Compute formation energies and hull distances on the fly. Note: Missing pure-element reference entries default to E<sub>form</sub> = 0 eV/atom if not provided explicitly.`,
162
192
  })}
163
193
  >
164
194
  On the fly
@@ -171,14 +201,14 @@
171
201
  <span class="control-label">Color mode</span>
172
202
  <button
173
203
  class="toggle-btn {color_mode === `stability` ? `active` : ``}"
174
- onclick={() => color_mode = `stability`}
204
+ onclick={() => (color_mode = `stability`)}
175
205
  {@attach tooltip({ content: `Color points by stable/unstable` })}
176
206
  >
177
207
  Stability
178
208
  </button>
179
209
  <button
180
210
  class="toggle-btn {color_mode === `energy` ? `active` : ``}"
181
- onclick={() => color_mode = `energy`}
211
+ onclick={() => (color_mode = `energy`)}
182
212
  {@attach tooltip({ content: `Color points by energy above hull` })}
183
213
  >
184
214
  Energy
@@ -218,33 +248,31 @@
218
248
  <div class="legend-items-container">
219
249
  <div
220
250
  class="legend-item clickable {show_stable ? `active` : `inactive`}"
221
- onclick={() => show_stable = !show_stable}
222
- onkeydown={(evt) =>
223
- [`Enter`, ` `].includes(evt.key) && (show_stable = !show_stable)}
251
+ onclick={() => (show_stable = !show_stable)}
252
+ onkeydown={legend_keydown(() => (show_stable = !show_stable))}
224
253
  role="button"
225
254
  tabindex="0"
255
+ aria-pressed={show_stable}
226
256
  {@attach tooltip({ content: `Toggle visibility of stable points` })}
227
257
  >
228
258
  <div class="marker stable"></div>
229
- <span>Stable{
230
- merged_controls.show_counts ? ` (${stable_entries.length})` : ``
231
- }</span>
259
+ <span>Stable{merged_controls.show_counts ? ` (${stable_entries.length})` : ``}</span>
232
260
  </div>
233
261
  <div
234
262
  class="legend-item clickable {show_unstable ? `active` : `inactive`}"
235
- onclick={() => show_unstable = !show_unstable}
236
- onkeydown={(evt) =>
237
- [`Enter`, ` `].includes(evt.key) && (show_unstable = !show_unstable)}
263
+ onclick={() => (show_unstable = !show_unstable)}
264
+ onkeydown={legend_keydown(() => (show_unstable = !show_unstable))}
238
265
  role="button"
239
266
  tabindex="0"
267
+ aria-pressed={show_unstable}
240
268
  {@attach tooltip({ content: `Toggle visibility of above-hull points` })}
241
269
  >
242
270
  <div class="marker unstable"></div>
243
- <span>Above hull{
244
- merged_controls.show_counts
271
+ <span
272
+ >Above hull{merged_controls.show_counts
245
273
  ? ` (${show_unstable ? unstable_entries.length : 0}/${unstable_entries.length})`
246
- : ``
247
- }</span>
274
+ : ``}</span
275
+ >
248
276
  </div>
249
277
  </div>
250
278
  </div>
@@ -259,8 +287,8 @@
259
287
  }}
260
288
  role="button"
261
289
  tabindex="0"
262
- style="cursor: pointer"
263
- >Color scale</span>
290
+ style="cursor: pointer">Color scale</span
291
+ >
264
292
  <ColorScaleSelect
265
293
  bind:value={color_scale}
266
294
  selected={[color_scale]}
@@ -270,6 +298,43 @@
270
298
  </div>
271
299
  {/if}
272
300
 
301
+ <!-- Category filters (only when entries carry recognized category data,
302
+ e.g. magnetic orderings with the default MAGNETIC_ORDERING_CATEGORY) -->
303
+ {#if entry_category && category_values_in_data.length > 0}
304
+ <div class="control-row">
305
+ <span class="control-label">{entry_category.label}</span>
306
+ <div class="legend-items-container category-filters">
307
+ {#each category_values_in_data as value (value)}
308
+ {@const hidden = hidden_categories.includes(value)}
309
+ {@const count = category_counts[value] ?? 0}
310
+ {@const long_name = entry_category.labels?.[value]}
311
+ <div
312
+ class="legend-item clickable {hidden ? `inactive` : `active`}"
313
+ onclick={() => toggle_category(value)}
314
+ onkeydown={legend_keydown(() => toggle_category(value))}
315
+ role="button"
316
+ tabindex="0"
317
+ aria-pressed={!hidden}
318
+ {@attach tooltip({
319
+ content: `Toggle visibility of ${
320
+ long_name ? `${long_name.toLowerCase()} (${value})` : value
321
+ } entries`,
322
+ })}
323
+ >
324
+ <svg viewBox="-6 -6 12 12" width="12" height="12" aria-hidden="true">
325
+ <path d={marker_path_data(SWATCH_RADIUS, entry_category.markers[value]) ?? ``} />
326
+ </svg>
327
+ <span
328
+ >{value}{merged_controls.show_counts
329
+ ? ` (${hidden ? `0/${count}` : count})`
330
+ : ``}</span
331
+ >
332
+ </div>
333
+ {/each}
334
+ </div>
335
+ </div>
336
+ {/if}
337
+
273
338
  {#if merged_controls.show_label_controls}
274
339
  <div class="control-row">
275
340
  <span class="control-label">Labels</span>
@@ -300,8 +365,10 @@
300
365
  >
301
366
  <span class="control-label">Label threshold</span>
302
367
  <label style="display: flex; align-items: center; gap: 4px; flex: 1">
303
- <span style="white-space: nowrap">{max_hull_dist_show_labels.toFixed(2)}
304
- eV/atom</span>
368
+ <span style="white-space: nowrap"
369
+ >{max_hull_dist_show_labels.toFixed(2)}
370
+ eV/atom</span
371
+ >
305
372
  <input
306
373
  type="range"
307
374
  min="0"
@@ -349,9 +416,9 @@
349
416
  class="threshold-slider"
350
417
  style="flex: 1; min-width: 80px"
351
418
  />
352
- <span style="font-size: 0.9em; min-width: 2em; text-align: right">{
353
- format_num(hull_face_opacity, `.1%`)
354
- }</span>
419
+ <span style="font-size: 0.9em; min-width: 2em; text-align: right"
420
+ >{format_num(hull_face_opacity, `.1%`)}</span
421
+ >
355
422
  </div>
356
423
  </div>
357
424
 
@@ -379,7 +446,9 @@
379
446
  <!-- Ternary camera controls (elevation/azimuth) -->
380
447
  <label
381
448
  class="angle-input"
382
- {@attach tooltip({ content: `Elevation angle (0° = look down z-axis, 90° = side view, 180° = look up z-axis)` })}
449
+ {@attach tooltip({
450
+ content: `Elevation angle (0° = look down z-axis, 90° = side view, 180° = look up z-axis)`,
451
+ })}
383
452
  >
384
453
  <span>Elev</span>
385
454
  <input
@@ -469,7 +538,8 @@
469
538
  button {
470
539
  border: 1px solid var(--border-color, rgba(0, 0, 0, 0.2));
471
540
  }
472
- .toggle-btn.active, .toggle-btn:hover.active {
541
+ .toggle-btn.active,
542
+ .toggle-btn:hover.active {
473
543
  background: light-dark(rgba(25, 118, 210, 0.15), rgba(100, 180, 255, 0.2));
474
544
  }
475
545
  .legend-items-container {
@@ -490,6 +560,15 @@
490
560
  .legend-item.inactive {
491
561
  opacity: 0.5;
492
562
  }
563
+ .category-filters {
564
+ flex-wrap: wrap;
565
+ gap: 8px;
566
+ }
567
+ .legend-item svg {
568
+ margin-right: 4px;
569
+ flex-shrink: 0;
570
+ fill: currentColor;
571
+ }
493
572
  .marker {
494
573
  width: 12px;
495
574
  height: 12px;
@@ -1,8 +1,7 @@
1
+ import type { PaneProps, PaneToggleProps } from '../overlays';
1
2
  import type { D3InterpolateName } from '../colors';
2
- import DraggablePane from '../overlays/DraggablePane.svelte';
3
- import type { ComponentProps } from 'svelte';
4
3
  import type { HTMLAttributes } from 'svelte/elements';
5
- import type { ConvexHullControlsType, ConvexHullEntry, HullFaceColorMode } from './types';
4
+ import type { ConvexHullControlsType, ConvexHullEntry, EntryCategoryConfig, HullFaceColorMode } from './types';
6
5
  interface CameraState {
7
6
  elevation?: number;
8
7
  azimuth?: number;
@@ -17,6 +16,8 @@ type $$ComponentProps = Omit<HTMLAttributes<HTMLDivElement>, `onclose`> & {
17
16
  color_scale?: D3InterpolateName;
18
17
  show_stable?: boolean;
19
18
  show_unstable?: boolean;
19
+ entry_category?: EntryCategoryConfig | null;
20
+ hidden_categories?: string[];
20
21
  show_stable_labels?: boolean;
21
22
  show_unstable_labels?: boolean;
22
23
  show_hull_faces?: boolean;
@@ -40,9 +41,9 @@ type $$ComponentProps = Omit<HTMLAttributes<HTMLDivElement>, `onclose`> & {
40
41
  camera?: CameraState;
41
42
  merged_controls: ConvexHullControlsType;
42
43
  controls_open?: boolean;
43
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`];
44
- pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`];
44
+ toggle_props?: PaneToggleProps;
45
+ pane_props?: PaneProps;
45
46
  };
46
- declare const ConvexHullControls: import("svelte").Component<$$ComponentProps, {}, "controls_open" | "hull_face_opacity" | "color_mode" | "color_scale" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "energy_source_mode">;
47
+ declare const ConvexHullControls: import("svelte").Component<$$ComponentProps, {}, "controls_open" | "color_scale" | "hull_face_opacity" | "color_mode" | "show_stable" | "show_unstable" | "show_stable_labels" | "show_unstable_labels" | "max_hull_dist_show_phases" | "max_hull_dist_show_labels" | "hidden_categories" | "energy_source_mode">;
47
48
  type ConvexHullControls = ReturnType<typeof ConvexHullControls>;
48
49
  export default ConvexHullControls;