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
@@ -2,15 +2,16 @@
2
2
  lang="ts"
3
3
  generics="Metadata extends Record<string, unknown> = Record<string, unknown>"
4
4
  >
5
- import type { D3ColorSchemeName, D3InterpolateName } from '../colors'
6
- import { FullscreenToggle } from '../layout'
7
- import type { Vec2, Vec3 } from '../math'
8
- import { ColorBar, PlotLegend } from './'
9
- import { get_series_color } from './data-transform'
10
- import type { Sides } from './layout'
5
+ import type { D3InterpolateName } from '../../colors'
6
+ import { FullscreenToggle } from '../../layout'
7
+ import type { Vec2, Vec3 } from '../../math'
8
+ import { ColorBar, PlotLegend } from '..'
9
+ import { get_series_color } from '../core/data-transform'
10
+ import type { Sides } from '../core/layout'
11
11
  import type {
12
12
  AxisConfig3D,
13
13
  CameraProjection3D,
14
+ ColorScaleConfig,
14
15
  ControlsConfig3D,
15
16
  DataSeries3D,
16
17
  DisplayConfig3D,
@@ -20,9 +21,10 @@
20
21
  RefPlane,
21
22
  ScaleType,
22
23
  Scatter3DHandlerEvent,
24
+ SizeScaleConfig,
23
25
  StyleOverrides3D,
24
26
  Surface3DConfig,
25
- } from './types'
27
+ } from '../core/types'
26
28
  import { Canvas } from '@threlte/core'
27
29
  import * as extras from '@threlte/extras'
28
30
  import { onMount } from 'svelte'
@@ -30,7 +32,7 @@
30
32
  import type { HTMLAttributes } from 'svelte/elements'
31
33
  import { SvelteMap, SvelteSet } from 'svelte/reactivity'
32
34
  import type { Camera, Scene } from 'three'
33
- import { create_color_scale } from './scales'
35
+ import { calculate_domain, create_color_scale } from '../core/scales'
34
36
  import ScatterPlot3DControls from './ScatterPlot3DControls.svelte'
35
37
  import ScatterPlot3DScene from './ScatterPlot3DScene.svelte'
36
38
 
@@ -116,17 +118,9 @@
116
118
  z_axis?: AxisConfig3D
117
119
  display?: DisplayConfig3D
118
120
  styles?: StyleOverrides3D
119
- color_scale?: {
120
- type?: ScaleType
121
- scheme?: D3ColorSchemeName | D3InterpolateName
122
- value_range?: [number, number]
123
- } | D3InterpolateName
121
+ color_scale?: ColorScaleConfig | D3InterpolateName
124
122
  color_bar?: ComponentProps<typeof ColorBar> & { margin?: number | Sides } | null
125
- size_scale?: {
126
- type?: ScaleType
127
- radius_range?: [number, number]
128
- value_range?: [number, number]
129
- }
123
+ size_scale?: SizeScaleConfig
130
124
  legend?: LegendConfig | null
131
125
  camera_position?: Vec3
132
126
  camera_projection?: CameraProjection3D
@@ -175,11 +169,14 @@
175
169
  id_counts.set(srs.id, (id_counts.get(srs.id) ?? 0) + 1)
176
170
  }
177
171
  }
172
+ // Prefix classes stay disjoint: `idx:` keys have `x` at index 2 where `id:` keys
173
+ // have `:`, and `dup:` keys differ in first char. Within a class, idx is unique
174
+ // and bare ids are only used when they occur exactly once.
178
175
  return series.map((srs, idx) => {
179
- if (srs?.id === undefined || srs.id === ``) return JSON.stringify([`idx`, idx])
180
- return id_counts.get(srs.id) === 1
181
- ? JSON.stringify([`id`, srs.id])
182
- : JSON.stringify([`duplicate-id`, idx, srs.id])
176
+ if (srs?.id === undefined || srs.id === ``) return `idx:${idx}`
177
+ // include typeof so numeric/string ids (1 vs "1") don't collide on the same key
178
+ const id_key = `${typeof srs.id}:${String(srs.id)}`
179
+ return id_counts.get(srs.id) === 1 ? `id:${id_key}` : `dup:${idx}:${id_key}`
183
180
  })
184
181
  })
185
182
 
@@ -227,15 +224,7 @@
227
224
  ),
228
225
  )
229
226
 
230
- let auto_color_range = $derived.by((): [number, number] => {
231
- if (all_color_values.length === 0) return [0, 1]
232
- let [min, max] = [Infinity, -Infinity]
233
- for (const val of all_color_values) {
234
- if (val < min) min = val
235
- if (val > max) max = val
236
- }
237
- return [min, max]
238
- })
227
+ let auto_color_range = $derived(calculate_domain(all_color_values))
239
228
 
240
229
  let color_scale_fn = $derived(
241
230
  create_color_scale(normalized_color_scale, auto_color_range),
@@ -342,7 +331,7 @@
342
331
  {z_axis}
343
332
  {display}
344
333
  {styles}
345
- color_scale={normalized_color_scale}
334
+ {color_scale_fn}
346
335
  {size_scale}
347
336
  {camera_position}
348
337
  {camera_projection}
@@ -462,8 +451,10 @@
462
451
  border-radius: 0;
463
452
  max-height: none !important;
464
453
  overflow: hidden;
465
- /* Add padding to prevent titles from being cropped at top */
466
- padding-top: var(--plot-fullscreen-padding-top, 2em);
454
+ /* border-top (not padding-top): bind:clientHeight includes padding but excludes
455
+ borders - padding made the chart overflow + clip its bottom 2em (x-axis title) */
456
+ border-top: var(--plot-fullscreen-padding-top, 2em) solid
457
+ var(--scatter3d-bg, var(--plot-bg, transparent));
467
458
  box-sizing: border-box;
468
459
  }
469
460
  /* Threlte Canvas container needs flex: 1 to fill available space in flex layout
@@ -1,8 +1,8 @@
1
- import type { D3ColorSchemeName, D3InterpolateName } from '../colors';
2
- import type { Vec3 } from '../math';
3
- import { ColorBar } from './';
4
- import type { Sides } from './layout';
5
- import type { AxisConfig3D, CameraProjection3D, ControlsConfig3D, DataSeries3D, DisplayConfig3D, InternalPoint3D, LegendConfig, RefLine3D, RefPlane, ScaleType, Scatter3DHandlerEvent, StyleOverrides3D, Surface3DConfig } from './types';
1
+ import type { D3InterpolateName } from '../../colors';
2
+ import type { Vec3 } from '../../math';
3
+ import { ColorBar } from '..';
4
+ import type { Sides } from '../core/layout';
5
+ import type { AxisConfig3D, CameraProjection3D, ColorScaleConfig, ControlsConfig3D, DataSeries3D, DisplayConfig3D, InternalPoint3D, LegendConfig, RefLine3D, RefPlane, Scatter3DHandlerEvent, SizeScaleConfig, StyleOverrides3D, Surface3DConfig } from '../core/types';
6
6
  import * as extras from '@threlte/extras';
7
7
  import type { ComponentProps, Snippet } from 'svelte';
8
8
  import type { HTMLAttributes } from 'svelte/elements';
@@ -18,19 +18,11 @@ declare function $$render<Metadata extends Record<string, unknown> = Record<stri
18
18
  z_axis?: AxisConfig3D;
19
19
  display?: DisplayConfig3D;
20
20
  styles?: StyleOverrides3D;
21
- color_scale?: {
22
- type?: ScaleType;
23
- scheme?: D3ColorSchemeName | D3InterpolateName;
24
- value_range?: [number, number];
25
- } | D3InterpolateName;
21
+ color_scale?: ColorScaleConfig | D3InterpolateName;
26
22
  color_bar?: (ComponentProps<typeof ColorBar> & {
27
23
  margin?: number | Sides;
28
24
  }) | null;
29
- size_scale?: {
30
- type?: ScaleType;
31
- radius_range?: [number, number];
32
- value_range?: [number, number];
33
- };
25
+ size_scale?: SizeScaleConfig;
34
26
  legend?: LegendConfig | null;
35
27
  camera_position?: Vec3;
36
28
  camera_projection?: CameraProjection3D;
@@ -72,7 +64,7 @@ declare function $$render<Metadata extends Record<string, unknown> = Record<stri
72
64
  controls_extra?: Snippet;
73
65
  };
74
66
  exports: {};
75
- bindings: "fullscreen" | "hovered" | "camera_position" | "wrapper" | "tooltip_point" | "camera" | "scene" | "orbit_controls";
67
+ bindings: "fullscreen" | "wrapper" | "hovered" | "scene" | "camera" | "orbit_controls" | "camera_position" | "tooltip_point";
76
68
  slots: {};
77
69
  events: {};
78
70
  };
@@ -80,7 +72,7 @@ declare class __sveltets_Render<Metadata extends Record<string, unknown> = Recor
80
72
  props(): ReturnType<typeof $$render<Metadata>>['props'];
81
73
  events(): ReturnType<typeof $$render<Metadata>>['events'];
82
74
  slots(): ReturnType<typeof $$render<Metadata>>['slots'];
83
- bindings(): "fullscreen" | "hovered" | "camera_position" | "wrapper" | "tooltip_point" | "camera" | "scene" | "orbit_controls";
75
+ bindings(): "fullscreen" | "wrapper" | "hovered" | "scene" | "camera" | "orbit_controls" | "camera_position" | "tooltip_point";
84
76
  exports(): {};
85
77
  }
86
78
  interface $$IsomorphicComponent {
@@ -1,19 +1,23 @@
1
1
  <script lang="ts">
2
+ import type { PaneProps, PaneToggleProps } from '../../overlays'
2
3
  // NOTE: Axis config objects must be reassigned (not mutated) to trigger $bindable reactivity.
3
4
  // Pattern: `x_axis = { ...x_axis, prop: value }` instead of `x_axis.prop = value`
4
- import { SettingsSection } from '../layout'
5
- import DraggablePane from '../overlays/DraggablePane.svelte'
5
+ import { SettingsSection } from '../../layout'
6
+ import type { Vec2 } from '../../math'
7
+ import DraggablePane from '../../overlays/DraggablePane.svelte'
6
8
  import type {
7
9
  AxisConfig3D,
8
10
  CameraProjection3D,
9
11
  DataSeries3D,
10
12
  DisplayConfig3D,
11
13
  Surface3DConfig,
12
- } from './types'
14
+ } from '../core/types'
15
+ import { calculate_domain } from '../core/scales'
16
+ import { unique_id } from '../core/utils'
13
17
  import type { ComponentProps, Snippet } from 'svelte'
14
18
 
15
19
  // Unique ID prefix to avoid conflicts when multiple instances on same page
16
- const uid = crypto.randomUUID().slice(0, 8)
20
+ const uid = unique_id(`scatter3d-ctrl`)
17
21
 
18
22
  let {
19
23
  show = $bindable(false),
@@ -38,19 +42,15 @@
38
42
  auto_rotate?: number
39
43
  series?: DataSeries3D[]
40
44
  surfaces?: Surface3DConfig[]
41
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`]
42
- pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`]
45
+ toggle_props?: PaneToggleProps
46
+ pane_props?: PaneProps
43
47
  children?: Snippet
44
48
  } = $props()
45
49
 
46
- // Calculate auto ranges for reset
47
- function calc_auto_range(values: number[]): [number, number] {
50
+ // Calculate auto ranges for reset (5% padding, 0.5 when all values coincide)
51
+ function calc_auto_range(values: number[]): Vec2 {
48
52
  if (values.length === 0) return [0, 1]
49
- let [min_val, max_val] = [values[0], values[0]]
50
- for (const val of values) {
51
- if (val < min_val) min_val = val
52
- else if (val > max_val) max_val = val
53
- }
53
+ const [min_val, max_val] = calculate_domain(values)
54
54
  const padding = (max_val - min_val) * 0.05 || 0.5
55
55
  return [min_val - padding, max_val + padding]
56
56
  }
@@ -96,7 +96,7 @@
96
96
  type AxisEntry = {
97
97
  name: string
98
98
  axis: AxisConfig3D
99
- auto_range: [number, number]
99
+ auto_range: Vec2
100
100
  set: (val: AxisConfig3D) => void
101
101
  }
102
102
  const axes = $derived<AxisEntry[]>([
@@ -1,6 +1,6 @@
1
- import DraggablePane from '../overlays/DraggablePane.svelte';
2
- import type { AxisConfig3D, CameraProjection3D, DataSeries3D, DisplayConfig3D, Surface3DConfig } from './types';
3
- import type { ComponentProps, Snippet } from 'svelte';
1
+ import type { PaneProps, PaneToggleProps } from '../../overlays';
2
+ import type { AxisConfig3D, CameraProjection3D, DataSeries3D, DisplayConfig3D, Surface3DConfig } from '../core/types';
3
+ import type { Snippet } from 'svelte';
4
4
  type $$ComponentProps = {
5
5
  show?: boolean;
6
6
  x_axis?: AxisConfig3D;
@@ -11,10 +11,10 @@ type $$ComponentProps = {
11
11
  auto_rotate?: number;
12
12
  series?: DataSeries3D[];
13
13
  surfaces?: Surface3DConfig[];
14
- toggle_props?: ComponentProps<typeof DraggablePane>[`toggle_props`];
15
- pane_props?: ComponentProps<typeof DraggablePane>[`pane_props`];
14
+ toggle_props?: PaneToggleProps;
15
+ pane_props?: PaneProps;
16
16
  children?: Snippet;
17
17
  };
18
- declare const ScatterPlot3DControls: import("svelte").Component<$$ComponentProps, {}, "display" | "show" | "x_axis" | "y_axis" | "camera_projection" | "auto_rotate" | "z_axis">;
18
+ declare const ScatterPlot3DControls: import("svelte").Component<$$ComponentProps, {}, "display" | "show" | "y_axis" | "x_axis" | "camera_projection" | "auto_rotate" | "z_axis">;
19
19
  type ScatterPlot3DControls = ReturnType<typeof ScatterPlot3DControls>;
20
20
  export default ScatterPlot3DControls;
@@ -2,9 +2,8 @@
2
2
  lang="ts"
3
3
  generics="Metadata extends Record<string, unknown> = Record<string, unknown>"
4
4
  >
5
- import type { D3ColorSchemeName, D3InterpolateName } from '../colors'
6
- import { format_num } from '../labels'
7
- import type { Vec2, Vec3 } from '../math'
5
+ import { format_num } from '../../labels'
6
+ import type { Vec2, Vec3 } from '../../math'
8
7
  import type {
9
8
  AxisConfig3D,
10
9
  CameraProjection3D,
@@ -13,12 +12,13 @@
13
12
  InternalPoint3D,
14
13
  RefLine3D,
15
14
  RefPlane,
16
- ScaleType,
17
15
  Scatter3DHandlerEvent,
16
+ SizeScaleConfig,
18
17
  StyleOverrides3D,
19
18
  Surface3DConfig,
20
- } from './types'
21
- import { T, useTask, useThrelte } from '@threlte/core'
19
+ } from '../core/types'
20
+ import { bind_renderer } from '../../scene'
21
+ import { T, useTask } from '@threlte/core'
22
22
  import * as extras from '@threlte/extras'
23
23
  import { scaleLinear } from 'd3-scale'
24
24
  import { type ComponentProps, onDestroy, type Snippet, untrack } from 'svelte'
@@ -27,11 +27,11 @@
27
27
  import { Line2 } from 'three/examples/jsm/lines/Line2.js'
28
28
  import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'
29
29
  import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'
30
- import { get_series_color } from './data-transform'
31
- import { normalize_to_scene } from './reference-line'
32
- import ReferenceLine3D from './ReferenceLine3D.svelte'
33
- import ReferencePlane from './ReferencePlane.svelte'
34
- import { create_color_scale, create_size_scale } from './scales'
30
+ import { get_series_color } from '../core/data-transform'
31
+ import { normalize_to_scene } from '../core/reference-line'
32
+ import ReferenceLine3D from '../core/components/ReferenceLine3D.svelte'
33
+ import ReferencePlane from '../core/components/ReferencePlane.svelte'
34
+ import { create_size_scale } from '../core/scales'
35
35
  import Surface3D from './Surface3D.svelte'
36
36
 
37
37
  let {
@@ -45,7 +45,7 @@
45
45
  surfaces = [],
46
46
  ref_lines = [],
47
47
  ref_planes = [],
48
- color_scale = { type: `linear`, scheme: `interpolateViridis` },
48
+ color_scale_fn = () => get_series_color(0),
49
49
  size_scale = { type: `linear`, radius_range: [0.05, 0.2] },
50
50
  camera_position = [10, 10, 10] as Vec3,
51
51
  camera_projection = `perspective` as CameraProjection3D,
@@ -81,16 +81,9 @@
81
81
  surfaces?: Surface3DConfig[]
82
82
  ref_lines?: RefLine3D[]
83
83
  ref_planes?: RefPlane[]
84
- color_scale?: {
85
- type?: ScaleType
86
- scheme?: D3ColorSchemeName | D3InterpolateName
87
- value_range?: [number, number]
88
- }
89
- size_scale?: {
90
- type?: ScaleType
91
- radius_range?: [number, number]
92
- value_range?: [number, number]
93
- }
84
+ // Color scale function for color_values (computed once by the ScatterPlot3D wrapper)
85
+ color_scale_fn?: (value: number) => string
86
+ size_scale?: SizeScaleConfig
94
87
  camera_position?: Vec3
95
88
  camera_projection?: CameraProjection3D
96
89
  auto_rotate?: number
@@ -116,10 +109,10 @@
116
109
  height?: number
117
110
  } = $props()
118
111
 
119
- const threlte = useThrelte()
120
- $effect(() => {
121
- scene = threlte.scene
122
- camera = threlte.camera.current
112
+ // Mirrors scene/camera into bindable props and tags the canvas so export_canvas_as_png can re-render at export DPI
113
+ bind_renderer((threlte_scene, threlte_camera) => {
114
+ scene = threlte_scene
115
+ camera = threlte_camera
123
116
  })
124
117
 
125
118
  extras.interactivity()
@@ -182,24 +175,28 @@
182
175
  function sample_surface(
183
176
  surface: Surface3DConfig,
184
177
  ): { x: number; y: number; z: number }[] {
185
- const n = 10
178
+ const grid_steps = 10
186
179
  const pts: { x: number; y: number; z: number }[] = []
187
180
  if (surface.type === `grid` && surface.z_fn) {
188
181
  const [x0, x1] = surface.x_range ?? [-1, 1]
189
182
  const [y0, y1] = surface.y_range ?? [-1, 1]
190
- for (let i = 0; i <= n; i++) {
191
- for (let j = 0; j <= n; j++) {
192
- const x = x0 + (i / n) * (x1 - x0), y = y0 + (j / n) * (y1 - y0)
183
+ for (let idx_x = 0; idx_x <= grid_steps; idx_x++) {
184
+ for (let idx_y = 0; idx_y <= grid_steps; idx_y++) {
185
+ const x = x0 + (idx_x / grid_steps) * (x1 - x0),
186
+ y = y0 + (idx_y / grid_steps) * (y1 - y0)
193
187
  pts.push({ x, y, z: surface.z_fn(x, y) })
194
188
  }
195
189
  }
196
190
  } else if (surface.type === `parametric` && surface.parametric_fn) {
197
191
  const [u0, u1] = surface.u_range ?? [0, 1]
198
192
  const [v0, v1] = surface.v_range ?? [0, 1]
199
- for (let i = 0; i <= n; i++) {
200
- for (let j = 0; j <= n; j++) {
193
+ for (let idx_u = 0; idx_u <= grid_steps; idx_u++) {
194
+ for (let idx_v = 0; idx_v <= grid_steps; idx_v++) {
201
195
  pts.push(
202
- surface.parametric_fn(u0 + (i / n) * (u1 - u0), v0 + (j / n) * (v1 - v0)),
196
+ surface.parametric_fn(
197
+ u0 + (idx_u / grid_steps) * (u1 - u0),
198
+ v0 + (idx_v / grid_steps) * (v1 - v0),
199
+ ),
203
200
  )
204
201
  }
205
202
  }
@@ -209,15 +206,14 @@
209
206
  return pts.filter((pt) => isFinite(pt.x) && isFinite(pt.y) && isFinite(pt.z))
210
207
  }
211
208
 
212
- // Compute axis range with D3's nice() for clean boundaries
209
+ // Compute axis range with D3's nice(); data_min/data_max are the finite extent (Infinity/-Infinity when empty)
213
210
  function compute_range(
214
- values: number[],
211
+ [data_min, data_max]: Vec2,
215
212
  range?: [number | null, number | null],
216
213
  ): Vec2 {
217
214
  if (range?.[0] != null && range?.[1] != null) return range as Vec2
218
- const valid = values.filter(isFinite)
219
- if (!valid.length) return [0, 1]
220
- let [min, max] = [Math.min(...valid), Math.max(...valid)]
215
+ if (data_min > data_max) return [0, 1] // no finite values
216
+ let [min, max] = [data_min, data_max]
221
217
  const pad = min === max
222
218
  ? (min === 0 ? 1 : Math.abs(min * 0.1))
223
219
  : (max - min) * 0.05
@@ -227,49 +223,39 @@
227
223
  .domain() as Vec2
228
224
  }
229
225
 
230
- // Collect xyz values from points and surfaces
226
+ // Collect xyz extents from points and surfaces in one pass (no intermediate arrays)
231
227
  let surface_samples = $derived(surfaces.flatMap(sample_surface))
232
- let x_range = $derived(
233
- compute_range([
234
- ...all_points.map((point) => point.x),
235
- ...surface_samples.map((point) => point.x),
236
- ], x_axis.range),
237
- )
238
- let y_range = $derived(
239
- compute_range([
240
- ...all_points.map((point) => point.y),
241
- ...surface_samples.map((point) => point.y),
242
- ], y_axis.range),
243
- )
244
- let z_range = $derived(
245
- compute_range([
246
- ...all_points.map((point) => point.z),
247
- ...surface_samples.map((point) => point.z),
248
- ], z_axis.range),
249
- )
228
+ let data_extents = $derived.by(() => {
229
+ const extents = {
230
+ x: [Infinity, -Infinity] as Vec2,
231
+ y: [Infinity, -Infinity] as Vec2,
232
+ z: [Infinity, -Infinity] as Vec2,
233
+ }
234
+ for (const points of [all_points, surface_samples]) {
235
+ for (const pt of points) {
236
+ for (const axis of [`x`, `y`, `z`] as const) {
237
+ const val = pt[axis]
238
+ if (!isFinite(val)) continue
239
+ const extent = extents[axis]
240
+ if (val < extent[0]) extent[0] = val
241
+ if (val > extent[1]) extent[1] = val
242
+ }
243
+ }
244
+ }
245
+ return extents
246
+ })
247
+ let x_range = $derived(compute_range(data_extents.x, x_axis.range))
248
+ let y_range = $derived(compute_range(data_extents.y, y_axis.range))
249
+ let z_range = $derived(compute_range(data_extents.z, z_axis.range))
250
250
 
251
251
  const normalize_x = (value: number) => normalize_to_scene(value, x_range, scene_x)
252
252
  const normalize_y = (value: number) => normalize_to_scene(value, y_range, scene_y)
253
253
  const normalize_z = (value: number) => normalize_to_scene(value, z_range, scene_z)
254
254
 
255
- // Color/size scales
256
- let all_color_values = $derived(
257
- all_points.map((pt) => pt.color_value).filter((val): val is number => val != null),
258
- )
259
- let auto_color_range: [number, number] = $derived.by(() => {
260
- if (!all_color_values.length) return [0, 1]
261
- let min = all_color_values[0]
262
- let max = all_color_values[0]
263
- for (const val of all_color_values) {
264
- if (val < min) min = val
265
- else if (val > max) max = val
266
- }
267
- return [min, max]
268
- })
255
+ // Size scale (the color scale is computed by the wrapper and passed as a prop)
269
256
  let all_size_values = $derived(
270
257
  all_points.map((pt) => pt.size_value).filter((val): val is number => val != null),
271
258
  )
272
- let color_scale_fn = $derived(create_color_scale(color_scale, auto_color_range))
273
259
  let size_scale_fn = $derived(create_size_scale(size_scale, all_size_values))
274
260
 
275
261
  // Process points with normalized positions
@@ -331,83 +317,98 @@
331
317
  )
332
318
 
333
319
  // Series line data for connecting points
334
- type SeriesLineData = {
320
+ type SeriesLineInput = {
335
321
  series_idx: number
322
+ positions: number[]
336
323
  color: string
337
324
  width: number
338
325
  dashed: boolean
326
+ }
327
+ type SeriesLineData = SeriesLineInput & {
339
328
  line2: Line2
340
329
  geometry: LineGeometry
341
330
  material: LineMaterial
342
331
  }
343
332
 
344
- // Track previous lines for cleanup
345
- let series_lines: SeriesLineData[] = $state([])
346
-
347
- $effect(() => {
348
- // Dispose old lines before creating new ones
349
- for (const line_data of untrack(() => series_lines)) {
350
- line_data.geometry.dispose()
351
- line_data.material.dispose()
352
- }
353
-
354
- const lines: SeriesLineData[] = []
333
+ // Per-series fat-line inputs (ordered positions + resolved stroke style) as a derived so
334
+ // the effect below can diff against previous lines and only rebuild what changed
335
+ let line_inputs = $derived.by((): SeriesLineInput[] => {
336
+ const eligible: SeriesLineInput[] = []
337
+ const positions_by_series = new Map<number, number[]>()
355
338
  for (let series_idx = 0; series_idx < series.length; series_idx++) {
356
339
  const srs = series[series_idx]
357
- if (!srs?.line_style) continue
340
+ const line_style = srs?.line_style
341
+ if (!line_style) continue
358
342
  if (!(series_visibility[series_idx] ?? srs.visible ?? true)) continue
359
-
360
- // Get points for this series in order
361
- const series_points = processed_points
362
- .filter((pt) => pt.series_idx === series_idx)
363
- .sort((a, b) => a.point_idx - b.point_idx)
364
-
365
- if (series_points.length < 2) continue
366
-
367
- // Create fat line geometry (LineGeometry for Line2)
368
343
  const positions: number[] = []
369
- for (const pt of series_points) {
370
- positions.push(pt.x, pt.y, pt.z)
371
- }
372
- const geometry = new LineGeometry()
373
- geometry.setPositions(positions)
374
-
375
- // Determine line style
376
- const line_style = srs.line_style
344
+ positions_by_series.set(series_idx, positions)
377
345
  const color = line_style.stroke ??
378
346
  (Array.isArray(srs.point_style)
379
347
  ? srs.point_style[0]?.fill
380
348
  : srs.point_style?.fill) ??
381
349
  get_series_color(series_idx)
382
- const line_width = line_style.stroke_width ?? 2
383
- const dashed = Boolean(line_style.line_dash)
384
-
385
- // Create LineMaterial for fat lines (linewidth is in pixels when resolution is set)
386
- // Use placeholder resolution; the separate resolution effect updates it
387
- const material = new LineMaterial({
388
- color: new THREE.Color(color).getHex(),
389
- linewidth: line_width, // Width in pixels
390
- dashed,
391
- dashScale: dashed ? 2 : 1,
392
- dashSize: 0.1,
393
- gapSize: 0.05,
394
- resolution: new THREE.Vector2(1, 1),
395
- })
396
-
397
- const line2 = new Line2(geometry, material)
398
- line2.computeLineDistances()
399
-
400
- lines.push({
350
+ eligible.push({
401
351
  series_idx,
352
+ positions,
402
353
  color,
403
- width: line_width,
404
- dashed,
405
- line2,
406
- geometry,
407
- material,
354
+ width: line_style.stroke_width ?? 2,
355
+ dashed: Boolean(line_style.line_dash),
408
356
  })
409
357
  }
410
- series_lines = lines
358
+ // processed_points are emitted in (series_idx, point_idx) order, so one ordered pass replaces the old per-series filter + sort
359
+ for (const pt of processed_points) {
360
+ positions_by_series.get(pt.series_idx)?.push(pt.x, pt.y, pt.z)
361
+ }
362
+ return eligible.filter((input) => input.positions.length >= 6) // >= 2 points
363
+ })
364
+
365
+ const same_line_input = (prev: SeriesLineData, next: SeriesLineInput): boolean =>
366
+ prev.color === next.color && prev.width === next.width &&
367
+ prev.dashed === next.dashed &&
368
+ prev.positions.length === next.positions.length &&
369
+ prev.positions.every((coord, idx) => coord === next.positions[idx])
370
+
371
+ // Track previous lines for reuse/cleanup
372
+ let series_lines: SeriesLineData[] = $state([])
373
+
374
+ $effect(() => {
375
+ const inputs = line_inputs
376
+ untrack(() => {
377
+ const prev_by_idx = new Map(series_lines.map((line) => [line.series_idx, line]))
378
+ const next_lines = inputs.map((input): SeriesLineData => {
379
+ const prev = prev_by_idx.get(input.series_idx)
380
+ if (prev && same_line_input(prev, input)) {
381
+ prev_by_idx.delete(input.series_idx) // reused - don't dispose below
382
+ return prev
383
+ }
384
+ // Create fat line geometry (LineGeometry for Line2)
385
+ const geometry = new LineGeometry()
386
+ geometry.setPositions(input.positions)
387
+ // Create LineMaterial for fat lines (linewidth is in pixels when resolution
388
+ // is set). Use placeholder resolution; the separate resolution effect updates it
389
+ const material = new LineMaterial({
390
+ color: new THREE.Color(input.color).getHex(),
391
+ linewidth: input.width, // Width in pixels
392
+ dashed: input.dashed,
393
+ dashScale: input.dashed ? 2 : 1,
394
+ dashSize: 0.1,
395
+ gapSize: 0.05,
396
+ resolution: new THREE.Vector2(1, 1),
397
+ })
398
+ const line2 = new Line2(geometry, material)
399
+ line2.computeLineDistances()
400
+ return { ...input, line2, geometry, material }
401
+ })
402
+ // Dispose lines that were replaced or removed
403
+ for (const stale of prev_by_idx.values()) {
404
+ stale.geometry.dispose()
405
+ stale.material.dispose()
406
+ }
407
+ // Skip reassignment when every line was reused to avoid invalidating consumers
408
+ const unchanged = next_lines.length === series_lines.length &&
409
+ next_lines.every((line, idx) => line === series_lines[idx])
410
+ if (!unchanged) series_lines = next_lines
411
+ })
411
412
  })
412
413
 
413
414
  // Update LineMaterial resolution when canvas size changes
@@ -434,7 +435,7 @@
434
435
 
435
436
  // Generate axis ticks using D3's smart tick generation
436
437
  function gen_ticks(
437
- range: [number, number],
438
+ range: Vec2,
438
439
  ticks?: AxisConfig3D[`ticks`],
439
440
  ): number[] {
440
441
  if (Array.isArray(ticks)) return ticks