matterviz 0.4.0 → 0.4.2

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 (527) hide show
  1. package/dist/EmptyState.svelte +10 -4
  2. package/dist/FilePicker.svelte +12 -14
  3. package/dist/Icon.svelte +7 -4
  4. package/dist/MillerIndexInput.svelte +2 -2
  5. package/dist/app.css +53 -0
  6. package/dist/brillouin/BrillouinZone.svelte +132 -219
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +9 -20
  8. package/dist/brillouin/BrillouinZoneControls.svelte +3 -6
  9. package/dist/brillouin/BrillouinZoneExportPane.svelte +47 -96
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  11. package/dist/brillouin/BrillouinZoneInfoPane.svelte +15 -42
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte.d.ts +2 -3
  13. package/dist/brillouin/BrillouinZoneScene.svelte +63 -230
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +3 -23
  15. package/dist/brillouin/ReciprocalVectors.svelte +39 -0
  16. package/dist/brillouin/ReciprocalVectors.svelte.d.ts +9 -0
  17. package/dist/brillouin/compute.d.ts +2 -0
  18. package/dist/brillouin/compute.js +80 -77
  19. package/dist/brillouin/geometry.d.ts +8 -0
  20. package/dist/brillouin/geometry.js +57 -0
  21. package/dist/brillouin/index.d.ts +2 -0
  22. package/dist/brillouin/index.js +2 -0
  23. package/dist/brillouin/types.d.ts +2 -2
  24. package/dist/chempot-diagram/ChemPotDiagram.svelte +33 -38
  25. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +1 -1
  26. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +143 -246
  27. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +4 -1
  28. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +652 -976
  29. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +7 -1
  30. package/dist/chempot-diagram/async-compute.svelte.js +1 -1
  31. package/dist/chempot-diagram/color.d.ts +3 -6
  32. package/dist/chempot-diagram/color.js +5 -5
  33. package/dist/chempot-diagram/compute.d.ts +3 -3
  34. package/dist/chempot-diagram/compute.js +3 -1
  35. package/dist/chempot-diagram/controls-state.svelte.d.ts +10 -0
  36. package/dist/chempot-diagram/controls-state.svelte.js +42 -0
  37. package/dist/chempot-diagram/export.d.ts +47 -0
  38. package/dist/chempot-diagram/export.js +133 -0
  39. package/dist/chempot-diagram/index.d.ts +1 -0
  40. package/dist/chempot-diagram/index.js +1 -0
  41. package/dist/chempot-diagram/pointer.d.ts +0 -10
  42. package/dist/chempot-diagram/pointer.js +4 -4
  43. package/dist/chempot-diagram/types.d.ts +3 -3
  44. package/dist/colors/index.d.ts +0 -4
  45. package/dist/colors/index.js +21 -22
  46. package/dist/composition/BarChart.svelte +37 -31
  47. package/dist/composition/BubbleChart.svelte +17 -17
  48. package/dist/composition/Composition.svelte +7 -11
  49. package/dist/composition/Formula.svelte +18 -25
  50. package/dist/composition/FormulaFilter.svelte +96 -98
  51. package/dist/composition/PieChart.svelte +60 -46
  52. package/dist/composition/chem-sys.js +3 -2
  53. package/dist/composition/format.js +4 -3
  54. package/dist/composition/index.d.ts +2 -0
  55. package/dist/composition/index.js +14 -0
  56. package/dist/composition/parse.d.ts +2 -3
  57. package/dist/composition/parse.js +27 -28
  58. package/dist/constants.js +11 -9
  59. package/dist/controls.d.ts +1 -0
  60. package/dist/controls.js +0 -1
  61. package/dist/convex-hull/ConvexHull.svelte +20 -25
  62. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -4
  63. package/dist/convex-hull/ConvexHull2D.svelte +176 -256
  64. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  65. package/dist/convex-hull/ConvexHull3D.svelte +269 -804
  66. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  67. package/dist/convex-hull/ConvexHull4D.svelte +236 -755
  68. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  69. package/dist/convex-hull/ConvexHullChrome.svelte +264 -0
  70. package/dist/convex-hull/ConvexHullChrome.svelte.d.ts +30 -0
  71. package/dist/convex-hull/ConvexHullControls.svelte +128 -49
  72. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +7 -6
  73. package/dist/convex-hull/ConvexHullInfoPane.svelte +18 -5
  74. package/dist/convex-hull/ConvexHullInfoPane.svelte.d.ts +6 -5
  75. package/dist/convex-hull/ConvexHullStats.svelte +210 -351
  76. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +3 -1
  77. package/dist/convex-hull/ConvexHullTooltip.svelte +16 -14
  78. package/dist/convex-hull/ConvexHullTooltip.svelte.d.ts +2 -1
  79. package/dist/convex-hull/GasPressureControls.svelte +5 -12
  80. package/dist/convex-hull/StructurePopup.svelte +17 -21
  81. package/dist/convex-hull/StructurePopup.svelte.d.ts +2 -0
  82. package/dist/convex-hull/TemperatureSlider.svelte +4 -10
  83. package/dist/convex-hull/barycentric-coords.d.ts +2 -4
  84. package/dist/convex-hull/barycentric-coords.js +6 -33
  85. package/dist/convex-hull/canvas-interactions.svelte.d.ts +79 -0
  86. package/dist/convex-hull/canvas-interactions.svelte.js +279 -0
  87. package/dist/convex-hull/helpers.d.ts +47 -17
  88. package/dist/convex-hull/helpers.js +186 -101
  89. package/dist/convex-hull/hull-state.svelte.d.ts +44 -0
  90. package/dist/convex-hull/hull-state.svelte.js +124 -0
  91. package/dist/convex-hull/index.d.ts +9 -7
  92. package/dist/convex-hull/index.js +7 -2
  93. package/dist/convex-hull/thermodynamics.js +109 -937
  94. package/dist/convex-hull/types.d.ts +12 -4
  95. package/dist/convex-hull/types.js +12 -0
  96. package/dist/coordination/CoordinationBarPlot.svelte +41 -43
  97. package/dist/coordination/CoordinationBarPlot.svelte.d.ts +1 -1
  98. package/dist/coordination/calc-coordination.d.ts +1 -1
  99. package/dist/coordination/calc-coordination.js +28 -25
  100. package/dist/element/BohrAtom.svelte +6 -8
  101. package/dist/element/ElementHeading.svelte +4 -1
  102. package/dist/element/ElementPhoto.svelte +11 -9
  103. package/dist/element/ElementStats.svelte +12 -10
  104. package/dist/element/ElementTile.svelte +24 -29
  105. package/dist/element/ElementTile.svelte.d.ts +1 -1
  106. package/dist/element/Nucleus.svelte +4 -2
  107. package/dist/element/data.d.ts +1 -2
  108. package/dist/element/helpers.d.ts +4 -0
  109. package/dist/element/helpers.js +18 -0
  110. package/dist/element/index.d.ts +1 -0
  111. package/dist/element/index.js +3 -0
  112. package/dist/feedback/DragOverlay.svelte +5 -3
  113. package/dist/feedback/DragOverlay.svelte.d.ts +2 -1
  114. package/dist/feedback/StatusMessage.svelte +20 -7
  115. package/dist/fermi-surface/FermiSlice.svelte +21 -18
  116. package/dist/fermi-surface/FermiSurface.svelte +78 -165
  117. package/dist/fermi-surface/FermiSurface.svelte.d.ts +9 -20
  118. package/dist/fermi-surface/FermiSurfaceControls.svelte +6 -20
  119. package/dist/fermi-surface/FermiSurfaceScene.svelte +93 -272
  120. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +3 -23
  121. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +9 -6
  122. package/dist/fermi-surface/compute.js +14 -13
  123. package/dist/fermi-surface/export.js +4 -15
  124. package/dist/fermi-surface/index.d.ts +0 -1
  125. package/dist/fermi-surface/index.js +0 -1
  126. package/dist/fermi-surface/parse.d.ts +1 -1
  127. package/dist/fermi-surface/parse.js +84 -97
  128. package/dist/fermi-surface/types.d.ts +2 -2
  129. package/dist/heatmap-matrix/HeatmapMatrix.svelte +161 -185
  130. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +6 -5
  131. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +12 -9
  132. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +5 -5
  133. package/dist/heatmap-matrix/index.d.ts +8 -2
  134. package/dist/icons.d.ts +4 -0
  135. package/dist/icons.js +4 -0
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.js +1 -0
  138. package/dist/io/ExportPane.svelte +170 -0
  139. package/dist/io/ExportPane.svelte.d.ts +17 -0
  140. package/dist/io/decompress.d.ts +2 -1
  141. package/dist/io/decompress.js +22 -36
  142. package/dist/io/export.d.ts +9 -1
  143. package/dist/io/export.js +37 -29
  144. package/dist/io/fetch.d.ts +2 -4
  145. package/dist/io/fetch.js +0 -11
  146. package/dist/io/file-drop.d.ts +7 -0
  147. package/dist/io/file-drop.js +13 -0
  148. package/dist/io/index.d.ts +1 -0
  149. package/dist/io/index.js +3 -0
  150. package/dist/io/is-binary.d.ts +9 -0
  151. package/dist/io/is-binary.js +45 -1
  152. package/dist/io/types.d.ts +13 -0
  153. package/dist/io/url-drop.js +13 -25
  154. package/dist/isosurface/Isosurface.svelte +17 -23
  155. package/dist/isosurface/IsosurfaceControls.svelte +37 -42
  156. package/dist/isosurface/parse-vaspwave.d.ts +3 -0
  157. package/dist/isosurface/parse-vaspwave.js +138 -0
  158. package/dist/isosurface/parse.js +50 -48
  159. package/dist/labels.d.ts +6 -2
  160. package/dist/labels.js +44 -14
  161. package/dist/layout/FullscreenButton.svelte +34 -0
  162. package/dist/layout/FullscreenButton.svelte.d.ts +10 -0
  163. package/dist/layout/FullscreenToggle.svelte +12 -12
  164. package/dist/layout/InfoCard.svelte +7 -18
  165. package/dist/layout/InfoTag.svelte +1 -3
  166. package/dist/layout/NumberRangeInput.svelte +46 -0
  167. package/dist/layout/NumberRangeInput.svelte.d.ts +12 -0
  168. package/dist/layout/PropertyFilter.svelte +2 -6
  169. package/dist/layout/SettingsSection.svelte +21 -17
  170. package/dist/layout/SubpageGrid.svelte +3 -1
  171. package/dist/layout/ViewerChrome.svelte +115 -0
  172. package/dist/layout/ViewerChrome.svelte.d.ts +18 -0
  173. package/dist/layout/fullscreen.d.ts +4 -0
  174. package/dist/layout/fullscreen.js +3 -5
  175. package/dist/layout/fullscreen.svelte.d.ts +8 -0
  176. package/dist/layout/fullscreen.svelte.js +36 -0
  177. package/dist/layout/index.d.ts +4 -0
  178. package/dist/layout/index.js +4 -0
  179. package/dist/layout/json-tree/JsonNode.svelte +8 -11
  180. package/dist/layout/json-tree/JsonTree.svelte +53 -77
  181. package/dist/layout/json-tree/JsonValue.svelte +7 -15
  182. package/dist/layout/json-tree/utils.js +14 -23
  183. package/dist/math.d.ts +9 -3
  184. package/dist/math.js +37 -21
  185. package/dist/overlays/ContextMenu.svelte +4 -2
  186. package/dist/overlays/CopyButton.svelte +11 -5
  187. package/dist/overlays/DragControlTab.svelte +6 -1
  188. package/dist/overlays/DraggablePane.svelte +81 -26
  189. package/dist/overlays/DraggablePane.svelte.d.ts +1 -0
  190. package/dist/overlays/GlassChip.svelte +30 -0
  191. package/dist/overlays/GlassChip.svelte.d.ts +8 -0
  192. package/dist/overlays/InfoPaneCards.svelte +11 -23
  193. package/dist/overlays/index.d.ts +11 -0
  194. package/dist/overlays/index.js +26 -0
  195. package/dist/overlays/portal.d.ts +2 -0
  196. package/dist/overlays/portal.js +14 -0
  197. package/dist/periodic-table/PeriodicTable.svelte +115 -146
  198. package/dist/periodic-table/PeriodicTable.svelte.d.ts +5 -3
  199. package/dist/periodic-table/PeriodicTableControls.svelte +11 -63
  200. package/dist/periodic-table/TableInset.svelte +9 -4
  201. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +50 -71
  202. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -8
  203. package/dist/phase-diagram/PhaseDiagramControls.svelte +73 -96
  204. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +4 -3
  205. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +4 -2
  206. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +2 -3
  207. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +49 -134
  208. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +3 -4
  209. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +54 -58
  210. package/dist/phase-diagram/TdbInfoPanel.svelte +21 -15
  211. package/dist/phase-diagram/build-diagram.js +3 -3
  212. package/dist/phase-diagram/colors.js +1 -1
  213. package/dist/phase-diagram/diagram-input.d.ts +1 -2
  214. package/dist/phase-diagram/parse.d.ts +2 -1
  215. package/dist/phase-diagram/parse.js +15 -15
  216. package/dist/phase-diagram/svg-to-diagram.js +21 -15
  217. package/dist/phase-diagram/utils.js +2 -3
  218. package/dist/plot/bar/BarPlot.svelte +494 -692
  219. package/dist/plot/bar/BarPlot.svelte.d.ts +9 -15
  220. package/dist/plot/bar/BarPlotControls.svelte +1 -3
  221. package/dist/plot/bar/BarPlotControls.svelte.d.ts +5 -7
  222. package/dist/plot/bar/SpacegroupBarPlot.svelte +31 -37
  223. package/dist/plot/bar/data.d.ts +5 -4
  224. package/dist/plot/bar/data.js +2 -1
  225. package/dist/plot/box/BoxPlot.svelte +361 -439
  226. package/dist/plot/box/BoxPlot.svelte.d.ts +6 -3
  227. package/dist/plot/box/BoxPlotControls.svelte.d.ts +1 -1
  228. package/dist/plot/box/Violin.svelte.d.ts +2 -1
  229. package/dist/plot/box/box-plot.d.ts +3 -2
  230. package/dist/plot/box/box-plot.js +6 -3
  231. package/dist/plot/box/kde.d.ts +2 -1
  232. package/dist/plot/box/kde.js +4 -4
  233. package/dist/plot/core/auto-place.d.ts +1 -1
  234. package/dist/plot/core/auto-place.js +5 -2
  235. package/dist/plot/core/axis-utils.d.ts +12 -7
  236. package/dist/plot/core/axis-utils.js +48 -48
  237. package/dist/plot/core/components/AxisLabel.svelte +82 -20
  238. package/dist/plot/core/components/AxisLabel.svelte.d.ts +1 -0
  239. package/dist/plot/core/components/ColorBar.svelte +106 -111
  240. package/dist/plot/core/components/ColorBar.svelte.d.ts +5 -4
  241. package/dist/plot/core/components/ColorScaleSelect.svelte +1 -1
  242. package/dist/plot/core/components/FillArea.svelte +10 -17
  243. package/dist/plot/core/components/HierarchyControls.svelte +249 -0
  244. package/dist/plot/{sunburst/SunburstControls.svelte.d.ts → core/components/HierarchyControls.svelte.d.ts} +12 -8
  245. package/dist/plot/core/components/InteractiveAxisLabel.svelte +1 -1
  246. package/dist/plot/core/components/InteractiveAxisLabel.svelte.d.ts +1 -1
  247. package/dist/plot/core/components/Line.svelte +21 -11
  248. package/dist/plot/core/components/Line.svelte.d.ts +5 -2
  249. package/dist/plot/core/components/PlotAxis.svelte +42 -18
  250. package/dist/plot/core/components/PlotAxis.svelte.d.ts +2 -1
  251. package/dist/plot/core/components/PlotControls.svelte +65 -41
  252. package/dist/plot/core/components/PlotControls.svelte.d.ts +1 -1
  253. package/dist/plot/core/components/PlotLegend.svelte +31 -35
  254. package/dist/plot/core/components/PlotMarginals.svelte +616 -0
  255. package/dist/plot/core/components/PlotMarginals.svelte.d.ts +15 -0
  256. package/dist/plot/core/components/PlotTooltip.svelte +1 -1
  257. package/dist/plot/core/components/PortalSelect.svelte +4 -8
  258. package/dist/plot/core/components/ReferenceLine.svelte +27 -24
  259. package/dist/plot/core/components/ReferenceLine3D.svelte +56 -59
  260. package/dist/plot/core/components/ReferenceLine3D.svelte.d.ts +4 -4
  261. package/dist/plot/core/components/ReferencePlane.svelte +9 -10
  262. package/dist/plot/core/components/ReferencePlane.svelte.d.ts +4 -4
  263. package/dist/plot/core/components/ZeroLines.svelte +4 -8
  264. package/dist/plot/core/components/ZoomRect.svelte +1 -2
  265. package/dist/plot/core/components/index.d.ts +1 -0
  266. package/dist/plot/core/components/index.js +1 -0
  267. package/dist/plot/core/data-cleaning-signal.d.ts +46 -0
  268. package/dist/plot/core/data-cleaning-signal.js +467 -0
  269. package/dist/plot/core/data-cleaning.d.ts +2 -42
  270. package/dist/plot/core/data-cleaning.js +29 -476
  271. package/dist/plot/core/data-transform.js +9 -5
  272. package/dist/plot/core/fill-utils.d.ts +7 -4
  273. package/dist/plot/core/fill-utils.js +34 -9
  274. package/dist/plot/core/index.d.ts +1 -0
  275. package/dist/plot/core/index.js +1 -0
  276. package/dist/plot/core/interactions.d.ts +5 -1
  277. package/dist/plot/core/interactions.js +14 -2
  278. package/dist/plot/core/layout.d.ts +3 -1
  279. package/dist/plot/core/layout.js +22 -13
  280. package/dist/plot/core/marginals.d.ts +170 -0
  281. package/dist/plot/core/marginals.js +436 -0
  282. package/dist/plot/core/pan-zoom.svelte.d.ts +35 -0
  283. package/dist/plot/core/pan-zoom.svelte.js +221 -0
  284. package/dist/plot/core/placed-tween.svelte.d.ts +21 -0
  285. package/dist/plot/core/placed-tween.svelte.js +68 -0
  286. package/dist/plot/core/reference-line.d.ts +10 -10
  287. package/dist/plot/core/reference-line.js +7 -7
  288. package/dist/plot/core/scales.d.ts +40 -25
  289. package/dist/plot/core/scales.js +49 -21
  290. package/dist/plot/core/svg.d.ts +2 -1
  291. package/dist/plot/core/types/fills.d.ts +101 -0
  292. package/dist/plot/core/types/fills.js +15 -0
  293. package/dist/plot/core/types/plot-3d.d.ts +87 -0
  294. package/dist/plot/core/types/plot-3d.js +4 -0
  295. package/dist/plot/core/types/reference-lines.d.ts +140 -0
  296. package/dist/plot/core/types/reference-lines.js +9 -0
  297. package/dist/plot/core/types.d.ts +47 -331
  298. package/dist/plot/core/types.js +23 -20
  299. package/dist/plot/core/utils/hierarchy-chart.d.ts +51 -0
  300. package/dist/plot/core/utils/hierarchy-chart.js +179 -0
  301. package/dist/plot/core/utils/hierarchy-labels.d.ts +20 -0
  302. package/dist/plot/core/utils/hierarchy-labels.js +99 -0
  303. package/dist/plot/core/utils/label-placement.d.ts +1 -1
  304. package/dist/plot/core/utils/label-placement.js +5 -5
  305. package/dist/plot/core/utils.d.ts +2 -1
  306. package/dist/plot/histogram/Histogram.svelte +373 -631
  307. package/dist/plot/histogram/Histogram.svelte.d.ts +7 -7
  308. package/dist/plot/histogram/HistogramControls.svelte +30 -28
  309. package/dist/plot/histogram/HistogramControls.svelte.d.ts +1 -1
  310. package/dist/plot/histogram/histogram.d.ts +31 -0
  311. package/dist/plot/histogram/histogram.js +70 -0
  312. package/dist/plot/histogram/index.d.ts +1 -0
  313. package/dist/plot/histogram/index.js +1 -0
  314. package/dist/plot/index.d.ts +1 -0
  315. package/dist/plot/index.js +1 -0
  316. package/dist/plot/sankey/Sankey.svelte +79 -73
  317. package/dist/plot/sankey/Sankey.svelte.d.ts +3 -3
  318. package/dist/plot/sankey/SankeyControls.svelte +22 -16
  319. package/dist/plot/sankey/sankey.js +3 -1
  320. package/dist/plot/scatter/BinnedScatterPlot.svelte +264 -112
  321. package/dist/plot/scatter/BinnedScatterPlot.svelte.d.ts +11 -4
  322. package/dist/plot/scatter/ElementScatter.svelte +4 -1
  323. package/dist/plot/scatter/ScatterPlot.svelte +623 -821
  324. package/dist/plot/scatter/ScatterPlot.svelte.d.ts +9 -15
  325. package/dist/plot/scatter/ScatterPlotControls.svelte +18 -19
  326. package/dist/plot/scatter/ScatterPlotControls.svelte.d.ts +1 -1
  327. package/dist/plot/scatter/ScatterPoint.svelte +16 -9
  328. package/dist/plot/scatter/binned-scatter-types.d.ts +6 -12
  329. package/dist/plot/scatter/binned-scatter-types.js +6 -1
  330. package/dist/plot/scatter/index.d.ts +1 -1
  331. package/dist/plot/scatter/scatter-data.d.ts +1 -1
  332. package/dist/plot/scatter/scatter-data.js +8 -7
  333. package/dist/plot/scatter-3d/ScatterPlot3D.svelte +40 -60
  334. package/dist/plot/scatter-3d/ScatterPlot3D.svelte.d.ts +6 -14
  335. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte +17 -15
  336. package/dist/plot/scatter-3d/ScatterPlot3DControls.svelte.d.ts +5 -5
  337. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte +232 -234
  338. package/dist/plot/scatter-3d/ScatterPlot3DScene.svelte.d.ts +5 -14
  339. package/dist/plot/scatter-3d/Surface3D.svelte +9 -17
  340. package/dist/plot/scatter-3d/Surface3D.svelte.d.ts +4 -3
  341. package/dist/plot/sunburst/Sunburst.svelte +256 -338
  342. package/dist/plot/sunburst/Sunburst.svelte.d.ts +4 -3
  343. package/dist/plot/sunburst/index.d.ts +1 -1
  344. package/dist/plot/sunburst/index.js +2 -1
  345. package/dist/plot/sunburst/render.d.ts +2 -2
  346. package/dist/plot/sunburst/render.js +47 -22
  347. package/dist/plot/sunburst/sunburst.d.ts +5 -1
  348. package/dist/plot/sunburst/sunburst.js +14 -4
  349. package/dist/plot/treemap/Treemap.svelte +907 -0
  350. package/dist/plot/treemap/Treemap.svelte.d.ts +84 -0
  351. package/dist/plot/treemap/index.d.ts +3 -0
  352. package/dist/plot/treemap/index.js +4 -0
  353. package/dist/plot/treemap/treemap.d.ts +26 -0
  354. package/dist/plot/treemap/treemap.js +99 -0
  355. package/dist/rdf/RdfPlot.svelte +22 -26
  356. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  357. package/dist/rdf/calc-rdf.js +4 -8
  358. package/dist/sanitize.js +14 -3
  359. package/dist/scene/SceneCamera.svelte +62 -0
  360. package/dist/scene/SceneCamera.svelte.d.ts +19 -0
  361. package/dist/scene/bind-renderer.svelte.d.ts +2 -0
  362. package/dist/scene/bind-renderer.svelte.js +22 -0
  363. package/dist/scene/index.d.ts +4 -0
  364. package/dist/scene/index.js +5 -0
  365. package/dist/scene/props.js +52 -0
  366. package/dist/scene/types.d.ts +26 -0
  367. package/dist/scene/types.js +1 -0
  368. package/dist/settings.d.ts +33 -11
  369. package/dist/settings.js +136 -51
  370. package/dist/spectral/Bands.svelte +231 -237
  371. package/dist/spectral/Bands.svelte.d.ts +3 -2
  372. package/dist/spectral/BandsAndDos.svelte +29 -29
  373. package/dist/spectral/BrillouinBandsDos.svelte +21 -29
  374. package/dist/spectral/Dos.svelte +75 -77
  375. package/dist/spectral/Dos.svelte.d.ts +2 -1
  376. package/dist/spectral/helpers.d.ts +9 -9
  377. package/dist/spectral/helpers.js +66 -70
  378. package/dist/state.svelte.d.ts +0 -7
  379. package/dist/state.svelte.js +5 -24
  380. package/dist/structure/Arrow.svelte +6 -21
  381. package/dist/structure/ArrowInstances.svelte +160 -0
  382. package/dist/structure/ArrowInstances.svelte.d.ts +16 -0
  383. package/dist/structure/AtomLegend.svelte +115 -75
  384. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  385. package/dist/structure/Bond.svelte +31 -23
  386. package/dist/structure/CanvasTooltip.svelte +16 -3
  387. package/dist/structure/CellSelect.svelte +22 -29
  388. package/dist/structure/CellSelect.svelte.d.ts +2 -1
  389. package/dist/structure/Cylinder.svelte +24 -40
  390. package/dist/structure/InstancedAtoms.svelte +114 -0
  391. package/dist/structure/InstancedAtoms.svelte.d.ts +15 -0
  392. package/dist/structure/Lattice.svelte +85 -149
  393. package/dist/structure/SiteLabels.svelte +122 -0
  394. package/dist/structure/SiteLabels.svelte.d.ts +18 -0
  395. package/dist/structure/Structure.svelte +725 -735
  396. package/dist/structure/Structure.svelte.d.ts +8 -16
  397. package/dist/structure/StructureCarousel.svelte +630 -0
  398. package/dist/structure/StructureCarousel.svelte.d.ts +19 -0
  399. package/dist/structure/StructureControls.svelte +298 -325
  400. package/dist/structure/StructureControls.svelte.d.ts +5 -3
  401. package/dist/structure/StructureExportPane.svelte +62 -168
  402. package/dist/structure/StructureExportPane.svelte.d.ts +4 -5
  403. package/dist/structure/StructureInfoPane.svelte +77 -69
  404. package/dist/structure/StructureInfoPane.svelte.d.ts +6 -6
  405. package/dist/structure/StructureScene.svelte +758 -600
  406. package/dist/structure/StructureScene.svelte.d.ts +24 -20
  407. package/dist/structure/StructureViewport.svelte +386 -0
  408. package/dist/structure/StructureViewport.svelte.d.ts +63 -0
  409. package/dist/structure/atom-label-placement.d.ts +18 -0
  410. package/dist/structure/atom-label-placement.js +115 -0
  411. package/dist/structure/atom-properties.d.ts +3 -1
  412. package/dist/structure/atom-properties.js +115 -54
  413. package/dist/structure/bond-order-perception.js +2 -4
  414. package/dist/structure/bonding.d.ts +12 -2
  415. package/dist/structure/bonding.js +172 -73
  416. package/dist/structure/edit-history.d.ts +6 -0
  417. package/dist/structure/edit-history.js +27 -0
  418. package/dist/structure/export.d.ts +25 -4
  419. package/dist/structure/export.js +103 -153
  420. package/dist/structure/format-detect.d.ts +1 -0
  421. package/dist/structure/format-detect.js +22 -0
  422. package/dist/structure/geometry.d.ts +9 -0
  423. package/dist/structure/geometry.js +27 -0
  424. package/dist/structure/index.d.ts +18 -1
  425. package/dist/structure/index.js +15 -2
  426. package/dist/structure/measure.d.ts +1 -1
  427. package/dist/structure/measure.js +6 -12
  428. package/dist/structure/parse.d.ts +5 -3
  429. package/dist/structure/parse.js +551 -567
  430. package/dist/structure/partial-occupancy.d.ts +0 -1
  431. package/dist/structure/partial-occupancy.js +5 -3
  432. package/dist/structure/pbc.d.ts +1 -1
  433. package/dist/structure/pbc.js +204 -51
  434. package/dist/structure/polyhedra.d.ts +40 -0
  435. package/dist/structure/polyhedra.js +587 -0
  436. package/dist/structure/site.d.ts +4 -0
  437. package/dist/structure/site.js +1 -0
  438. package/dist/structure/supercell.d.ts +1 -2
  439. package/dist/structure/supercell.js +10 -15
  440. package/dist/structure/validation.js +5 -6
  441. package/dist/symmetry/SymmetryElementControls.svelte +69 -0
  442. package/dist/symmetry/SymmetryElementControls.svelte.d.ts +9 -0
  443. package/dist/symmetry/SymmetryElements.svelte +350 -0
  444. package/dist/symmetry/SymmetryElements.svelte.d.ts +24 -0
  445. package/dist/symmetry/SymmetryStats.svelte +142 -49
  446. package/dist/symmetry/WyckoffTable.svelte +58 -16
  447. package/dist/symmetry/WyckoffTable.svelte.d.ts +3 -0
  448. package/dist/symmetry/cell-transform.js +8 -14
  449. package/dist/symmetry/index.d.ts +15 -4
  450. package/dist/symmetry/index.js +308 -81
  451. package/dist/symmetry/spacegroups.d.ts +5 -1
  452. package/dist/symmetry/spacegroups.js +18 -3
  453. package/dist/symmetry/symmetry-elements.d.ts +33 -0
  454. package/dist/symmetry/symmetry-elements.js +521 -0
  455. package/dist/symmetry/wyckoff-db.d.ts +9 -0
  456. package/dist/symmetry/wyckoff-db.js +87 -0
  457. package/dist/table/HeatmapTable.svelte +1104 -378
  458. package/dist/table/HeatmapTable.svelte.d.ts +12 -2
  459. package/dist/table/ToggleMenu.svelte +5 -12
  460. package/dist/table/index.d.ts +21 -6
  461. package/dist/table/index.js +34 -21
  462. package/dist/theme/ThemeControl.svelte +16 -8
  463. package/dist/theme/index.d.ts +1 -5
  464. package/dist/theme/index.js +4 -10
  465. package/dist/theme/themes.mjs +14 -7
  466. package/dist/tooltip/KCoords.svelte +4 -1
  467. package/dist/tooltip/TooltipContent.svelte +2 -5
  468. package/dist/trajectory/Trajectory.svelte +556 -352
  469. package/dist/trajectory/Trajectory.svelte.d.ts +10 -22
  470. package/dist/trajectory/TrajectoryError.svelte +11 -8
  471. package/dist/trajectory/TrajectoryExportPane.svelte +28 -54
  472. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +4 -5
  473. package/dist/trajectory/TrajectoryInfoPane.svelte +88 -99
  474. package/dist/trajectory/TrajectoryInfoPane.svelte.d.ts +3 -2
  475. package/dist/trajectory/constants.js +6 -2
  476. package/dist/trajectory/extract.js +73 -71
  477. package/dist/trajectory/format-detect.d.ts +0 -1
  478. package/dist/trajectory/format-detect.js +13 -17
  479. package/dist/trajectory/frame-reader.d.ts +2 -1
  480. package/dist/trajectory/frame-reader.js +74 -136
  481. package/dist/trajectory/helpers.d.ts +12 -2
  482. package/dist/trajectory/helpers.js +68 -37
  483. package/dist/trajectory/index.d.ts +1 -0
  484. package/dist/trajectory/index.js +3 -0
  485. package/dist/trajectory/parse/ase.d.ts +9 -1
  486. package/dist/trajectory/parse/ase.js +47 -32
  487. package/dist/trajectory/parse/diagnostics.d.ts +3 -0
  488. package/dist/trajectory/parse/diagnostics.js +14 -0
  489. package/dist/trajectory/parse/h5-utils.d.ts +13 -0
  490. package/dist/trajectory/parse/h5-utils.js +109 -0
  491. package/dist/trajectory/parse/hdf5.d.ts +1 -1
  492. package/dist/trajectory/parse/hdf5.js +116 -106
  493. package/dist/trajectory/parse/index.d.ts +3 -4
  494. package/dist/trajectory/parse/index.js +68 -119
  495. package/dist/trajectory/parse/lammps.d.ts +0 -2
  496. package/dist/trajectory/parse/lammps.js +14 -16
  497. package/dist/trajectory/parse/pymatgen.d.ts +2 -0
  498. package/dist/trajectory/parse/pymatgen.js +74 -0
  499. package/dist/trajectory/parse/vasp.js +13 -9
  500. package/dist/trajectory/parse/vaspout-electronic.d.ts +13 -0
  501. package/dist/trajectory/parse/vaspout-electronic.js +207 -0
  502. package/dist/trajectory/parse/vaspout-h5.d.ts +5 -0
  503. package/dist/trajectory/parse/vaspout-h5.js +284 -0
  504. package/dist/trajectory/parse/xyz.d.ts +9 -21
  505. package/dist/trajectory/parse/xyz.js +38 -39
  506. package/dist/trajectory/plotting.d.ts +8 -10
  507. package/dist/trajectory/plotting.js +102 -127
  508. package/dist/utils.d.ts +4 -0
  509. package/dist/utils.js +8 -1
  510. package/dist/xrd/XrdPlot.svelte +56 -85
  511. package/dist/xrd/broadening.d.ts +2 -1
  512. package/dist/xrd/broadening.js +2 -1
  513. package/dist/xrd/calc-xrd.js +8 -15
  514. package/dist/xrd/index.d.ts +2 -2
  515. package/dist/xrd/parse.d.ts +0 -1
  516. package/dist/xrd/parse.js +56 -73
  517. package/package.json +77 -36
  518. package/dist/api/mp.d.ts +0 -6
  519. package/dist/api/mp.js +0 -22
  520. package/dist/element/data.json +0 -11864
  521. package/dist/fermi-surface/marching-cubes.d.ts +0 -2
  522. package/dist/fermi-surface/marching-cubes.js +0 -2
  523. package/dist/plot/core/hover-lock.svelte.d.ts +0 -14
  524. package/dist/plot/core/hover-lock.svelte.js +0 -45
  525. package/dist/plot/sunburst/SunburstControls.svelte +0 -200
  526. package/dist/structure/label-placement.d.ts +0 -14
  527. package/dist/structure/label-placement.js +0 -72
@@ -0,0 +1,221 @@
1
+ // Shared pan/zoom/touch/drag-rect interaction controller for the 2D plot components
2
+ // (BarPlot, BoxPlot, Histogram, ScatterPlot). Owns the interaction state machine;
3
+ // per-component policy (which axis props to write on rect-zoom, reset semantics)
4
+ // stays in the component via the on_rect_zoom/on_reset/set_range callbacks.
5
+ import { MIN_TOUCH_DISTANCE_PIXELS, pan_range_by_pixels, PINCH_ZOOM_THRESHOLD, remove_drag_listeners, snapshot_ranges, zoom_range_by_factor, } from './interactions';
6
+ const AXES = [`x`, `x2`, `y`, `y2`];
7
+ export function create_pan_zoom(opts) {
8
+ // Rect-zoom drag state
9
+ let drag_state = $state({ start: null, current: null, bounds: null });
10
+ // Pan state
11
+ let is_focused = $state(false);
12
+ let shift_held = $state(false);
13
+ let pan_drag_state = $state(null);
14
+ let touch_state = $state(null);
15
+ const cancel_rect_drag = () => {
16
+ drag_state = { start: null, current: null, bounds: null };
17
+ if (typeof window !== `undefined`) {
18
+ window.removeEventListener(`mousemove`, on_window_mouse_move);
19
+ window.removeEventListener(`mouseup`, on_window_mouse_up);
20
+ document.body.style.cursor = ``;
21
+ }
22
+ };
23
+ const on_window_mouse_move = (evt) => {
24
+ if (!drag_state.start || !drag_state.bounds)
25
+ return;
26
+ const coords = {
27
+ x: evt.clientX - drag_state.bounds.left,
28
+ y: evt.clientY - drag_state.bounds.top,
29
+ };
30
+ drag_state.current = coords;
31
+ const inside_svg = coords.x >= 0 &&
32
+ coords.x <= drag_state.bounds.width &&
33
+ coords.y >= 0 &&
34
+ coords.y <= drag_state.bounds.height;
35
+ opts.on_drag_move?.(coords, inside_svg);
36
+ };
37
+ const on_window_mouse_up = () => {
38
+ if (drag_state.start && drag_state.current) {
39
+ // Ignore minuscule drag rects (e.g. accidental clicks)
40
+ const dx = Math.abs(drag_state.start.x - drag_state.current.x);
41
+ const dy = Math.abs(drag_state.start.y - drag_state.current.y);
42
+ if (dx > 5 && dy > 5)
43
+ opts.on_rect_zoom(drag_state.start, drag_state.current);
44
+ }
45
+ cancel_rect_drag();
46
+ };
47
+ // Pan/zoom all four axes from an interaction-start snapshot, each in its own
48
+ // scale's transform space (log axes pan by a constant factor, linear by a shift)
49
+ const pan_all_axes = (init, dx_px, dy_px) => {
50
+ const dims = opts.plot_dims();
51
+ for (const axis of AXES) {
52
+ const horizontal = axis === `x` || axis === `x2`;
53
+ opts.set_range(axis, pan_range_by_pixels(init[`initial_${axis}_range`], horizontal ? dx_px : dy_px, horizontal ? dims.width : dims.height, opts.scale_type(axis)));
54
+ }
55
+ };
56
+ const zoom_all_axes = (init, factor) => {
57
+ for (const axis of AXES) {
58
+ opts.set_range(axis, zoom_range_by_factor(init[`initial_${axis}_range`], factor, opts.scale_type(axis)));
59
+ }
60
+ };
61
+ // Pan drag handler (drag direction inverted on x for natural pan feel)
62
+ const on_pan_move = (evt) => {
63
+ if (!pan_drag_state)
64
+ return;
65
+ const sensitivity = opts.pan()?.drag_sensitivity ?? 1;
66
+ pan_all_axes(pan_drag_state, -(evt.clientX - pan_drag_state.start.x) * sensitivity, (evt.clientY - pan_drag_state.start.y) * sensitivity);
67
+ };
68
+ const on_pan_end = () => {
69
+ pan_drag_state = null;
70
+ document.body.style.cursor = ``;
71
+ window.removeEventListener(`mousemove`, on_pan_move);
72
+ window.removeEventListener(`mouseup`, on_pan_end);
73
+ };
74
+ const on_mouse_down = (evt) => {
75
+ const svg = opts.svg();
76
+ if (!svg)
77
+ return;
78
+ // Shift+drag pans (when enabled); plain drag draws the zoom rect
79
+ const pan_enabled = opts.pan()?.enabled !== false;
80
+ if (pan_enabled && evt.shiftKey) {
81
+ evt.preventDefault();
82
+ pan_drag_state = {
83
+ start: { x: evt.clientX, y: evt.clientY },
84
+ ...snapshot_ranges(opts.ranges()),
85
+ };
86
+ document.body.style.cursor = `grabbing`;
87
+ window.addEventListener(`mousemove`, on_pan_move);
88
+ window.addEventListener(`mouseup`, on_pan_end);
89
+ return;
90
+ }
91
+ // Cache bounds at drag start so window mousemove can compute relative coords
92
+ const bounds = svg.getBoundingClientRect();
93
+ const coords = { x: evt.clientX - bounds.left, y: evt.clientY - bounds.top };
94
+ drag_state = { start: coords, current: coords, bounds };
95
+ window.addEventListener(`mousemove`, on_window_mouse_move);
96
+ window.addEventListener(`mouseup`, on_window_mouse_up);
97
+ document.body.style.cursor = `crosshair`;
98
+ evt.preventDefault();
99
+ };
100
+ // Wheel handler for pan (requires focus and shift). Use shift_held state
101
+ // (tracked via window keydown/keyup) for compatibility with synthetic events.
102
+ const on_wheel = (evt) => {
103
+ const pan_cfg = opts.pan();
104
+ if (pan_cfg?.enabled === false || !is_focused || !shift_held)
105
+ return;
106
+ evt.preventDefault();
107
+ const dims = opts.plot_dims();
108
+ const sensitivity = pan_cfg?.wheel_sensitivity ?? 1;
109
+ const ranges = opts.ranges();
110
+ // Pan along the dominant wheel direction
111
+ if (Math.abs(evt.deltaX) > Math.abs(evt.deltaY)) {
112
+ const dx = evt.deltaX * sensitivity;
113
+ opts.set_range(`x`, pan_range_by_pixels(ranges.x, dx, dims.width, opts.scale_type(`x`)));
114
+ opts.set_range(`x2`, pan_range_by_pixels(ranges.x2, dx, dims.width, opts.scale_type(`x2`)));
115
+ }
116
+ else {
117
+ const dy = evt.deltaY * sensitivity;
118
+ opts.set_range(`y`, pan_range_by_pixels(ranges.y, dy, dims.height, opts.scale_type(`y`)));
119
+ opts.set_range(`y2`, pan_range_by_pixels(ranges.y2, dy, dims.height, opts.scale_type(`y2`)));
120
+ }
121
+ };
122
+ // Touch handlers for pinch-zoom and two-finger pan
123
+ const on_touch_start = (evt) => {
124
+ const pan_cfg = opts.pan();
125
+ const touch_enabled = pan_cfg?.enabled !== false && pan_cfg?.touch_enabled !== false;
126
+ if (!touch_enabled || evt.touches.length !== 2)
127
+ return;
128
+ evt.preventDefault();
129
+ touch_state = {
130
+ start_touches: Array.from(evt.touches).map((touch) => ({
131
+ x: touch.clientX,
132
+ y: touch.clientY,
133
+ })),
134
+ ...snapshot_ranges(opts.ranges()),
135
+ };
136
+ };
137
+ const on_touch_move = (evt) => {
138
+ if (!touch_state || evt.touches.length !== 2)
139
+ return;
140
+ evt.preventDefault();
141
+ const [t1, t2] = Array.from(evt.touches);
142
+ const [s1, s2] = touch_state.start_touches;
143
+ // Calculate center movement for pan
144
+ const start_center = { x: (s1.x + s2.x) / 2, y: (s1.y + s2.y) / 2 };
145
+ const curr_center = { x: (t1.clientX + t2.clientX) / 2, y: (t1.clientY + t2.clientY) / 2 };
146
+ const dx = curr_center.x - start_center.x;
147
+ const dy = curr_center.y - start_center.y;
148
+ // Calculate pinch scale (curr/start so spread = zoom in, pinch = zoom out)
149
+ const start_dist = Math.hypot(s2.x - s1.x, s2.y - s1.y);
150
+ // ignore near-coincident touches so curr_dist / start_dist can't blow up the scale
151
+ if (start_dist < MIN_TOUCH_DISTANCE_PIXELS)
152
+ return;
153
+ const curr_dist = Math.hypot(t2.clientX - t1.clientX, t2.clientY - t1.clientY);
154
+ const scale = curr_dist / start_dist;
155
+ // Pinch zoom about the view center if scale changed significantly, else pan
156
+ if (Math.abs(scale - 1) > PINCH_ZOOM_THRESHOLD && scale > Number.EPSILON) {
157
+ zoom_all_axes(touch_state, scale);
158
+ }
159
+ else
160
+ pan_all_axes(touch_state, -dx, dy);
161
+ };
162
+ const on_touch_end = () => {
163
+ touch_state = null;
164
+ };
165
+ // SVG keydown: Escape cancels an in-flight rect drag, Enter/Space resets the view.
166
+ // Target check keeps focusable plot children (bars, points) from triggering a reset
167
+ // when their own Enter/Space activation bubbles up.
168
+ const on_key_down = (evt) => {
169
+ if (evt.target !== evt.currentTarget)
170
+ return;
171
+ if (evt.key === `Escape` && drag_state.start)
172
+ cancel_rect_drag();
173
+ if ([`Enter`, ` `].includes(evt.key)) {
174
+ evt.preventDefault();
175
+ opts.on_reset();
176
+ }
177
+ };
178
+ return {
179
+ get drag_start() {
180
+ return drag_state.start;
181
+ },
182
+ get drag_current() {
183
+ return drag_state.current;
184
+ },
185
+ get is_pan_dragging() {
186
+ return pan_drag_state !== null;
187
+ },
188
+ get cursor() {
189
+ if (pan_drag_state)
190
+ return `grabbing`;
191
+ return shift_held && opts.pan()?.enabled !== false ? `grab` : `crosshair`;
192
+ },
193
+ set_focused: (focused) => {
194
+ is_focused = focused;
195
+ },
196
+ on_mouse_down,
197
+ on_wheel,
198
+ on_touch_start,
199
+ on_touch_move,
200
+ on_touch_end,
201
+ on_key_down,
202
+ on_window_key_down: (evt) => {
203
+ if (evt.key === `Shift`)
204
+ shift_held = true;
205
+ },
206
+ on_window_key_up: (evt) => {
207
+ if (evt.key === `Shift`)
208
+ shift_held = false;
209
+ },
210
+ reset_view: () => opts.on_reset(),
211
+ // Tear down any window listeners + cursor override if the component unmounts
212
+ // mid-drag (mouseup/panend would otherwise never fire, leaking listeners and a
213
+ // stuck cursor). Safe during SSR teardown, where window/document don't exist.
214
+ destroy: () => {
215
+ remove_drag_listeners([on_window_mouse_move, on_pan_move], [on_window_mouse_up, on_pan_end]);
216
+ drag_state = { start: null, current: null, bounds: null };
217
+ pan_drag_state = null;
218
+ touch_state = null;
219
+ },
220
+ };
221
+ }
@@ -0,0 +1,21 @@
1
+ import { Tween, type TweenOptions } from 'svelte/motion';
2
+ type Point = {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ export declare function create_placed_tween(opts: {
7
+ placement: () => Point | null;
8
+ dims: () => {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ responsive: () => boolean;
13
+ element: () => Element | null | undefined;
14
+ tween?: () => TweenOptions<Point> | undefined;
15
+ suspended?: () => boolean;
16
+ manual_position?: () => Point | null;
17
+ }): {
18
+ coords: Tween<Point>;
19
+ set_locked: (locked: boolean) => void;
20
+ };
21
+ export {};
@@ -0,0 +1,68 @@
1
+ // Tweened position for auto-placed plot elements (legend, colorbar) with hover lock,
2
+ // debounced release, resize detection, and stability gating
3
+ import { untrack } from 'svelte';
4
+ import { Tween } from 'svelte/motion';
5
+ const HOVER_DEBOUNCE_MS = 300;
6
+ // Tweened position for an auto-placed plot element with the stability gating shared
7
+ // by BarPlot/BoxPlot/Histogram/ScatterPlot legends: snap (no animation) on first
8
+ // placement, follow container resizes, stay put while hovered (debounced hover lock),
9
+ // and track placement continuously only when `responsive`. Creates $effects, so it
10
+ // must be called during component init.
11
+ export function create_placed_tween(opts) {
12
+ // Hover lock: placement updates pause while the element is hovered; release is
13
+ // debounced so brief mouse-outs don't cause jumps
14
+ let hover_locked = $state(false);
15
+ let unlock_timeout = null;
16
+ const set_locked = (locked) => {
17
+ // Always clear any pending unlock so rapid calls don't queue multiple timeouts
18
+ if (unlock_timeout)
19
+ clearTimeout(unlock_timeout);
20
+ if (locked)
21
+ hover_locked = true;
22
+ else
23
+ unlock_timeout = setTimeout(() => (hover_locked = false), HOVER_DEBOUNCE_MS);
24
+ };
25
+ // Plain (untracked) flags: only read/written inside the effect below, and outcomes
26
+ // don't depend on re-running when they flip
27
+ let prev_dims = null;
28
+ let has_initial_placement = false;
29
+ const coords = new Tween({ x: 0, y: 0 }, untrack(() => ({ duration: 400, ...opts.tween?.() })));
30
+ // Clear pending unlock timeout to prevent state updates after unmount
31
+ $effect(() => () => {
32
+ if (unlock_timeout)
33
+ clearTimeout(unlock_timeout);
34
+ });
35
+ // Update position with stability checks
36
+ $effect(() => {
37
+ const { width, height } = opts.dims();
38
+ if (!width || !height)
39
+ return;
40
+ if (opts.suspended?.())
41
+ return;
42
+ const manual = opts.manual_position?.();
43
+ if (manual) {
44
+ // Immediate update (no animation) for manually positioned elements
45
+ void coords.set({ x: manual.x, y: manual.y }, { duration: 0 });
46
+ return;
47
+ }
48
+ const placement = opts.placement();
49
+ if (!placement)
50
+ return;
51
+ // Track dimensions for resize detection
52
+ const dims_changed = !prev_dims || prev_dims.width !== width || prev_dims.height !== height;
53
+ if (dims_changed)
54
+ prev_dims = { width, height };
55
+ // Only update if: resize occurred, OR (not hover-locked AND (responsive OR not
56
+ // yet initially placed))
57
+ const should_update = dims_changed || (!hover_locked && (opts.responsive() || !has_initial_placement));
58
+ if (should_update) {
59
+ void coords.set({ x: placement.x, y: placement.y },
60
+ // Skip animation on initial placement to avoid jump from (0, 0)
61
+ has_initial_placement ? undefined : { duration: 0 });
62
+ // Only lock position after the element has an actual measured size
63
+ if (opts.element())
64
+ has_initial_placement = true;
65
+ }
66
+ });
67
+ return { coords, set_locked };
68
+ }
@@ -1,3 +1,4 @@
1
+ import type { Vec2, Vec4 } from '../../math';
1
2
  import type { RefLine, RefLineValue } from './types';
2
3
  export type IndexedRefLine = RefLine & {
3
4
  idx: number;
@@ -11,18 +12,18 @@ export interface RefLinesByZIndex {
11
12
  }
12
13
  export declare function group_ref_lines_by_z(lines: IndexedRefLine[]): RefLinesByZIndex;
13
14
  export declare function normalize_value(value: RefLineValue): number;
14
- export declare const normalize_point: (point: [RefLineValue, RefLineValue]) => [number, number];
15
- export declare function resolve_line_endpoints(ref_line: RefLine, { x_min, x_max, y_min, y_max, }: {
15
+ export declare const normalize_point: (point: [RefLineValue, RefLineValue]) => Vec2;
16
+ export declare function resolve_line_endpoints(ref_line: RefLine, bounds: {
16
17
  x_min: number;
17
18
  x_max: number;
18
19
  y_min: number;
19
20
  y_max: number;
20
- }, { x_scale, x2_scale, y_scale, y2_scale, }: {
21
+ }, scales: {
21
22
  x_scale: (val: number) => number;
22
23
  x2_scale?: (val: number) => number;
23
24
  y_scale: (val: number) => number;
24
25
  y2_scale?: (val: number) => number;
25
- }): [number, number, number, number] | null;
26
+ }): Vec4 | null;
26
27
  interface AnnotationPosition {
27
28
  x: number;
28
29
  y: number;
@@ -45,13 +46,12 @@ export interface Scene3DParams {
45
46
  scene_x: number;
46
47
  scene_y: number;
47
48
  scene_z: number;
48
- x_range: [number, number];
49
- y_range: [number, number];
50
- z_range: [number, number];
49
+ x_range: Vec2;
50
+ y_range: Vec2;
51
+ z_range: Vec2;
51
52
  }
52
- /** Apply span constraints or use full range as fallback */
53
- export declare const span_or: (span: [number | null, number | null] | undefined, range: [number, number]) => [number, number];
54
- export declare function normalize_to_scene(value: number, [min_val, max_val]: [number, number], scene_size: number): number;
53
+ export declare const span_or: (span: [number | null, number | null] | undefined, range: Vec2) => Vec2;
54
+ export declare function normalize_to_scene(value: number, [min_val, max_val]: Vec2, scene_size: number): number;
55
55
  export declare function create_to_threejs(params: Scene3DParams): (user_x: number, user_y: number, user_z: number) => {
56
56
  x: number;
57
57
  y: number;
@@ -90,7 +90,9 @@ function clip_segment_to_rect(p1x, p1y, p2x, p2y, x_min, x_max, y_min, y_max) {
90
90
  }
91
91
  // Compute the screen coordinates for a reference line
92
92
  // Returns [x1, y1, x2, y2] in pixel coordinates, or null if line is not visible
93
- export function resolve_line_endpoints(ref_line, { x_min, x_max, y_min, y_max, }, { x_scale, x2_scale, y_scale, y2_scale, }) {
93
+ export function resolve_line_endpoints(ref_line, bounds, scales) {
94
+ const { x_min, x_max, y_min, y_max } = bounds;
95
+ const { x_scale, x2_scale, y_scale, y2_scale } = scales;
94
96
  // Determine which scales to use based on axis assignment
95
97
  const active_x_scale = ref_line.x_axis === `x2` && x2_scale ? x2_scale : x_scale;
96
98
  const active_y_scale = ref_line.y_axis === `y2` && y2_scale ? y2_scale : y_scale;
@@ -103,10 +105,8 @@ export function resolve_line_endpoints(ref_line, { x_min, x_max, y_min, y_max, }
103
105
  // Relative to data coordinate conversion
104
106
  const to_data_x = (rel) => x_min + rel * (x_max - x_min);
105
107
  const to_data_y = (rel) => y_min + rel * (y_max - y_min);
106
- let x1_data = 0;
107
- let y1_data = 0;
108
- let x2_data = 0;
109
- let y2_data = 0;
108
+ let [x1_data, x2_data] = [0, 0];
109
+ let [y1_data, y2_data] = [0, 0];
110
110
  const line_type = ref_line.type;
111
111
  if (line_type === `horizontal`) {
112
112
  const y_val = normalize_value(ref_line.y);
@@ -210,7 +210,7 @@ export function calculate_annotation_position(x1, y1, x2, y2, annotation) {
210
210
  // Calculate base position with edge padding applied along line direction
211
211
  const dx = x2 - x1;
212
212
  const dy = y2 - y1;
213
- const len = Math.sqrt(dx * dx + dy * dy);
213
+ const len = Math.hypot(dx, dy);
214
214
  let base_x = x1 + frac * dx;
215
215
  let base_y = y1 + frac * dy;
216
216
  // Apply edge padding to pull text slightly inward from plot boundaries
@@ -276,7 +276,7 @@ export function calculate_annotation_position(x1, y1, x2, y2, annotation) {
276
276
  }
277
277
  return { x: final_x, y: final_y, text_anchor, dominant_baseline, rotation };
278
278
  }
279
- /** Apply span constraints or use full range as fallback */
279
+ // Apply span constraints or use full range as fallback
280
280
  export const span_or = (span, range) => [span?.[0] ?? range[0], span?.[1] ?? range[1]];
281
281
  // Normalize a data value to scene coordinates (centered around 0)
282
282
  export function normalize_to_scene(value, [min_val, max_val], scene_size) {
@@ -1,13 +1,13 @@
1
- import type { D3ColorSchemeName, D3InterpolateName } from '../../colors';
2
- import type { Point, ScaleType, TimeInterval } from '..';
1
+ import type { Vec2 } from '../../math';
2
+ import type { ColorScaleConfig, Point, ScaleType, SizeScaleConfig, TimeInterval } from '..';
3
3
  import type { ScaleContinuousNumeric, ScaleTime } from 'd3-scale';
4
4
  export type TicksOption = number | number[] | TimeInterval | Record<number, string>;
5
5
  export interface ArcsinhScale {
6
6
  (value: number | Date): number;
7
- domain(): [number, number];
8
- domain(domain: [number, number]): ArcsinhScale;
9
- range(): [number, number];
10
- range(range: [number, number]): ArcsinhScale;
7
+ domain(): Vec2;
8
+ domain(domain: Vec2): ArcsinhScale;
9
+ range(): Vec2;
10
+ range(range: Vec2): ArcsinhScale;
11
11
  invert(value: number): number;
12
12
  copy(): ArcsinhScale;
13
13
  ticks(count?: number): number[];
@@ -16,33 +16,48 @@ export interface ArcsinhScale {
16
16
  export type PlotScaleFn = ScaleContinuousNumeric<number, number> | ScaleTime<number, number> | ArcsinhScale;
17
17
  export declare function scale_arcsinh(threshold?: number): ArcsinhScale;
18
18
  export declare function generate_arcsinh_ticks(min: number, max: number, threshold?: number, count?: number): number[];
19
- export declare function create_scale(scale_type: ScaleType, domain: [number, number], output_range: [number, number]): ScaleContinuousNumeric<number, number> | ArcsinhScale;
20
- export declare const create_time_scale: (domain: [number, number], output_range: [number, number]) => ScaleTime<number, number, never>;
21
- export declare function generate_ticks(domain: [number, number], scale_type: ScaleType, ticks_option: TicksOption | undefined, scale_fn: PlotScaleFn, // D3 scale function with .ticks() method
19
+ export declare function create_scale(scale_type: ScaleType, domain: Vec2, output_range: Vec2): ScaleContinuousNumeric<number, number> | ArcsinhScale;
20
+ export declare function create_axis_scales<A extends {
21
+ scale_type?: ScaleType;
22
+ }>(axes: {
23
+ x: A;
24
+ x2: A;
25
+ y: A;
26
+ y2: A;
27
+ }, ranges: {
28
+ x: Vec2;
29
+ x2: Vec2;
30
+ y: Vec2;
31
+ y2: Vec2;
32
+ }, pad: {
33
+ l: number;
34
+ r: number;
35
+ t: number;
36
+ b: number;
37
+ }, width: number, height: number): {
38
+ x: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
39
+ x2: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
40
+ y: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
41
+ y2: ArcsinhScale | ScaleContinuousNumeric<number, number, never>;
42
+ };
43
+ export declare const create_time_scale: (domain: Vec2, output_range: Vec2) => ScaleTime<number, number, never>;
44
+ export declare function generate_ticks(domain: Vec2, scale_type: ScaleType, ticks_option: TicksOption | undefined, scale_fn: PlotScaleFn, // D3 scale function with .ticks() method
22
45
  options?: {
23
46
  format?: string;
24
47
  default_count?: number;
25
48
  interval_padding?: number;
26
49
  }): number[];
27
- export declare function calculate_domain(values: number[], scale_type?: ScaleType): [number, number];
28
- export declare function get_nice_data_range(points: Point[], get_value: (p: Point) => number, limits: [number | null, number | null], scale_type: ScaleType, padding_factor: number, is_time?: boolean): [number, number];
50
+ export declare function calculate_domain(values: number[], scale_type?: ScaleType): Vec2;
51
+ export declare function get_nice_data_range(points: Point[], get_value: (point: Point) => number, limits: [number | null, number | null], scale_type: ScaleType, padding_factor: number, is_time?: boolean): Vec2;
29
52
  export declare function generate_log_ticks(min: number, max: number, ticks_option?: TicksOption): number[];
30
53
  export declare function get_tick_label(tick_value: number, ticks_option: TicksOption | undefined): string | null;
31
- export declare function create_color_scale(color_scale_config: {
32
- type?: ScaleType;
33
- scheme?: D3ColorSchemeName | D3InterpolateName;
34
- value_range?: [number, number];
35
- } | string, auto_color_range: [number, number]): ((value: number) => string) & {
54
+ export declare function create_color_scale(color_scale_config: ColorScaleConfig | string, auto_color_range: Vec2): ((value: number) => string) & {
36
55
  domain: {
37
- (): [number, number];
38
- (new_domain: [number, number]): ((value: number) => string) & /*elided*/ any;
56
+ (): Vec2;
57
+ (new_domain: Vec2): ((value: number) => string) & /*elided*/ any;
39
58
  };
40
59
  };
41
- export declare function create_size_scale(config: {
42
- type?: ScaleType;
43
- radius_range?: [number, number];
44
- value_range?: [number, number];
45
- }, all_size_values: (number | null)[]): import("d3-scale").ScaleLinear<number, number, never> | (((value: number) => number) & {
46
- domain: () => [number, number];
47
- range: () => [number, number];
60
+ export declare function create_size_scale(config: SizeScaleConfig, all_size_values: (number | null)[]): import("d3-scale").ScaleLinear<number, number, never> | (((value: number) => number) & {
61
+ domain: () => Vec2;
62
+ range: () => Vec2;
48
63
  });
@@ -1,5 +1,7 @@
1
1
  import * as math from '../../math';
2
- import { get_arcsinh_threshold, get_scale_type_name, is_time_scale, } from './types';
2
+ import { get_d3_interpolator } from '../../colors';
3
+ import { clamp01 } from '../../utils';
4
+ import { get_arcsinh_threshold, get_scale_type_name, is_time_scale, SCALE_DEFAULTS, } from './types';
3
5
  import { extent, range } from 'd3-array';
4
6
  import { scaleLinear, scaleLog, scaleSequential, scaleSequentialLog, scaleTime, } from 'd3-scale';
5
7
  import * as d3_sc from 'd3-scale-chromatic';
@@ -33,8 +35,8 @@ export function scale_arcsinh(threshold = 1) {
33
35
  // Linear interpolation in transformed space
34
36
  if (t_max === t_min)
35
37
  return (r_min + r_max) / 2;
36
- const t = (t_val - t_min) / (t_max - t_min);
37
- return r_min + t * (r_max - r_min);
38
+ const frac = (t_val - t_min) / (t_max - t_min);
39
+ return r_min + frac * (r_max - r_min);
38
40
  });
39
41
  // Domain getter/setter
40
42
  scale.domain = function (domain) {
@@ -63,8 +65,8 @@ export function scale_arcsinh(threshold = 1) {
63
65
  // Inverse linear interpolation
64
66
  if (r_max === r_min)
65
67
  return (d_min + d_max) / 2;
66
- const t = (value - r_min) / (r_max - r_min);
67
- const t_val = t_min + t * (t_max - t_min);
68
+ const frac = (value - r_min) / (r_max - r_min);
69
+ const t_val = t_min + frac * (t_max - t_min);
68
70
  // Inverse transform
69
71
  return sinh_transform(t_val);
70
72
  };
@@ -188,6 +190,19 @@ export function create_scale(scale_type, domain, output_range) {
188
190
  // For 'time' or 'linear', return linear scale (time scales need create_time_scale())
189
191
  return scaleLinear().domain(domain).range(output_range);
190
192
  }
193
+ // Build the four axis scales for a 2D plot in one call: x/x2 share the horizontal pixel span,
194
+ // y/y2 the inverted vertical one. Shared by BarPlot/BoxPlot/Histogram (identical layout math).
195
+ export function create_axis_scales(axes, ranges, pad, width, height) {
196
+ const x_px = [pad.l, width - pad.r];
197
+ const y_px = [height - pad.b, pad.t];
198
+ const scale = (axis, domain, px) => create_scale(axis.scale_type ?? `linear`, domain, px);
199
+ return {
200
+ x: scale(axes.x, ranges.x, x_px),
201
+ x2: scale(axes.x2, ranges.x2, x_px),
202
+ y: scale(axes.y, ranges.y, y_px),
203
+ y2: scale(axes.y2, ranges.y2, y_px),
204
+ };
205
+ }
191
206
  // Create a time scale for time-based data
192
207
  export const create_time_scale = (domain, output_range) => scaleTime()
193
208
  .domain([new Date(domain[0]), new Date(domain[1])])
@@ -224,15 +239,17 @@ options = {}) {
224
239
  const ticks = time_scale.ticks(count);
225
240
  if (typeof ticks_option === `string`) {
226
241
  if (ticks_option === `month`) {
227
- return ticks.filter((d) => d.getDate() === 1).map((d) => d.getTime());
242
+ return ticks
243
+ .filter((date) => date.getDate() === 1)
244
+ .map((date) => date.getTime());
228
245
  }
229
246
  if (ticks_option === `year`) {
230
247
  return ticks
231
- .filter((d) => d.getMonth() === 0 && d.getDate() === 1)
232
- .map((d) => d.getTime());
248
+ .filter((date) => date.getMonth() === 0 && date.getDate() === 1)
249
+ .map((date) => date.getTime());
233
250
  }
234
251
  }
235
- return ticks.map((d) => d.getTime());
252
+ return ticks.map((date) => date.getTime());
236
253
  }
237
254
  const type_name = get_scale_type_name(scale_type);
238
255
  // Log scale ticks
@@ -261,9 +278,13 @@ export function calculate_domain(values, scale_type = `linear`) {
261
278
  if (min_val === undefined || max_val === undefined)
262
279
  return [0, 1];
263
280
  const type_name = get_scale_type_name(scale_type);
264
- // Only log scale needs domain clamping to positive values
265
- // Arcsinh and linear can handle any values
266
- return type_name === `log` ? [Math.max(min_val, math.LOG_EPS), max_val] : [min_val, max_val];
281
+ // log clamps to positive (arcsinh/linear take any value); clamp BOTH ends so all-negative
282
+ // data can't leave max <= the clamped min and invert/collapse the scale
283
+ if (type_name === `log`) {
284
+ const lo = Math.max(min_val, math.LOG_EPS);
285
+ return [lo, Math.max(max_val, lo)];
286
+ }
287
+ return [min_val, max_val];
267
288
  }
268
289
  // Advanced domain calculation with padding and nice boundaries (from ScatterPlot)
269
290
  export function get_nice_data_range(points, get_value, limits, scale_type, padding_factor, is_time = false) {
@@ -272,6 +293,13 @@ export function get_nice_data_range(points, get_value, limits, scale_type, paddi
272
293
  let data_min = min ?? min_ext ?? 0;
273
294
  let data_max = max ?? max_ext ?? 1;
274
295
  const type_name = get_scale_type_name(scale_type);
296
+ const can_snap_zero = min_ext !== undefined &&
297
+ max_ext !== undefined &&
298
+ min_ext < max_ext &&
299
+ !is_time &&
300
+ type_name !== `log`;
301
+ const snap_zero_min = can_snap_zero && min === null && min_ext === 0;
302
+ const snap_zero_max = can_snap_zero && max === null && max_ext === 0;
275
303
  // Apply padding *only if* limits were NOT provided
276
304
  if (min === null && max === null && points.length > 0) {
277
305
  if (data_min !== data_max) {
@@ -337,7 +365,7 @@ export function get_nice_data_range(points, get_value, limits, scale_type, paddi
337
365
  // Use D3's nice() to create pretty boundaries
338
366
  // For arcsinh, we don't use D3's nice() - just return padded domain
339
367
  if (type_name === `arcsinh`) {
340
- return [data_min, data_max];
368
+ return [snap_zero_min ? 0 : data_min, snap_zero_max ? 0 : data_max];
341
369
  }
342
370
  // Create the scale with the *padded* data domain
343
371
  const scale = type_name === `log`
@@ -348,7 +376,7 @@ export function get_nice_data_range(points, get_value, limits, scale_type, paddi
348
376
  : scaleLinear().domain([data_min, data_max]);
349
377
  scale.nice();
350
378
  const [nice_min = data_min, nice_max = data_max] = scale.domain();
351
- return [nice_min, nice_max];
379
+ return [snap_zero_min ? 0 : nice_min, snap_zero_max ? 0 : nice_max];
352
380
  }
353
381
  // Generate logarithmic ticks (from ScatterPlot)
354
382
  export function generate_log_ticks(min, max, ticks_option) {
@@ -398,16 +426,16 @@ export function create_color_scale(color_scale_config, auto_color_range) {
398
426
  const candidate_interpolator = Object.entries(d3_sc).find(([key]) => key === scheme)?.[1];
399
427
  const interpolator = typeof candidate_interpolator === `function`
400
428
  ? candidate_interpolator
401
- : d3_sc.interpolateViridis;
429
+ : get_d3_interpolator(SCALE_DEFAULTS.scheme);
402
430
  const [min_val, max_val] = (typeof color_scale_config === `string` ? undefined : color_scale_config.value_range) ??
403
431
  auto_color_range;
404
432
  const scale_type = typeof color_scale_config === `string` ? undefined : color_scale_config.type;
405
433
  const type_name = get_scale_type_name(scale_type);
406
434
  if (type_name === `log`) {
407
- return scaleSequentialLog(interpolator).domain([
408
- Math.max(min_val, math.LOG_EPS),
409
- Math.max(max_val, min_val * 1.1),
410
- ]);
435
+ // clamp both ends (like create_scale): all-negative data otherwise yields an inverted
436
+ // [LOG_EPS, max<0] domain that maps every input to undefined
437
+ const lo = Math.max(min_val, math.LOG_EPS);
438
+ return scaleSequentialLog(interpolator).domain([lo, Math.max(max_val, lo * 1.1)]);
411
439
  }
412
440
  if (type_name === `arcsinh`) {
413
441
  // For arcsinh color scale, we create a custom scale that wraps the interpolator
@@ -434,7 +462,7 @@ function create_arcsinh_color_scale(interpolator, initial_domain, threshold) {
434
462
  const t_val = Math.asinh(value / safe_threshold);
435
463
  // Normalize to [0, 1]
436
464
  const normalized = t_max === t_min ? 0.5 : (t_val - t_min) / (t_max - t_min);
437
- return interpolator(Math.max(0, Math.min(1, normalized)));
465
+ return interpolator(clamp01(normalized));
438
466
  });
439
467
  // Domain getter/setter for D3 compatibility - returns same scale instance
440
468
  scale.domain = function (new_domain) {
@@ -447,7 +475,7 @@ function create_arcsinh_color_scale(interpolator, initial_domain, threshold) {
447
475
  }
448
476
  // Create a size scale function from configuration
449
477
  export function create_size_scale(config, all_size_values) {
450
- const [min_radius, max_radius] = config.radius_range ?? [2, 10];
478
+ const [min_radius, max_radius] = config.radius_range ?? SCALE_DEFAULTS.radius;
451
479
  const auto_range = all_size_values.length > 0
452
480
  ? extent(all_size_values.filter((val) => val !== null))
453
481
  : [0, 1];
@@ -1,2 +1,3 @@
1
- export declare function violin_path(grid_px: readonly number[], half_offsets_px: readonly number[], center: number, side: `both` | `positive` | `negative`, orient: (cross: number, val: number) => [number, number]): string;
1
+ import type { Vec2 } from '../../math';
2
+ export declare function violin_path(grid_px: readonly number[], half_offsets_px: readonly number[], center: number, side: `both` | `positive` | `negative`, orient: (cross: number, val: number) => Vec2): string;
2
3
  export declare function bar_path(x: number, y: number, w: number, h: number, r: number, vertical?: boolean): string;