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,4 +1,5 @@
1
1
  import type { AxisLoadError, BarStyle, DataLoaderFn, HistogramHandlerProps, PanConfig, RefLine, RefLineEvent } from '..';
2
+ import type { MarginalsProp } from '../core/marginals';
2
3
  import type { BasePlotProps, DataSeries, LegendConfig, PlotConfig } from '../core/types';
3
4
  import type { Snippet } from 'svelte';
4
5
  import type { HTMLAttributes } from 'svelte/elements';
@@ -11,13 +12,11 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & BasePlotProps & PlotCon
11
12
  selected_property?: string;
12
13
  mode?: `single` | `overlay`;
13
14
  tooltip?: Snippet<[HistogramHandlerProps]>;
14
- header_controls?: Snippet<[
15
- {
16
- height: number;
17
- width: number;
18
- fullscreen: boolean;
19
- }
20
- ]>;
15
+ header_controls?: Snippet<[{
16
+ height: number;
17
+ width: number;
18
+ fullscreen: boolean;
19
+ }]>;
21
20
  controls_extra?: Snippet<[Required<PlotConfig>]>;
22
21
  change?: (data: {
23
22
  value: number;
@@ -44,6 +43,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & BasePlotProps & PlotCon
44
43
  on_axis_change?: (axis: `x` | `x2` | `y` | `y2`, key: string, new_series: DataSeries[]) => void;
45
44
  on_error?: (error: AxisLoadError) => void;
46
45
  pan?: PanConfig;
46
+ marginals?: MarginalsProp;
47
47
  };
48
48
  declare const Histogram: import("svelte").Component<$$ComponentProps, {}, "mode" | "show_controls" | "fullscreen" | "series" | "bins" | "show_legend" | "selected_property" | "hovered" | "ref_lines" | "controls_open">;
49
49
  type Histogram = ReturnType<typeof Histogram>;
@@ -74,20 +74,16 @@
74
74
  }}
75
75
  >
76
76
  <div class="pane-row">
77
- <label>Bins:
78
- <input
79
- type="range"
80
- min="5"
81
- max="100"
82
- step="5"
83
- bind:value={bins}
84
- />
77
+ <label
78
+ >Bins:
79
+ <input type="range" min="5" max="100" step="5" bind:value={bins} />
85
80
  </label>
86
81
  <input type="number" min="5" max="100" step="5" bind:value={bins} />
87
82
  </div>
88
83
  {#if has_multiple_series}
89
84
  <div class="pane-row">
90
- <label>Mode:
85
+ <label
86
+ >Mode:
91
87
  <select bind:value={mode}>
92
88
  <option value="single">Single</option>
93
89
  <option value="overlay">Overlay</option>
@@ -96,7 +92,8 @@
96
92
  </div>
97
93
  {#if mode === `single`}
98
94
  <div class="pane-row">
99
- <label>Property:
95
+ <label
96
+ >Property:
100
97
  <select bind:value={selected_property}>
101
98
  <option value="">All</option>
102
99
  {#each series_options as option (option)}
@@ -125,15 +122,18 @@
125
122
  {#if visible_series.length === 1}
126
123
  <label>Fill: <input type="color" bind:value={bar.color} /></label>
127
124
  {/if}
128
- <label>Opacity:
125
+ <label
126
+ >Opacity:
129
127
  <input type="range" min="0" max="1" step="0.05" bind:value={bar.opacity} />
130
128
  <input type="number" min="0" max="1" step="0.05" bind:value={bar.opacity} />
131
129
  </label>
132
- <label>Stroke Width:
130
+ <label
131
+ >Stroke Width:
133
132
  <input type="range" min="0" max="5" step="0.1" bind:value={bar.stroke_width} />
134
133
  <input type="number" min="0" max="5" step="0.1" bind:value={bar.stroke_width} />
135
134
  </label>
136
- <label>Stroke Color:
135
+ <label
136
+ >Stroke Color:
137
137
  <input type="color" bind:value={bar.stroke_color} />
138
138
  <input
139
139
  type="range"
@@ -143,13 +143,7 @@
143
143
  bind:value={bar.stroke_opacity}
144
144
  title="Opacity"
145
145
  />
146
- <input
147
- type="number"
148
- min="0"
149
- max="1"
150
- step="0.05"
151
- bind:value={bar.stroke_opacity}
152
- />
146
+ <input type="number" min="0" max="1" step="0.05" bind:value={bar.stroke_opacity} />
153
147
  </label>
154
148
  {/if}
155
149
  </SettingsSection>
@@ -188,25 +182,33 @@
188
182
  class="pane-grid"
189
183
  style="grid-template-columns: 1fr 1fr"
190
184
  >
191
- <label>X: <select bind:value={x_axis.scale_type}>
185
+ <label
186
+ >X: <select bind:value={x_axis.scale_type}>
192
187
  <option value="linear">Linear</option>
193
188
  <option value="log">Log</option>
194
- </select></label>
189
+ </select></label
190
+ >
195
191
  {#if has_x2_points}
196
- <label>X2: <select bind:value={x2_axis.scale_type}>
192
+ <label
193
+ >X2: <select bind:value={x2_axis.scale_type}>
197
194
  <option value="linear">Linear</option>
198
195
  <option value="log">Log</option>
199
- </select></label>
196
+ </select></label
197
+ >
200
198
  {/if}
201
- <label>Y: <select bind:value={y_axis.scale_type}>
199
+ <label
200
+ >Y: <select bind:value={y_axis.scale_type}>
202
201
  <option value="linear">Linear</option>
203
202
  <option value="log">Log</option>
204
- </select></label>
203
+ </select></label
204
+ >
205
205
  {#if has_y2_points}
206
- <label>Y2: <select bind:value={y2_axis.scale_type}>
206
+ <label
207
+ >Y2: <select bind:value={y2_axis.scale_type}>
207
208
  <option value="linear">Linear</option>
208
209
  <option value="log">Log</option>
209
- </select></label>
210
+ </select></label
211
+ >
210
212
  {/if}
211
213
  </SettingsSection>
212
214
  </PlotControls>
@@ -0,0 +1,31 @@
1
+ import type { Vec2 } from '../../math';
2
+ import type { AxisConfig, DataSeries, ScaleType } from '../core/types';
3
+ type RangeLimit = [number | null, number | null];
4
+ type BinConfig = {
5
+ x_domain: Vec2;
6
+ x2_domain: Vec2;
7
+ bin_count: number;
8
+ };
9
+ export declare function log_safe_range(axis: Pick<AxisConfig, `range` | `scale_type`>): RangeLimit;
10
+ export declare function compute_histogram_bins(entries: readonly {
11
+ series_data: DataSeries;
12
+ series_idx: number;
13
+ }[], { x_domain, x2_domain, has_x2, bin_count, series_color, }: BinConfig & {
14
+ has_x2: boolean;
15
+ series_color: (series_data: DataSeries) => string;
16
+ }): {
17
+ id: string | number;
18
+ series_idx: number;
19
+ label: string;
20
+ color: string;
21
+ bins: import("d3-array").Bin<number, number>[];
22
+ max_count: number;
23
+ x_axis: "x1" | "x2" | undefined;
24
+ y_axis: "y1" | "y2" | undefined;
25
+ }[];
26
+ export declare function compute_count_range(series_list: readonly DataSeries[], { x_domain, x2_domain, bin_count, scale_type, y_limit, range_padding, }: BinConfig & {
27
+ scale_type: ScaleType;
28
+ y_limit: RangeLimit;
29
+ range_padding: number;
30
+ }): Vec2;
31
+ export {};
@@ -0,0 +1,70 @@
1
+ // Pure binning/range helpers extracted from Histogram.svelte (no reactivity, no pixel scales) so the numeric logic is unit-testable.
2
+ import { bin, max } from 'd3-array';
3
+ import { get_nice_data_range } from '../core/scales';
4
+ import { get_scale_type_name } from '../core/types';
5
+ // On a log axis any bound <= 0 is invalid, so treat it as unset (null): callers then fall back to
6
+ // the positive count-based bound rather than pinning the log domain at <= 0 (a broken scale).
7
+ export function log_safe_range(axis) {
8
+ const [lo, hi] = axis.range ?? [null, null];
9
+ if (get_scale_type_name(axis.scale_type ?? `linear`) !== `log`)
10
+ return [lo, hi];
11
+ // drop any bound <= 0 (guard the type first: `null <= 0` is true in JS)
12
+ const drop_non_positive = (bound) => typeof bound === `number` && bound <= 0 ? null : bound;
13
+ return [drop_non_positive(lo), drop_non_positive(hi)];
14
+ }
15
+ // Bin each selected series over the domain of the x-axis it renders on (d3 bin() drops
16
+ // out-of-domain values). Pad-independent so the obstacle field can reuse it.
17
+ export function compute_histogram_bins(entries, { x_domain, x2_domain, has_x2, bin_count, series_color, }) {
18
+ const hist_generator = bin().domain([x_domain[0], x_domain[1]]).thresholds(bin_count);
19
+ const x2_hist_generator = has_x2
20
+ ? bin().domain([x2_domain[0], x2_domain[1]]).thresholds(bin_count)
21
+ : null;
22
+ return entries.map(({ series_data, series_idx }) => {
23
+ const use_x2 = series_data.x_axis === `x2`;
24
+ const active_hist = use_x2 && x2_hist_generator ? x2_hist_generator : hist_generator;
25
+ const bins_arr = active_hist(series_data.y);
26
+ return {
27
+ id: series_data.id ?? series_idx,
28
+ series_idx,
29
+ label: series_data.label ?? `Series ${series_idx + 1}`,
30
+ color: series_color(series_data),
31
+ bins: bins_arr,
32
+ max_count: max(bins_arr, (data) => data.length) ?? 0,
33
+ x_axis: series_data.x_axis,
34
+ y_axis: series_data.y_axis,
35
+ };
36
+ });
37
+ }
38
+ // Compute a nice [min, max] count range for a set of series, binning each over its own x-domain.
39
+ // On log count axes the lower bound sits just below the smallest non-empty bin so singleton tail
40
+ // bins don't collapse to zero height; linear/arcsinh axes start from 0.
41
+ export function compute_count_range(series_list, { x_domain, x2_domain, bin_count, scale_type, y_limit, range_padding, }) {
42
+ const type_name = get_scale_type_name(scale_type);
43
+ // no-data fallback: a positive floor on log (counts can't be <= 0), else 0
44
+ const empty_range = [type_name === `log` ? 1 : 0, 1];
45
+ if (series_list.length === 0)
46
+ return empty_range;
47
+ const counts = series_list.flatMap((srs) => {
48
+ const hist = bin()
49
+ .domain(srs.x_axis === `x2` ? x2_domain : x_domain)
50
+ .thresholds(bin_count);
51
+ return hist(srs.y)
52
+ .map((data) => data.length)
53
+ .filter((count) => count > 0);
54
+ });
55
+ const max_count = Math.max(0, ...counts);
56
+ if (max_count <= 0)
57
+ return empty_range;
58
+ const min_count = type_name === `log` ? Math.min(...counts) : 0;
59
+ const [y0, y1] = get_nice_data_range([
60
+ { x: min_count, y: 0 },
61
+ { x: max_count, y: 0 },
62
+ ], ({ x }) => x, y_limit, scale_type, range_padding, false);
63
+ // For log count axes, start just below the smallest non-empty bin so singleton tail bins
64
+ // don't collapse to zero height at the baseline. y_limit is pre-sanitized log-safe, so a null
65
+ // (incl. dropped non-positive) lower correctly falls back to the positive minimum.
66
+ if (type_name === `log`)
67
+ return [y_limit[0] ?? min_count / 1.1, y1];
68
+ // For linear/arcsinh, start from 0
69
+ return [Math.max(0, y0), y1];
70
+ }
@@ -1,2 +1,3 @@
1
1
  export { default as Histogram } from './Histogram.svelte';
2
2
  export { default as HistogramControls } from './HistogramControls.svelte';
3
+ export * from './histogram';
@@ -1,2 +1,3 @@
1
1
  export { default as Histogram } from './Histogram.svelte';
2
2
  export { default as HistogramControls } from './HistogramControls.svelte';
3
+ export * from './histogram';
@@ -6,3 +6,4 @@ export * from './sankey';
6
6
  export * from './scatter';
7
7
  export * from './scatter-3d';
8
8
  export * from './sunburst';
9
+ export * from './treemap';
@@ -8,3 +8,4 @@ export * from './sankey';
8
8
  export * from './scatter';
9
9
  export * from './scatter-3d';
10
10
  export * from './sunburst';
11
+ export * from './treemap';
@@ -18,10 +18,14 @@
18
18
  } from '..'
19
19
  import { DEFAULT_SERIES_COLORS, PlotLegend, PlotTooltip, SankeyControls } from '..'
20
20
  import { closest_data_idx } from '../core/interactions'
21
- import { compute_element_placement, constrain_tooltip_position, filter_padding } from '../core/layout'
21
+ import {
22
+ compute_element_placement,
23
+ constrain_tooltip_position,
24
+ filter_padding,
25
+ } from '../core/layout'
22
26
  import type { Sides } from '../core/layout'
23
27
  import { compute_sankey_layout } from './sankey'
24
- import type { PositionedLink, PositionedNode} from './sankey'
28
+ import type { PositionedLink, PositionedNode } from './sankey'
25
29
  import { unique_id } from '../core/utils'
26
30
  import { DEFAULTS } from '../../settings'
27
31
  import { type Snippet, untrack } from 'svelte'
@@ -64,47 +68,44 @@
64
68
  header_controls,
65
69
  controls_extra,
66
70
  ...rest
67
- }: HTMLAttributes<HTMLDivElement> & Omit<BasePlotProps, `change`> & {
68
- data?: SankeyData<Metadata>
69
- orientation?: SankeyOrientation
70
- node_width?: number
71
- node_padding?: number
72
- node_align?: SankeyNodeAlign
73
- iterations?: number
74
- link_opacity?: number
75
- link_color_mode?: SankeyLinkColorMode
76
- show_node_labels?: boolean
77
- node_label?: (node: PositionedNode) => string
78
- value_format?: string
79
- padding?: Sides
80
- legend?: LegendConfig | null
81
- show_legend?: boolean
82
- tooltip?: Snippet<[SankeyHandlerProps<Metadata>]>
83
- // Fully replace the default node rect / link ribbon. NOTE: this also replaces the
84
- // built-in hover/focus/click + tooltip wiring, so re-implement any interactivity
85
- // you need inside the snippet.
86
- node_content?: Snippet<[{ node: PositionedNode; color: string }]>
87
- link_content?: Snippet<[{ link: PositionedLink; color: string }]>
88
- change?: (data: SankeyHandlerProps<Metadata> | null) => void
89
- on_node_click?: (
90
- data: SankeyNodeHandlerProps<Metadata> & { event: MouseEvent | KeyboardEvent },
91
- ) => void
92
- on_node_hover?: (
93
- data:
94
- | (SankeyNodeHandlerProps<Metadata> & { event: MouseEvent | FocusEvent })
95
- | null,
96
- ) => void
97
- on_link_click?: (
98
- data: SankeyLinkHandlerProps<Metadata> & { event: MouseEvent | KeyboardEvent },
99
- ) => void
100
- on_link_hover?: (
101
- data:
102
- | (SankeyLinkHandlerProps<Metadata> & { event: MouseEvent | FocusEvent })
103
- | null,
104
- ) => void
105
- header_controls?: Snippet<[{ height: number; width: number; fullscreen: boolean }]>
106
- controls_extra?: Snippet<[{ orientation: SankeyOrientation }]>
107
- } = $props()
71
+ }: HTMLAttributes<HTMLDivElement> &
72
+ Omit<BasePlotProps, `change`> & {
73
+ data?: SankeyData<Metadata>
74
+ orientation?: SankeyOrientation
75
+ node_width?: number
76
+ node_padding?: number
77
+ node_align?: SankeyNodeAlign
78
+ iterations?: number
79
+ link_opacity?: number
80
+ link_color_mode?: SankeyLinkColorMode
81
+ show_node_labels?: boolean
82
+ node_label?: (node: PositionedNode) => string
83
+ value_format?: string
84
+ padding?: Sides
85
+ legend?: LegendConfig | null
86
+ show_legend?: boolean
87
+ tooltip?: Snippet<[SankeyHandlerProps<Metadata>]>
88
+ // Fully replace the default node rect / link ribbon. NOTE: this also replaces the
89
+ // built-in hover/focus/click + tooltip wiring, so re-implement any interactivity
90
+ // you need inside the snippet.
91
+ node_content?: Snippet<[{ node: PositionedNode; color: string }]>
92
+ link_content?: Snippet<[{ link: PositionedLink; color: string }]>
93
+ change?: (data: SankeyHandlerProps<Metadata> | null) => void
94
+ on_node_click?: (
95
+ data: SankeyNodeHandlerProps<Metadata> & { event: MouseEvent | KeyboardEvent },
96
+ ) => void
97
+ on_node_hover?: (
98
+ data: (SankeyNodeHandlerProps<Metadata> & { event: MouseEvent | FocusEvent }) | null,
99
+ ) => void
100
+ on_link_click?: (
101
+ data: SankeyLinkHandlerProps<Metadata> & { event: MouseEvent | KeyboardEvent },
102
+ ) => void
103
+ on_link_hover?: (
104
+ data: (SankeyLinkHandlerProps<Metadata> & { event: MouseEvent | FocusEvent }) | null,
105
+ ) => void
106
+ header_controls?: Snippet<[{ height: number; width: number; fullscreen: boolean }]>
107
+ controls_extra?: Snippet<[{ orientation: SankeyOrientation }]>
108
+ } = $props()
108
109
 
109
110
  let [width, height] = $state([0, 0])
110
111
  let wrapper: HTMLDivElement | undefined = $state()
@@ -126,8 +127,8 @@
126
127
 
127
128
  // Resolved node colors (per node_idx), explicit color or cycled palette
128
129
  let node_colors = $derived(
129
- data.nodes.map((node, idx) =>
130
- node.color ?? DEFAULT_SERIES_COLORS[idx % DEFAULT_SERIES_COLORS.length]
130
+ data.nodes.map(
131
+ (node, idx) => node.color ?? DEFAULT_SERIES_COLORS[idx % DEFAULT_SERIES_COLORS.length],
131
132
  ),
132
133
  )
133
134
 
@@ -160,9 +161,7 @@
160
161
  })
161
162
 
162
163
  // node_idx -> positioned node (array order is preserved by d3-sankey, but map is safer)
163
- let node_by_idx = $derived(
164
- new Map(layout.nodes.map((node) => [node.node_idx, node])),
165
- )
164
+ let node_by_idx = $derived(new Map(layout.nodes.map((node) => [node.node_idx, node])))
166
165
 
167
166
  const node_id_at = (node_idx: number): string | number =>
168
167
  node_by_idx.get(node_idx)?.id ?? node_idx
@@ -220,7 +219,10 @@
220
219
 
221
220
  const link_stroke_opacity = (link: PositionedLink): number => {
222
221
  if (link_dim(link)) return link_opacity * 0.15
223
- if (active) return active.links.has(link.link_idx) ? Math.min(1, link_opacity + 0.35) : link_opacity * 0.25
222
+ if (active)
223
+ return active.links.has(link.link_idx)
224
+ ? Math.min(1, link_opacity + 0.35)
225
+ : link_opacity * 0.25
224
226
  return link_opacity
225
227
  }
226
228
 
@@ -271,7 +273,8 @@
271
273
  hover_info = make_node_props(node)
272
274
  hover_pos = event_pos(event) ?? node_center(node)
273
275
  change(hover_info)
274
- if (event) on_node_hover?.({ ...(hover_info as SankeyNodeHandlerProps<Metadata>), event })
276
+ if (event)
277
+ on_node_hover?.({ ...(hover_info as SankeyNodeHandlerProps<Metadata>), event })
275
278
  } else {
276
279
  hovered_node = null
277
280
  hover_info = null
@@ -288,7 +291,8 @@
288
291
  hover_info = make_link_props(link)
289
292
  hover_pos = event_pos(event) ?? { x: pad.l + link.mid.x, y: pad.t + link.mid.y }
290
293
  change(hover_info)
291
- if (event) on_link_hover?.({ ...(hover_info as SankeyLinkHandlerProps<Metadata>), event })
294
+ if (event)
295
+ on_link_hover?.({ ...(hover_info as SankeyLinkHandlerProps<Metadata>), event })
292
296
  } else {
293
297
  hovered_link = null
294
298
  hover_info = null
@@ -299,12 +303,12 @@
299
303
 
300
304
  const link_from_event = (event: Event): PositionedLink | null => {
301
305
  const idx = closest_data_idx(event, `data-sankey-link-idx`, svg_element)
302
- return idx == null ? null : layout.links[idx] ?? null
306
+ return idx == null ? null : (layout.links[idx] ?? null)
303
307
  }
304
308
 
305
309
  const node_from_event = (event: Event): PositionedNode | null => {
306
310
  const idx = closest_data_idx(event, `data-sankey-node-idx`, svg_element)
307
- return idx == null ? null : node_by_idx.get(idx) ?? null
311
+ return idx == null ? null : (node_by_idx.get(idx) ?? null)
308
312
  }
309
313
 
310
314
  function handle_link_hover_event(event: MouseEvent | FocusEvent) {
@@ -364,7 +368,7 @@
364
368
  label: node.label ?? `${node.id ?? idx}`,
365
369
  visible: !muted_nodes.has(node.id ?? idx),
366
370
  display_style: { symbol_type: `Square` as const, symbol_color: node_colors[idx] },
367
- }))
371
+ })),
368
372
  )
369
373
 
370
374
  function toggle_node(series_idx: number) {
@@ -409,7 +413,7 @@
409
413
  bind:clientWidth={width}
410
414
  bind:clientHeight={height}
411
415
  {...rest}
412
- class="sankey {rest.class ?? ``}"
416
+ class={[`sankey`, rest.class]}
413
417
  class:fullscreen
414
418
  >
415
419
  {#if width && height}
@@ -517,7 +521,9 @@
517
521
  rx="1"
518
522
  role={on_node_click ? `button` : undefined}
519
523
  tabindex={on_node_click ? 0 : undefined}
520
- aria-label={on_node_click ? `${node.label ?? node.id}: ${node.value}` : undefined}
524
+ aria-label={on_node_click
525
+ ? `${node.label ?? node.id}: ${node.value}`
526
+ : undefined}
521
527
  style:cursor={on_node_click ? `pointer` : `default`}
522
528
  />
523
529
  {/if}
@@ -528,8 +534,8 @@
528
534
  x={lbl.x}
529
535
  y={lbl.y}
530
536
  text-anchor={lbl.anchor}
531
- dominant-baseline={lbl.baseline}
532
- >{node_text(node)}</text>
537
+ dominant-baseline={lbl.baseline}>{node_text(node)}</text
538
+ >
533
539
  {/if}
534
540
  </g>
535
541
  {/each}
@@ -550,9 +556,10 @@
550
556
  )}
551
557
  <!-- Solid chip bg (PlotTooltip auto-contrasts text). Links use the source node
552
558
  color so gradient/static ribbons (url(...)/var(...)) still get a readable color. -->
553
- {@const tip_bg = hover_info.type === `node`
554
- ? hover_info.color
555
- : node_colors[hover_info.source_idx] ?? `rgba(0, 0, 0, 0.7)`}
559
+ {@const tip_bg =
560
+ hover_info.type === `node`
561
+ ? hover_info.color
562
+ : (node_colors[hover_info.source_idx] ?? `rgba(0, 0, 0, 0.7)`)}
556
563
  <PlotTooltip
557
564
  x={tip.x}
558
565
  y={tip.y}
@@ -563,13 +570,13 @@
563
570
  {#if tooltip}
564
571
  {@render tooltip(hover_info)}
565
572
  {:else if hover_info.type === `node`}
566
- <strong>{hover_info.label ?? hover_info.id}</strong>: {
567
- format_value(hover_info.value, value_format)
568
- }
573
+ <strong>{hover_info.label ?? hover_info.id}</strong>: {format_value(
574
+ hover_info.value,
575
+ value_format,
576
+ )}
569
577
  {:else}
570
- {hover_info.source_label ?? hover_info.source_idx} &rarr; {
571
- hover_info.target_label ?? hover_info.target_idx
572
- }: {format_value(hover_info.value, value_format)}
578
+ {hover_info.source_label ?? hover_info.source_idx} &rarr; {hover_info.target_label ??
579
+ hover_info.target_idx}: {format_value(hover_info.value, value_format)}
573
580
  {/if}
574
581
  </PlotTooltip>
575
582
  {/if}
@@ -583,7 +590,7 @@
583
590
  series_data={legend_data}
584
591
  on_toggle={legend?.on_toggle ?? toggle_node}
585
592
  on_item_hover={(item) =>
586
- (hovered_node = item != null && item.series_idx >= 0 ? item.series_idx : null)}
593
+ (hovered_node = item != null && item.series_idx >= 0 ? item.series_idx : null)}
587
594
  style={`position: absolute; left: ${legend_left}px; top: ${legend_top}px; pointer-events: auto; ${
588
595
  legend?.style ?? ``
589
596
  }`}
@@ -663,7 +670,9 @@
663
670
  .sankey :global(.pane-toggle),
664
671
  .sankey .header-controls {
665
672
  opacity: 0;
666
- transition: opacity 0.2s, background-color 0.2s;
673
+ transition:
674
+ opacity 0.2s,
675
+ background-color 0.2s;
667
676
  }
668
677
  .sankey:hover :global(.pane-toggle),
669
678
  .sankey:hover .header-controls,
@@ -51,7 +51,7 @@ declare function $$render<Metadata extends Record<string, unknown> = Record<stri
51
51
  }]>;
52
52
  };
53
53
  exports: {};
54
- bindings: "data" | "orientation" | "show_controls" | "fullscreen" | "hovered" | "controls_open" | "node_align" | "node_width" | "node_padding" | "link_opacity" | "show_node_labels";
54
+ bindings: "orientation" | "show_controls" | "data" | "fullscreen" | "hovered" | "controls_open" | "node_align" | "node_width" | "node_padding" | "link_opacity" | "show_node_labels";
55
55
  slots: {};
56
56
  events: {};
57
57
  };
@@ -59,7 +59,7 @@ declare class __sveltets_Render<Metadata extends Record<string, unknown> = Recor
59
59
  props(): ReturnType<typeof $$render<Metadata>>['props'];
60
60
  events(): ReturnType<typeof $$render<Metadata>>['events'];
61
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";
62
+ bindings(): "orientation" | "show_controls" | "data" | "fullscreen" | "hovered" | "controls_open" | "node_align" | "node_width" | "node_padding" | "link_opacity" | "show_node_labels";
63
63
  exports(): {};
64
64
  }
65
65
  interface $$IsomorphicComponent {
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { SettingsSection } from '../../layout'
2
+ import { NumberRangeInput, SettingsSection } from '../../layout'
3
3
  import type { SankeyNodeAlign, SankeyOrientation } from '..'
4
4
  import ControlPane from '../core/components/ControlPane.svelte'
5
5
  import { DEFAULTS } from '../../settings'
@@ -74,21 +74,27 @@
74
74
  <option value="center">Center</option>
75
75
  </select>
76
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>
77
+ <NumberRangeInput
78
+ min={4}
79
+ max={60}
80
+ step={1}
81
+ bind:value={node_width}
82
+ style="flex: 1 1 100%">Node width:</NumberRangeInput
83
+ >
84
+ <NumberRangeInput
85
+ min={0}
86
+ max={40}
87
+ step={1}
88
+ bind:value={node_padding}
89
+ style="flex: 1 1 100%">Node padding:</NumberRangeInput
90
+ >
91
+ <NumberRangeInput
92
+ min={0.05}
93
+ max={1}
94
+ step={0.05}
95
+ bind:value={link_opacity}
96
+ style="flex: 1 1 100%">Link opacity:</NumberRangeInput
97
+ >
92
98
  <label style="flex: 1 1 100%">
93
99
  <input type="checkbox" bind:checked={show_node_labels} />
94
100
  Show node labels
@@ -20,11 +20,6 @@ function resolve_node_ref(ref, id_to_idx, n_nodes) {
20
20
  }
21
21
  throw new Error(`Sankey link references unknown node: ${JSON.stringify(ref)}`);
22
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
23
  // Build a SankeyData object from parallel flat arrays (e.g. the plotly/matbench
29
24
  // `link.source`/`link.target`/`link.value` + `node.label` format).
30
25
  export function sankey_from_links(source, target, value, labels) {
@@ -107,9 +102,18 @@ export function compute_sankey_layout(data, opts) {
107
102
  }));
108
103
  // Resolve a source/target ref to a node index: id/label lookup when any link uses
109
104
  // 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);
105
+ const resolve_ref = (ref) => {
106
+ if (needs_ref_lookup) {
107
+ return resolve_node_ref(ref, id_to_idx, data.nodes.length);
108
+ }
109
+ if (typeof ref === `number` &&
110
+ Number.isInteger(ref) &&
111
+ ref >= 0 &&
112
+ ref < data.nodes.length) {
113
+ return ref;
114
+ }
115
+ throw new Error(`Sankey link references unknown node: ${JSON.stringify(ref)}`);
116
+ };
113
117
  const link_copies = data.links.map((link, idx) => ({
114
118
  link_idx: idx,
115
119
  color: link.color,
@@ -185,5 +189,5 @@ export function compute_sankey_layout(data, opts) {
185
189
  }
186
190
  return graph;
187
191
  }
188
- // Map a node alignment string to the d3-sankey alignment function (exposed for tests)
192
+ // Map a node alignment string to the d3-sankey alignment function
189
193
  export const sankey_align_fn = (align) => ALIGN_FNS[align];