matterviz 0.3.4 → 0.3.6

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 (852) hide show
  1. package/.vscode/launch.json +13 -0
  2. package/.vscodeignore +7 -0
  3. package/dist/assets/STLExporter-BpTH3YHE.js +8 -0
  4. package/dist/assets/browser-DdDecX_W.js +1 -0
  5. package/dist/assets/export-qgn-H9y6.js +2 -0
  6. package/dist/assets/main-DiKYzti2.css +1 -0
  7. package/dist/assets/moyo_wasm_bg-0ocwg7xY.wasm +0 -0
  8. package/dist/extension.js +31293 -0
  9. package/dist/src/lib/FilePicker.svelte +360 -0
  10. package/dist/src/lib/MillerIndexInput.svelte +66 -0
  11. package/dist/src/lib/api/mp.ts +26 -0
  12. package/dist/src/lib/api/optimade.ts +204 -0
  13. package/dist/src/lib/app.css +247 -0
  14. package/dist/src/lib/brillouin/BrillouinZone.svelte +549 -0
  15. package/dist/src/lib/brillouin/BrillouinZoneControls.svelte +144 -0
  16. package/dist/src/lib/brillouin/BrillouinZoneExportPane.svelte +146 -0
  17. package/dist/src/lib/brillouin/BrillouinZoneInfoPane.svelte +146 -0
  18. package/dist/src/lib/brillouin/BrillouinZoneScene.svelte +476 -0
  19. package/dist/src/lib/brillouin/BrillouinZoneTooltip.svelte +92 -0
  20. package/dist/src/lib/brillouin/compute.ts +529 -0
  21. package/dist/src/lib/brillouin/index.ts +8 -0
  22. package/dist/src/lib/brillouin/types.ts +51 -0
  23. package/dist/src/lib/chempot-diagram/ChemPotDiagram.svelte +327 -0
  24. package/dist/src/lib/chempot-diagram/ChemPotDiagram2D.svelte +846 -0
  25. package/dist/src/lib/chempot-diagram/ChemPotDiagram3D.svelte +3193 -0
  26. package/dist/src/lib/chempot-diagram/async-compute.svelte.ts +94 -0
  27. package/dist/src/lib/chempot-diagram/chempot-worker.ts +11 -0
  28. package/dist/src/lib/chempot-diagram/color.ts +42 -0
  29. package/dist/src/lib/chempot-diagram/compute.ts +1014 -0
  30. package/dist/src/lib/chempot-diagram/index.ts +6 -0
  31. package/dist/src/lib/chempot-diagram/pointer.ts +56 -0
  32. package/dist/src/lib/chempot-diagram/temperature.ts +77 -0
  33. package/dist/src/lib/chempot-diagram/types.ts +130 -0
  34. package/dist/src/lib/colors/index.ts +249 -0
  35. package/dist/src/lib/composition/BarChart.svelte +297 -0
  36. package/dist/src/lib/composition/BubbleChart.svelte +218 -0
  37. package/dist/src/lib/composition/Composition.svelte +165 -0
  38. package/dist/src/lib/composition/Formula.svelte +268 -0
  39. package/dist/src/lib/composition/FormulaFilter.svelte +1257 -0
  40. package/dist/src/lib/composition/PieChart.svelte +323 -0
  41. package/dist/src/lib/composition/format.ts +155 -0
  42. package/dist/src/lib/composition/index.ts +37 -0
  43. package/dist/src/lib/composition/parse.ts +605 -0
  44. package/dist/src/lib/constants.ts +134 -0
  45. package/dist/src/lib/controls.ts +42 -0
  46. package/dist/src/lib/convex-hull/ConvexHull.svelte +157 -0
  47. package/dist/src/lib/convex-hull/ConvexHull2D.svelte +825 -0
  48. package/dist/src/lib/convex-hull/ConvexHull3D.svelte +1801 -0
  49. package/dist/src/lib/convex-hull/ConvexHull4D.svelte +1398 -0
  50. package/dist/src/lib/convex-hull/ConvexHullControls.svelte +535 -0
  51. package/dist/src/lib/convex-hull/ConvexHullInfoPane.svelte +125 -0
  52. package/dist/src/lib/convex-hull/ConvexHullStats.svelte +929 -0
  53. package/dist/src/lib/convex-hull/ConvexHullTooltip.svelte +131 -0
  54. package/dist/src/lib/convex-hull/GasPressureControls.svelte +247 -0
  55. package/dist/src/lib/convex-hull/StructurePopup.svelte +151 -0
  56. package/dist/src/lib/convex-hull/TemperatureSlider.svelte +140 -0
  57. package/dist/src/lib/convex-hull/barycentric-coords.ts +246 -0
  58. package/dist/src/lib/convex-hull/demo-temperature.ts +63 -0
  59. package/dist/src/lib/convex-hull/gas-thermodynamics.ts +405 -0
  60. package/dist/src/lib/convex-hull/helpers.ts +932 -0
  61. package/dist/src/lib/convex-hull/index.ts +202 -0
  62. package/dist/src/lib/convex-hull/thermodynamics.ts +2192 -0
  63. package/dist/src/lib/convex-hull/types.ts +267 -0
  64. package/dist/src/lib/coordination/CoordinationBarPlot.svelte +311 -0
  65. package/dist/src/lib/coordination/calc-coordination.ts +93 -0
  66. package/dist/src/lib/coordination/index.ts +9 -0
  67. package/dist/src/lib/effects.svelte.ts +48 -0
  68. package/dist/src/lib/element/BohrAtom.svelte +147 -0
  69. package/dist/src/lib/element/ElementHeading.svelte +26 -0
  70. package/dist/src/lib/element/ElementPhoto.svelte +57 -0
  71. package/dist/src/lib/element/ElementStats.svelte +80 -0
  72. package/dist/src/lib/element/ElementTile.svelte +484 -0
  73. package/dist/src/lib/element/data.json.gz.d.ts +4 -0
  74. package/dist/src/lib/element/data.ts +14 -0
  75. package/dist/src/lib/element/index.ts +8 -0
  76. package/dist/src/lib/element/types.ts +62 -0
  77. package/dist/src/lib/feedback/ClickFeedback.svelte +58 -0
  78. package/dist/src/lib/feedback/DragOverlay.svelte +42 -0
  79. package/dist/src/lib/feedback/index.ts +4 -0
  80. package/dist/src/lib/fermi-surface/FermiSlice.svelte +189 -0
  81. package/dist/src/lib/fermi-surface/FermiSurface.svelte +600 -0
  82. package/dist/src/lib/fermi-surface/FermiSurfaceControls.svelte +448 -0
  83. package/dist/src/lib/fermi-surface/FermiSurfaceScene.svelte +794 -0
  84. package/dist/src/lib/fermi-surface/FermiSurfaceTooltip.svelte +111 -0
  85. package/dist/src/lib/fermi-surface/compute.ts +728 -0
  86. package/dist/src/lib/fermi-surface/constants.ts +32 -0
  87. package/dist/src/lib/fermi-surface/export.ts +64 -0
  88. package/dist/src/lib/fermi-surface/index.ts +14 -0
  89. package/dist/src/lib/fermi-surface/marching-cubes.ts +3 -0
  90. package/dist/src/lib/fermi-surface/parse.ts +574 -0
  91. package/dist/src/lib/fermi-surface/symmetry.ts +56 -0
  92. package/dist/src/lib/fermi-surface/types.ts +159 -0
  93. package/dist/src/lib/heatmap-matrix/HeatmapMatrix.svelte +1545 -0
  94. package/dist/src/lib/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  95. package/dist/src/lib/heatmap-matrix/index.ts +167 -0
  96. package/dist/src/lib/heatmap-matrix/shared.ts +7 -0
  97. package/dist/src/lib/icons.ts +650 -0
  98. package/dist/src/lib/index.ts +61 -0
  99. package/dist/src/lib/io/decompress.ts +92 -0
  100. package/dist/src/lib/io/export.ts +385 -0
  101. package/dist/src/lib/io/fetch.ts +46 -0
  102. package/dist/src/lib/io/file-drop.ts +51 -0
  103. package/dist/src/lib/io/index.ts +7 -0
  104. package/dist/src/lib/io/is-binary.ts +24 -0
  105. package/dist/src/lib/io/types.ts +8 -0
  106. package/dist/src/lib/io/url-drop.ts +141 -0
  107. package/dist/src/lib/isosurface/Isosurface.svelte +285 -0
  108. package/dist/src/lib/isosurface/IsosurfaceControls.svelte +277 -0
  109. package/dist/src/lib/isosurface/index.ts +7 -0
  110. package/dist/src/lib/isosurface/parse.ts +656 -0
  111. package/dist/src/lib/isosurface/slice.ts +175 -0
  112. package/dist/src/lib/isosurface/types.ts +309 -0
  113. package/dist/src/lib/labels.ts +320 -0
  114. package/dist/src/lib/layout/FullscreenToggle.svelte +50 -0
  115. package/dist/src/lib/layout/InfoCard.svelte +120 -0
  116. package/dist/src/lib/layout/InfoTag.svelte +185 -0
  117. package/dist/src/lib/layout/PropertyFilter.svelte +246 -0
  118. package/dist/src/lib/layout/SettingsSection.svelte +148 -0
  119. package/dist/src/lib/layout/SubpageGrid.svelte +82 -0
  120. package/dist/src/lib/layout/fullscreen.ts +65 -0
  121. package/dist/src/lib/layout/index.ts +11 -0
  122. package/dist/src/lib/layout/json-tree/JsonNode.svelte +548 -0
  123. package/dist/src/lib/layout/json-tree/JsonTree.svelte +1230 -0
  124. package/dist/src/lib/layout/json-tree/JsonValue.svelte +334 -0
  125. package/dist/src/lib/layout/json-tree/index.ts +3 -0
  126. package/dist/src/lib/layout/json-tree/types.ts +126 -0
  127. package/dist/src/lib/layout/json-tree/utils.ts +682 -0
  128. package/dist/src/lib/marching-cubes.ts +614 -0
  129. package/dist/src/lib/math.ts +1081 -0
  130. package/dist/src/lib/overlays/ContextMenu.svelte +162 -0
  131. package/dist/src/lib/overlays/CopyButton.svelte +45 -0
  132. package/dist/src/lib/overlays/DragControlTab.svelte +98 -0
  133. package/dist/src/lib/overlays/DraggablePane.svelte +487 -0
  134. package/dist/src/lib/overlays/InfoPaneCards.svelte +149 -0
  135. package/dist/src/lib/overlays/index.ts +3 -0
  136. package/dist/src/lib/periodic-table/PeriodicTable.svelte +469 -0
  137. package/dist/src/lib/periodic-table/PeriodicTableControls.svelte +557 -0
  138. package/dist/src/lib/periodic-table/PropertySelect.svelte +37 -0
  139. package/dist/src/lib/periodic-table/index.ts +12 -0
  140. package/dist/src/lib/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +1086 -0
  141. package/dist/src/lib/phase-diagram/PhaseDiagramControls.svelte +444 -0
  142. package/dist/src/lib/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  143. package/dist/src/lib/phase-diagram/PhaseDiagramExportPane.svelte +184 -0
  144. package/dist/src/lib/phase-diagram/PhaseDiagramTooltip.svelte +391 -0
  145. package/dist/src/lib/phase-diagram/TdbInfoPanel.svelte +203 -0
  146. package/dist/src/lib/phase-diagram/build-diagram.ts +186 -0
  147. package/dist/src/lib/phase-diagram/colors.ts +58 -0
  148. package/dist/src/lib/phase-diagram/diagram-input.ts +40 -0
  149. package/dist/src/lib/phase-diagram/index.ts +13 -0
  150. package/dist/src/lib/phase-diagram/parse.ts +348 -0
  151. package/dist/src/lib/phase-diagram/svg-to-diagram.ts +1023 -0
  152. package/dist/src/lib/phase-diagram/types.ts +144 -0
  153. package/dist/src/lib/phase-diagram/utils.ts +775 -0
  154. package/dist/src/lib/plot/AxisLabel.svelte +51 -0
  155. package/dist/src/lib/plot/BarPlot.svelte +2113 -0
  156. package/dist/src/lib/plot/BarPlotControls.svelte +66 -0
  157. package/dist/src/lib/plot/BinnedScatterPlot.svelte +1114 -0
  158. package/dist/src/lib/plot/ColorBar.svelte +721 -0
  159. package/dist/src/lib/plot/ColorScaleSelect.svelte +54 -0
  160. package/dist/src/lib/plot/ElementScatter.svelte +63 -0
  161. package/dist/src/lib/plot/FillArea.svelte +223 -0
  162. package/dist/src/lib/plot/Histogram.svelte +1558 -0
  163. package/dist/src/lib/plot/HistogramControls.svelte +212 -0
  164. package/dist/src/lib/plot/InteractiveAxisLabel.svelte +96 -0
  165. package/dist/src/lib/plot/Line.svelte +84 -0
  166. package/dist/src/lib/plot/PlotAxis.svelte +169 -0
  167. package/dist/src/lib/plot/PlotControls.svelte +537 -0
  168. package/dist/src/lib/plot/PlotLegend.svelte +569 -0
  169. package/dist/src/lib/plot/PlotTooltip.svelte +67 -0
  170. package/dist/src/lib/plot/PortalSelect.svelte +253 -0
  171. package/dist/src/lib/plot/ReferenceLine3D.svelte +156 -0
  172. package/dist/src/lib/plot/ReferencePlane.svelte +175 -0
  173. package/dist/src/lib/plot/ScatterPlot.svelte +2778 -0
  174. package/dist/src/lib/plot/ScatterPlot3D.svelte +529 -0
  175. package/dist/src/lib/plot/ScatterPlot3DControls.svelte +437 -0
  176. package/dist/src/lib/plot/ScatterPlot3DScene.svelte +912 -0
  177. package/dist/src/lib/plot/ScatterPlotControls.svelte +306 -0
  178. package/dist/src/lib/plot/ScatterPoint.svelte +182 -0
  179. package/dist/src/lib/plot/SpacegroupBarPlot.svelte +293 -0
  180. package/dist/src/lib/plot/Surface3D.svelte +197 -0
  181. package/dist/src/lib/plot/ZeroLines.svelte +97 -0
  182. package/dist/src/lib/plot/ZoomRect.svelte +23 -0
  183. package/dist/src/lib/plot/adaptive-density.ts +316 -0
  184. package/dist/src/lib/plot/auto-place.ts +184 -0
  185. package/dist/src/lib/plot/axis-utils.ts +122 -0
  186. package/dist/src/lib/plot/binned-scatter-types.ts +83 -0
  187. package/dist/src/lib/plot/data-cleaning.ts +1069 -0
  188. package/dist/src/lib/plot/data-transform.ts +69 -0
  189. package/dist/src/lib/plot/defaults.ts +9 -0
  190. package/dist/src/lib/plot/fill-utils.ts +494 -0
  191. package/dist/src/lib/plot/hover-lock.svelte.ts +60 -0
  192. package/dist/src/lib/plot/index.ts +53 -0
  193. package/dist/src/lib/plot/interactions.ts +119 -0
  194. package/dist/src/lib/plot/layout.ts +425 -0
  195. package/dist/src/lib/plot/reference-line.ts +426 -0
  196. package/dist/src/lib/plot/scales.ts +654 -0
  197. package/dist/src/lib/plot/svg.ts +23 -0
  198. package/dist/src/lib/plot/types.ts +1144 -0
  199. package/dist/src/lib/plot/utils/label-placement.ts +541 -0
  200. package/dist/src/lib/plot/utils/series-visibility.ts +140 -0
  201. package/dist/src/lib/plot/utils.ts +11 -0
  202. package/dist/src/lib/rdf/RdfPlot.svelte +247 -0
  203. package/dist/src/lib/rdf/calc-rdf.ts +167 -0
  204. package/dist/src/lib/rdf/index.ts +27 -0
  205. package/dist/src/lib/sanitize.ts +126 -0
  206. package/dist/src/lib/settings.ts +1479 -0
  207. package/dist/src/lib/spectral/Bands.svelte +1040 -0
  208. package/dist/src/lib/spectral/BandsAndDos.svelte +134 -0
  209. package/dist/src/lib/spectral/BrillouinBandsDos.svelte +252 -0
  210. package/dist/src/lib/spectral/Dos.svelte +697 -0
  211. package/dist/src/lib/spectral/helpers.ts +1381 -0
  212. package/dist/src/lib/spectral/index.ts +8 -0
  213. package/dist/src/lib/spectral/types.ts +112 -0
  214. package/dist/src/lib/state.svelte.ts +64 -0
  215. package/dist/src/lib/structure/Arrow.svelte +72 -0
  216. package/dist/src/lib/structure/AtomLegend.svelte +815 -0
  217. package/dist/src/lib/structure/Bond.svelte +140 -0
  218. package/dist/src/lib/structure/CanvasTooltip.svelte +33 -0
  219. package/dist/src/lib/structure/CellSelect.svelte +349 -0
  220. package/dist/src/lib/structure/Cylinder.svelte +45 -0
  221. package/dist/src/lib/structure/Lattice.svelte +196 -0
  222. package/dist/src/lib/structure/Structure.svelte +2248 -0
  223. package/dist/src/lib/structure/StructureControls.svelte +1273 -0
  224. package/dist/src/lib/structure/StructureExportPane.svelte +252 -0
  225. package/dist/src/lib/structure/StructureInfoPane.svelte +737 -0
  226. package/dist/src/lib/structure/StructureScene.svelte +2255 -0
  227. package/dist/src/lib/structure/atom-properties.ts +316 -0
  228. package/dist/src/lib/structure/bond-order-perception.ts +447 -0
  229. package/dist/src/lib/structure/bonding.ts +944 -0
  230. package/dist/src/lib/structure/export.ts +861 -0
  231. package/dist/src/lib/structure/index.ts +291 -0
  232. package/dist/src/lib/structure/label-placement.ts +130 -0
  233. package/dist/src/lib/structure/measure.ts +45 -0
  234. package/dist/src/lib/structure/parse.ts +1705 -0
  235. package/dist/src/lib/structure/partial-occupancy.ts +183 -0
  236. package/dist/src/lib/structure/pbc.ts +164 -0
  237. package/dist/src/lib/structure/supercell.ts +226 -0
  238. package/dist/src/lib/structure/validation.ts +11 -0
  239. package/dist/src/lib/symmetry/SymmetryStats.svelte +226 -0
  240. package/dist/src/lib/symmetry/WyckoffTable.svelte +120 -0
  241. package/dist/src/lib/symmetry/cell-transform.ts +118 -0
  242. package/dist/src/lib/symmetry/index.ts +348 -0
  243. package/dist/src/lib/symmetry/spacegroups.ts +404 -0
  244. package/dist/src/lib/table/HeatmapTable.svelte +1833 -0
  245. package/dist/src/lib/table/ToggleMenu.svelte +385 -0
  246. package/dist/src/lib/table/index.ts +139 -0
  247. package/dist/src/lib/theme/ThemeControl.svelte +53 -0
  248. package/dist/src/lib/theme/index.ts +107 -0
  249. package/dist/src/lib/theme/themes.mjs +297 -0
  250. package/dist/src/lib/time.ts +71 -0
  251. package/dist/src/lib/tooltip/TooltipContent.svelte +58 -0
  252. package/dist/src/lib/tooltip/index.ts +2 -0
  253. package/dist/src/lib/tooltip/types.ts +13 -0
  254. package/dist/src/lib/trajectory/Trajectory.svelte +1545 -0
  255. package/dist/src/lib/trajectory/TrajectoryError.svelte +128 -0
  256. package/dist/src/lib/trajectory/TrajectoryExportPane.svelte +357 -0
  257. package/dist/src/lib/trajectory/TrajectoryInfoPane.svelte +313 -0
  258. package/dist/src/lib/trajectory/constants.ts +7 -0
  259. package/dist/src/lib/trajectory/extract.ts +196 -0
  260. package/dist/src/lib/trajectory/format-detect.ts +96 -0
  261. package/dist/src/lib/trajectory/frame-reader.ts +456 -0
  262. package/dist/src/lib/trajectory/helpers.ts +217 -0
  263. package/dist/src/lib/trajectory/index.ts +218 -0
  264. package/dist/src/lib/trajectory/parse/ase.ts +109 -0
  265. package/dist/src/lib/trajectory/parse/hdf5.ts +173 -0
  266. package/dist/src/lib/trajectory/parse/index.ts +411 -0
  267. package/dist/src/lib/trajectory/parse/lammps.ts +215 -0
  268. package/dist/src/lib/trajectory/parse/vasp.ts +102 -0
  269. package/dist/src/lib/trajectory/parse/xyz.ts +143 -0
  270. package/dist/src/lib/trajectory/plotting.ts +599 -0
  271. package/dist/src/lib/trajectory/types.ts +13 -0
  272. package/dist/src/lib/utils.ts +56 -0
  273. package/dist/src/lib/xrd/XrdPlot.svelte +615 -0
  274. package/dist/src/lib/xrd/broadening.ts +130 -0
  275. package/dist/src/lib/xrd/calc-xrd.ts +397 -0
  276. package/dist/src/lib/xrd/index.ts +38 -0
  277. package/dist/src/lib/xrd/parse.ts +858 -0
  278. package/dist/webview.js +29421 -0
  279. package/icon.png +0 -0
  280. package/license +1 -1
  281. package/matterviz-0.3.2.vsix +0 -0
  282. package/matterviz-0.3.4.vsix +0 -0
  283. package/matterviz-0.3.5.vsix +0 -0
  284. package/package.json +1461 -231
  285. package/readme.md +171 -98
  286. package/scripts/sync-config.ts +101 -0
  287. package/src/declarations.d.ts +2 -0
  288. package/src/extension.ts +972 -0
  289. package/src/node-io.ts +65 -0
  290. package/src/types.ts +17 -0
  291. package/src/webview/JsonBrowser.svelte +1079 -0
  292. package/src/webview/PlotPanel.svelte +346 -0
  293. package/src/webview/detect.ts +444 -0
  294. package/src/webview/main.ts +764 -0
  295. package/src/webview/plot-utils.ts +250 -0
  296. package/test-fixtures/all-viz-types.json.gz +0 -0
  297. package/test-fixtures/plot-demo-data.json.gz +0 -0
  298. package/tests/detect.test.ts +604 -0
  299. package/tests/extension.test.ts +2041 -0
  300. package/tests/node-io.test.ts +39 -0
  301. package/tests/plot-utils.test.ts +302 -0
  302. package/tests/vite-plugin-json-gz.test.ts +114 -0
  303. package/tests/vscode-mock.ts +18 -0
  304. package/tests/webview.test.ts +231 -0
  305. package/tsconfig.json +20 -0
  306. package/vite-plugin-json-gz.ts +29 -0
  307. package/vite.config.ts +34 -0
  308. package/vite.extension.config.ts +34 -0
  309. package/dist/EmptyState.svelte.d.ts +0 -9
  310. package/dist/FilePicker.svelte +0 -360
  311. package/dist/FilePicker.svelte.d.ts +0 -17
  312. package/dist/Icon.svelte.d.ts +0 -13
  313. package/dist/MillerIndexInput.svelte +0 -66
  314. package/dist/MillerIndexInput.svelte.d.ts +0 -7
  315. package/dist/api/mp.d.ts +0 -6
  316. package/dist/api/mp.js +0 -22
  317. package/dist/api/optimade.d.ts +0 -45
  318. package/dist/api/optimade.js +0 -135
  319. package/dist/app.css +0 -240
  320. package/dist/brillouin/BrillouinZone.svelte +0 -543
  321. package/dist/brillouin/BrillouinZone.svelte.d.ts +0 -83
  322. package/dist/brillouin/BrillouinZoneControls.svelte +0 -144
  323. package/dist/brillouin/BrillouinZoneControls.svelte.d.ts +0 -17
  324. package/dist/brillouin/BrillouinZoneExportPane.svelte +0 -148
  325. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +0 -15
  326. package/dist/brillouin/BrillouinZoneInfoPane.svelte +0 -146
  327. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +0 -13
  328. package/dist/brillouin/BrillouinZoneScene.svelte +0 -476
  329. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +0 -48
  330. package/dist/brillouin/BrillouinZoneTooltip.svelte +0 -92
  331. package/dist/brillouin/BrillouinZoneTooltip.svelte.d.ts +0 -8
  332. package/dist/brillouin/compute.d.ts +0 -17
  333. package/dist/brillouin/compute.js +0 -422
  334. package/dist/brillouin/index.d.ts +0 -8
  335. package/dist/brillouin/index.js +0 -8
  336. package/dist/brillouin/types.d.ts +0 -48
  337. package/dist/brillouin/types.js +0 -1
  338. package/dist/chempot-diagram/ChemPotDiagram.svelte +0 -327
  339. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +0 -13
  340. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +0 -847
  341. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +0 -16
  342. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +0 -3194
  343. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +0 -16
  344. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +0 -7
  345. package/dist/chempot-diagram/async-compute.svelte.d.ts +0 -3
  346. package/dist/chempot-diagram/async-compute.svelte.js +0 -77
  347. package/dist/chempot-diagram/chempot-worker.d.ts +0 -1
  348. package/dist/chempot-diagram/chempot-worker.js +0 -11
  349. package/dist/chempot-diagram/color.d.ts +0 -10
  350. package/dist/chempot-diagram/color.js +0 -32
  351. package/dist/chempot-diagram/compute.d.ts +0 -48
  352. package/dist/chempot-diagram/compute.js +0 -812
  353. package/dist/chempot-diagram/index.d.ts +0 -6
  354. package/dist/chempot-diagram/index.js +0 -6
  355. package/dist/chempot-diagram/pointer.d.ts +0 -16
  356. package/dist/chempot-diagram/pointer.js +0 -40
  357. package/dist/chempot-diagram/temperature.d.ts +0 -15
  358. package/dist/chempot-diagram/temperature.js +0 -36
  359. package/dist/chempot-diagram/types.d.ts +0 -86
  360. package/dist/chempot-diagram/types.js +0 -28
  361. package/dist/colors/index.d.ts +0 -47
  362. package/dist/colors/index.js +0 -203
  363. package/dist/composition/BarChart.svelte +0 -297
  364. package/dist/composition/BarChart.svelte.d.ts +0 -39
  365. package/dist/composition/BubbleChart.svelte +0 -218
  366. package/dist/composition/BubbleChart.svelte.d.ts +0 -28
  367. package/dist/composition/Composition.svelte +0 -164
  368. package/dist/composition/Composition.svelte.d.ts +0 -15
  369. package/dist/composition/Formula.svelte +0 -265
  370. package/dist/composition/Formula.svelte.d.ts +0 -19
  371. package/dist/composition/FormulaFilter.svelte +0 -1259
  372. package/dist/composition/FormulaFilter.svelte.d.ts +0 -51
  373. package/dist/composition/PieChart.svelte +0 -323
  374. package/dist/composition/PieChart.svelte.d.ts +0 -37
  375. package/dist/composition/format.d.ts +0 -15
  376. package/dist/composition/format.js +0 -109
  377. package/dist/composition/index.d.ts +0 -20
  378. package/dist/composition/index.js +0 -14
  379. package/dist/composition/parse.d.ts +0 -55
  380. package/dist/composition/parse.js +0 -459
  381. package/dist/constants.d.ts +0 -29
  382. package/dist/constants.js +0 -105
  383. package/dist/controls.d.ts +0 -14
  384. package/dist/controls.js +0 -30
  385. package/dist/convex-hull/ConvexHull.svelte +0 -157
  386. package/dist/convex-hull/ConvexHull.svelte.d.ts +0 -13
  387. package/dist/convex-hull/ConvexHull2D.svelte +0 -813
  388. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +0 -11
  389. package/dist/convex-hull/ConvexHull3D.svelte +0 -1788
  390. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +0 -8
  391. package/dist/convex-hull/ConvexHull4D.svelte +0 -1374
  392. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +0 -8
  393. package/dist/convex-hull/ConvexHullControls.svelte +0 -546
  394. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +0 -48
  395. package/dist/convex-hull/ConvexHullInfoPane.svelte +0 -115
  396. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +0 -18
  397. package/dist/convex-hull/ConvexHullStats.svelte +0 -905
  398. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +0 -15
  399. package/dist/convex-hull/ConvexHullTooltip.svelte +0 -131
  400. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +0 -33
  401. package/dist/convex-hull/GasPressureControls.svelte +0 -247
  402. package/dist/convex-hull/GasPressureControls.svelte.d.ts +0 -11
  403. package/dist/convex-hull/StructurePopup.svelte +0 -116
  404. package/dist/convex-hull/StructurePopup.svelte.d.ts +0 -18
  405. package/dist/convex-hull/TemperatureSlider.svelte +0 -137
  406. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +0 -8
  407. package/dist/convex-hull/barycentric-coords.d.ts +0 -18
  408. package/dist/convex-hull/barycentric-coords.js +0 -182
  409. package/dist/convex-hull/demo-temperature.d.ts +0 -6
  410. package/dist/convex-hull/demo-temperature.js +0 -40
  411. package/dist/convex-hull/gas-thermodynamics.d.ts +0 -16
  412. package/dist/convex-hull/gas-thermodynamics.js +0 -316
  413. package/dist/convex-hull/helpers.d.ts +0 -103
  414. package/dist/convex-hull/helpers.js +0 -671
  415. package/dist/convex-hull/index.d.ts +0 -118
  416. package/dist/convex-hull/index.js +0 -57
  417. package/dist/convex-hull/thermodynamics.d.ts +0 -66
  418. package/dist/convex-hull/thermodynamics.js +0 -1752
  419. package/dist/convex-hull/types.d.ts +0 -162
  420. package/dist/convex-hull/types.js +0 -36
  421. package/dist/coordination/CoordinationBarPlot.svelte +0 -311
  422. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +0 -30
  423. package/dist/coordination/calc-coordination.d.ts +0 -15
  424. package/dist/coordination/calc-coordination.js +0 -63
  425. package/dist/coordination/index.d.ts +0 -8
  426. package/dist/coordination/index.js +0 -7
  427. package/dist/element/BohrAtom.svelte +0 -149
  428. package/dist/element/BohrAtom.svelte.d.ts +0 -20
  429. package/dist/element/ElementHeading.svelte +0 -26
  430. package/dist/element/ElementHeading.svelte.d.ts +0 -8
  431. package/dist/element/ElementPhoto.svelte +0 -57
  432. package/dist/element/ElementPhoto.svelte.d.ts +0 -9
  433. package/dist/element/ElementStats.svelte +0 -80
  434. package/dist/element/ElementStats.svelte.d.ts +0 -8
  435. package/dist/element/ElementTile.svelte +0 -484
  436. package/dist/element/ElementTile.svelte.d.ts +0 -29
  437. package/dist/element/Nucleus.svelte.d.ts +0 -17
  438. package/dist/element/data.d.ts +0 -3
  439. package/dist/element/data.js +0 -2
  440. package/dist/element/data.json.gz.d.ts +0 -2
  441. package/dist/element/index.d.ts +0 -8
  442. package/dist/element/index.js +0 -8
  443. package/dist/element/types.d.ts +0 -57
  444. package/dist/element/types.js +0 -1
  445. package/dist/feedback/ClickFeedback.svelte +0 -58
  446. package/dist/feedback/ClickFeedback.svelte.d.ts +0 -12
  447. package/dist/feedback/DragOverlay.svelte +0 -42
  448. package/dist/feedback/DragOverlay.svelte.d.ts +0 -7
  449. package/dist/feedback/Spinner.svelte.d.ts +0 -7
  450. package/dist/feedback/StatusMessage.svelte.d.ts +0 -9
  451. package/dist/feedback/index.d.ts +0 -4
  452. package/dist/feedback/index.js +0 -4
  453. package/dist/fermi-surface/FermiSlice.svelte +0 -189
  454. package/dist/fermi-surface/FermiSlice.svelte.d.ts +0 -24
  455. package/dist/fermi-surface/FermiSurface.svelte +0 -597
  456. package/dist/fermi-surface/FermiSurface.svelte.d.ts +0 -83
  457. package/dist/fermi-surface/FermiSurfaceControls.svelte +0 -452
  458. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +0 -35
  459. package/dist/fermi-surface/FermiSurfaceScene.svelte +0 -792
  460. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +0 -50
  461. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +0 -111
  462. package/dist/fermi-surface/FermiSurfaceTooltip.svelte.d.ts +0 -8
  463. package/dist/fermi-surface/compute.d.ts +0 -5
  464. package/dist/fermi-surface/compute.js +0 -538
  465. package/dist/fermi-surface/constants.d.ts +0 -9
  466. package/dist/fermi-surface/constants.js +0 -27
  467. package/dist/fermi-surface/export.d.ts +0 -5
  468. package/dist/fermi-surface/export.js +0 -63
  469. package/dist/fermi-surface/index.d.ts +0 -12
  470. package/dist/fermi-surface/index.js +0 -13
  471. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  472. package/dist/fermi-surface/marching-cubes.js +0 -2
  473. package/dist/fermi-surface/parse.d.ts +0 -2
  474. package/dist/fermi-surface/parse.js +0 -495
  475. package/dist/fermi-surface/symmetry.d.ts +0 -3
  476. package/dist/fermi-surface/symmetry.js +0 -46
  477. package/dist/fermi-surface/types.d.ts +0 -113
  478. package/dist/fermi-surface/types.js +0 -4
  479. package/dist/heatmap-matrix/HeatmapMatrix.svelte +0 -1527
  480. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +0 -110
  481. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +0 -225
  482. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +0 -30
  483. package/dist/heatmap-matrix/index.d.ts +0 -53
  484. package/dist/heatmap-matrix/index.js +0 -100
  485. package/dist/heatmap-matrix/shared.d.ts +0 -2
  486. package/dist/heatmap-matrix/shared.js +0 -4
  487. package/dist/icons.d.ts +0 -569
  488. package/dist/icons.js +0 -648
  489. package/dist/index.d.ts +0 -39
  490. package/dist/index.js +0 -39
  491. package/dist/io/decompress.d.ts +0 -10
  492. package/dist/io/decompress.js +0 -69
  493. package/dist/io/export.d.ts +0 -16
  494. package/dist/io/export.js +0 -312
  495. package/dist/io/fetch.d.ts +0 -5
  496. package/dist/io/fetch.js +0 -39
  497. package/dist/io/file-drop.d.ts +0 -7
  498. package/dist/io/file-drop.js +0 -43
  499. package/dist/io/index.d.ts +0 -7
  500. package/dist/io/index.js +0 -7
  501. package/dist/io/is-binary.d.ts +0 -1
  502. package/dist/io/is-binary.js +0 -5
  503. package/dist/io/types.d.ts +0 -8
  504. package/dist/io/types.js +0 -1
  505. package/dist/io/url-drop.d.ts +0 -2
  506. package/dist/io/url-drop.js +0 -117
  507. package/dist/isosurface/Isosurface.svelte +0 -285
  508. package/dist/isosurface/Isosurface.svelte.d.ts +0 -8
  509. package/dist/isosurface/IsosurfaceControls.svelte +0 -291
  510. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +0 -9
  511. package/dist/isosurface/index.d.ts +0 -5
  512. package/dist/isosurface/index.js +0 -6
  513. package/dist/isosurface/parse.d.ts +0 -6
  514. package/dist/isosurface/parse.js +0 -553
  515. package/dist/isosurface/slice.d.ts +0 -11
  516. package/dist/isosurface/slice.js +0 -140
  517. package/dist/isosurface/types.d.ts +0 -56
  518. package/dist/isosurface/types.js +0 -227
  519. package/dist/labels.d.ts +0 -53
  520. package/dist/labels.js +0 -274
  521. package/dist/layout/FullscreenToggle.svelte +0 -50
  522. package/dist/layout/FullscreenToggle.svelte.d.ts +0 -7
  523. package/dist/layout/InfoCard.svelte +0 -120
  524. package/dist/layout/InfoCard.svelte.d.ts +0 -21
  525. package/dist/layout/InfoTag.svelte +0 -183
  526. package/dist/layout/InfoTag.svelte.d.ts +0 -19
  527. package/dist/layout/PropertyFilter.svelte +0 -244
  528. package/dist/layout/PropertyFilter.svelte.d.ts +0 -24
  529. package/dist/layout/SettingsSection.svelte +0 -148
  530. package/dist/layout/SettingsSection.svelte.d.ts +0 -17
  531. package/dist/layout/SubpageGrid.svelte +0 -82
  532. package/dist/layout/SubpageGrid.svelte.d.ts +0 -14
  533. package/dist/layout/fullscreen.d.ts +0 -9
  534. package/dist/layout/fullscreen.js +0 -53
  535. package/dist/layout/index.d.ts +0 -10
  536. package/dist/layout/index.js +0 -8
  537. package/dist/layout/json-tree/JsonNode.svelte +0 -547
  538. package/dist/layout/json-tree/JsonNode.svelte.d.ts +0 -11
  539. package/dist/layout/json-tree/JsonTree.svelte +0 -1222
  540. package/dist/layout/json-tree/JsonTree.svelte.d.ts +0 -6
  541. package/dist/layout/json-tree/JsonValue.svelte +0 -334
  542. package/dist/layout/json-tree/JsonValue.svelte.d.ts +0 -9
  543. package/dist/layout/json-tree/index.d.ts +0 -3
  544. package/dist/layout/json-tree/index.js +0 -3
  545. package/dist/layout/json-tree/types.d.ts +0 -73
  546. package/dist/layout/json-tree/types.js +0 -3
  547. package/dist/layout/json-tree/utils.d.ts +0 -29
  548. package/dist/layout/json-tree/utils.js +0 -648
  549. package/dist/marching-cubes.d.ts +0 -14
  550. package/dist/marching-cubes.js +0 -542
  551. package/dist/math.d.ts +0 -91
  552. package/dist/math.js +0 -896
  553. package/dist/overlays/ContextMenu.svelte +0 -162
  554. package/dist/overlays/ContextMenu.svelte.d.ts +0 -25
  555. package/dist/overlays/DraggablePane.svelte +0 -564
  556. package/dist/overlays/DraggablePane.svelte.d.ts +0 -36
  557. package/dist/overlays/index.d.ts +0 -2
  558. package/dist/overlays/index.js +0 -2
  559. package/dist/periodic-table/PeriodicTable.svelte +0 -469
  560. package/dist/periodic-table/PeriodicTable.svelte.d.ts +0 -55
  561. package/dist/periodic-table/PeriodicTableControls.svelte +0 -557
  562. package/dist/periodic-table/PeriodicTableControls.svelte.d.ts +0 -24
  563. package/dist/periodic-table/PropertySelect.svelte +0 -37
  564. package/dist/periodic-table/PropertySelect.svelte.d.ts +0 -13
  565. package/dist/periodic-table/TableInset.svelte.d.ts +0 -9
  566. package/dist/periodic-table/index.d.ts +0 -10
  567. package/dist/periodic-table/index.js +0 -4
  568. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +0 -1086
  569. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +0 -44
  570. package/dist/phase-diagram/PhaseDiagramControls.svelte +0 -451
  571. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +0 -30
  572. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +0 -126
  573. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +0 -15
  574. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +0 -192
  575. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +0 -19
  576. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +0 -392
  577. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +0 -16
  578. package/dist/phase-diagram/TdbInfoPanel.svelte +0 -203
  579. package/dist/phase-diagram/TdbInfoPanel.svelte.d.ts +0 -12
  580. package/dist/phase-diagram/build-diagram.d.ts +0 -11
  581. package/dist/phase-diagram/build-diagram.js +0 -167
  582. package/dist/phase-diagram/colors.d.ts +0 -35
  583. package/dist/phase-diagram/colors.js +0 -51
  584. package/dist/phase-diagram/diagram-input.d.ts +0 -33
  585. package/dist/phase-diagram/diagram-input.js +0 -3
  586. package/dist/phase-diagram/index.d.ts +0 -13
  587. package/dist/phase-diagram/index.js +0 -13
  588. package/dist/phase-diagram/parse.d.ts +0 -55
  589. package/dist/phase-diagram/parse.js +0 -276
  590. package/dist/phase-diagram/svg-to-diagram.d.ts +0 -2
  591. package/dist/phase-diagram/svg-to-diagram.js +0 -869
  592. package/dist/phase-diagram/types.d.ts +0 -99
  593. package/dist/phase-diagram/types.js +0 -1
  594. package/dist/phase-diagram/utils.d.ts +0 -118
  595. package/dist/phase-diagram/utils.js +0 -606
  596. package/dist/plot/AxisLabel.svelte +0 -51
  597. package/dist/plot/AxisLabel.svelte.d.ts +0 -16
  598. package/dist/plot/BarPlot.svelte +0 -2256
  599. package/dist/plot/BarPlot.svelte.d.ts +0 -82
  600. package/dist/plot/BarPlotControls.svelte +0 -66
  601. package/dist/plot/BarPlotControls.svelte.d.ts +0 -18
  602. package/dist/plot/ColorBar.svelte +0 -719
  603. package/dist/plot/ColorBar.svelte.d.ts +0 -31
  604. package/dist/plot/ColorScaleSelect.svelte +0 -54
  605. package/dist/plot/ColorScaleSelect.svelte.d.ts +0 -15
  606. package/dist/plot/ElementScatter.svelte +0 -63
  607. package/dist/plot/ElementScatter.svelte.d.ts +0 -14
  608. package/dist/plot/FillArea.svelte +0 -226
  609. package/dist/plot/FillArea.svelte.d.ts +0 -20
  610. package/dist/plot/Histogram.svelte +0 -1654
  611. package/dist/plot/Histogram.svelte.d.ts +0 -50
  612. package/dist/plot/HistogramControls.svelte +0 -212
  613. package/dist/plot/HistogramControls.svelte.d.ts +0 -22
  614. package/dist/plot/InteractiveAxisLabel.svelte +0 -94
  615. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +0 -14
  616. package/dist/plot/Line.svelte +0 -85
  617. package/dist/plot/Line.svelte.d.ts +0 -15
  618. package/dist/plot/PlotControls.svelte +0 -537
  619. package/dist/plot/PlotControls.svelte.d.ts +0 -4
  620. package/dist/plot/PlotLegend.svelte +0 -498
  621. package/dist/plot/PlotLegend.svelte.d.ts +0 -25
  622. package/dist/plot/PlotTooltip.svelte +0 -67
  623. package/dist/plot/PlotTooltip.svelte.d.ts +0 -17
  624. package/dist/plot/PortalSelect.svelte +0 -253
  625. package/dist/plot/PortalSelect.svelte.d.ts +0 -16
  626. package/dist/plot/ReferenceLine.svelte.d.ts +0 -20
  627. package/dist/plot/ReferenceLine3D.svelte +0 -154
  628. package/dist/plot/ReferenceLine3D.svelte.d.ts +0 -14
  629. package/dist/plot/ReferencePlane.svelte +0 -178
  630. package/dist/plot/ReferencePlane.svelte.d.ts +0 -14
  631. package/dist/plot/ScatterPlot.svelte +0 -2831
  632. package/dist/plot/ScatterPlot.svelte.d.ts +0 -92
  633. package/dist/plot/ScatterPlot3D.svelte +0 -499
  634. package/dist/plot/ScatterPlot3D.svelte.d.ts +0 -94
  635. package/dist/plot/ScatterPlot3DControls.svelte +0 -437
  636. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +0 -20
  637. package/dist/plot/ScatterPlot3DScene.svelte +0 -912
  638. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +0 -74
  639. package/dist/plot/ScatterPlotControls.svelte +0 -307
  640. package/dist/plot/ScatterPlotControls.svelte.d.ts +0 -17
  641. package/dist/plot/ScatterPoint.svelte +0 -185
  642. package/dist/plot/ScatterPoint.svelte.d.ts +0 -19
  643. package/dist/plot/SpacegroupBarPlot.svelte +0 -292
  644. package/dist/plot/SpacegroupBarPlot.svelte.d.ts +0 -9
  645. package/dist/plot/Surface3D.svelte +0 -200
  646. package/dist/plot/Surface3D.svelte.d.ts +0 -13
  647. package/dist/plot/ZeroLines.svelte +0 -96
  648. package/dist/plot/ZeroLines.svelte.d.ts +0 -32
  649. package/dist/plot/ZoomRect.svelte +0 -23
  650. package/dist/plot/ZoomRect.svelte.d.ts +0 -8
  651. package/dist/plot/axis-utils.d.ts +0 -19
  652. package/dist/plot/axis-utils.js +0 -80
  653. package/dist/plot/data-cleaning.d.ts +0 -37
  654. package/dist/plot/data-cleaning.js +0 -855
  655. package/dist/plot/data-transform.d.ts +0 -16
  656. package/dist/plot/data-transform.js +0 -45
  657. package/dist/plot/defaults.d.ts +0 -19
  658. package/dist/plot/defaults.js +0 -9
  659. package/dist/plot/fill-utils.d.ts +0 -51
  660. package/dist/plot/fill-utils.js +0 -337
  661. package/dist/plot/hover-lock.svelte.d.ts +0 -14
  662. package/dist/plot/hover-lock.svelte.js +0 -46
  663. package/dist/plot/index.d.ts +0 -43
  664. package/dist/plot/index.js +0 -37
  665. package/dist/plot/interactions.d.ts +0 -12
  666. package/dist/plot/interactions.js +0 -100
  667. package/dist/plot/layout.d.ts +0 -60
  668. package/dist/plot/layout.js +0 -230
  669. package/dist/plot/reference-line.d.ts +0 -60
  670. package/dist/plot/reference-line.js +0 -316
  671. package/dist/plot/scales.d.ts +0 -48
  672. package/dist/plot/scales.js +0 -484
  673. package/dist/plot/svg.d.ts +0 -1
  674. package/dist/plot/svg.js +0 -11
  675. package/dist/plot/types.d.ts +0 -863
  676. package/dist/plot/types.js +0 -103
  677. package/dist/plot/utils/label-placement.d.ts +0 -47
  678. package/dist/plot/utils/label-placement.js +0 -256
  679. package/dist/plot/utils/series-visibility.d.ts +0 -9
  680. package/dist/plot/utils/series-visibility.js +0 -67
  681. package/dist/plot/utils.d.ts +0 -1
  682. package/dist/plot/utils.js +0 -14
  683. package/dist/rdf/RdfPlot.svelte +0 -247
  684. package/dist/rdf/RdfPlot.svelte.d.ts +0 -27
  685. package/dist/rdf/calc-rdf.d.ts +0 -4
  686. package/dist/rdf/calc-rdf.js +0 -111
  687. package/dist/rdf/index.d.ts +0 -23
  688. package/dist/rdf/index.js +0 -2
  689. package/dist/sanitize.d.ts +0 -4
  690. package/dist/sanitize.js +0 -107
  691. package/dist/settings.d.ts +0 -253
  692. package/dist/settings.js +0 -1123
  693. package/dist/spectral/Bands.svelte +0 -1040
  694. package/dist/spectral/Bands.svelte.d.ts +0 -40
  695. package/dist/spectral/BandsAndDos.svelte +0 -128
  696. package/dist/spectral/BandsAndDos.svelte.d.ts +0 -18
  697. package/dist/spectral/BrillouinBandsDos.svelte +0 -248
  698. package/dist/spectral/BrillouinBandsDos.svelte.d.ts +0 -20
  699. package/dist/spectral/Dos.svelte +0 -697
  700. package/dist/spectral/Dos.svelte.d.ts +0 -29
  701. package/dist/spectral/helpers.d.ts +0 -117
  702. package/dist/spectral/helpers.js +0 -1023
  703. package/dist/spectral/index.d.ts +0 -6
  704. package/dist/spectral/index.js +0 -7
  705. package/dist/spectral/types.d.ts +0 -84
  706. package/dist/spectral/types.js +0 -2
  707. package/dist/state.svelte.d.ts +0 -25
  708. package/dist/state.svelte.js +0 -45
  709. package/dist/structure/Arrow.svelte +0 -72
  710. package/dist/structure/Arrow.svelte.d.ts +0 -15
  711. package/dist/structure/AtomLegend.svelte +0 -798
  712. package/dist/structure/AtomLegend.svelte.d.ts +0 -34
  713. package/dist/structure/Bond.svelte +0 -140
  714. package/dist/structure/Bond.svelte.d.ts +0 -9
  715. package/dist/structure/CanvasTooltip.svelte +0 -33
  716. package/dist/structure/CanvasTooltip.svelte.d.ts +0 -12
  717. package/dist/structure/CellSelect.svelte +0 -351
  718. package/dist/structure/CellSelect.svelte.d.ts +0 -13
  719. package/dist/structure/Cylinder.svelte +0 -45
  720. package/dist/structure/Cylinder.svelte.d.ts +0 -10
  721. package/dist/structure/Lattice.svelte +0 -196
  722. package/dist/structure/Lattice.svelte.d.ts +0 -17
  723. package/dist/structure/Structure.svelte +0 -1857
  724. package/dist/structure/Structure.svelte.d.ts +0 -83
  725. package/dist/structure/StructureControls.svelte +0 -1184
  726. package/dist/structure/StructureControls.svelte.d.ts +0 -31
  727. package/dist/structure/StructureExportPane.svelte +0 -251
  728. package/dist/structure/StructureExportPane.svelte.d.ts +0 -17
  729. package/dist/structure/StructureInfoPane.svelte +0 -434
  730. package/dist/structure/StructureInfoPane.svelte.d.ts +0 -18
  731. package/dist/structure/StructureScene.svelte +0 -1574
  732. package/dist/structure/StructureScene.svelte.d.ts +0 -104
  733. package/dist/structure/atom-properties.d.ts +0 -37
  734. package/dist/structure/atom-properties.js +0 -198
  735. package/dist/structure/bonding.d.ts +0 -33
  736. package/dist/structure/bonding.js +0 -304
  737. package/dist/structure/export.d.ts +0 -20
  738. package/dist/structure/export.js +0 -725
  739. package/dist/structure/ferrox-wasm-types.d.ts +0 -46
  740. package/dist/structure/ferrox-wasm-types.js +0 -18
  741. package/dist/structure/ferrox-wasm.d.ts +0 -94
  742. package/dist/structure/ferrox-wasm.js +0 -249
  743. package/dist/structure/index.d.ts +0 -110
  744. package/dist/structure/index.js +0 -168
  745. package/dist/structure/measure.d.ts +0 -6
  746. package/dist/structure/measure.js +0 -29
  747. package/dist/structure/parse.d.ts +0 -65
  748. package/dist/structure/parse.js +0 -1374
  749. package/dist/structure/partial-occupancy.d.ts +0 -25
  750. package/dist/structure/partial-occupancy.js +0 -99
  751. package/dist/structure/pbc.d.ts +0 -9
  752. package/dist/structure/pbc.js +0 -123
  753. package/dist/structure/supercell.d.ts +0 -8
  754. package/dist/structure/supercell.js +0 -137
  755. package/dist/structure/validation.d.ts +0 -2
  756. package/dist/structure/validation.js +0 -10
  757. package/dist/symmetry/SymmetryStats.svelte +0 -226
  758. package/dist/symmetry/SymmetryStats.svelte.d.ts +0 -21
  759. package/dist/symmetry/WyckoffTable.svelte +0 -113
  760. package/dist/symmetry/WyckoffTable.svelte.d.ts +0 -11
  761. package/dist/symmetry/cell-transform.d.ts +0 -12
  762. package/dist/symmetry/cell-transform.js +0 -77
  763. package/dist/symmetry/index.d.ts +0 -43
  764. package/dist/symmetry/index.js +0 -229
  765. package/dist/symmetry/spacegroups.d.ts +0 -9
  766. package/dist/symmetry/spacegroups.js +0 -394
  767. package/dist/table/HeatmapTable.svelte +0 -1854
  768. package/dist/table/HeatmapTable.svelte.d.ts +0 -49
  769. package/dist/table/ToggleMenu.svelte +0 -376
  770. package/dist/table/ToggleMenu.svelte.d.ts +0 -11
  771. package/dist/table/index.d.ts +0 -74
  772. package/dist/table/index.js +0 -38
  773. package/dist/theme/ThemeControl.svelte +0 -53
  774. package/dist/theme/ThemeControl.svelte.d.ts +0 -9
  775. package/dist/theme/index.d.ts +0 -29
  776. package/dist/theme/index.js +0 -79
  777. package/dist/theme/themes.mjs +0 -285
  778. package/dist/time.d.ts +0 -4
  779. package/dist/time.js +0 -70
  780. package/dist/tooltip/TooltipContent.svelte +0 -58
  781. package/dist/tooltip/TooltipContent.svelte.d.ts +0 -31
  782. package/dist/tooltip/index.d.ts +0 -2
  783. package/dist/tooltip/index.js +0 -2
  784. package/dist/tooltip/types.d.ts +0 -8
  785. package/dist/tooltip/types.js +0 -1
  786. package/dist/trajectory/Trajectory.svelte +0 -1517
  787. package/dist/trajectory/Trajectory.svelte.d.ts +0 -77
  788. package/dist/trajectory/TrajectoryError.svelte +0 -128
  789. package/dist/trajectory/TrajectoryError.svelte.d.ts +0 -13
  790. package/dist/trajectory/TrajectoryExportPane.svelte +0 -357
  791. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +0 -17
  792. package/dist/trajectory/TrajectoryInfoPane.svelte +0 -387
  793. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +0 -17
  794. package/dist/trajectory/constants.d.ts +0 -6
  795. package/dist/trajectory/constants.js +0 -7
  796. package/dist/trajectory/extract.d.ts +0 -5
  797. package/dist/trajectory/extract.js +0 -162
  798. package/dist/trajectory/format-detect.d.ts +0 -9
  799. package/dist/trajectory/format-detect.js +0 -76
  800. package/dist/trajectory/frame-reader.d.ts +0 -17
  801. package/dist/trajectory/frame-reader.js +0 -332
  802. package/dist/trajectory/helpers.d.ts +0 -14
  803. package/dist/trajectory/helpers.js +0 -172
  804. package/dist/trajectory/index.d.ts +0 -63
  805. package/dist/trajectory/index.js +0 -126
  806. package/dist/trajectory/parse/ase.d.ts +0 -2
  807. package/dist/trajectory/parse/ase.js +0 -77
  808. package/dist/trajectory/parse/hdf5.d.ts +0 -2
  809. package/dist/trajectory/parse/hdf5.js +0 -129
  810. package/dist/trajectory/parse/index.d.ts +0 -12
  811. package/dist/trajectory/parse/index.js +0 -299
  812. package/dist/trajectory/parse/lammps.d.ts +0 -5
  813. package/dist/trajectory/parse/lammps.js +0 -179
  814. package/dist/trajectory/parse/vasp.d.ts +0 -2
  815. package/dist/trajectory/parse/vasp.js +0 -68
  816. package/dist/trajectory/parse/xyz.d.ts +0 -2
  817. package/dist/trajectory/parse/xyz.js +0 -110
  818. package/dist/trajectory/plotting.d.ts +0 -28
  819. package/dist/trajectory/plotting.js +0 -423
  820. package/dist/trajectory/types.d.ts +0 -11
  821. package/dist/trajectory/types.js +0 -1
  822. package/dist/utils.d.ts +0 -5
  823. package/dist/utils.js +0 -36
  824. package/dist/xrd/XrdPlot.svelte +0 -615
  825. package/dist/xrd/XrdPlot.svelte.d.ts +0 -28
  826. package/dist/xrd/broadening.d.ts +0 -20
  827. package/dist/xrd/broadening.js +0 -97
  828. package/dist/xrd/calc-xrd.d.ts +0 -37
  829. package/dist/xrd/calc-xrd.js +0 -337
  830. package/dist/xrd/index.d.ts +0 -37
  831. package/dist/xrd/index.js +0 -4
  832. package/dist/xrd/parse.d.ts +0 -13
  833. package/dist/xrd/parse.js +0 -749
  834. /package/dist/{EmptyState.svelte → src/lib/EmptyState.svelte} +0 -0
  835. /package/dist/{Icon.svelte → src/lib/Icon.svelte} +0 -0
  836. /package/dist/{chempot-diagram → src/lib/chempot-diagram}/ChemPotScene3D.svelte +0 -0
  837. /package/dist/{colors → src/lib/colors}/alloy-colors.json +0 -0
  838. /package/dist/{colors → src/lib/colors}/dark-mode-colors.json +0 -0
  839. /package/dist/{colors → src/lib/colors}/jmol-colors.json +0 -0
  840. /package/dist/{colors → src/lib/colors}/muted-colors.json +0 -0
  841. /package/dist/{colors → src/lib/colors}/pastel-colors.json +0 -0
  842. /package/dist/{colors → src/lib/colors}/vesta-colors.json +0 -0
  843. /package/dist/{element → src/lib/element}/Nucleus.svelte +0 -0
  844. /package/dist/{element → src/lib/element}/data.json +0 -0
  845. /package/dist/{element → src/lib/element}/data.json.gz +0 -0
  846. /package/dist/{element → src/lib/element}/data.schema.json +0 -0
  847. /package/dist/{element-image-urls.json → src/lib/element-image-urls.json} +0 -0
  848. /package/dist/{feedback → src/lib/feedback}/Spinner.svelte +0 -0
  849. /package/dist/{feedback → src/lib/feedback}/StatusMessage.svelte +0 -0
  850. /package/dist/{periodic-table → src/lib/periodic-table}/TableInset.svelte +0 -0
  851. /package/dist/{plot → src/lib/plot}/ReferenceLine.svelte +0 -0
  852. /package/dist/{xrd → src/lib/xrd}/atomic_scattering_params.json +0 -0
@@ -1,1654 +0,0 @@
1
- <script lang="ts">
2
- import { format_value } from '../labels'
3
- import { FullscreenToggle, set_fullscreen_bg } from '../layout'
4
- import type {
5
- AxisLoadError,
6
- BarStyle,
7
- DataLoaderFn,
8
- HistogramHandlerProps,
9
- PanConfig,
10
- RefLine,
11
- RefLineEvent,
12
- } from './'
13
- import {
14
- AxisLabel,
15
- compute_element_placement,
16
- HistogramControls,
17
- PlotLegend,
18
- ReferenceLine,
19
- } from './'
20
- import type { AxisChangeState } from './axis-utils'
21
- import { create_axis_change_handler } from './axis-utils'
22
- import { extract_series_color, prepare_legend_data } from './data-transform'
23
- import { AXIS_DEFAULTS } from './defaults'
24
- import {
25
- create_dimension_tracker,
26
- create_hover_lock,
27
- } from './hover-lock.svelte'
28
- import {
29
- get_relative_coords,
30
- pan_range,
31
- PINCH_ZOOM_THRESHOLD,
32
- pixels_to_data_delta,
33
- } from './interactions'
34
- import {
35
- calc_auto_padding,
36
- constrain_tooltip_position,
37
- filter_padding,
38
- LABEL_GAP_DEFAULT,
39
- measure_max_tick_width,
40
- } from './layout'
41
- import type { IndexedRefLine } from './reference-line'
42
- import { group_ref_lines_by_z, index_ref_lines } from './reference-line'
43
- import {
44
- create_scale,
45
- generate_ticks,
46
- get_nice_data_range,
47
- get_tick_label,
48
- } from './scales'
49
- import type {
50
- BasePlotProps,
51
- DataSeries,
52
- InitialRanges,
53
- LegendConfig,
54
- PlotConfig,
55
- ScaleType,
56
- } from './types'
57
- import { get_scale_type_name } from './types'
58
- import ZeroLines from './ZeroLines.svelte'
59
- import ZoomRect from './ZoomRect.svelte'
60
- import { DEFAULTS } from '../settings'
61
- import { bin, max } from 'd3-array'
62
- import type { Snippet } from 'svelte'
63
- import { untrack } from 'svelte'
64
- import type { HTMLAttributes } from 'svelte/elements'
65
- import { Tween } from 'svelte/motion'
66
- import type { Vec2 } from '../math'
67
- import PlotTooltip from './PlotTooltip.svelte'
68
- import { bar_path } from './svg'
69
-
70
- let {
71
- series = $bindable([]),
72
- x_axis: x_axis_init = {},
73
- x2_axis: x2_axis_init = {},
74
- y_axis: y_axis_init = {},
75
- y2_axis: y2_axis_init = {},
76
- display: display_init = DEFAULTS.histogram.display,
77
- x_range = [null, null],
78
- x2_range = [null, null],
79
- y_range = [null, null],
80
- y2_range = [null, null],
81
- range_padding = 0.05,
82
- padding = { t: 20, b: 60, l: 60, r: 20 },
83
- bins = $bindable(100),
84
- show_legend = $bindable(true),
85
- legend = {},
86
- bar: bar_init = {},
87
- selected_property = $bindable(``),
88
- mode = $bindable(`single`),
89
- tooltip,
90
- hovered = $bindable(false),
91
- change = () => {},
92
- on_bar_click,
93
- on_bar_hover,
94
- ref_lines = $bindable([]),
95
- on_ref_line_click,
96
- on_ref_line_hover,
97
- show_controls = $bindable(true),
98
- controls_open = $bindable(false),
99
- on_series_toggle = () => {},
100
- controls_toggle_props,
101
- controls_pane_props,
102
- fullscreen = $bindable(false),
103
- fullscreen_toggle = true,
104
- children,
105
- header_controls,
106
- controls_extra,
107
- data_loader,
108
- on_axis_change,
109
- on_error,
110
- pan = {},
111
- ...rest
112
- }: HTMLAttributes<HTMLDivElement> & BasePlotProps & PlotConfig & {
113
- series: DataSeries[]
114
- // Component-specific props
115
- bins?: number
116
- show_legend?: boolean
117
- legend?: LegendConfig | null
118
- bar?: BarStyle
119
- selected_property?: string
120
- mode?: `single` | `overlay`
121
- tooltip?: Snippet<[HistogramHandlerProps]>
122
- header_controls?: Snippet<
123
- [{ height: number; width: number; fullscreen: boolean }]
124
- >
125
- controls_extra?: Snippet<[Required<PlotConfig>]>
126
- change?: (data: { value: number; count: number; property: string } | null) => void
127
- on_bar_click?: (
128
- data: {
129
- value: number
130
- count: number
131
- property: string
132
- event: MouseEvent | KeyboardEvent
133
- },
134
- ) => void
135
- on_bar_hover?: (
136
- data:
137
- | { value: number; count: number; property: string; event: MouseEvent }
138
- | null,
139
- ) => void
140
- ref_lines?: RefLine[]
141
- on_ref_line_click?: (event: RefLineEvent) => void
142
- on_ref_line_hover?: (event: RefLineEvent | null) => void
143
- on_series_toggle?: (series_idx: number) => void
144
- // Interactive axis props
145
- data_loader?: DataLoaderFn
146
- on_axis_change?: (
147
- axis: `x` | `x2` | `y` | `y2`,
148
- key: string,
149
- new_series: DataSeries[],
150
- ) => void
151
- on_error?: (error: AxisLoadError) => void
152
- pan?: PanConfig
153
- } = $props()
154
-
155
- // Local state for controls (initialized from props, owned by this component)
156
- // Include key AXIS_DEFAULTS props (range, ticks, scale_type) that PlotControls needs
157
- // Using $state because these have bindings in HistogramControls/PlotControls
158
- // untrack() explicitly captures initial prop values (intentional - props provide initial config)
159
- const { format: _, ...axis_state_defaults } = AXIS_DEFAULTS // Exclude format (has component-specific default)
160
- let bar = $state(untrack(() => ({ ...DEFAULTS.histogram.bar, ...bar_init })))
161
- let x_axis = $state(untrack(() => ({ ...axis_state_defaults, ...x_axis_init })))
162
- // x2-axis needs different default label_shift for top-side positioning
163
- let x2_axis = $state(untrack(() => ({
164
- ...axis_state_defaults,
165
- label_shift: { x: 0, y: 40 },
166
- ...x2_axis_init,
167
- })))
168
- let y_axis = $state(untrack(() => ({ ...axis_state_defaults, ...y_axis_init })))
169
- // y2-axis needs different default label_shift for right-side positioning
170
- let y2_axis = $state(untrack(() => ({
171
- ...axis_state_defaults,
172
- label_shift: { x: 0, y: 60 },
173
- ...y2_axis_init,
174
- })))
175
- let display = $state(
176
- untrack(() => ({ ...DEFAULTS.histogram.display, ...display_init })),
177
- )
178
-
179
- // Merge component-specific defaults with local state (format comes from here, not AXIS_DEFAULTS)
180
- const final_x_axis = $derived({ label: `Value`, format: `.2~s`, ...x_axis })
181
- const final_x2_axis = $derived({ label: `Value`, format: `.2~s`, ...x2_axis })
182
- const final_y_axis = $derived({ label: `Count`, format: `d`, ...y_axis })
183
- const final_bar = $derived({ ...DEFAULTS.histogram.bar, ...bar })
184
- const final_y2_axis = $derived({ label: `Count`, format: `d`, ...y2_axis })
185
-
186
- // Core state
187
- let [width, height] = $state([0, 0])
188
- let wrapper: HTMLDivElement | undefined = $state()
189
- let svg_element: SVGElement | null = $state(null)
190
- let clip_path_id = `histogram-clip-${crypto?.randomUUID?.()}`
191
- let hover_info = $state<HistogramHandlerProps | null>(null)
192
-
193
- // Reference line hover state
194
- let hovered_ref_line_idx = $state<number | null>(null)
195
-
196
- // Interactive axis loading state
197
- let axis_loading = $state<`x` | `x2` | `y` | `y2` | null>(null)
198
-
199
- // Compute ref_lines with index and group by z-index (using shared utilities)
200
- let indexed_ref_lines = $derived(index_ref_lines(ref_lines))
201
- let ref_lines_by_z = $derived(group_ref_lines_by_z(indexed_ref_lines))
202
- let tooltip_el = $state<HTMLDivElement | undefined>()
203
- let drag_state = $state<{
204
- start: { x: number; y: number } | null
205
- current: { x: number; y: number } | null
206
- bounds: DOMRect | null
207
- }>({ start: null, current: null, bounds: null })
208
-
209
- // Pan state
210
- let is_focused = $state(false)
211
- let shift_held = $state(false)
212
- let pan_drag_state = $state<
213
- InitialRanges & { start: { x: number; y: number } } | null
214
- >(null)
215
- let touch_state = $state<
216
- InitialRanges & { start_touches: { x: number; y: number }[] } | null
217
- >(null)
218
-
219
- // Legend placement stability state
220
- let legend_element = $state<HTMLDivElement | undefined>()
221
- const legend_hover = create_hover_lock()
222
- const dim_tracker = create_dimension_tracker()
223
- let has_initial_legend_placement = $state(false)
224
-
225
- // Clear pending hover lock timeout on unmount
226
- $effect(() => () => legend_hover.cleanup())
227
-
228
- // Derived data
229
- let selected_series = $derived(
230
- mode === `single` && selected_property
231
- ? series.filter((srs: DataSeries) =>
232
- (srs.visible ?? true) && srs.label === selected_property
233
- )
234
- : series.filter((srs: DataSeries) => srs.visible ?? true),
235
- )
236
-
237
- // Separate series by y-axis
238
- let y1_series = $derived(
239
- selected_series.filter((srs: DataSeries) => (srs.y_axis ?? `y1`) === `y1`),
240
- )
241
- let y2_series = $derived(
242
- selected_series.filter((srs: DataSeries) => srs.y_axis === `y2`),
243
- )
244
- let x2_series = $derived(
245
- selected_series.filter((srs: DataSeries) => srs.x_axis === `x2`),
246
- )
247
-
248
- let auto_ranges = $derived.by(() => {
249
- const all_values = selected_series.flatMap((srs: DataSeries) => srs.y)
250
- const auto_x = get_nice_data_range(
251
- all_values.map((val) => ({ x: val, y: 0 })),
252
- ({ x }) => x,
253
- x_range,
254
- final_x_axis.scale_type ?? `linear`,
255
- range_padding,
256
- false,
257
- )
258
-
259
- const x2_values = x2_series.flatMap((srs: DataSeries) => srs.y)
260
- const auto_x2 = x2_values.length > 0
261
- ? get_nice_data_range(
262
- x2_values.map((val) => ({ x: val, y: 0 })),
263
- ({ x }) => x,
264
- x2_range,
265
- final_x2_axis.scale_type ?? `linear`,
266
- range_padding,
267
- false,
268
- )
269
- : [0, 1] as Vec2
270
-
271
- // Calculate y-range for a specific set of series
272
- const calc_y_range = (
273
- series_list: typeof selected_series,
274
- y_limit: typeof y_range,
275
- scale_type: ScaleType,
276
- ): Vec2 => {
277
- const type_name = get_scale_type_name(scale_type)
278
- if (!series_list.length) {
279
- const fallback = type_name === `log` ? 1 : 0
280
- return [fallback, 1]
281
- }
282
- const hist = bin().domain([auto_x[0], auto_x[1]]).thresholds(bins)
283
- const max_count = Math.max(
284
- 0,
285
- ...series_list.map((srs: DataSeries) =>
286
- max(hist(srs.y), (data) => data.length) || 0
287
- ),
288
- )
289
-
290
- // If there's effectively no data, avoid log-range issues (counts can't be <= 0 on log)
291
- if (max_count <= 0) {
292
- const fallback = type_name === `log` ? 1 : 0
293
- return [fallback, 1]
294
- }
295
-
296
- const [y0, y1] = get_nice_data_range(
297
- [{ x: 0, y: 0 }, { x: max_count, y: 0 }],
298
- ({ x }) => x,
299
- y_limit,
300
- scale_type,
301
- range_padding,
302
- false,
303
- )
304
- // For log scale, minimum must be >= 1 (count can't be 0 on log)
305
- // For linear/arcsinh, start from 0
306
- const y_min = type_name === `log` ? Math.max(1, y0) : Math.max(0, y0)
307
- return [y_min, y1]
308
- }
309
-
310
- const y1_range = calc_y_range(
311
- y1_series,
312
- y_range,
313
- final_y_axis.scale_type ?? `linear`,
314
- )
315
- const y2_auto_range = calc_y_range(
316
- y2_series,
317
- y2_range,
318
- final_y2_axis.scale_type ?? `linear`,
319
- )
320
-
321
- return { x: auto_x, x2: auto_x2, y: y1_range, y2: y2_auto_range }
322
- })
323
-
324
- // Initialize ranges
325
- let ranges = $state({
326
- initial: {
327
- x: [0, 1] as Vec2,
328
- x2: [0, 1] as Vec2,
329
- y: [0, 1] as Vec2,
330
- y2: [0, 1] as Vec2,
331
- },
332
- current: {
333
- x: [0, 1] as Vec2,
334
- x2: [0, 1] as Vec2,
335
- y: [0, 1] as Vec2,
336
- y2: [0, 1] as Vec2,
337
- },
338
- })
339
-
340
- $effect(() => {
341
- // Support one-sided range pinning: merge user range with auto range for null values
342
- const new_x: [number, number] = final_x_axis.range
343
- ? [
344
- final_x_axis.range[0] ?? auto_ranges.x[0],
345
- final_x_axis.range[1] ?? auto_ranges.x[1],
346
- ]
347
- : auto_ranges.x
348
- const new_x2: [number, number] = final_x2_axis.range
349
- ? [
350
- final_x2_axis.range[0] ?? auto_ranges.x2[0],
351
- final_x2_axis.range[1] ?? auto_ranges.x2[1],
352
- ]
353
- : auto_ranges.x2
354
- const new_y: [number, number] = final_y_axis.range
355
- ? [
356
- final_y_axis.range[0] ?? auto_ranges.y[0],
357
- final_y_axis.range[1] ?? auto_ranges.y[1],
358
- ]
359
- : auto_ranges.y
360
- const new_y2: [number, number] = final_y2_axis.range
361
- ? [
362
- final_y2_axis.range[0] ?? auto_ranges.y2[0],
363
- final_y2_axis.range[1] ?? auto_ranges.y2[1],
364
- ]
365
- : auto_ranges.y2
366
-
367
- // Only update if the initial (data-driven) ranges changed, not when user pans
368
- // Comparing against initial preserves user's pan/zoom state
369
- const x_changed = new_x[0] !== ranges.initial.x[0] ||
370
- new_x[1] !== ranges.initial.x[1]
371
- const x2_changed = new_x2[0] !== ranges.initial.x2[0] ||
372
- new_x2[1] !== ranges.initial.x2[1]
373
- const y_changed = new_y[0] !== ranges.initial.y[0] ||
374
- new_y[1] !== ranges.initial.y[1]
375
- const y2_changed = new_y2[0] !== ranges.initial.y2[0] ||
376
- new_y2[1] !== ranges.initial.y2[1]
377
-
378
- if (x_changed) [ranges.initial.x, ranges.current.x] = [new_x, new_x]
379
- if (x2_changed) [ranges.initial.x2, ranges.current.x2] = [new_x2, new_x2]
380
- if (y_changed) [ranges.initial.y, ranges.current.y] = [new_y, new_y]
381
- if (y2_changed) [ranges.initial.y2, ranges.current.y2] = [new_y2, new_y2]
382
- })
383
-
384
- // Layout: dynamic padding based on tick label widths
385
- const default_padding = { t: 20, b: 60, l: 60, r: 20 }
386
- let pad = $derived(filter_padding(padding, default_padding))
387
-
388
- // Update padding based on tick label widths (untrack breaks circular dependency)
389
- $effect(() => {
390
- const current_ticks_x2 = untrack(() => ticks.x2)
391
- const current_ticks_y = untrack(() => ticks.y)
392
- const current_ticks_y2 = untrack(() => ticks.y2)
393
-
394
- const new_pad = width && height && current_ticks_y.length
395
- ? calc_auto_padding({
396
- padding,
397
- default_padding,
398
- x2_axis: { ...final_x2_axis, tick_values: current_ticks_x2 },
399
- y_axis: { ...final_y_axis, tick_values: current_ticks_y },
400
- y2_axis: { ...final_y2_axis, tick_values: current_ticks_y2 },
401
- })
402
- : filter_padding(padding, default_padding)
403
-
404
- // Add y2 axis label space (calc_auto_padding only accounts for tick labels)
405
- if (
406
- width && height && y2_series.length && current_ticks_y2.length &&
407
- final_y2_axis.label
408
- ) {
409
- const inside = final_y2_axis.tick?.label?.inside ?? false
410
- // When ticks are inside, they don't contribute to padding
411
- const tick_shift = inside ? 0 : (final_y2_axis.tick?.label?.shift?.x ?? 0) + 8
412
- const tick_width_contribution = inside ? 0 : tick_label_widths.y2_max
413
- const label_thickness = Math.round(12 * 1.2)
414
- new_pad.r = Math.max(
415
- new_pad.r,
416
- tick_width_contribution + LABEL_GAP_DEFAULT + tick_shift + label_thickness,
417
- )
418
- }
419
-
420
- // Add x2 axis label space (mirroring y2 logic for top padding)
421
- if (
422
- width && height && x2_series.length && current_ticks_x2.length &&
423
- final_x2_axis.label
424
- ) {
425
- const inside = final_x2_axis.tick?.label?.inside ?? false
426
- const tick_shift = inside
427
- ? 0
428
- : Math.abs(final_x2_axis.tick?.label?.shift?.y ?? 0) + 8
429
- const label_thickness = Math.round(12 * 1.2)
430
- new_pad.t = Math.max(
431
- new_pad.t,
432
- tick_shift + LABEL_GAP_DEFAULT + label_thickness,
433
- )
434
- }
435
-
436
- // Only update if padding actually changed
437
- if (
438
- pad.t !== new_pad.t || pad.b !== new_pad.b || pad.l !== new_pad.l ||
439
- pad.r !== new_pad.r
440
- ) pad = new_pad
441
- })
442
-
443
- // Scales and data
444
- let scales = $derived({
445
- x: create_scale(
446
- final_x_axis.scale_type ?? `linear`,
447
- ranges.current.x,
448
- [pad.l, width - pad.r],
449
- ),
450
- x2: create_scale(
451
- final_x2_axis.scale_type ?? `linear`,
452
- ranges.current.x2,
453
- [pad.l, width - pad.r],
454
- ),
455
- y: create_scale(
456
- final_y_axis.scale_type ?? `linear`,
457
- ranges.current.y,
458
- [height - pad.b, pad.t],
459
- ),
460
- y2: create_scale(
461
- final_y2_axis.scale_type ?? `linear`,
462
- ranges.current.y2,
463
- [height - pad.b, pad.t],
464
- ),
465
- })
466
-
467
- let histogram_data = $derived.by(() => {
468
- if (!selected_series.length || !width || !height) return []
469
- const hist_generator = bin()
470
- .domain([ranges.current.x[0], ranges.current.x[1]])
471
- .thresholds(bins)
472
- const x2_hist_generator = x2_series.length > 0
473
- ? bin().domain([ranges.current.x2[0], ranges.current.x2[1]]).thresholds(bins)
474
- : null
475
- return selected_series.map((series_data, series_idx) => {
476
- const use_x2 = series_data.x_axis === `x2`
477
- const active_hist = use_x2 && x2_hist_generator
478
- ? x2_hist_generator
479
- : hist_generator
480
- const bins_arr = active_hist(series_data.y)
481
- const use_y2 = series_data.y_axis === `y2`
482
- return {
483
- id: series_data.id ?? series_idx,
484
- series_idx,
485
- label: series_data.label || `Series ${series_idx + 1}`,
486
- color: selected_series.length === 1
487
- ? final_bar.color
488
- : extract_series_color(series_data),
489
- bins: bins_arr,
490
- max_count: max(bins_arr, (data) => data.length) || 0,
491
- x_axis: series_data.x_axis,
492
- y_axis: series_data.y_axis,
493
- x_scale: use_x2 ? scales.x2 : scales.x,
494
- y_scale: use_y2 ? scales.y2 : scales.y,
495
- }
496
- })
497
- })
498
-
499
- let ticks = $derived({
500
- x: width && height
501
- ? generate_ticks(
502
- ranges.current.x,
503
- final_x_axis.scale_type ?? `linear`,
504
- final_x_axis.ticks,
505
- scales.x,
506
- { default_count: 8 },
507
- )
508
- : [],
509
- x2: width && height && x2_series.length > 0
510
- ? generate_ticks(
511
- ranges.current.x2,
512
- final_x2_axis.scale_type ?? `linear`,
513
- final_x2_axis.ticks,
514
- scales.x2,
515
- { default_count: 8 },
516
- )
517
- : [],
518
- y: width && height
519
- ? generate_ticks(
520
- ranges.current.y,
521
- final_y_axis.scale_type ?? `linear`,
522
- final_y_axis.ticks,
523
- scales.y,
524
- { default_count: 6 },
525
- )
526
- : [],
527
- y2: width && height && y2_series.length > 0
528
- ? generate_ticks(
529
- ranges.current.y2,
530
- final_y2_axis.scale_type ?? `linear`,
531
- final_y2_axis.ticks,
532
- scales.y2,
533
- { default_count: 6 },
534
- )
535
- : [],
536
- })
537
-
538
- // Cache measured tick-label widths so expensive text measurement only runs
539
- // when tick values/format change, not on every template rerender.
540
- let tick_label_widths = $derived({
541
- x2_max: measure_max_tick_width(ticks.x2, final_x2_axis.format ?? ``),
542
- y_max: measure_max_tick_width(ticks.y, final_y_axis.format ?? ``),
543
- y2_max: measure_max_tick_width(ticks.y2, final_y2_axis.format ?? ``),
544
- })
545
-
546
- let legend_data = $derived(prepare_legend_data(series))
547
-
548
- // Collect histogram bar positions for legend placement
549
- let hist_points_for_placement = $derived.by(() => {
550
- if (!width || !height || !histogram_data.length) return []
551
-
552
- const points: { x: number; y: number }[] = []
553
-
554
- for (const { bins, x_scale, y_scale } of histogram_data) {
555
- for (const bin of bins) {
556
- if (bin.length > 0) {
557
- const bar_x = x_scale(((bin.x0 ?? 0) + (bin.x1 ?? 0)) / 2)
558
- const bar_y = y_scale(bin.length)
559
- if (isFinite(bar_x) && isFinite(bar_y)) {
560
- // Add multiple points for taller bars to increase their weight
561
- // Cap to prevent O(N·count/10) blow-ups for large counts
562
- const weight = Math.min(20, Math.ceil(bin.length / 10))
563
- for (let idx = 0; idx < weight; idx++) points.push({ x: bar_x, y: bar_y })
564
- }
565
- }
566
- }
567
- }
568
- return points
569
- })
570
-
571
- // Calculate best legend placement using continuous grid sampling
572
- let legend_placement = $derived.by(() => {
573
- const should_place = show_legend && legend != null && series.length > 1
574
- if (!should_place || !width || !height) return null
575
-
576
- const plot_width = width - pad.l - pad.r
577
- const plot_height = height - pad.t - pad.b
578
-
579
- // Use measured size if available, otherwise estimate
580
- const legend_size = legend_element
581
- ? { width: legend_element.offsetWidth, height: legend_element.offsetHeight }
582
- : { width: 120, height: 60 }
583
-
584
- const result = compute_element_placement({
585
- plot_bounds: { x: pad.l, y: pad.t, width: plot_width, height: plot_height },
586
- element_size: legend_size,
587
- axis_clearance: legend?.axis_clearance,
588
- exclude_rects: [],
589
- points: hist_points_for_placement,
590
- })
591
-
592
- return result
593
- })
594
-
595
- // Tweened legend coordinates for smooth animation - create once, update target via effect
596
- // untrack() explicitly captures initial tween config (intentional - config set once at mount)
597
- const tweened_legend_coords = new Tween(
598
- { x: 0, y: 0 },
599
- untrack(() => ({ duration: 400, ...(legend?.tween ?? {}) })),
600
- )
601
-
602
- // Update legend position with stability checks
603
- $effect(() => {
604
- if (!width || !height || !legend_placement) return
605
-
606
- // Track dimensions for resize detection
607
- const dims_changed = dim_tracker.has_changed(width, height)
608
- if (dims_changed) dim_tracker.update(width, height)
609
-
610
- // Only update if: resize occurred, OR (not hover-locked AND (responsive OR not yet initially placed))
611
- const is_responsive = legend?.responsive ?? false
612
- const should_update = dims_changed || (!legend_hover.is_locked.current &&
613
- (is_responsive || !has_initial_legend_placement))
614
-
615
- if (should_update) {
616
- tweened_legend_coords.set(
617
- { x: legend_placement.x, y: legend_placement.y },
618
- // Skip animation on initial placement to avoid jump from (0, 0)
619
- has_initial_legend_placement ? undefined : { duration: 0 },
620
- )
621
- // Only lock position after we have actual measured size
622
- if (legend_element) {
623
- has_initial_legend_placement = true
624
- }
625
- }
626
- })
627
-
628
- // Event handlers
629
- const handle_zoom = () => {
630
- if (!drag_state.start || !drag_state.current) return
631
- const start_x = scales.x.invert(drag_state.start.x)
632
- const end_x = scales.x.invert(drag_state.current.x)
633
- const start_x2 = scales.x2.invert(drag_state.start.x)
634
- const end_x2 = scales.x2.invert(drag_state.current.x)
635
- const start_y = scales.y.invert(drag_state.start.y)
636
- const end_y = scales.y.invert(drag_state.current.y)
637
- const start_y2 = scales.y2.invert(drag_state.start.y)
638
- const end_y2 = scales.y2.invert(drag_state.current.y)
639
-
640
- if (typeof start_x === `number` && typeof end_x === `number`) {
641
- const dx = Math.abs(drag_state.start.x - drag_state.current.x)
642
- const dy = Math.abs(drag_state.start.y - drag_state.current.y)
643
- if (dx > 5 && dy > 5) {
644
- // Update axis ranges to trigger reactivity and prevent effect from overriding
645
- x_axis = {
646
- ...x_axis,
647
- range: [Math.min(start_x, end_x), Math.max(start_x, end_x)],
648
- }
649
- if (x2_series.length > 0) {
650
- x2_axis = {
651
- ...x2_axis,
652
- range: [Math.min(start_x2, end_x2), Math.max(start_x2, end_x2)],
653
- }
654
- }
655
- y_axis = {
656
- ...y_axis,
657
- range: [Math.min(start_y, end_y), Math.max(start_y, end_y)],
658
- }
659
- y2_axis = {
660
- ...y2_axis,
661
- range: [Math.min(start_y2, end_y2), Math.max(start_y2, end_y2)],
662
- }
663
- }
664
- }
665
- }
666
-
667
- const on_window_mouse_move = (evt: MouseEvent) => {
668
- if (!drag_state.start || !drag_state.bounds) return
669
- drag_state.current = {
670
- x: evt.clientX - drag_state.bounds.left,
671
- y: evt.clientY - drag_state.bounds.top,
672
- }
673
- }
674
-
675
- const on_window_mouse_up = () => {
676
- handle_zoom()
677
- drag_state = { start: null, current: null, bounds: null }
678
- window.removeEventListener(`mousemove`, on_window_mouse_move)
679
- window.removeEventListener(`mouseup`, on_window_mouse_up)
680
- document.body.style.cursor = `default`
681
- }
682
-
683
- // Pan drag handlers
684
- const on_pan_move = (evt: MouseEvent) => {
685
- if (!pan_drag_state) return
686
- const dx = evt.clientX - pan_drag_state.start.x
687
- const dy = evt.clientY - pan_drag_state.start.y
688
-
689
- // Convert pixel delta to data delta (note: drag direction is inverted for natural pan feel)
690
- const plot_width = width - pad.l - pad.r
691
- const plot_height = height - pad.t - pad.b
692
- const sensitivity = pan?.drag_sensitivity ?? 1
693
-
694
- const x_delta = pixels_to_data_delta(
695
- -dx * sensitivity,
696
- pan_drag_state.initial_x_range,
697
- plot_width,
698
- )
699
- const x2_delta = pixels_to_data_delta(
700
- -dx * sensitivity,
701
- pan_drag_state.initial_x2_range,
702
- plot_width,
703
- )
704
- const y_delta = pixels_to_data_delta(
705
- dy * sensitivity,
706
- pan_drag_state.initial_y_range,
707
- plot_height,
708
- )
709
- const y2_delta = pixels_to_data_delta(
710
- dy * sensitivity,
711
- pan_drag_state.initial_y2_range,
712
- plot_height,
713
- )
714
-
715
- ranges.current.x = pan_range(pan_drag_state.initial_x_range, x_delta)
716
- ranges.current.x2 = pan_range(pan_drag_state.initial_x2_range, x2_delta)
717
- ranges.current.y = pan_range(pan_drag_state.initial_y_range, y_delta)
718
- ranges.current.y2 = pan_range(pan_drag_state.initial_y2_range, y2_delta)
719
- }
720
-
721
- const on_pan_end = () => {
722
- pan_drag_state = null
723
- document.body.style.cursor = ``
724
- window.removeEventListener(`mousemove`, on_pan_move)
725
- window.removeEventListener(`mouseup`, on_pan_end)
726
- }
727
-
728
- function handle_mouse_down(evt: MouseEvent) {
729
- const coords = get_relative_coords(evt)
730
- if (!coords || !svg_element) return
731
-
732
- // Check if pan is enabled and shift is held for pan mode
733
- const pan_enabled = pan?.enabled !== false
734
- if (pan_enabled && evt.shiftKey) {
735
- evt.preventDefault()
736
- pan_drag_state = {
737
- start: { x: evt.clientX, y: evt.clientY },
738
- initial_x_range: [...ranges.current.x] as [number, number],
739
- initial_x2_range: [...ranges.current.x2] as [number, number],
740
- initial_y_range: [...ranges.current.y] as [number, number],
741
- initial_y2_range: [...ranges.current.y2] as [number, number],
742
- }
743
- document.body.style.cursor = `grabbing`
744
- window.addEventListener(`mousemove`, on_pan_move)
745
- window.addEventListener(`mouseup`, on_pan_end)
746
- return
747
- }
748
-
749
- drag_state = {
750
- start: coords,
751
- current: coords,
752
- bounds: svg_element.getBoundingClientRect(),
753
- }
754
- window.addEventListener(`mousemove`, on_window_mouse_move)
755
- window.addEventListener(`mouseup`, on_window_mouse_up)
756
- evt.preventDefault()
757
- }
758
-
759
- // Wheel handler for pan (requires focus and shift)
760
- function handle_wheel(evt: WheelEvent) {
761
- const pan_enabled = pan?.enabled !== false
762
- // Only capture wheel when focused AND Shift is held
763
- // Use shift_held state (tracked via keydown/keyup) for compatibility with synthetic events
764
- if (!pan_enabled || !is_focused || !shift_held) return
765
-
766
- evt.preventDefault()
767
-
768
- // Clamp to at least 1 to avoid Infinity deltas when padding equals container size
769
- const plot_width = Math.max(1, width - pad.l - pad.r)
770
- const plot_height = Math.max(1, height - pad.t - pad.b)
771
- const sensitivity = pan?.wheel_sensitivity ?? 1
772
-
773
- // Determine pan direction based on wheel delta
774
- const x_delta = pixels_to_data_delta(
775
- evt.deltaX * sensitivity,
776
- ranges.current.x,
777
- plot_width,
778
- )
779
- const x2_delta = pixels_to_data_delta(
780
- evt.deltaX * sensitivity,
781
- ranges.current.x2,
782
- plot_width,
783
- )
784
- const y_delta = pixels_to_data_delta(
785
- evt.deltaY * sensitivity,
786
- ranges.current.y,
787
- plot_height,
788
- )
789
- const y2_delta = pixels_to_data_delta(
790
- evt.deltaY * sensitivity,
791
- ranges.current.y2,
792
- plot_height,
793
- )
794
-
795
- if (Math.abs(evt.deltaX) > Math.abs(evt.deltaY)) {
796
- ranges.current.x = pan_range(ranges.current.x, x_delta)
797
- ranges.current.x2 = pan_range(ranges.current.x2, x2_delta)
798
- } else {
799
- ranges.current.y = pan_range(ranges.current.y, y_delta)
800
- ranges.current.y2 = pan_range(ranges.current.y2, y2_delta)
801
- }
802
- }
803
-
804
- // Touch handlers for pinch-zoom and two-finger pan
805
- function handle_touch_start(evt: TouchEvent) {
806
- const touch_enabled = pan?.enabled !== false && pan?.touch_enabled !== false
807
- if (!touch_enabled || evt.touches.length !== 2) return
808
-
809
- evt.preventDefault()
810
- const touches = Array.from(evt.touches)
811
- touch_state = {
812
- start_touches: touches.map((touch) => ({ x: touch.clientX, y: touch.clientY })),
813
- initial_x_range: [...ranges.current.x] as [number, number],
814
- initial_x2_range: [...ranges.current.x2] as [number, number],
815
- initial_y_range: [...ranges.current.y] as [number, number],
816
- initial_y2_range: [...ranges.current.y2] as [number, number],
817
- }
818
- }
819
-
820
- function handle_touch_move(evt: TouchEvent) {
821
- if (!touch_state || evt.touches.length !== 2) return
822
- evt.preventDefault()
823
-
824
- const [t1, t2] = Array.from(evt.touches)
825
- const [s1, s2] = touch_state.start_touches
826
-
827
- // Calculate center movement for pan
828
- const start_center = { x: (s1.x + s2.x) / 2, y: (s1.y + s2.y) / 2 }
829
- const curr_center = {
830
- x: (t1.clientX + t2.clientX) / 2,
831
- y: (t1.clientY + t2.clientY) / 2,
832
- }
833
- const dx = curr_center.x - start_center.x
834
- const dy = curr_center.y - start_center.y
835
-
836
- // Calculate pinch scale (curr/start so spread = zoom out, pinch = zoom in)
837
- const start_dist = Math.hypot(s2.x - s1.x, s2.y - s1.y)
838
- // Guard against zero-distance pinch to avoid Infinity scale
839
- if (start_dist < Number.EPSILON) return
840
- const curr_dist = Math.hypot(t2.clientX - t1.clientX, t2.clientY - t1.clientY)
841
- const scale = curr_dist / start_dist
842
-
843
- // Clamp to at least 1 to avoid Infinity deltas when padding equals container size
844
- const plot_width = Math.max(1, width - pad.l - pad.r)
845
- const plot_height = Math.max(1, height - pad.t - pad.b)
846
-
847
- // If scale changed significantly, treat as pinch-zoom
848
- // Also guard against scale being too small to avoid division by zero
849
- if (Math.abs(scale - 1) > PINCH_ZOOM_THRESHOLD && scale > Number.EPSILON) {
850
- // Pinch zoom centered on gesture center
851
- // Divide by scale so spread (scale > 1) = smaller span (zoom in)
852
- const x_span = touch_state.initial_x_range[1] - touch_state.initial_x_range[0]
853
- const x2_span = touch_state.initial_x2_range[1] -
854
- touch_state.initial_x2_range[0]
855
- const y_span = touch_state.initial_y_range[1] - touch_state.initial_y_range[0]
856
- const y2_span = touch_state.initial_y2_range[1] -
857
- touch_state.initial_y2_range[0]
858
- const x_center =
859
- (touch_state.initial_x_range[0] + touch_state.initial_x_range[1]) / 2
860
- const x2_center =
861
- (touch_state.initial_x2_range[0] + touch_state.initial_x2_range[1]) / 2
862
- const y_center =
863
- (touch_state.initial_y_range[0] + touch_state.initial_y_range[1]) / 2
864
- const y2_center =
865
- (touch_state.initial_y2_range[0] + touch_state.initial_y2_range[1]) / 2
866
-
867
- ranges.current.x = [
868
- x_center - x_span / scale / 2,
869
- x_center + x_span / scale / 2,
870
- ]
871
- ranges.current.x2 = [
872
- x2_center - x2_span / scale / 2,
873
- x2_center + x2_span / scale / 2,
874
- ]
875
- ranges.current.y = [
876
- y_center - y_span / scale / 2,
877
- y_center + y_span / scale / 2,
878
- ]
879
- ranges.current.y2 = [
880
- y2_center - y2_span / scale / 2,
881
- y2_center + y2_span / scale / 2,
882
- ]
883
- } else {
884
- // Pan
885
- const x_delta = pixels_to_data_delta(
886
- -dx,
887
- touch_state.initial_x_range,
888
- plot_width,
889
- )
890
- const x2_delta = pixels_to_data_delta(
891
- -dx,
892
- touch_state.initial_x2_range,
893
- plot_width,
894
- )
895
- const y_delta = pixels_to_data_delta(
896
- dy,
897
- touch_state.initial_y_range,
898
- plot_height,
899
- )
900
- const y2_delta = pixels_to_data_delta(
901
- dy,
902
- touch_state.initial_y2_range,
903
- plot_height,
904
- )
905
- ranges.current.x = pan_range(touch_state.initial_x_range, x_delta)
906
- ranges.current.x2 = pan_range(touch_state.initial_x2_range, x2_delta)
907
- ranges.current.y = pan_range(touch_state.initial_y_range, y_delta)
908
- ranges.current.y2 = pan_range(touch_state.initial_y2_range, y2_delta)
909
- }
910
- }
911
-
912
- function handle_touch_end() {
913
- touch_state = null
914
- }
915
-
916
- function handle_double_click() {
917
- // Reset zoom to initial ranges (undo any pan/zoom)
918
- ranges.current.x = [...ranges.initial.x] as [number, number]
919
- ranges.current.x2 = [...ranges.initial.x2] as [number, number]
920
- ranges.current.y = [...ranges.initial.y] as [number, number]
921
- ranges.current.y2 = [...ranges.initial.y2] as [number, number]
922
- // Also reset axis props so future data changes recalculate auto ranges
923
- x_axis = { ...x_axis, range: [null, null] }
924
- x2_axis = { ...x2_axis, range: [null, null] }
925
- y_axis = { ...y_axis, range: [null, null] }
926
- y2_axis = { ...y2_axis, range: [null, null] }
927
- }
928
-
929
- function handle_mouse_move(
930
- evt: MouseEvent,
931
- value: number,
932
- count: number,
933
- property: string,
934
- active_y_axis: `y1` | `y2` = `y1`,
935
- series_idx: number = 0,
936
- active_x_axis: `x1` | `x2` = `x1`,
937
- ) {
938
- hovered = true
939
- hover_info = {
940
- value,
941
- count,
942
- property,
943
- active_y_axis,
944
- active_x_axis,
945
- x: value,
946
- y: count,
947
- series_idx,
948
- metadata: null,
949
- label: property,
950
- x_axis: active_x_axis === `x2` ? x2_axis : x_axis,
951
- x2_axis,
952
- y_axis: active_y_axis === `y2` ? y2_axis : y_axis,
953
- y2_axis,
954
- }
955
- change({ value, count, property })
956
- on_bar_hover?.({ value, count, property, event: evt })
957
- }
958
-
959
- function toggle_series_visibility(series_idx: number) {
960
- if (series_idx >= 0 && series_idx < series.length) {
961
- // Toggle series visibility
962
- series = series.map((srs: DataSeries, idx: number) => {
963
- if (idx === series_idx) return { ...srs, visible: !(srs.visible ?? true) }
964
- return srs
965
- })
966
- ;(legend?.on_toggle || on_series_toggle)(series_idx)
967
- }
968
- }
969
-
970
- // Set theme-aware background when entering fullscreen
971
- $effect(() => {
972
- set_fullscreen_bg(wrapper, fullscreen, `--histogram-fullscreen-bg`)
973
- })
974
-
975
- // State accessors for shared axis change handler
976
- const axis_state: AxisChangeState<DataSeries> = {
977
- get_axis: (axis) => {
978
- if (axis === `x`) return x_axis
979
- if (axis === `x2`) return x2_axis
980
- if (axis === `y`) return y_axis
981
- return y2_axis
982
- },
983
- set_axis: (axis, config) => {
984
- // Spread into existing state to preserve merged type structure
985
- if (axis === `x`) x_axis = { ...x_axis, ...config }
986
- else if (axis === `x2`) x2_axis = { ...x2_axis, ...config }
987
- else if (axis === `y`) y_axis = { ...y_axis, ...config }
988
- else y2_axis = { ...y2_axis, ...config }
989
- },
990
- get_series: () => series,
991
- set_series: (new_series) => (series = new_series),
992
- get_loading: () => axis_loading,
993
- set_loading: (axis) => (axis_loading = axis),
994
- }
995
-
996
- // Create shared handler bound to this component's state
997
- // Using $derived so handler updates when callback props change
998
- const handle_axis_change = $derived(create_axis_change_handler(
999
- axis_state,
1000
- data_loader,
1001
- on_axis_change,
1002
- on_error,
1003
- ))
1004
-
1005
- let auto_load_attempted = false // prevent infinite retries on failure
1006
-
1007
- // Auto-load data if series is empty but options exist (runs once)
1008
- $effect(() => {
1009
- if (series.length === 0 && data_loader && !auto_load_attempted) {
1010
- // Check x-axis first, then y-axis
1011
- if (x_axis.options?.length) {
1012
- auto_load_attempted = true
1013
- const first_key = x_axis.selected_key ?? x_axis.options[0].key
1014
- handle_axis_change(`x`, first_key).catch(() => {})
1015
- } else if (y_axis.options?.length) {
1016
- auto_load_attempted = true
1017
- const first_key = y_axis.selected_key ?? y_axis.options[0].key
1018
- handle_axis_change(`y`, first_key).catch(() => {})
1019
- }
1020
- }
1021
- })
1022
- </script>
1023
-
1024
- {#snippet ref_lines_layer(lines: IndexedRefLine[])}
1025
- {#each lines as line (line.id ?? line.idx)}
1026
- <ReferenceLine
1027
- ref_line={line}
1028
- line_idx={line.idx}
1029
- x_min={line.x_axis === `x2` ? ranges.current.x2[0] : ranges.current.x[0]}
1030
- x_max={line.x_axis === `x2` ? ranges.current.x2[1] : ranges.current.x[1]}
1031
- y_min={line.y_axis === `y2` ? ranges.current.y2[0] : ranges.current.y[0]}
1032
- y_max={line.y_axis === `y2` ? ranges.current.y2[1] : ranges.current.y[1]}
1033
- x_scale={scales.x}
1034
- x2_scale={scales.x2}
1035
- y_scale={scales.y}
1036
- y2_scale={scales.y2}
1037
- {clip_path_id}
1038
- hovered_line_idx={hovered_ref_line_idx}
1039
- on_click={(event: RefLineEvent) => {
1040
- line.on_click?.(event)
1041
- on_ref_line_click?.(event)
1042
- }}
1043
- on_hover={(event: RefLineEvent | null) => {
1044
- hovered_ref_line_idx = event?.line_idx ?? null
1045
- line.on_hover?.(event)
1046
- on_ref_line_hover?.(event)
1047
- }}
1048
- />
1049
- {/each}
1050
- {/snippet}
1051
-
1052
- <svelte:window
1053
- onkeydown={(evt) => {
1054
- if (evt.key === `Escape` && fullscreen) {
1055
- evt.preventDefault()
1056
- fullscreen = false
1057
- }
1058
- if (evt.key === `Shift`) shift_held = true
1059
- }}
1060
- onkeyup={(evt) => {
1061
- if (evt.key === `Shift`) shift_held = false
1062
- }}
1063
- />
1064
-
1065
- <div
1066
- class="histogram"
1067
- bind:this={wrapper}
1068
- bind:clientWidth={width}
1069
- bind:clientHeight={height}
1070
- {...rest}
1071
- class:fullscreen
1072
- >
1073
- {#if width && height}
1074
- <div class="header-controls">
1075
- {@render header_controls?.({ height, width, fullscreen })}
1076
- {#if fullscreen_toggle}
1077
- <FullscreenToggle bind:fullscreen />
1078
- {/if}
1079
- </div>
1080
- {/if}
1081
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
1082
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
1083
- <svg
1084
- bind:this={svg_element}
1085
- role="application"
1086
- aria-label={rest[`aria-label`] ??
1087
- ([final_x_axis.label, final_y_axis.label].filter(Boolean).join(` vs `) ||
1088
- `Histogram`)}
1089
- tabindex="0"
1090
- onfocusin={() => (is_focused = true)}
1091
- onfocusout={() => (is_focused = false)}
1092
- onmouseenter={() => (hovered = true)}
1093
- onmousedown={handle_mouse_down}
1094
- onmouseleave={() => {
1095
- hovered = false
1096
- hover_info = null
1097
- on_bar_hover?.(null)
1098
- }}
1099
- ondblclick={handle_double_click}
1100
- onwheel={handle_wheel}
1101
- ontouchstart={handle_touch_start}
1102
- ontouchmove={handle_touch_move}
1103
- ontouchend={handle_touch_end}
1104
- style:cursor={pan_drag_state
1105
- ? `grabbing`
1106
- : shift_held && pan?.enabled !== false
1107
- ? `grab`
1108
- : `crosshair`}
1109
- onkeydown={(event) => {
1110
- if (event.key === `Escape` && drag_state.start) {
1111
- drag_state = { start: null, current: null, bounds: null }
1112
- }
1113
- if ([`Enter`, ` `].includes(event.key)) {
1114
- event.preventDefault()
1115
- handle_double_click()
1116
- }
1117
- }}
1118
- >
1119
- <!-- Define clip path for chart area -->
1120
- <defs>
1121
- <clipPath id={clip_path_id}>
1122
- <rect
1123
- x={pad.l}
1124
- y={pad.t}
1125
- width={width - pad.l - pad.r}
1126
- height={height - pad.t - pad.b}
1127
- />
1128
- </clipPath>
1129
- </defs>
1130
-
1131
- <!-- Reference lines: below grid (must render first to appear behind grid) -->
1132
- {@render ref_lines_layer(ref_lines_by_z.below_grid)}
1133
-
1134
- <ZoomRect start={drag_state.start} current={drag_state.current} />
1135
-
1136
- <ZeroLines
1137
- {display}
1138
- x_scale_fn={scales.x}
1139
- x2_scale_fn={scales.x2}
1140
- y_scale_fn={scales.y}
1141
- y2_scale_fn={scales.y2}
1142
- x_range={ranges.current.x}
1143
- x2_range={ranges.current.x2}
1144
- y_range={ranges.current.y}
1145
- y2_range={ranges.current.y2}
1146
- x_scale_type={final_x_axis.scale_type}
1147
- x2_scale_type={final_x2_axis.scale_type}
1148
- y_scale_type={final_y_axis.scale_type}
1149
- y2_scale_type={final_y2_axis.scale_type}
1150
- has_x2={x2_series.length > 0}
1151
- has_y2={y2_series.length > 0}
1152
- {width}
1153
- {height}
1154
- {pad}
1155
- />
1156
-
1157
- <!-- Reference lines: below lines -->
1158
- {@render ref_lines_layer(ref_lines_by_z.below_lines)}
1159
-
1160
- <!-- Reference lines: below points -->
1161
- {@render ref_lines_layer(ref_lines_by_z.below_points)}
1162
-
1163
- <!-- X-axis -->
1164
- <g class="x-axis">
1165
- <line
1166
- x1={pad.l}
1167
- x2={width - pad.r}
1168
- y1={height - pad.b}
1169
- y2={height - pad.b}
1170
- stroke={final_x_axis.color || `var(--border-color, gray)`}
1171
- stroke-width="1"
1172
- />
1173
- {#each ticks.x as tick (tick)}
1174
- {@const tick_x = scales.x(tick as number)}
1175
- {@const custom_label = get_tick_label(tick as number, final_x_axis.ticks)}
1176
- {@const inside = final_x_axis.tick?.label?.inside ?? false}
1177
- {@const shift_x = final_x_axis.tick?.label?.shift?.x ?? 0}
1178
- {@const shift_y = final_x_axis.tick?.label?.shift?.y ?? 0}
1179
- {@const base_y = inside ? -8 : 8}
1180
- {@const text_y = base_y + shift_y}
1181
- {@const dominant_baseline = inside ? `auto` : `hanging`}
1182
- <g class="tick" transform="translate({tick_x}, {height - pad.b})">
1183
- {#if display.x_grid}
1184
- <line
1185
- y1={-(height - pad.b - pad.t)}
1186
- y2="0"
1187
- stroke="var(--border-color, gray)"
1188
- stroke-dasharray="4"
1189
- stroke-width="1"
1190
- {...final_x_axis.grid_style ?? {}}
1191
- />
1192
- {/if}
1193
- <line
1194
- y1="0"
1195
- y2={inside ? -5 : 5}
1196
- stroke={final_x_axis.color || `var(--border-color, gray)`}
1197
- stroke-width="1"
1198
- />
1199
- <text
1200
- x={shift_x}
1201
- y={text_y}
1202
- text-anchor="middle"
1203
- dominant-baseline={dominant_baseline}
1204
- fill={final_x_axis.color || `var(--text-color)`}
1205
- >
1206
- {custom_label ?? format_value(tick, final_x_axis.format)}
1207
- </text>
1208
- </g>
1209
- {/each}
1210
- {#if final_x_axis.label || x_axis.options?.length}
1211
- {@const { label_shift, label = ``, options, selected_key, color } = final_x_axis}
1212
- <AxisLabel
1213
- x={(pad.l + width - pad.r) / 2 + (label_shift?.x ?? 0)}
1214
- y={height - 10 + (label_shift?.y ?? 0)}
1215
- {label}
1216
- {options}
1217
- {selected_key}
1218
- loading={axis_loading === `x`}
1219
- axis_type="x"
1220
- {color}
1221
- on_select={(key) => handle_axis_change(`x`, key)}
1222
- />
1223
- {/if}
1224
- </g>
1225
-
1226
- <!-- X2-axis (Top) -->
1227
- {#if x2_series.length > 0}
1228
- <g class="x2-axis">
1229
- <line
1230
- x1={pad.l}
1231
- x2={width - pad.r}
1232
- y1={pad.t}
1233
- y2={pad.t}
1234
- stroke={final_x2_axis.color || `var(--border-color, gray)`}
1235
- stroke-width="1"
1236
- />
1237
- {#each ticks.x2 as tick (tick)}
1238
- {@const tick_x = scales.x2(tick as number)}
1239
- {@const custom_label = get_tick_label(tick as number, final_x2_axis.ticks)}
1240
- {@const inside = final_x2_axis.tick?.label?.inside ?? false}
1241
- {@const shift_x = final_x2_axis.tick?.label?.shift?.x ?? 0}
1242
- {@const shift_y = final_x2_axis.tick?.label?.shift?.y ?? 0}
1243
- {@const base_y = inside ? 8 : -20}
1244
- {@const text_y = base_y + shift_y}
1245
- {@const dominant_baseline = inside ? `hanging` : `auto`}
1246
- <g class="tick" transform="translate({tick_x}, {pad.t})">
1247
- {#if display.x2_grid}
1248
- <line
1249
- y1="0"
1250
- y2={height - pad.b - pad.t}
1251
- stroke="var(--border-color, gray)"
1252
- stroke-dasharray="4"
1253
- stroke-width="1"
1254
- {...final_x2_axis.grid_style ?? {}}
1255
- />
1256
- {/if}
1257
- <line
1258
- y1={inside ? 0 : -5}
1259
- y2={inside ? 5 : 0}
1260
- stroke={final_x2_axis.color || `var(--border-color, gray)`}
1261
- stroke-width="1"
1262
- />
1263
- <text
1264
- x={shift_x}
1265
- y={text_y}
1266
- text-anchor="middle"
1267
- dominant-baseline={dominant_baseline}
1268
- fill={final_x2_axis.color || `var(--text-color)`}
1269
- >
1270
- {custom_label ?? format_value(tick, final_x2_axis.format)}
1271
- </text>
1272
- </g>
1273
- {/each}
1274
- {#if final_x2_axis.label || x2_axis.options?.length}
1275
- {@const { label_shift, label = ``, options, selected_key, color } =
1276
- final_x2_axis}
1277
- <AxisLabel
1278
- x={(pad.l + width - pad.r) / 2 + (label_shift?.x ?? 0)}
1279
- y={Math.max(12, pad.t - (label_shift?.y ?? 40))}
1280
- {label}
1281
- {options}
1282
- {selected_key}
1283
- loading={axis_loading === `x2`}
1284
- axis_type="x2"
1285
- {color}
1286
- on_select={(key) => handle_axis_change(`x2`, key)}
1287
- />
1288
- {/if}
1289
- </g>
1290
- {/if}
1291
-
1292
- <!-- Y-axis -->
1293
- <g class="y-axis">
1294
- <line
1295
- x1={pad.l}
1296
- x2={pad.l}
1297
- y1={pad.t}
1298
- y2={height - pad.b}
1299
- stroke={final_y_axis.color || `var(--border-color, gray)`}
1300
- stroke-width="1"
1301
- />
1302
- {#each ticks.y as tick (tick)}
1303
- {@const tick_y = scales.y(tick as number)}
1304
- {@const custom_label = get_tick_label(tick as number, final_y_axis.ticks)}
1305
- {@const inside = final_y_axis.tick?.label?.inside ?? false}
1306
- {@const shift_x = final_y_axis.tick?.label?.shift?.x ?? 0}
1307
- {@const shift_y = final_y_axis.tick?.label?.shift?.y ?? 0}
1308
- {@const base_x = inside ? 8 : -10}
1309
- {@const text_x = base_x + shift_x}
1310
- {@const text_anchor = inside ? `start` : `end`}
1311
- <g class="tick" transform="translate({pad.l}, {tick_y})">
1312
- {#if display.y_grid}
1313
- <line
1314
- x1="0"
1315
- x2={width - pad.l - pad.r}
1316
- stroke="var(--border-color, gray)"
1317
- stroke-dasharray="4"
1318
- stroke-width="1"
1319
- {...final_y_axis.grid_style ?? {}}
1320
- />
1321
- {/if}
1322
- <line
1323
- x1={inside ? 0 : -5}
1324
- x2={inside ? 5 : 0}
1325
- stroke={final_y_axis.color || `var(--border-color, gray)`}
1326
- stroke-width="1"
1327
- />
1328
- <text
1329
- x={text_x}
1330
- y={shift_y}
1331
- text-anchor={text_anchor}
1332
- dominant-baseline="central"
1333
- fill={final_y_axis.color || `var(--text-color)`}
1334
- >
1335
- {custom_label ?? format_value(tick, final_y_axis.format)}
1336
- </text>
1337
- </g>
1338
- {/each}
1339
- {#if final_y_axis.label || y_axis.options?.length}
1340
- {@const { label_shift, label = ``, options, selected_key, color, tick } =
1341
- final_y_axis}
1342
- {@const y_inside = tick?.label?.inside ?? false}
1343
- <AxisLabel
1344
- x={Math.max(
1345
- 12,
1346
- pad.l - (y_inside ? 0 : tick_label_widths.y_max) - LABEL_GAP_DEFAULT,
1347
- ) +
1348
- (label_shift?.x ?? 0)}
1349
- y={pad.t + (height - pad.t - pad.b) / 2 + (label_shift?.y ?? 0)}
1350
- rotate
1351
- {label}
1352
- {options}
1353
- {selected_key}
1354
- loading={axis_loading === `y`}
1355
- axis_type="y"
1356
- {color}
1357
- on_select={(key) => handle_axis_change(`y`, key)}
1358
- />
1359
- {/if}
1360
- </g>
1361
-
1362
- <!-- Y2-axis (Right) -->
1363
- {#if y2_series.length > 0}
1364
- <g class="y2-axis">
1365
- <line
1366
- x1={width - pad.r}
1367
- x2={width - pad.r}
1368
- y1={pad.t}
1369
- y2={height - pad.b}
1370
- stroke={final_y2_axis.color || `var(--border-color, gray)`}
1371
- stroke-width="1"
1372
- />
1373
- {#each ticks.y2 as tick (tick)}
1374
- {@const tick_y = scales.y2(tick as number)}
1375
- {@const custom_label = get_tick_label(tick as number, final_y2_axis.ticks)}
1376
- {@const inside = final_y2_axis.tick?.label?.inside ?? false}
1377
- {@const base_x = inside ? -8 : 8}
1378
- {@const shift_x = (final_y2_axis.tick?.label?.shift?.x ?? 0) + base_x}
1379
- {@const shift_y = final_y2_axis.tick?.label?.shift?.y ?? 0}
1380
- {@const text_anchor = inside ? `end` : `start`}
1381
- <g class="tick" transform="translate({width - pad.r}, {tick_y})">
1382
- {#if display.y2_grid}
1383
- <line
1384
- x1={-(width - pad.l - pad.r)}
1385
- x2="0"
1386
- stroke="var(--border-color, gray)"
1387
- stroke-dasharray="4"
1388
- stroke-width="1"
1389
- {...final_y2_axis.grid_style ?? {}}
1390
- />
1391
- {/if}
1392
- <line
1393
- x1={inside ? -5 : 0}
1394
- x2={inside ? 0 : 5}
1395
- stroke={final_y2_axis.color || `var(--border-color, gray)`}
1396
- stroke-width="1"
1397
- />
1398
- <text
1399
- x={shift_x}
1400
- y={shift_y}
1401
- text-anchor={text_anchor}
1402
- dominant-baseline="central"
1403
- fill={final_y2_axis.color || `var(--text-color)`}
1404
- >
1405
- {custom_label ?? format_value(tick, final_y2_axis.format)}
1406
- </text>
1407
- </g>
1408
- {/each}
1409
- {#if final_y2_axis.label || y2_axis.options?.length}
1410
- {@const { label_shift, label = ``, options, selected_key, color, tick } =
1411
- final_y2_axis}
1412
- {@const inside = tick?.label?.inside ?? false}
1413
- {@const tick_shift = inside ? 0 : (tick?.label?.shift?.x ?? 0) + 8}
1414
- {@const tick_width_contribution = inside ? 0 : tick_label_widths.y2_max}
1415
- <AxisLabel
1416
- x={width - pad.r + tick_shift + tick_width_contribution +
1417
- LABEL_GAP_DEFAULT + (label_shift?.x ?? 0)}
1418
- y={pad.t + (height - pad.t - pad.b) / 2 + (label_shift?.y ?? 0)}
1419
- rotate
1420
- {label}
1421
- {options}
1422
- {selected_key}
1423
- loading={axis_loading === `y2`}
1424
- axis_type="y2"
1425
- {color}
1426
- on_select={(key) => handle_axis_change(`y2`, key)}
1427
- />
1428
- {/if}
1429
- </g>
1430
- {/if}
1431
-
1432
- <!-- Histogram bars (rendered after axes so bars appear above grid lines) -->
1433
- {#each histogram_data as
1434
- { id, bins, color, label, x_scale, y_scale, x_axis: srs_x_axis, y_axis },
1435
- series_idx
1436
- (id ?? series_idx)
1437
- }
1438
- <g class="histogram-series" data-series-idx={series_idx}>
1439
- {#each bins as bin, bin_idx (bin_idx)}
1440
- {@const bar_x = x_scale(bin.x0!)}
1441
- {@const bar_width = Math.max(1, Math.abs(x_scale(bin.x1!) - bar_x))}
1442
- {@const bar_height = Math.max(0, (height - pad.b) - y_scale(bin.length))}
1443
- {@const bar_y = y_scale(bin.length)}
1444
- {@const value = (bin.x0! + bin.x1!) / 2}
1445
- {#if bar_height > 0}
1446
- <path
1447
- d={bar_path(
1448
- bar_x,
1449
- bar_y,
1450
- bar_width,
1451
- bar_height,
1452
- Math.min(final_bar.border_radius ?? 0, bar_width / 2, bar_height / 2),
1453
- )}
1454
- fill={color}
1455
- opacity={final_bar.opacity}
1456
- stroke={final_bar.stroke_color}
1457
- stroke-opacity={final_bar.stroke_opacity}
1458
- stroke-width={final_bar.stroke_width}
1459
- role="button"
1460
- tabindex="0"
1461
- onmousemove={(evt) =>
1462
- handle_mouse_move(
1463
- evt,
1464
- value,
1465
- bin.length,
1466
- label,
1467
- (y_axis ?? `y1`) as `y1` | `y2`,
1468
- series_idx,
1469
- (srs_x_axis ?? `x1`) as `x1` | `x2`,
1470
- )}
1471
- onmouseleave={() => {
1472
- hover_info = null
1473
- change(null)
1474
- on_bar_hover?.(null)
1475
- }}
1476
- onclick={(event) =>
1477
- on_bar_click?.({ value, count: bin.length, property: label, event })}
1478
- onkeydown={(event: KeyboardEvent) => {
1479
- if ([`Enter`, ` `].includes(event.key)) {
1480
- event.preventDefault()
1481
- on_bar_click?.({ value, count: bin.length, property: label, event })
1482
- }
1483
- }}
1484
- style:cursor={on_bar_click ? `pointer` : undefined}
1485
- />
1486
- {/if}
1487
- {/each}
1488
- </g>
1489
- {/each}
1490
-
1491
- <!-- Reference lines: above all -->
1492
- {@render ref_lines_layer(ref_lines_by_z.above_all)}
1493
- </svg>
1494
-
1495
- <!-- Tooltip (outside SVG for proper HTML rendering) -->
1496
- {#if hover_info}
1497
- {@const { value, count, property, active_y_axis, active_x_axis } = hover_info}
1498
- {@const tooltip_x = (active_x_axis === `x2` ? scales.x2 : scales.x)(value)}
1499
- {@const tooltip_y = (active_y_axis === `y2` ? scales.y2 : scales.y)(count)}
1500
- {@const tooltip_pos = constrain_tooltip_position(
1501
- tooltip_x,
1502
- tooltip_y,
1503
- tooltip_el?.offsetWidth ?? 120,
1504
- tooltip_el?.offsetHeight ?? (mode === `overlay` ? 60 : 40),
1505
- width,
1506
- height,
1507
- { offset_x: 5, offset_y: -10 },
1508
- )}
1509
- <PlotTooltip
1510
- x={tooltip_pos.x}
1511
- y={tooltip_pos.y}
1512
- offset={{ x: 0, y: 0 }}
1513
- bind:wrapper={tooltip_el}
1514
- >
1515
- {#if tooltip}
1516
- {@render tooltip({ ...hover_info, fullscreen })}
1517
- {:else}
1518
- <div>Value: {format_value(value, hover_info.x_axis.format || `.3~s`)}</div>
1519
- <div>Count: {format_value(count, hover_info.y_axis.format || `.3~s`)}</div>
1520
- {#if mode === `overlay`}<div>{property}</div>{/if}
1521
- {/if}
1522
- </PlotTooltip>
1523
- {/if}
1524
-
1525
- {#if show_controls}
1526
- <HistogramControls
1527
- toggle_props={{
1528
- ...controls_toggle_props,
1529
- style: `--ctrl-btn-right: var(--fullscreen-btn-offset, 30px); ${
1530
- controls_toggle_props?.style ?? ``
1531
- }`,
1532
- }}
1533
- pane_props={controls_pane_props}
1534
- bind:show_controls
1535
- bind:controls_open
1536
- bind:bins
1537
- bind:mode
1538
- bind:show_legend
1539
- bind:selected_property
1540
- bind:display
1541
- bind:bar
1542
- bind:x_axis
1543
- bind:x2_axis
1544
- bind:y_axis
1545
- bind:y2_axis
1546
- auto_x_range={auto_ranges.x}
1547
- auto_x2_range={auto_ranges.x2}
1548
- auto_y_range={auto_ranges.y}
1549
- auto_y2_range={auto_ranges.y2}
1550
- {series}
1551
- has_x2_points={x2_series.length > 0}
1552
- has_y2_points={y2_series.length > 0}
1553
- children={controls_extra}
1554
- />
1555
- {/if}
1556
-
1557
- {#if show_legend && legend != null && series.length > 1}
1558
- <PlotLegend
1559
- bind:root_element={legend_element}
1560
- {...legend}
1561
- series_data={legend_data}
1562
- on_toggle={legend?.on_toggle || toggle_series_visibility}
1563
- on_hover_change={legend_hover.set_locked}
1564
- style={`
1565
- position: absolute;
1566
- left: ${legend_placement ? tweened_legend_coords.current.x : pad.l + 10}px;
1567
- top: ${legend_placement ? tweened_legend_coords.current.y : pad.t + 10}px;
1568
- pointer-events: auto;
1569
- ${legend?.style || ``}
1570
- `}
1571
- />
1572
- {/if}
1573
-
1574
- <!-- User-provided children (e.g. for custom absolutely-positioned overlays) -->
1575
- {@render children?.({ height, width, fullscreen })}
1576
- </div>
1577
-
1578
- <style>
1579
- .histogram {
1580
- position: relative;
1581
- width: var(--histogram-width, 100%);
1582
- height: var(--histogram-height, auto);
1583
- min-height: var(--histogram-min-height, 300px);
1584
- container-type: size; /* enable cqh for panes if explicit height is set */
1585
- z-index: var(--histogram-z-index, auto);
1586
- flex: var(--histogram-flex, 1);
1587
- display: var(--histogram-display, flex);
1588
- flex-direction: column;
1589
- background: var(--histogram-bg, var(--plot-bg));
1590
- border-radius: var(--histogram-border-radius, var(--border-radius, 3pt));
1591
- }
1592
- .histogram.fullscreen {
1593
- position: fixed;
1594
- top: 0;
1595
- left: 0;
1596
- width: 100vw !important;
1597
- height: 100vh !important;
1598
- /* Must be higher than Structure.svelte's --struct-buttons-z-index (100000000) */
1599
- z-index: var(--histogram-fullscreen-z-index, 100000001);
1600
- margin: 0;
1601
- border-radius: 0;
1602
- background: var(--histogram-fullscreen-bg, var(--histogram-bg, var(--plot-bg)));
1603
- max-height: none !important;
1604
- overflow: hidden;
1605
- /* Add padding to prevent titles from being cropped at top */
1606
- padding-top: var(--plot-fullscreen-padding-top, 2em);
1607
- box-sizing: border-box;
1608
- }
1609
- .header-controls {
1610
- position: absolute;
1611
- top: var(--ctrl-btn-top, 5pt);
1612
- right: var(--fullscreen-btn-right, 4px);
1613
- z-index: var(--fullscreen-btn-z-index, 10);
1614
- display: flex;
1615
- align-items: center;
1616
- gap: 8px;
1617
- }
1618
- .header-controls :global(.fullscreen-toggle) {
1619
- position: static; /* Override absolute positioning since container handles it */
1620
- opacity: 1; /* Always visible when inside header-controls, container controls visibility */
1621
- }
1622
- /* Hide controls and fullscreen toggles by default, show on hover */
1623
- .histogram :global(.pane-toggle),
1624
- .histogram .header-controls {
1625
- opacity: 0;
1626
- transition: opacity 0.2s, background-color 0.2s;
1627
- }
1628
- .histogram:hover :global(.pane-toggle),
1629
- .histogram:hover .header-controls,
1630
- .histogram :global(.pane-toggle:focus-visible),
1631
- .histogram :global(.pane-toggle[aria-expanded='true']),
1632
- .histogram .header-controls:focus-within {
1633
- opacity: 1;
1634
- }
1635
- svg {
1636
- width: var(--histogram-svg-width, 100%);
1637
- height: var(--histogram-svg-height, 100%);
1638
- max-height: var(--histogram-svg-max-height, 100%);
1639
- flex: var(--histogram-svg-flex, 1);
1640
- overflow: var(--histogram-svg-overflow, visible);
1641
- fill: var(--text-color);
1642
- font-weight: var(--histogram-font-weight);
1643
- font-size: var(--histogram-font-size);
1644
- }
1645
- g:is(.x-axis, .x2-axis, .y-axis, .y2-axis) .tick text {
1646
- font-size: var(--tick-font-size, 0.8em); /* shrink tick labels */
1647
- }
1648
- .histogram-series path {
1649
- transition: opacity 0.2s ease;
1650
- }
1651
- .histogram-series path:hover {
1652
- opacity: 1 !important;
1653
- }
1654
- </style>