matterviz 0.4.1 → 0.4.3

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 (499) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +48 -60
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/api/optimade.js +10 -7
  6. package/dist/app.css +68 -0
  7. package/dist/brillouin/BrillouinZone.svelte +90 -91
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +5 -7
  9. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +18 -14
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +6 -10
  12. package/dist/brillouin/BrillouinZoneScene.svelte +46 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  14. package/dist/brillouin/compute.js +10 -16
  15. package/dist/brillouin/geometry.js +2 -2
  16. package/dist/chempot-diagram/ChemPotDiagram.svelte +48 -50
  17. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +61 -169
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +1 -1
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +559 -755
  20. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +1 -1
  21. package/dist/chempot-diagram/async-compute.svelte.js +13 -14
  22. package/dist/chempot-diagram/color.d.ts +21 -1
  23. package/dist/chempot-diagram/color.js +70 -1
  24. package/dist/chempot-diagram/compute.d.ts +7 -0
  25. package/dist/chempot-diagram/compute.js +85 -26
  26. package/dist/chempot-diagram/controls-state.svelte.js +1 -1
  27. package/dist/chempot-diagram/export.js +1 -6
  28. package/dist/chempot-diagram/temperature.js +9 -10
  29. package/dist/colors/index.d.ts +0 -4
  30. package/dist/colors/index.js +19 -20
  31. package/dist/composition/BarChart.svelte +30 -26
  32. package/dist/composition/BubbleChart.svelte +17 -17
  33. package/dist/composition/Composition.svelte +10 -19
  34. package/dist/composition/Formula.svelte +20 -27
  35. package/dist/composition/FormulaFilter.svelte +115 -184
  36. package/dist/composition/PieChart.svelte +55 -41
  37. package/dist/composition/format.js +7 -9
  38. package/dist/composition/index.d.ts +2 -0
  39. package/dist/composition/index.js +14 -0
  40. package/dist/composition/parse.d.ts +2 -2
  41. package/dist/composition/parse.js +61 -115
  42. package/dist/constants.d.ts +0 -1
  43. package/dist/constants.js +17 -26
  44. package/dist/convex-hull/ConvexHull.svelte +12 -15
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +93 -94
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +127 -186
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +131 -180
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullChrome.svelte +36 -40
  53. package/dist/convex-hull/ConvexHullControls.svelte +46 -48
  54. package/dist/convex-hull/ConvexHullStats.svelte +193 -195
  55. package/dist/convex-hull/ConvexHullTooltip.svelte +5 -12
  56. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  57. package/dist/convex-hull/StructurePopup.svelte +18 -22
  58. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  59. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  60. package/dist/convex-hull/canvas-interactions.svelte.js +2 -1
  61. package/dist/convex-hull/gas-thermodynamics.js +21 -53
  62. package/dist/convex-hull/helpers.d.ts +8 -10
  63. package/dist/convex-hull/helpers.js +37 -43
  64. package/dist/convex-hull/hull-state.svelte.d.ts +1 -1
  65. package/dist/convex-hull/thermodynamics.js +37 -44
  66. package/dist/coordination/CoordinationBarPlot.svelte +49 -53
  67. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  68. package/dist/coordination/calc-coordination.d.ts +1 -1
  69. package/dist/coordination/calc-coordination.js +28 -25
  70. package/dist/element/BohrAtom.svelte +5 -9
  71. package/dist/element/ElementHeading.svelte +4 -1
  72. package/dist/element/ElementPhoto.svelte +11 -9
  73. package/dist/element/ElementStats.svelte +12 -10
  74. package/dist/element/ElementTile.svelte +44 -67
  75. package/dist/element/Nucleus.svelte +4 -2
  76. package/dist/element/data.d.ts +3 -2
  77. package/dist/element/data.js +5 -1
  78. package/dist/element/helpers.d.ts +4 -0
  79. package/dist/element/helpers.js +18 -0
  80. package/dist/element/index.d.ts +2 -5
  81. package/dist/element/index.js +4 -19
  82. package/dist/feedback/DragOverlay.svelte +5 -5
  83. package/dist/feedback/DragOverlay.svelte.d.ts +2 -2
  84. package/dist/feedback/StatusMessage.svelte +7 -4
  85. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  86. package/dist/fermi-surface/FermiSurface.svelte +35 -44
  87. package/dist/fermi-surface/FermiSurface.svelte.d.ts +7 -13
  88. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  89. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  90. package/dist/fermi-surface/FermiSurfaceScene.svelte +64 -136
  91. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  92. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  93. package/dist/fermi-surface/compute.js +25 -58
  94. package/dist/fermi-surface/parse.js +54 -88
  95. package/dist/file-viewer/JsonBrowser.svelte +1043 -0
  96. package/dist/file-viewer/JsonBrowser.svelte.d.ts +9 -0
  97. package/dist/file-viewer/PlotPanel.svelte +350 -0
  98. package/dist/file-viewer/PlotPanel.svelte.d.ts +9 -0
  99. package/dist/file-viewer/TrajectoryWithDos.svelte +30 -0
  100. package/dist/file-viewer/TrajectoryWithDos.svelte.d.ts +10 -0
  101. package/dist/file-viewer/detect.d.ts +11 -0
  102. package/dist/file-viewer/detect.js +381 -0
  103. package/dist/file-viewer/eligibility.d.ts +4 -0
  104. package/dist/file-viewer/eligibility.js +53 -0
  105. package/dist/file-viewer/host-protocol.d.ts +50 -0
  106. package/dist/file-viewer/host-transfer.d.ts +25 -0
  107. package/dist/file-viewer/host-transfer.js +42 -0
  108. package/dist/file-viewer/index.d.ts +5 -0
  109. package/dist/file-viewer/index.js +5 -0
  110. package/dist/file-viewer/main.d.ts +44 -0
  111. package/dist/file-viewer/main.js +535 -0
  112. package/dist/file-viewer/parse.d.ts +9 -0
  113. package/dist/file-viewer/parse.js +170 -0
  114. package/dist/file-viewer/plot-utils.d.ts +24 -0
  115. package/dist/file-viewer/plot-utils.js +191 -0
  116. package/dist/file-viewer/types.d.ts +4 -0
  117. package/dist/file-viewer/types.js +5 -0
  118. package/dist/heatmap-matrix/HeatmapMatrix.svelte +153 -219
  119. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +2 -2
  120. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +9 -7
  121. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +1 -1
  122. package/dist/heatmap-matrix/index.d.ts +5 -0
  123. package/dist/icons.d.ts +4 -0
  124. package/dist/icons.js +4 -0
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +1 -1
  127. package/dist/io/ExportPane.svelte +11 -7
  128. package/dist/io/decompress.d.ts +4 -1
  129. package/dist/io/decompress.js +24 -36
  130. package/dist/io/export.d.ts +11 -4
  131. package/dist/io/export.js +75 -19
  132. package/dist/io/fetch.d.ts +0 -3
  133. package/dist/io/fetch.js +0 -11
  134. package/dist/io/file-drop.js +60 -35
  135. package/dist/io/index.d.ts +0 -1
  136. package/dist/io/index.js +2 -9
  137. package/dist/io/is-binary.d.ts +9 -0
  138. package/dist/io/is-binary.js +45 -1
  139. package/dist/io/url-drop.d.ts +2 -0
  140. package/dist/io/url-drop.js +40 -40
  141. package/dist/isosurface/Isosurface.svelte +700 -215
  142. package/dist/isosurface/Isosurface.svelte.d.ts +7 -1
  143. package/dist/isosurface/IsosurfaceControls.svelte +590 -116
  144. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +1 -1
  145. package/dist/isosurface/VolumeSlice.svelte +224 -0
  146. package/dist/isosurface/VolumeSlice.svelte.d.ts +28 -0
  147. package/dist/isosurface/coloring.d.ts +20 -0
  148. package/dist/isosurface/coloring.js +118 -0
  149. package/dist/isosurface/geometry-worker-types.d.ts +38 -0
  150. package/dist/isosurface/geometry.worker.d.ts +1 -0
  151. package/dist/isosurface/geometry.worker.js +59 -0
  152. package/dist/isosurface/grid.d.ts +10 -0
  153. package/dist/isosurface/grid.js +31 -0
  154. package/dist/isosurface/index.d.ts +4 -0
  155. package/dist/isosurface/index.js +4 -0
  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 +6 -6
  159. package/dist/isosurface/profile.d.ts +12 -0
  160. package/dist/isosurface/profile.js +19 -0
  161. package/dist/isosurface/sampling.d.ts +34 -0
  162. package/dist/isosurface/sampling.js +408 -0
  163. package/dist/isosurface/slice-rendering.d.ts +13 -0
  164. package/dist/isosurface/slice-rendering.js +79 -0
  165. package/dist/isosurface/slice.d.ts +22 -2
  166. package/dist/isosurface/slice.js +200 -116
  167. package/dist/isosurface/types.d.ts +24 -1
  168. package/dist/isosurface/types.js +120 -8
  169. package/dist/json-path.d.ts +4 -0
  170. package/dist/json-path.js +89 -0
  171. package/dist/labels.d.ts +6 -2
  172. package/dist/labels.js +44 -14
  173. package/dist/layout/FullscreenButton.svelte +2 -1
  174. package/dist/layout/FullscreenToggle.svelte +10 -4
  175. package/dist/layout/InfoCard.svelte +8 -21
  176. package/dist/layout/InfoTag.svelte +1 -3
  177. package/dist/layout/NumberRangeInput.svelte +46 -0
  178. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  179. package/dist/layout/PropertyFilter.svelte +2 -6
  180. package/dist/layout/SettingsSection.svelte +57 -62
  181. package/dist/layout/SettingsSection.svelte.d.ts +6 -7
  182. package/dist/layout/SubpageGrid.svelte +3 -1
  183. package/dist/layout/ViewerChrome.svelte +16 -11
  184. package/dist/layout/ViewerChrome.svelte.d.ts +2 -1
  185. package/dist/layout/fullscreen.js +3 -5
  186. package/dist/layout/fullscreen.svelte.js +1 -2
  187. package/dist/layout/index.d.ts +1 -0
  188. package/dist/layout/index.js +1 -0
  189. package/dist/layout/json-tree/JsonNode.svelte +22 -59
  190. package/dist/layout/json-tree/JsonTree.svelte +101 -172
  191. package/dist/layout/json-tree/JsonValue.svelte +9 -32
  192. package/dist/layout/json-tree/utils.d.ts +0 -3
  193. package/dist/layout/json-tree/utils.js +50 -188
  194. package/dist/marching-cubes.d.ts +8 -1
  195. package/dist/marching-cubes.js +115 -48
  196. package/dist/math.d.ts +5 -2
  197. package/dist/math.js +48 -38
  198. package/dist/overlays/ContextMenu.svelte +19 -34
  199. package/dist/overlays/CopyButton.svelte +11 -5
  200. package/dist/overlays/DragControlTab.svelte +6 -1
  201. package/dist/overlays/DraggablePane.svelte +110 -74
  202. package/dist/overlays/DraggablePane.svelte.d.ts +2 -1
  203. package/dist/overlays/GlassChip.svelte +32 -0
  204. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  205. package/dist/overlays/InfoPaneCards.svelte +11 -23
  206. package/dist/overlays/index.d.ts +7 -0
  207. package/dist/overlays/index.js +26 -0
  208. package/dist/overlays/portal.d.ts +2 -0
  209. package/dist/overlays/portal.js +14 -0
  210. package/dist/periodic-table/PeriodicTable.svelte +113 -145
  211. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  212. package/dist/periodic-table/PeriodicTableControls.svelte +37 -115
  213. package/dist/periodic-table/TableInset.svelte +9 -4
  214. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +68 -105
  215. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  216. package/dist/phase-diagram/PhaseDiagramControls.svelte +70 -94
  217. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  218. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  219. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +12 -12
  220. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  221. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  222. package/dist/phase-diagram/build-diagram.js +4 -9
  223. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  224. package/dist/phase-diagram/parse.js +15 -15
  225. package/dist/phase-diagram/svg-to-diagram.js +28 -27
  226. package/dist/phase-diagram/utils.js +2 -3
  227. package/dist/plot/bar/BarPlot.svelte +461 -426
  228. package/dist/plot/bar/BarPlot.svelte.d.ts +2 -0
  229. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  230. package/dist/plot/bar/BarPlotControls.svelte.d.ts +4 -6
  231. package/dist/plot/bar/SpacegroupBarPlot.svelte +46 -77
  232. package/dist/plot/bar/data.d.ts +5 -4
  233. package/dist/plot/bar/data.js +2 -1
  234. package/dist/plot/box/BoxPlot.svelte +322 -226
  235. package/dist/plot/box/BoxPlot.svelte.d.ts +2 -0
  236. package/dist/plot/box/Violin.svelte.d.ts +1 -0
  237. package/dist/plot/box/box-plot.js +1 -1
  238. package/dist/plot/core/auto-place.d.ts +1 -1
  239. package/dist/plot/core/auto-place.js +2 -2
  240. package/dist/plot/core/axis-utils.d.ts +12 -7
  241. package/dist/plot/core/axis-utils.js +48 -48
  242. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  243. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  244. package/dist/plot/core/components/ColorBar.svelte +101 -106
  245. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  246. package/dist/plot/core/components/FillArea.svelte +10 -17
  247. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  248. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  249. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  250. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  251. package/dist/plot/core/components/Line.svelte +18 -9
  252. package/dist/plot/core/components/Line.svelte.d.ts +2 -0
  253. package/dist/plot/core/components/PlotAxis.svelte +40 -17
  254. package/dist/plot/core/components/PlotControls.svelte +65 -41
  255. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  256. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  257. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  258. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  259. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  260. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  261. package/dist/plot/core/components/ReferenceLine3D.svelte +54 -57
  262. package/dist/plot/core/components/ReferencePlane.svelte +7 -8
  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 +27 -474
  271. package/dist/plot/core/data-transform.d.ts +1 -2
  272. package/dist/plot/core/data-transform.js +9 -15
  273. package/dist/plot/core/fill-utils.d.ts +3 -1
  274. package/dist/plot/core/fill-utils.js +28 -6
  275. package/dist/plot/core/index.d.ts +1 -0
  276. package/dist/plot/core/index.js +1 -0
  277. package/dist/plot/core/interactions.js +0 -2
  278. package/dist/plot/core/layout.d.ts +15 -6
  279. package/dist/plot/core/layout.js +57 -38
  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 +2 -4
  283. package/dist/plot/core/pan-zoom.svelte.js +34 -17
  284. package/dist/plot/core/placed-tween.svelte.d.ts +3 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -21
  286. package/dist/plot/core/reference-line.js +1 -1
  287. package/dist/plot/core/scales.d.ts +23 -0
  288. package/dist/plot/core/scales.js +39 -13
  289. package/dist/plot/core/svg.js +0 -1
  290. package/dist/plot/core/types/fills.d.ts +101 -0
  291. package/dist/plot/core/types/fills.js +15 -0
  292. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  293. package/dist/plot/core/types/plot-3d.js +4 -0
  294. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  295. package/dist/plot/core/types/reference-lines.js +9 -0
  296. package/dist/plot/core/types.d.ts +29 -324
  297. package/dist/plot/core/types.js +23 -20
  298. package/dist/plot/core/utils/hierarchy-chart.d.ts +52 -0
  299. package/dist/plot/core/utils/hierarchy-chart.js +191 -0
  300. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  301. package/dist/plot/core/utils/hierarchy-labels.js +100 -0
  302. package/dist/plot/core/utils/label-placement.js +2 -2
  303. package/dist/plot/histogram/Histogram.svelte +314 -340
  304. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  305. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  306. package/dist/plot/histogram/histogram.d.ts +31 -0
  307. package/dist/plot/histogram/histogram.js +70 -0
  308. package/dist/plot/histogram/index.d.ts +1 -0
  309. package/dist/plot/histogram/index.js +1 -0
  310. package/dist/plot/index.d.ts +1 -0
  311. package/dist/plot/index.js +1 -0
  312. package/dist/plot/sankey/Sankey.svelte +78 -69
  313. package/dist/plot/sankey/Sankey.svelte.d.ts +2 -2
  314. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  315. package/dist/plot/sankey/sankey.js +13 -9
  316. package/dist/plot/scatter/BinnedScatterPlot.svelte +311 -141
  317. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +7 -0
  318. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  319. package/dist/plot/scatter/ScatterPlot.svelte +517 -410
  320. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +2 -0
  321. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  322. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  323. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  324. package/dist/plot/scatter/adaptive-density.d.ts +1 -1
  325. package/dist/plot/scatter/adaptive-density.js +36 -20
  326. package/dist/plot/scatter/binned-scatter-types.d.ts +3 -2
  327. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  328. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  329. package/dist/plot/scatter/scatter-data.js +8 -7
  330. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +25 -34
  331. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +2 -2
  332. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +8 -5
  333. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +113 -116
  334. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +2 -2
  335. package/dist/plot/scatter-3d/Surface3D.svelte +4 -13
  336. package/dist/plot/sunburst/Sunburst.svelte +269 -347
  337. package/dist/plot/sunburst/Sunburst.svelte.d.ts +2 -2
  338. package/dist/plot/sunburst/index.d.ts +1 -1
  339. package/dist/plot/sunburst/index.js +2 -1
  340. package/dist/plot/sunburst/render.d.ts +2 -2
  341. package/dist/plot/sunburst/render.js +47 -22
  342. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  343. package/dist/plot/sunburst/sunburst.js +10 -3
  344. package/dist/plot/treemap/Treemap.svelte +1022 -0
  345. package/dist/plot/treemap/Treemap.svelte.d.ts +90 -0
  346. package/dist/plot/treemap/index.d.ts +4 -0
  347. package/dist/plot/treemap/index.js +4 -0
  348. package/dist/plot/treemap/labels.d.ts +38 -0
  349. package/dist/plot/treemap/labels.js +80 -0
  350. package/dist/plot/treemap/treemap.d.ts +28 -0
  351. package/dist/plot/treemap/treemap.js +102 -0
  352. package/dist/rdf/RdfPlot.svelte +37 -59
  353. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  354. package/dist/rdf/calc-rdf.js +63 -52
  355. package/dist/rdf/index.d.ts +0 -1
  356. package/dist/sanitize.js +85 -27
  357. package/dist/scene/SceneCamera.svelte +1 -1
  358. package/dist/scene/SceneCamera.svelte.d.ts +1 -1
  359. package/dist/scene/bind-renderer.svelte.js +14 -6
  360. package/dist/scene/index.d.ts +1 -2
  361. package/dist/scene/index.js +1 -1
  362. package/dist/scene/{props.js → props.svelte.js} +15 -1
  363. package/dist/settings.d.ts +19 -9
  364. package/dist/settings.js +229 -525
  365. package/dist/spectral/Bands.svelte +207 -221
  366. package/dist/spectral/BandsAndDos.svelte +11 -9
  367. package/dist/spectral/BrillouinBandsDos.svelte +19 -42
  368. package/dist/spectral/Dos.svelte +92 -93
  369. package/dist/spectral/helpers.d.ts +3 -3
  370. package/dist/spectral/helpers.js +65 -140
  371. package/dist/state.svelte.js +5 -18
  372. package/dist/structure/Arrow.svelte +5 -18
  373. package/dist/structure/ArrowInstances.svelte +160 -0
  374. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  375. package/dist/structure/AtomLegend.svelte +120 -85
  376. package/dist/structure/AtomLegend.svelte.d.ts +2 -3
  377. package/dist/structure/Bond.svelte +31 -23
  378. package/dist/structure/CanvasTooltip.svelte +15 -3
  379. package/dist/structure/CellSelect.svelte +45 -35
  380. package/dist/structure/Cylinder.svelte +24 -40
  381. package/dist/structure/InstancedAtoms.svelte +114 -0
  382. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  383. package/dist/structure/Lattice.svelte +85 -149
  384. package/dist/structure/SiteLabels.svelte +122 -0
  385. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  386. package/dist/structure/Structure.svelte +636 -504
  387. package/dist/structure/Structure.svelte.d.ts +4 -2
  388. package/dist/structure/StructureCarousel.svelte +637 -0
  389. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  390. package/dist/structure/StructureControls.svelte +165 -425
  391. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  392. package/dist/structure/StructureExportPane.svelte +17 -21
  393. package/dist/structure/StructureInfoPane.svelte +128 -133
  394. package/dist/structure/StructureInfoPane.svelte.d.ts +1 -1
  395. package/dist/structure/StructureScene.svelte +535 -578
  396. package/dist/structure/StructureScene.svelte.d.ts +6 -2
  397. package/dist/structure/StructureViewport.svelte +451 -0
  398. package/dist/structure/StructureViewport.svelte.d.ts +65 -0
  399. package/dist/structure/atom-label-placement.d.ts +16 -12
  400. package/dist/structure/atom-label-placement.js +70 -37
  401. package/dist/structure/atom-properties.d.ts +2 -0
  402. package/dist/structure/atom-properties.js +105 -38
  403. package/dist/structure/bond-order-perception.js +3 -8
  404. package/dist/structure/bonding.d.ts +9 -3
  405. package/dist/structure/bonding.js +95 -46
  406. package/dist/structure/edit-history.d.ts +6 -0
  407. package/dist/structure/edit-history.js +27 -0
  408. package/dist/structure/export.d.ts +1 -0
  409. package/dist/structure/export.js +89 -105
  410. package/dist/structure/format-detect.d.ts +1 -0
  411. package/dist/structure/format-detect.js +20 -0
  412. package/dist/structure/geometry.d.ts +9 -0
  413. package/dist/structure/geometry.js +27 -0
  414. package/dist/structure/index.d.ts +16 -1
  415. package/dist/structure/index.js +15 -10
  416. package/dist/structure/measure.d.ts +1 -1
  417. package/dist/structure/measure.js +6 -12
  418. package/dist/structure/parse.d.ts +2 -1
  419. package/dist/structure/parse.js +272 -313
  420. package/dist/structure/partial-occupancy.js +10 -5
  421. package/dist/structure/pbc.js +85 -107
  422. package/dist/structure/polyhedra.d.ts +0 -1
  423. package/dist/structure/polyhedra.js +7 -21
  424. package/dist/structure/prop-groups.d.ts +85 -0
  425. package/dist/structure/prop-groups.js +18 -0
  426. package/dist/structure/supercell.d.ts +1 -2
  427. package/dist/structure/supercell.js +7 -13
  428. package/dist/symmetry/SymmetryElements.svelte +11 -15
  429. package/dist/symmetry/SymmetryStats.svelte +55 -71
  430. package/dist/symmetry/WyckoffTable.svelte +10 -28
  431. package/dist/symmetry/cell-transform.js +6 -14
  432. package/dist/symmetry/index.d.ts +1 -0
  433. package/dist/symmetry/index.js +13 -10
  434. package/dist/symmetry/spacegroups.js +3 -2
  435. package/dist/table/HeatmapTable.svelte +1142 -447
  436. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  437. package/dist/table/ToggleMenu.svelte +168 -53
  438. package/dist/table/ToggleMenu.svelte.d.ts +1 -1
  439. package/dist/table/index.d.ts +21 -6
  440. package/dist/table/index.js +34 -21
  441. package/dist/theme/ThemeControl.svelte +16 -8
  442. package/dist/theme/embedded.d.ts +18 -0
  443. package/dist/theme/embedded.js +206 -0
  444. package/dist/theme/index.d.ts +5 -5
  445. package/dist/theme/index.js +5 -12
  446. package/dist/theme/themes.mjs +44 -66
  447. package/dist/tooltip/KCoords.svelte +4 -1
  448. package/dist/tooltip/TooltipContent.svelte +3 -6
  449. package/dist/tooltip/TooltipContent.svelte.d.ts +1 -1
  450. package/dist/tooltip/index.d.ts +8 -1
  451. package/dist/trajectory/Trajectory.svelte +613 -386
  452. package/dist/trajectory/Trajectory.svelte.d.ts +1 -1
  453. package/dist/trajectory/TrajectoryError.svelte +12 -74
  454. package/dist/trajectory/TrajectoryExportPane.svelte +14 -32
  455. package/dist/trajectory/TrajectoryInfoPane.svelte +127 -164
  456. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +2 -1
  457. package/dist/trajectory/extract.js +61 -49
  458. package/dist/trajectory/format-detect.d.ts +2 -0
  459. package/dist/trajectory/format-detect.js +17 -13
  460. package/dist/trajectory/frame-reader.d.ts +2 -0
  461. package/dist/trajectory/frame-reader.js +35 -32
  462. package/dist/trajectory/helpers.d.ts +2 -0
  463. package/dist/trajectory/helpers.js +34 -56
  464. package/dist/trajectory/index.d.ts +1 -0
  465. package/dist/trajectory/index.js +5 -8
  466. package/dist/trajectory/parse/ase.js +1 -1
  467. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  468. package/dist/trajectory/parse/h5-utils.js +109 -0
  469. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  470. package/dist/trajectory/parse/hdf5.js +116 -106
  471. package/dist/trajectory/parse/index.d.ts +6 -6
  472. package/dist/trajectory/parse/index.js +25 -33
  473. package/dist/trajectory/parse/lammps.js +8 -12
  474. package/dist/trajectory/parse/vasp.js +10 -7
  475. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  476. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  477. package/dist/trajectory/parse/vaspout-h5.d.ts +4 -0
  478. package/dist/trajectory/parse/vaspout-h5.js +281 -0
  479. package/dist/trajectory/parse/xyz.js +59 -9
  480. package/dist/trajectory/plotting.d.ts +8 -9
  481. package/dist/trajectory/plotting.js +113 -64
  482. package/dist/utils.d.ts +3 -0
  483. package/dist/utils.js +7 -0
  484. package/dist/xrd/XrdPlot.svelte +79 -118
  485. package/dist/xrd/broadening.js +2 -1
  486. package/dist/xrd/calc-xrd.js +24 -62
  487. package/dist/xrd/parse.d.ts +0 -1
  488. package/dist/xrd/parse.js +69 -95
  489. package/package.json +94 -34
  490. package/readme.md +6 -5
  491. package/dist/api/mp.d.ts +0 -6
  492. package/dist/api/mp.js +0 -22
  493. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  494. package/dist/scene/types.d.ts +0 -26
  495. package/dist/tooltip/types.d.ts +0 -8
  496. package/dist/trajectory/constants.d.ts +0 -6
  497. package/dist/trajectory/constants.js +0 -11
  498. /package/dist/{scene/types.js → file-viewer/host-protocol.js} +0 -0
  499. /package/dist/{tooltip/types.js → isosurface/geometry-worker-types.js} +0 -0
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { D3InterpolateName } from '../colors'
3
+ import { clamp01 } from '../utils'
3
4
  import {
4
5
  add_alpha,
5
6
  AXIS_COLORS,
@@ -15,9 +16,14 @@
15
16
  import { sanitize_html } from '../sanitize'
16
17
  import { Spinner } from '../feedback'
17
18
  import { format_num } from '../labels'
18
- import { to_radians, type Point3D, type Vec2, type Vec3 } from '../math'
19
+ import { to_radians, type Vec2, type Vec3 } from '../math'
19
20
  import { ColorBar } from '../plot'
20
- import { centered_rect, pad_rect, rects_overlap, rect_within_rect } from '../plot/core/layout'
21
+ import {
22
+ centered_rect,
23
+ pad_rect,
24
+ rects_overlap,
25
+ rect_within_rect,
26
+ } from '../plot/core/layout'
21
27
  import type { Rect } from '../plot/core/layout'
22
28
  import { create_pulse_animation } from '../effects.svelte'
23
29
  import { DEFAULTS } from '../settings'
@@ -76,9 +82,7 @@
76
82
  ),
77
83
  element_colors = vesta_hex,
78
84
  color_mode = $bindable(DEFAULTS.convex_hull.ternary.color_mode),
79
- color_scale = $bindable(
80
- DEFAULTS.convex_hull.ternary.color_scale as D3InterpolateName,
81
- ),
85
+ color_scale = $bindable(DEFAULTS.convex_hull.ternary.color_scale as D3InterpolateName),
82
86
  info_pane_open = $bindable(DEFAULTS.convex_hull.ternary.info_pane_open),
83
87
  controls_open = $bindable(DEFAULTS.convex_hull.ternary.legend_pane_open),
84
88
  max_hull_dist_show_phases = $bindable(
@@ -88,9 +92,7 @@
88
92
  DEFAULTS.convex_hull.ternary.max_hull_dist_show_labels,
89
93
  ),
90
94
  show_stable_labels = $bindable(DEFAULTS.convex_hull.ternary.show_stable_labels),
91
- show_unstable_labels = $bindable(
92
- DEFAULTS.convex_hull.ternary.show_unstable_labels,
93
- ),
95
+ show_unstable_labels = $bindable(DEFAULTS.convex_hull.ternary.show_unstable_labels),
94
96
  on_file_drop,
95
97
  enable_click_selection = true,
96
98
  enable_structure_preview = true,
@@ -110,9 +112,10 @@
110
112
  children,
111
113
  tooltip,
112
114
  ...rest
113
- }: BaseConvexHullProps<ConvexHullEntry> & Hull3DProps & {
114
- highlight_style?: HighlightStyle
115
- } = $props()
115
+ }: BaseConvexHullProps<ConvexHullEntry> &
116
+ Hull3DProps & {
117
+ highlight_style?: HighlightStyle
118
+ } = $props()
116
119
 
117
120
  const merged_controls = $derived({ ...default_controls, ...controls })
118
121
  const controls_config = $derived(normalize_show_controls(show_controls))
@@ -120,7 +123,6 @@
120
123
  ...default_hull_config,
121
124
  ...config,
122
125
  colors: { ...default_hull_config.colors, ...config.colors },
123
- margin: { t: 40, r: 40, b: 60, l: 60, ...config.margin },
124
126
  })
125
127
 
126
128
  // Shared reactive data pipeline (temperature → gas → energy mode → hull data → threshold)
@@ -140,11 +142,11 @@
140
142
  show_unstable: () => show_unstable,
141
143
  entry_category: () => entry_category,
142
144
  hidden_categories: () => hidden_categories,
143
- keep_plot_entry: (entry, max_dist) => (entry.e_above_hull ?? 0) <= max_dist,
144
- set_temperature: (next_temp) => temperature = next_temp,
145
- set_max_hull_dist_show_phases: (value) => max_hull_dist_show_phases = value,
146
- set_stable_entries: (value) => stable_entries = value,
147
- set_unstable_entries: (value) => unstable_entries = value,
145
+ keep_plot_entry: helpers.entry_within_hull_dist,
146
+ set_temperature: (next_temp) => (temperature = next_temp),
147
+ set_max_hull_dist_show_phases: (value) => (max_hull_dist_show_phases = value),
148
+ set_stable_entries: (value) => (stable_entries = value),
149
+ set_unstable_entries: (value) => (unstable_entries = value),
148
150
  })
149
151
  const has_temp_data = $derived(hull_data.has_temp_data)
150
152
  const gas_analysis = $derived(hull_data.gas_analysis)
@@ -159,11 +161,7 @@
159
161
  if (elements.length !== 3) return []
160
162
  try {
161
163
  // Pass precomputed el_refs to avoid recomputing in error diagnostics
162
- const coords = get_ternary_3d_coordinates(
163
- pd_data.entries,
164
- elements,
165
- pd_data.el_refs,
166
- )
164
+ const coords = get_ternary_3d_coordinates(pd_data.entries, elements, pd_data.el_refs)
167
165
  return coords
168
166
  } catch (error) {
169
167
  console.error(`Error computing ternary coordinates:`, error)
@@ -188,7 +186,7 @@
188
186
  })
189
187
 
190
188
  // Cached hull model for e_above_hull queries; recompute only when faces change
191
- let hull_model = $derived.by(() => thermo.build_lower_hull_model(hull_faces))
189
+ const hull_model = $derived(thermo.build_lower_hull_model(hull_faces))
192
190
 
193
191
  // Enrich coords with e_above_hull from cached hull model (before filtering)
194
192
  const all_enriched_entries = $derived.by(() => {
@@ -196,8 +194,10 @@
196
194
  if (hull_data.energy_mode !== `on-the-fly`) return coords_entries
197
195
  const pts = coords_entries.map(({ x, y, z }) => ({ x, y, z }))
198
196
  const raw_dists = thermo.compute_e_above_hull_for_points(pts, hull_model)
197
+ // non-finite distance (no covering hull face) -> unknown, handled by compute_hull_stability
199
198
  return coords_entries.map((entry, idx) => ({
200
- ...entry, ...compute_hull_stability(raw_dists[idx], entry.exclude_from_hull),
199
+ ...entry,
200
+ ...compute_hull_stability(raw_dists[idx], entry.exclude_from_hull),
201
201
  }))
202
202
  })
203
203
 
@@ -224,23 +224,11 @@
224
224
  let gizmo_active = $state(false)
225
225
 
226
226
  // Convert elevation/azimuth (degrees) to Three.js camera position + up vector.
227
- function gizmo_camera(
228
- elev_deg: number,
229
- azim_deg: number,
230
- ): { position: Vec3; up: Vec3 } {
227
+ function gizmo_camera(elev_deg: number, azim_deg: number): { position: Vec3; up: Vec3 } {
231
228
  const [elev, azim] = [to_radians(elev_deg), to_radians(azim_deg)]
232
- const [se, ce, sa, ca] = [
233
- Math.sin(elev),
234
- Math.cos(elev),
235
- Math.sin(azim),
236
- Math.cos(azim),
237
- ]
229
+ const [se, ce, sa, ca] = [Math.sin(elev), Math.cos(elev), Math.sin(azim), Math.cos(azim)]
238
230
  return {
239
- position: [
240
- -sa * se * GIZMO_CAM_DIST,
241
- -ca * se * GIZMO_CAM_DIST,
242
- ce * GIZMO_CAM_DIST,
243
- ],
231
+ position: [-sa * se * GIZMO_CAM_DIST, -ca * se * GIZMO_CAM_DIST, ce * GIZMO_CAM_DIST],
244
232
  up: [sa * ce, ca * ce, se],
245
233
  }
246
234
  }
@@ -256,7 +244,7 @@
256
244
  camera.center_x = 0
257
245
  // 0.6 matches the draw_data_points() scale factor that maps data coords to canvas pixels
258
246
  const scale = Math.min(canvas_dims.width, canvas_dims.height) * 0.6 * camera.zoom
259
- camera.center_y = Math.sqrt(3) / 12 * scale * Math.cos(to_radians(elev_deg))
247
+ camera.center_y = (Math.sqrt(3) / 12) * scale * Math.cos(to_radians(elev_deg))
260
248
  }
261
249
 
262
250
  // Sync: ConvexHull3D → Three.js gizmo camera (on main canvas drag)
@@ -276,14 +264,15 @@
276
264
  const cam = gizmo_cam_ref
277
265
  if (!cam) return
278
266
  const { x: cx, y: cy, z: cz } = cam.position
279
- const dist = Math.sqrt(cx * cx + cy * cy + cz * cz)
267
+ const dist = Math.hypot(cx, cy, cz)
280
268
  if (dist < 1e-6) return
281
269
  const elev_rad = Math.acos(Math.max(-1, Math.min(1, cz / dist)))
282
270
  const sin_elev = Math.sin(elev_rad)
283
- const azim_deg = Math.abs(sin_elev) > 1e-6
284
- ? Math.atan2(-cx / (dist * sin_elev), -cy / (dist * sin_elev)) * 180 / Math.PI
285
- : 0
286
- const elev_deg = elev_rad * 180 / Math.PI
271
+ const azim_deg =
272
+ Math.abs(sin_elev) > 1e-6
273
+ ? (Math.atan2(-cx / (dist * sin_elev), -cy / (dist * sin_elev)) * 180) / Math.PI
274
+ : 0
275
+ const elev_deg = (elev_rad * 180) / Math.PI
287
276
  camera.elevation = elev_deg
288
277
  camera.azimuth = azim_deg
289
278
  center_camera(elev_deg)
@@ -291,14 +280,15 @@
291
280
 
292
281
  // Gizmo axis colors (constant — AXIS_COLORS/NEG_AXIS_COLORS never change)
293
282
  const gizmo_axis_options = Object.fromEntries(
294
- [...AXIS_COLORS, ...NEG_AXIS_COLORS].map((
295
- [axis, color, hover_color],
296
- ) => [axis, {
297
- color,
298
- labelColor: `#111`,
299
- opacity: 0.85,
300
- hover: { color: hover_color, labelColor: `#222`, opacity: 1 },
301
- }]),
283
+ [...AXIS_COLORS, ...NEG_AXIS_COLORS].map(([axis, color, hover_color]) => [
284
+ axis,
285
+ {
286
+ color,
287
+ labelColor: `#111`,
288
+ opacity: 0.85,
289
+ hover: { color: hover_color, labelColor: `#222`, opacity: 1 },
290
+ },
291
+ ]),
302
292
  )
303
293
 
304
294
  // Extract placement from gizmo options (not a Threlte Gizmo prop)
@@ -328,12 +318,12 @@
328
318
  canvas: () => canvas,
329
319
  wrapper: () => wrapper,
330
320
  ctx: () => ctx,
331
- set_ctx: (context) => ctx = context,
332
- set_canvas_dims: (dims) => canvas_dims = dims,
321
+ set_ctx: (context) => (ctx = context),
322
+ set_canvas_dims: (dims) => (canvas_dims = dims),
333
323
  visible_entries: () => visible_entries,
334
324
  plot_entries: () => plot_entries,
335
325
  selected_entry: () => selected_entry,
336
- set_selected_entry: (entry) => selected_entry = entry,
326
+ set_selected_entry: (entry) => (selected_entry = entry),
337
327
  fullscreen: () => fullscreen,
338
328
  enable_click_selection: () => enable_click_selection,
339
329
  enable_structure_preview: () => enable_structure_preview,
@@ -342,7 +332,7 @@
342
332
  on_file_drop: () => on_file_drop,
343
333
  entry_category: () => entry_category,
344
334
  zoom: () => camera.zoom,
345
- set_zoom: (zoom) => camera.zoom = zoom,
335
+ set_zoom: (zoom) => (camera.zoom = zoom),
346
336
  project_point: project_3d_point,
347
337
  extract_structure: extract_structure_from_entry,
348
338
  render_frame,
@@ -369,11 +359,11 @@
369
359
  camera.azimuth = 0
370
360
  center_camera(0)
371
361
  },
372
- b: () => color_mode = color_mode === `stability` ? `energy` : `stability`,
373
- s: () => show_stable = !show_stable,
374
- u: () => show_unstable = !show_unstable,
375
- h: () => show_hull_faces = !show_hull_faces,
376
- l: () => show_stable_labels = !show_stable_labels,
362
+ b: () => (color_mode = color_mode === `stability` ? `energy` : `stability`),
363
+ s: () => (show_stable = !show_stable),
364
+ u: () => (show_unstable = !show_unstable),
365
+ h: () => (show_hull_faces = !show_hull_faces),
366
+ l: () => (show_stable_labels = !show_stable_labels),
377
367
  }),
378
368
  })
379
369
  const { render_once } = interactions
@@ -390,9 +380,7 @@
390
380
  let pulse_opacity = $derived(0.3 + 0.4 * pulse.unit)
391
381
 
392
382
  // Merge highlight style with defaults
393
- const merged_highlight_style = $derived(
394
- helpers.merge_highlight_style(highlight_style),
395
- )
383
+ const merged_highlight_style = $derived(helpers.merge_highlight_style(highlight_style))
396
384
 
397
385
  // Helper to check if entry is highlighted
398
386
  const is_highlighted = (entry: ConvexHullEntry): boolean =>
@@ -443,8 +431,8 @@
443
431
  )
444
432
 
445
433
  // Cache energy color scale per frame/setting
446
- const energy_color_scale = $derived.by(() =>
447
- helpers.get_energy_color_scale(color_mode, color_scale, plot_entries)
434
+ const energy_color_scale = $derived(
435
+ helpers.get_energy_color_scale(color_mode, color_scale, plot_entries),
448
436
  )
449
437
 
450
438
  // Convex hull statistics - compute internally and expose via bindable prop
@@ -460,10 +448,7 @@
460
448
  ): { x: number; y: number; depth: number } {
461
449
  if (!canvas) return { x: 0, y: 0, depth: 0 }
462
450
 
463
- const [elev, azim] = [
464
- (camera.elevation * Math.PI) / 180,
465
- (camera.azimuth * Math.PI) / 180,
466
- ]
451
+ const [elev, azim] = [(camera.elevation * Math.PI) / 180, (camera.azimuth * Math.PI) / 180]
467
452
  const [cos_az, sin_az, cos_el, sin_el] = [
468
453
  Math.cos(azim),
469
454
  Math.sin(azim),
@@ -486,68 +471,38 @@
486
471
  }
487
472
  }
488
473
 
474
+ // Dashed triangle outline: base triangle at E_form = 0, bottom triangle at the most
475
+ // negative formation energy, and vertical edges connecting corresponding corners
489
476
  function draw_structure_outline(): void {
490
477
  if (!ctx || !canvas) return
491
478
 
492
- // Set consistent style for all triangle structure lines
493
479
  ctx.strokeStyle = CONVEX_HULL_STYLE.structure_line.color
494
480
  ctx.lineWidth = CONVEX_HULL_STYLE.structure_line.line_width
495
- ctx.setLineDash(CONVEX_HULL_STYLE.structure_line.dash) // Dashed lines for all structure lines
496
-
497
- // Draw triangle base and vertical edges
498
- draw_triangle_structure()
499
- }
500
-
501
- function draw_triangle_structure(): void {
502
- if (!ctx || !canvas) return
481
+ ctx.setLineDash(CONVEX_HULL_STYLE.structure_line.dash)
503
482
 
504
- // Get formation energy range for vertical edges
505
- const e_form_min = energy_range.min // Includes 0 for elemental references
506
- const e_form_max = energy_range.max // Includes 0 for elemental references
507
-
508
- // Draw base triangle edges (top triangle at formation energy = 0)
483
+ const { min: e_form_min } = energy_range
509
484
  const triangle_edges = get_triangle_edges()
510
485
  ctx.beginPath()
511
- for (const [v1, v2] of triangle_edges) {
512
- const proj1 = project_3d_point(v1.x, v1.y, 0) // Base triangle at formation energy = 0
513
- const proj2 = project_3d_point(v2.x, v2.y, 0)
514
-
515
- ctx.moveTo(proj1.x, proj1.y)
516
- ctx.lineTo(proj2.x, proj2.y)
486
+ for (const z_plane of [0, e_form_min]) {
487
+ for (const [v1, v2] of triangle_edges) {
488
+ const proj1 = project_3d_point(v1.x, v1.y, z_plane)
489
+ const proj2 = project_3d_point(v2.x, v2.y, z_plane)
490
+ ctx.moveTo(proj1.x, proj1.y)
491
+ ctx.lineTo(proj2.x, proj2.y)
492
+ }
517
493
  }
518
- ctx.stroke()
519
-
520
- // Draw vertical edges from corners (from most negative to 0 formation energy)
521
- const vertical_edges = get_triangle_vertical_edges(
522
- e_form_min,
523
- e_form_max,
524
- )
525
- ctx.beginPath()
526
- for (const [v1, v2] of vertical_edges) {
494
+ for (const [v1, v2] of get_triangle_vertical_edges(e_form_min, 0)) {
527
495
  const proj1 = project_3d_point(v1.x, v1.y, v1.z)
528
496
  const proj2 = project_3d_point(v2.x, v2.y, v2.z)
529
-
530
- ctx.moveTo(proj1.x, proj1.y)
531
- ctx.lineTo(proj2.x, proj2.y)
532
- }
533
- ctx.stroke()
534
-
535
- // Draw bottom triangle (connecting the bottom tips of vertical lines)
536
- const bottom_triangle_edges = get_triangle_edges()
537
- ctx.beginPath()
538
- for (const [v1, v2] of bottom_triangle_edges) {
539
- const proj1 = project_3d_point(v1.x, v1.y, e_form_min) // Bottom triangle at most negative energy
540
- const proj2 = project_3d_point(v2.x, v2.y, e_form_min)
541
-
542
497
  ctx.moveTo(proj1.x, proj1.y)
543
498
  ctx.lineTo(proj2.x, proj2.y)
544
499
  }
545
500
  ctx.stroke()
546
501
 
547
- // Reset stroke style to default for other elements
548
- const styles = getComputedStyle(canvas)
549
- ctx.strokeStyle = styles.getPropertyValue(`--hull-edge-color`) || `#212121`
550
- ctx.setLineDash([]) // Reset line dash for other drawing operations
502
+ // Reset stroke style and line dash for subsequent drawing operations
503
+ ctx.strokeStyle =
504
+ getComputedStyle(canvas).getPropertyValue(`--hull-edge-color`) || `#212121`
505
+ ctx.setLineDash([])
551
506
  }
552
507
 
553
508
  function draw_element_labels(): void {
@@ -562,15 +517,11 @@
562
517
  ctx.textAlign = `center`
563
518
  ctx.textBaseline = `middle`
564
519
 
565
- for (
566
- let idx = 0;
567
- idx < TRIANGLE_VERTICES.length && idx < elements.length;
568
- idx++
569
- ) {
520
+ for (let idx = 0; idx < TRIANGLE_VERTICES.length && idx < elements.length; idx++) {
570
521
  const [x, y] = TRIANGLE_VERTICES[idx]
571
522
  const dx = x - centroid.x
572
523
  const dy = y - centroid.y
573
- const length = Math.sqrt(dx * dx + dy * dy)
524
+ const length = Math.hypot(dx, dy)
574
525
  const distance = 0.05
575
526
 
576
527
  const label_pos = {
@@ -596,14 +547,10 @@
596
547
 
597
548
  // Find the vertex that projects to the leftmost x-position (changes with rotation)
598
549
  const projected_vertices = TRIANGLE_VERTICES.map(([vx, vy]) =>
599
- project_3d_point(vx, vy, e_mid)
550
+ project_3d_point(vx, vy, e_mid),
600
551
  )
601
552
  const leftmost_idx = projected_vertices.reduce(
602
- (
603
- min_idx,
604
- proj,
605
- idx,
606
- ) => (proj.x < projected_vertices[min_idx].x ? idx : min_idx),
553
+ (min_idx, proj, idx) => (proj.x < projected_vertices[min_idx].x ? idx : min_idx),
607
554
  0,
608
555
  )
609
556
  const [axis_x, axis_y] = TRIANGLE_VERTICES[leftmost_idx]
@@ -667,10 +614,8 @@
667
614
  let energy_face_scale: ((val: number) => string) | null = null
668
615
  let min_face_e_form = 0
669
616
  if (hull_face_color_mode === `formation_energy`) {
670
- const all_e_form = hull_faces.flatMap((tri) =>
671
- tri.vertices.map((vertex) => vertex.z)
672
- )
673
- min_face_e_form = Math.min(...all_e_form)
617
+ const all_e_form = hull_faces.flatMap((tri) => tri.vertices.map((vertex) => vertex.z))
618
+ min_face_e_form = helpers.array_min(all_e_form)
674
619
  energy_face_scale = helpers.get_energy_color_scale(
675
620
  `energy`,
676
621
  color_scale,
@@ -681,10 +626,7 @@
681
626
  }
682
627
 
683
628
  // Helper to get face color based on mode
684
- const get_face_color = (
685
- tri: typeof hull_faces[0],
686
- tri_idx: number,
687
- ): string => {
629
+ const get_face_color = (tri: (typeof hull_faces)[0], tri_idx: number): string => {
688
630
  if (hull_face_color_mode === `uniform`) {
689
631
  return hull_face_color
690
632
  }
@@ -711,11 +653,7 @@
711
653
 
712
654
  // Sort faces by depth for proper rendering
713
655
  const faces_with_depth = hull_faces.map((tri, tri_idx) => {
714
- const centroid_proj = project_3d_point(
715
- tri.centroid.x,
716
- tri.centroid.y,
717
- tri.centroid.z,
718
- )
656
+ const centroid_proj = project_3d_point(tri.centroid.x, tri.centroid.y, tri.centroid.z)
719
657
  return { tri, tri_idx, depth: centroid_proj.depth }
720
658
  })
721
659
 
@@ -740,16 +678,21 @@
740
678
  const a3 = norm_alpha?.(p3.z) ?? 0
741
679
 
742
680
  // Solve a*x + b*y + c = alpha at the three projected vertices
743
- const x1 = proj1.x, y1 = proj1.y
744
- const x2 = proj2.x, y2 = proj2.y
745
- const x3 = proj3.x, y3 = proj3.y
681
+ const x1 = proj1.x,
682
+ y1 = proj1.y
683
+ const x2 = proj2.x,
684
+ y2 = proj2.y
685
+ const x3 = proj3.x,
686
+ y3 = proj3.y
746
687
  const det = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)
747
- let coef_a = 0, coef_b = 0, coef_c = (a1 + a2 + a3) / 3
688
+ let coef_a = 0,
689
+ coef_b = 0,
690
+ coef_c = (a1 + a2 + a3) / 3
748
691
  if (Math.abs(det) > 1e-9) {
749
692
  coef_a = (a1 * (y2 - y3) + a2 * (y3 - y1) + a3 * (y1 - y2)) / det
750
693
  coef_b = (a1 * (x3 - x2) + a2 * (x1 - x3) + a3 * (x2 - x1)) / det
751
- coef_c = (a1 * (x2 * y3 - x3 * y2) + a2 * (x3 * y1 - x1 * y3) +
752
- a3 * (x1 * y2 - x2 * y1)) /
694
+ coef_c =
695
+ (a1 * (x2 * y3 - x3 * y2) + a2 * (x3 * y1 - x1 * y3) + a3 * (x1 * y2 - x2 * y1)) /
753
696
  det
754
697
  }
755
698
 
@@ -826,7 +769,7 @@
826
769
  const denom = Math.max(1e-6, max_fe - min_fe)
827
770
  return (value: number) => {
828
771
  // alpha 0 at 0 eV, goes to hull_face_opacity at most negative energy
829
- const energy_fraction = Math.max(0, Math.min(1, (value - min_fe) / denom))
772
+ const energy_fraction = clamp01((value - min_fe) / denom)
830
773
  const alpha = (1 - energy_fraction) * hull_face_opacity
831
774
  return add_alpha(hull_face_color, alpha)
832
775
  }
@@ -940,18 +883,21 @@
940
883
  ctx.textBaseline = `top`
941
884
  const label_height = hull_label_font_size + 2
942
885
 
943
- const label_entries = helpers.get_composition_label_entries(
944
- visible_entries.filter((entry) => {
945
- if (entry.is_element) return false
946
- const is_stable_point = helpers.entry_is_stable(entry)
947
- return (is_stable_point && show_stable_labels) ||
948
- (!is_stable_point && show_unstable_labels &&
949
- (entry.e_above_hull ?? 0) <= max_hull_dist_show_labels)
950
- }),
951
- )
886
+ const label_entries = helpers
887
+ .get_composition_label_entries(
888
+ visible_entries.filter((entry) => {
889
+ if (entry.is_element) return false
890
+ const is_stable_point = helpers.entry_is_stable(entry)
891
+ return (
892
+ (is_stable_point && show_stable_labels) ||
893
+ (!is_stable_point &&
894
+ show_unstable_labels &&
895
+ (entry.e_above_hull ?? 0) <= max_hull_dist_show_labels)
896
+ )
897
+ }),
898
+ )
952
899
  .sort((entry_1, entry_2) => {
953
- const energy_diff = label_priority_energy(entry_1) -
954
- label_priority_energy(entry_2)
900
+ const energy_diff = label_priority_energy(entry_1) - label_priority_energy(entry_2)
955
901
  if (energy_diff !== 0) return energy_diff
956
902
  return (entry_1.e_above_hull ?? 0) - (entry_2.e_above_hull ?? 0)
957
903
  })
@@ -971,17 +917,13 @@
971
917
  const is_stable_point = helpers.entry_is_stable(entry)
972
918
  const point_size = (entry.size || (is_stable_point ? 6 : 4)) * canvas_dims.scale
973
919
  const text_width = measure_formula_segments(ctx, formula_segments)
974
- const placements = get_label_placements(
975
- projected,
976
- point_size,
977
- text_width,
978
- label_height,
979
- )
980
- const placement = placements.find((candidate) =>
981
- rect_within_rect(candidate.rect, canvas_rect) &&
982
- !occupied_rects.some((occupied_rect) =>
983
- rects_overlap(candidate.rect, occupied_rect)
984
- )
920
+ const placements = get_label_placements(projected, point_size, text_width, label_height)
921
+ const placement = placements.find(
922
+ (candidate) =>
923
+ rect_within_rect(candidate.rect, canvas_rect) &&
924
+ !occupied_rects.some((occupied_rect) =>
925
+ rects_overlap(candidate.rect, occupied_rect),
926
+ ),
985
927
  )
986
928
  if (!placement) continue
987
929
 
@@ -1029,7 +971,7 @@
1029
971
 
1030
972
  // Reactive dark mode detection for canvas text color
1031
973
  let dark_mode = $state(is_dark_mode())
1032
- $effect(() => watch_dark_mode((dark) => dark_mode = dark))
974
+ $effect(() => watch_dark_mode((dark) => (dark_mode = dark)))
1033
975
  const text_color = $derived(helpers.get_canvas_text_color(dark_mode))
1034
976
 
1035
977
  // Performance: Cache canvas dimensions and formation energy range
@@ -1060,7 +1002,7 @@
1060
1002
 
1061
1003
  <div
1062
1004
  {...rest}
1063
- class="convex-hull-3d {rest.class ?? ``}"
1005
+ class={[`convex-hull-3d`, rest.class]}
1064
1006
  class:dragover={interactions.drag_over}
1065
1007
  style={`${style}; ${rest.style ?? ``}`}
1066
1008
  data-has-selection={selected_entry !== null}
@@ -1073,11 +1015,11 @@
1073
1015
  aria-label="Ternary convex hull visualization"
1074
1016
  >
1075
1017
  {@render children?.({
1076
- stable_entries,
1077
- unstable_entries,
1078
- highlighted_entries,
1079
- selected_entry,
1080
- })}
1018
+ stable_entries,
1019
+ unstable_entries,
1020
+ highlighted_entries,
1021
+ selected_entry,
1022
+ })}
1081
1023
  <h3 style="position: absolute; left: 1em; top: 1ex; margin: 0; font-weight: 500">
1082
1024
  {@html sanitize_html(merged_controls.title || phase_stats?.chemical_system || ``)}
1083
1025
  </h3>
@@ -1109,9 +1051,7 @@
1109
1051
 
1110
1052
  <!-- Formation Energy Faces Color Bar (bottom-right corner) -->
1111
1053
  <!-- Only show for uniform/formation_energy modes where face color relates to E_form -->
1112
- {#if plot_entries.length > 0 && show_hull_faces &&
1113
- (hull_face_color_mode === `uniform` ||
1114
- hull_face_color_mode === `formation_energy`)}
1054
+ {#if plot_entries.length > 0 && show_hull_faces && (hull_face_color_mode === `uniform` || hull_face_color_mode === `formation_energy`)}
1115
1055
  <ColorBar
1116
1056
  title="Formation energy (eV/atom)"
1117
1057
  color_scale_fn={e_form_color_scale_fn}
@@ -1169,7 +1109,7 @@
1169
1109
  <div class="gizmo-wrapper {controls_config.class}" data-placement={gizmo_placement}>
1170
1110
  <Canvas
1171
1111
  createRenderer={(cvs: HTMLCanvasElement) =>
1172
- new WebGLRenderer({ canvas: cvs, alpha: true, antialias: true })}
1112
+ new WebGLRenderer({ canvas: cvs, alpha: true, antialias: true })}
1173
1113
  >
1174
1114
  <T.PerspectiveCamera
1175
1115
  makeDefault
@@ -1199,11 +1139,13 @@
1199
1139
  </div>
1200
1140
  {/if}
1201
1141
 
1202
- {#if (has_temp_data && temperature !== undefined) ||
1203
- (gas_analysis.has_gas_dependent_elements && merged_gas_config)}
1142
+ {#if (has_temp_data && temperature !== undefined) || (gas_analysis.has_gas_dependent_elements && merged_gas_config)}
1204
1143
  <div class="right-controls">
1205
1144
  {#if has_temp_data && temperature !== undefined}
1206
- <TemperatureSlider available_temperatures={hull_data.available_temperatures} bind:temperature />
1145
+ <TemperatureSlider
1146
+ available_temperatures={hull_data.available_temperatures}
1147
+ bind:temperature
1148
+ />
1207
1149
  {/if}
1208
1150
  {#if gas_analysis.has_gas_dependent_elements && merged_gas_config}
1209
1151
  <GasPressureControls
@@ -1214,7 +1156,6 @@
1214
1156
  {/if}
1215
1157
  </div>
1216
1158
  {/if}
1217
-
1218
1159
  </div>
1219
1160
 
1220
1161
  <style>
@@ -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 ConvexHull3D: import("svelte").Component<$$ComponentProps, {}, "temperature" | "fullscreen" | "wrapper" | "controls_open" | "color_scale" | "info_pane_open" | "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">;
6
+ declare const ConvexHull3D: 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 ConvexHull3D = ReturnType<typeof ConvexHull3D>;
8
8
  export default ConvexHull3D;