matterviz 0.3.0 → 0.3.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 (286) hide show
  1. package/dist/FilePicker.svelte +37 -20
  2. package/dist/Icon.svelte +2 -2
  3. package/dist/MillerIndexInput.svelte +60 -0
  4. package/dist/MillerIndexInput.svelte.d.ts +7 -0
  5. package/dist/app.css +38 -2
  6. package/dist/brillouin/BrillouinZone.svelte +20 -62
  7. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  8. package/dist/brillouin/BrillouinZoneExportPane.svelte +12 -20
  9. package/dist/brillouin/BrillouinZoneScene.svelte +2 -2
  10. package/dist/brillouin/BrillouinZoneScene.svelte.d.ts +1 -1
  11. package/dist/chempot-diagram/ChemPotDiagram.svelte +192 -0
  12. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  13. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +677 -0
  14. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  15. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +2688 -0
  16. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  17. package/dist/chempot-diagram/ChemPotScene3D.svelte +8 -0
  18. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  19. package/dist/chempot-diagram/color.d.ts +10 -0
  20. package/dist/chempot-diagram/color.js +33 -0
  21. package/dist/chempot-diagram/compute.d.ts +38 -0
  22. package/dist/chempot-diagram/compute.js +650 -0
  23. package/dist/chempot-diagram/index.d.ts +5 -0
  24. package/dist/chempot-diagram/index.js +5 -0
  25. package/dist/chempot-diagram/pointer.d.ts +16 -0
  26. package/dist/chempot-diagram/pointer.js +40 -0
  27. package/dist/chempot-diagram/temperature.d.ts +15 -0
  28. package/dist/chempot-diagram/temperature.js +37 -0
  29. package/dist/chempot-diagram/types.d.ts +83 -0
  30. package/dist/chempot-diagram/types.js +27 -0
  31. package/dist/colors/index.d.ts +3 -1
  32. package/dist/colors/index.js +4 -0
  33. package/dist/composition/BarChart.svelte +13 -22
  34. package/dist/composition/BubbleChart.svelte +5 -3
  35. package/dist/composition/FormulaFilter.svelte +770 -90
  36. package/dist/composition/FormulaFilter.svelte.d.ts +37 -1
  37. package/dist/composition/PieChart.svelte +43 -18
  38. package/dist/composition/PieChart.svelte.d.ts +1 -1
  39. package/dist/constants.d.ts +1 -0
  40. package/dist/constants.js +2 -0
  41. package/dist/convex-hull/ConvexHull.svelte +14 -1
  42. package/dist/convex-hull/ConvexHull.svelte.d.ts +1 -1
  43. package/dist/convex-hull/ConvexHull2D.svelte +14 -45
  44. package/dist/convex-hull/ConvexHull2D.svelte.d.ts +1 -1
  45. package/dist/convex-hull/ConvexHull3D.svelte +396 -134
  46. package/dist/convex-hull/ConvexHull3D.svelte.d.ts +1 -1
  47. package/dist/convex-hull/ConvexHull4D.svelte +93 -42
  48. package/dist/convex-hull/ConvexHull4D.svelte.d.ts +1 -1
  49. package/dist/convex-hull/ConvexHullControls.svelte +94 -31
  50. package/dist/convex-hull/ConvexHullControls.svelte.d.ts +4 -2
  51. package/dist/convex-hull/ConvexHullStats.svelte +697 -128
  52. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  53. package/dist/convex-hull/ConvexHullTooltip.svelte +1 -0
  54. package/dist/convex-hull/GasPressureControls.svelte +72 -38
  55. package/dist/convex-hull/GasPressureControls.svelte.d.ts +2 -1
  56. package/dist/convex-hull/TemperatureSlider.svelte +46 -19
  57. package/dist/convex-hull/TemperatureSlider.svelte.d.ts +2 -1
  58. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  59. package/dist/convex-hull/demo-temperature.js +36 -0
  60. package/dist/convex-hull/gas-thermodynamics.js +16 -5
  61. package/dist/convex-hull/helpers.d.ts +7 -1
  62. package/dist/convex-hull/helpers.js +45 -15
  63. package/dist/convex-hull/index.d.ts +15 -1
  64. package/dist/convex-hull/index.js +1 -0
  65. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  66. package/dist/convex-hull/thermodynamics.js +106 -17
  67. package/dist/convex-hull/types.d.ts +7 -0
  68. package/dist/convex-hull/types.js +11 -0
  69. package/dist/coordination/CoordinationBarPlot.svelte +29 -46
  70. package/dist/element/BohrAtom.svelte +1 -1
  71. package/dist/element/data.js +2 -14
  72. package/dist/element/data.json.gz +0 -0
  73. package/dist/element/index.d.ts +1 -1
  74. package/dist/element/index.js +1 -0
  75. package/dist/element/types.d.ts +1 -0
  76. package/dist/fermi-surface/FermiSurface.svelte +21 -65
  77. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  78. package/dist/fermi-surface/FermiSurfaceControls.svelte.d.ts +1 -1
  79. package/dist/fermi-surface/FermiSurfaceScene.svelte +1 -1
  80. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  81. package/dist/fermi-surface/compute.js +1 -21
  82. package/dist/fermi-surface/marching-cubes.d.ts +2 -13
  83. package/dist/fermi-surface/marching-cubes.js +2 -519
  84. package/dist/fermi-surface/parse.js +17 -23
  85. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1273 -0
  86. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  87. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +171 -0
  88. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +31 -0
  89. package/dist/heatmap-matrix/index.d.ts +53 -0
  90. package/dist/heatmap-matrix/index.js +100 -0
  91. package/dist/heatmap-matrix/shared.d.ts +2 -0
  92. package/dist/heatmap-matrix/shared.js +4 -0
  93. package/dist/icons.d.ts +119 -0
  94. package/dist/icons.js +119 -0
  95. package/dist/index.d.ts +6 -1
  96. package/dist/index.js +6 -1
  97. package/dist/io/export.js +15 -3
  98. package/dist/io/file-drop.d.ts +7 -0
  99. package/dist/io/file-drop.js +43 -0
  100. package/dist/io/index.d.ts +2 -2
  101. package/dist/io/index.js +2 -112
  102. package/dist/io/types.d.ts +1 -0
  103. package/dist/io/url-drop.d.ts +2 -0
  104. package/dist/io/url-drop.js +118 -0
  105. package/dist/isosurface/Isosurface.svelte +231 -0
  106. package/dist/isosurface/Isosurface.svelte.d.ts +8 -0
  107. package/dist/isosurface/IsosurfaceControls.svelte +273 -0
  108. package/dist/isosurface/IsosurfaceControls.svelte.d.ts +9 -0
  109. package/dist/isosurface/index.d.ts +5 -0
  110. package/dist/isosurface/index.js +6 -0
  111. package/dist/isosurface/parse.d.ts +6 -0
  112. package/dist/isosurface/parse.js +548 -0
  113. package/dist/isosurface/slice.d.ts +11 -0
  114. package/dist/isosurface/slice.js +145 -0
  115. package/dist/isosurface/types.d.ts +55 -0
  116. package/dist/isosurface/types.js +178 -0
  117. package/dist/labels.d.ts +2 -1
  118. package/dist/labels.js +1 -0
  119. package/dist/layout/InfoTag.svelte +62 -62
  120. package/dist/layout/SubpageGrid.svelte +74 -0
  121. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  122. package/dist/layout/index.d.ts +1 -0
  123. package/dist/layout/index.js +1 -0
  124. package/dist/layout/json-tree/JsonNode.svelte +226 -53
  125. package/dist/layout/json-tree/JsonTree.svelte +425 -51
  126. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  127. package/dist/layout/json-tree/JsonValue.svelte +218 -97
  128. package/dist/layout/json-tree/types.d.ts +27 -2
  129. package/dist/layout/json-tree/utils.d.ts +14 -1
  130. package/dist/layout/json-tree/utils.js +254 -0
  131. package/dist/marching-cubes.d.ts +14 -0
  132. package/dist/marching-cubes.js +519 -0
  133. package/dist/math.d.ts +8 -0
  134. package/dist/math.js +374 -7
  135. package/dist/overlays/ContextMenu.svelte +3 -2
  136. package/dist/overlays/DraggablePane.svelte +163 -58
  137. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  138. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +232 -77
  139. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  140. package/dist/phase-diagram/PhaseDiagramControls.svelte +32 -11
  141. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  142. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +103 -0
  143. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  144. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +102 -95
  145. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +7 -0
  146. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +100 -26
  147. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  148. package/dist/phase-diagram/index.d.ts +2 -0
  149. package/dist/phase-diagram/index.js +2 -0
  150. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  151. package/dist/phase-diagram/svg-to-diagram.js +865 -0
  152. package/dist/phase-diagram/types.d.ts +10 -0
  153. package/dist/phase-diagram/utils.d.ts +7 -4
  154. package/dist/phase-diagram/utils.js +149 -59
  155. package/dist/plot/AxisLabel.svelte +26 -0
  156. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  157. package/dist/plot/BarPlot.svelte +473 -228
  158. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  159. package/dist/plot/BarPlotControls.svelte +3 -2
  160. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  161. package/dist/plot/ColorBar.svelte +54 -54
  162. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  163. package/dist/plot/ElementScatter.svelte +4 -3
  164. package/dist/plot/FillArea.svelte +4 -1
  165. package/dist/plot/Histogram.svelte +320 -230
  166. package/dist/plot/Histogram.svelte.d.ts +2 -2
  167. package/dist/plot/HistogramControls.svelte +29 -10
  168. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  169. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +2 -2
  170. package/dist/plot/PlotControls.svelte +109 -27
  171. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  172. package/dist/plot/PlotLegend.svelte +1 -1
  173. package/dist/plot/PortalSelect.svelte +2 -1
  174. package/dist/plot/ReferenceLine.svelte +2 -1
  175. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  176. package/dist/plot/ReferencePlane.svelte +1 -3
  177. package/dist/plot/ScatterPlot.svelte +343 -209
  178. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  179. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  180. package/dist/plot/ScatterPlot3DControls.svelte +203 -250
  181. package/dist/plot/ScatterPlot3DScene.svelte +4 -7
  182. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  183. package/dist/plot/ScatterPlotControls.svelte +95 -55
  184. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  185. package/dist/plot/ZeroLines.svelte +44 -0
  186. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  187. package/dist/plot/ZoomRect.svelte +21 -0
  188. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  189. package/dist/plot/axis-utils.d.ts +1 -1
  190. package/dist/plot/data-cleaning.js +1 -5
  191. package/dist/plot/index.d.ts +6 -2
  192. package/dist/plot/index.js +6 -2
  193. package/dist/plot/interactions.d.ts +8 -10
  194. package/dist/plot/interactions.js +10 -19
  195. package/dist/plot/layout.d.ts +7 -1
  196. package/dist/plot/layout.js +12 -4
  197. package/dist/plot/reference-line.d.ts +4 -21
  198. package/dist/plot/reference-line.js +7 -81
  199. package/dist/plot/types.d.ts +42 -17
  200. package/dist/plot/types.js +10 -0
  201. package/dist/plot/utils/label-placement.js +14 -11
  202. package/dist/plot/utils.d.ts +1 -0
  203. package/dist/plot/utils.js +14 -0
  204. package/dist/rdf/RdfPlot.svelte +55 -66
  205. package/dist/rdf/RdfPlot.svelte.d.ts +1 -1
  206. package/dist/rdf/index.d.ts +1 -1
  207. package/dist/rdf/index.js +1 -1
  208. package/dist/settings.d.ts +5 -0
  209. package/dist/settings.js +37 -3
  210. package/dist/spectral/Bands.svelte +515 -143
  211. package/dist/spectral/Bands.svelte.d.ts +22 -2
  212. package/dist/spectral/helpers.d.ts +23 -1
  213. package/dist/spectral/helpers.js +65 -9
  214. package/dist/spectral/types.d.ts +2 -0
  215. package/dist/structure/AtomLegend.svelte +31 -10
  216. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  217. package/dist/structure/CellSelect.svelte +92 -22
  218. package/dist/structure/Lattice.svelte +2 -0
  219. package/dist/structure/Structure.svelte +716 -173
  220. package/dist/structure/Structure.svelte.d.ts +7 -2
  221. package/dist/structure/StructureControls.svelte +26 -14
  222. package/dist/structure/StructureControls.svelte.d.ts +5 -1
  223. package/dist/structure/StructureInfoPane.svelte +7 -1
  224. package/dist/structure/StructureScene.svelte +386 -95
  225. package/dist/structure/StructureScene.svelte.d.ts +15 -4
  226. package/dist/structure/atom-properties.d.ts +6 -2
  227. package/dist/structure/atom-properties.js +38 -25
  228. package/dist/structure/export.js +10 -7
  229. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  230. package/dist/structure/ferrox-wasm-types.js +0 -3
  231. package/dist/structure/ferrox-wasm.d.ts +3 -2
  232. package/dist/structure/ferrox-wasm.js +1 -2
  233. package/dist/structure/index.d.ts +7 -0
  234. package/dist/structure/index.js +22 -0
  235. package/dist/structure/parse.js +19 -16
  236. package/dist/structure/partial-occupancy.d.ts +25 -0
  237. package/dist/structure/partial-occupancy.js +102 -0
  238. package/dist/structure/validation.js +6 -3
  239. package/dist/symmetry/SymmetryStats.svelte +18 -4
  240. package/dist/symmetry/WyckoffTable.svelte +18 -10
  241. package/dist/symmetry/index.d.ts +7 -4
  242. package/dist/symmetry/index.js +83 -18
  243. package/dist/table/HeatmapTable.svelte +468 -69
  244. package/dist/table/HeatmapTable.svelte.d.ts +13 -1
  245. package/dist/table/ToggleMenu.svelte +291 -44
  246. package/dist/table/ToggleMenu.svelte.d.ts +4 -1
  247. package/dist/table/index.d.ts +3 -0
  248. package/dist/tooltip/index.d.ts +1 -1
  249. package/dist/tooltip/index.js +1 -0
  250. package/dist/trajectory/Trajectory.svelte +147 -145
  251. package/dist/trajectory/TrajectoryExportPane.svelte +13 -9
  252. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  253. package/dist/trajectory/constants.d.ts +6 -0
  254. package/dist/trajectory/constants.js +7 -0
  255. package/dist/trajectory/extract.js +3 -5
  256. package/dist/trajectory/format-detect.d.ts +9 -0
  257. package/dist/trajectory/format-detect.js +76 -0
  258. package/dist/trajectory/frame-reader.d.ts +17 -0
  259. package/dist/trajectory/frame-reader.js +339 -0
  260. package/dist/trajectory/helpers.d.ts +15 -0
  261. package/dist/trajectory/helpers.js +187 -0
  262. package/dist/trajectory/index.d.ts +1 -0
  263. package/dist/trajectory/index.js +11 -4
  264. package/dist/trajectory/parse/ase.d.ts +2 -0
  265. package/dist/trajectory/parse/ase.js +76 -0
  266. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  267. package/dist/trajectory/parse/hdf5.js +121 -0
  268. package/dist/trajectory/parse/index.d.ts +12 -0
  269. package/dist/trajectory/parse/index.js +304 -0
  270. package/dist/trajectory/parse/lammps.d.ts +5 -0
  271. package/dist/trajectory/parse/lammps.js +169 -0
  272. package/dist/trajectory/parse/vasp.d.ts +2 -0
  273. package/dist/trajectory/parse/vasp.js +65 -0
  274. package/dist/trajectory/parse/xyz.d.ts +2 -0
  275. package/dist/trajectory/parse/xyz.js +109 -0
  276. package/dist/trajectory/types.d.ts +11 -0
  277. package/dist/trajectory/types.js +1 -0
  278. package/dist/utils.d.ts +2 -0
  279. package/dist/utils.js +4 -0
  280. package/dist/xrd/XrdPlot.svelte +6 -4
  281. package/dist/xrd/calc-xrd.js +0 -1
  282. package/package.json +33 -23
  283. package/readme.md +4 -4
  284. package/dist/trajectory/parse.d.ts +0 -42
  285. package/dist/trajectory/parse.js +0 -1267
  286. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
@@ -1,8 +1,49 @@
1
1
  <script lang="ts">import Icon from '../Icon.svelte';
2
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(), has_been_dragged = $bindable(false), currently_dragging = $bindable(false), } = $props();
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
4
  let initial_position = $state({ left: `50px`, top: `50px` });
5
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
+ }
29
+ }
30
+ 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);
43
+ }
44
+ document.addEventListener(`pointermove`, on_move);
45
+ document.addEventListener(`pointerup`, on_up);
46
+ }
6
47
  function toggle_pane(event) {
7
48
  event.stopPropagation();
8
49
  show = !show;
@@ -24,6 +65,7 @@ function reset_position() {
24
65
  right: `auto`,
25
66
  bottom: `auto`,
26
67
  width: ``,
68
+ maxHeight: ``,
27
69
  });
28
70
  }
29
71
  }
@@ -58,17 +100,18 @@ function calculate_position() {
58
100
  const top = `${toggle_rect.bottom - ancestor_rect.top + (offset.y ?? 5)}px`;
59
101
  return { left, top }; // Position relative to positioned ancestor
60
102
  }
61
- // Click outside handler
103
+ // Click outside handler (skipped when persistent)
62
104
  function handle_click_outside(event) {
63
- if (!show)
105
+ if (!show || persistent)
64
106
  return;
65
107
  const target = event.target;
66
- const is_toggle_button = toggle_pane_btn &&
108
+ const is_toggle_button = target instanceof Node && toggle_pane_btn &&
67
109
  (target === toggle_pane_btn || toggle_pane_btn.contains(target));
68
- const is_inside_pane = pane_div &&
110
+ const is_inside_pane = target instanceof Node && pane_div &&
69
111
  (target === pane_div || pane_div.contains(target));
70
- if (!is_toggle_button && !is_inside_pane && !currently_dragging)
112
+ if (!is_toggle_button && !is_inside_pane && !currently_dragging && !resizing) {
71
113
  close_pane();
114
+ }
72
115
  }
73
116
  // Debounced resize handler for better performance
74
117
  let resize_timeout = $state(undefined);
@@ -101,6 +144,7 @@ $effect(() => {
101
144
  right: `auto`,
102
145
  bottom: `auto`,
103
146
  width: ``,
147
+ maxHeight: ``,
104
148
  });
105
149
  }
106
150
  }
@@ -149,16 +193,24 @@ $effect(() => {
149
193
  {...pane_props}
150
194
  class="draggable-pane {show ? `pane-open` : ``} {pane_props.class ?? ``}"
151
195
  >
152
- <div class="control-buttons">
196
+ <div class="control-tab">
197
+ <Icon
198
+ icon="DragIndicator"
199
+ class="drag-handle"
200
+ style="width: 1em; height: 1em"
201
+ />
153
202
  {#if show_control_buttons}
154
203
  <button
155
204
  type="button"
156
205
  class="reset-button"
157
- onclick={reset_position}
206
+ onclick={(event: MouseEvent) => {
207
+ event.stopPropagation()
208
+ reset_position()
209
+ }}
158
210
  title="Reset pane position"
159
211
  aria-label="Reset pane position"
160
212
  >
161
- <Icon icon="Reset" style="width: 1.25em; height: 1.25em" />
213
+ <Icon icon="Reset" style="width: 1em; height: 1em" />
162
214
  </button>
163
215
  <button
164
216
  type="button"
@@ -167,21 +219,47 @@ $effect(() => {
167
219
  title="Close pane"
168
220
  aria-label="Close pane"
169
221
  >
170
- <Icon icon="Cross" style="width: 1.25em; height: 1.25em" />
222
+ <Icon icon="Cross" style="width: 1em; height: 1em" />
171
223
  </button>
172
224
  {/if}
173
- <Icon
174
- icon="DragIndicator"
175
- class="drag-handle"
176
- style="width: 1.25em; height: 1.25em"
177
- />
178
225
  </div>
179
-
180
- {@render children?.({ show, show_control_buttons, has_been_dragged, currently_dragging })}
226
+ <div class="pane-content">
227
+ {@render children?.({
228
+ show,
229
+ show_control_buttons,
230
+ has_been_dragged,
231
+ currently_dragging,
232
+ })}
233
+ </div>
234
+ {#if resizable !== `none`}
235
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
236
+ <div
237
+ class="resize-grip"
238
+ class:resize-width={resizable === `width`}
239
+ class:resize-height={resizable === `height`}
240
+ onpointerdown={handle_resize_start}
241
+ ondblclick={() => {
242
+ if (pane_div) {
243
+ pane_div.style.width = ``
244
+ pane_div.style.maxHeight = ``
245
+ }
246
+ }}
247
+ >
248
+ <svg viewBox="0 0 10 10" width="10" height="10">
249
+ <line x1="9" y1="1" x2="1" y2="9" />
250
+ <line x1="9" y1="4" x2="4" y2="9" />
251
+ <line x1="9" y1="7" x2="7" y2="9" />
252
+ </svg>
253
+ </div>
254
+ {/if}
181
255
  </div>
182
256
  {/if}
183
257
 
184
258
  <style>
259
+ :global(.hover-visible:has(.draggable-pane.pane-open)) {
260
+ opacity: 1;
261
+ pointer-events: auto;
262
+ }
185
263
  button.pane-toggle {
186
264
  box-sizing: border-box;
187
265
  display: flex;
@@ -190,7 +268,7 @@ $effect(() => {
190
268
  border-radius: var(--pane-toggle-border-radius, var(--border-radius, 3pt));
191
269
  background-color: transparent;
192
270
  transition: var(--pane-toggle-transition, background-color 0.2s);
193
- font-size: var(--pane-toggle-font-size, clamp(0.85em, 2cqmin, 1.4em));
271
+ font-size: var(--pane-toggle-font-size, 0.875rem);
194
272
  }
195
273
  button.pane-toggle:hover {
196
274
  background-color: color-mix(in srgb, currentColor 8%, transparent);
@@ -203,7 +281,6 @@ $effect(() => {
203
281
  1px solid light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.15))
204
282
  );
205
283
  border-radius: var(--pane-border-radius, var(--border-radius, 3pt));
206
- padding: var(--pane-padding, 1ex);
207
284
  box-sizing: border-box;
208
285
  box-shadow: var(
209
286
  --pane-box-shadow,
@@ -214,18 +291,24 @@ $effect(() => {
214
291
  );
215
292
  z-index: var(--pane-z-index, 10);
216
293
  display: grid;
217
- gap: var(--pane-gap, 4pt);
218
294
  text-align: left;
219
295
  /* Exclude position from being transitioned to prevent sluggish dragging */
220
296
  transition: opacity 0.3s, background-color 0.3s, border-color 0.3s, box-shadow 0.3s;
221
297
  width: 28em;
222
298
  max-width: var(--pane-max-width, 80cqw);
223
- overflow-x: var(--pane-overflow-x, hidden);
224
- overflow-y: var(--pane-overflow-y, auto);
225
- /* Height constraints: use viewport-based max-height as primary constraint */
299
+ overflow: visible; /* Allow control-tab to protrude above the pane border */
226
300
  min-height: var(--pane-min-height, auto);
227
301
  max-height: var(--pane-max-height, 80vh);
228
- overscroll-behavior: contain; /* Prevent scroll chaining to parent containers (e.g. Jupyter cells) */
302
+ }
303
+ .draggable-pane .pane-content {
304
+ padding: var(--pane-padding, 1ex);
305
+ display: grid;
306
+ gap: var(--pane-gap, 4pt);
307
+ overflow-x: var(--pane-overflow-x, hidden);
308
+ overflow-y: var(--pane-overflow-y, auto);
309
+ max-height: inherit;
310
+ box-sizing: border-box;
311
+ overscroll-behavior: contain;
229
312
  }
230
313
  :global(body.fullscreen) .draggable-pane {
231
314
  position: fixed !important; /* In fullscreen, we want viewport-relative positioning */
@@ -247,15 +330,15 @@ $effect(() => {
247
330
  margin: var(--pane-hr-margin, 4pt 0);
248
331
  height: 1px;
249
332
  }
250
- .draggable-pane :global(> section > div) {
333
+ .draggable-pane :global(section > div) {
251
334
  text-align: right; /* right align long line-breaking trajectory file names */
252
335
  }
253
- .draggable-pane :global(label) {
336
+ .draggable-pane :global(:where(label)) {
254
337
  display: inline-flex;
255
338
  align-items: center;
256
339
  gap: var(--pane-label-gap, 2pt);
257
340
  }
258
- .draggable-pane :global(input[type='text']) {
341
+ .draggable-pane :global(:where(input[type='text'])) {
259
342
  flex: 1;
260
343
  padding: var(--pane-input-padding, 4px 6px);
261
344
  margin: var(--pane-input-margin, 0 0 0 5pt);
@@ -290,14 +373,14 @@ $effect(() => {
290
373
  .draggable-pane :global(input::-webkit-inner-spin-button) {
291
374
  display: none;
292
375
  }
293
- .draggable-pane :global(button) {
376
+ .draggable-pane :global(:where(button)) {
294
377
  width: max-content;
295
378
  background-color: var(
296
379
  --pane-btn-bg,
297
380
  var(--btn-bg, light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.1)))
298
381
  );
299
382
  }
300
- .draggable-pane :global(button:hover) {
383
+ .draggable-pane :global(:where(button:hover)) {
301
384
  background-color: var(
302
385
  --pane-btn-bg-hover,
303
386
  var(--btn-bg-hover, light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.2)))
@@ -329,59 +412,81 @@ $effect(() => {
329
412
  .draggable-pane :global(label:has(input[type='range'])) {
330
413
  flex: 1;
331
414
  }
332
- .draggable-pane .control-buttons {
415
+ .draggable-pane .control-tab {
416
+ position: absolute;
417
+ top: 6px;
418
+ right: -1px;
419
+ transform: translateX(100%);
333
420
  display: flex;
334
- justify-content: end;
421
+ flex-direction: column;
335
422
  align-items: center;
336
- position: sticky;
337
- top: 0;
338
- right: 0;
339
- height: 0;
340
- /* Cancel the 12 pt top/bottom padding without relying on width-based percentages */
341
- gap: 5px;
342
- padding: 12pt 3pt;
343
- margin-bottom: calc(-2 * 12pt);
344
- box-sizing: border-box;
345
- justify-self: end;
346
- z-index: var(--pane-control-buttons-z-index, 1);
423
+ gap: 1px;
424
+ padding: 3px 2px;
425
+ background: var(--pane-bg, var(--page-bg, light-dark(white, black)));
426
+ border: var(
427
+ --pane-border,
428
+ 1px solid light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.15))
429
+ );
430
+ border-left: none;
431
+ border-radius: 0 5px 5px 0;
432
+ z-index: var(--pane-control-tab-z-index, var(--pane-control-buttons-z-index, 1));
347
433
  }
348
434
  .draggable-pane :global(.drag-handle) {
349
- width: 1.3em;
350
- height: 1.3em;
435
+ width: 1.1em;
436
+ height: 1.1em;
351
437
  cursor: grab;
352
438
  border-radius: 3px;
353
- padding: 2px;
439
+ padding: 1px;
354
440
  box-sizing: border-box;
355
- opacity: 0.6;
356
- background-color: color-mix(in srgb, currentColor 10%, transparent);
357
- pointer-events: auto; /* Re-enable pointer events for drag handle */
441
+ opacity: 0.5;
442
+ pointer-events: auto;
358
443
  }
359
444
  .draggable-pane :global(.drag-handle:hover) {
360
445
  opacity: 0.8;
361
- background-color: color-mix(in srgb, currentColor 20%, transparent);
446
+ background-color: color-mix(in srgb, currentColor 15%, transparent);
362
447
  }
363
- /* Ensure drag handle cursor changes properly */
364
448
  .draggable-pane :global(.drag-handle:active) {
365
449
  cursor: grabbing;
366
450
  }
367
- /* Reset and close button styling */
368
451
  .draggable-pane :where(.reset-button, .close-button) {
369
452
  background: none;
370
453
  border: none;
371
- padding: 2px;
454
+ padding: 1px;
372
455
  border-radius: 3px;
373
456
  box-sizing: border-box;
374
457
  display: flex;
375
458
  align-items: center;
376
459
  justify-content: center;
377
- transition: all 0.2s ease;
378
- width: 1.3em;
379
- height: 1.3em;
380
- opacity: 0.6;
381
- background-color: color-mix(in srgb, currentColor 10%, transparent);
460
+ width: 1.1em;
461
+ height: 1.1em;
462
+ opacity: 0.5;
382
463
  }
383
464
  .draggable-pane :where(.reset-button:hover, .close-button:hover) {
384
465
  opacity: 0.8;
385
- background-color: color-mix(in srgb, currentColor 20%, transparent);
466
+ background-color: color-mix(in srgb, currentColor 15%, transparent);
467
+ }
468
+ .draggable-pane .resize-grip {
469
+ position: absolute;
470
+ bottom: 0;
471
+ right: 0;
472
+ padding: 2px;
473
+ cursor: nwse-resize;
474
+ opacity: 0.3;
475
+ touch-action: none;
476
+ line-height: 0;
477
+ svg {
478
+ stroke: currentColor;
479
+ stroke-width: 1.5;
480
+ stroke-linecap: round;
481
+ }
482
+ }
483
+ .draggable-pane .resize-grip:hover {
484
+ opacity: 0.6;
485
+ }
486
+ .draggable-pane .resize-grip.resize-width {
487
+ cursor: ew-resize;
488
+ }
489
+ .draggable-pane .resize-grip.resize-height {
490
+ cursor: ns-resize;
386
491
  }
387
492
  </style>
@@ -22,6 +22,8 @@ type $$ComponentProps = {
22
22
  };
23
23
  max_width?: string;
24
24
  pane_props?: HTMLAttributes<HTMLDivElement>;
25
+ persistent?: boolean;
26
+ resizable?: `both` | `width` | `height` | `none`;
25
27
  onclose?: () => void;
26
28
  on_drag_start?: () => void;
27
29
  toggle_pane_btn?: HTMLButtonElement;