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