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
@@ -0,0 +1,74 @@
1
+ import type { BasePlotProps, LegendConfig, SankeyData, SankeyHandlerProps, SankeyLinkColorMode, SankeyLinkHandlerProps, SankeyNodeAlign, SankeyNodeHandlerProps, SankeyOrientation } from '..';
2
+ import type { Sides } from '../core/layout';
3
+ import type { PositionedLink, PositionedNode } from './sankey';
4
+ import { type Snippet } from 'svelte';
5
+ import type { HTMLAttributes } from 'svelte/elements';
6
+ declare function $$render<Metadata extends Record<string, unknown> = Record<string, unknown>>(): {
7
+ props: HTMLAttributes<HTMLDivElement> & Omit<BasePlotProps, "change"> & {
8
+ data?: SankeyData<Metadata>;
9
+ orientation?: SankeyOrientation;
10
+ node_width?: number;
11
+ node_padding?: number;
12
+ node_align?: SankeyNodeAlign;
13
+ iterations?: number;
14
+ link_opacity?: number;
15
+ link_color_mode?: SankeyLinkColorMode;
16
+ show_node_labels?: boolean;
17
+ node_label?: (node: PositionedNode) => string;
18
+ value_format?: string;
19
+ padding?: Sides;
20
+ legend?: LegendConfig | null;
21
+ show_legend?: boolean;
22
+ tooltip?: Snippet<[SankeyHandlerProps<Metadata>]>;
23
+ node_content?: Snippet<[{
24
+ node: PositionedNode;
25
+ color: string;
26
+ }]>;
27
+ link_content?: Snippet<[{
28
+ link: PositionedLink;
29
+ color: string;
30
+ }]>;
31
+ change?: (data: SankeyHandlerProps<Metadata> | null) => void;
32
+ on_node_click?: (data: SankeyNodeHandlerProps<Metadata> & {
33
+ event: MouseEvent | KeyboardEvent;
34
+ }) => void;
35
+ on_node_hover?: (data: (SankeyNodeHandlerProps<Metadata> & {
36
+ event: MouseEvent | FocusEvent;
37
+ }) | null) => void;
38
+ on_link_click?: (data: SankeyLinkHandlerProps<Metadata> & {
39
+ event: MouseEvent | KeyboardEvent;
40
+ }) => void;
41
+ on_link_hover?: (data: (SankeyLinkHandlerProps<Metadata> & {
42
+ event: MouseEvent | FocusEvent;
43
+ }) | null) => void;
44
+ header_controls?: Snippet<[{
45
+ height: number;
46
+ width: number;
47
+ fullscreen: boolean;
48
+ }]>;
49
+ controls_extra?: Snippet<[{
50
+ orientation: SankeyOrientation;
51
+ }]>;
52
+ };
53
+ exports: {};
54
+ bindings: "data" | "orientation" | "show_controls" | "fullscreen" | "hovered" | "controls_open" | "node_align" | "node_width" | "node_padding" | "link_opacity" | "show_node_labels";
55
+ slots: {};
56
+ events: {};
57
+ };
58
+ declare class __sveltets_Render<Metadata extends Record<string, unknown> = Record<string, unknown>> {
59
+ props(): ReturnType<typeof $$render<Metadata>>['props'];
60
+ events(): ReturnType<typeof $$render<Metadata>>['events'];
61
+ slots(): ReturnType<typeof $$render<Metadata>>['slots'];
62
+ bindings(): "data" | "orientation" | "show_controls" | "fullscreen" | "hovered" | "controls_open" | "node_align" | "node_width" | "node_padding" | "link_opacity" | "show_node_labels";
63
+ exports(): {};
64
+ }
65
+ interface $$IsomorphicComponent {
66
+ new <Metadata extends Record<string, unknown> = Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Metadata>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Metadata>['props']>, ReturnType<__sveltets_Render<Metadata>['events']>, ReturnType<__sveltets_Render<Metadata>['slots']>> & {
67
+ $$bindings?: ReturnType<__sveltets_Render<Metadata>['bindings']>;
68
+ } & ReturnType<__sveltets_Render<Metadata>['exports']>;
69
+ <Metadata extends Record<string, unknown> = Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<Metadata>['props']> & {}): ReturnType<__sveltets_Render<Metadata>['exports']>;
70
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
71
+ }
72
+ declare const Sankey: $$IsomorphicComponent;
73
+ type Sankey<Metadata extends Record<string, unknown> = Record<string, unknown>> = InstanceType<typeof Sankey<Metadata>>;
74
+ export default Sankey;
@@ -0,0 +1,98 @@
1
+ <script lang="ts">
2
+ import { SettingsSection } from '../../layout'
3
+ import type { SankeyNodeAlign, SankeyOrientation } from '..'
4
+ import ControlPane from '../core/components/ControlPane.svelte'
5
+ import { DEFAULTS } from '../../settings'
6
+ import type { Snippet } from 'svelte'
7
+ import type { HTMLAttributes } from 'svelte/elements'
8
+
9
+ let {
10
+ show_controls = $bindable(true),
11
+ controls_open = $bindable(false),
12
+ orientation = $bindable(DEFAULTS.sankey.orientation),
13
+ node_width = $bindable(DEFAULTS.sankey.node_width),
14
+ node_padding = $bindable(DEFAULTS.sankey.node_padding),
15
+ node_align = $bindable(DEFAULTS.sankey.node_align),
16
+ link_opacity = $bindable(DEFAULTS.sankey.link_opacity),
17
+ show_node_labels = $bindable(DEFAULTS.sankey.show_node_labels),
18
+ toggle_props = {},
19
+ pane_props = {},
20
+ children,
21
+ }: {
22
+ show_controls?: boolean
23
+ controls_open?: boolean
24
+ orientation?: SankeyOrientation
25
+ node_width?: number
26
+ node_padding?: number
27
+ node_align?: SankeyNodeAlign
28
+ link_opacity?: number
29
+ show_node_labels?: boolean
30
+ toggle_props?: HTMLAttributes<HTMLButtonElement>
31
+ pane_props?: HTMLAttributes<HTMLDivElement>
32
+ children?: Snippet
33
+ } = $props()
34
+ </script>
35
+
36
+ {#if show_controls}
37
+ <ControlPane bind:controls_open controls_class="sankey" {toggle_props} {pane_props}>
38
+ {@render children?.()}
39
+ <SettingsSection
40
+ title="Sankey"
41
+ current_values={{
42
+ orientation,
43
+ node_align,
44
+ node_width,
45
+ node_padding,
46
+ link_opacity,
47
+ show_node_labels,
48
+ }}
49
+ on_reset={() => {
50
+ ;({
51
+ orientation,
52
+ node_align,
53
+ node_width,
54
+ node_padding,
55
+ link_opacity,
56
+ show_node_labels,
57
+ } = DEFAULTS.sankey)
58
+ }}
59
+ style="display: flex; flex-wrap: wrap; gap: 2ex"
60
+ >
61
+ <label style="flex: 1">
62
+ Orientation:
63
+ <select bind:value={orientation}>
64
+ <option value="horizontal">Horizontal</option>
65
+ <option value="vertical">Vertical</option>
66
+ </select>
67
+ </label>
68
+ <label style="flex: 1">
69
+ Node align:
70
+ <select bind:value={node_align}>
71
+ <option value="justify">Justify</option>
72
+ <option value="left">Left</option>
73
+ <option value="right">Right</option>
74
+ <option value="center">Center</option>
75
+ </select>
76
+ </label>
77
+ <label style="flex: 1 1 100%">
78
+ Node width:
79
+ <input type="range" min="4" max="60" step="1" bind:value={node_width} />
80
+ <input type="number" min="4" max="60" step="1" bind:value={node_width} />
81
+ </label>
82
+ <label style="flex: 1 1 100%">
83
+ Node padding:
84
+ <input type="range" min="0" max="40" step="1" bind:value={node_padding} />
85
+ <input type="number" min="0" max="40" step="1" bind:value={node_padding} />
86
+ </label>
87
+ <label style="flex: 1 1 100%">
88
+ Link opacity:
89
+ <input type="range" min="0.05" max="1" step="0.05" bind:value={link_opacity} />
90
+ <input type="number" min="0.05" max="1" step="0.05" bind:value={link_opacity} />
91
+ </label>
92
+ <label style="flex: 1 1 100%">
93
+ <input type="checkbox" bind:checked={show_node_labels} />
94
+ Show node labels
95
+ </label>
96
+ </SettingsSection>
97
+ </ControlPane>
98
+ {/if}
@@ -0,0 +1,19 @@
1
+ import type { SankeyNodeAlign, SankeyOrientation } from '..';
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+ type $$ComponentProps = {
5
+ show_controls?: boolean;
6
+ controls_open?: boolean;
7
+ orientation?: SankeyOrientation;
8
+ node_width?: number;
9
+ node_padding?: number;
10
+ node_align?: SankeyNodeAlign;
11
+ link_opacity?: number;
12
+ show_node_labels?: boolean;
13
+ toggle_props?: HTMLAttributes<HTMLButtonElement>;
14
+ pane_props?: HTMLAttributes<HTMLDivElement>;
15
+ children?: Snippet;
16
+ };
17
+ declare const SankeyControls: import("svelte").Component<$$ComponentProps, {}, "orientation" | "show_controls" | "controls_open" | "node_align" | "node_width" | "node_padding" | "link_opacity" | "show_node_labels">;
18
+ type SankeyControls = ReturnType<typeof SankeyControls>;
19
+ export default SankeyControls;
@@ -0,0 +1,4 @@
1
+ export * from './sankey';
2
+ export type * from './sankey-types';
3
+ export { default as Sankey } from './Sankey.svelte';
4
+ export { default as SankeyControls } from './SankeyControls.svelte';
@@ -0,0 +1,3 @@
1
+ export * from './sankey';
2
+ export { default as Sankey } from './Sankey.svelte';
3
+ export { default as SankeyControls } from './SankeyControls.svelte';
@@ -0,0 +1,42 @@
1
+ export type SankeyOrientation = `horizontal` | `vertical`;
2
+ export type SankeyNodeAlign = `left` | `right` | `center` | `justify`;
3
+ export type SankeyLinkColorMode = `source` | `target` | `gradient` | `static`;
4
+ export interface SankeyNode<Metadata = Record<string, unknown>> {
5
+ id?: string | number;
6
+ label?: string;
7
+ color?: string;
8
+ metadata?: Metadata;
9
+ }
10
+ export interface SankeyLink<Metadata = Record<string, unknown>> {
11
+ source: number | string;
12
+ target: number | string;
13
+ value: number;
14
+ color?: string;
15
+ label?: string;
16
+ metadata?: Metadata;
17
+ }
18
+ export interface SankeyData<Metadata = Record<string, unknown>> {
19
+ nodes: SankeyNode<Metadata>[];
20
+ links: SankeyLink<Metadata>[];
21
+ }
22
+ export interface SankeyNodeHandlerProps<Metadata = Record<string, unknown>> {
23
+ type: `node`;
24
+ node_idx: number;
25
+ id: string | number;
26
+ label?: string;
27
+ value: number;
28
+ color: string;
29
+ metadata?: Metadata;
30
+ }
31
+ export interface SankeyLinkHandlerProps<Metadata = Record<string, unknown>> {
32
+ type: `link`;
33
+ link_idx: number;
34
+ source_idx: number;
35
+ target_idx: number;
36
+ source_label?: string;
37
+ target_label?: string;
38
+ value: number;
39
+ color: string;
40
+ metadata?: Metadata;
41
+ }
42
+ export type SankeyHandlerProps<Metadata = Record<string, unknown>> = SankeyNodeHandlerProps<Metadata> | SankeyLinkHandlerProps<Metadata>;
@@ -0,0 +1,4 @@
1
+ // === Sankey diagram types ===
2
+ // Public input/event types for the Sankey component; layout-result types
3
+ // (PositionedNode/PositionedLink) live in sankey.ts next to the layout math.
4
+ export {};
@@ -0,0 +1,52 @@
1
+ import { sankeyCenter, sankeyJustify, sankeyLeft, sankeyRight } from 'd3-sankey';
2
+ import type { SankeyLink as D3Link, SankeyNode as D3Node } from 'd3-sankey';
3
+ import type { SankeyData, SankeyNodeAlign, SankeyOrientation } from '../core/types';
4
+ interface NodeExtra {
5
+ node_idx: number;
6
+ id: string | number;
7
+ label?: string;
8
+ color?: string;
9
+ }
10
+ interface LinkExtra {
11
+ link_idx: number;
12
+ color?: string;
13
+ label?: string;
14
+ }
15
+ export type PositionedNode = D3Node<NodeExtra, LinkExtra> & {
16
+ node_idx: number;
17
+ id: string | number;
18
+ x0: number;
19
+ x1: number;
20
+ y0: number;
21
+ y1: number;
22
+ value: number;
23
+ depth: number;
24
+ };
25
+ export type PositionedLink = D3Link<NodeExtra, LinkExtra> & {
26
+ link_idx: number;
27
+ width: number;
28
+ source: PositionedNode;
29
+ target: PositionedNode;
30
+ path: string;
31
+ mid: {
32
+ x: number;
33
+ y: number;
34
+ };
35
+ };
36
+ export interface SankeyLayoutOptions {
37
+ width: number;
38
+ height: number;
39
+ node_width?: number;
40
+ node_padding?: number;
41
+ node_align?: SankeyNodeAlign;
42
+ orientation?: SankeyOrientation;
43
+ iterations?: number;
44
+ }
45
+ export interface SankeyLayoutResult {
46
+ nodes: PositionedNode[];
47
+ links: PositionedLink[];
48
+ }
49
+ export declare function sankey_from_links(source: readonly number[], target: readonly number[], value: readonly number[], labels?: readonly string[]): SankeyData;
50
+ export declare function compute_sankey_layout<Metadata = Record<string, unknown>>(data: SankeyData<Metadata>, opts: SankeyLayoutOptions): SankeyLayoutResult;
51
+ export declare const sankey_align_fn: (align: SankeyNodeAlign) => typeof sankeyLeft | typeof sankeyRight | typeof sankeyCenter | typeof sankeyJustify;
52
+ export {};
@@ -0,0 +1,189 @@
1
+ // Layout helpers for Sankey diagrams, wrapping d3-sankey.
2
+ // Single source of truth for node/link positioning math so the component stays
3
+ // declarative and the layout is independently unit-testable.
4
+ import { sankey as d3_sankey, sankeyCenter, sankeyJustify, sankeyLeft, sankeyRight, } from 'd3-sankey';
5
+ import { DEFAULTS } from '../../settings';
6
+ const ALIGN_FNS = {
7
+ left: sankeyLeft,
8
+ right: sankeyRight,
9
+ center: sankeyCenter,
10
+ justify: sankeyJustify,
11
+ };
12
+ // Resolve a link source/target reference (id or index) to a node array index.
13
+ // Prefers id lookup (ids may be numeric), falls back to treating numbers as indices.
14
+ function resolve_node_ref(ref, id_to_idx, n_nodes) {
15
+ const by_id = id_to_idx.get(ref);
16
+ if (by_id !== undefined)
17
+ return by_id;
18
+ if (typeof ref === `number` && Number.isInteger(ref) && ref >= 0 && ref < n_nodes) {
19
+ return ref;
20
+ }
21
+ throw new Error(`Sankey link references unknown node: ${JSON.stringify(ref)}`);
22
+ }
23
+ function resolve_numeric_node_ref(ref, n_nodes) {
24
+ if (Number.isInteger(ref) && ref >= 0 && ref < n_nodes)
25
+ return ref;
26
+ throw new Error(`Sankey link references unknown node: ${JSON.stringify(ref)}`);
27
+ }
28
+ // Build a SankeyData object from parallel flat arrays (e.g. the plotly/matbench
29
+ // `link.source`/`link.target`/`link.value` + `node.label` format).
30
+ export function sankey_from_links(source, target, value, labels) {
31
+ if (source.length !== target.length || source.length !== value.length) {
32
+ throw new Error(`sankey_from_links: source (${source.length}), target (${target.length}) and value (${value.length}) must have equal length`);
33
+ }
34
+ // Single pass instead of Math.max(...source, ...target): spreading large index arrays
35
+ // (e.g. spacegroup correspondence matrices) as call args can exceed the arg-count limit.
36
+ let max_idx = -1;
37
+ for (const idx of source)
38
+ if (idx > max_idx)
39
+ max_idx = idx;
40
+ for (const idx of target)
41
+ if (idx > max_idx)
42
+ max_idx = idx;
43
+ // Cover the highest indexed link even when labels is shorter (missing labels fall
44
+ // back to the index string below), so links never reference a non-existent node.
45
+ const n_nodes = Math.max(labels?.length ?? 0, max_idx + 1);
46
+ const nodes = Array.from({ length: n_nodes }, (_, idx) => ({
47
+ id: idx,
48
+ label: labels?.[idx] ?? `${idx}`,
49
+ }));
50
+ const links = source.map((src, idx) => ({
51
+ source: src,
52
+ target: target[idx],
53
+ value: value[idx],
54
+ }));
55
+ return { nodes, links };
56
+ }
57
+ // Vertical ribbon path: mirror of d3's sankeyLinkHorizontal but flowing top->bottom.
58
+ // Reads the raw d3 layout fields (link.y0/y1 are stacking-axis centers, which in
59
+ // vertical mode map to screen x; source.x1/target.x0 are depth positions = screen y).
60
+ function vertical_link_path(link) {
61
+ const x0 = link.y0 ?? 0;
62
+ const x1 = link.y1 ?? 0;
63
+ const y0 = link.source.x1;
64
+ const y1 = link.target.x0;
65
+ const ym = (y0 + y1) / 2;
66
+ return `M${x0},${y0}C${x0},${ym} ${x1},${ym} ${x1},${y1}`;
67
+ }
68
+ function horizontal_link_path(link) {
69
+ const x0 = link.source.x1;
70
+ const x1 = link.target.x0;
71
+ const y0 = link.y0 ?? 0;
72
+ const y1 = link.y1 ?? 0;
73
+ const xm = (x0 + x1) / 2;
74
+ return `M${x0},${y0}C${xm},${y0} ${xm},${y1} ${x1},${y1}`;
75
+ }
76
+ // Compute node boxes and link ribbon paths in screen space.
77
+ // Clones input so the (reactive) user data is never mutated by d3-sankey.
78
+ export function compute_sankey_layout(data, opts) {
79
+ // Fallbacks derive from DEFAULTS.sankey so component and helper defaults can't drift
80
+ const { width, height, node_width = DEFAULTS.sankey.node_width, node_padding = DEFAULTS.sankey.node_padding, node_align = DEFAULTS.sankey.node_align, orientation = DEFAULTS.sankey.orientation, iterations = DEFAULTS.sankey.iterations, } = opts;
81
+ // All-zero link values would make d3-sankey divide by zero (NaN ribbon paths)
82
+ const has_flow = data.links.some((link) => link.value > 0);
83
+ if (!(width > 0) || !(height > 0) || data.nodes.length === 0 || !has_flow)
84
+ return { nodes: [], links: [] };
85
+ // Resolve ids -> indices and clone into fresh objects (d3 mutates these).
86
+ // Links may reference a node by explicit `id`, or by `label` when no id is set,
87
+ // or by zero-based index (handled as a fallback in resolve_node_ref).
88
+ const needs_ref_lookup = data.links.some((link) => typeof link.source !== `number` || typeof link.target !== `number`) || data.nodes.some((node, idx) => typeof node.id === `number` && node.id !== idx);
89
+ let id_to_idx;
90
+ if (needs_ref_lookup) {
91
+ id_to_idx = new Map();
92
+ data.nodes.forEach((node, idx) => {
93
+ const key = node.id ?? node.label;
94
+ if (key === undefined)
95
+ return; // index-only node, resolved via fallback
96
+ if (id_to_idx?.has(key)) {
97
+ console.warn(`Sankey: duplicate node ${node.id !== undefined ? `id` : `label`} "${key}" — links resolve to the last occurrence. Set unique \`id\`s.`);
98
+ }
99
+ id_to_idx?.set(key, idx);
100
+ });
101
+ }
102
+ const node_copies = data.nodes.map((node, idx) => ({
103
+ node_idx: idx,
104
+ id: node.id ?? idx,
105
+ label: node.label,
106
+ color: node.color,
107
+ }));
108
+ // Resolve a source/target ref to a node index: id/label lookup when any link uses
109
+ // non-numeric refs, otherwise a cheap numeric-range check (no map built).
110
+ const resolve_ref = (ref) => needs_ref_lookup
111
+ ? resolve_node_ref(ref, id_to_idx, data.nodes.length)
112
+ : resolve_numeric_node_ref(ref, data.nodes.length);
113
+ const link_copies = data.links.map((link, idx) => ({
114
+ link_idx: idx,
115
+ color: link.color,
116
+ label: link.label,
117
+ source: resolve_ref(link.source),
118
+ target: resolve_ref(link.target),
119
+ value: link.value,
120
+ }));
121
+ // Drop nodes with no incoming or outgoing links. d3-sankey gives such orphans
122
+ // value 0 (zero height) and still stacks them with node_padding each, so extra
123
+ // labels pile up and overflow past the plot edge. They are never referenced by a
124
+ // link, so removing them can't break link resolution (node_idx stays stable).
125
+ const linked_node_idxs = new Set();
126
+ for (const link of link_copies) {
127
+ linked_node_idxs.add(link.source);
128
+ linked_node_idxs.add(link.target);
129
+ }
130
+ const used_nodes = node_copies.filter((node) => linked_node_idxs.has(node.node_idx));
131
+ const is_vertical = orientation === `vertical`;
132
+ // d3 lays out left->right (depth on x). For vertical we run in a transposed
133
+ // extent (depth on what becomes screen y) then swap node boxes afterwards.
134
+ const extent = is_vertical
135
+ ? [
136
+ [0, 0],
137
+ [height, width],
138
+ ]
139
+ : [
140
+ [0, 0],
141
+ [width, height],
142
+ ];
143
+ const layout = d3_sankey()
144
+ .nodeId((node) => node.node_idx)
145
+ .nodeWidth(node_width)
146
+ .nodePadding(node_padding)
147
+ .nodeAlign(ALIGN_FNS[node_align])
148
+ .iterations(iterations)
149
+ .extent(extent);
150
+ let graph;
151
+ try {
152
+ graph = layout({ nodes: used_nodes, links: link_copies });
153
+ }
154
+ catch (err) {
155
+ const msg = err instanceof Error ? err.message : String(err);
156
+ throw new Error(`Sankey layout failed (graph must be a DAG without cycles): ${msg}`, {
157
+ cause: err,
158
+ });
159
+ }
160
+ // Build link ribbon paths from raw d3 fields BEFORE transposing node boxes.
161
+ for (const link of graph.links) {
162
+ if (is_vertical) {
163
+ link.path = vertical_link_path(link);
164
+ link.mid = {
165
+ x: ((link.y0 ?? 0) + (link.y1 ?? 0)) / 2,
166
+ y: (link.source.x1 + link.target.x0) / 2,
167
+ };
168
+ }
169
+ else {
170
+ link.path = horizontal_link_path(link);
171
+ const x = (link.source.x1 + link.target.x0) / 2;
172
+ const y = ((link.y0 ?? 0) + (link.y1 ?? 0)) / 2;
173
+ link.mid = { x, y };
174
+ }
175
+ }
176
+ // Transpose node boxes into screen space for vertical orientation
177
+ if (is_vertical) {
178
+ for (const node of graph.nodes) {
179
+ const { x0, x1, y0, y1 } = node;
180
+ node.x0 = y0;
181
+ node.x1 = y1;
182
+ node.y0 = x0;
183
+ node.y1 = x1;
184
+ }
185
+ }
186
+ return graph;
187
+ }
188
+ // Map a node alignment string to the d3-sankey alignment function (exposed for tests)
189
+ export const sankey_align_fn = (align) => ALIGN_FNS[align];