matterviz 0.3.6 → 0.4.0

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