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,8 +1,9 @@
1
1
  // Fill-between utility functions for ScatterPlot fill regions
2
2
  // Each fill edge is traced through its boundary's own points with the same curve the series line
3
- // uses (curveMonotoneX), so an unclipped fill edge coincides with the line it borders. When an
4
- // edge is clipped (x_range / partial overlap), the inserted endpoint shifts the neighboring
5
- // monotone tangent, so the clipped edge can deviate sub-pixel from the full series line.
3
+ // uses (a series edge inherits the series' `line_style.curve`, default monotoneX), so an unclipped
4
+ // fill edge coincides with the line it borders. When an edge is clipped (x_range / partial
5
+ // overlap), inserted endpoints are evaluated on a monotone-cubic approximation: sub-pixel for
6
+ // monotoneX/linear/step, but natural/basis/catmullRom edges can deviate more at the clip points.
6
7
  import { curveBasis, curveCardinal, curveCatmullRom, curveLinear, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore, line, } from 'd3-shape';
7
8
  // Epsilon value for log scale clamping (to avoid log(0) = -Infinity)
8
9
  export const LOG_EPSILON = 1e-10;
@@ -145,6 +146,19 @@ const finite_points = (xs, ys) => clean_pts(Array.from({ length: Math.min(xs.len
145
146
  x: xs[idx],
146
147
  y: ys[idx],
147
148
  })));
149
+ // Bridge the public LineCurve vocabulary (series `line_style.curve`) to FillCurveType names so
150
+ // a series fill edge traces with the same curve as its rendered line. Default: monotoneX.
151
+ const LINE_CURVE_TO_FILL = {
152
+ linear: `linear`,
153
+ monotone: `monotoneX`,
154
+ natural: `natural`,
155
+ step: `step`,
156
+ basis: `basis`,
157
+ 'catmull-rom': `catmullRom`,
158
+ };
159
+ const line_curve_to_fill = (curve) =>
160
+ // ?? monotoneX guards an unknown string from an untyped (Python/JSON) caller
161
+ (curve ? LINE_CURVE_TO_FILL[curve] : undefined) ?? `monotoneX`;
148
162
  // Resolve a boundary to native points + curve in data coordinates. `companion` supplies x
149
163
  // positions for boundaries that don't define their own (constant/axis/function/data-without-x).
150
164
  export function resolve_boundary_points(boundary, series, domains, companion) {
@@ -157,15 +171,16 @@ export function resolve_boundary_points(boundary, series, domains, companion) {
157
171
  points: horizontal(span_xs, y),
158
172
  curve: `linear`,
159
173
  });
160
- // series / function / data edges are traced with monotoneX (matches the series line)
161
- const curved_edge = (points) => points.length > 0 ? { points, curve: `monotoneX` } : null;
174
+ // function / data edges trace with monotoneX by default; a series edge inherits the
175
+ // series' own line curve so the fill border coincides with the rendered line
176
+ const curved_edge = (points, curve = `monotoneX`) => (points.length > 0 ? { points, curve } : null);
162
177
  if (typeof boundary === `number`)
163
178
  return flat_edge(boundary);
164
179
  if (boundary.type === `series`) {
165
180
  const resolved = resolve_series_ref(boundary, series);
166
181
  if (!resolved)
167
182
  return null;
168
- return curved_edge(finite_points(resolved.x, resolved.y));
183
+ return curved_edge(finite_points(resolved.x, resolved.y), line_curve_to_fill(resolved.line_style?.curve));
169
184
  }
170
185
  if (boundary.type === `constant`)
171
186
  return flat_edge(boundary.value);
@@ -345,6 +360,10 @@ const CURVE_MAP = {
345
360
  natural: curveNatural,
346
361
  };
347
362
  const get_curve = (curve_type) => CURVE_MAP[curve_type] ?? curveMonotoneX;
363
+ // Resolve a public LineCurve (a series' `line_style.curve`) to its d3 CurveFactory. Single source
364
+ // of truth shared by Line.svelte and PlotMarginals.svelte (composes the LineCurve -> FillCurveType
365
+ // -> CurveFactory maps); unknown/undefined falls back to curveMonotoneX.
366
+ export const line_curve_factory = (curve) => get_curve(line_curve_to_fill(curve));
348
367
  const trace = (points, curve_type) => line()
349
368
  .x((pt) => pt.x)
350
369
  .y((pt) => pt.y)
@@ -378,6 +397,9 @@ export function convert_error_band_to_fill_region(error_band, series, default_co
378
397
  return {
379
398
  id: error_band.id,
380
399
  label: error_band.label,
400
+ // band edges are data boundaries (default monotoneX); inherit the central series' line
401
+ // curve so the band traces with the same curve as the line it brackets
402
+ curve: line_curve_to_fill(resolved.line_style?.curve),
381
403
  upper: { type: `data`, x, values: y.map((val, idx) => val + upper_err[idx]) },
382
404
  lower: { type: `data`, x, values: y.map((val, idx) => val - lower_err[idx]) },
383
405
  fill: error_band.fill ?? default_color ?? `#4e79a7`,
@@ -3,6 +3,7 @@ export * from './data-cleaning';
3
3
  export * from './fill-utils';
4
4
  export * from './interactions';
5
5
  export * from './layout';
6
+ export * from './marginals';
6
7
  export * from './reference-line';
7
8
  export * from './scales';
8
9
  export * from './svg';
@@ -4,6 +4,7 @@ export * from './data-cleaning';
4
4
  export * from './fill-utils';
5
5
  export * from './interactions';
6
6
  export * from './layout';
7
+ export * from './marginals';
7
8
  export * from './reference-line';
8
9
  export * from './scales';
9
10
  export * from './svg';
@@ -7,8 +7,6 @@ export function get_relative_coords(evt, element = evt.currentTarget) {
7
7
  if (!(element instanceof Element))
8
8
  return null;
9
9
  const box = element.getBoundingClientRect();
10
- if (!box)
11
- return null;
12
10
  return { x: evt.clientX - box.left, y: evt.clientY - box.top };
13
11
  }
14
12
  // Resolve a delegated event to the integer value of the nearest ancestor's data
@@ -5,14 +5,20 @@ export type Sides = {
5
5
  l?: number;
6
6
  r?: number;
7
7
  };
8
- export declare const LABEL_GAP_DEFAULT = 30;
8
+ export declare const LABEL_GAP_DEFAULT = 20;
9
+ export declare const DEFAULT_PLOT_PADDING: Required<Sides>;
9
10
  export declare function y2_axis_label_x(axis: AxisConfig, width: number, pad_r: number, max_tick_width: number): number;
10
11
  export declare const filter_padding: (padding: Partial<Sides> | undefined | null, defaults: Required<Sides>) => Required<Sides>;
11
12
  export declare function measure_text_width(text: string, font?: string): number;
12
- export declare function measure_full_footprint(el: HTMLElement): {
13
+ type Size = {
13
14
  width: number;
14
15
  height: number;
15
16
  };
17
+ type ElementFootprint = Size & {
18
+ offset_x: number;
19
+ offset_y: number;
20
+ };
21
+ export declare const full_footprint_or: (el: HTMLElement | null | undefined, fallback: Size) => ElementFootprint;
16
22
  export interface AutoPaddingConfig {
17
23
  padding: Partial<Sides>;
18
24
  default_padding: Required<Sides>;
@@ -30,6 +36,7 @@ export interface AutoPaddingConfig {
30
36
  export declare const measure_max_tick_width: (ticks: (string | number)[], format?: string) => number;
31
37
  export declare const TICK_LABEL_HEIGHT = 16;
32
38
  export declare const AXIS_LABEL_HEIGHT = 20;
39
+ export declare const AXIS_TITLE_OFFSET: number;
33
40
  export declare const calc_auto_padding: ({ padding, default_padding, x2_axis, y_axis, y2_axis, label_gap, }: AutoPaddingConfig) => Required<Sides>;
34
41
  export declare function constrain_tooltip_position(cursor_x: number, cursor_y: number, tooltip_width: number, tooltip_height: number, viewport_width: number, viewport_height: number, options?: {
35
42
  offset?: number;
@@ -50,10 +57,7 @@ export declare const centered_rect: (center_x: number, top_y: number, width: num
50
57
  export declare const rect_within_rect: (rect: Rect, bounds: Rect) => boolean;
51
58
  export interface ElementPlacementConfig {
52
59
  plot_bounds: Rect;
53
- element_size: {
54
- width: number;
55
- height: number;
56
- };
60
+ element_size: Size;
57
61
  element?: HTMLElement | null;
58
62
  axis_clearance?: number;
59
63
  exclude_rects?: Rect[];
@@ -68,6 +72,10 @@ export interface ElementPlacementResult {
68
72
  y: number;
69
73
  score: number;
70
74
  }
75
+ export declare const point_in_rect: (point: {
76
+ x: number;
77
+ y: number;
78
+ }, rect: Rect) => boolean;
71
79
  export declare const rects_overlap: (r1: Rect, r2: Rect) => boolean;
72
80
  export declare function sample_series_obstacle_points(pixel_points: {
73
81
  x: number;
@@ -77,3 +85,4 @@ export declare function sample_series_obstacle_points(pixel_points: {
77
85
  y: number;
78
86
  }[];
79
87
  export declare function compute_element_placement(config: ElementPlacementConfig): ElementPlacementResult;
88
+ export {};
@@ -1,7 +1,10 @@
1
1
  import { format_value } from '../../labels';
2
2
  import { euclidean_dist } from '../../math';
3
3
  // Default gap between tick labels and axis labels
4
- export const LABEL_GAP_DEFAULT = 30;
4
+ export const LABEL_GAP_DEFAULT = 20;
5
+ // Default plot padding (px) reserved for axis ticks/labels, shared by
6
+ // Histogram/BarPlot/BoxPlot/BinnedScatterPlot (ScatterPlot keeps its own bespoke default)
7
+ export const DEFAULT_PLOT_PADDING = { t: 20, b: 60, l: 60, r: 20 };
5
8
  // X position for a right-side (y2) axis label: past the plot edge plus tick shift and
6
9
  // measured tick-label width (both zero when tick labels render inside the plot)
7
10
  export function y2_axis_label_x(axis, width, pad_r, max_tick_width) {
@@ -28,23 +31,35 @@ export function measure_text_width(text, font = `12px sans-serif`) {
28
31
  ctx.font = font;
29
32
  return ctx.measureText(text).width;
30
33
  }
31
- // Measure an element's full visual footprint, including descendants that overflow its
32
- // offset box. Colorbar tick labels are position:absolute outside the bar, so
33
- // offsetWidth/offsetHeight underestimate the space they actually occupy — which lets
34
- // auto-placement put the colorbar where its labels overlap the axes.
35
- export function measure_full_footprint(el) {
34
+ function measure_full_footprint(el) {
36
35
  const root = el.getBoundingClientRect();
36
+ let left = root.left;
37
+ let top = root.top;
37
38
  let right = root.right;
38
39
  let bottom = root.bottom;
39
40
  for (const child of el.querySelectorAll(`*`)) {
40
41
  const rect = child.getBoundingClientRect();
41
42
  if (rect.width === 0 && rect.height === 0)
42
43
  continue;
44
+ left = Math.min(left, rect.left);
45
+ top = Math.min(top, rect.top);
43
46
  right = Math.max(right, rect.right);
44
47
  bottom = Math.max(bottom, rect.bottom);
45
48
  }
46
- return { width: right - root.left, height: bottom - root.top };
49
+ return {
50
+ width: right - left,
51
+ height: bottom - top,
52
+ offset_x: left - root.left,
53
+ offset_y: top - root.top,
54
+ };
47
55
  }
56
+ // Full footprint once the element is laid out, else `fallback` (offset dims read 0
57
+ // before first render). NOT interchangeable with auto-place's measured_footprint:
58
+ // that returns the offset box, which underestimates elements with overflowing
59
+ // absolutely-positioned descendants like colorbar tick labels.
60
+ export const full_footprint_or = (el, fallback) => el?.offsetWidth && el?.offsetHeight
61
+ ? measure_full_footprint(el)
62
+ : { ...fallback, offset_x: 0, offset_y: 0 };
48
63
  // Measure the widest formatted tick label. Used for auto-padding and label placement.
49
64
  export const measure_max_tick_width = (ticks, format = ``) => ticks.length === 0
50
65
  ? 0
@@ -56,22 +71,28 @@ export const measure_max_tick_width = (ticks, format = ``) => ticks.length === 0
56
71
  export const TICK_LABEL_HEIGHT = 16;
57
72
  // Estimated height of an axis label (font-size ~14px + margin)
58
73
  export const AXIS_LABEL_HEIGHT = 20;
74
+ // Distance from an x/x2 axis baseline to the title center.
75
+ export const AXIS_TITLE_OFFSET = TICK_LABEL_HEIGHT + LABEL_GAP_DEFAULT;
59
76
  export const calc_auto_padding = ({ padding, default_padding, x2_axis = {}, y_axis = {}, y2_axis = {}, label_gap = LABEL_GAP_DEFAULT, }) => {
60
- const x2_ticks = x2_axis.tick_values ?? [];
61
- const y_ticks = y_axis.tick_values ?? [];
62
- const y_format = y_axis.format ?? ``;
63
- const y2_ticks = y2_axis.tick_values ?? [];
64
- const y2_format = y2_axis.format ?? ``;
77
+ // Padding for a vertical-axis side (y/y2): when ticks render, reserve widest tick label + gap +
78
+ // the rotated axis-title width (mirrors the `t` branch's AXIS_LABEL_HEIGHT) so a wide tick label
79
+ // can't overlap the title. With no tick labels (e.g. no y2 series) reserve nothing extra.
80
+ const side_pad = (axis, default_side) => {
81
+ const ticks = axis.tick_values ?? [];
82
+ if (ticks.length === 0)
83
+ return default_side;
84
+ return Math.max(default_side, measure_max_tick_width(ticks, axis.format ?? ``) +
85
+ label_gap +
86
+ (axis.label ? AXIS_LABEL_HEIGHT : 0));
87
+ };
65
88
  return {
66
89
  t: padding.t ??
67
- (x2_ticks.length > 0
90
+ ((x2_axis.tick_values ?? []).length > 0
68
91
  ? Math.max(default_padding.t, TICK_LABEL_HEIGHT + label_gap + (x2_axis.label ? AXIS_LABEL_HEIGHT : 0))
69
92
  : default_padding.t),
70
93
  b: padding.b ?? default_padding.b,
71
- l: padding.l ??
72
- Math.max(default_padding.l, measure_max_tick_width(y_ticks, y_format) + label_gap),
73
- r: padding.r ??
74
- Math.max(default_padding.r, measure_max_tick_width(y2_ticks, y2_format) + label_gap),
94
+ l: padding.l ?? side_pad(y_axis, default_padding.l),
95
+ r: padding.r ?? side_pad(y2_axis, default_padding.r),
75
96
  };
76
97
  };
77
98
  // Constrain tooltip position within bounds, flipping to opposite side if overflow
@@ -139,7 +160,7 @@ const DISTANCE_WEIGHT = 0.001;
139
160
  const CORNER_WEIGHT = 5.0;
140
161
  const MAX_SAMPLE_POINTS = 500;
141
162
  // Check if a point is inside a rectangle
142
- const point_in_rect = (point, rect) => point.x >= rect.x &&
163
+ export const point_in_rect = (point, rect) => point.x >= rect.x &&
143
164
  point.x <= rect.x + rect.width &&
144
165
  point.y >= rect.y &&
145
166
  point.y <= rect.y + rect.height;
@@ -186,14 +207,16 @@ export function compute_element_placement(config) {
186
207
  // Measure the element's full footprint (incl. descendants that overflow its box,
187
208
  // such as colorbar tick labels) once it's laid out; fall back to element_size before
188
209
  // first render. Centralizing this keeps every plot's auto-placement overlap-free.
189
- const { width: elem_width, height: elem_height } = element?.offsetWidth && element?.offsetHeight
190
- ? measure_full_footprint(element)
191
- : element_size;
210
+ const { width: elem_width, height: elem_height, offset_x, offset_y, } = full_footprint_or(element, element_size);
192
211
  // Calculate valid placement region (plot bounds minus axis clearance)
193
- const valid_x_min = plot_bounds.x + axis_clearance;
194
- const valid_y_min = plot_bounds.y + axis_clearance;
195
- const valid_x_max = plot_bounds.x + plot_bounds.width - axis_clearance - elem_width;
196
- const valid_y_max = plot_bounds.y + plot_bounds.height - axis_clearance - elem_height;
212
+ const plot_left = plot_bounds.x + axis_clearance;
213
+ const plot_right = plot_bounds.x + plot_bounds.width - axis_clearance;
214
+ const plot_top = plot_bounds.y + axis_clearance;
215
+ const plot_bottom = plot_bounds.y + plot_bounds.height - axis_clearance;
216
+ const valid_x_min = plot_left - offset_x;
217
+ const valid_y_min = plot_top - offset_y;
218
+ const valid_x_max = plot_right - offset_x - elem_width;
219
+ const valid_y_max = plot_bottom - offset_y - elem_height;
197
220
  // Handle case where element is too large for the valid region
198
221
  const effective_x_min = Math.min(valid_x_min, valid_x_max);
199
222
  const effective_x_max = Math.max(valid_x_min, valid_x_max);
@@ -216,18 +239,14 @@ export function compute_element_placement(config) {
216
239
  ? (effective_y_max - effective_y_min) / (grid_resolution - 1)
217
240
  : 0;
218
241
  // Precompute plot corners (constant across all candidates)
219
- const plot_left = plot_bounds.x + axis_clearance;
220
- const plot_right = plot_bounds.x + plot_bounds.width - axis_clearance;
221
- const plot_top = plot_bounds.y + axis_clearance;
222
- const plot_bottom = plot_bounds.y + plot_bounds.height - axis_clearance;
223
242
  const max_corner_dist = euclidean_dist([plot_left, plot_top], [plot_right, plot_bottom]);
224
243
  for (let grid_x = 0; grid_x < grid_resolution; grid_x++) {
225
244
  for (let grid_y = 0; grid_y < grid_resolution; grid_y++) {
226
245
  const cand_x = effective_x_min + grid_x * x_step;
227
246
  const cand_y = effective_y_min + grid_y * y_step;
228
247
  const cand_rect = {
229
- x: cand_x,
230
- y: cand_y,
248
+ x: cand_x + offset_x,
249
+ y: cand_y + offset_y,
231
250
  width: elem_width,
232
251
  height: elem_height,
233
252
  };
@@ -241,8 +260,8 @@ export function compute_element_placement(config) {
241
260
  // Count points overlapping this candidate position
242
261
  let overlap_count = 0;
243
262
  let min_distance_sq = Infinity;
244
- const center_x = cand_x + elem_width / 2;
245
- const center_y = cand_y + elem_height / 2;
263
+ const center_x = cand_rect.x + elem_width / 2;
264
+ const center_y = cand_rect.y + elem_height / 2;
246
265
  for (const point of sampled_points) {
247
266
  if (point_in_rect(point, cand_rect)) {
248
267
  overlap_count++;
@@ -262,12 +281,12 @@ export function compute_element_placement(config) {
262
281
  // Corner preference: use element's actual corner (not center) for distance
263
282
  // This ensures a wide element at the left edge gets proper corner credit
264
283
  // (measured footprint, same as cand_rect — not the element_size fallback)
265
- const elem_right = cand_x + elem_width;
266
- const elem_bottom = cand_y + elem_height;
284
+ const elem_right = cand_rect.x + elem_width;
285
+ const elem_bottom = cand_rect.y + elem_height;
267
286
  // Distance from element's matching corner to each plot corner
268
- const min_corner_dist = Math.min(euclidean_dist([cand_x, cand_y], [plot_left, plot_top]), // top-left
269
- euclidean_dist([elem_right, cand_y], [plot_right, plot_top]), // top-right
270
- euclidean_dist([cand_x, elem_bottom], [plot_left, plot_bottom]), // bottom-left
287
+ const min_corner_dist = Math.min(euclidean_dist([cand_rect.x, cand_rect.y], [plot_left, plot_top]), // top-left
288
+ euclidean_dist([elem_right, cand_rect.y], [plot_right, plot_top]), // top-right
289
+ euclidean_dist([cand_rect.x, elem_bottom], [plot_left, plot_bottom]), // bottom-left
271
290
  euclidean_dist([elem_right, elem_bottom], [plot_right, plot_bottom]));
272
291
  // Higher bonus for positions closer to corners (0 = at corner, 1 = far from all)
273
292
  const corner_bonus = max_corner_dist > 0 ? (1 - min_corner_dist / max_corner_dist) * CORNER_WEIGHT : 0;
@@ -0,0 +1,170 @@
1
+ import type { Vec2 } from '../../math';
2
+ import type { Rect, Sides } from './layout';
3
+ import type { LineCurve, ScaleType } from './types';
4
+ import type { Snippet } from 'svelte';
5
+ export type MarginalSide = `top` | `bottom` | `left` | `right`;
6
+ export type MarginalType = `histogram` | `kde` | `cdf` | `rug`;
7
+ export type MarginalPlacement = `auto` | `flush` | `outer`;
8
+ export type MarginalNormalize = `count` | `density` | `probability`;
9
+ export type MarginalAxisBinding = `x1` | `x2` | `y1` | `y2`;
10
+ export declare const MARGINAL_SIDES: readonly ["top", "bottom", "left", "right"];
11
+ export type MarginalCurve = {
12
+ kind: `bars`;
13
+ bins: {
14
+ pos0: number;
15
+ pos1: number;
16
+ value: number;
17
+ }[];
18
+ max: number;
19
+ } | {
20
+ kind: `line`;
21
+ points: {
22
+ pos: number;
23
+ value: number;
24
+ }[];
25
+ max: number;
26
+ } | {
27
+ kind: `rug`;
28
+ positions: number[];
29
+ };
30
+ export interface MarginalComputeContext {
31
+ config: ResolvedMarginalConfig;
32
+ side: MarginalSide;
33
+ positional_range: Vec2;
34
+ scale_type: ScaleType;
35
+ }
36
+ export interface MarginalConfig {
37
+ type?: MarginalType;
38
+ size?: number;
39
+ gap?: number;
40
+ placement?: MarginalPlacement;
41
+ axis?: MarginalAxisBinding;
42
+ bins?: number;
43
+ bandwidth?: number | `silverman` | `scott`;
44
+ normalize?: MarginalNormalize;
45
+ per_series?: boolean;
46
+ color?: string;
47
+ fill?: string;
48
+ fill_opacity?: number;
49
+ stroke?: string;
50
+ stroke_width?: number;
51
+ opacity?: number;
52
+ curve?: LineCurve;
53
+ value_range?: Vec2;
54
+ value_axis?: boolean;
55
+ label?: string;
56
+ data?: readonly number[] | ((ctx: MarginalComputeContext) => readonly number[]);
57
+ reduce?: (values: number[], weights: number[] | undefined, ctx: MarginalComputeContext) => MarginalCurve;
58
+ snippet?: Snippet<[MarginalRenderContext]>;
59
+ hover?: boolean;
60
+ tooltip?: Snippet<[MarginalHover]>;
61
+ class?: string;
62
+ style?: string;
63
+ }
64
+ export type ResolvedMarginalConfig = MarginalConfig & {
65
+ type: MarginalType;
66
+ size: number;
67
+ gap: number;
68
+ placement: MarginalPlacement;
69
+ per_series: boolean;
70
+ bins: number;
71
+ bandwidth: number | `silverman` | `scott`;
72
+ stroke_width: number;
73
+ opacity: number;
74
+ value_axis: boolean;
75
+ };
76
+ export type MarginalSideInput = boolean | MarginalType | MarginalConfig;
77
+ export type MarginalsProp = boolean | MarginalType | Partial<Record<MarginalSide, MarginalSideInput>>;
78
+ export type ResolvedMarginals = Record<MarginalSide, ResolvedMarginalConfig | null>;
79
+ export interface MarginalSeriesInput {
80
+ x?: ArrayLike<number>;
81
+ y?: ArrayLike<number>;
82
+ weight?: ArrayLike<number>;
83
+ color: string;
84
+ label?: string;
85
+ visible?: boolean;
86
+ x_axis?: `x1` | `x2`;
87
+ y_axis?: `y1` | `y2`;
88
+ }
89
+ export interface MarginalSeriesCurve {
90
+ series_idx: number;
91
+ color: string;
92
+ label?: string;
93
+ curve: MarginalCurve;
94
+ }
95
+ export type ScaleFn = (value: number) => number;
96
+ export interface MarginalAxis {
97
+ scale: ScaleFn;
98
+ range: Vec2;
99
+ scale_type?: ScaleType;
100
+ format?: string;
101
+ tick_label?: (value: number) => string | undefined;
102
+ label?: string;
103
+ }
104
+ export type MarginalAxes = {
105
+ x1: MarginalAxis;
106
+ x2?: MarginalAxis;
107
+ y1: MarginalAxis;
108
+ y2?: MarginalAxis;
109
+ };
110
+ export declare const marginal_axis: (scale: ScaleFn, range: Vec2, axis: {
111
+ scale_type?: ScaleType;
112
+ format?: string;
113
+ label?: string;
114
+ }, tick_label?: (value: number) => string | undefined) => MarginalAxis;
115
+ export interface MarginalRenderContext extends MarginalComputeContext {
116
+ rect: Rect;
117
+ positional_scale: ScaleFn;
118
+ value_scale: ScaleFn;
119
+ baseline: number;
120
+ curves: MarginalSeriesCurve[];
121
+ series: MarginalSeriesInput[];
122
+ format?: string;
123
+ tick_label?: (value: number) => string | undefined;
124
+ axis_title?: string;
125
+ }
126
+ export declare const MARGINAL_HIT_TOLERANCE_PX = 10;
127
+ export interface MarginalHover {
128
+ side: MarginalSide;
129
+ x: number;
130
+ y: number;
131
+ color: string;
132
+ label?: string;
133
+ kind: MarginalCurve[`kind`];
134
+ pos: number;
135
+ pos0?: number;
136
+ pos1?: number;
137
+ value?: number;
138
+ config: ResolvedMarginalConfig;
139
+ scale_type: ScaleType;
140
+ format?: string;
141
+ pos_label?: string;
142
+ axis_title?: string;
143
+ }
144
+ export declare function marginal_hit(ctx: MarginalRenderContext, px: number, py: number): MarginalHover | null;
145
+ export declare const MARGINAL_DEFAULTS: {
146
+ type: MarginalType;
147
+ size: number;
148
+ gap: number;
149
+ placement: MarginalPlacement;
150
+ per_series: boolean;
151
+ bins: number;
152
+ bandwidth: "silverman";
153
+ stroke_width: number;
154
+ opacity: number;
155
+ value_axis: boolean;
156
+ };
157
+ export declare function normalize_marginals(prop: MarginalsProp | undefined, default_sides?: Partial<Record<MarginalSide, MarginalSideInput>>): ResolvedMarginals;
158
+ export declare function reserve_marginal_pad(resolved: ResolvedMarginals): Required<Sides>;
159
+ export declare const add_sides: (a: Required<Sides>, b: Required<Sides>) => Required<Sides>;
160
+ export declare const default_axis_for_side: (side: MarginalSide) => MarginalAxisBinding;
161
+ export declare const marginal_axis_presence: (top: boolean, right: boolean) => Record<MarginalSide, boolean>;
162
+ export declare function marginal_strip_rect(side: MarginalSide, pad: Required<Sides>, width: number, height: number, config: ResolvedMarginalConfig, has_axis: boolean): Rect;
163
+ export declare function marginal_value_scale(side: MarginalSide, rect: Rect, domain: Vec2): {
164
+ scale: (value: number) => number;
165
+ baseline: number;
166
+ };
167
+ export declare function compute_marginal_curve(positions: ArrayLike<number>, weights: ArrayLike<number> | undefined, config: ResolvedMarginalConfig, positional_range: Vec2, scale_type: ScaleType): MarginalCurve;
168
+ export declare const curves_max: (curves: MarginalCurve[]) => number;
169
+ export declare const default_marginal_label: (config: ResolvedMarginalConfig) => string;
170
+ export declare const marginal_value_format: (config: ResolvedMarginalConfig) => string;