matterviz 0.3.2 → 0.3.3

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 (280) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +123 -82
  3. package/dist/Icon.svelte +18 -12
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -207
  7. package/dist/brillouin/BrillouinZone.svelte +292 -149
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +69 -42
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +275 -163
  14. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  15. package/dist/brillouin/BrillouinZoneTooltip.svelte +17 -7
  16. package/dist/brillouin/compute.js +11 -6
  17. package/dist/chempot-diagram/ChemPotDiagram.svelte +162 -27
  18. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +451 -281
  19. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2148 -1642
  20. package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -5
  21. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  22. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  23. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  24. package/dist/chempot-diagram/chempot-worker.js +11 -0
  25. package/dist/chempot-diagram/color.js +1 -2
  26. package/dist/chempot-diagram/compute.d.ts +10 -0
  27. package/dist/chempot-diagram/compute.js +250 -88
  28. package/dist/chempot-diagram/index.d.ts +2 -1
  29. package/dist/chempot-diagram/index.js +2 -1
  30. package/dist/chempot-diagram/temperature.js +8 -9
  31. package/dist/chempot-diagram/types.d.ts +3 -0
  32. package/dist/chempot-diagram/types.js +1 -0
  33. package/dist/colors/index.d.ts +1 -1
  34. package/dist/colors/index.js +5 -3
  35. package/dist/composition/BarChart.svelte +128 -55
  36. package/dist/composition/BubbleChart.svelte +102 -49
  37. package/dist/composition/Composition.svelte +100 -79
  38. package/dist/composition/Formula.svelte +108 -62
  39. package/dist/composition/FormulaFilter.svelte +665 -537
  40. package/dist/composition/PieChart.svelte +183 -108
  41. package/dist/composition/format.d.ts +5 -0
  42. package/dist/composition/format.js +20 -3
  43. package/dist/composition/parse.js +14 -9
  44. package/dist/convex-hull/ConvexHull.svelte +93 -40
  45. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  46. package/dist/convex-hull/ConvexHull2D.svelte +549 -360
  47. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  48. package/dist/convex-hull/ConvexHull3D.svelte +1296 -827
  49. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  50. package/dist/convex-hull/ConvexHull4D.svelte +1004 -688
  51. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  52. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  53. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +1 -1
  54. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  55. package/dist/convex-hull/ConvexHullStats.svelte +425 -328
  56. package/dist/convex-hull/ConvexHullTooltip.svelte +40 -16
  57. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  58. package/dist/convex-hull/StructurePopup.svelte +25 -4
  59. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  60. package/dist/convex-hull/barycentric-coords.js +13 -7
  61. package/dist/convex-hull/demo-temperature.js +8 -4
  62. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  63. package/dist/convex-hull/helpers.d.ts +9 -0
  64. package/dist/convex-hull/helpers.js +77 -34
  65. package/dist/convex-hull/thermodynamics.js +61 -56
  66. package/dist/convex-hull/types.d.ts +9 -14
  67. package/dist/convex-hull/types.js +0 -17
  68. package/dist/coordination/CoordinationBarPlot.svelte +227 -154
  69. package/dist/element/BohrAtom.svelte +55 -12
  70. package/dist/element/ElementHeading.svelte +7 -2
  71. package/dist/element/ElementPhoto.svelte +15 -9
  72. package/dist/element/ElementStats.svelte +10 -4
  73. package/dist/element/ElementTile.svelte +137 -73
  74. package/dist/element/Nucleus.svelte +39 -11
  75. package/dist/feedback/ClickFeedback.svelte +16 -5
  76. package/dist/feedback/DragOverlay.svelte +10 -2
  77. package/dist/feedback/Spinner.svelte +4 -2
  78. package/dist/feedback/StatusMessage.svelte +8 -2
  79. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  80. package/dist/fermi-surface/FermiSurface.svelte +328 -187
  81. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  82. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  83. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  84. package/dist/fermi-surface/FermiSurfaceScene.svelte +535 -342
  85. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  86. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  87. package/dist/fermi-surface/compute.js +16 -20
  88. package/dist/fermi-surface/parse.js +24 -14
  89. package/dist/fermi-surface/symmetry.js +2 -7
  90. package/dist/fermi-surface/types.d.ts +3 -5
  91. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1019 -765
  92. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +1 -1
  93. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +76 -22
  94. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +2 -3
  95. package/dist/icons.js +47 -0
  96. package/dist/index.d.ts +2 -1
  97. package/dist/index.js +2 -1
  98. package/dist/io/decompress.js +1 -1
  99. package/dist/io/export.d.ts +3 -0
  100. package/dist/io/export.js +129 -143
  101. package/dist/io/is-binary.js +2 -3
  102. package/dist/io/url-drop.js +1 -2
  103. package/dist/isosurface/Isosurface.svelte +202 -148
  104. package/dist/isosurface/IsosurfaceControls.svelte +46 -28
  105. package/dist/isosurface/parse.js +34 -29
  106. package/dist/isosurface/slice.js +5 -10
  107. package/dist/isosurface/types.d.ts +2 -1
  108. package/dist/isosurface/types.js +61 -12
  109. package/dist/labels.js +11 -8
  110. package/dist/layout/FullscreenToggle.svelte +11 -2
  111. package/dist/layout/InfoCard.svelte +38 -6
  112. package/dist/layout/InfoTag.svelte +63 -32
  113. package/dist/layout/PropertyFilter.svelte +82 -37
  114. package/dist/layout/SettingsSection.svelte +85 -55
  115. package/dist/layout/SubpageGrid.svelte +10 -2
  116. package/dist/layout/json-tree/JsonNode.svelte +183 -138
  117. package/dist/layout/json-tree/JsonTree.svelte +499 -413
  118. package/dist/layout/json-tree/JsonValue.svelte +127 -99
  119. package/dist/layout/json-tree/utils.js +4 -2
  120. package/dist/marching-cubes.js +25 -2
  121. package/dist/math.d.ts +13 -17
  122. package/dist/math.js +133 -67
  123. package/dist/overlays/ContextMenu.svelte +65 -40
  124. package/dist/overlays/DraggablePane.svelte +211 -139
  125. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  126. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  127. package/dist/periodic-table/PropertySelect.svelte +25 -7
  128. package/dist/periodic-table/TableInset.svelte +8 -3
  129. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +446 -309
  130. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +1 -1
  131. package/dist/phase-diagram/PhaseDiagramControls.svelte +102 -43
  132. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +1 -1
  133. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +63 -40
  134. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +71 -28
  135. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +1 -1
  136. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +158 -101
  137. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  138. package/dist/phase-diagram/build-diagram.js +9 -9
  139. package/dist/phase-diagram/colors.js +1 -3
  140. package/dist/phase-diagram/parse.js +10 -9
  141. package/dist/phase-diagram/svg-to-diagram.js +53 -49
  142. package/dist/phase-diagram/utils.d.ts +1 -0
  143. package/dist/phase-diagram/utils.js +80 -25
  144. package/dist/plot/AxisLabel.svelte +28 -3
  145. package/dist/plot/BarPlot.svelte +1182 -734
  146. package/dist/plot/BarPlot.svelte.d.ts +2 -2
  147. package/dist/plot/BarPlotControls.svelte +31 -5
  148. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  149. package/dist/plot/ColorBar.svelte +479 -329
  150. package/dist/plot/ColorScaleSelect.svelte +27 -6
  151. package/dist/plot/ElementScatter.svelte +36 -15
  152. package/dist/plot/FillArea.svelte +152 -95
  153. package/dist/plot/Histogram.svelte +934 -571
  154. package/dist/plot/Histogram.svelte.d.ts +1 -1
  155. package/dist/plot/HistogramControls.svelte +53 -9
  156. package/dist/plot/HistogramControls.svelte.d.ts +1 -1
  157. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  158. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  159. package/dist/plot/Line.svelte +63 -28
  160. package/dist/plot/PlotControls.svelte +157 -114
  161. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  162. package/dist/plot/PlotLegend.svelte +174 -91
  163. package/dist/plot/PlotTooltip.svelte +45 -6
  164. package/dist/plot/PortalSelect.svelte +175 -147
  165. package/dist/plot/ReferenceLine.svelte +76 -22
  166. package/dist/plot/ReferenceLine3D.svelte +132 -107
  167. package/dist/plot/ReferencePlane.svelte +146 -121
  168. package/dist/plot/ScatterPlot.svelte +1681 -1091
  169. package/dist/plot/ScatterPlot.svelte.d.ts +2 -2
  170. package/dist/plot/ScatterPlot3D.svelte +256 -131
  171. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  172. package/dist/plot/ScatterPlot3DControls.svelte +113 -63
  173. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  174. package/dist/plot/ScatterPlot3DScene.svelte +608 -403
  175. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  176. package/dist/plot/ScatterPlotControls.svelte +65 -25
  177. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  178. package/dist/plot/ScatterPoint.svelte +98 -26
  179. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  180. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  181. package/dist/plot/Surface3D.svelte +159 -108
  182. package/dist/plot/ZeroLines.svelte +55 -3
  183. package/dist/plot/ZoomRect.svelte +4 -2
  184. package/dist/plot/axis-utils.js +1 -3
  185. package/dist/plot/data-cleaning.js +12 -28
  186. package/dist/plot/data-transform.js +2 -1
  187. package/dist/plot/fill-utils.js +2 -0
  188. package/dist/plot/layout.d.ts +4 -1
  189. package/dist/plot/layout.js +33 -14
  190. package/dist/plot/reference-line.d.ts +2 -2
  191. package/dist/plot/reference-line.js +7 -5
  192. package/dist/plot/scales.js +24 -36
  193. package/dist/plot/types.d.ts +11 -23
  194. package/dist/plot/types.js +6 -11
  195. package/dist/plot/utils/label-placement.d.ts +32 -15
  196. package/dist/plot/utils/label-placement.js +227 -66
  197. package/dist/plot/utils/series-visibility.js +2 -3
  198. package/dist/rdf/RdfPlot.svelte +143 -91
  199. package/dist/rdf/calc-rdf.js +4 -5
  200. package/dist/sanitize.d.ts +4 -0
  201. package/dist/sanitize.js +107 -0
  202. package/dist/settings.d.ts +18 -6
  203. package/dist/settings.js +46 -16
  204. package/dist/spectral/Bands.svelte +632 -453
  205. package/dist/spectral/BandsAndDos.svelte +90 -49
  206. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  207. package/dist/spectral/Dos.svelte +389 -258
  208. package/dist/spectral/helpers.js +55 -43
  209. package/dist/state.svelte.d.ts +1 -1
  210. package/dist/state.svelte.js +3 -2
  211. package/dist/structure/Arrow.svelte +59 -20
  212. package/dist/structure/AtomLegend.svelte +215 -134
  213. package/dist/structure/Bond.svelte +73 -47
  214. package/dist/structure/CanvasTooltip.svelte +10 -2
  215. package/dist/structure/CellSelect.svelte +72 -45
  216. package/dist/structure/Cylinder.svelte +33 -17
  217. package/dist/structure/Lattice.svelte +88 -33
  218. package/dist/structure/Structure.svelte +1063 -797
  219. package/dist/structure/Structure.svelte.d.ts +1 -1
  220. package/dist/structure/StructureControls.svelte +349 -118
  221. package/dist/structure/StructureExportPane.svelte +124 -89
  222. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  223. package/dist/structure/StructureInfoPane.svelte +304 -237
  224. package/dist/structure/StructureScene.svelte +879 -443
  225. package/dist/structure/StructureScene.svelte.d.ts +15 -7
  226. package/dist/structure/atom-properties.js +8 -8
  227. package/dist/structure/bonding.js +6 -7
  228. package/dist/structure/export.js +14 -29
  229. package/dist/structure/ferrox-wasm.js +1 -1
  230. package/dist/structure/index.d.ts +13 -3
  231. package/dist/structure/index.js +83 -23
  232. package/dist/structure/measure.d.ts +2 -2
  233. package/dist/structure/measure.js +4 -44
  234. package/dist/structure/parse.js +113 -141
  235. package/dist/structure/partial-occupancy.js +7 -10
  236. package/dist/structure/pbc.d.ts +1 -0
  237. package/dist/structure/pbc.js +16 -6
  238. package/dist/structure/supercell.d.ts +2 -2
  239. package/dist/structure/supercell.js +12 -22
  240. package/dist/structure/validation.js +1 -2
  241. package/dist/symmetry/SymmetryStats.svelte +84 -41
  242. package/dist/symmetry/WyckoffTable.svelte +26 -6
  243. package/dist/symmetry/cell-transform.js +5 -3
  244. package/dist/symmetry/index.js +8 -7
  245. package/dist/symmetry/spacegroups.js +148 -148
  246. package/dist/table/HeatmapTable.svelte +790 -554
  247. package/dist/table/HeatmapTable.svelte.d.ts +1 -1
  248. package/dist/table/ToggleMenu.svelte +125 -92
  249. package/dist/table/index.js +2 -4
  250. package/dist/theme/ThemeControl.svelte +21 -12
  251. package/dist/time.js +4 -1
  252. package/dist/tooltip/TooltipContent.svelte +33 -8
  253. package/dist/trajectory/Trajectory.svelte +758 -558
  254. package/dist/trajectory/TrajectoryError.svelte +14 -3
  255. package/dist/trajectory/TrajectoryExportPane.svelte +137 -83
  256. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  257. package/dist/trajectory/extract.js +10 -26
  258. package/dist/trajectory/format-detect.js +5 -5
  259. package/dist/trajectory/frame-reader.d.ts +1 -1
  260. package/dist/trajectory/frame-reader.js +5 -12
  261. package/dist/trajectory/helpers.d.ts +0 -1
  262. package/dist/trajectory/helpers.js +2 -17
  263. package/dist/trajectory/index.js +14 -12
  264. package/dist/trajectory/parse/ase.js +5 -4
  265. package/dist/trajectory/parse/hdf5.js +26 -18
  266. package/dist/trajectory/parse/index.js +13 -18
  267. package/dist/trajectory/parse/lammps.js +17 -7
  268. package/dist/trajectory/parse/vasp.js +5 -2
  269. package/dist/trajectory/parse/xyz.js +8 -7
  270. package/dist/trajectory/plotting.js +13 -8
  271. package/dist/utils.d.ts +1 -0
  272. package/dist/utils.js +13 -0
  273. package/dist/xrd/XrdPlot.svelte +337 -247
  274. package/dist/xrd/broadening.js +14 -9
  275. package/dist/xrd/calc-xrd.js +12 -18
  276. package/dist/xrd/parse.d.ts +1 -1
  277. package/dist/xrd/parse.js +17 -17
  278. package/package.json +99 -103
  279. package/readme.md +1 -1
  280. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,154 +1,223 @@
1
- <script lang="ts">import Icon from '../Icon.svelte';
2
- import { draggable, tooltip } from 'svelte-multiselect/attachments';
3
- let { show = $bindable(false), show_pane = true, children, toggle_props = {}, open_icon = `Cross`, closed_icon = `Settings`, icon_style = ``, offset = { x: 5, y: 5 }, max_width = `450px`, pane_props = {}, onclose = () => { }, on_drag_start = () => { }, toggle_pane_btn = $bindable(), pane_div = $bindable(), persistent = false, has_been_dragged = $bindable(false), currently_dragging = $bindable(false), resizable = `none`, } = $props();
4
- let initial_position = $state({ left: `50px`, top: `50px` });
5
- let show_control_buttons = $state(false);
6
- let resizing = $state(false);
7
- // Resize via bottom-right grip
8
- function handle_resize_start(event) {
9
- if (resizable === `none` || !pane_div)
10
- return;
11
- event.preventDefault();
12
- event.stopPropagation();
13
- resizing = true;
14
- has_been_dragged = true;
15
- show_control_buttons = true;
16
- const start_x = event.clientX;
17
- const start_y = event.clientY;
18
- const start_w = pane_div.offsetWidth;
19
- const start_h = pane_div.offsetHeight;
20
- function on_move(evt) {
21
- if (!pane_div)
22
- return;
23
- if (resizable !== `height`) {
24
- pane_div.style.width = `${Math.max(200, start_w + evt.clientX - start_x)}px`;
25
- }
26
- if (resizable !== `width`) {
27
- pane_div.style.maxHeight = `${Math.max(100, start_h + evt.clientY - start_y)}px`;
28
- }
1
+ <script lang="ts">
2
+ import Icon from '../Icon.svelte'
3
+ import type { IconName } from '../icons'
4
+ import type { Snippet } from 'svelte'
5
+ import { draggable, tooltip } from 'svelte-multiselect/attachments'
6
+ import type { HTMLAttributes } from 'svelte/elements'
7
+
8
+ let {
9
+ show = $bindable(false),
10
+ show_pane = true,
11
+ children,
12
+ toggle_props = {},
13
+ open_icon = `Cross`,
14
+ closed_icon = `Settings`,
15
+ icon_style = ``,
16
+ offset = { x: 5, y: 5 },
17
+ max_width = `450px`,
18
+ pane_props = {},
19
+ onclose = () => {},
20
+ on_drag_start = () => {},
21
+ toggle_pane_btn = $bindable(),
22
+ pane_div = $bindable(),
23
+ persistent = false,
24
+ has_been_dragged = $bindable(false),
25
+ currently_dragging = $bindable(false),
26
+ resizable = `none`,
27
+ }: {
28
+ show?: boolean
29
+ show_pane?: boolean
30
+ children: Snippet<
31
+ [{
32
+ show: boolean
33
+ show_control_buttons: boolean
34
+ has_been_dragged: boolean
35
+ currently_dragging: boolean
36
+ }]
37
+ >
38
+ // Toggle button
39
+ toggle_props?: HTMLAttributes<HTMLButtonElement>
40
+ open_icon?: IconName
41
+ closed_icon?: IconName
42
+ icon_style?: string
43
+ // Pane positioning and styling
44
+ offset?: { x?: number; y?: number }
45
+ max_width?: string
46
+ pane_props?: HTMLAttributes<HTMLDivElement>
47
+ // If true, only closes via Escape or explicit close button (not click-outside)
48
+ persistent?: boolean
49
+ // Resize mode: 'both' | 'width' | 'height' | 'none'
50
+ resizable?: `both` | `width` | `height` | `none`
51
+ // Callbacks
52
+ onclose?: () => void
53
+ on_drag_start?: () => void
54
+ // Bindable state
55
+ toggle_pane_btn?: HTMLButtonElement
56
+ pane_div?: HTMLDivElement
57
+ has_been_dragged?: boolean
58
+ currently_dragging?: boolean
59
+ } = $props()
60
+
61
+ let initial_position = $state({ left: `50px`, top: `50px` })
62
+ let show_control_buttons = $state(false)
63
+ let resizing = $state(false)
64
+ let resize_end_time = 0
65
+
66
+ // Resize via bottom-right grip
67
+ function handle_resize_start(event: PointerEvent) {
68
+ if (resizable === `none` || !pane_div) return
69
+ event.preventDefault()
70
+ event.stopPropagation()
71
+ resizing = true
72
+ has_been_dragged = true
73
+ show_control_buttons = true
74
+ const start_x = event.clientX
75
+ const start_y = event.clientY
76
+ const start_w = pane_div.offsetWidth
77
+ const start_h = pane_div.offsetHeight
78
+
79
+ function on_move(evt: PointerEvent) {
80
+ if (!pane_div) return
81
+ if (resizable !== `height`) {
82
+ pane_div.style.width = `${Math.max(200, start_w + evt.clientX - start_x)}px`
83
+ }
84
+ if (resizable !== `width`) {
85
+ pane_div.style.maxHeight = `${
86
+ Math.max(100, start_h + evt.clientY - start_y)
87
+ }px`
88
+ }
29
89
  }
30
90
  function on_up() {
31
- document.removeEventListener(`pointermove`, on_move);
32
- document.removeEventListener(`pointerup`, on_up);
33
- // Swallow the click that fires after pointerup to prevent the
34
- // click-outside handler from closing the pane. Use
35
- // stopImmediatePropagation so same-element bubble listeners
36
- // (like Svelte's document onclick) are also blocked.
37
- document.addEventListener(`click`, (evt) => evt.stopImmediatePropagation(), { capture: true, once: true });
38
- // Delay clearing the resizing flag so any late-arriving click events
39
- // are still suppressed by the handle_click_outside guard
40
- setTimeout(() => {
41
- resizing = false;
42
- }, 150);
91
+ document.removeEventListener(`pointermove`, on_move)
92
+ document.removeEventListener(`pointerup`, on_up)
93
+ resize_end_time = Date.now()
94
+ requestAnimationFrame(() => {
95
+ resizing = false
96
+ })
43
97
  }
44
- document.addEventListener(`pointermove`, on_move);
45
- document.addEventListener(`pointerup`, on_up);
46
- }
47
- function toggle_pane(event) {
48
- event.stopPropagation();
49
- show = !show;
50
- if (!show)
51
- onclose();
52
- }
53
- function close_pane() {
54
- show = false;
55
- onclose();
56
- }
57
- function reset_position() {
98
+ document.addEventListener(`pointermove`, on_move)
99
+ document.addEventListener(`pointerup`, on_up)
100
+ }
101
+
102
+ function toggle_pane(event: MouseEvent) {
103
+ event.stopPropagation()
104
+ show = !show
105
+ if (!show) onclose()
106
+ }
107
+
108
+ function close_pane() {
109
+ show = false
110
+ onclose()
111
+ }
112
+
113
+ function reset_position() {
58
114
  if (toggle_pane_btn) {
59
- const pos = calculate_position();
60
- initial_position = pos;
61
- if (pane_div) {
62
- Object.assign(pane_div.style, {
63
- left: pos.left,
64
- top: pos.top,
65
- right: `auto`,
66
- bottom: `auto`,
67
- width: ``,
68
- maxHeight: ``,
69
- });
70
- }
115
+ const pos = calculate_position()
116
+ initial_position = pos
117
+ if (pane_div) {
118
+ Object.assign(pane_div.style, {
119
+ left: pos.left,
120
+ top: pos.top,
121
+ right: `auto`,
122
+ bottom: `auto`,
123
+ width: ``,
124
+ maxHeight: ``,
125
+ })
126
+ }
71
127
  }
72
128
  // Hide the control buttons after reset
73
- show_control_buttons = false;
74
- has_been_dragged = false;
75
- }
76
- // Drag handlers
77
- function handle_drag_start() {
78
- has_been_dragged = true;
79
- show_control_buttons = true;
80
- currently_dragging = true;
81
- on_drag_start();
82
- }
83
- // Position calculation
84
- function calculate_position() {
85
- if (!toggle_pane_btn)
86
- return { left: `50px`, top: `50px` };
87
- const toggle_rect = toggle_pane_btn.getBoundingClientRect();
88
- const pane_width = pane_div?.getBoundingClientRect().width || 450;
89
- const positioned_ancestor = toggle_pane_btn.offsetParent;
90
- const ancestor_rect = positioned_ancestor?.getBoundingClientRect();
129
+ show_control_buttons = false
130
+ has_been_dragged = false
131
+ }
132
+
133
+ // Drag handlers
134
+ function handle_drag_start() {
135
+ has_been_dragged = true
136
+ show_control_buttons = true
137
+ currently_dragging = true
138
+ on_drag_start()
139
+ }
140
+
141
+ // Position calculation
142
+ function calculate_position() {
143
+ if (!toggle_pane_btn) return { left: `50px`, top: `50px` }
144
+
145
+ const toggle_rect = toggle_pane_btn.getBoundingClientRect()
146
+ const pane_width = pane_div?.getBoundingClientRect().width || 450
147
+ const ox = offset.x ?? 5
148
+ const oy = offset.y ?? 5
149
+ const positioned_ancestor = toggle_pane_btn.offsetParent
150
+ const ancestor_rect = positioned_ancestor?.getBoundingClientRect()
151
+
91
152
  if (!ancestor_rect) { // Fallback to document positioning
92
- const scroll_x = window.scrollX || document.documentElement.scrollLeft;
93
- const scroll_y = window.scrollY || document.documentElement.scrollTop;
94
- return {
95
- left: `${toggle_rect.right - pane_width + (offset.x ?? 5) + scroll_x}px`,
96
- top: `${toggle_rect.bottom + (offset.y ?? 5) + scroll_y}px`,
97
- };
153
+ const scroll_x = window.scrollX || document.documentElement.scrollLeft
154
+ const scroll_y = window.scrollY || document.documentElement.scrollTop
155
+ return {
156
+ left: `${toggle_rect.right - pane_width + ox + scroll_x}px`,
157
+ top: `${toggle_rect.bottom + oy + scroll_y}px`,
158
+ }
159
+ }
160
+
161
+ return {
162
+ left: `${toggle_rect.right - ancestor_rect.left - pane_width + ox}px`,
163
+ top: `${toggle_rect.bottom - ancestor_rect.top + oy}px`,
98
164
  }
99
- const left = `${toggle_rect.right - ancestor_rect.left - pane_width + (offset.x ?? 5)}px`;
100
- const top = `${toggle_rect.bottom - ancestor_rect.top + (offset.y ?? 5)}px`;
101
- return { left, top }; // Position relative to positioned ancestor
102
- }
103
- // Click outside handler (skipped when persistent)
104
- function handle_click_outside(event) {
105
- if (!show || persistent)
106
- return;
107
- const target = event.target;
165
+ }
166
+
167
+ // Click outside handler (skipped when persistent)
168
+ function handle_click_outside(event: MouseEvent) {
169
+ if (!show || persistent) return
170
+ // Ignore click events fired shortly after a resize/drag operation ends
171
+ // (Playwright and some browsers synthesize a click after pointer up)
172
+ if (Date.now() - resize_end_time < 200) return
173
+
174
+ const target = event.target
108
175
  const is_toggle_button = target instanceof Node && toggle_pane_btn &&
109
- (target === toggle_pane_btn || toggle_pane_btn.contains(target));
176
+ (target === toggle_pane_btn || toggle_pane_btn.contains(target))
110
177
  const is_inside_pane = target instanceof Node && pane_div &&
111
- (target === pane_div || pane_div.contains(target));
178
+ (target === pane_div || pane_div.contains(target))
179
+
112
180
  if (!is_toggle_button && !is_inside_pane && !currently_dragging && !resizing) {
113
- close_pane();
181
+ close_pane()
114
182
  }
115
- }
116
- // Debounced resize handler for better performance
117
- let resize_timeout = $state(undefined);
118
- function handle_resize() {
119
- if (!show || has_been_dragged || currently_dragging)
120
- return;
121
- if (resize_timeout)
122
- clearTimeout(resize_timeout);
183
+ }
184
+
185
+ // Debounced resize handler for better performance
186
+ let resize_timeout: ReturnType<typeof setTimeout> | undefined = $state(undefined)
187
+
188
+ function handle_resize() { // Only reposition if pane is visible and hasn't been manually dragged
189
+ if (!show || has_been_dragged || currently_dragging) return
190
+
191
+ if (resize_timeout) clearTimeout(resize_timeout)
123
192
  const current_timeout = setTimeout(() => {
124
- if (resize_timeout !== current_timeout)
125
- return;
126
- if (show && toggle_pane_btn && !has_been_dragged && pane_div) {
127
- const pos = calculate_position();
128
- initial_position = pos;
129
- pane_div.style.left = pos.left;
130
- pane_div.style.top = pos.top;
131
- }
132
- }, 50); // Debounce resize events
133
- resize_timeout = current_timeout;
134
- }
135
- // Position pane when shown
136
- $effect(() => {
193
+ if (resize_timeout !== current_timeout) return
194
+ if (show && toggle_pane_btn && !has_been_dragged && pane_div) {
195
+ const pos = calculate_position()
196
+ initial_position = pos
197
+ pane_div.style.left = pos.left
198
+ pane_div.style.top = pos.top
199
+ }
200
+ }, 50) // Debounce resize events
201
+ resize_timeout = current_timeout
202
+ }
203
+
204
+ // Position pane when shown
205
+ $effect(() => {
137
206
  if (show && toggle_pane_btn && !has_been_dragged) {
138
- const pos = calculate_position();
139
- initial_position = pos;
140
- if (pane_div) {
141
- Object.assign(pane_div.style, {
142
- left: pos.left,
143
- top: pos.top,
144
- right: `auto`,
145
- bottom: `auto`,
146
- width: ``,
147
- maxHeight: ``,
148
- });
149
- }
207
+ const pos = calculate_position()
208
+ initial_position = pos
209
+ if (pane_div) {
210
+ Object.assign(pane_div.style, {
211
+ left: pos.left,
212
+ top: pos.top,
213
+ right: `auto`,
214
+ bottom: `auto`,
215
+ width: ``,
216
+ maxHeight: ``,
217
+ })
218
+ }
150
219
  }
151
- });
220
+ })
152
221
  </script>
153
222
 
154
223
  <svelte:window
@@ -374,16 +443,19 @@ $effect(() => {
374
443
  display: none;
375
444
  }
376
445
  .draggable-pane :global(:where(button)) {
377
- width: max-content;
378
446
  background-color: var(
379
447
  --pane-btn-bg,
380
- var(--btn-bg, light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.1)))
448
+ var(--btn-bg, light-dark(rgba(0, 0, 0, 0.04), rgba(255, 255, 255, 0.1)))
381
449
  );
382
450
  }
451
+ .draggable-pane .pane-content :global(:where(button)) {
452
+ font-size: 1em;
453
+ padding: var(--pane-btn-padding, 3px 6px);
454
+ }
383
455
  .draggable-pane :global(:where(button:hover)) {
384
456
  background-color: var(
385
457
  --pane-btn-bg-hover,
386
- var(--btn-bg-hover, light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.2)))
458
+ var(--btn-bg-hover, light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.2)))
387
459
  );
388
460
  }
389
461
  .draggable-pane :global(select) {