dockview-core 1.14.1 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/cjs/api/component.api.d.ts +4 -5
  2. package/dist/cjs/api/component.api.js +12 -2
  3. package/dist/cjs/constants.d.ts +2 -0
  4. package/dist/cjs/constants.js +1 -1
  5. package/dist/cjs/dnd/overlay.d.ts +6 -4
  6. package/dist/cjs/dnd/overlay.js +119 -28
  7. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +1 -8
  8. package/dist/cjs/dockview/components/tab/defaultTab.js +16 -39
  9. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +4 -2
  10. package/dist/cjs/dockview/dockviewComponent.d.ts +20 -17
  11. package/dist/cjs/dockview/dockviewComponent.js +92 -45
  12. package/dist/cjs/dockview/dockviewFloatingGroupPanel.d.ts +3 -12
  13. package/dist/cjs/dockview/options.d.ts +10 -6
  14. package/dist/cjs/dockview/options.js +1 -0
  15. package/dist/cjs/dom.d.ts +1 -0
  16. package/dist/cjs/dom.js +5 -1
  17. package/dist/cjs/gridview/baseComponentGridview.d.ts +3 -0
  18. package/dist/cjs/gridview/baseComponentGridview.js +8 -2
  19. package/dist/cjs/gridview/branchNode.d.ts +7 -3
  20. package/dist/cjs/gridview/branchNode.js +24 -29
  21. package/dist/cjs/gridview/gridview.d.ts +7 -1
  22. package/dist/cjs/gridview/gridview.js +31 -8
  23. package/dist/cjs/gridview/gridviewPanel.d.ts +1 -0
  24. package/dist/cjs/gridview/gridviewPanel.js +7 -0
  25. package/dist/cjs/math.js +5 -1
  26. package/dist/cjs/splitview/splitview.d.ts +13 -0
  27. package/dist/cjs/splitview/splitview.js +42 -12
  28. package/dist/cjs/types.d.ts +23 -0
  29. package/dist/dockview-core.amd.js +333 -138
  30. package/dist/dockview-core.amd.js.map +1 -1
  31. package/dist/dockview-core.amd.min.js +2 -2
  32. package/dist/dockview-core.amd.min.js.map +1 -1
  33. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  34. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  35. package/dist/dockview-core.amd.noStyle.js +332 -137
  36. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  37. package/dist/dockview-core.cjs.js +333 -138
  38. package/dist/dockview-core.cjs.js.map +1 -1
  39. package/dist/dockview-core.esm.js +333 -138
  40. package/dist/dockview-core.esm.js.map +1 -1
  41. package/dist/dockview-core.esm.min.js +2 -2
  42. package/dist/dockview-core.esm.min.js.map +1 -1
  43. package/dist/dockview-core.js +333 -138
  44. package/dist/dockview-core.js.map +1 -1
  45. package/dist/dockview-core.min.js +2 -2
  46. package/dist/dockview-core.min.js.map +1 -1
  47. package/dist/dockview-core.min.noStyle.js +2 -2
  48. package/dist/dockview-core.min.noStyle.js.map +1 -1
  49. package/dist/dockview-core.noStyle.js +332 -137
  50. package/dist/dockview-core.noStyle.js.map +1 -1
  51. package/dist/esm/api/component.api.d.ts +4 -5
  52. package/dist/esm/api/component.api.js +8 -2
  53. package/dist/esm/constants.d.ts +2 -0
  54. package/dist/esm/constants.js +1 -1
  55. package/dist/esm/dnd/overlay.d.ts +6 -4
  56. package/dist/esm/dnd/overlay.js +108 -28
  57. package/dist/esm/dockview/components/tab/defaultTab.d.ts +1 -8
  58. package/dist/esm/dockview/components/tab/defaultTab.js +16 -28
  59. package/dist/esm/dockview/components/titlebar/tabsContainer.js +4 -2
  60. package/dist/esm/dockview/dockviewComponent.d.ts +20 -17
  61. package/dist/esm/dockview/dockviewComponent.js +93 -46
  62. package/dist/esm/dockview/dockviewFloatingGroupPanel.d.ts +3 -12
  63. package/dist/esm/dockview/options.d.ts +10 -6
  64. package/dist/esm/dockview/options.js +1 -0
  65. package/dist/esm/dom.d.ts +1 -0
  66. package/dist/esm/dom.js +3 -0
  67. package/dist/esm/gridview/baseComponentGridview.d.ts +3 -0
  68. package/dist/esm/gridview/baseComponentGridview.js +6 -2
  69. package/dist/esm/gridview/branchNode.d.ts +7 -3
  70. package/dist/esm/gridview/branchNode.js +19 -7
  71. package/dist/esm/gridview/gridview.d.ts +7 -1
  72. package/dist/esm/gridview/gridview.js +27 -8
  73. package/dist/esm/gridview/gridviewPanel.d.ts +1 -0
  74. package/dist/esm/gridview/gridviewPanel.js +3 -0
  75. package/dist/esm/math.js +5 -1
  76. package/dist/esm/splitview/splitview.d.ts +13 -0
  77. package/dist/esm/splitview/splitview.js +38 -12
  78. package/dist/esm/types.d.ts +23 -0
  79. package/dist/styles/dockview.css +0 -13
  80. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 1.14.1
3
+ * @version 1.15.0
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -528,6 +528,9 @@ define(['exports'], (function (exports) { 'use strict';
528
528
  }
529
529
  return false;
530
530
  }
531
+ function addTestId(element, id) {
532
+ element.setAttribute('data-testid', id);
533
+ }
531
534
 
532
535
  function tail(arr) {
533
536
  if (arr.length === 0) {
@@ -589,7 +592,11 @@ define(['exports'], (function (exports) { 'use strict';
589
592
 
590
593
  const clamp = (value, min, max) => {
591
594
  if (min > max) {
592
- throw new Error(`${min} > ${max} is an invalid condition`);
595
+ /**
596
+ * caveat: an error should be thrown here if this was a proper `clamp` function but we need to handle
597
+ * cases where `min` > `max` and in those cases return `min`.
598
+ */
599
+ return min;
593
600
  }
594
601
  return Math.min(max, Math.max(value, min));
595
602
  };
@@ -794,7 +801,14 @@ define(['exports'], (function (exports) { 'use strict';
794
801
  this._disabled = value;
795
802
  toggleClass(this.element, 'dv-splitview-disabled', value);
796
803
  }
804
+ get margin() {
805
+ return this._margin;
806
+ }
807
+ set margin(value) {
808
+ this._margin = value;
809
+ }
797
810
  constructor(container, options) {
811
+ var _a;
798
812
  this.container = container;
799
813
  this.viewItems = [];
800
814
  this.sashes = [];
@@ -805,6 +819,7 @@ define(['exports'], (function (exports) { 'use strict';
805
819
  this._startSnappingEnabled = true;
806
820
  this._endSnappingEnabled = true;
807
821
  this._disabled = false;
822
+ this._margin = 0;
808
823
  this._onDidSashEnd = new Emitter();
809
824
  this.onDidSashEnd = this._onDidSashEnd.event;
810
825
  this._onDidAddView = new Emitter();
@@ -893,6 +908,7 @@ define(['exports'], (function (exports) { 'use strict';
893
908
  };
894
909
  this._orientation = options.orientation;
895
910
  this.element = this.createContainer();
911
+ this.margin = (_a = options.margin) !== null && _a !== void 0 ? _a : 0;
896
912
  this.proportionalLayout =
897
913
  options.proportionalLayout === undefined
898
914
  ? true
@@ -947,9 +963,7 @@ define(['exports'], (function (exports) { 'use strict';
947
963
  if (index < 0 || index >= this.viewItems.length) {
948
964
  throw new Error('Index out of bounds');
949
965
  }
950
- toggleClass(this.container, 'visible', visible);
951
966
  const viewItem = this.viewItems[index];
952
- toggleClass(this.container, 'visible', visible);
953
967
  viewItem.setVisible(visible, viewItem.size);
954
968
  this.distributeEmptySpace(index);
955
969
  this.layoutViews();
@@ -1261,15 +1275,29 @@ define(['exports'], (function (exports) { 'use strict';
1261
1275
  this._proportions = this.viewItems.map((i) => i.visible ? i.size / this._contentSize : undefined);
1262
1276
  }
1263
1277
  }
1278
+ /**
1279
+ * Margin explain:
1280
+ *
1281
+ * For `n` views in a splitview there will be `n-1` margins `m`.
1282
+ *
1283
+ * To fit the margins each view must reduce in size by `(m * (n - 1)) / n`.
1284
+ *
1285
+ * For each view `i` the offet must be adjusted by `m * i/(n - 1)`.
1286
+ */
1264
1287
  layoutViews() {
1265
1288
  this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
1266
- let sum = 0;
1267
- const x = [];
1268
1289
  this.updateSashEnablement();
1290
+ if (this.viewItems.length === 0) {
1291
+ return;
1292
+ }
1293
+ const sashCount = this.viewItems.length - 1;
1294
+ const marginReducedSize = (this.margin * sashCount) / this.viewItems.length;
1295
+ let totalLeftOffset = 0;
1296
+ const viewLeftOffsets = [];
1269
1297
  for (let i = 0; i < this.viewItems.length - 1; i++) {
1270
- sum += this.viewItems[i].size;
1271
- x.push(sum);
1272
- const offset = Math.min(Math.max(0, sum - 2), this.size - 4);
1298
+ totalLeftOffset += this.viewItems[i].size;
1299
+ viewLeftOffsets.push(totalLeftOffset);
1300
+ const offset = Math.min(Math.max(0, totalLeftOffset - 2), this.size - this.margin);
1273
1301
  if (this._orientation === exports.Orientation.HORIZONTAL) {
1274
1302
  this.sashes[i].container.style.left = `${offset}px`;
1275
1303
  this.sashes[i].container.style.top = `0px`;
@@ -1280,19 +1308,24 @@ define(['exports'], (function (exports) { 'use strict';
1280
1308
  }
1281
1309
  }
1282
1310
  this.viewItems.forEach((view, i) => {
1311
+ const size = view.size - marginReducedSize;
1312
+ const offset = i === 0
1313
+ ? 0
1314
+ : viewLeftOffsets[i - 1] +
1315
+ (i / sashCount) * marginReducedSize;
1283
1316
  if (this._orientation === exports.Orientation.HORIZONTAL) {
1284
- view.container.style.width = `${view.size}px`;
1285
- view.container.style.left = i == 0 ? '0px' : `${x[i - 1]}px`;
1317
+ view.container.style.width = `${size}px`;
1318
+ view.container.style.left = `${offset}px`;
1286
1319
  view.container.style.top = '';
1287
1320
  view.container.style.height = '';
1288
1321
  }
1289
1322
  if (this._orientation === exports.Orientation.VERTICAL) {
1290
- view.container.style.height = `${view.size}px`;
1291
- view.container.style.top = i == 0 ? '0px' : `${x[i - 1]}px`;
1323
+ view.container.style.height = `${size}px`;
1324
+ view.container.style.top = `${offset}px`;
1292
1325
  view.container.style.width = '';
1293
1326
  view.container.style.left = '';
1294
1327
  }
1295
- view.view.layout(view.size, this._orthogonalSize);
1328
+ view.view.layout(view.size - marginReducedSize, this._orthogonalSize);
1296
1329
  });
1297
1330
  }
1298
1331
  findFirstSnapIndex(indexes) {
@@ -1741,7 +1774,18 @@ define(['exports'], (function (exports) { 'use strict';
1741
1774
  set disabled(value) {
1742
1775
  this.splitview.disabled = value;
1743
1776
  }
1744
- constructor(orientation, proportionalLayout, styles, size, orthogonalSize, disabled, childDescriptors) {
1777
+ get margin() {
1778
+ return this.splitview.margin;
1779
+ }
1780
+ set margin(value) {
1781
+ this.splitview.margin = value;
1782
+ this.children.forEach((child) => {
1783
+ if (child instanceof BranchNode) {
1784
+ child.margin = value;
1785
+ }
1786
+ });
1787
+ }
1788
+ constructor(orientation, proportionalLayout, styles, size, orthogonalSize, disabled, margin, childDescriptors) {
1745
1789
  super();
1746
1790
  this.orientation = orientation;
1747
1791
  this.proportionalLayout = proportionalLayout;
@@ -1761,6 +1805,7 @@ define(['exports'], (function (exports) { 'use strict';
1761
1805
  orientation: this.orientation,
1762
1806
  proportionalLayout,
1763
1807
  styles,
1808
+ margin,
1764
1809
  });
1765
1810
  this.splitview.layout(this.size, this.orthogonalSize);
1766
1811
  }
@@ -1784,6 +1829,7 @@ define(['exports'], (function (exports) { 'use strict';
1784
1829
  descriptor,
1785
1830
  proportionalLayout,
1786
1831
  styles,
1832
+ margin,
1787
1833
  });
1788
1834
  }
1789
1835
  this.disabled = disabled;
@@ -1792,10 +1838,8 @@ define(['exports'], (function (exports) { 'use strict';
1792
1838
  }));
1793
1839
  this.setupChildrenEvents();
1794
1840
  }
1795
- setVisible(visible) {
1796
- for (const child of this.children) {
1797
- child.setVisible(visible);
1798
- }
1841
+ setVisible(_visible) {
1842
+ // noop
1799
1843
  }
1800
1844
  isChildVisible(index) {
1801
1845
  if (index < 0 || index >= this.children.length) {
@@ -1812,12 +1856,13 @@ define(['exports'], (function (exports) { 'use strict';
1812
1856
  }
1813
1857
  const wereAllChildrenHidden = this.splitview.contentSize === 0;
1814
1858
  this.splitview.setViewVisible(index, visible);
1859
+ // }
1815
1860
  const areAllChildrenHidden = this.splitview.contentSize === 0;
1816
1861
  // If all children are hidden then the parent should hide the entire splitview
1817
1862
  // If the entire splitview is hidden then the parent should show the splitview when a child is shown
1818
1863
  if ((visible && wereAllChildrenHidden) ||
1819
1864
  (!visible && areAllChildrenHidden)) {
1820
- this._onDidVisibilityChange.fire(visible);
1865
+ this._onDidVisibilityChange.fire({ visible });
1821
1866
  }
1822
1867
  }
1823
1868
  moveChild(from, to) {
@@ -1890,7 +1935,7 @@ define(['exports'], (function (exports) { 'use strict';
1890
1935
  this._onDidChange.fire({ size: e.orthogonalSize });
1891
1936
  }), ...this.children.map((c, i) => {
1892
1937
  if (c instanceof BranchNode) {
1893
- return c.onDidVisibilityChange((visible) => {
1938
+ return c.onDidVisibilityChange(({ visible }) => {
1894
1939
  this.setChildVisible(i, visible);
1895
1940
  });
1896
1941
  }
@@ -1920,7 +1965,7 @@ define(['exports'], (function (exports) { 'use strict';
1920
1965
  }
1921
1966
  function flipNode(node, size, orthogonalSize) {
1922
1967
  if (node instanceof BranchNode) {
1923
- const result = new BranchNode(orthogonal(node.orientation), node.proportionalLayout, node.styles, size, orthogonalSize, node.disabled);
1968
+ const result = new BranchNode(orthogonal(node.orientation), node.proportionalLayout, node.styles, size, orthogonalSize, node.disabled, node.margin);
1924
1969
  let totalSize = 0;
1925
1970
  for (let i = node.children.length - 1; i >= 0; i--) {
1926
1971
  const child = node.children[i];
@@ -2075,6 +2120,13 @@ define(['exports'], (function (exports) { 'use strict';
2075
2120
  }
2076
2121
  }
2077
2122
  }
2123
+ get margin() {
2124
+ return this._margin;
2125
+ }
2126
+ set margin(value) {
2127
+ this._margin = value;
2128
+ this.root.margin = value;
2129
+ }
2078
2130
  maximizedView() {
2079
2131
  var _a;
2080
2132
  return (_a = this._maximizedNode) === null || _a === void 0 ? void 0 : _a.leaf.view;
@@ -2160,13 +2212,14 @@ define(['exports'], (function (exports) { 'use strict';
2160
2212
  this.disposable.dispose();
2161
2213
  this._onDidChange.dispose();
2162
2214
  this._onDidMaximizedNodeChange.dispose();
2215
+ this._onDidViewVisibilityChange.dispose();
2163
2216
  this.root.dispose();
2164
2217
  this._maximizedNode = undefined;
2165
2218
  this.element.remove();
2166
2219
  }
2167
2220
  clear() {
2168
2221
  const orientation = this.root.orientation;
2169
- this.root = new BranchNode(orientation, this.proportionalLayout, this.styles, this.root.size, this.root.orthogonalSize, this._locked);
2222
+ this.root = new BranchNode(orientation, this.proportionalLayout, this.styles, this.root.size, this.root.orthogonalSize, this.locked, this.margin);
2170
2223
  }
2171
2224
  deserialize(json, deserializer) {
2172
2225
  const orientation = json.orientation;
@@ -2177,6 +2230,7 @@ define(['exports'], (function (exports) { 'use strict';
2177
2230
  this.root = this._deserializeNode(root, orientation, deserializer, orthogonalSize);
2178
2231
  }
2179
2232
  _deserializeNode(node, orientation, deserializer, orthogonalSize) {
2233
+ var _a;
2180
2234
  let result;
2181
2235
  if (node.type === 'branch') {
2182
2236
  const serializedChildren = node.data;
@@ -2188,10 +2242,14 @@ define(['exports'], (function (exports) { 'use strict';
2188
2242
  });
2189
2243
  result = new BranchNode(orientation, this.proportionalLayout, this.styles, node.size, // <- orthogonal size - flips at each depth
2190
2244
  orthogonalSize, // <- size - flips at each depth,
2191
- this._locked, children);
2245
+ this.locked, this.margin, children);
2192
2246
  }
2193
2247
  else {
2194
- result = new LeafNode(deserializer.fromJSON(node), orientation, orthogonalSize, node.size);
2248
+ const view = deserializer.fromJSON(node);
2249
+ if (typeof node.visible === 'boolean') {
2250
+ (_a = view.setVisible) === null || _a === void 0 ? void 0 : _a.call(view, node.visible);
2251
+ }
2252
+ result = new LeafNode(view, orientation, orthogonalSize, node.size);
2195
2253
  }
2196
2254
  return result;
2197
2255
  }
@@ -2221,7 +2279,7 @@ define(['exports'], (function (exports) { 'use strict';
2221
2279
  }
2222
2280
  const oldRoot = this.root;
2223
2281
  oldRoot.element.remove();
2224
- this._root = new BranchNode(orthogonal(oldRoot.orientation), this.proportionalLayout, this.styles, this.root.orthogonalSize, this.root.size, this._locked);
2282
+ this._root = new BranchNode(orthogonal(oldRoot.orientation), this.proportionalLayout, this.styles, this.root.orthogonalSize, this.root.size, this.locked, this.margin);
2225
2283
  if (oldRoot.children.length === 0) ;
2226
2284
  else if (oldRoot.children.length === 1) {
2227
2285
  // can remove one level of redundant branching if there is only a single child
@@ -2286,19 +2344,24 @@ define(['exports'], (function (exports) { 'use strict';
2286
2344
  }
2287
2345
  return findLeaf(this.root, reverse);
2288
2346
  }
2289
- constructor(proportionalLayout, styles, orientation) {
2347
+ constructor(proportionalLayout, styles, orientation, locked, margin) {
2290
2348
  this.proportionalLayout = proportionalLayout;
2291
2349
  this.styles = styles;
2292
2350
  this._locked = false;
2351
+ this._margin = 0;
2293
2352
  this._maximizedNode = undefined;
2294
2353
  this.disposable = new MutableDisposable();
2295
2354
  this._onDidChange = new Emitter();
2296
2355
  this.onDidChange = this._onDidChange.event;
2356
+ this._onDidViewVisibilityChange = new Emitter();
2357
+ this.onDidViewVisibilityChange = this._onDidViewVisibilityChange.event;
2297
2358
  this._onDidMaximizedNodeChange = new Emitter();
2298
2359
  this.onDidMaximizedNodeChange = this._onDidMaximizedNodeChange.event;
2299
2360
  this.element = document.createElement('div');
2300
2361
  this.element.className = 'grid-view';
2301
- this.root = new BranchNode(orientation, proportionalLayout, styles, 0, 0, this._locked);
2362
+ this._locked = locked !== null && locked !== void 0 ? locked : false;
2363
+ this._margin = margin !== null && margin !== void 0 ? margin : 0;
2364
+ this.root = new BranchNode(orientation, proportionalLayout, styles, 0, 0, this.locked, this.margin);
2302
2365
  }
2303
2366
  isViewVisible(location) {
2304
2367
  const [rest, index] = tail(location);
@@ -2317,6 +2380,7 @@ define(['exports'], (function (exports) { 'use strict';
2317
2380
  if (!(parent instanceof BranchNode)) {
2318
2381
  throw new Error('Invalid from location');
2319
2382
  }
2383
+ this._onDidViewVisibilityChange.fire();
2320
2384
  parent.setChildVisible(index, visible);
2321
2385
  }
2322
2386
  moveView(parentLocation, from, to) {
@@ -2349,7 +2413,7 @@ define(['exports'], (function (exports) { 'use strict';
2349
2413
  }
2350
2414
  const child = grandParent.removeChild(parentIndex);
2351
2415
  child.dispose();
2352
- const newParent = new BranchNode(parent.orientation, this.proportionalLayout, this.styles, parent.size, parent.orthogonalSize, this._locked);
2416
+ const newParent = new BranchNode(parent.orientation, this.proportionalLayout, this.styles, parent.size, parent.orthogonalSize, this.locked, this.margin);
2353
2417
  grandParent.addChild(newParent, parent.size, parentIndex);
2354
2418
  const newSibling = new LeafNode(parent.view, grandParent.orientation, parent.size);
2355
2419
  newParent.addChild(newSibling, newSiblingSize, 0);
@@ -2588,14 +2652,18 @@ define(['exports'], (function (exports) { 'use strict';
2588
2652
  this.onDidActiveChange = this._onDidActiveChange.event;
2589
2653
  this._bufferOnDidLayoutChange = new AsapEvent();
2590
2654
  this.onDidLayoutChange = this._bufferOnDidLayoutChange.onEvent;
2655
+ this._onDidViewVisibilityChangeMicroTaskQueue = new AsapEvent();
2656
+ this.onDidViewVisibilityChangeMicroTaskQueue = this._onDidViewVisibilityChangeMicroTaskQueue.onEvent;
2591
2657
  this.element.style.height = '100%';
2592
2658
  this.element.style.width = '100%';
2593
2659
  options.parentElement.appendChild(this.element);
2594
- this.gridview = new Gridview(!!options.proportionalLayout, options.styles, options.orientation);
2660
+ this.gridview = new Gridview(!!options.proportionalLayout, options.styles, options.orientation, options.locked, options.margin);
2595
2661
  this.gridview.locked = !!options.locked;
2596
2662
  this.element.appendChild(this.gridview.element);
2597
2663
  this.layout(0, 0, true); // set some elements height/widths
2598
- this.addDisposables(exports.DockviewDisposable.from(() => {
2664
+ this.addDisposables(this.gridview.onDidViewVisibilityChange(() => this._onDidViewVisibilityChangeMicroTaskQueue.fire()), this.onDidViewVisibilityChangeMicroTaskQueue(() => {
2665
+ this.layout(this.width, this.height, true);
2666
+ }), exports.DockviewDisposable.from(() => {
2599
2667
  var _a;
2600
2668
  (_a = this.element.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(this.element);
2601
2669
  }), this.gridview.onDidChange(() => {
@@ -3209,6 +3277,9 @@ define(['exports'], (function (exports) { 'use strict';
3209
3277
  get onDidRemovePanel() {
3210
3278
  return this.component.onDidRemovePanel;
3211
3279
  }
3280
+ get onDidMovePanel() {
3281
+ return this.component.onDidMovePanel;
3282
+ }
3212
3283
  /**
3213
3284
  * Invoked after a layout is deserialzied using the `fromJSON` method.
3214
3285
  */
@@ -3349,8 +3420,8 @@ define(['exports'], (function (exports) { 'use strict';
3349
3420
  /**
3350
3421
  * Add a floating group
3351
3422
  */
3352
- addFloatingGroup(item, coord) {
3353
- return this.component.addFloatingGroup(item, coord);
3423
+ addFloatingGroup(item, options) {
3424
+ return this.component.addFloatingGroup(item, options);
3354
3425
  }
3355
3426
  /**
3356
3427
  * Create a component from a serialized object.
@@ -3400,6 +3471,9 @@ define(['exports'], (function (exports) { 'use strict';
3400
3471
  addPopoutGroup(item, options) {
3401
3472
  return this.component.addPopoutGroup(item, options);
3402
3473
  }
3474
+ setGap(gap) {
3475
+ this.component.updateOptions({ gap });
3476
+ }
3403
3477
  }
3404
3478
 
3405
3479
  class DragHandler extends CompositeDisposable {
@@ -4769,7 +4843,8 @@ define(['exports'], (function (exports) { 'use strict';
4769
4843
  this.accessor.addFloatingGroup(this.group, {
4770
4844
  x: left - rootLeft + 20,
4771
4845
  y: top - rootTop + 20,
4772
- }, { inDragMode: true });
4846
+ inDragMode: true,
4847
+ });
4773
4848
  }
4774
4849
  }), addDisposableListener(this.tabContainer, 'mousedown', (event) => {
4775
4850
  if (event.defaultPrevented) {
@@ -4838,7 +4913,8 @@ define(['exports'], (function (exports) { 'use strict';
4838
4913
  this.accessor.addFloatingGroup(panel, {
4839
4914
  x: left - rootLeft,
4840
4915
  y: top - rootTop,
4841
- }, { inDragMode: true });
4916
+ inDragMode: true,
4917
+ });
4842
4918
  return;
4843
4919
  }
4844
4920
  const isLeftClick = event.button === 0;
@@ -4911,6 +4987,7 @@ define(['exports'], (function (exports) { 'use strict';
4911
4987
  rootOverlayModel: undefined,
4912
4988
  locked: undefined,
4913
4989
  disableDnd: undefined,
4990
+ gap: undefined,
4914
4991
  };
4915
4992
  return Object.keys(properties);
4916
4993
  })();
@@ -5641,6 +5718,9 @@ define(['exports'], (function (exports) { 'use strict';
5641
5718
  get isActive() {
5642
5719
  return this.api.isActive;
5643
5720
  }
5721
+ get isVisible() {
5722
+ return this.api.isVisible;
5723
+ }
5644
5724
  constructor(id, component, options, api) {
5645
5725
  super(id, component, api !== null && api !== void 0 ? api : new GridviewPanelApiImpl(id, component));
5646
5726
  this._evaluatedMinimumWidth = 0;
@@ -6177,52 +6257,40 @@ define(['exports'], (function (exports) { 'use strict';
6177
6257
  }
6178
6258
  constructor() {
6179
6259
  super();
6180
- //
6181
- this.params = {};
6182
6260
  this._element = document.createElement('div');
6183
6261
  this._element.className = 'dv-default-tab';
6184
- //
6185
6262
  this._content = document.createElement('div');
6186
6263
  this._content.className = 'dv-default-tab-content';
6187
6264
  this.action = document.createElement('div');
6188
6265
  this.action.className = 'dv-default-tab-action';
6189
6266
  this.action.appendChild(createCloseButton());
6190
- //
6191
6267
  this._element.appendChild(this._content);
6192
6268
  this._element.appendChild(this.action);
6193
- //
6194
6269
  this.addDisposables(addDisposableListener(this.action, 'mousedown', (ev) => {
6195
6270
  ev.preventDefault();
6196
6271
  }));
6197
6272
  this.render();
6198
6273
  }
6199
- update(event) {
6200
- this.params = Object.assign(Object.assign({}, this.params), event.params);
6201
- this.render();
6202
- }
6203
- focus() {
6204
- //noop
6205
- }
6206
6274
  init(params) {
6207
- this.params = params;
6208
- this._content.textContent = params.title;
6209
- addDisposableListener(this.action, 'click', (ev) => {
6210
- ev.preventDefault(); //
6211
- this.params.api.close();
6212
- });
6213
- }
6214
- onGroupChange(_group) {
6215
- this.render();
6216
- }
6217
- onPanelVisibleChange(_isPanelVisible) {
6275
+ this._title = params.title;
6276
+ this.addDisposables(params.api.onDidTitleChange((event) => {
6277
+ this._title = event.title;
6278
+ this.render();
6279
+ }), addDisposableListener(this.action, 'mousedown', (ev) => {
6280
+ ev.preventDefault();
6281
+ }), addDisposableListener(this.action, 'click', (ev) => {
6282
+ if (ev.defaultPrevented) {
6283
+ return;
6284
+ }
6285
+ ev.preventDefault();
6286
+ params.api.close();
6287
+ }));
6218
6288
  this.render();
6219
6289
  }
6220
- layout(_width, _height) {
6221
- // noop
6222
- }
6223
6290
  render() {
6224
- if (this._content.textContent !== this.params.title) {
6225
- this._content.textContent = this.params.title;
6291
+ var _a;
6292
+ if (this._content.textContent !== this._title) {
6293
+ this._content.textContent = (_a = this._title) !== null && _a !== void 0 ? _a : '';
6226
6294
  }
6227
6295
  }
6228
6296
  }
@@ -6415,12 +6483,7 @@ define(['exports'], (function (exports) { 'use strict';
6415
6483
  this._element.appendChild(this.options.content);
6416
6484
  this.options.container.appendChild(this._element);
6417
6485
  // if input bad resize within acceptable boundaries
6418
- this.setBounds({
6419
- height: this.options.height,
6420
- width: this.options.width,
6421
- top: this.options.top,
6422
- left: this.options.left,
6423
- });
6486
+ this.setBounds(Object.assign(Object.assign(Object.assign(Object.assign({ height: this.options.height, width: this.options.width }, ('top' in this.options && { top: this.options.top })), ('bottom' in this.options && { bottom: this.options.bottom })), ('left' in this.options && { left: this.options.left })), ('right' in this.options && { right: this.options.right })));
6424
6487
  }
6425
6488
  setBounds(bounds = {}) {
6426
6489
  if (typeof bounds.height === 'number') {
@@ -6429,11 +6492,25 @@ define(['exports'], (function (exports) { 'use strict';
6429
6492
  if (typeof bounds.width === 'number') {
6430
6493
  this._element.style.width = `${bounds.width}px`;
6431
6494
  }
6432
- if (typeof bounds.top === 'number') {
6495
+ if ('top' in bounds && typeof bounds.top === 'number') {
6433
6496
  this._element.style.top = `${bounds.top}px`;
6497
+ this._element.style.bottom = 'auto';
6498
+ this.verticalAlignment = 'top';
6499
+ }
6500
+ if ('bottom' in bounds && typeof bounds.bottom === 'number') {
6501
+ this._element.style.bottom = `${bounds.bottom}px`;
6502
+ this._element.style.top = 'auto';
6503
+ this.verticalAlignment = 'bottom';
6434
6504
  }
6435
- if (typeof bounds.left === 'number') {
6505
+ if ('left' in bounds && typeof bounds.left === 'number') {
6436
6506
  this._element.style.left = `${bounds.left}px`;
6507
+ this._element.style.right = 'auto';
6508
+ this.horiziontalAlignment = 'left';
6509
+ }
6510
+ if ('right' in bounds && typeof bounds.right === 'number') {
6511
+ this._element.style.right = `${bounds.right}px`;
6512
+ this._element.style.left = 'auto';
6513
+ this.horiziontalAlignment = 'right';
6437
6514
  }
6438
6515
  const containerRect = this.options.container.getBoundingClientRect();
6439
6516
  const overlayRect = this._element.getBoundingClientRect();
@@ -6441,24 +6518,54 @@ define(['exports'], (function (exports) { 'use strict';
6441
6518
  // a minimum width of minimumViewportWidth must be inside the viewport
6442
6519
  const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));
6443
6520
  // a minimum height of minimumViewportHeight must be inside the viewport
6444
- const yOffset = typeof this.options.minimumInViewportHeight === 'number'
6445
- ? Math.max(0, this.getMinimumHeight(overlayRect.height))
6446
- : 0;
6447
- const left = clamp(overlayRect.left - containerRect.left, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
6448
- const top = clamp(overlayRect.top - containerRect.top, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
6449
- this._element.style.left = `${left}px`;
6450
- this._element.style.top = `${top}px`;
6521
+ const yOffset = Math.max(0, this.getMinimumHeight(overlayRect.height));
6522
+ if (this.verticalAlignment === 'top') {
6523
+ const top = clamp(overlayRect.top - containerRect.top, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
6524
+ this._element.style.top = `${top}px`;
6525
+ this._element.style.bottom = 'auto';
6526
+ }
6527
+ if (this.verticalAlignment === 'bottom') {
6528
+ const bottom = clamp(containerRect.bottom - overlayRect.bottom, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
6529
+ this._element.style.bottom = `${bottom}px`;
6530
+ this._element.style.top = 'auto';
6531
+ }
6532
+ if (this.horiziontalAlignment === 'left') {
6533
+ const left = clamp(overlayRect.left - containerRect.left, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
6534
+ this._element.style.left = `${left}px`;
6535
+ this._element.style.right = 'auto';
6536
+ }
6537
+ if (this.horiziontalAlignment === 'right') {
6538
+ const right = clamp(containerRect.right - overlayRect.right, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
6539
+ this._element.style.right = `${right}px`;
6540
+ this._element.style.left = 'auto';
6541
+ }
6451
6542
  this._onDidChange.fire();
6452
6543
  }
6453
6544
  toJSON() {
6454
6545
  const container = this.options.container.getBoundingClientRect();
6455
6546
  const element = this._element.getBoundingClientRect();
6456
- return {
6457
- top: element.top - container.top,
6458
- left: element.left - container.left,
6459
- width: element.width,
6460
- height: element.height,
6461
- };
6547
+ const result = {};
6548
+ if (this.verticalAlignment === 'top') {
6549
+ result.top = parseFloat(this._element.style.top);
6550
+ }
6551
+ else if (this.verticalAlignment === 'bottom') {
6552
+ result.bottom = parseFloat(this._element.style.bottom);
6553
+ }
6554
+ else {
6555
+ result.top = element.top - container.top;
6556
+ }
6557
+ if (this.horiziontalAlignment === 'left') {
6558
+ result.left = parseFloat(this._element.style.left);
6559
+ }
6560
+ else if (this.horiziontalAlignment === 'right') {
6561
+ result.right = parseFloat(this._element.style.right);
6562
+ }
6563
+ else {
6564
+ result.left = element.left - container.left;
6565
+ }
6566
+ result.width = element.width;
6567
+ result.height = element.height;
6568
+ return result;
6462
6569
  }
6463
6570
  setupDrag(dragTarget, options = { inDragMode: false }) {
6464
6571
  const move = new MutableDisposable();
@@ -6490,12 +6597,30 @@ define(['exports'], (function (exports) { 'use strict';
6490
6597
  };
6491
6598
  }
6492
6599
  const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));
6493
- const yOffset = Math.max(0, this.options.minimumInViewportHeight
6494
- ? this.getMinimumHeight(overlayRect.height)
6495
- : 0);
6496
- const left = clamp(x - offset.x, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
6600
+ const yOffset = Math.max(0, this.getMinimumHeight(overlayRect.height));
6497
6601
  const top = clamp(y - offset.y, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
6498
- this.setBounds({ top, left });
6602
+ const bottom = clamp(offset.y -
6603
+ y +
6604
+ containerRect.height -
6605
+ overlayRect.height, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
6606
+ const left = clamp(x - offset.x, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
6607
+ const right = clamp(offset.x - x + containerRect.width - overlayRect.width, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
6608
+ const bounds = {};
6609
+ // Anchor to top or to bottom depending on which one is closer
6610
+ if (top <= bottom) {
6611
+ bounds.top = top;
6612
+ }
6613
+ else {
6614
+ bounds.bottom = bottom;
6615
+ }
6616
+ // Anchor to left or to right depending on which one is closer
6617
+ if (left <= right) {
6618
+ bounds.left = left;
6619
+ }
6620
+ else {
6621
+ bounds.right = right;
6622
+ }
6623
+ this.setBounds(bounds);
6499
6624
  }), addDisposableWindowListener(window, 'mouseup', () => {
6500
6625
  toggleClass(this._element, 'dv-resize-container-dragging', false);
6501
6626
  move.dispose();
@@ -6563,8 +6688,10 @@ define(['exports'], (function (exports) { 'use strict';
6563
6688
  };
6564
6689
  }
6565
6690
  let top = undefined;
6691
+ let bottom = undefined;
6566
6692
  let height = undefined;
6567
6693
  let left = undefined;
6694
+ let right = undefined;
6568
6695
  let width = undefined;
6569
6696
  const moveTop = () => {
6570
6697
  top = clamp(y, -Number.MAX_VALUE, startPosition.originalY +
@@ -6578,6 +6705,7 @@ define(['exports'], (function (exports) { 'use strict';
6578
6705
  startPosition.originalY +
6579
6706
  startPosition.originalHeight -
6580
6707
  top;
6708
+ bottom = containerRect.height - top - height;
6581
6709
  };
6582
6710
  const moveBottom = () => {
6583
6711
  top =
@@ -6589,6 +6717,7 @@ define(['exports'], (function (exports) { 'use strict';
6589
6717
  ? -top +
6590
6718
  this.options.minimumInViewportHeight
6591
6719
  : Overlay.MINIMUM_HEIGHT, Number.MAX_VALUE);
6720
+ bottom = containerRect.height - top - height;
6592
6721
  };
6593
6722
  const moveLeft = () => {
6594
6723
  left = clamp(x, -Number.MAX_VALUE, startPosition.originalX +
@@ -6602,6 +6731,7 @@ define(['exports'], (function (exports) { 'use strict';
6602
6731
  startPosition.originalX +
6603
6732
  startPosition.originalWidth -
6604
6733
  left;
6734
+ right = containerRect.width - left - width;
6605
6735
  };
6606
6736
  const moveRight = () => {
6607
6737
  left =
@@ -6613,6 +6743,7 @@ define(['exports'], (function (exports) { 'use strict';
6613
6743
  ? -left +
6614
6744
  this.options.minimumInViewportWidth
6615
6745
  : Overlay.MINIMUM_WIDTH, Number.MAX_VALUE);
6746
+ right = containerRect.width - left - width;
6616
6747
  };
6617
6748
  switch (direction) {
6618
6749
  case 'top':
@@ -6644,7 +6775,24 @@ define(['exports'], (function (exports) { 'use strict';
6644
6775
  moveRight();
6645
6776
  break;
6646
6777
  }
6647
- this.setBounds({ height, width, top, left });
6778
+ const bounds = {};
6779
+ // Anchor to top or to bottom depending on which one is closer
6780
+ if (top <= bottom) {
6781
+ bounds.top = top;
6782
+ }
6783
+ else {
6784
+ bounds.bottom = bottom;
6785
+ }
6786
+ // Anchor to left or to right depending on which one is closer
6787
+ if (left <= right) {
6788
+ bounds.left = left;
6789
+ }
6790
+ else {
6791
+ bounds.right = right;
6792
+ }
6793
+ bounds.height = height;
6794
+ bounds.width = width;
6795
+ this.setBounds(bounds);
6648
6796
  }), {
6649
6797
  dispose: () => {
6650
6798
  for (const iframe of iframes) {
@@ -6667,7 +6815,7 @@ define(['exports'], (function (exports) { 'use strict';
6667
6815
  if (typeof this.options.minimumInViewportHeight === 'number') {
6668
6816
  return height - this.options.minimumInViewportHeight;
6669
6817
  }
6670
- return height;
6818
+ return 0;
6671
6819
  }
6672
6820
  dispose() {
6673
6821
  this._element.remove();
@@ -6690,7 +6838,7 @@ define(['exports'], (function (exports) { 'use strict';
6690
6838
  }
6691
6839
 
6692
6840
  const DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE = 100;
6693
- const DEFAULT_FLOATING_GROUP_POSITION = { left: 100, top: 100 };
6841
+ const DEFAULT_FLOATING_GROUP_POSITION = { left: 100, top: 100, width: 300, height: 300 };
6694
6842
 
6695
6843
  function createFocusableElement() {
6696
6844
  const element = document.createElement('div');
@@ -7056,6 +7204,7 @@ define(['exports'], (function (exports) { 'use strict';
7056
7204
  parentElement: options.parentElement,
7057
7205
  disableAutoResizing: options.disableAutoResizing,
7058
7206
  locked: options.locked,
7207
+ margin: options.gap,
7059
7208
  });
7060
7209
  this.nextGroupId = sequentialNumberGenerator();
7061
7210
  this._deserializer = new DefaultDockviewDeserialzier(this);
@@ -7081,9 +7230,9 @@ define(['exports'], (function (exports) { 'use strict';
7081
7230
  this._onDidActivePanelChange = new Emitter();
7082
7231
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
7083
7232
  this._onDidMovePanel = new Emitter();
7233
+ this.onDidMovePanel = this._onDidMovePanel.event;
7084
7234
  this._floatingGroups = [];
7085
7235
  this._popoutGroups = [];
7086
- this._ignoreEvents = 0;
7087
7236
  this._onDidRemoveGroup = new Emitter();
7088
7237
  this.onDidRemoveGroup = this._onDidRemoveGroup.event;
7089
7238
  this._onDidAddGroup = new Emitter();
@@ -7097,7 +7246,9 @@ define(['exports'], (function (exports) { 'use strict';
7097
7246
  this.overlayRenderContainer = new OverlayRenderContainer(gready);
7098
7247
  toggleClass(this.gridview.element, 'dv-dockview', true);
7099
7248
  toggleClass(this.element, 'dv-debug', !!options.debug);
7100
- this.addDisposables(this.overlayRenderContainer, this._onWillDragPanel, this._onWillDragGroup, this._onWillShowOverlay, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, this._onWillDrop, this._onDidMovePanel, this._onDidAddGroup, this._onDidRemoveGroup, this._onDidActiveGroupChange, this._onUnhandledDragOverEvent, this.onDidAdd((event) => {
7249
+ this.addDisposables(this.overlayRenderContainer, this._onWillDragPanel, this._onWillDragGroup, this._onWillShowOverlay, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, this._onWillDrop, this._onDidMovePanel, this._onDidAddGroup, this._onDidRemoveGroup, this._onDidActiveGroupChange, this._onUnhandledDragOverEvent, this.onDidViewVisibilityChangeMicroTaskQueue(() => {
7250
+ this.updateWatermark();
7251
+ }), this.onDidAdd((event) => {
7101
7252
  if (!this._moving) {
7102
7253
  this._onDidAddGroup.fire(event);
7103
7254
  }
@@ -7111,7 +7262,7 @@ define(['exports'], (function (exports) { 'use strict';
7111
7262
  }
7112
7263
  }), exports.DockviewEvent.any(this.onDidAdd, this.onDidRemove)(() => {
7113
7264
  this.updateWatermark();
7114
- }), exports.DockviewEvent.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidActivePanelChange)(() => {
7265
+ }), exports.DockviewEvent.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidAddGroup, this.onDidRemove, this.onDidMovePanel, this.onDidActivePanelChange)(() => {
7115
7266
  this._bufferOnDidLayoutChange.fire();
7116
7267
  }), exports.DockviewDisposable.from(() => {
7117
7268
  // iterate over a copy of the array since .dispose() mutates the original array
@@ -7362,8 +7513,8 @@ define(['exports'], (function (exports) { 'use strict';
7362
7513
  console.error('dockview: failed to create popout window', err);
7363
7514
  });
7364
7515
  }
7365
- addFloatingGroup(item, coord, options) {
7366
- var _a, _b, _c, _d, _e, _f, _g;
7516
+ addFloatingGroup(item, options) {
7517
+ var _a, _b, _c, _d, _e;
7367
7518
  let group;
7368
7519
  if (item instanceof DockviewPanel) {
7369
7520
  group = this.createGroup();
@@ -7408,26 +7559,62 @@ define(['exports'], (function (exports) { 'use strict';
7408
7559
  }
7409
7560
  }
7410
7561
  group.model.location = { type: 'floating' };
7411
- const overlayLeft = typeof (coord === null || coord === void 0 ? void 0 : coord.x) === 'number'
7412
- ? Math.max(coord.x, 0)
7413
- : DEFAULT_FLOATING_GROUP_POSITION.left;
7414
- const overlayTop = typeof (coord === null || coord === void 0 ? void 0 : coord.y) === 'number'
7415
- ? Math.max(coord.y, 0)
7416
- : DEFAULT_FLOATING_GROUP_POSITION.top;
7417
- const overlay = new Overlay({
7418
- container: this.gridview.element,
7419
- content: group.element,
7420
- height: (_b = coord === null || coord === void 0 ? void 0 : coord.height) !== null && _b !== void 0 ? _b : 300,
7421
- width: (_c = coord === null || coord === void 0 ? void 0 : coord.width) !== null && _c !== void 0 ? _c : 300,
7422
- left: overlayLeft,
7423
- top: overlayTop,
7424
- minimumInViewportWidth: this.options.floatingGroupBounds === 'boundedWithinViewport'
7562
+ function getAnchoredBox() {
7563
+ if (options === null || options === void 0 ? void 0 : options.position) {
7564
+ const result = {};
7565
+ if ('left' in options.position) {
7566
+ result.left = Math.max(options.position.left, 0);
7567
+ }
7568
+ else if ('right' in options.position) {
7569
+ result.right = Math.max(options.position.right, 0);
7570
+ }
7571
+ else {
7572
+ result.left = DEFAULT_FLOATING_GROUP_POSITION.left;
7573
+ }
7574
+ if ('top' in options.position) {
7575
+ result.top = Math.max(options.position.top, 0);
7576
+ }
7577
+ else if ('bottom' in options.position) {
7578
+ result.bottom = Math.max(options.position.bottom, 0);
7579
+ }
7580
+ else {
7581
+ result.top = DEFAULT_FLOATING_GROUP_POSITION.top;
7582
+ }
7583
+ if ('width' in options.position) {
7584
+ result.width = Math.max(options.position.width, 0);
7585
+ }
7586
+ else {
7587
+ result.width = DEFAULT_FLOATING_GROUP_POSITION.width;
7588
+ }
7589
+ if ('height' in options.position) {
7590
+ result.height = Math.max(options.position.height, 0);
7591
+ }
7592
+ else {
7593
+ result.height = DEFAULT_FLOATING_GROUP_POSITION.height;
7594
+ }
7595
+ return result;
7596
+ }
7597
+ return {
7598
+ left: typeof (options === null || options === void 0 ? void 0 : options.x) === 'number'
7599
+ ? Math.max(options.x, 0)
7600
+ : DEFAULT_FLOATING_GROUP_POSITION.left,
7601
+ top: typeof (options === null || options === void 0 ? void 0 : options.y) === 'number'
7602
+ ? Math.max(options.y, 0)
7603
+ : DEFAULT_FLOATING_GROUP_POSITION.top,
7604
+ width: typeof (options === null || options === void 0 ? void 0 : options.width) === 'number'
7605
+ ? Math.max(options.width, 0)
7606
+ : DEFAULT_FLOATING_GROUP_POSITION.width,
7607
+ height: typeof (options === null || options === void 0 ? void 0 : options.height) === 'number'
7608
+ ? Math.max(options.height, 0)
7609
+ : DEFAULT_FLOATING_GROUP_POSITION.height,
7610
+ };
7611
+ }
7612
+ const anchoredBox = getAnchoredBox();
7613
+ const overlay = new Overlay(Object.assign(Object.assign({ container: this.gridview.element, content: group.element }, anchoredBox), { minimumInViewportWidth: this.options.floatingGroupBounds === 'boundedWithinViewport'
7425
7614
  ? undefined
7426
- : (_e = (_d = this.options.floatingGroupBounds) === null || _d === void 0 ? void 0 : _d.minimumWidthWithinViewport) !== null && _e !== void 0 ? _e : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE,
7427
- minimumInViewportHeight: this.options.floatingGroupBounds === 'boundedWithinViewport'
7615
+ : (_c = (_b = this.options.floatingGroupBounds) === null || _b === void 0 ? void 0 : _b.minimumWidthWithinViewport) !== null && _c !== void 0 ? _c : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE, minimumInViewportHeight: this.options.floatingGroupBounds === 'boundedWithinViewport'
7428
7616
  ? undefined
7429
- : (_g = (_f = this.options.floatingGroupBounds) === null || _f === void 0 ? void 0 : _f.minimumHeightWithinViewport) !== null && _g !== void 0 ? _g : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE,
7430
- });
7617
+ : (_e = (_d = this.options.floatingGroupBounds) === null || _d === void 0 ? void 0 : _d.minimumHeightWithinViewport) !== null && _e !== void 0 ? _e : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE }));
7431
7618
  const el = group.element.querySelector('.void-container');
7432
7619
  if (!el) {
7433
7620
  throw new Error('failed to find drag handle');
@@ -7525,12 +7712,18 @@ define(['exports'], (function (exports) { 'use strict';
7525
7712
  group.overlay.minimumInViewportWidth =
7526
7713
  (_b = this.options.floatingGroupBounds) === null || _b === void 0 ? void 0 : _b.minimumWidthWithinViewport;
7527
7714
  }
7528
- group.overlay.setBounds({});
7715
+ group.overlay.setBounds();
7529
7716
  }
7530
7717
  }
7531
7718
  if (changed_rootOverlayOptions) {
7532
7719
  this._rootDropTarget.setOverlayModel(options.rootOverlayModel);
7533
7720
  }
7721
+ if (this.gridview.margin !== 0 && options.gap === undefined) {
7722
+ this.gridview.margin = 0;
7723
+ }
7724
+ if (typeof options.gap === 'number') {
7725
+ this.gridview.margin = options.gap;
7726
+ }
7534
7727
  this.layout(this.gridview.width, this.gridview.height, true);
7535
7728
  }
7536
7729
  layout(width, height, forceResize) {
@@ -7692,11 +7885,10 @@ define(['exports'], (function (exports) { 'use strict';
7692
7885
  const { data, position } = serializedFloatingGroup;
7693
7886
  const group = createGroupFromSerializedState(data);
7694
7887
  this.addFloatingGroup(group, {
7695
- x: position.left,
7696
- y: position.top,
7697
- height: position.height,
7698
- width: position.width,
7699
- }, { skipRemoveGroup: true, inDragMode: false });
7888
+ position: position,
7889
+ skipRemoveGroup: true,
7890
+ inDragMode: false,
7891
+ });
7700
7892
  }
7701
7893
  const serializedPopoutGroups = (_b = data.popoutGroups) !== null && _b !== void 0 ? _b : [];
7702
7894
  for (const serializedPopoutGroup of serializedPopoutGroups) {
@@ -7831,11 +8023,7 @@ define(['exports'], (function (exports) { 'use strict';
7831
8023
  options.floating !== null
7832
8024
  ? options.floating
7833
8025
  : {};
7834
- this.addFloatingGroup(group, o, {
7835
- inDragMode: false,
7836
- skipRemoveGroup: true,
7837
- skipActiveGroup: true,
7838
- });
8026
+ this.addFloatingGroup(group, Object.assign(Object.assign({}, o), { inDragMode: false, skipRemoveGroup: true, skipActiveGroup: true }));
7839
8027
  panel = this.createPanel(options, group);
7840
8028
  group.model.openPanel(panel, {
7841
8029
  skipSetActive: options.inactive,
@@ -7874,11 +8062,7 @@ define(['exports'], (function (exports) { 'use strict';
7874
8062
  options.floating !== null
7875
8063
  ? options.floating
7876
8064
  : {};
7877
- this.addFloatingGroup(group, coordinates, {
7878
- inDragMode: false,
7879
- skipRemoveGroup: true,
7880
- skipActiveGroup: true,
7881
- });
8065
+ this.addFloatingGroup(group, Object.assign(Object.assign({}, coordinates), { inDragMode: false, skipRemoveGroup: true, skipActiveGroup: true }));
7882
8066
  panel = this.createPanel(options, group);
7883
8067
  group.model.openPanel(panel, {
7884
8068
  skipSetActive: options.inactive,
@@ -7933,6 +8117,7 @@ define(['exports'], (function (exports) { 'use strict';
7933
8117
  });
7934
8118
  const watermarkContainer = document.createElement('div');
7935
8119
  watermarkContainer.className = 'dv-watermark-container';
8120
+ addTestId(watermarkContainer, 'watermark-component');
7936
8121
  watermarkContainer.appendChild(this.watermark.element);
7937
8122
  this.gridview.element.appendChild(watermarkContainer);
7938
8123
  }
@@ -8121,6 +8306,7 @@ define(['exports'], (function (exports) { 'use strict';
8121
8306
  this.doSetGroupAndPanelActive(destinationGroup);
8122
8307
  this._onDidMovePanel.fire({
8123
8308
  panel: removedPanel,
8309
+ from: sourceGroup,
8124
8310
  });
8125
8311
  }
8126
8312
  else {
@@ -8144,6 +8330,10 @@ define(['exports'], (function (exports) { 'use strict';
8144
8330
  // if a group has one tab - we are essentially moving the 'group'
8145
8331
  // which is equivalent to swapping two views in this case
8146
8332
  this.gridview.moveView(sourceParentLocation, from, to);
8333
+ this._onDidMovePanel.fire({
8334
+ panel: this.getGroupPanel(sourceItemId),
8335
+ from: sourceGroup,
8336
+ });
8147
8337
  return;
8148
8338
  }
8149
8339
  }
@@ -8157,6 +8347,10 @@ define(['exports'], (function (exports) { 'use strict';
8157
8347
  const location = getRelativeLocation(this.gridview.orientation, updatedReferenceLocation, destinationTarget);
8158
8348
  this.movingLock(() => this.doAddGroup(targetGroup, location));
8159
8349
  this.doSetGroupAndPanelActive(targetGroup);
8350
+ this._onDidMovePanel.fire({
8351
+ panel: this.getGroupPanel(sourceItemId),
8352
+ from: sourceGroup,
8353
+ });
8160
8354
  }
8161
8355
  else {
8162
8356
  /**
@@ -8176,6 +8370,10 @@ define(['exports'], (function (exports) { 'use strict';
8176
8370
  skipSetGroupActive: true,
8177
8371
  }));
8178
8372
  this.doSetGroupAndPanelActive(group);
8373
+ this._onDidMovePanel.fire({
8374
+ panel: removedPanel,
8375
+ from: sourceGroup,
8376
+ });
8179
8377
  }
8180
8378
  }
8181
8379
  }
@@ -8200,9 +8398,6 @@ define(['exports'], (function (exports) { 'use strict';
8200
8398
  }
8201
8399
  });
8202
8400
  this.doSetGroupAndPanelActive(to);
8203
- panels.forEach((panel) => {
8204
- this._onDidMovePanel.fire({ panel });
8205
- });
8206
8401
  }
8207
8402
  else {
8208
8403
  switch (from.api.location.type) {
@@ -8228,10 +8423,10 @@ define(['exports'], (function (exports) { 'use strict';
8228
8423
  const referenceLocation = getGridLocation(to.element);
8229
8424
  const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, target);
8230
8425
  this.gridview.addView(from, exports.Sizing.Distribute, dropLocation);
8231
- from.panels.forEach((panel) => {
8232
- this._onDidMovePanel.fire({ panel });
8233
- });
8234
8426
  }
8427
+ from.panels.forEach((panel) => {
8428
+ this._onDidMovePanel.fire({ panel, from });
8429
+ });
8235
8430
  }
8236
8431
  doSetGroupActive(group) {
8237
8432
  super.doSetGroupActive(group);