matterviz 0.3.1 → 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 (358) hide show
  1. package/dist/EmptyState.svelte +10 -2
  2. package/dist/FilePicker.svelte +154 -96
  3. package/dist/Icon.svelte +20 -14
  4. package/dist/MillerIndexInput.svelte +27 -21
  5. package/dist/api/optimade.js +6 -6
  6. package/dist/app.css +216 -178
  7. package/dist/brillouin/BrillouinZone.svelte +299 -198
  8. package/dist/brillouin/BrillouinZone.svelte.d.ts +1 -1
  9. package/dist/brillouin/BrillouinZoneControls.svelte +32 -5
  10. package/dist/brillouin/BrillouinZoneExportPane.svelte +74 -55
  11. package/dist/brillouin/BrillouinZoneExportPane.svelte.d.ts +1 -1
  12. package/dist/brillouin/BrillouinZoneInfoPane.svelte +99 -68
  13. package/dist/brillouin/BrillouinZoneScene.svelte +277 -165
  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 +327 -0
  18. package/dist/chempot-diagram/ChemPotDiagram.svelte.d.ts +13 -0
  19. package/dist/chempot-diagram/ChemPotDiagram2D.svelte +847 -0
  20. package/dist/chempot-diagram/ChemPotDiagram2D.svelte.d.ts +16 -0
  21. package/dist/chempot-diagram/ChemPotDiagram3D.svelte +3194 -0
  22. package/dist/chempot-diagram/ChemPotDiagram3D.svelte.d.ts +16 -0
  23. package/dist/chempot-diagram/ChemPotScene3D.svelte +11 -0
  24. package/dist/chempot-diagram/ChemPotScene3D.svelte.d.ts +7 -0
  25. package/dist/chempot-diagram/async-compute.svelte.d.ts +3 -0
  26. package/dist/chempot-diagram/async-compute.svelte.js +77 -0
  27. package/dist/chempot-diagram/chempot-worker.d.ts +1 -0
  28. package/dist/chempot-diagram/chempot-worker.js +11 -0
  29. package/dist/chempot-diagram/color.d.ts +10 -0
  30. package/dist/chempot-diagram/color.js +32 -0
  31. package/dist/chempot-diagram/compute.d.ts +48 -0
  32. package/dist/chempot-diagram/compute.js +812 -0
  33. package/dist/chempot-diagram/index.d.ts +6 -0
  34. package/dist/chempot-diagram/index.js +6 -0
  35. package/dist/chempot-diagram/pointer.d.ts +16 -0
  36. package/dist/chempot-diagram/pointer.js +40 -0
  37. package/dist/chempot-diagram/temperature.d.ts +15 -0
  38. package/dist/chempot-diagram/temperature.js +36 -0
  39. package/dist/chempot-diagram/types.d.ts +86 -0
  40. package/dist/chempot-diagram/types.js +28 -0
  41. package/dist/colors/index.d.ts +3 -1
  42. package/dist/colors/index.js +9 -3
  43. package/dist/composition/BarChart.svelte +141 -77
  44. package/dist/composition/BubbleChart.svelte +107 -52
  45. package/dist/composition/Composition.svelte +100 -79
  46. package/dist/composition/Formula.svelte +108 -62
  47. package/dist/composition/FormulaFilter.svelte +973 -353
  48. package/dist/composition/FormulaFilter.svelte.d.ts +35 -1
  49. package/dist/composition/PieChart.svelte +199 -99
  50. package/dist/composition/PieChart.svelte.d.ts +1 -1
  51. package/dist/composition/format.d.ts +5 -0
  52. package/dist/composition/format.js +20 -3
  53. package/dist/composition/parse.js +14 -9
  54. package/dist/convex-hull/ConvexHull.svelte +93 -38
  55. package/dist/convex-hull/ConvexHull2D.svelte +551 -393
  56. package/dist/convex-hull/ConvexHull3D.svelte +1303 -825
  57. package/dist/convex-hull/ConvexHull4D.svelte +1012 -686
  58. package/dist/convex-hull/ConvexHullControls.svelte +115 -28
  59. package/dist/convex-hull/ConvexHullInfoPane.svelte +29 -3
  60. package/dist/convex-hull/ConvexHullStats.svelte +821 -249
  61. package/dist/convex-hull/ConvexHullStats.svelte.d.ts +6 -1
  62. package/dist/convex-hull/ConvexHullTooltip.svelte +41 -16
  63. package/dist/convex-hull/GasPressureControls.svelte +104 -61
  64. package/dist/convex-hull/StructurePopup.svelte +25 -4
  65. package/dist/convex-hull/TemperatureSlider.svelte +45 -25
  66. package/dist/convex-hull/barycentric-coords.js +13 -7
  67. package/dist/convex-hull/demo-temperature.d.ts +6 -0
  68. package/dist/convex-hull/demo-temperature.js +40 -0
  69. package/dist/convex-hull/gas-thermodynamics.js +17 -12
  70. package/dist/convex-hull/helpers.d.ts +10 -1
  71. package/dist/convex-hull/helpers.js +79 -38
  72. package/dist/convex-hull/index.d.ts +1 -0
  73. package/dist/convex-hull/index.js +1 -0
  74. package/dist/convex-hull/thermodynamics.d.ts +8 -21
  75. package/dist/convex-hull/thermodynamics.js +163 -69
  76. package/dist/convex-hull/types.d.ts +12 -12
  77. package/dist/convex-hull/types.js +0 -12
  78. package/dist/coordination/CoordinationBarPlot.svelte +232 -176
  79. package/dist/element/BohrAtom.svelte +56 -13
  80. package/dist/element/ElementHeading.svelte +7 -2
  81. package/dist/element/ElementPhoto.svelte +15 -9
  82. package/dist/element/ElementStats.svelte +10 -4
  83. package/dist/element/ElementTile.svelte +137 -73
  84. package/dist/element/Nucleus.svelte +39 -11
  85. package/dist/element/data.js +2 -14
  86. package/dist/element/data.json.gz +0 -0
  87. package/dist/element/types.d.ts +1 -0
  88. package/dist/feedback/ClickFeedback.svelte +16 -5
  89. package/dist/feedback/DragOverlay.svelte +10 -2
  90. package/dist/feedback/Spinner.svelte +4 -2
  91. package/dist/feedback/StatusMessage.svelte +8 -2
  92. package/dist/fermi-surface/FermiSlice.svelte +118 -88
  93. package/dist/fermi-surface/FermiSurface.svelte +336 -239
  94. package/dist/fermi-surface/FermiSurface.svelte.d.ts +1 -1
  95. package/dist/fermi-surface/FermiSurfaceControls.svelte +113 -46
  96. package/dist/fermi-surface/FermiSurfaceScene.svelte +536 -343
  97. package/dist/fermi-surface/FermiSurfaceScene.svelte.d.ts +1 -1
  98. package/dist/fermi-surface/FermiSurfaceTooltip.svelte +14 -5
  99. package/dist/fermi-surface/compute.js +16 -20
  100. package/dist/fermi-surface/parse.js +37 -33
  101. package/dist/fermi-surface/symmetry.js +2 -7
  102. package/dist/fermi-surface/types.d.ts +3 -5
  103. package/dist/heatmap-matrix/HeatmapMatrix.svelte +1527 -0
  104. package/dist/heatmap-matrix/HeatmapMatrix.svelte.d.ts +110 -0
  105. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte +225 -0
  106. package/dist/heatmap-matrix/HeatmapMatrixControls.svelte.d.ts +30 -0
  107. package/dist/heatmap-matrix/index.d.ts +53 -0
  108. package/dist/heatmap-matrix/index.js +100 -0
  109. package/dist/heatmap-matrix/shared.d.ts +2 -0
  110. package/dist/heatmap-matrix/shared.js +4 -0
  111. package/dist/icons.d.ts +111 -0
  112. package/dist/icons.js +158 -0
  113. package/dist/index.d.ts +5 -2
  114. package/dist/index.js +5 -2
  115. package/dist/io/decompress.js +1 -1
  116. package/dist/io/export.d.ts +3 -0
  117. package/dist/io/export.js +138 -140
  118. package/dist/io/file-drop.d.ts +7 -0
  119. package/dist/io/file-drop.js +43 -0
  120. package/dist/io/index.d.ts +2 -2
  121. package/dist/io/index.js +2 -112
  122. package/dist/io/is-binary.js +2 -3
  123. package/dist/io/types.d.ts +1 -0
  124. package/dist/io/url-drop.d.ts +2 -0
  125. package/dist/io/url-drop.js +117 -0
  126. package/dist/isosurface/Isosurface.svelte +220 -110
  127. package/dist/isosurface/IsosurfaceControls.svelte +65 -28
  128. package/dist/isosurface/parse.js +104 -56
  129. package/dist/isosurface/slice.d.ts +2 -1
  130. package/dist/isosurface/slice.js +8 -13
  131. package/dist/isosurface/types.d.ts +14 -1
  132. package/dist/isosurface/types.js +152 -5
  133. package/dist/labels.d.ts +2 -1
  134. package/dist/labels.js +12 -8
  135. package/dist/layout/FullscreenToggle.svelte +11 -2
  136. package/dist/layout/InfoCard.svelte +38 -6
  137. package/dist/layout/InfoTag.svelte +125 -94
  138. package/dist/layout/PropertyFilter.svelte +82 -37
  139. package/dist/layout/SettingsSection.svelte +85 -55
  140. package/dist/layout/SubpageGrid.svelte +82 -0
  141. package/dist/layout/SubpageGrid.svelte.d.ts +14 -0
  142. package/dist/layout/index.d.ts +1 -0
  143. package/dist/layout/index.js +1 -0
  144. package/dist/layout/json-tree/JsonNode.svelte +266 -223
  145. package/dist/layout/json-tree/JsonTree.svelte +516 -429
  146. package/dist/layout/json-tree/JsonTree.svelte.d.ts +1 -1
  147. package/dist/layout/json-tree/JsonValue.svelte +281 -173
  148. package/dist/layout/json-tree/types.d.ts +10 -2
  149. package/dist/layout/json-tree/utils.d.ts +2 -0
  150. package/dist/layout/json-tree/utils.js +37 -2
  151. package/dist/marching-cubes.js +25 -2
  152. package/dist/math.d.ts +20 -17
  153. package/dist/math.js +474 -57
  154. package/dist/overlays/ContextMenu.svelte +66 -40
  155. package/dist/overlays/DraggablePane.svelte +331 -154
  156. package/dist/overlays/DraggablePane.svelte.d.ts +2 -0
  157. package/dist/periodic-table/PeriodicTable.svelte +278 -145
  158. package/dist/periodic-table/PeriodicTableControls.svelte +178 -128
  159. package/dist/periodic-table/PropertySelect.svelte +25 -7
  160. package/dist/periodic-table/TableInset.svelte +8 -3
  161. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte +559 -267
  162. package/dist/phase-diagram/IsobaricBinaryPhaseDiagram.svelte.d.ts +6 -2
  163. package/dist/phase-diagram/PhaseDiagramControls.svelte +131 -51
  164. package/dist/phase-diagram/PhaseDiagramControls.svelte.d.ts +3 -2
  165. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte +126 -0
  166. package/dist/phase-diagram/PhaseDiagramEditorPane.svelte.d.ts +15 -0
  167. package/dist/phase-diagram/PhaseDiagramExportPane.svelte +160 -110
  168. package/dist/phase-diagram/PhaseDiagramExportPane.svelte.d.ts +8 -1
  169. package/dist/phase-diagram/PhaseDiagramTooltip.svelte +217 -86
  170. package/dist/phase-diagram/PhaseDiagramTooltip.svelte.d.ts +6 -3
  171. package/dist/phase-diagram/TdbInfoPanel.svelte +28 -4
  172. package/dist/phase-diagram/build-diagram.js +9 -9
  173. package/dist/phase-diagram/colors.js +1 -3
  174. package/dist/phase-diagram/index.d.ts +2 -0
  175. package/dist/phase-diagram/index.js +2 -0
  176. package/dist/phase-diagram/parse.js +10 -9
  177. package/dist/phase-diagram/svg-to-diagram.d.ts +2 -0
  178. package/dist/phase-diagram/svg-to-diagram.js +869 -0
  179. package/dist/phase-diagram/types.d.ts +10 -0
  180. package/dist/phase-diagram/utils.d.ts +8 -4
  181. package/dist/phase-diagram/utils.js +219 -74
  182. package/dist/plot/AxisLabel.svelte +51 -0
  183. package/dist/plot/AxisLabel.svelte.d.ts +16 -0
  184. package/dist/plot/BarPlot.svelte +1461 -768
  185. package/dist/plot/BarPlot.svelte.d.ts +3 -3
  186. package/dist/plot/BarPlotControls.svelte +33 -6
  187. package/dist/plot/BarPlotControls.svelte.d.ts +1 -1
  188. package/dist/plot/ColorBar.svelte +533 -383
  189. package/dist/plot/ColorBar.svelte.d.ts +1 -1
  190. package/dist/plot/ColorScaleSelect.svelte +28 -7
  191. package/dist/plot/ElementScatter.svelte +38 -16
  192. package/dist/plot/FillArea.svelte +152 -92
  193. package/dist/plot/Histogram.svelte +1162 -709
  194. package/dist/plot/Histogram.svelte.d.ts +1 -1
  195. package/dist/plot/HistogramControls.svelte +81 -18
  196. package/dist/plot/HistogramControls.svelte.d.ts +6 -2
  197. package/dist/plot/InteractiveAxisLabel.svelte +34 -11
  198. package/dist/plot/InteractiveAxisLabel.svelte.d.ts +1 -1
  199. package/dist/plot/Line.svelte +63 -28
  200. package/dist/plot/PlotControls.svelte +221 -96
  201. package/dist/plot/PlotControls.svelte.d.ts +1 -1
  202. package/dist/plot/PlotLegend.svelte +174 -91
  203. package/dist/plot/PlotTooltip.svelte +45 -6
  204. package/dist/plot/PortalSelect.svelte +175 -146
  205. package/dist/plot/ReferenceLine.svelte +77 -22
  206. package/dist/plot/ReferenceLine.svelte.d.ts +1 -0
  207. package/dist/plot/ReferenceLine3D.svelte +132 -107
  208. package/dist/plot/ReferencePlane.svelte +146 -123
  209. package/dist/plot/ScatterPlot.svelte +1880 -1156
  210. package/dist/plot/ScatterPlot.svelte.d.ts +3 -3
  211. package/dist/plot/ScatterPlot3D.svelte +256 -131
  212. package/dist/plot/ScatterPlot3D.svelte.d.ts +2 -2
  213. package/dist/plot/ScatterPlot3DControls.svelte +300 -297
  214. package/dist/plot/ScatterPlot3DControls.svelte.d.ts +2 -1
  215. package/dist/plot/ScatterPlot3DScene.svelte +608 -406
  216. package/dist/plot/ScatterPlot3DScene.svelte.d.ts +2 -2
  217. package/dist/plot/ScatterPlotControls.svelte +150 -70
  218. package/dist/plot/ScatterPlotControls.svelte.d.ts +1 -1
  219. package/dist/plot/ScatterPoint.svelte +98 -26
  220. package/dist/plot/ScatterPoint.svelte.d.ts +1 -0
  221. package/dist/plot/SpacegroupBarPlot.svelte +142 -85
  222. package/dist/plot/Surface3D.svelte +159 -108
  223. package/dist/plot/ZeroLines.svelte +96 -0
  224. package/dist/plot/ZeroLines.svelte.d.ts +32 -0
  225. package/dist/plot/ZoomRect.svelte +23 -0
  226. package/dist/plot/ZoomRect.svelte.d.ts +8 -0
  227. package/dist/plot/axis-utils.d.ts +1 -1
  228. package/dist/plot/axis-utils.js +1 -3
  229. package/dist/plot/data-cleaning.js +12 -28
  230. package/dist/plot/data-transform.js +2 -1
  231. package/dist/plot/fill-utils.js +2 -0
  232. package/dist/plot/index.d.ts +6 -2
  233. package/dist/plot/index.js +6 -2
  234. package/dist/plot/interactions.d.ts +8 -10
  235. package/dist/plot/interactions.js +2 -3
  236. package/dist/plot/layout.d.ts +11 -2
  237. package/dist/plot/layout.js +44 -17
  238. package/dist/plot/reference-line.d.ts +5 -22
  239. package/dist/plot/reference-line.js +12 -84
  240. package/dist/plot/scales.js +24 -36
  241. package/dist/plot/types.d.ts +53 -40
  242. package/dist/plot/types.js +12 -7
  243. package/dist/plot/utils/label-placement.d.ts +32 -15
  244. package/dist/plot/utils/label-placement.js +227 -63
  245. package/dist/plot/utils/series-visibility.js +2 -3
  246. package/dist/plot/utils.d.ts +1 -0
  247. package/dist/plot/utils.js +14 -0
  248. package/dist/rdf/RdfPlot.svelte +173 -132
  249. package/dist/rdf/calc-rdf.js +4 -5
  250. package/dist/sanitize.d.ts +4 -0
  251. package/dist/sanitize.js +107 -0
  252. package/dist/settings.d.ts +21 -6
  253. package/dist/settings.js +63 -19
  254. package/dist/spectral/Bands.svelte +963 -412
  255. package/dist/spectral/Bands.svelte.d.ts +22 -2
  256. package/dist/spectral/BandsAndDos.svelte +90 -49
  257. package/dist/spectral/BrillouinBandsDos.svelte +151 -93
  258. package/dist/spectral/Dos.svelte +389 -258
  259. package/dist/spectral/helpers.d.ts +23 -1
  260. package/dist/spectral/helpers.js +119 -51
  261. package/dist/spectral/types.d.ts +2 -0
  262. package/dist/state.svelte.d.ts +1 -1
  263. package/dist/state.svelte.js +3 -2
  264. package/dist/structure/Arrow.svelte +59 -20
  265. package/dist/structure/AtomLegend.svelte +231 -129
  266. package/dist/structure/AtomLegend.svelte.d.ts +1 -1
  267. package/dist/structure/Bond.svelte +73 -47
  268. package/dist/structure/CanvasTooltip.svelte +10 -2
  269. package/dist/structure/CellSelect.svelte +148 -51
  270. package/dist/structure/Cylinder.svelte +33 -17
  271. package/dist/structure/Lattice.svelte +88 -33
  272. package/dist/structure/Structure.svelte +1077 -821
  273. package/dist/structure/Structure.svelte.d.ts +1 -1
  274. package/dist/structure/StructureControls.svelte +373 -139
  275. package/dist/structure/StructureControls.svelte.d.ts +1 -1
  276. package/dist/structure/StructureExportPane.svelte +124 -89
  277. package/dist/structure/StructureExportPane.svelte.d.ts +1 -1
  278. package/dist/structure/StructureInfoPane.svelte +304 -231
  279. package/dist/structure/StructureScene.svelte +919 -445
  280. package/dist/structure/StructureScene.svelte.d.ts +16 -7
  281. package/dist/structure/atom-properties.d.ts +6 -2
  282. package/dist/structure/atom-properties.js +42 -29
  283. package/dist/structure/bonding.js +6 -7
  284. package/dist/structure/export.js +22 -34
  285. package/dist/structure/ferrox-wasm-types.d.ts +3 -2
  286. package/dist/structure/ferrox-wasm-types.js +0 -3
  287. package/dist/structure/ferrox-wasm.d.ts +3 -2
  288. package/dist/structure/ferrox-wasm.js +2 -3
  289. package/dist/structure/index.d.ts +16 -0
  290. package/dist/structure/index.js +88 -6
  291. package/dist/structure/measure.d.ts +2 -2
  292. package/dist/structure/measure.js +4 -44
  293. package/dist/structure/parse.js +130 -155
  294. package/dist/structure/partial-occupancy.d.ts +25 -0
  295. package/dist/structure/partial-occupancy.js +99 -0
  296. package/dist/structure/pbc.d.ts +1 -0
  297. package/dist/structure/pbc.js +16 -6
  298. package/dist/structure/supercell.d.ts +2 -2
  299. package/dist/structure/supercell.js +12 -22
  300. package/dist/structure/validation.js +5 -3
  301. package/dist/symmetry/SymmetryStats.svelte +94 -37
  302. package/dist/symmetry/WyckoffTable.svelte +42 -14
  303. package/dist/symmetry/cell-transform.js +5 -3
  304. package/dist/symmetry/index.d.ts +7 -4
  305. package/dist/symmetry/index.js +87 -21
  306. package/dist/symmetry/spacegroups.js +148 -148
  307. package/dist/table/HeatmapTable.svelte +1112 -516
  308. package/dist/table/HeatmapTable.svelte.d.ts +12 -1
  309. package/dist/table/ToggleMenu.svelte +125 -90
  310. package/dist/table/index.d.ts +2 -0
  311. package/dist/table/index.js +2 -4
  312. package/dist/theme/ThemeControl.svelte +21 -12
  313. package/dist/time.js +4 -1
  314. package/dist/tooltip/TooltipContent.svelte +33 -8
  315. package/dist/trajectory/Trajectory.svelte +889 -687
  316. package/dist/trajectory/TrajectoryError.svelte +14 -3
  317. package/dist/trajectory/TrajectoryExportPane.svelte +148 -90
  318. package/dist/trajectory/TrajectoryExportPane.svelte.d.ts +1 -1
  319. package/dist/trajectory/TrajectoryInfoPane.svelte +272 -143
  320. package/dist/trajectory/constants.d.ts +6 -0
  321. package/dist/trajectory/constants.js +7 -0
  322. package/dist/trajectory/extract.js +13 -31
  323. package/dist/trajectory/format-detect.d.ts +9 -0
  324. package/dist/trajectory/format-detect.js +76 -0
  325. package/dist/trajectory/frame-reader.d.ts +17 -0
  326. package/dist/trajectory/frame-reader.js +332 -0
  327. package/dist/trajectory/helpers.d.ts +14 -0
  328. package/dist/trajectory/helpers.js +172 -0
  329. package/dist/trajectory/index.d.ts +1 -0
  330. package/dist/trajectory/index.js +23 -14
  331. package/dist/trajectory/parse/ase.d.ts +2 -0
  332. package/dist/trajectory/parse/ase.js +77 -0
  333. package/dist/trajectory/parse/hdf5.d.ts +2 -0
  334. package/dist/trajectory/parse/hdf5.js +129 -0
  335. package/dist/trajectory/parse/index.d.ts +12 -0
  336. package/dist/trajectory/parse/index.js +299 -0
  337. package/dist/trajectory/parse/lammps.d.ts +5 -0
  338. package/dist/trajectory/parse/lammps.js +179 -0
  339. package/dist/trajectory/parse/vasp.d.ts +2 -0
  340. package/dist/trajectory/parse/vasp.js +68 -0
  341. package/dist/trajectory/parse/xyz.d.ts +2 -0
  342. package/dist/trajectory/parse/xyz.js +110 -0
  343. package/dist/trajectory/plotting.js +13 -8
  344. package/dist/trajectory/types.d.ts +11 -0
  345. package/dist/trajectory/types.js +1 -0
  346. package/dist/utils.d.ts +3 -0
  347. package/dist/utils.js +17 -0
  348. package/dist/xrd/XrdPlot.svelte +337 -245
  349. package/dist/xrd/broadening.js +14 -9
  350. package/dist/xrd/calc-xrd.js +12 -19
  351. package/dist/xrd/parse.d.ts +1 -1
  352. package/dist/xrd/parse.js +17 -17
  353. package/package.json +103 -101
  354. package/readme.md +4 -4
  355. package/dist/trajectory/parse.d.ts +0 -42
  356. package/dist/trajectory/parse.js +0 -1267
  357. /package/dist/element/{data.json.d.ts → data.json.gz.d.ts} +0 -0
  358. /package/dist/theme/{themes.js → themes.mjs} +0 -0
@@ -1,110 +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(), has_been_dragged = $bindable(false), currently_dragging = $bindable(false), } = $props();
4
- let initial_position = $state({ left: `50px`, top: `50px` });
5
- let show_control_buttons = $state(false);
6
- function toggle_pane(event) {
7
- event.stopPropagation();
8
- show = !show;
9
- if (!show)
10
- onclose();
11
- }
12
- function close_pane() {
13
- show = false;
14
- onclose();
15
- }
16
- function reset_position() {
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
+ }
89
+ }
90
+ function on_up() {
91
+ document.removeEventListener(`pointermove`, on_move)
92
+ document.removeEventListener(`pointerup`, on_up)
93
+ resize_end_time = Date.now()
94
+ requestAnimationFrame(() => {
95
+ resizing = false
96
+ })
97
+ }
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() {
17
114
  if (toggle_pane_btn) {
18
- const pos = calculate_position();
19
- initial_position = pos;
20
- if (pane_div) {
21
- Object.assign(pane_div.style, {
22
- left: pos.left,
23
- top: pos.top,
24
- right: `auto`,
25
- bottom: `auto`,
26
- width: ``,
27
- });
28
- }
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
+ }
29
127
  }
30
128
  // Hide the control buttons after reset
31
- show_control_buttons = false;
32
- has_been_dragged = false;
33
- }
34
- // Drag handlers
35
- function handle_drag_start() {
36
- has_been_dragged = true;
37
- show_control_buttons = true;
38
- currently_dragging = true;
39
- on_drag_start();
40
- }
41
- // Position calculation
42
- function calculate_position() {
43
- if (!toggle_pane_btn)
44
- return { left: `50px`, top: `50px` };
45
- const toggle_rect = toggle_pane_btn.getBoundingClientRect();
46
- const pane_width = pane_div?.getBoundingClientRect().width || 450;
47
- const positioned_ancestor = toggle_pane_btn.offsetParent;
48
- 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
+
49
152
  if (!ancestor_rect) { // Fallback to document positioning
50
- const scroll_x = window.scrollX || document.documentElement.scrollLeft;
51
- const scroll_y = window.scrollY || document.documentElement.scrollTop;
52
- return {
53
- left: `${toggle_rect.right - pane_width + (offset.x ?? 5) + scroll_x}px`,
54
- top: `${toggle_rect.bottom + (offset.y ?? 5) + scroll_y}px`,
55
- };
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`,
164
+ }
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
175
+ const is_toggle_button = target instanceof Node && toggle_pane_btn &&
176
+ (target === toggle_pane_btn || toggle_pane_btn.contains(target))
177
+ const is_inside_pane = target instanceof Node && pane_div &&
178
+ (target === pane_div || pane_div.contains(target))
179
+
180
+ if (!is_toggle_button && !is_inside_pane && !currently_dragging && !resizing) {
181
+ close_pane()
56
182
  }
57
- const left = `${toggle_rect.right - ancestor_rect.left - pane_width + (offset.x ?? 5)}px`;
58
- const top = `${toggle_rect.bottom - ancestor_rect.top + (offset.y ?? 5)}px`;
59
- return { left, top }; // Position relative to positioned ancestor
60
- }
61
- // Click outside handler
62
- function handle_click_outside(event) {
63
- if (!show)
64
- return;
65
- const target = event.target;
66
- const is_toggle_button = toggle_pane_btn &&
67
- (target === toggle_pane_btn || toggle_pane_btn.contains(target));
68
- const is_inside_pane = pane_div &&
69
- (target === pane_div || pane_div.contains(target));
70
- if (!is_toggle_button && !is_inside_pane && !currently_dragging)
71
- close_pane();
72
- }
73
- // Debounced resize handler for better performance
74
- let resize_timeout = $state(undefined);
75
- function handle_resize() {
76
- if (!show || has_been_dragged || currently_dragging)
77
- return;
78
- if (resize_timeout)
79
- 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)
80
192
  const current_timeout = setTimeout(() => {
81
- if (resize_timeout !== current_timeout)
82
- return;
83
- if (show && toggle_pane_btn && !has_been_dragged && pane_div) {
84
- const pos = calculate_position();
85
- initial_position = pos;
86
- pane_div.style.left = pos.left;
87
- pane_div.style.top = pos.top;
88
- }
89
- }, 50); // Debounce resize events
90
- resize_timeout = current_timeout;
91
- }
92
- // Position pane when shown
93
- $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(() => {
94
206
  if (show && toggle_pane_btn && !has_been_dragged) {
95
- const pos = calculate_position();
96
- initial_position = pos;
97
- if (pane_div) {
98
- Object.assign(pane_div.style, {
99
- left: pos.left,
100
- top: pos.top,
101
- right: `auto`,
102
- bottom: `auto`,
103
- width: ``,
104
- });
105
- }
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
+ }
106
219
  }
107
- });
220
+ })
108
221
  </script>
109
222
 
110
223
  <svelte:window
@@ -149,16 +262,24 @@ $effect(() => {
149
262
  {...pane_props}
150
263
  class="draggable-pane {show ? `pane-open` : ``} {pane_props.class ?? ``}"
151
264
  >
152
- <div class="control-buttons">
265
+ <div class="control-tab">
266
+ <Icon
267
+ icon="DragIndicator"
268
+ class="drag-handle"
269
+ style="width: 1em; height: 1em"
270
+ />
153
271
  {#if show_control_buttons}
154
272
  <button
155
273
  type="button"
156
274
  class="reset-button"
157
- onclick={reset_position}
275
+ onclick={(event: MouseEvent) => {
276
+ event.stopPropagation()
277
+ reset_position()
278
+ }}
158
279
  title="Reset pane position"
159
280
  aria-label="Reset pane position"
160
281
  >
161
- <Icon icon="Reset" style="width: 1.25em; height: 1.25em" />
282
+ <Icon icon="Reset" style="width: 1em; height: 1em" />
162
283
  </button>
163
284
  <button
164
285
  type="button"
@@ -167,21 +288,47 @@ $effect(() => {
167
288
  title="Close pane"
168
289
  aria-label="Close pane"
169
290
  >
170
- <Icon icon="Cross" style="width: 1.25em; height: 1.25em" />
291
+ <Icon icon="Cross" style="width: 1em; height: 1em" />
171
292
  </button>
172
293
  {/if}
173
- <Icon
174
- icon="DragIndicator"
175
- class="drag-handle"
176
- style="width: 1.25em; height: 1.25em"
177
- />
178
294
  </div>
179
-
180
- {@render children?.({ show, show_control_buttons, has_been_dragged, currently_dragging })}
295
+ <div class="pane-content">
296
+ {@render children?.({
297
+ show,
298
+ show_control_buttons,
299
+ has_been_dragged,
300
+ currently_dragging,
301
+ })}
302
+ </div>
303
+ {#if resizable !== `none`}
304
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
305
+ <div
306
+ class="resize-grip"
307
+ class:resize-width={resizable === `width`}
308
+ class:resize-height={resizable === `height`}
309
+ onpointerdown={handle_resize_start}
310
+ ondblclick={() => {
311
+ if (pane_div) {
312
+ pane_div.style.width = ``
313
+ pane_div.style.maxHeight = ``
314
+ }
315
+ }}
316
+ >
317
+ <svg viewBox="0 0 10 10" width="10" height="10">
318
+ <line x1="9" y1="1" x2="1" y2="9" />
319
+ <line x1="9" y1="4" x2="4" y2="9" />
320
+ <line x1="9" y1="7" x2="7" y2="9" />
321
+ </svg>
322
+ </div>
323
+ {/if}
181
324
  </div>
182
325
  {/if}
183
326
 
184
327
  <style>
328
+ :global(.hover-visible:has(.draggable-pane.pane-open)) {
329
+ opacity: 1;
330
+ pointer-events: auto;
331
+ }
185
332
  button.pane-toggle {
186
333
  box-sizing: border-box;
187
334
  display: flex;
@@ -190,7 +337,7 @@ $effect(() => {
190
337
  border-radius: var(--pane-toggle-border-radius, var(--border-radius, 3pt));
191
338
  background-color: transparent;
192
339
  transition: var(--pane-toggle-transition, background-color 0.2s);
193
- font-size: var(--pane-toggle-font-size, clamp(0.85em, 2cqmin, 1.3em));
340
+ font-size: var(--pane-toggle-font-size, 0.875rem);
194
341
  }
195
342
  button.pane-toggle:hover {
196
343
  background-color: color-mix(in srgb, currentColor 8%, transparent);
@@ -203,7 +350,6 @@ $effect(() => {
203
350
  1px solid light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.15))
204
351
  );
205
352
  border-radius: var(--pane-border-radius, var(--border-radius, 3pt));
206
- padding: var(--pane-padding, 1ex);
207
353
  box-sizing: border-box;
208
354
  box-shadow: var(
209
355
  --pane-box-shadow,
@@ -214,18 +360,24 @@ $effect(() => {
214
360
  );
215
361
  z-index: var(--pane-z-index, 10);
216
362
  display: grid;
217
- gap: var(--pane-gap, 4pt);
218
363
  text-align: left;
219
364
  /* Exclude position from being transitioned to prevent sluggish dragging */
220
365
  transition: opacity 0.3s, background-color 0.3s, border-color 0.3s, box-shadow 0.3s;
221
366
  width: 28em;
222
367
  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 */
368
+ overflow: visible; /* Allow control-tab to protrude above the pane border */
226
369
  min-height: var(--pane-min-height, auto);
227
370
  max-height: var(--pane-max-height, 80vh);
228
- overscroll-behavior: contain; /* Prevent scroll chaining to parent containers (e.g. Jupyter cells) */
371
+ }
372
+ .draggable-pane .pane-content {
373
+ padding: var(--pane-padding, 1ex);
374
+ display: grid;
375
+ gap: var(--pane-gap, 4pt);
376
+ overflow-x: var(--pane-overflow-x, hidden);
377
+ overflow-y: var(--pane-overflow-y, auto);
378
+ max-height: inherit;
379
+ box-sizing: border-box;
380
+ overscroll-behavior: contain;
229
381
  }
230
382
  :global(body.fullscreen) .draggable-pane {
231
383
  position: fixed !important; /* In fullscreen, we want viewport-relative positioning */
@@ -247,15 +399,15 @@ $effect(() => {
247
399
  margin: var(--pane-hr-margin, 4pt 0);
248
400
  height: 1px;
249
401
  }
250
- .draggable-pane :global(> section > div) {
402
+ .draggable-pane :global(section > div) {
251
403
  text-align: right; /* right align long line-breaking trajectory file names */
252
404
  }
253
- .draggable-pane :global(label) {
405
+ .draggable-pane :global(:where(label)) {
254
406
  display: inline-flex;
255
407
  align-items: center;
256
408
  gap: var(--pane-label-gap, 2pt);
257
409
  }
258
- .draggable-pane :global(input[type='text']) {
410
+ .draggable-pane :global(:where(input[type='text'])) {
259
411
  flex: 1;
260
412
  padding: var(--pane-input-padding, 4px 6px);
261
413
  margin: var(--pane-input-margin, 0 0 0 5pt);
@@ -290,17 +442,20 @@ $effect(() => {
290
442
  .draggable-pane :global(input::-webkit-inner-spin-button) {
291
443
  display: none;
292
444
  }
293
- .draggable-pane :global(button) {
294
- width: max-content;
445
+ .draggable-pane :global(:where(button)) {
295
446
  background-color: var(
296
447
  --pane-btn-bg,
297
- 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)))
298
449
  );
299
450
  }
300
- .draggable-pane :global(button:hover) {
451
+ .draggable-pane .pane-content :global(:where(button)) {
452
+ font-size: 1em;
453
+ padding: var(--pane-btn-padding, 3px 6px);
454
+ }
455
+ .draggable-pane :global(:where(button:hover)) {
301
456
  background-color: var(
302
457
  --pane-btn-bg-hover,
303
- 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)))
304
459
  );
305
460
  }
306
461
  .draggable-pane :global(select) {
@@ -329,59 +484,81 @@ $effect(() => {
329
484
  .draggable-pane :global(label:has(input[type='range'])) {
330
485
  flex: 1;
331
486
  }
332
- .draggable-pane .control-buttons {
487
+ .draggable-pane .control-tab {
488
+ position: absolute;
489
+ top: 6px;
490
+ right: -1px;
491
+ transform: translateX(100%);
333
492
  display: flex;
334
- justify-content: end;
493
+ flex-direction: column;
335
494
  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);
495
+ gap: 1px;
496
+ padding: 3px 2px;
497
+ background: var(--pane-bg, var(--page-bg, light-dark(white, black)));
498
+ border: var(
499
+ --pane-border,
500
+ 1px solid light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.15))
501
+ );
502
+ border-left: none;
503
+ border-radius: 0 5px 5px 0;
504
+ z-index: var(--pane-control-tab-z-index, var(--pane-control-buttons-z-index, 1));
347
505
  }
348
506
  .draggable-pane :global(.drag-handle) {
349
- width: 1.3em;
350
- height: 1.3em;
507
+ width: 1.1em;
508
+ height: 1.1em;
351
509
  cursor: grab;
352
510
  border-radius: 3px;
353
- padding: 2px;
511
+ padding: 1px;
354
512
  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 */
513
+ opacity: 0.5;
514
+ pointer-events: auto;
358
515
  }
359
516
  .draggable-pane :global(.drag-handle:hover) {
360
517
  opacity: 0.8;
361
- background-color: color-mix(in srgb, currentColor 20%, transparent);
518
+ background-color: color-mix(in srgb, currentColor 15%, transparent);
362
519
  }
363
- /* Ensure drag handle cursor changes properly */
364
520
  .draggable-pane :global(.drag-handle:active) {
365
521
  cursor: grabbing;
366
522
  }
367
- /* Reset and close button styling */
368
523
  .draggable-pane :where(.reset-button, .close-button) {
369
524
  background: none;
370
525
  border: none;
371
- padding: 2px;
526
+ padding: 1px;
372
527
  border-radius: 3px;
373
528
  box-sizing: border-box;
374
529
  display: flex;
375
530
  align-items: center;
376
531
  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);
532
+ width: 1.1em;
533
+ height: 1.1em;
534
+ opacity: 0.5;
382
535
  }
383
536
  .draggable-pane :where(.reset-button:hover, .close-button:hover) {
384
537
  opacity: 0.8;
385
- background-color: color-mix(in srgb, currentColor 20%, transparent);
538
+ background-color: color-mix(in srgb, currentColor 15%, transparent);
539
+ }
540
+ .draggable-pane .resize-grip {
541
+ position: absolute;
542
+ bottom: 0;
543
+ right: 0;
544
+ padding: 2px;
545
+ cursor: nwse-resize;
546
+ opacity: 0.3;
547
+ touch-action: none;
548
+ line-height: 0;
549
+ svg {
550
+ stroke: currentColor;
551
+ stroke-width: 1.5;
552
+ stroke-linecap: round;
553
+ }
554
+ }
555
+ .draggable-pane .resize-grip:hover {
556
+ opacity: 0.6;
557
+ }
558
+ .draggable-pane .resize-grip.resize-width {
559
+ cursor: ew-resize;
560
+ }
561
+ .draggable-pane .resize-grip.resize-height {
562
+ cursor: ns-resize;
386
563
  }
387
564
  </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;