matterviz 0.3.7 → 0.4.0

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 (324) 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 +8 -3
  6. package/dist/brillouin/BrillouinZone.svelte.d.ts +2 -1
  7. package/dist/brillouin/BrillouinZoneScene.svelte +52 -6
  8. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -0
  9. package/dist/brillouin/BrillouinZoneTooltip.svelte +16 -25
  10. package/dist/brillouin/compute.js +10 -14
  11. package/dist/chempot-diagram/ChemPotDiagram.svelte +14 -13
  12. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +12 -15
  13. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +8 -10
  14. package/dist/chempot-diagram/async-compute.svelte.js +3 -1
  15. package/dist/chempot-diagram/chempot-worker.js +2 -1
  16. package/dist/chempot-diagram/compute.d.ts +1 -1
  17. package/dist/chempot-diagram/compute.js +17 -19
  18. package/dist/colors/index.js +6 -5
  19. package/dist/composition/FormulaFilter.svelte +12 -6
  20. package/dist/composition/PieChart.svelte +6 -5
  21. package/dist/composition/chem-sys.d.ts +8 -0
  22. package/dist/composition/chem-sys.js +85 -0
  23. package/dist/composition/format.js +4 -2
  24. package/dist/composition/index.d.ts +1 -0
  25. package/dist/composition/index.js +1 -0
  26. package/dist/composition/parse.js +25 -13
  27. package/dist/convex-hull/ConvexHull2D.svelte +12 -10
  28. package/dist/convex-hull/ConvexHull3D.svelte +5 -5
  29. package/dist/convex-hull/ConvexHull4D.svelte +5 -9
  30. package/dist/convex-hull/ConvexHullStats.svelte +12 -12
  31. package/dist/convex-hull/GasPressureControls.svelte +4 -4
  32. package/dist/convex-hull/TemperatureSlider.svelte +2 -2
  33. package/dist/convex-hull/demo-temperature.d.ts +1 -1
  34. package/dist/convex-hull/demo-temperature.js +20 -22
  35. package/dist/convex-hull/gas-thermodynamics.d.ts +2 -2
  36. package/dist/convex-hull/gas-thermodynamics.js +22 -30
  37. package/dist/convex-hull/helpers.d.ts +3 -0
  38. package/dist/convex-hull/helpers.js +17 -9
  39. package/dist/convex-hull/index.d.ts +1 -1
  40. package/dist/convex-hull/thermodynamics.js +83 -78
  41. package/dist/convex-hull/types.d.ts +1 -1
  42. package/dist/coordination/CoordinationBarPlot.svelte +23 -23
  43. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  44. package/dist/element/ElementTile.svelte.d.ts +1 -1
  45. package/dist/fermi-surface/FermiSlice.svelte +13 -5
  46. package/dist/fermi-surface/FermiSurface.svelte +11 -5
  47. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  48. package/dist/fermi-surface/FermiSurfaceControls.svelte +1 -1
  49. package/dist/fermi-surface/FermiSurfaceScene.svelte +3 -0
  50. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +8 -34
  51. package/dist/fermi-surface/compute.js +59 -59
  52. package/dist/fermi-surface/export.js +3 -2
  53. package/dist/fermi-surface/parse.js +7 -4
  54. package/dist/fermi-surface/types.d.ts +1 -0
  55. package/dist/heatmap-matrix/HeatmapMatrix.svelte +23 -21
  56. package/dist/heatmap-matrix/index.js +1 -1
  57. package/dist/io/decompress.js +4 -2
  58. package/dist/io/export.d.ts +4 -4
  59. package/dist/io/export.js +47 -25
  60. package/dist/io/fetch.js +5 -1
  61. package/dist/io/file-drop.d.ts +1 -1
  62. package/dist/io/file-drop.js +35 -36
  63. package/dist/io/url-drop.js +64 -33
  64. package/dist/isosurface/parse.js +6 -7
  65. package/dist/isosurface/slice.js +5 -4
  66. package/dist/isosurface/types.js +1 -1
  67. package/dist/keyboard.d.ts +3 -0
  68. package/dist/keyboard.js +23 -0
  69. package/dist/labels.d.ts +1 -1
  70. package/dist/labels.js +8 -7
  71. package/dist/layout/PropertyFilter.svelte +3 -2
  72. package/dist/layout/SettingsSection.svelte +1 -1
  73. package/dist/layout/json-tree/JsonNode.svelte +1 -1
  74. package/dist/layout/json-tree/JsonTree.svelte +2 -2
  75. package/dist/layout/json-tree/utils.js +5 -4
  76. package/dist/marching-cubes.js +8 -13
  77. package/dist/math.d.ts +5 -1
  78. package/dist/math.js +24 -9
  79. package/dist/overlays/DraggablePane.svelte +4 -4
  80. package/dist/periodic-table/PeriodicTable.svelte +20 -9
  81. package/dist/periodic-table/PropertySelect.svelte +1 -0
  82. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +9 -3
  83. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  84. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  85. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +2 -1
  86. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +1 -1
  87. package/dist/phase-diagram/build-diagram.js +2 -2
  88. package/dist/phase-diagram/parse.js +6 -5
  89. package/dist/phase-diagram/types.d.ts +1 -1
  90. package/dist/phase-diagram/utils.d.ts +3 -3
  91. package/dist/phase-diagram/utils.js +8 -12
  92. package/dist/plot/{BarPlot.svelte → bar/BarPlot.svelte} +229 -587
  93. package/dist/plot/{BarPlot.svelte.d.ts → bar/BarPlot.svelte.d.ts} +5 -5
  94. package/dist/plot/{BarPlotControls.svelte → bar/BarPlotControls.svelte} +6 -5
  95. package/dist/plot/{BarPlotControls.svelte.d.ts → bar/BarPlotControls.svelte.d.ts} +3 -3
  96. package/dist/plot/{SpacegroupBarPlot.svelte → bar/SpacegroupBarPlot.svelte} +6 -6
  97. package/dist/plot/{SpacegroupBarPlot.svelte.d.ts → bar/SpacegroupBarPlot.svelte.d.ts} +1 -1
  98. package/dist/plot/bar/data.d.ts +40 -0
  99. package/dist/plot/bar/data.js +154 -0
  100. package/dist/plot/bar/geometry.d.ts +39 -0
  101. package/dist/plot/bar/geometry.js +60 -0
  102. package/dist/plot/bar/index.d.ts +3 -0
  103. package/dist/plot/bar/index.js +3 -0
  104. package/dist/plot/box/BoxPlot.svelte +1462 -0
  105. package/dist/plot/box/BoxPlot.svelte.d.ts +94 -0
  106. package/dist/plot/box/BoxPlotControls.svelte +109 -0
  107. package/dist/plot/box/BoxPlotControls.svelte.d.ts +19 -0
  108. package/dist/plot/box/Violin.svelte +14 -0
  109. package/dist/plot/box/Violin.svelte.d.ts +70 -0
  110. package/dist/plot/box/box-plot.d.ts +55 -0
  111. package/dist/plot/box/box-plot.js +126 -0
  112. package/dist/plot/box/index.d.ts +5 -0
  113. package/dist/plot/box/index.js +5 -0
  114. package/dist/plot/box/kde.d.ts +16 -0
  115. package/dist/plot/box/kde.js +160 -0
  116. package/dist/plot/box/quantile.d.ts +3 -0
  117. package/dist/plot/box/quantile.js +53 -0
  118. package/dist/plot/{auto-place.js → core/auto-place.js} +2 -2
  119. package/dist/plot/core/axis-utils.d.ts +46 -0
  120. package/dist/plot/core/axis-utils.js +110 -0
  121. package/dist/plot/{AxisLabel.svelte → core/components/AxisLabel.svelte} +2 -2
  122. package/dist/plot/{AxisLabel.svelte.d.ts → core/components/AxisLabel.svelte.d.ts} +1 -1
  123. package/dist/plot/{ColorBar.svelte → core/components/ColorBar.svelte} +36 -33
  124. package/dist/plot/{ColorBar.svelte.d.ts → core/components/ColorBar.svelte.d.ts} +2 -2
  125. package/dist/plot/{ColorScaleSelect.svelte → core/components/ColorScaleSelect.svelte} +4 -3
  126. package/dist/plot/{ColorScaleSelect.svelte.d.ts → core/components/ColorScaleSelect.svelte.d.ts} +2 -2
  127. package/dist/plot/core/components/ControlPane.svelte +46 -0
  128. package/dist/plot/core/components/ControlPane.svelte.d.ts +13 -0
  129. package/dist/plot/{FillArea.svelte → core/components/FillArea.svelte} +17 -6
  130. package/dist/plot/{FillArea.svelte.d.ts → core/components/FillArea.svelte.d.ts} +1 -1
  131. package/dist/plot/{InteractiveAxisLabel.svelte → core/components/InteractiveAxisLabel.svelte} +3 -3
  132. package/dist/plot/{InteractiveAxisLabel.svelte.d.ts → core/components/InteractiveAxisLabel.svelte.d.ts} +2 -2
  133. package/dist/plot/{Line.svelte → core/components/Line.svelte} +30 -13
  134. package/dist/plot/{PlotAxis.svelte → core/components/PlotAxis.svelte} +7 -5
  135. package/dist/plot/{PlotAxis.svelte.d.ts → core/components/PlotAxis.svelte.d.ts} +3 -2
  136. package/dist/plot/{PlotControls.svelte → core/components/PlotControls.svelte} +17 -29
  137. package/dist/plot/core/components/PlotControls.svelte.d.ts +4 -0
  138. package/dist/plot/{PlotLegend.svelte → core/components/PlotLegend.svelte} +21 -10
  139. package/dist/plot/{PlotLegend.svelte.d.ts → core/components/PlotLegend.svelte.d.ts} +3 -2
  140. package/dist/plot/{PlotTooltip.svelte → core/components/PlotTooltip.svelte} +17 -1
  141. package/dist/plot/{PlotTooltip.svelte.d.ts → core/components/PlotTooltip.svelte.d.ts} +8 -0
  142. package/dist/plot/{PortalSelect.svelte → core/components/PortalSelect.svelte} +11 -7
  143. package/dist/plot/{ReferenceLine.svelte → core/components/ReferenceLine.svelte} +3 -3
  144. package/dist/plot/{ReferenceLine.svelte.d.ts → core/components/ReferenceLine.svelte.d.ts} +1 -1
  145. package/dist/plot/{ReferenceLine3D.svelte → core/components/ReferenceLine3D.svelte} +4 -4
  146. package/dist/plot/{ReferenceLine3D.svelte.d.ts → core/components/ReferenceLine3D.svelte.d.ts} +2 -2
  147. package/dist/plot/{ReferencePlane.svelte → core/components/ReferencePlane.svelte} +7 -7
  148. package/dist/plot/{ReferencePlane.svelte.d.ts → core/components/ReferencePlane.svelte.d.ts} +2 -2
  149. package/dist/plot/{ZeroLines.svelte → core/components/ZeroLines.svelte} +3 -3
  150. package/dist/plot/{ZeroLines.svelte.d.ts → core/components/ZeroLines.svelte.d.ts} +3 -3
  151. package/dist/plot/{ZoomRect.svelte → core/components/ZoomRect.svelte} +1 -1
  152. package/dist/plot/{ZoomRect.svelte.d.ts → core/components/ZoomRect.svelte.d.ts} +1 -1
  153. package/dist/plot/core/components/index.d.ts +17 -0
  154. package/dist/plot/core/components/index.js +17 -0
  155. package/dist/plot/{data-cleaning.d.ts → core/data-cleaning.d.ts} +71 -1
  156. package/dist/plot/{data-cleaning.js → core/data-cleaning.js} +3 -5
  157. package/dist/plot/{data-transform.d.ts → core/data-transform.d.ts} +2 -2
  158. package/dist/plot/{data-transform.js → core/data-transform.js} +3 -3
  159. package/dist/plot/core/fill-utils.d.ts +33 -0
  160. package/dist/plot/core/fill-utils.js +388 -0
  161. package/dist/plot/{hover-lock.svelte.js → core/hover-lock.svelte.js} +5 -6
  162. package/dist/plot/core/index.d.ts +10 -0
  163. package/dist/plot/core/index.js +11 -0
  164. package/dist/plot/core/interactions.d.ts +35 -0
  165. package/dist/plot/core/interactions.js +195 -0
  166. package/dist/plot/{layout.d.ts → core/layout.d.ts} +1 -0
  167. package/dist/plot/{layout.js → core/layout.js} +16 -8
  168. package/dist/plot/{reference-line.d.ts → core/reference-line.d.ts} +1 -1
  169. package/dist/plot/{reference-line.js → core/reference-line.js} +23 -36
  170. package/dist/plot/{scales.d.ts → core/scales.d.ts} +2 -2
  171. package/dist/plot/{scales.js → core/scales.js} +84 -85
  172. package/dist/plot/core/svg.d.ts +2 -0
  173. package/dist/plot/core/svg.js +41 -0
  174. package/dist/plot/{types.d.ts → core/types.d.ts} +19 -79
  175. package/dist/plot/{types.js → core/types.js} +1 -1
  176. package/dist/plot/{utils → core/utils}/label-placement.d.ts +2 -2
  177. package/dist/plot/core/utils/series-visibility.d.ts +26 -0
  178. package/dist/plot/{utils → core/utils}/series-visibility.js +29 -2
  179. package/dist/plot/core/utils.d.ts +11 -0
  180. package/dist/plot/core/utils.js +27 -0
  181. package/dist/plot/{Histogram.svelte → histogram/Histogram.svelte} +154 -294
  182. package/dist/plot/{Histogram.svelte.d.ts → histogram/Histogram.svelte.d.ts} +2 -2
  183. package/dist/plot/{HistogramControls.svelte → histogram/HistogramControls.svelte} +6 -6
  184. package/dist/plot/{HistogramControls.svelte.d.ts → histogram/HistogramControls.svelte.d.ts} +4 -4
  185. package/dist/plot/histogram/index.d.ts +2 -0
  186. package/dist/plot/histogram/index.js +2 -0
  187. package/dist/plot/index.d.ts +8 -41
  188. package/dist/plot/index.js +10 -39
  189. package/dist/plot/sankey/Sankey.svelte +700 -0
  190. package/dist/plot/sankey/Sankey.svelte.d.ts +74 -0
  191. package/dist/plot/sankey/SankeyControls.svelte +98 -0
  192. package/dist/plot/sankey/SankeyControls.svelte.d.ts +19 -0
  193. package/dist/plot/sankey/index.d.ts +4 -0
  194. package/dist/plot/sankey/index.js +3 -0
  195. package/dist/plot/sankey/sankey-types.d.ts +42 -0
  196. package/dist/plot/sankey/sankey-types.js +4 -0
  197. package/dist/plot/sankey/sankey.d.ts +52 -0
  198. package/dist/plot/sankey/sankey.js +187 -0
  199. package/dist/plot/{BinnedScatterPlot.svelte → scatter/BinnedScatterPlot.svelte} +61 -59
  200. package/dist/plot/{BinnedScatterPlot.svelte.d.ts → scatter/BinnedScatterPlot.svelte.d.ts} +4 -4
  201. package/dist/plot/{ElementScatter.svelte → scatter/ElementScatter.svelte} +6 -6
  202. package/dist/plot/{ElementScatter.svelte.d.ts → scatter/ElementScatter.svelte.d.ts} +2 -2
  203. package/dist/plot/{ScatterPlot.svelte → scatter/ScatterPlot.svelte} +221 -642
  204. package/dist/plot/{ScatterPlot.svelte.d.ts → scatter/ScatterPlot.svelte.d.ts} +7 -7
  205. package/dist/plot/{ScatterPlotControls.svelte → scatter/ScatterPlotControls.svelte} +6 -5
  206. package/dist/plot/{ScatterPlotControls.svelte.d.ts → scatter/ScatterPlotControls.svelte.d.ts} +1 -1
  207. package/dist/plot/{ScatterPoint.svelte → scatter/ScatterPoint.svelte} +7 -7
  208. package/dist/plot/{ScatterPoint.svelte.d.ts → scatter/ScatterPoint.svelte.d.ts} +3 -3
  209. package/dist/plot/{adaptive-density.d.ts → scatter/adaptive-density.d.ts} +14 -4
  210. package/dist/plot/{adaptive-density.js → scatter/adaptive-density.js} +46 -20
  211. package/dist/plot/{binned-scatter-types.d.ts → scatter/binned-scatter-types.d.ts} +3 -3
  212. package/dist/plot/scatter/index.d.ts +7 -0
  213. package/dist/plot/scatter/index.js +5 -0
  214. package/dist/plot/scatter/scatter-data.d.ts +19 -0
  215. package/dist/plot/scatter/scatter-data.js +212 -0
  216. package/dist/plot/{ScatterPlot3D.svelte → scatter-3d/ScatterPlot3D.svelte} +12 -10
  217. package/dist/plot/{ScatterPlot3D.svelte.d.ts → scatter-3d/ScatterPlot3D.svelte.d.ts} +7 -7
  218. package/dist/plot/{ScatterPlot3DControls.svelte → scatter-3d/ScatterPlot3DControls.svelte} +5 -4
  219. package/dist/plot/{ScatterPlot3DControls.svelte.d.ts → scatter-3d/ScatterPlot3DControls.svelte.d.ts} +2 -2
  220. package/dist/plot/{ScatterPlot3DScene.svelte → scatter-3d/ScatterPlot3DScene.svelte} +11 -11
  221. package/dist/plot/{ScatterPlot3DScene.svelte.d.ts → scatter-3d/ScatterPlot3DScene.svelte.d.ts} +3 -3
  222. package/dist/plot/{Surface3D.svelte → scatter-3d/Surface3D.svelte} +1 -1
  223. package/dist/plot/{Surface3D.svelte.d.ts → scatter-3d/Surface3D.svelte.d.ts} +1 -1
  224. package/dist/plot/scatter-3d/index.d.ts +4 -0
  225. package/dist/plot/scatter-3d/index.js +4 -0
  226. package/dist/plot/sunburst/Sunburst.svelte +1045 -0
  227. package/dist/plot/sunburst/Sunburst.svelte.d.ts +96 -0
  228. package/dist/plot/sunburst/SunburstControls.svelte +200 -0
  229. package/dist/plot/sunburst/SunburstControls.svelte.d.ts +26 -0
  230. package/dist/plot/sunburst/index.d.ts +4 -0
  231. package/dist/plot/sunburst/index.js +4 -0
  232. package/dist/plot/sunburst/render.d.ts +34 -0
  233. package/dist/plot/sunburst/render.js +122 -0
  234. package/dist/plot/sunburst/sunburst.d.ts +62 -0
  235. package/dist/plot/sunburst/sunburst.js +266 -0
  236. package/dist/rdf/RdfPlot.svelte +2 -1
  237. package/dist/rdf/calc-rdf.js +11 -24
  238. package/dist/sanitize.js +1 -1
  239. package/dist/settings.d.ts +65 -1
  240. package/dist/settings.js +262 -0
  241. package/dist/spectral/Bands.svelte +39 -29
  242. package/dist/spectral/Bands.svelte.d.ts +3 -4
  243. package/dist/spectral/BandsAndDos.svelte +1 -1
  244. package/dist/spectral/BrillouinBandsDos.svelte +39 -27
  245. package/dist/spectral/Dos.svelte +10 -19
  246. package/dist/spectral/Dos.svelte.d.ts +2 -2
  247. package/dist/spectral/helpers.d.ts +3 -1
  248. package/dist/spectral/helpers.js +95 -29
  249. package/dist/structure/AtomLegend.svelte +8 -9
  250. package/dist/structure/CellSelect.svelte +1 -2
  251. package/dist/structure/Cylinder.svelte +12 -8
  252. package/dist/structure/Cylinder.svelte.d.ts +4 -1
  253. package/dist/structure/Structure.svelte +78 -72
  254. package/dist/structure/Structure.svelte.d.ts +1 -1
  255. package/dist/structure/StructureInfoPane.svelte +5 -6
  256. package/dist/structure/StructureScene.svelte +11 -10
  257. package/dist/structure/atom-properties.js +6 -6
  258. package/dist/structure/bond-order-perception.js +1 -1
  259. package/dist/structure/bonding.d.ts +1 -0
  260. package/dist/structure/bonding.js +43 -15
  261. package/dist/structure/export.js +27 -23
  262. package/dist/structure/index.d.ts +2 -4
  263. package/dist/structure/index.js +1 -3
  264. package/dist/structure/label-placement.js +4 -4
  265. package/dist/structure/measure.d.ts +3 -2
  266. package/dist/structure/measure.js +6 -5
  267. package/dist/structure/parse.js +121 -103
  268. package/dist/structure/pbc.js +4 -0
  269. package/dist/symmetry/SymmetryStats.svelte +2 -2
  270. package/dist/symmetry/index.d.ts +1 -1
  271. package/dist/symmetry/index.js +22 -24
  272. package/dist/symmetry/spacegroups.d.ts +7 -0
  273. package/dist/symmetry/spacegroups.js +48 -13
  274. package/dist/table/HeatmapTable.svelte +63 -11
  275. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  276. package/dist/table/index.d.ts +1 -3
  277. package/dist/table/index.js +1 -1
  278. package/dist/theme/index.js +8 -8
  279. package/dist/tooltip/KCoords.svelte +45 -0
  280. package/dist/tooltip/KCoords.svelte.d.ts +8 -0
  281. package/dist/tooltip/index.d.ts +1 -0
  282. package/dist/tooltip/index.js +1 -0
  283. package/dist/trajectory/Trajectory.svelte +66 -40
  284. package/dist/trajectory/Trajectory.svelte.d.ts +2 -1
  285. package/dist/trajectory/TrajectoryExportPane.svelte +2 -1
  286. package/dist/trajectory/TrajectoryInfoPane.svelte +2 -1
  287. package/dist/trajectory/format-detect.d.ts +1 -0
  288. package/dist/trajectory/format-detect.js +25 -11
  289. package/dist/trajectory/frame-reader.js +17 -50
  290. package/dist/trajectory/helpers.js +1 -1
  291. package/dist/trajectory/index.js +1 -1
  292. package/dist/trajectory/parse/hdf5.js +1 -1
  293. package/dist/trajectory/parse/index.js +14 -6
  294. package/dist/trajectory/parse/vasp.js +36 -17
  295. package/dist/trajectory/parse/xyz.d.ts +24 -0
  296. package/dist/trajectory/parse/xyz.js +102 -89
  297. package/dist/trajectory/plotting.d.ts +1 -1
  298. package/dist/trajectory/plotting.js +15 -15
  299. package/dist/utils.d.ts +1 -0
  300. package/dist/utils.js +6 -4
  301. package/dist/xrd/XrdPlot.svelte +2 -1
  302. package/dist/xrd/calc-xrd.js +15 -12
  303. package/dist/xrd/parse.js +2 -2
  304. package/package.json +22 -18
  305. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  306. package/dist/plot/axis-utils.d.ts +0 -19
  307. package/dist/plot/axis-utils.js +0 -78
  308. package/dist/plot/defaults.d.ts +0 -19
  309. package/dist/plot/defaults.js +0 -9
  310. package/dist/plot/fill-utils.d.ts +0 -46
  311. package/dist/plot/fill-utils.js +0 -322
  312. package/dist/plot/interactions.d.ts +0 -12
  313. package/dist/plot/interactions.js +0 -101
  314. package/dist/plot/svg.d.ts +0 -1
  315. package/dist/plot/svg.js +0 -11
  316. package/dist/plot/utils/series-visibility.d.ts +0 -15
  317. package/dist/plot/utils.d.ts +0 -1
  318. package/dist/plot/utils.js +0 -14
  319. /package/dist/plot/{auto-place.d.ts → core/auto-place.d.ts} +0 -0
  320. /package/dist/plot/{Line.svelte.d.ts → core/components/Line.svelte.d.ts} +0 -0
  321. /package/dist/plot/{PortalSelect.svelte.d.ts → core/components/PortalSelect.svelte.d.ts} +0 -0
  322. /package/dist/plot/{hover-lock.svelte.d.ts → core/hover-lock.svelte.d.ts} +0 -0
  323. /package/dist/plot/{utils → core/utils}/label-placement.js +0 -0
  324. /package/dist/plot/{binned-scatter-types.js → scatter/binned-scatter-types.js} +0 -0
@@ -0,0 +1,3 @@
1
+ export declare function quickselect(values: number[], kth: number): number;
2
+ export declare function quantile_sorted(values: readonly number[], p: number): number;
3
+ export declare function quantile_unordered(values: number[], p: number): number;
@@ -0,0 +1,53 @@
1
+ // Shared quantile + selection helpers used by box-plot.ts and kde.ts.
2
+ // quickselect partially sorts in place; quantile_unordered mutates its input
3
+ // (quantile_sorted assumes an already-ascending array and never mutates).
4
+ //
5
+ // Unguarded contract: quickselect, quantile_sorted and quantile_unordered all assume
6
+ // values.length > 0 and 0 <= p <= 1. Out-of-range inputs index past the array and
7
+ // yield undefined/NaN — callers (box-plot.ts, kde.ts) must length- and p-range-check
8
+ // before calling.
9
+ export function quickselect(values, kth) {
10
+ let left = 0;
11
+ let right = values.length - 1;
12
+ while (left < right) {
13
+ const pivot = values[(left + right) >>> 1];
14
+ let scan_lo = left;
15
+ let scan_hi = right;
16
+ while (scan_lo <= scan_hi) {
17
+ while (values[scan_lo] < pivot)
18
+ scan_lo++;
19
+ while (values[scan_hi] > pivot)
20
+ scan_hi--;
21
+ if (scan_lo <= scan_hi) {
22
+ const tmp = values[scan_lo];
23
+ values[scan_lo] = values[scan_hi];
24
+ values[scan_hi] = tmp;
25
+ scan_lo++;
26
+ scan_hi--;
27
+ }
28
+ }
29
+ if (kth <= scan_hi)
30
+ right = scan_hi;
31
+ else if (kth >= scan_lo)
32
+ left = scan_lo;
33
+ else
34
+ return values[kth];
35
+ }
36
+ return values[kth];
37
+ }
38
+ export function quantile_sorted(values, p) {
39
+ const idx = (values.length - 1) * p;
40
+ const lo = Math.floor(idx);
41
+ const hi = Math.ceil(idx);
42
+ const frac = idx - lo;
43
+ const lo_val = values[lo];
44
+ return hi === lo ? lo_val : lo_val + (values[hi] - lo_val) * frac;
45
+ }
46
+ export function quantile_unordered(values, p) {
47
+ const idx = (values.length - 1) * p;
48
+ const lo = Math.floor(idx);
49
+ const hi = Math.ceil(idx);
50
+ const frac = idx - lo;
51
+ const lo_val = quickselect(values, lo);
52
+ return hi === lo ? lo_val : lo_val + (quickselect(values, hi) - lo_val) * frac;
53
+ }
@@ -1,4 +1,4 @@
1
- import { compute_element_placement, sample_series_obstacle_points } from './layout';
1
+ import { compute_element_placement, sample_series_obstacle_points, } from './layout';
2
2
  // Shared "move a decoration (legend/colorbar) outside the plot when interior overlap is
3
3
  // unavoidable" logic, reused by every 2D plot (ScatterPlot/BarPlot/Histogram/BinnedScatterPlot).
4
4
  export const DECOR_GAP = 8; // px gap between an outside decoration and the plot edge
@@ -55,7 +55,7 @@ export function clip_bar(vertical, cross, a, b) {
55
55
  const CROWDING_RATIO = 0.5;
56
56
  // True when even the best interior spot for `footprint` (px) is too dense to host the decoration
57
57
  function is_crowded(obstacles, footprint, base_w, base_h, clearance) {
58
- if (!obstacles.length || base_w <= 0 || base_h <= 0)
58
+ if (obstacles.length === 0 || base_w <= 0 || base_h <= 0)
59
59
  return false;
60
60
  const fw = footprint.width / base_w;
61
61
  const fh = footprint.height / base_h;
@@ -0,0 +1,46 @@
1
+ import type { AxisConfig, AxisLoadError, BarSeries, DataLoaderFn, DataSeries } from './types';
2
+ export declare const AXIS_DEFAULTS: {
3
+ format: string;
4
+ scale_type: "linear";
5
+ ticks: number;
6
+ label_shift: {
7
+ x: number;
8
+ y: number;
9
+ };
10
+ tick: {
11
+ label: {
12
+ shift: {
13
+ x: number;
14
+ y: number;
15
+ };
16
+ inside: boolean;
17
+ };
18
+ };
19
+ range: [number | null, number | null];
20
+ };
21
+ type AxisType = `x` | `x2` | `y` | `y2`;
22
+ export declare function merge_series_state<T extends DataSeries | BarSeries>(old_series: T[], new_series: T[]): T[];
23
+ export interface AxisChangeState<T extends DataSeries | BarSeries> {
24
+ get_axis: (axis: AxisType) => AxisConfig;
25
+ set_axis: (axis: AxisType, config: AxisConfig) => void;
26
+ get_series: () => T[];
27
+ set_series: (series: T[]) => void;
28
+ get_loading: () => AxisType | null;
29
+ set_loading: (axis: AxisType | null) => void;
30
+ }
31
+ export declare const create_axis_change_handler: <T extends DataSeries | BarSeries>(state: AxisChangeState<T>, data_loader: DataLoaderFn<Record<string, unknown>, T> | undefined, on_axis_change?: (axis: AxisType, key: string, new_series: T[]) => void, on_error?: (error: AxisLoadError) => void) => ((axis: AxisType, key: string) => Promise<void>);
32
+ export declare function create_axis_loader<T extends DataSeries | BarSeries>(state: AxisChangeState<T>, get_props: () => {
33
+ data_loader?: DataLoaderFn<Record<string, unknown>, T>;
34
+ on_axis_change?: (axis: AxisType, key: string, new_series: T[]) => void;
35
+ on_error?: (error: AxisLoadError) => void;
36
+ }): {
37
+ handle_axis_change: (axis: AxisType, key: string) => Promise<void>;
38
+ try_auto_load: () => void;
39
+ };
40
+ export declare const AXIS_LABEL_CONTAINER: {
41
+ readonly width: 200;
42
+ readonly height: 24;
43
+ readonly x_offset: 100;
44
+ readonly y_offset: 12;
45
+ };
46
+ export {};
@@ -0,0 +1,110 @@
1
+ // Shared utilities for interactive axis functionality
2
+ import { to_error } from '../../utils';
3
+ // Shared axis defaults across plot components (single source of truth)
4
+ export const AXIS_DEFAULTS = {
5
+ format: ``,
6
+ scale_type: `linear`,
7
+ ticks: 5,
8
+ label_shift: { x: 0, y: 0 },
9
+ tick: { label: { shift: { x: 0, y: 0 }, inside: false } },
10
+ range: [null, null],
11
+ };
12
+ // Merge new series with preserved UI state from old series.
13
+ // Matches by stable id first, then by index only for ordered id-less series.
14
+ export function merge_series_state(old_series, new_series) {
15
+ // Build id lookup map for O(1) matching (string or number ids)
16
+ const by_id = new Map();
17
+ for (const srs of old_series) {
18
+ if (srs.id !== undefined && srs.id !== ``)
19
+ by_id.set(srs.id, srs);
20
+ }
21
+ return new_series.map((new_srs, idx) => {
22
+ const old_srs = new_srs.id !== undefined && new_srs.id !== `` ? by_id.get(new_srs.id) : old_series[idx];
23
+ if (!old_srs) {
24
+ return new_srs;
25
+ }
26
+ // Preserve UI state: visibility and styling from old series if not in new
27
+ const result = { ...new_srs };
28
+ result.visible ??= old_srs.visible;
29
+ // Preserve style properties only when key exists in BOTH series (guards against
30
+ // cross-type injection when T is a union like DataSeries | BarSeries)
31
+ for (const key of [`point_style`, `line_style`, `color`]) {
32
+ if (key in old_srs && key in new_srs && result[key] === undefined) {
33
+ result[key] = old_srs[key];
34
+ }
35
+ }
36
+ return result;
37
+ });
38
+ }
39
+ // Handle axis property change - loads new data via data_loader
40
+ // Returns a function bound to the component's state accessors
41
+ export const create_axis_change_handler = (state, data_loader, on_axis_change, on_error) => async (axis, key) => {
42
+ if (!data_loader || state.get_loading())
43
+ return;
44
+ const axis_config = state.get_axis(axis);
45
+ const prev_key = axis_config.selected_key;
46
+ // Skip if key unchanged AND series already loaded (allows initial load when series empty)
47
+ if (prev_key === key && state.get_series().length > 0)
48
+ return;
49
+ // Update selected_key immediately for UI feedback
50
+ state.set_axis(axis, { ...axis_config, selected_key: key });
51
+ state.set_loading(axis);
52
+ try {
53
+ const result = await data_loader(axis, key, state.get_series());
54
+ // Merge new series with preserved state from old series
55
+ const merged = merge_series_state(state.get_series(), result.series);
56
+ state.set_series(merged);
57
+ // Update axis label/unit if provided
58
+ if (result.axis_label || result.axis_unit) {
59
+ const current = state.get_axis(axis);
60
+ state.set_axis(axis, {
61
+ ...current,
62
+ label: result.axis_label ?? current.label,
63
+ unit: result.axis_unit ?? current.unit,
64
+ });
65
+ }
66
+ on_axis_change?.(axis, key, merged);
67
+ }
68
+ catch (err) {
69
+ console.error(`Failed to load data for ${axis}=${key}:`, err);
70
+ // Revert selection
71
+ state.set_axis(axis, { ...state.get_axis(axis), selected_key: prev_key });
72
+ const message = to_error(err).message;
73
+ on_error?.({ axis, key, message });
74
+ }
75
+ finally {
76
+ state.set_loading(null);
77
+ }
78
+ };
79
+ // Bundle axis change handler with one-shot auto-load of the first axis option.
80
+ // get_props keeps callback props fresh; try_auto_load reads series/axis configs
81
+ // through state getters so a component `$effect(try_auto_load)` tracks them reactively.
82
+ export function create_axis_loader(state, get_props) {
83
+ let auto_load_attempted = false; // prevent infinite retries on failure
84
+ const handle_axis_change = (axis, key) => {
85
+ const { data_loader, on_axis_change, on_error } = get_props();
86
+ return create_axis_change_handler(state, data_loader, on_axis_change, on_error)(axis, key);
87
+ };
88
+ // Auto-load data if series is empty but options exist (runs once, x-axis first then y)
89
+ const try_auto_load = () => {
90
+ if (state.get_series().length > 0 || !get_props().data_loader || auto_load_attempted)
91
+ return;
92
+ for (const axis of [`x`, `y`]) {
93
+ const config = state.get_axis(axis);
94
+ if (config.options?.length) {
95
+ auto_load_attempted = true;
96
+ handle_axis_change(axis, config.selected_key ?? config.options[0].key).catch(() => { });
97
+ return;
98
+ }
99
+ }
100
+ };
101
+ return { handle_axis_change, try_auto_load };
102
+ }
103
+ // Constants for axis label foreignObject positioning (all values in px)
104
+ // Use minimal dimensions - overflow: visible handles any dropdown expansion
105
+ export const AXIS_LABEL_CONTAINER = {
106
+ width: 200, // container width for centering; dropdown can overflow
107
+ height: 24, // single line height; dropdown options overflow downward
108
+ x_offset: 100, // half of width for horizontal centering
109
+ y_offset: 12, // half of height for vertical centering
110
+ };
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
- import { AXIS_LABEL_CONTAINER } from './axis-utils'
3
- import type { AxisOption } from './types'
2
+ import { AXIS_LABEL_CONTAINER } from '../axis-utils'
3
+ import type { AxisOption } from '../types'
4
4
  import InteractiveAxisLabel from './InteractiveAxisLabel.svelte'
5
5
 
6
6
  let {
@@ -1,4 +1,4 @@
1
- import type { AxisOption } from './types';
1
+ import type { AxisOption } from '../types';
2
2
  type $$ComponentProps = {
3
3
  x: number;
4
4
  y: number;
@@ -1,26 +1,26 @@
1
1
  <script lang="ts">
2
- import { luminance } from '../colors'
3
- import Spinner from '../feedback/Spinner.svelte'
4
- import { format_num } from '../labels'
5
- import { sanitize_html } from '../sanitize'
6
- import type { Vec2 } from '../math'
7
- import * as math from '../math'
2
+ import { luminance } from '../../../colors'
3
+ import Spinner from '../../../feedback/Spinner.svelte'
4
+ import { format_num } from '../../../labels'
5
+ import { sanitize_html } from '../../../sanitize'
6
+ import type { Vec2 } from '../../../math'
7
+ import * as math from '../../../math'
8
8
  import { format } from 'd3-format'
9
9
  import * as d3 from 'd3-scale'
10
10
  import * as d3_sc from 'd3-scale-chromatic'
11
11
  import { timeFormat } from 'd3-time-format'
12
12
  import type { HTMLAttributes } from 'svelte/elements'
13
- import type { D3InterpolateName } from '../colors'
13
+ import type { D3InterpolateName } from '../../../colors'
14
14
  import PortalSelect from './PortalSelect.svelte'
15
- import { generate_arcsinh_ticks, scale_arcsinh } from './scales'
15
+ import { generate_arcsinh_ticks, scale_arcsinh } from '../scales'
16
16
  import type {
17
17
  AxisOption,
18
18
  ColorBarDataLoaderFn,
19
19
  ColorScaleOption,
20
20
  Orientation,
21
21
  ScaleType,
22
- } from './types'
23
- import { get_arcsinh_threshold, get_scale_type_name } from './types'
22
+ } from '../types'
23
+ import { get_arcsinh_threshold, get_scale_type_name } from '../types'
24
24
 
25
25
  let {
26
26
  title = $bindable(),
@@ -103,11 +103,11 @@
103
103
  // If ticks are secondary (top), default label to bottom
104
104
  if (orientation === `horizontal`) {
105
105
  return tick_side === `primary` ? `top` : `bottom`
106
- } else { // orientation === `vertical`
106
+ } // orientation === `vertical`
107
107
  // If ticks are primary (right), default label to left
108
108
  // If ticks are secondary (left), default label to right
109
109
  return tick_side === `primary` ? `left` : `right`
110
- }
110
+
111
111
  })
112
112
 
113
113
  // Number of ticks to generate
@@ -200,7 +200,7 @@
200
200
 
201
201
  const power_of_10_ticks: number[] = []
202
202
  for (let exp = start_exp; exp <= end_exp; exp++) {
203
- power_of_10_ticks.push(Math.pow(10, exp))
203
+ power_of_10_ticks.push(10 ** exp)
204
204
  }
205
205
 
206
206
  // Ensure domain endpoints are included if they are powers of 10 and missed by loop
@@ -225,27 +225,24 @@
225
225
  }
226
226
 
227
227
  return power_of_10_ticks
228
- } else {
229
- // Generate exactly n_ticks manually for log scale if not snapping
230
- const log_min = Math.log10(scale_min)
231
- const log_max = Math.log10(scale_max)
232
- return [...Array(n_ticks).keys()].map((idx) => {
233
- const fraction = idx / (n_ticks - 1)
234
- const log_val = log_min + fraction * (log_max - log_min)
235
- return Math.pow(10, log_val)
236
- })
237
- }
238
- } else {
239
- // Use D3's default nice ticks for linear scale
240
- if (snap_ticks) return scale.ticks(n_ticks)
241
- else {
242
- // Generate exactly n_ticks evenly spaced linear ticks
243
- return [...Array(n_ticks).keys()].map((idx) => {
244
- const fraction = idx / (n_ticks - 1)
245
- return scale_min + fraction * (scale_max - scale_min)
246
- })
247
228
  }
229
+ // Generate exactly n_ticks manually for log scale if not snapping
230
+ const log_min = Math.log10(scale_min)
231
+ const log_max = Math.log10(scale_max)
232
+ return [...Array(n_ticks).keys()].map((idx) => {
233
+ const fraction = idx / (n_ticks - 1)
234
+ const log_val = log_min + fraction * (log_max - log_min)
235
+ return 10 ** log_val
236
+ })
248
237
  }
238
+ // Use D3's default nice ticks for linear scale
239
+ if (snap_ticks) return scale.ticks(n_ticks)
240
+ // Generate exactly n_ticks evenly spaced linear ticks
241
+ return [...Array(n_ticks).keys()].map((idx) => {
242
+ const fraction = idx / (n_ticks - 1)
243
+ return scale_min + fraction * (scale_max - scale_min)
244
+ })
245
+
249
246
  })
250
247
 
251
248
  // Update nice_range binding when snapping ticks
@@ -380,7 +377,7 @@
380
377
  if (use_log_interp) {
381
378
  data_value = log_span === 0
382
379
  ? adjusted_min_ramp
383
- : Math.pow(10, log_min + fraction * log_span)
380
+ : 10 ** (log_min + fraction * log_span)
384
381
  } else if (type_name === `arcsinh`) {
385
382
  data_value = asinh_span === 0
386
383
  ? min_ramp_domain
@@ -644,6 +641,12 @@
644
641
  display: var(--cbar-label-display);
645
642
  align-items: center;
646
643
  justify-content: center;
644
+ /* blur-only (no tint): invisible over uniform bg, smears busy bg to keep title readable */
645
+ background: var(--cbar-label-bg, transparent);
646
+ backdrop-filter: var(--cbar-label-backdrop-filter, blur(4px));
647
+ border-radius: var(--cbar-label-border-radius, var(--border-radius, 3pt));
648
+ /* keep title selectable/copyable */
649
+ user-select: text;
647
650
  }
648
651
  span.tick-label {
649
652
  position: absolute;
@@ -1,5 +1,5 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
- import type { AxisOption, ColorBarDataLoaderFn, ColorScaleOption, Orientation, ScaleType } from './types';
2
+ import type { AxisOption, ColorBarDataLoaderFn, ColorScaleOption, Orientation, ScaleType } from '../types';
3
3
  type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
4
4
  title?: string;
5
5
  color_scale?: ((x: number) => string) | string | null;
@@ -26,6 +26,6 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
26
26
  selected_color_scale_key?: string;
27
27
  on_color_scale_change?: (key: string) => void;
28
28
  };
29
- declare const ColorBar: import("svelte").Component<$$ComponentProps, {}, "title" | "color_scale" | "range" | "tick_labels" | "nice_range" | "selected_property_key" | "selected_color_scale_key">;
29
+ declare const ColorBar: import("svelte").Component<$$ComponentProps, {}, "title" | "range" | "color_scale" | "tick_labels" | "nice_range" | "selected_property_key" | "selected_color_scale_key">;
30
30
  type ColorBar = ReturnType<typeof ColorBar>;
31
31
  export default ColorBar;
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
- import { ColorBar } from './'
2
+ import { ColorBar } from '../..'
3
3
  import * as d3_sc from 'd3-scale-chromatic'
4
4
  import type { ComponentProps } from 'svelte'
5
5
  import Select from 'svelte-multiselect'
6
- import type { D3InterpolateName } from '../colors'
6
+ import type { D3InterpolateName } from '../../../colors'
7
7
 
8
8
  let {
9
9
  options = Object.keys(d3_sc).filter((key) =>
@@ -28,6 +28,7 @@
28
28
  <Select
29
29
  {options}
30
30
  maxSelect={1}
31
+ maxOptions={options.length}
31
32
  {minSelect}
32
33
  bind:value
33
34
  bind:selected
@@ -47,7 +48,7 @@
47
48
  tick_labels={0}
48
49
  title_side="left"
49
50
  wrapper_style="width: 100%;"
50
- title_style="width: 6em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left;"
51
+ title_style="width: 6em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; font-size: 0.9rem;"
51
52
  {...colorbar}
52
53
  />
53
54
  {/snippet}
@@ -1,7 +1,7 @@
1
- import { ColorBar } from './';
1
+ import { ColorBar } from '../..';
2
2
  import type { ComponentProps } from 'svelte';
3
3
  import Select from 'svelte-multiselect';
4
- import type { D3InterpolateName } from '../colors';
4
+ import type { D3InterpolateName } from '../../../colors';
5
5
  type $$ComponentProps = Omit<ComponentProps<typeof Select>, `options`> & {
6
6
  options?: D3InterpolateName[];
7
7
  value?: D3InterpolateName;
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ // Shared draggable controls-pane shell (gear toggle + settings pane) used by plot/diagram
3
+ // controls components. Centralizes the toggle/pane styling and the `*-controls-toggle` /
4
+ // `*-controls-pane` class convention so it lives in one place instead of being re-typed in
5
+ // every *Controls component (PlotControls, SankeyControls, ...).
6
+ import { DraggablePane } from '../../../overlays'
7
+ import type { Snippet } from 'svelte'
8
+ import type { HTMLAttributes } from 'svelte/elements'
9
+
10
+ let {
11
+ controls_open = $bindable(false),
12
+ controls_class = `plot`,
13
+ title = controls_class || `plot`,
14
+ toggle_props = {},
15
+ pane_props = {},
16
+ children,
17
+ }: {
18
+ controls_open?: boolean
19
+ controls_class?: string // class prefix -> `${controls_class}-controls-{toggle,pane}`
20
+ title?: string // toggle button title text ("Open <title> controls")
21
+ toggle_props?: HTMLAttributes<HTMLButtonElement>
22
+ pane_props?: HTMLAttributes<HTMLDivElement>
23
+ children?: Snippet
24
+ } = $props()
25
+ </script>
26
+
27
+ <DraggablePane
28
+ bind:show={controls_open}
29
+ closed_icon="Settings"
30
+ open_icon="Cross"
31
+ toggle_props={{
32
+ title: `${controls_open ? `Close` : `Open`} ${title} controls`,
33
+ ...toggle_props,
34
+ class: `${controls_class}-controls-toggle ${toggle_props?.class ?? ``}`,
35
+ style:
36
+ `position: absolute; top: var(--ctrl-btn-top, 5pt); right: var(--ctrl-btn-right, 1ex);` +
37
+ (toggle_props?.style ?? ``),
38
+ }}
39
+ pane_props={{
40
+ ...pane_props,
41
+ class: `${controls_class}-controls-pane ${pane_props?.class ?? ``}`,
42
+ style: `--pane-padding: 12px; --pane-gap: 4px; ${pane_props?.style ?? ``}`,
43
+ }}
44
+ >
45
+ {@render children?.()}
46
+ </DraggablePane>
@@ -0,0 +1,13 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type $$ComponentProps = {
4
+ controls_open?: boolean;
5
+ controls_class?: string;
6
+ title?: string;
7
+ toggle_props?: HTMLAttributes<HTMLButtonElement>;
8
+ pane_props?: HTMLAttributes<HTMLDivElement>;
9
+ children?: Snippet;
10
+ };
11
+ declare const ControlPane: import("svelte").Component<$$ComponentProps, {}, "controls_open">;
12
+ type ControlPane = ReturnType<typeof ControlPane>;
13
+ export default ControlPane;
@@ -8,7 +8,8 @@
8
8
  FillGradient,
9
9
  FillHandlerEvent,
10
10
  FillRegion,
11
- } from './types'
11
+ } from '../types'
12
+ import { unique_id } from '../utils'
12
13
 
13
14
  let {
14
15
  region,
@@ -35,14 +36,17 @@
35
36
  } = $props()
36
37
 
37
38
  // Stable instance ID for gradient uniqueness (generated once per component instance)
38
- const instance_id = crypto.randomUUID().slice(0, 8)
39
+ const instance_id = unique_id()
39
40
  let gradient_id = $derived(
40
41
  `fill-gradient-${region.id ?? region_idx}-${instance_id}`,
41
42
  )
42
43
 
44
+ // On hover (without an explicit hover_style), noticeably raise opacity. A faint fill (e.g. a
45
+ // low-alpha rgba color at the default 0.3 fill-opacity) is otherwise nearly invisible, so a mere
46
+ // brightness filter reads as "no change". An explicit hover_style.fill_opacity always wins.
43
47
  let effective_opacity = $derived(
44
- is_hovered && region.hover_style?.fill_opacity != null
45
- ? region.hover_style.fill_opacity
48
+ is_hovered
49
+ ? region.hover_style?.fill_opacity ?? Math.min(1, (region.fill_opacity ?? 0.3) + 0.4)
46
50
  : region.fill_opacity ?? 0.3,
47
51
  )
48
52
  let effective_fill = $derived(
@@ -53,6 +57,8 @@
53
57
  let path_fill = $derived(
54
58
  typeof effective_fill === `object` ? `url(#${gradient_id})` : effective_fill,
55
59
  )
60
+ // outline drawn only on hover when the user opted in via hover_style.stroke
61
+ let hover_stroke = $derived(is_hovered ? region.hover_style?.stroke : undefined)
56
62
  let is_clickable = $derived(Boolean(on_click || region.on_click))
57
63
  let cursor_style = $derived(
58
64
  region.hover_style?.cursor ?? (is_clickable ? `pointer` : `default`),
@@ -205,11 +211,16 @@
205
211
  </defs>
206
212
  {/if}
207
213
 
208
- <!-- Main fill path -->
214
+ <!-- Main fill path. On hover the opacity boost (effective_opacity) highlights the area. We do NOT
215
+ stroke by default: a fill-between region is one closed polygon, so stroking traces its whole
216
+ perimeter (both boundaries + the straight closing edges), which looks messy and doesn't follow
217
+ the visible area. Users can still opt into an outline via hover_style.stroke. -->
209
218
  <path
210
219
  d={tweened_path.current}
211
220
  fill={path_fill}
212
221
  fill-opacity={effective_opacity}
222
+ stroke={hover_stroke ?? `none`}
223
+ stroke-width={hover_stroke ? region.hover_style?.stroke_width ?? 1.5 : 0}
213
224
  />
214
225
  </g>
215
226
 
@@ -218,6 +229,6 @@
218
229
  transition: opacity 0.15s ease;
219
230
  }
220
231
  .fill-region.hovered {
221
- filter: brightness(1.1);
232
+ filter: brightness(1.35) saturate(1.2);
222
233
  }
223
234
  </style>
@@ -1,5 +1,5 @@
1
1
  import { type TweenOptions } from 'svelte/motion';
2
- import type { FillHandlerEvent, FillRegion } from './types';
2
+ import type { FillHandlerEvent, FillRegion } from '../types';
3
3
  type $$ComponentProps = {
4
4
  region: FillRegion;
5
5
  region_idx: number;
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
- import Spinner from '../feedback/Spinner.svelte'
3
- import { sanitize_html } from '../sanitize'
2
+ import Spinner from '../../../feedback/Spinner.svelte'
3
+ import { sanitize_html } from '../../../sanitize'
4
4
  import PortalSelect from './PortalSelect.svelte'
5
- import type { AxisOption } from './types'
5
+ import type { AxisOption } from '../types'
6
6
 
7
7
  let {
8
8
  label = ``,
@@ -1,4 +1,4 @@
1
- import type { AxisOption } from './types';
1
+ import type { AxisOption } from '../types';
2
2
  type $$ComponentProps = {
3
3
  label?: string;
4
4
  options?: AxisOption[];
@@ -9,6 +9,6 @@ type $$ComponentProps = {
9
9
  on_select?: (key: string) => void;
10
10
  [key: string]: unknown;
11
11
  };
12
- declare const InteractiveAxisLabel: import("svelte").Component<$$ComponentProps, {}, "color" | "selected_key" | "loading">;
12
+ declare const InteractiveAxisLabel: import("svelte").Component<$$ComponentProps, {}, "color" | "loading" | "selected_key">;
13
13
  type InteractiveAxisLabel = ReturnType<typeof InteractiveAxisLabel>;
14
14
  export default InteractiveAxisLabel;