matterviz 0.3.7 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/dist/Icon.svelte +7 -4
  2. package/dist/MillerIndexInput.svelte +1 -1
  3. package/dist/api/optimade.js +32 -26
  4. package/dist/app.css +0 -3
  5. package/dist/brillouin/BrillouinZone.svelte +76 -148
  6. package/dist/brillouin/BrillouinZone.svelte.d.ts +6 -14
  7. package/dist/brillouin/BrillouinZoneExportPane.svelte +43 -96
  8. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneInfoPane.svelte +9 -32
  10. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  11. package/dist/brillouin/BrillouinZoneScene.svelte +97 -205
  12. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +4 -23
  13. package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
  14. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  15. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  16. package/dist/brillouin/compute.d.ts +2 -0
  17. package/dist/brillouin/compute.js +89 -90
  18. package/dist/brillouin/geometry.d.ts +8 -0
  19. package/dist/brillouin/geometry.js +57 -0
  20. package/dist/brillouin/index.d.ts +2 -0
  21. package/dist/brillouin/index.js +2 -0
  22. package/dist/brillouin/types.d.ts +2 -2
  23. package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  25. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +109 -203
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  27. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +180 -470
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  29. package/dist/chempot-diagram/async-compute.svelte.js +3 -1
  30. package/dist/chempot-diagram/chempot-worker.js +2 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +4 -4
  34. package/dist/chempot-diagram/compute.js +20 -20
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.js +8 -7
  45. package/dist/composition/FormulaFilter.svelte +18 -11
  46. package/dist/composition/PieChart.svelte +11 -10
  47. package/dist/composition/chem-sys.d.ts +8 -0
  48. package/dist/composition/chem-sys.js +86 -0
  49. package/dist/composition/format.js +7 -4
  50. package/dist/composition/index.d.ts +1 -0
  51. package/dist/composition/index.js +1 -0
  52. package/dist/composition/parse.d.ts +0 -1
  53. package/dist/composition/parse.js +41 -31
  54. package/dist/controls.d.ts +1 -0
  55. package/dist/controls.js +0 -1
  56. package/dist/convex-hull/ConvexHull.svelte +8 -10
  57. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  58. package/dist/convex-hull/ConvexHull2D.svelte +106 -185
  59. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  60. package/dist/convex-hull/ConvexHull3D.svelte +179 -683
  61. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  62. package/dist/convex-hull/ConvexHull4D.svelte +183 -687
  63. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  64. package/dist/convex-hull/ConvexHullChrome.svelte +268 -0
  65. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  66. package/dist/convex-hull/ConvexHullControls.svelte +88 -7
  67. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  68. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  69. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  70. package/dist/convex-hull/ConvexHullStats.svelte +36 -175
  71. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  72. package/dist/convex-hull/ConvexHullTooltip.svelte +11 -2
  73. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  74. package/dist/convex-hull/GasPressureControls.svelte +4 -4
  75. package/dist/convex-hull/TemperatureSlider.svelte +2 -2
  76. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  77. package/dist/convex-hull/barycentric-coords.js +6 -33
  78. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  79. package/dist/convex-hull/canvas-interactions.svelte.js +278 -0
  80. package/dist/convex-hull/demo-temperature.d.ts +1 -1
  81. package/dist/convex-hull/demo-temperature.js +20 -22
  82. package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
  83. package/dist/convex-hull/gas-thermodynamics.js +22 -30
  84. package/dist/convex-hull/helpers.d.ts +42 -7
  85. package/dist/convex-hull/helpers.js +171 -78
  86. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  87. package/dist/convex-hull/hull-state.svelte.js +124 -0
  88. package/dist/convex-hull/index.d.ts +10 -8
  89. package/dist/convex-hull/index.js +7 -2
  90. package/dist/convex-hull/thermodynamics.js +136 -960
  91. package/dist/convex-hull/types.d.ts +13 -5
  92. package/dist/convex-hull/types.js +12 -0
  93. package/dist/coordination/CoordinationBarPlot.svelte +27 -34
  94. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  95. package/dist/element/BohrAtom.svelte +2 -1
  96. package/dist/element/index.d.ts +4 -0
  97. package/dist/element/index.js +18 -0
  98. package/dist/feedback/DragOverlay.svelte +3 -1
  99. package/dist/feedback/DragOverlay.svelte.d.ts +1 -0
  100. package/dist/feedback/StatusMessage.svelte +13 -3
  101. package/dist/fermi-surface/FermiSlice.svelte +13 -5
  102. package/dist/fermi-surface/FermiSurface.svelte +78 -151
  103. package/dist/fermi-surface/FermiSurface.svelte.d.ts +5 -14
  104. package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
  105. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  106. package/dist/fermi-surface/FermiSurfaceScene.svelte +72 -221
  107. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  108. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
  109. package/dist/fermi-surface/compute.js +67 -66
  110. package/dist/fermi-surface/export.js +6 -16
  111. package/dist/fermi-surface/index.d.ts +0 -1
  112. package/dist/fermi-surface/index.js +0 -1
  113. package/dist/fermi-surface/parse.d.ts +1 -1
  114. package/dist/fermi-surface/parse.js +71 -79
  115. package/dist/fermi-surface/types.d.ts +3 -2
  116. package/dist/heatmap-matrix/HeatmapMatrix.svelte +69 -52
  117. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +4 -3
  118. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +3 -2
  119. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  120. package/dist/heatmap-matrix/index.d.ts +3 -2
  121. package/dist/heatmap-matrix/index.js +1 -1
  122. package/dist/index.d.ts +1 -0
  123. package/dist/index.js +1 -0
  124. package/dist/io/ExportPane.svelte +166 -0
  125. package/dist/io/ExportPane.svelte.d.ts +17 -0
  126. package/dist/io/decompress.js +5 -4
  127. package/dist/io/export.d.ts +9 -5
  128. package/dist/io/export.js +77 -51
  129. package/dist/io/fetch.d.ts +2 -1
  130. package/dist/io/fetch.js +5 -1
  131. package/dist/io/file-drop.d.ts +8 -1
  132. package/dist/io/file-drop.js +48 -36
  133. package/dist/io/index.d.ts +2 -0
  134. package/dist/io/index.js +10 -0
  135. package/dist/io/types.d.ts +13 -0
  136. package/dist/io/url-drop.js +64 -33
  137. package/dist/isosurface/parse.js +52 -51
  138. package/dist/isosurface/slice.js +5 -4
  139. package/dist/isosurface/types.js +1 -1
  140. package/dist/keyboard.d.ts +3 -0
  141. package/dist/keyboard.js +23 -0
  142. package/dist/labels.d.ts +1 -1
  143. package/dist/labels.js +9 -8
  144. package/dist/layout/FullscreenButton.svelte +33 -0
  145. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  146. package/dist/layout/FullscreenToggle.svelte +8 -14
  147. package/dist/layout/PropertyFilter.svelte +3 -2
  148. package/dist/layout/SettingsSection.svelte +1 -1
  149. package/dist/layout/ViewerChrome.svelte +116 -0
  150. package/dist/layout/ViewerChrome.svelte.d.ts +17 -0
  151. package/dist/layout/fullscreen.d.ts +4 -0
  152. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  153. package/dist/layout/fullscreen.svelte.js +37 -0
  154. package/dist/layout/index.d.ts +3 -0
  155. package/dist/layout/index.js +3 -0
  156. package/dist/layout/json-tree/JsonNode.svelte +1 -1
  157. package/dist/layout/json-tree/JsonTree.svelte +2 -2
  158. package/dist/layout/json-tree/utils.js +5 -4
  159. package/dist/marching-cubes.js +8 -13
  160. package/dist/math.d.ts +12 -4
  161. package/dist/math.js +42 -30
  162. package/dist/overlays/DraggablePane.svelte +4 -4
  163. package/dist/overlays/index.d.ts +4 -0
  164. package/dist/periodic-table/PeriodicTable.svelte +27 -15
  165. package/dist/periodic-table/PropertySelect.svelte +1 -0
  166. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
  167. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  168. package/dist/phase-diagram/PhaseDiagramControls.svelte +3 -2
  169. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  170. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  171. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  172. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +47 -132
  173. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  174. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
  175. package/dist/phase-diagram/build-diagram.js +2 -2
  176. package/dist/phase-diagram/colors.js +1 -1
  177. package/dist/phase-diagram/parse.d.ts +2 -1
  178. package/dist/phase-diagram/parse.js +6 -5
  179. package/dist/phase-diagram/types.d.ts +1 -1
  180. package/dist/phase-diagram/utils.d.ts +3 -3
  181. package/dist/phase-diagram/utils.js +8 -12
  182. package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +246 -841
  183. package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +8 -16
  184. package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
  185. package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
  186. package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +8 -7
  187. package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
  188. package/dist/plot/bar/data.d.ts +40 -0
  189. package/dist/plot/bar/data.js +154 -0
  190. package/dist/plot/bar/geometry.d.ts +39 -0
  191. package/dist/plot/bar/geometry.js +60 -0
  192. package/dist/plot/bar/index.d.ts +3 -0
  193. package/dist/plot/bar/index.js +3 -0
  194. package/dist/plot/box/BoxPlot.svelte +1292 -0
  195. package/dist/plot/box/BoxPlot.svelte.d.ts +95 -0
  196. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  197. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  198. package/dist/plot/box/Violin.svelte +14 -0
  199. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  200. package/dist/plot/box/box-plot.d.ts +56 -0
  201. package/dist/plot/box/box-plot.js +129 -0
  202. package/dist/plot/box/index.d.ts +5 -0
  203. package/dist/plot/box/index.js +5 -0
  204. package/dist/plot/box/kde.d.ts +17 -0
  205. package/dist/plot/box/kde.js +160 -0
  206. package/dist/plot/box/quantile.d.ts +3 -0
  207. package/dist/plot/box/quantile.js +53 -0
  208. package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +1 -1
  209. package/dist/plot/{auto-place.js → core/auto-place.js} +6 -3
  210. package/dist/plot/core/axis-utils.d.ts +46 -0
  211. package/dist/plot/core/axis-utils.js +110 -0
  212. package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
  213. package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
  214. package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +41 -38
  215. package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +7 -6
  216. package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
  217. package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
  218. package/dist/plot/core/components/ControlPane.svelte +46 -0
  219. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  220. package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
  221. package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
  222. package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
  223. package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
  224. package/dist/plot/{Line.svelte → core/components/Line.svelte} +33 -15
  225. package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +3 -2
  226. package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +9 -6
  227. package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +5 -3
  228. package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
  229. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  230. package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
  231. package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
  232. package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
  233. package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
  234. package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
  235. package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
  236. package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
  237. package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +5 -5
  238. package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +5 -5
  239. package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +8 -8
  240. package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +5 -5
  241. package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
  242. package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
  243. package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
  244. package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
  245. package/dist/plot/core/components/index.d.ts +17 -0
  246. package/dist/plot/core/components/index.js +17 -0
  247. package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
  248. package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +21 -23
  249. package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
  250. package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
  251. package/dist/plot/core/fill-utils.d.ts +34 -0
  252. package/dist/plot/core/fill-utils.js +391 -0
  253. package/dist/plot/core/index.d.ts +10 -0
  254. package/dist/plot/core/index.js +11 -0
  255. package/dist/plot/core/interactions.d.ts +39 -0
  256. package/dist/plot/core/interactions.js +209 -0
  257. package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
  258. package/dist/plot/{layout.js → core/layout.js} +16 -8
  259. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  260. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  261. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  262. package/dist/plot/core/placed-tween.svelte.js +68 -0
  263. package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +11 -11
  264. package/dist/plot/{reference-line.js → core/reference-line.js} +29 -42
  265. package/dist/plot/core/scales.d.ts +40 -0
  266. package/dist/plot/{scales.js → core/scales.js} +94 -93
  267. package/dist/plot/core/svg.d.ts +3 -0
  268. package/dist/plot/core/svg.js +41 -0
  269. package/dist/plot/{types.d.ts → core/types.d.ts} +36 -85
  270. package/dist/plot/{types.js → core/types.js} +1 -1
  271. package/dist/plot/{utils → core/utils}/label-placement.d.ts +3 -3
  272. package/dist/plot/{utils → core/utils}/label-placement.js +3 -3
  273. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  274. package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
  275. package/dist/plot/core/utils.d.ts +12 -0
  276. package/dist/plot/core/utils.js +27 -0
  277. package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +174 -551
  278. package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
  279. package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
  280. package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
  281. package/dist/plot/histogram/index.d.ts +2 -0
  282. package/dist/plot/histogram/index.js +2 -0
  283. package/dist/plot/index.d.ts +8 -41
  284. package/dist/plot/index.js +10 -39
  285. package/dist/plot/sankey/Sankey.svelte +697 -0
  286. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  287. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  288. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  289. package/dist/plot/sankey/index.d.ts +4 -0
  290. package/dist/plot/sankey/index.js +3 -0
  291. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  292. package/dist/plot/sankey/sankey-types.js +4 -0
  293. package/dist/plot/sankey/sankey.d.ts +52 -0
  294. package/dist/plot/sankey/sankey.js +189 -0
  295. package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +64 -64
  296. package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +6 -6
  297. package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
  298. package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
  299. package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +297 -1008
  300. package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +10 -18
  301. package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
  302. package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +2 -2
  303. package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
  304. package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
  305. package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
  306. package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
  307. package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +5 -12
  308. package/dist/plot/scatter/index.d.ts +7 -0
  309. package/dist/plot/scatter/index.js +5 -0
  310. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  311. package/dist/plot/scatter/scatter-data.js +212 -0
  312. package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +25 -34
  313. package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +9 -17
  314. package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +14 -14
  315. package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +6 -6
  316. package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +129 -128
  317. package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +6 -15
  318. package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +7 -6
  319. package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +5 -4
  320. package/dist/plot/scatter-3d/index.d.ts +4 -0
  321. package/dist/plot/scatter-3d/index.js +4 -0
  322. package/dist/plot/sunburst/Sunburst.svelte +1041 -0
  323. package/dist/plot/sunburst/Sunburst.svelte.d.ts +97 -0
  324. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  325. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  326. package/dist/plot/sunburst/index.d.ts +4 -0
  327. package/dist/plot/sunburst/index.js +4 -0
  328. package/dist/plot/sunburst/render.d.ts +34 -0
  329. package/dist/plot/sunburst/render.js +122 -0
  330. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  331. package/dist/plot/sunburst/sunburst.js +269 -0
  332. package/dist/rdf/RdfPlot.svelte +2 -1
  333. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  334. package/dist/rdf/calc-rdf.js +11 -24
  335. package/dist/sanitize.js +14 -3
  336. package/dist/scene/SceneCamera.svelte +62 -0
  337. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  338. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  339. package/dist/scene/bind-renderer.svelte.js +14 -0
  340. package/dist/scene/index.d.ts +4 -0
  341. package/dist/scene/index.js +5 -0
  342. package/dist/scene/props.js +52 -0
  343. package/dist/scene/types.d.ts +26 -0
  344. package/dist/scene/types.js +1 -0
  345. package/dist/settings.d.ts +79 -3
  346. package/dist/settings.js +321 -1
  347. package/dist/spectral/Bands.svelte +47 -36
  348. package/dist/spectral/Bands.svelte.d.ts +6 -6
  349. package/dist/spectral/BandsAndDos.svelte +23 -25
  350. package/dist/spectral/BrillouinBandsDos.svelte +42 -30
  351. package/dist/spectral/Dos.svelte +15 -23
  352. package/dist/spectral/Dos.svelte.d.ts +4 -3
  353. package/dist/spectral/helpers.d.ts +8 -6
  354. package/dist/spectral/helpers.js +137 -65
  355. package/dist/state.svelte.d.ts +0 -7
  356. package/dist/state.svelte.js +0 -6
  357. package/dist/structure/Arrow.svelte +2 -4
  358. package/dist/structure/AtomLegend.svelte +8 -9
  359. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  360. package/dist/structure/CanvasTooltip.svelte +1 -0
  361. package/dist/structure/CellSelect.svelte +12 -5
  362. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  363. package/dist/structure/Cylinder.svelte +12 -8
  364. package/dist/structure/Cylinder.svelte.d.ts +4 -1
  365. package/dist/structure/Lattice.svelte +2 -2
  366. package/dist/structure/Structure.svelte +365 -423
  367. package/dist/structure/Structure.svelte.d.ts +5 -15
  368. package/dist/structure/StructureControls.svelte +217 -2
  369. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  370. package/dist/structure/StructureExportPane.svelte +54 -156
  371. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  372. package/dist/structure/StructureInfoPane.svelte +10 -9
  373. package/dist/structure/StructureInfoPane.svelte.d.ts +5 -5
  374. package/dist/structure/StructureScene.svelte +376 -208
  375. package/dist/structure/StructureScene.svelte.d.ts +22 -20
  376. package/dist/structure/{label-placement.d.ts → atom-label-placement.d.ts} +3 -3
  377. package/dist/structure/{label-placement.js → atom-label-placement.js} +15 -5
  378. package/dist/structure/atom-properties.d.ts +1 -1
  379. package/dist/structure/atom-properties.js +17 -22
  380. package/dist/structure/bond-order-perception.js +3 -5
  381. package/dist/structure/bonding.d.ts +4 -0
  382. package/dist/structure/bonding.js +134 -63
  383. package/dist/structure/export.d.ts +24 -4
  384. package/dist/structure/export.js +89 -143
  385. package/dist/structure/index.d.ts +4 -4
  386. package/dist/structure/index.js +3 -3
  387. package/dist/structure/measure.d.ts +3 -2
  388. package/dist/structure/measure.js +6 -5
  389. package/dist/structure/parse.d.ts +3 -2
  390. package/dist/structure/parse.js +419 -438
  391. package/dist/structure/partial-occupancy.d.ts +0 -1
  392. package/dist/structure/partial-occupancy.js +1 -1
  393. package/dist/structure/pbc.d.ts +1 -1
  394. package/dist/structure/pbc.js +190 -13
  395. package/dist/structure/polyhedra.d.ts +41 -0
  396. package/dist/structure/polyhedra.js +602 -0
  397. package/dist/structure/site.d.ts +4 -0
  398. package/dist/structure/site.js +1 -0
  399. package/dist/structure/supercell.js +3 -2
  400. package/dist/structure/validation.js +5 -6
  401. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  402. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  403. package/dist/symmetry/SymmetryElements.svelte +354 -0
  404. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  405. package/dist/symmetry/SymmetryStats.svelte +113 -8
  406. package/dist/symmetry/WyckoffTable.svelte +68 -7
  407. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  408. package/dist/symmetry/cell-transform.js +7 -14
  409. package/dist/symmetry/index.d.ts +14 -4
  410. package/dist/symmetry/index.js +291 -72
  411. package/dist/symmetry/spacegroups.d.ts +12 -1
  412. package/dist/symmetry/spacegroups.js +63 -14
  413. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  414. package/dist/symmetry/symmetry-elements.js +521 -0
  415. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  416. package/dist/symmetry/wyckoff-db.js +87 -0
  417. package/dist/table/HeatmapTable.svelte +66 -25
  418. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  419. package/dist/table/index.d.ts +1 -3
  420. package/dist/table/index.js +1 -1
  421. package/dist/theme/index.js +8 -8
  422. package/dist/tooltip/KCoords.svelte +45 -0
  423. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  424. package/dist/tooltip/index.d.ts +1 -0
  425. package/dist/tooltip/index.js +1 -0
  426. package/dist/trajectory/Trajectory.svelte +123 -100
  427. package/dist/trajectory/Trajectory.svelte.d.ts +11 -22
  428. package/dist/trajectory/TrajectoryExportPane.svelte +17 -25
  429. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  430. package/dist/trajectory/TrajectoryInfoPane.svelte +5 -3
  431. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  432. package/dist/trajectory/constants.js +6 -2
  433. package/dist/trajectory/extract.js +17 -37
  434. package/dist/trajectory/format-detect.d.ts +1 -1
  435. package/dist/trajectory/format-detect.js +27 -19
  436. package/dist/trajectory/frame-reader.d.ts +0 -1
  437. package/dist/trajectory/frame-reader.js +63 -162
  438. package/dist/trajectory/helpers.d.ts +10 -2
  439. package/dist/trajectory/helpers.js +56 -36
  440. package/dist/trajectory/index.js +1 -1
  441. package/dist/trajectory/parse/ase.d.ts +9 -1
  442. package/dist/trajectory/parse/ase.js +47 -32
  443. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  444. package/dist/trajectory/parse/diagnostics.js +14 -0
  445. package/dist/trajectory/parse/hdf5.js +1 -1
  446. package/dist/trajectory/parse/index.d.ts +1 -1
  447. package/dist/trajectory/parse/index.js +65 -105
  448. package/dist/trajectory/parse/lammps.d.ts +0 -2
  449. package/dist/trajectory/parse/lammps.js +8 -6
  450. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  451. package/dist/trajectory/parse/pymatgen.js +74 -0
  452. package/dist/trajectory/parse/vasp.js +38 -18
  453. package/dist/trajectory/parse/xyz.d.ts +13 -1
  454. package/dist/trajectory/parse/xyz.js +102 -94
  455. package/dist/trajectory/plotting.d.ts +1 -2
  456. package/dist/trajectory/plotting.js +16 -113
  457. package/dist/utils.d.ts +2 -0
  458. package/dist/utils.js +7 -5
  459. package/dist/xrd/XrdPlot.svelte +16 -30
  460. package/dist/xrd/broadening.d.ts +2 -1
  461. package/dist/xrd/calc-xrd.js +18 -20
  462. package/dist/xrd/index.d.ts +2 -2
  463. package/dist/xrd/parse.js +2 -2
  464. package/package.json +43 -26
  465. package/dist/element/data.json +0 -11864
  466. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  467. package/dist/fermi-surface/marching-cubes.js +0 -2
  468. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  469. package/dist/plot/axis-utils.d.ts +0 -19
  470. package/dist/plot/axis-utils.js +0 -78
  471. package/dist/plot/defaults.d.ts +0 -19
  472. package/dist/plot/defaults.js +0 -9
  473. package/dist/plot/fill-utils.d.ts +0 -46
  474. package/dist/plot/fill-utils.js +0 -322
  475. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  476. package/dist/plot/hover-lock.svelte.js +0 -46
  477. package/dist/plot/interactions.d.ts +0 -12
  478. package/dist/plot/interactions.js +0 -101
  479. package/dist/plot/scales.d.ts +0 -48
  480. package/dist/plot/svg.d.ts +0 -1
  481. package/dist/plot/svg.js +0 -11
  482. package/dist/plot/utils/series-visibility.d.ts +0 -15
  483. package/dist/plot/utils.d.ts +0 -1
  484. package/dist/plot/utils.js +0 -14
  485. /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
  486. /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
@@ -7,13 +7,20 @@
7
7
  import Icon from '../Icon.svelte'
8
8
  import { format_num } from '../labels'
9
9
  import { sanitize_html } from '../sanitize'
10
- import Histogram from '../plot/Histogram.svelte'
10
+ import { escape_html } from '../utils'
11
+ import Histogram from '../plot/histogram/Histogram.svelte'
11
12
  import type { Label, RowData } from '../table'
12
13
  import HeatmapTable from '../table/HeatmapTable.svelte'
13
14
  import type { HTMLAttributes } from 'svelte/elements'
14
15
  import { SvelteMap, SvelteSet } from 'svelte/reactivity'
15
- import type { ConvexHullEntry, PhaseArityField, PhaseStats } from './types'
16
- import { get_arity, is_on_hull } from './helpers'
16
+ import type {
17
+ ConvexHullEntry,
18
+ EntryCategoryConfig,
19
+ PhaseArityField,
20
+ PhaseStats,
21
+ } from './types'
22
+ import { MAGNETIC_ORDERING_CATEGORY } from './types'
23
+ import { get_arity, is_on_hull, visible_entries as filter_visible } from './helpers'
17
24
 
18
25
  let {
19
26
  phase_stats,
@@ -21,6 +28,8 @@
21
28
  unstable_entries,
22
29
  show_stable = true,
23
30
  show_unstable = true,
31
+ entry_category = MAGNETIC_ORDERING_CATEGORY,
32
+ hidden_categories = [],
24
33
  layout = `toggle`,
25
34
  on_entry_click,
26
35
  highlighted_entry_id,
@@ -35,6 +44,9 @@
35
44
  unstable_entries: ConvexHullEntry[]
36
45
  show_stable?: boolean
37
46
  show_unstable?: boolean
47
+ // Categorical classification + hidden values (excluded from shown counts/table)
48
+ entry_category?: EntryCategoryConfig | null
49
+ hidden_categories?: string[]
38
50
  // 'toggle' shows stats/table with toggle buttons (default)
39
51
  // 'side-by-side' shows both stats and table next to each other without toggle
40
52
  layout?: `toggle` | `side-by-side`
@@ -52,7 +64,6 @@
52
64
  let view_mode = $state<`stats` | `table`>(`stats`)
53
65
  // Formula filter: when set, table shows only entries with this reduced formula
54
66
  let formula_filter = $state(``)
55
- let show_export_dropdown = $state(false)
56
67
  const table_scroll_height =
57
68
  `var(--hull-stats-table-height, calc(var(--hull-stats-table-row-height, 2.35rem) * 10 + var(--hull-stats-table-header-height, 3.5rem)))`
58
69
  const table_scroll_style = $derived(layout === `side-by-side`
@@ -86,10 +97,15 @@
86
97
 
87
98
  // Shared concatenation of stable + unstable for histograms
88
99
  let all_entries = $derived([...stable_entries, ...unstable_entries])
89
- let shown_entries = $derived([
90
- ...(show_stable ? stable_entries : []),
91
- ...(show_unstable ? unstable_entries : []),
92
- ])
100
+ // show_stable/show_unstable respect the caller's partition; pass show flags as true
101
+ // so filter_visible only applies the category filter on top
102
+ let shown_entries = $derived(filter_visible(
103
+ [...(show_stable ? stable_entries : []), ...(show_unstable ? unstable_entries : [])],
104
+ true,
105
+ true,
106
+ entry_category,
107
+ hidden_categories,
108
+ ))
93
109
 
94
110
  // Static arity labels for phase breakdown display
95
111
  const arity_types: [string, PhaseArityField, number][] = [
@@ -251,23 +267,15 @@
251
267
  const sort_span = (sort_val: number | string, display: string, attrs = ``) =>
252
268
  `<span data-sort-value="${sort_val}"${attrs ? ` ${attrs}` : ``}>${display}</span>`
253
269
 
254
- // Escape HTML special chars to prevent XSS when rendering user-supplied strings via {@html}
255
- const escape_html = (str: string): string =>
256
- str
257
- .replace(/&/g, `&amp;`)
258
- .replace(/</g, `&lt;`)
259
- .replace(/>/g, `&gt;`)
260
- .replace(/"/g, `&quot;`)
261
- .replace(/'/g, `&#39;`)
262
270
  const unescape_html = (str: string, max_rounds = 5): string => {
263
271
  let decoded = str
264
272
  for (let round_idx = 0; round_idx < max_rounds; round_idx++) {
265
273
  const next_decoded = decoded
266
- .replace(/&amp;/g, `&`)
267
- .replace(/&lt;/g, `<`)
268
- .replace(/&gt;/g, `>`)
269
- .replace(/&quot;/g, `"`)
270
- .replace(/&#39;/g, `'`)
274
+ .replaceAll('&amp;', `&`)
275
+ .replaceAll('&lt;', `<`)
276
+ .replaceAll('&gt;', `>`)
277
+ .replaceAll('&quot;', `"`)
278
+ .replaceAll('&#39;', `'`)
271
279
  if (next_decoded === decoded) break
272
280
  decoded = next_decoded
273
281
  }
@@ -336,7 +344,7 @@
336
344
  // Match by entry_id or common data fields (mat_id, structure_id)
337
345
  // since entry_id may be wrapped in HTML (e.g. <a> tags)
338
346
  const entry_data = entry.data as Record<string, unknown> | undefined
339
- const is_highlighted = !!(highlighted_entry_id && (
347
+ const is_highlighted = Boolean(highlighted_entry_id && (
340
348
  entry.entry_id === highlighted_entry_id ||
341
349
  entry_data?.mat_id === highlighted_entry_id ||
342
350
  entry_data?.structure_id === highlighted_entry_id
@@ -430,67 +438,11 @@
430
438
  ] satisfies Label[],
431
439
  )
432
440
 
433
- const html_to_text = (val: unknown): string => {
434
- if (val == null) return ``
435
- if (typeof val !== `string`) return String(val)
436
- const temp_el = document.createElement(`div`)
437
- temp_el.innerHTML = val
438
- return temp_el.textContent?.trim() ?? ``
439
- }
440
- const csv_escape = (val: string): string =>
441
- /[",\n]/.test(val) ? `"${val.replaceAll(`"`, `""`)}"` : val
442
- const get_export_filename = (format: `csv` | `json`): string => {
443
- const system = (phase_stats?.chemical_system ?? `convex-hull-stats`)
444
- .toLowerCase()
445
- .replaceAll(/\s+/g, `-`)
446
- return `${system}.${format}`
447
- }
448
- const build_export_rows = () => {
449
- const column_labels = table_columns.map((col) => col.label)
450
- return table_data.map((row) =>
451
- Object.fromEntries(
452
- column_labels.map((label) => [html_to_text(label), html_to_text(row[label])]),
453
- )
454
- )
455
- }
456
- const download_file = (
457
- content: string,
458
- filename: string,
459
- mime_type: string,
460
- ): void => {
461
- const blob = new Blob([content], { type: mime_type })
462
- const object_url = URL.createObjectURL(blob)
463
- const link_el = document.createElement(`a`)
464
- link_el.href = object_url
465
- link_el.download = filename
466
- document.body.append(link_el)
467
- link_el.click()
468
- link_el.remove()
469
- URL.revokeObjectURL(object_url)
470
- }
471
- function export_table(format: `csv` | `json`): void {
472
- const rows = build_export_rows()
473
- if (format === `json`) {
474
- download_file(
475
- JSON.stringify(rows, null, 2),
476
- get_export_filename(`json`),
477
- `application/json;charset=utf-8`,
478
- )
479
- return
480
- }
481
- const headers = rows.length > 0 ? Object.keys(rows[0]) : []
482
- const csv_lines = [
483
- headers.map(csv_escape).join(`,`),
484
- ...rows.map((row) =>
485
- headers.map((header) => csv_escape(row[header] ?? ``)).join(`,`)
486
- ),
487
- ]
488
- download_file(
489
- csv_lines.join(`\n`),
490
- get_export_filename(`csv`),
491
- `text/csv;charset=utf-8`,
492
- )
493
- }
441
+ // Filename for HeatmapTable's built-in CSV/JSON export
442
+ const export_filename = $derived(
443
+ phase_stats?.chemical_system?.toLowerCase().replaceAll(/\s+/g, `-`) ??
444
+ `convex-hull-stats`,
445
+ )
494
446
  </script>
495
447
 
496
448
  {#snippet stats_panel()}
@@ -617,39 +569,6 @@
617
569
  </label>
618
570
  {/if}
619
571
  <span class="filter-count">{visible_entries.length} entries</span>
620
- <span class="filter-spacer"></span>
621
- <div class="export-actions">
622
- <button
623
- class="icon-btn"
624
- class:active={show_export_dropdown}
625
- title="Export"
626
- onclick={() => show_export_dropdown = !show_export_dropdown}
627
- >
628
- <Icon icon="Export" style="width: 14px" />
629
- </button>
630
- {#if show_export_dropdown}
631
- <div class="export-dropdown">
632
- <button
633
- class="dropdown-option"
634
- onclick={() => {
635
- export_table(`csv`)
636
- show_export_dropdown = false
637
- }}
638
- >
639
- <Icon icon="Download" style="width: 12px" /> CSV
640
- </button>
641
- <button
642
- class="dropdown-option"
643
- onclick={() => {
644
- export_table(`json`)
645
- show_export_dropdown = false
646
- }}
647
- >
648
- <Icon icon="Download" style="width: 12px" /> JSON
649
- </button>
650
- </div>
651
- {/if}
652
- </div>
653
572
  </div>
654
573
  <HeatmapTable
655
574
  data={table_data}
@@ -659,7 +578,7 @@
659
578
  style="width: 100%"
660
579
  root_style={table_root_style}
661
580
  onrowclick={on_entry_click ? handle_row_click : undefined}
662
- export_data={false}
581
+ export_data={{ filename: export_filename }}
663
582
  />
664
583
  {/snippet}
665
584
 
@@ -826,64 +745,6 @@
826
745
  font-size: inherit;
827
746
  }
828
747
  }
829
- .filter-spacer {
830
- flex: 1 1 auto;
831
- }
832
- .export-actions {
833
- position: relative;
834
- .icon-btn {
835
- padding: 2pt 6pt;
836
- border: 1px solid
837
- var(--hull-stats-border-color, color-mix(in srgb, currentColor 20%, transparent));
838
- border-radius: 3pt;
839
- background: transparent;
840
- color: inherit;
841
- cursor: pointer;
842
- display: inline-flex;
843
- align-items: center;
844
- justify-content: center;
845
- }
846
- .icon-btn:hover {
847
- background: color-mix(in srgb, currentColor 8%, transparent);
848
- }
849
- .icon-btn.active {
850
- background: color-mix(in srgb, currentColor 12%, transparent);
851
- }
852
- }
853
- .export-dropdown {
854
- position: absolute;
855
- right: 0;
856
- top: calc(100% + 4px);
857
- display: flex;
858
- flex-direction: column;
859
- min-width: 88px;
860
- padding: 3pt;
861
- border: 1px solid
862
- var(--hull-stats-border-color, color-mix(in srgb, currentColor 20%, transparent));
863
- border-radius: 4pt;
864
- background: var(--page-bg, Canvas);
865
- z-index: 4;
866
- box-shadow: 0 2px 8px color-mix(in srgb, black 20%, transparent);
867
- .dropdown-option {
868
- display: inline-flex;
869
- align-items: center;
870
- gap: 5px;
871
- border: none;
872
- border-radius: 3pt;
873
- background: transparent;
874
- color: inherit;
875
- cursor: pointer;
876
- text-align: left;
877
- padding: 3pt 6pt;
878
- }
879
- .dropdown-option:hover {
880
- background: color-mix(in srgb, currentColor 8%, transparent);
881
- }
882
- }
883
- .table-pane :global(.control-buttons) {
884
- display: none;
885
- margin: 0;
886
- }
887
748
  .filter-count {
888
749
  color: var(--text-color-muted, light-dark(#666, #bbb));
889
750
  font-size: 0.9em;
@@ -1,11 +1,13 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
- import type { ConvexHullEntry, PhaseStats } from './types';
2
+ import type { ConvexHullEntry, EntryCategoryConfig, PhaseStats } from './types';
3
3
  type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
4
4
  phase_stats: PhaseStats | null;
5
5
  stable_entries: ConvexHullEntry[];
6
6
  unstable_entries: ConvexHullEntry[];
7
7
  show_stable?: boolean;
8
8
  show_unstable?: boolean;
9
+ entry_category?: EntryCategoryConfig | null;
10
+ hidden_categories?: string[];
9
11
  layout?: `toggle` | `side-by-side`;
10
12
  on_entry_click?: (entry: ConvexHullEntry) => void;
11
13
  highlighted_entry_id?: string;
@@ -7,19 +7,22 @@
7
7
  import { TooltipContent } from '../tooltip'
8
8
  import type { PolymorphStats } from './helpers'
9
9
  import type { ConvexHullTooltipProp, TooltipSnippetProps } from './index'
10
- import type { HighlightStyle, PhaseData } from './types'
11
- import { is_unary_entry } from './helpers'
10
+ import type { EntryCategoryConfig, HighlightStyle, PhaseData } from './types'
11
+ import { MAGNETIC_ORDERING_CATEGORY } from './types'
12
+ import { get_entry_category, is_unary_entry } from './helpers'
12
13
 
13
14
  let {
14
15
  entry,
15
16
  polymorph_stats_map,
16
17
  highlight_style,
18
+ entry_category = MAGNETIC_ORDERING_CATEGORY,
17
19
  tooltip,
18
20
  show_fractional = true,
19
21
  }: {
20
22
  entry: EntryT
21
23
  polymorph_stats_map?: Map<string, PolymorphStats>
22
24
  highlight_style?: HighlightStyle
25
+ entry_category?: EntryCategoryConfig | null
23
26
  tooltip?: ConvexHullTooltipProp<EntryT>
24
27
  show_fractional?: boolean
25
28
  } = $props()
@@ -36,6 +39,7 @@
36
39
  ? polymorph_stats_map.get(entry.entry_id)
37
40
  : null,
38
41
  )
42
+ const category_value = $derived(get_entry_category(entry, entry_category))
39
43
  </script>
40
44
 
41
45
  <TooltipContent
@@ -69,6 +73,11 @@
69
73
  {#if entry.e_form_per_atom != null}
70
74
  <div>E<sub>form</sub>: {format_num(entry.e_form_per_atom, `.3~`)} eV/atom</div>
71
75
  {/if}
76
+ {#if entry_category && category_value}
77
+ <div title={entry_category.labels?.[category_value]}>
78
+ {entry_category.label}: {category_value}
79
+ </div>
80
+ {/if}
72
81
 
73
82
  {#if show_fractional && !is_element}
74
83
  {@const total = Object.values(entry.composition).reduce(
@@ -1,11 +1,12 @@
1
1
  import type { PolymorphStats } from './helpers';
2
2
  import type { ConvexHullTooltipProp } from './index';
3
- import type { HighlightStyle, PhaseData } from './types';
3
+ import type { EntryCategoryConfig, HighlightStyle, PhaseData } from './types';
4
4
  declare function $$render<EntryT extends PhaseData = PhaseData>(): {
5
5
  props: {
6
6
  entry: EntryT;
7
7
  polymorph_stats_map?: Map<string, PolymorphStats>;
8
8
  highlight_style?: HighlightStyle;
9
+ entry_category?: EntryCategoryConfig | null;
9
10
  tooltip?: ConvexHullTooltipProp<EntryT>;
10
11
  show_fractional?: boolean;
11
12
  };
@@ -64,7 +64,7 @@
64
64
 
65
65
  // Convert slider position (0-100) to pressure
66
66
  const slider_to_pressure = (value: number): number =>
67
- Math.pow(10, LOG_P_MIN + (value / 100) * LOG_P_RANGE)
67
+ 10 ** (LOG_P_MIN + (value / 100) * LOG_P_RANGE)
68
68
 
69
69
  // Format gas name for display (subscript numbers)
70
70
  const format_gas_name = (gas: GasSpecies): string =>
@@ -94,7 +94,7 @@
94
94
  gas: GasSpecies,
95
95
  event: Event & { currentTarget: HTMLInputElement },
96
96
  ): void {
97
- const P = slider_to_pressure(+event.currentTarget.value)
97
+ const P = slider_to_pressure(Number(event.currentTarget.value))
98
98
  pressures = { ...pressures, [gas]: P }
99
99
  // Clear only this gas's preview (don't reset other sliders being dragged simultaneously)
100
100
  const { [gas]: _removed_preview, ...remaining_previews } = preview_pressures
@@ -103,8 +103,8 @@
103
103
 
104
104
  function set_pressure_direct(gas: GasSpecies, value: number): void {
105
105
  const clamped = Math.max(
106
- Math.pow(10, LOG_P_MIN),
107
- Math.min(Math.pow(10, LOG_P_MAX), value),
106
+ 10 ** LOG_P_MIN,
107
+ Math.min(10 ** LOG_P_MAX, value),
108
108
  )
109
109
  pressures = { ...pressures, [gas]: clamped }
110
110
  }
@@ -25,7 +25,7 @@
25
25
  function handle_slider_input(
26
26
  event: Event & { currentTarget: HTMLInputElement },
27
27
  ): void {
28
- const new_index = +event.currentTarget.value
28
+ const new_index = Number(event.currentTarget.value)
29
29
  preview_index = new_index
30
30
  // Throttle parent updates during drag to prevent scene flashing
31
31
  const now = Date.now()
@@ -38,7 +38,7 @@
38
38
  function handle_slider_end(
39
39
  event: Event & { currentTarget: HTMLInputElement },
40
40
  ): void {
41
- const new_temp = available_temperatures[+event.currentTarget.value]
41
+ const new_temp = available_temperatures[Number(event.currentTarget.value)]
42
42
  if (new_temp !== undefined) temperature = new_temp
43
43
  preview_index = null
44
44
  }
@@ -1,13 +1,11 @@
1
1
  import type { ElementSymbol } from '../element';
2
- import type { Point3D, Vec3 } from '../math';
2
+ import type { Point3D, Vec2, Vec3 } from '../math';
3
3
  import type { ConvexHullEntry, PhaseData } from './types';
4
4
  export declare const TRIANGLE_VERTICES: readonly [readonly [1, 0], readonly [0.5, number], readonly [0, 0]];
5
5
  export declare function composition_to_barycentric_3d(composition: Record<string, number>, elements: ElementSymbol[]): Vec3;
6
- export declare function barycentric_to_ternary_xy(barycentric: Vec3): [number, number];
6
+ export declare function barycentric_to_ternary_xy(barycentric: Vec3): Vec2;
7
7
  export declare function barycentric_to_ternary_xyz(barycentric: Vec3, formation_energy: number): Point3D;
8
8
  export declare function get_triangle_centroid(): Point3D;
9
- export declare function calculate_face_normal(p1: Point3D, p2: Point3D, p3: Point3D): Point3D;
10
- export declare const calculate_face_centroid: (p1: Point3D, p2: Point3D, p3: Point3D) => Point3D;
11
9
  export declare function get_ternary_3d_coordinates(entries: PhaseData[], elements: ElementSymbol[], el_refs?: Record<string, PhaseData>): ConvexHullEntry[];
12
10
  export declare function get_triangle_edges(): [Point3D, Point3D][];
13
11
  export declare function get_triangle_vertical_edges(min_z: number, max_z: number): [Point3D, Point3D][];
@@ -10,13 +10,7 @@ export function composition_to_barycentric_3d(composition, elements) {
10
10
  if (elements.length !== 3) {
11
11
  throw new Error(`Ternary system requires exactly 3 elements, got ${elements.length}`);
12
12
  }
13
- const amounts = elements.map((el) => composition[el] || 0);
14
- const total = amounts.reduce((sum, amt) => sum + amt, 0);
15
- if (total === 0) {
16
- throw new Error(`Composition has no elements from the ternary system: ${elements.join(`-`)}`);
17
- }
18
- const normalized = amounts.map((amount) => amount / total);
19
- return [normalized[0], normalized[1], normalized[2]];
13
+ return composition_to_barycentric_nd(composition, elements);
20
14
  }
21
15
  // map barycentric coordinates to triangular 2D coordinates
22
16
  export function barycentric_to_ternary_xy(barycentric) {
@@ -37,22 +31,6 @@ export function get_triangle_centroid() {
37
31
  const centroid_y = (v0[1] + v1[1] + v2[1]) / 3;
38
32
  return { x: centroid_x, y: centroid_y, z: 0 };
39
33
  }
40
- export function calculate_face_normal(p1, p2, p3) {
41
- const edge1 = { x: p2.x - p1.x, y: p2.y - p1.y, z: p2.z - p1.z };
42
- const edge2 = { x: p3.x - p1.x, y: p3.y - p1.y, z: p3.z - p1.z };
43
- const nx = edge1.y * edge2.z - edge1.z * edge2.y;
44
- const ny = edge1.z * edge2.x - edge1.x * edge2.z;
45
- const nz = edge1.x * edge2.y - edge1.y * edge2.x;
46
- const magnitude = Math.hypot(nx, ny, nz);
47
- if (magnitude === 0)
48
- return { x: 0, y: 0, z: 1 };
49
- return { x: nx / magnitude, y: ny / magnitude, z: nz / magnitude };
50
- }
51
- export const calculate_face_centroid = (p1, p2, p3) => ({
52
- x: (p1.x + p2.x + p3.x) / 3,
53
- y: (p1.y + p2.y + p3.y) / 3,
54
- z: (p1.z + p2.z + p3.z) / 3,
55
- });
56
34
  export function get_ternary_3d_coordinates(entries, elements, el_refs) {
57
35
  if (elements.length !== 3) {
58
36
  throw new Error(`Ternary convex hull requires exactly 3 elements, got ${elements.length}`);
@@ -105,14 +83,14 @@ export function get_triangle_vertical_edges(min_z, max_z) {
105
83
  { ...vertex, z: max_z },
106
84
  ]);
107
85
  }
108
- // --- N-dimensional barycentric coordinates (for 5+ element systems) ---
86
+ // --- N-dimensional barycentric coordinates (the 3D/4D converters wrap this) ---
109
87
  // Convert composition to N-dimensional barycentric coordinates
110
88
  // Returns array of length N where coords sum to 1 (all N coords are explicit)
111
89
  // The last coordinate represents formation energy when used in hull calculations
112
90
  export function composition_to_barycentric_nd(composition, elements) {
113
- const n = elements.length;
114
- if (n < 2) {
115
- throw new Error(`Barycentric coordinates require at least 2 elements, got ${n}`);
91
+ const n_elems = elements.length;
92
+ if (n_elems < 2) {
93
+ throw new Error(`Barycentric coordinates require at least 2 elements, got ${n_elems}`);
116
94
  }
117
95
  // NaN and undefined/missing elements are treated as 0
118
96
  const amounts = elements.map((el) => {
@@ -146,12 +124,7 @@ export function composition_to_barycentric_4d(composition, elements) {
146
124
  if (elements.length !== 4) {
147
125
  throw new Error(`Quaternary barycentric coordinates require exactly 4 elements`);
148
126
  }
149
- const amounts = elements.map((el) => composition[el] || 0);
150
- const total = amounts.reduce((sum, amount) => sum + amount, 0);
151
- if (total === 0) {
152
- throw new Error(`Composition has no elements from the quaternary system: ${elements.join(`-`)}`);
153
- }
154
- return amounts.map((amount) => amount / total);
127
+ return composition_to_barycentric_nd(composition, elements);
155
128
  }
156
129
  // map barycentric coordinates to tetrahedral 3D coordinates
157
130
  export function barycentric_to_tetrahedral(barycentric) {
@@ -0,0 +1,79 @@
1
+ import type { AnyStructure } from '../structure';
2
+ import type { ConvexHullEntry, EntryCategoryConfig, HoverData3D, PhaseData } from './types';
3
+ export interface CanvasInteractionInputs {
4
+ wheel_clamp: [min: number, max: number];
5
+ fullscreen_bg_var: string;
6
+ canvas: () => HTMLCanvasElement | undefined;
7
+ wrapper: () => HTMLDivElement | undefined;
8
+ ctx: () => CanvasRenderingContext2D | null;
9
+ set_ctx: (ctx: CanvasRenderingContext2D | null) => void;
10
+ set_canvas_dims: (dims: {
11
+ width: number;
12
+ height: number;
13
+ scale: number;
14
+ }) => void;
15
+ visible_entries: () => ConvexHullEntry[];
16
+ plot_entries: () => ConvexHullEntry[];
17
+ selected_entry: () => ConvexHullEntry | null;
18
+ set_selected_entry: (entry: ConvexHullEntry | null) => void;
19
+ fullscreen: () => boolean;
20
+ enable_click_selection: () => boolean;
21
+ enable_structure_preview: () => boolean;
22
+ on_point_click: () => ((entry: ConvexHullEntry) => void) | undefined;
23
+ on_point_hover: () => ((data: HoverData3D | null) => void) | undefined;
24
+ on_file_drop: () => ((entries: PhaseData[]) => void) | undefined;
25
+ entry_category: () => EntryCategoryConfig | null;
26
+ zoom: () => number;
27
+ set_zoom: (zoom: number) => void;
28
+ project_point: (x: number, y: number, z: number) => {
29
+ x: number;
30
+ y: number;
31
+ depth: number;
32
+ };
33
+ extract_structure: (entry: ConvexHullEntry) => AnyStructure | null;
34
+ render_frame: () => void;
35
+ on_drag: (dx: number, dy: number, panning: boolean) => void;
36
+ on_fullscreen_change: () => void;
37
+ actions: () => Record<string, () => void>;
38
+ }
39
+ export declare function create_canvas_interactions(inputs: CanvasInteractionInputs): {
40
+ readonly is_dragging: boolean;
41
+ readonly hover_data: HoverData3D<ConvexHullEntry> | null;
42
+ readonly drag_over: boolean;
43
+ readonly modal_open: boolean;
44
+ readonly selected_structure: AnyStructure | null;
45
+ readonly modal_place_right: boolean;
46
+ readonly sorted_points_cache: {
47
+ entry: ConvexHullEntry;
48
+ projected: {
49
+ x: number;
50
+ y: number;
51
+ depth: number;
52
+ };
53
+ }[];
54
+ copy_feedback: {
55
+ visible: boolean;
56
+ position: {
57
+ x: number;
58
+ y: number;
59
+ };
60
+ };
61
+ canvas_handlers: {
62
+ onmousedown: (event: MouseEvent) => void;
63
+ onmousemove: (event: MouseEvent) => void;
64
+ onclick: (event: MouseEvent) => void;
65
+ onkeydown: (event: KeyboardEvent) => void;
66
+ ondblclick: (event: MouseEvent) => void;
67
+ onwheel: (event: WheelEvent) => void;
68
+ };
69
+ wrapper_handlers: {
70
+ onkeydown: (event: KeyboardEvent) => void;
71
+ ondrop: (event: DragEvent) => Promise<void>;
72
+ ondragover: (event: DragEvent) => void;
73
+ ondragleave: (event: DragEvent) => void;
74
+ };
75
+ handle_mouse_move: (event: MouseEvent) => void;
76
+ handle_mouse_up: () => void;
77
+ close_structure_popup: () => void;
78
+ render_once: () => void;
79
+ };