dockview-core 6.6.1 → 7.0.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 (203) hide show
  1. package/README.md +8 -1
  2. package/dist/cjs/api/component.api.d.ts +42 -21
  3. package/dist/cjs/api/component.api.js +111 -20
  4. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +23 -8
  5. package/dist/cjs/api/dockviewGroupPanelApi.js +24 -1
  6. package/dist/cjs/api/dockviewPanelApi.d.ts +4 -3
  7. package/dist/cjs/api/dockviewPanelApi.js +8 -0
  8. package/dist/cjs/dnd/dropTargetAnchorContainer.js +1 -2
  9. package/dist/cjs/dnd/droptarget.d.ts +8 -0
  10. package/dist/cjs/dnd/droptarget.js +28 -0
  11. package/dist/cjs/dnd/pointer/longPress.js +1 -1
  12. package/dist/cjs/dnd/pointer/pointerDragController.js +9 -7
  13. package/dist/cjs/dnd/pointer/pointerDragSource.js +4 -2
  14. package/dist/cjs/dockview/accessibilityMessages.d.ts +32 -0
  15. package/dist/cjs/dockview/accessibilityMessages.js +51 -0
  16. package/dist/cjs/dockview/allModules.d.ts +8 -0
  17. package/dist/cjs/dockview/allModules.js +25 -0
  18. package/dist/cjs/dockview/components/panel/content.d.ts +2 -0
  19. package/dist/cjs/dockview/components/panel/content.js +41 -10
  20. package/dist/cjs/dockview/components/popupService.js +1 -1
  21. package/dist/cjs/dockview/components/tab/tab.js +35 -7
  22. package/dist/cjs/dockview/components/titlebar/floatingTitleBar.d.ts +34 -0
  23. package/dist/cjs/dockview/components/titlebar/floatingTitleBar.js +95 -0
  24. package/dist/cjs/dockview/components/titlebar/groupDragSource.d.ts +51 -0
  25. package/dist/cjs/dockview/components/titlebar/groupDragSource.js +218 -0
  26. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.d.ts +2 -1
  27. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.js +36 -30
  28. package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +27 -5
  29. package/dist/cjs/dockview/components/titlebar/tabGroups.js +104 -53
  30. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +12 -0
  31. package/dist/cjs/dockview/components/titlebar/tabs.js +121 -25
  32. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +4 -0
  33. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +13 -3
  34. package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +1 -4
  35. package/dist/cjs/dockview/components/titlebar/voidContainer.js +32 -156
  36. package/dist/cjs/dockview/dndCapabilities.js +3 -3
  37. package/dist/cjs/dockview/dockviewComponent.d.ts +304 -49
  38. package/dist/cjs/dockview/dockviewComponent.js +1839 -1075
  39. package/dist/cjs/dockview/dockviewFloatingGroupPanel.d.ts +33 -2
  40. package/dist/cjs/dockview/dockviewFloatingGroupPanel.js +39 -3
  41. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +1 -2
  42. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +36 -14
  43. package/dist/cjs/dockview/dockviewGroupPanelModel.js +151 -125
  44. package/dist/cjs/dockview/dockviewPanel.d.ts +2 -2
  45. package/dist/cjs/dockview/dockviewPanel.js +4 -5
  46. package/dist/cjs/dockview/dockviewShell.d.ts +29 -7
  47. package/dist/cjs/dockview/dockviewShell.js +94 -36
  48. package/dist/cjs/dockview/edgeGroupService.d.ts +38 -0
  49. package/dist/cjs/dockview/edgeGroupService.js +128 -0
  50. package/dist/cjs/dockview/floatingGroupService.d.ts +37 -0
  51. package/dist/cjs/dockview/floatingGroupService.js +231 -0
  52. package/dist/cjs/dockview/headerActionsService.d.ts +32 -0
  53. package/dist/cjs/dockview/headerActionsService.js +149 -0
  54. package/dist/cjs/dockview/liveRegionService.d.ts +53 -0
  55. package/dist/cjs/dockview/liveRegionService.js +185 -0
  56. package/dist/cjs/dockview/moduleContracts.d.ts +119 -0
  57. package/dist/cjs/dockview/moduleContracts.js +2 -0
  58. package/dist/cjs/dockview/modules.d.ts +110 -0
  59. package/dist/cjs/dockview/modules.js +304 -0
  60. package/dist/cjs/dockview/options.d.ts +159 -6
  61. package/dist/cjs/dockview/options.js +8 -1
  62. package/dist/cjs/dockview/popoutWindowService.d.ts +95 -0
  63. package/dist/cjs/dockview/popoutWindowService.js +261 -0
  64. package/dist/cjs/dockview/rootDropTargetService.d.ts +35 -0
  65. package/dist/cjs/dockview/rootDropTargetService.js +87 -0
  66. package/dist/cjs/dockview/strictEventsSequencing.js +6 -6
  67. package/dist/cjs/dockview/tabGroup.js +3 -3
  68. package/dist/cjs/dockview/tabGroupAccent.js +1 -3
  69. package/dist/cjs/dockview/watermarkService.d.ts +30 -0
  70. package/dist/cjs/dockview/watermarkService.js +61 -0
  71. package/dist/cjs/dom.js +1 -1
  72. package/dist/cjs/events.js +1 -1
  73. package/dist/cjs/gridview/baseComponentGridview.d.ts +1 -1
  74. package/dist/cjs/gridview/baseComponentGridview.js +6 -10
  75. package/dist/cjs/gridview/branchNode.js +13 -17
  76. package/dist/cjs/gridview/gridview.js +8 -8
  77. package/dist/cjs/gridview/gridviewComponent.d.ts +3 -3
  78. package/dist/cjs/gridview/gridviewComponent.js +1 -6
  79. package/dist/cjs/gridview/gridviewPanel.d.ts +1 -1
  80. package/dist/cjs/index.d.ts +11 -4
  81. package/dist/cjs/index.js +14 -1
  82. package/dist/cjs/overlay/overlay.d.ts +43 -1
  83. package/dist/cjs/overlay/overlay.js +82 -36
  84. package/dist/cjs/overlay/overlayRenderContainer.js +3 -4
  85. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +2 -2
  86. package/dist/cjs/paneview/draggablePaneviewPanel.js +5 -5
  87. package/dist/cjs/paneview/paneviewComponent.d.ts +3 -3
  88. package/dist/cjs/paneview/paneviewComponent.js +7 -11
  89. package/dist/cjs/popoutWindow.js +4 -4
  90. package/dist/cjs/scrollbar.d.ts +1 -1
  91. package/dist/cjs/scrollbar.js +7 -6
  92. package/dist/cjs/splitview/splitview.d.ts +1 -1
  93. package/dist/cjs/splitview/splitview.js +21 -20
  94. package/dist/cjs/splitview/viewItem.js +1 -1
  95. package/dist/dockview-core.js +3548 -1544
  96. package/dist/dockview-core.min.js +2 -2
  97. package/dist/dockview-core.min.js.map +1 -1
  98. package/dist/dockview-core.min.noStyle.js +2 -2
  99. package/dist/dockview-core.min.noStyle.js.map +1 -1
  100. package/dist/dockview-core.noStyle.js +3547 -1543
  101. package/dist/esm/api/component.api.d.ts +42 -21
  102. package/dist/esm/api/component.api.js +63 -18
  103. package/dist/esm/api/dockviewGroupPanelApi.d.ts +23 -8
  104. package/dist/esm/api/dockviewGroupPanelApi.js +20 -1
  105. package/dist/esm/api/dockviewPanelApi.d.ts +4 -3
  106. package/dist/esm/api/dockviewPanelApi.js +7 -0
  107. package/dist/esm/dnd/dropTargetAnchorContainer.js +1 -2
  108. package/dist/esm/dnd/droptarget.d.ts +8 -0
  109. package/dist/esm/dnd/droptarget.js +28 -0
  110. package/dist/esm/dnd/pointer/longPress.js +1 -1
  111. package/dist/esm/dnd/pointer/pointerDragController.js +9 -7
  112. package/dist/esm/dnd/pointer/pointerDragSource.js +4 -2
  113. package/dist/esm/dockview/accessibilityMessages.d.ts +32 -0
  114. package/dist/esm/dockview/accessibilityMessages.js +30 -0
  115. package/dist/esm/dockview/allModules.d.ts +8 -0
  116. package/dist/esm/dockview/allModules.js +22 -0
  117. package/dist/esm/dockview/components/panel/content.d.ts +2 -0
  118. package/dist/esm/dockview/components/panel/content.js +42 -11
  119. package/dist/esm/dockview/components/popupService.js +1 -1
  120. package/dist/esm/dockview/components/tab/tab.js +35 -7
  121. package/dist/esm/dockview/components/titlebar/floatingTitleBar.d.ts +34 -0
  122. package/dist/esm/dockview/components/titlebar/floatingTitleBar.js +65 -0
  123. package/dist/esm/dockview/components/titlebar/groupDragSource.d.ts +51 -0
  124. package/dist/esm/dockview/components/titlebar/groupDragSource.js +178 -0
  125. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.d.ts +2 -1
  126. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.js +36 -30
  127. package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +27 -5
  128. package/dist/esm/dockview/components/titlebar/tabGroups.js +91 -41
  129. package/dist/esm/dockview/components/titlebar/tabs.d.ts +12 -0
  130. package/dist/esm/dockview/components/titlebar/tabs.js +119 -26
  131. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +4 -0
  132. package/dist/esm/dockview/components/titlebar/tabsContainer.js +8 -2
  133. package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +1 -4
  134. package/dist/esm/dockview/components/titlebar/voidContainer.js +34 -146
  135. package/dist/esm/dockview/dndCapabilities.js +3 -3
  136. package/dist/esm/dockview/dockviewComponent.d.ts +304 -49
  137. package/dist/esm/dockview/dockviewComponent.js +1459 -772
  138. package/dist/esm/dockview/dockviewFloatingGroupPanel.d.ts +33 -2
  139. package/dist/esm/dockview/dockviewFloatingGroupPanel.js +35 -3
  140. package/dist/esm/dockview/dockviewGroupPanel.d.ts +1 -2
  141. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +36 -14
  142. package/dist/esm/dockview/dockviewGroupPanelModel.js +127 -117
  143. package/dist/esm/dockview/dockviewPanel.d.ts +2 -2
  144. package/dist/esm/dockview/dockviewPanel.js +1 -2
  145. package/dist/esm/dockview/dockviewShell.d.ts +29 -7
  146. package/dist/esm/dockview/dockviewShell.js +89 -37
  147. package/dist/esm/dockview/edgeGroupService.d.ts +38 -0
  148. package/dist/esm/dockview/edgeGroupService.js +63 -0
  149. package/dist/esm/dockview/floatingGroupService.d.ts +37 -0
  150. package/dist/esm/dockview/floatingGroupService.js +150 -0
  151. package/dist/esm/dockview/headerActionsService.d.ts +32 -0
  152. package/dist/esm/dockview/headerActionsService.js +86 -0
  153. package/dist/esm/dockview/liveRegionService.d.ts +53 -0
  154. package/dist/esm/dockview/liveRegionService.js +159 -0
  155. package/dist/esm/dockview/moduleContracts.d.ts +119 -0
  156. package/dist/esm/dockview/moduleContracts.js +1 -0
  157. package/dist/esm/dockview/modules.d.ts +110 -0
  158. package/dist/esm/dockview/modules.js +170 -0
  159. package/dist/esm/dockview/options.d.ts +159 -6
  160. package/dist/esm/dockview/options.js +8 -1
  161. package/dist/esm/dockview/popoutWindowService.d.ts +95 -0
  162. package/dist/esm/dockview/popoutWindowService.js +175 -0
  163. package/dist/esm/dockview/rootDropTargetService.d.ts +35 -0
  164. package/dist/esm/dockview/rootDropTargetService.js +82 -0
  165. package/dist/esm/dockview/strictEventsSequencing.js +6 -6
  166. package/dist/esm/dockview/tabGroup.js +3 -3
  167. package/dist/esm/dockview/tabGroupAccent.js +1 -3
  168. package/dist/esm/dockview/watermarkService.d.ts +30 -0
  169. package/dist/esm/dockview/watermarkService.js +56 -0
  170. package/dist/esm/dom.js +1 -1
  171. package/dist/esm/events.js +1 -1
  172. package/dist/esm/gridview/baseComponentGridview.d.ts +1 -1
  173. package/dist/esm/gridview/baseComponentGridview.js +5 -10
  174. package/dist/esm/gridview/branchNode.js +13 -15
  175. package/dist/esm/gridview/gridview.js +8 -8
  176. package/dist/esm/gridview/gridviewComponent.d.ts +3 -3
  177. package/dist/esm/gridview/gridviewComponent.js +1 -6
  178. package/dist/esm/gridview/gridviewPanel.d.ts +1 -1
  179. package/dist/esm/index.d.ts +11 -4
  180. package/dist/esm/index.js +4 -0
  181. package/dist/esm/overlay/overlay.d.ts +43 -1
  182. package/dist/esm/overlay/overlay.js +78 -36
  183. package/dist/esm/overlay/overlayRenderContainer.js +3 -4
  184. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +2 -2
  185. package/dist/esm/paneview/draggablePaneviewPanel.js +5 -5
  186. package/dist/esm/paneview/paneviewComponent.d.ts +3 -3
  187. package/dist/esm/paneview/paneviewComponent.js +7 -11
  188. package/dist/esm/popoutWindow.js +4 -4
  189. package/dist/esm/scrollbar.d.ts +1 -1
  190. package/dist/esm/scrollbar.js +7 -6
  191. package/dist/esm/splitview/splitview.d.ts +1 -1
  192. package/dist/esm/splitview/splitview.js +21 -20
  193. package/dist/esm/splitview/viewItem.js +1 -1
  194. package/dist/package/main.cjs.js +3550 -1546
  195. package/dist/package/main.cjs.min.js +2 -2
  196. package/dist/package/main.esm.min.mjs +2 -2
  197. package/dist/package/main.esm.mjs +3538 -1545
  198. package/dist/styles/dockview.css +283 -21
  199. package/package.json +10 -1
  200. package/dist/cjs/dockview/contextMenu.d.ts +0 -10
  201. package/dist/cjs/dockview/contextMenu.js +0 -313
  202. package/dist/esm/dockview/contextMenu.d.ts +0 -10
  203. package/dist/esm/dockview/contextMenu.js +0 -228
@@ -3,7 +3,7 @@ import { getPanelData } from '../dnd/dataTransfer';
3
3
  import { addClasses, isAncestor, removeClasses, toggleClass } from '../dom';
4
4
  import { addDisposableListener, DockviewEvent, Emitter, } from '../events';
5
5
  import { DockviewWillShowOverlayLocationEvent, } from './events';
6
- import { CompositeDisposable, MutableDisposable, } from '../lifecycle';
6
+ import { CompositeDisposable } from '../lifecycle';
7
7
  import { ContentContainer, } from './components/panel/content';
8
8
  import { TabsContainer, } from './components/titlebar/tabsContainer';
9
9
  import { DockviewUnhandledDragOverEvent, } from './options';
@@ -55,6 +55,14 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
55
55
  get activePanel() {
56
56
  return this._activePanel;
57
57
  }
58
+ /** DOM id of the content container (the group's tabpanel), referenced by each tab's `aria-controls`. */
59
+ get contentContainerId() {
60
+ return this.contentContainer.element.id;
61
+ }
62
+ /** The group's content drop target — lets keyboard docking preview a drop here. */
63
+ get contentDropTarget() {
64
+ return this.contentContainer.dropTarget;
65
+ }
58
66
  get locked() {
59
67
  return this._locked;
60
68
  }
@@ -103,11 +111,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
103
111
  if ((_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.layout) {
104
112
  this._activePanel.layout(this._width, this._height);
105
113
  }
106
- if (this._leftHeaderActions ||
107
- this._rightHeaderActions ||
108
- this._prefixHeaderActions) {
109
- this.updateHeaderActions();
110
- }
114
+ this.updateHeaderActions();
111
115
  }
112
116
  get location() {
113
117
  return this._location;
@@ -127,14 +131,15 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
127
131
  applyZones(['top', 'bottom', 'left', 'right', 'center']);
128
132
  break;
129
133
  case 'floating':
130
- applyZones(['center']);
131
- applyZones(value
132
- ? ['center']
133
- : ['top', 'bottom', 'left', 'right', 'center']);
134
+ // Floating windows host their own nested gridview, so an edge
135
+ // drop splits the window's layout just like the main grid.
136
+ applyZones(['top', 'bottom', 'left', 'right', 'center']);
134
137
  toggleClass(this.container, 'dv-groupview-floating', true);
135
138
  break;
136
139
  case 'popout':
137
- applyZones(['center']);
140
+ // Popout windows host their own nested gridview, so an edge
141
+ // drop splits the window's layout just like the main grid.
142
+ applyZones(['top', 'bottom', 'left', 'right', 'center']);
138
143
  toggleClass(this.container, 'dv-groupview-popout', true);
139
144
  break;
140
145
  case 'edge':
@@ -156,9 +161,6 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
156
161
  this.groupPanel = groupPanel;
157
162
  this._isGroupActive = false;
158
163
  this._locked = false;
159
- this._rightHeaderActionsDisposable = new MutableDisposable();
160
- this._leftHeaderActionsDisposable = new MutableDisposable();
161
- this._prefixHeaderActionsDisposable = new MutableDisposable();
162
164
  this._location = { type: 'grid' };
163
165
  this.mostRecentlyUsed = [];
164
166
  this._overwriteRenderContainer = null;
@@ -193,8 +195,8 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
193
195
  this.onDidRemovePanel = this._onDidRemovePanel.event;
194
196
  this._onDidActivePanelChange = new Emitter();
195
197
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
196
- this._onUnhandledDragOverEvent = new Emitter();
197
- this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;
198
+ this._onUnhandledDragOver = new Emitter();
199
+ this.onUnhandledDragOver = this._onUnhandledDragOver.event;
198
200
  this._tabGroups = [];
199
201
  this._tabGroupMap = new Map();
200
202
  this._panelToTabGroup = new Map();
@@ -213,6 +215,9 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
213
215
  this._onDidTabGroupCollapsedChange = new Emitter();
214
216
  this.onDidTabGroupCollapsedChange = this._onDidTabGroupCollapsedChange.event;
215
217
  toggleClass(this.container, 'dv-groupview', true);
218
+ // Each group is a navigable region, labelled by its active panel
219
+ // (see `updateAccessibleLabel`, driven on activation / title change).
220
+ this.container.setAttribute('role', 'region');
216
221
  this._api = new DockviewApi(this.accessor);
217
222
  this.tabsContainer = new TabsContainer(this.accessor, this.groupPanel);
218
223
  this.contentContainer = new ContentContainer(this.accessor, this);
@@ -221,7 +226,10 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
221
226
  this.locked = (_a = options.locked) !== null && _a !== void 0 ? _a : false;
222
227
  this.headerPosition =
223
228
  (_b = options.headerPosition) !== null && _b !== void 0 ? _b : accessor.defaultHeaderPosition;
224
- this.addDisposables(this._onTabDragStart, this._onGroupDragStart, this._onWillShowOverlay, this._rightHeaderActionsDisposable, this._leftHeaderActionsDisposable, this._prefixHeaderActionsDisposable, this.tabsContainer.onTabDragStart((event) => {
229
+ this.addDisposables(
230
+ // Keep the region's accessible name in sync when the active
231
+ // panel's title changes (no-op when a non-active title changes).
232
+ this._onDidPanelTitleChange.event(() => this.updateAccessibleLabel()), this._onTabDragStart, this._onGroupDragStart, this._onWillShowOverlay, this.tabsContainer.onTabDragStart((event) => {
225
233
  this._onTabDragStart.fire(event);
226
234
  }), this.tabsContainer.onGroupDragStart((event) => {
227
235
  this._onGroupDragStart.fire(event);
@@ -284,7 +292,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
284
292
  group: this.groupPanel,
285
293
  getData: getPanelData,
286
294
  }));
287
- }), this._onMove, this._onDidChange, this._onDidDrop, this._onWillDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange, this._onUnhandledDragOverEvent, this._onDidPanelTitleChange, this._onDidPanelParametersChange, this._onDidCreateTabGroup, this._onDidDestroyTabGroup, this._onDidAddPanelToTabGroup, this._onDidRemovePanelFromTabGroup, this._onDidTabGroupChange, this._onDidTabGroupCollapsedChange, this._onDidCreateTabGroup.event(() => {
295
+ }), this._onMove, this._onDidChange, this._onDidDrop, this._onWillDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange, this._onUnhandledDragOver, this._onDidPanelTitleChange, this._onDidPanelParametersChange, this._onDidCreateTabGroup, this._onDidDestroyTabGroup, this._onDidAddPanelToTabGroup, this._onDidRemovePanelFromTabGroup, this._onDidTabGroupChange, this._onDidTabGroupCollapsedChange, this._onDidCreateTabGroup.event(() => {
288
296
  this._scheduleTabGroupUpdate();
289
297
  }), this._onDidDestroyTabGroup.event(() => {
290
298
  this._scheduleTabGroupUpdate();
@@ -310,7 +318,22 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
310
318
  }
311
319
  });
312
320
  }
321
+ /**
322
+ * Bracket a tab-group mutation as a layout transaction. `accessor` is
323
+ * always a full {@link DockviewComponent} in production; the optional-call
324
+ * fallback keeps partial test doubles (which omit `mutation`) working.
325
+ * When nested inside a larger operation (a drag-driven move, fromJSON
326
+ * restore) the component's depth counter folds it into the outer one.
327
+ */
328
+ _bracketTabGroupMutation(func) {
329
+ return this.accessor.mutation
330
+ ? this.accessor.mutation('tab-group', func)
331
+ : func();
332
+ }
313
333
  createTabGroup(options) {
334
+ return this._bracketTabGroupMutation(() => this._doCreateTabGroup(options));
335
+ }
336
+ _doCreateTabGroup(options) {
314
337
  var _a;
315
338
  const id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : `tg-${this.id}-${this._tabGroupIdCounter++}`;
316
339
  const tabGroup = new TabGroup(id, {
@@ -344,14 +367,16 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
344
367
  if (!tabGroup) {
345
368
  return;
346
369
  }
347
- // Remove all panels from the group (they stay in the flat panel list)
348
- const panelIds = [...tabGroup.panelIds];
349
- for (const panelId of panelIds) {
350
- tabGroup.removePanel(panelId);
351
- this._panelToTabGroup.delete(panelId);
352
- this._onDidRemovePanelFromTabGroup.fire({ tabGroup, panelId });
353
- }
354
- tabGroup.dispose();
370
+ this._bracketTabGroupMutation(() => {
371
+ // Remove all panels from the group (they stay in the flat panel list)
372
+ const panelIds = [...tabGroup.panelIds];
373
+ for (const panelId of panelIds) {
374
+ tabGroup.removePanel(panelId);
375
+ this._panelToTabGroup.delete(panelId);
376
+ this._onDidRemovePanelFromTabGroup.fire({ tabGroup, panelId });
377
+ }
378
+ tabGroup.dispose();
379
+ });
355
380
  }
356
381
  addPanelToTabGroup(tabGroupId, panelId, index) {
357
382
  const tabGroup = this._tabGroupMap.get(tabGroupId);
@@ -364,18 +389,20 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
364
389
  }
365
390
  // Remove from any existing group first
366
391
  const existingGroup = this.getTabGroupForPanel(panelId);
367
- if (existingGroup) {
368
- if (existingGroup.id === tabGroupId) {
369
- return; // already in this group
370
- }
371
- this.removePanelFromTabGroup(panelId);
392
+ if ((existingGroup === null || existingGroup === void 0 ? void 0 : existingGroup.id) === tabGroupId) {
393
+ return; // already in this group — no mutation
372
394
  }
373
- tabGroup.addPanel(panelId, index);
374
- this._panelToTabGroup.set(panelId, tabGroup);
375
- // Enforce contiguity: move the panel in the flat _panels array
376
- // to the correct global position matching its group-local index
377
- this._enforceContiguity(tabGroup, panelId);
378
- this._onDidAddPanelToTabGroup.fire({ tabGroup, panelId });
395
+ this._bracketTabGroupMutation(() => {
396
+ if (existingGroup) {
397
+ this.removePanelFromTabGroup(panelId);
398
+ }
399
+ tabGroup.addPanel(panelId, index);
400
+ this._panelToTabGroup.set(panelId, tabGroup);
401
+ // Enforce contiguity: move the panel in the flat _panels array
402
+ // to the correct global position matching its group-local index
403
+ this._enforceContiguity(tabGroup, panelId);
404
+ this._onDidAddPanelToTabGroup.fire({ tabGroup, panelId });
405
+ });
379
406
  }
380
407
  /**
381
408
  * Move a panel to a new index within its tab group.
@@ -383,7 +410,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
383
410
  */
384
411
  movePanelWithinGroup(tabGroupId, panelId, newIndex) {
385
412
  const tabGroup = this._tabGroupMap.get(tabGroupId);
386
- if (!tabGroup || !tabGroup.containsPanel(panelId)) {
413
+ if (!(tabGroup === null || tabGroup === void 0 ? void 0 : tabGroup.containsPanel(panelId))) {
387
414
  return;
388
415
  }
389
416
  // Remove and re-add at new index within the group
@@ -523,13 +550,15 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
523
550
  if (!tabGroup) {
524
551
  return;
525
552
  }
526
- tabGroup.removePanel(panelId);
527
- this._panelToTabGroup.delete(panelId);
528
- this._onDidRemovePanelFromTabGroup.fire({ tabGroup, panelId });
529
- // Auto-destroy empty groups
530
- if (tabGroup.isEmpty) {
531
- tabGroup.dispose();
532
- }
553
+ this._bracketTabGroupMutation(() => {
554
+ tabGroup.removePanel(panelId);
555
+ this._panelToTabGroup.delete(panelId);
556
+ this._onDidRemovePanelFromTabGroup.fire({ tabGroup, panelId });
557
+ // Auto-destroy empty groups
558
+ if (tabGroup.isEmpty) {
559
+ tabGroup.dispose();
560
+ }
561
+ });
533
562
  }
534
563
  getTabGroups() {
535
564
  return this._tabGroups;
@@ -594,7 +623,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
594
623
  for (let i = activePanelIndex + 1; i < this._panels.length; i++) {
595
624
  const candidate = this._panels[i];
596
625
  const candidateGroup = this._findTabGroupForPanel(candidate.id);
597
- if (!candidateGroup || !candidateGroup.collapsed) {
626
+ if (!(candidateGroup === null || candidateGroup === void 0 ? void 0 : candidateGroup.collapsed)) {
598
627
  this.doSetActivePanel(candidate);
599
628
  this.updateContainer();
600
629
  return;
@@ -603,7 +632,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
603
632
  for (let i = activePanelIndex - 1; i >= 0; i--) {
604
633
  const candidate = this._panels[i];
605
634
  const candidateGroup = this._findTabGroupForPanel(candidate.id);
606
- if (!candidateGroup || !candidateGroup.collapsed) {
635
+ if (!(candidateGroup === null || candidateGroup === void 0 ? void 0 : candidateGroup.collapsed)) {
607
636
  this.doSetActivePanel(candidate);
608
637
  this.updateContainer();
609
638
  return;
@@ -633,9 +662,9 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
633
662
  restoreTabGroups(serializedGroups) {
634
663
  // Bump counter past any restored numeric suffixes to avoid ID collisions
635
664
  for (const data of serializedGroups) {
636
- const match = data.id.match(/-(\d+)$/);
665
+ const match = /-(\d+)$/.exec(data.id);
637
666
  if (match) {
638
- const num = parseInt(match[1], 10) + 1;
667
+ const num = Number.parseInt(match[1], 10) + 1;
639
668
  if (num > this._tabGroupIdCounter) {
640
669
  this._tabGroupIdCounter = num;
641
670
  }
@@ -669,6 +698,9 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
669
698
  focusContent() {
670
699
  this.contentContainer.element.focus();
671
700
  }
701
+ focusActiveTab() {
702
+ this.tabsContainer.focusActiveTab();
703
+ }
672
704
  set renderContainer(value) {
673
705
  this.panels.forEach((panel) => {
674
706
  this.renderContainer.detatch(panel);
@@ -705,54 +737,20 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
705
737
  this.updateHeaderActions();
706
738
  }
707
739
  updateHeaderActions() {
708
- if (this.accessor.options.createRightHeaderActionComponent) {
709
- this._rightHeaderActions =
710
- this.accessor.options.createRightHeaderActionComponent(this.groupPanel);
711
- this._rightHeaderActionsDisposable.value = this._rightHeaderActions;
712
- this._rightHeaderActions.init({
713
- containerApi: this._api,
714
- api: this.groupPanel.api,
715
- group: this.groupPanel,
716
- });
717
- this.tabsContainer.setRightActionsElement(this._rightHeaderActions.element);
718
- }
719
- else {
720
- this._rightHeaderActions = undefined;
721
- this._rightHeaderActionsDisposable.dispose();
722
- this.tabsContainer.setRightActionsElement(undefined);
723
- }
724
- if (this.accessor.options.createLeftHeaderActionComponent) {
725
- this._leftHeaderActions =
726
- this.accessor.options.createLeftHeaderActionComponent(this.groupPanel);
727
- this._leftHeaderActionsDisposable.value = this._leftHeaderActions;
728
- this._leftHeaderActions.init({
729
- containerApi: this._api,
730
- api: this.groupPanel.api,
731
- group: this.groupPanel,
732
- });
733
- this.tabsContainer.setLeftActionsElement(this._leftHeaderActions.element);
734
- }
735
- else {
736
- this._leftHeaderActions = undefined;
737
- this._leftHeaderActionsDisposable.dispose();
738
- this.tabsContainer.setLeftActionsElement(undefined);
739
- }
740
- if (this.accessor.options.createPrefixHeaderActionComponent) {
741
- this._prefixHeaderActions =
742
- this.accessor.options.createPrefixHeaderActionComponent(this.groupPanel);
743
- this._prefixHeaderActionsDisposable.value =
744
- this._prefixHeaderActions;
745
- this._prefixHeaderActions.init({
746
- containerApi: this._api,
747
- api: this.groupPanel.api,
748
- group: this.groupPanel,
749
- });
750
- this.tabsContainer.setPrefixActionsElement(this._prefixHeaderActions.element);
751
- }
752
- else {
753
- this._prefixHeaderActions = undefined;
754
- this._prefixHeaderActionsDisposable.dispose();
755
- this.tabsContainer.setPrefixActionsElement(undefined);
740
+ var _a;
741
+ (_a = this.accessor.headerActionsService) === null || _a === void 0 ? void 0 : _a.refresh(this.groupPanel);
742
+ }
743
+ attachHeaderAction(slot, element) {
744
+ switch (slot) {
745
+ case 'left':
746
+ this.tabsContainer.setLeftActionsElement(element);
747
+ break;
748
+ case 'right':
749
+ this.tabsContainer.setRightActionsElement(element);
750
+ break;
751
+ case 'prefix':
752
+ this.tabsContainer.setPrefixActionsElement(element);
753
+ break;
756
754
  }
757
755
  }
758
756
  rerender(panel) {
@@ -783,32 +781,26 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
783
781
  return result;
784
782
  }
785
783
  moveToNext(options) {
786
- if (!options) {
787
- options = {};
788
- }
789
- if (!options.panel) {
790
- options.panel = this.activePanel;
791
- }
784
+ var _a;
785
+ options !== null && options !== void 0 ? options : (options = {});
786
+ (_a = options.panel) !== null && _a !== void 0 ? _a : (options.panel = this.activePanel);
792
787
  const index = options.panel ? this.panels.indexOf(options.panel) : -1;
793
788
  let normalizedIndex;
794
789
  if (index < this.panels.length - 1) {
795
790
  normalizedIndex = index + 1;
796
791
  }
797
- else if (!options.suppressRoll) {
798
- normalizedIndex = 0;
792
+ else if (options.suppressRoll) {
793
+ return;
799
794
  }
800
795
  else {
801
- return;
796
+ normalizedIndex = 0;
802
797
  }
803
798
  this.openPanel(this.panels[normalizedIndex]);
804
799
  }
805
800
  moveToPrevious(options) {
806
- if (!options) {
807
- options = {};
808
- }
809
- if (!options.panel) {
810
- options.panel = this.activePanel;
811
- }
801
+ var _a;
802
+ options !== null && options !== void 0 ? options : (options = {});
803
+ (_a = options.panel) !== null && _a !== void 0 ? _a : (options.panel = this.activePanel);
812
804
  if (!options.panel) {
813
805
  return;
814
806
  }
@@ -817,11 +809,11 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
817
809
  if (index > 0) {
818
810
  normalizedIndex = index - 1;
819
811
  }
820
- else if (!options.suppressRoll) {
821
- normalizedIndex = this.panels.length - 1;
812
+ else if (options.suppressRoll) {
813
+ return;
822
814
  }
823
815
  else {
824
- return;
816
+ normalizedIndex = this.panels.length - 1;
825
817
  }
826
818
  this.openPanel(this.panels[normalizedIndex]);
827
819
  }
@@ -921,7 +913,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
921
913
  if (!this._activePanel && this.panels.length > 0) {
922
914
  const candidate = this._panels.find((p) => {
923
915
  const tg = this._findTabGroupForPanel(p.id);
924
- return !tg || !tg.collapsed;
916
+ return !(tg === null || tg === void 0 ? void 0 : tg.collapsed);
925
917
  });
926
918
  if (candidate) {
927
919
  this.doSetActivePanel(candidate);
@@ -998,12 +990,15 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
998
990
  this._onDidAddPanel.fire({ panel });
999
991
  }
1000
992
  doSetActivePanel(panel) {
993
+ var _a, _b, _c;
1001
994
  if (this._activePanel === panel) {
1002
995
  return;
1003
996
  }
1004
997
  this._activePanel = panel;
1005
998
  if (panel) {
1006
999
  this.tabsContainer.setActivePanel(panel);
1000
+ // Point the tabpanel's `aria-labelledby` at the now-active tab.
1001
+ this.contentContainer.setLabelledBy(this.tabsContainer.getTabId(panel.id));
1007
1002
  this.contentContainer.openPanel(panel);
1008
1003
  panel.layout(this._width, this._height);
1009
1004
  this.updateMru(panel);
@@ -1011,8 +1006,23 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
1011
1006
  this.contentContainer.refreshFocusState();
1012
1007
  this._onDidActivePanelChange.fire({
1013
1008
  panel,
1009
+ // `currentOrigin` is always present on the real component;
1010
+ // default to 'user' for minimal test accessors.
1011
+ origin: (_c = (_b = (_a = this.accessor).currentOrigin) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : 'user',
1014
1012
  });
1015
1013
  }
1014
+ this.updateAccessibleLabel();
1015
+ }
1016
+ /** Label the group region with its active panel's title (the WAI-ARIA region name). */
1017
+ updateAccessibleLabel() {
1018
+ var _a;
1019
+ const title = (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.title;
1020
+ if (title) {
1021
+ this.container.setAttribute('aria-label', title);
1022
+ }
1023
+ else {
1024
+ this.container.removeAttribute('aria-label');
1025
+ }
1016
1026
  }
1017
1027
  updateMru(panel) {
1018
1028
  if (this.mostRecentlyUsed.includes(panel)) {
@@ -1046,7 +1056,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
1046
1056
  }
1047
1057
  canDisplayOverlay(event, position, target) {
1048
1058
  const firedEvent = new DockviewUnhandledDragOverEvent(event, target, position, getPanelData, this.accessor.getPanel(this.id));
1049
- this._onUnhandledDragOverEvent.fire(firedEvent);
1059
+ this._onUnhandledDragOver.fire(firedEvent);
1050
1060
  return firedEvent.isAccepted;
1051
1061
  }
1052
1062
  handleDropEvent(type, event, position, index) {
@@ -7,7 +7,7 @@ import { IPanel, PanelUpdateEvent, Parameters } from '../panel/types';
7
7
  import { IDockviewPanelModel } from './dockviewPanelModel';
8
8
  import { DockviewComponent } from './dockviewComponent';
9
9
  import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
10
- import { Contraints } from '../gridview/gridviewPanel';
10
+ import { Constraints } from '../gridview/gridviewPanel';
11
11
  export interface IDockviewPanel extends IDisposable, IPanel {
12
12
  readonly view: IDockviewPanelModel;
13
13
  readonly group: DockviewGroupPanel;
@@ -52,7 +52,7 @@ export declare class DockviewPanel extends CompositeDisposable implements IDockv
52
52
  get maximumHeight(): number | undefined;
53
53
  constructor(id: string, component: string, tabComponent: string | undefined, accessor: DockviewComponent, containerApi: DockviewApi, group: DockviewGroupPanel, view: IDockviewPanelModel, options: {
54
54
  renderer?: DockviewPanelRenderer;
55
- } & Partial<Contraints>);
55
+ } & Partial<Constraints>);
56
56
  init(params: IGroupPanelInitParameters): void;
57
57
  focus(): void;
58
58
  toJSON(): GroupviewPanelState;
@@ -103,9 +103,8 @@ export class DockviewPanel extends CompositeDisposable {
103
103
  }
104
104
  }
105
105
  update(event) {
106
- var _a;
107
106
  // merge the new parameters with the existing parameters
108
- this._params = Object.assign(Object.assign({}, ((_a = this._params) !== null && _a !== void 0 ? _a : {})), event.params);
107
+ this._params = Object.assign(Object.assign({}, this._params), event.params);
109
108
  /**
110
109
  * delete new keys that have a value of undefined,
111
110
  * allow values of null
@@ -56,16 +56,37 @@ export declare class EdgeGroupView implements IView {
56
56
  readonly priority = LayoutPriority.Low;
57
57
  private _isCollapsed;
58
58
  private _lastExpandedSize;
59
- private _collapsedSize;
60
- private _expandedMinimumSize;
59
+ private _baseCollapsedSize;
60
+ private _baseMinimumSize;
61
+ private _gapAdd;
61
62
  private readonly _expandedMaximumSize;
63
+ private _measuredTabSize;
64
+ private readonly _tabSizeDisposables;
65
+ /**
66
+ * The effective (pre-gap) collapsed size: the measured tab-strip size when
67
+ * available, otherwise the configured/theme base.
68
+ */
69
+ private get _effectiveBaseCollapsed();
62
70
  get minimumSize(): number;
63
71
  get maximumSize(): number;
64
72
  get element(): HTMLElement;
65
73
  get isCollapsed(): boolean;
66
74
  get lastExpandedSize(): number;
67
75
  get collapsedSize(): number;
68
- constructor(options: EdgeGroupOptions, group: IEdgeGroupHost, orientation: 'horizontal' | 'vertical');
76
+ constructor(options: EdgeGroupOptions, group: IEdgeGroupHost, orientation: 'horizontal' | 'vertical', gapAdd?: number);
77
+ /**
78
+ * Watch the group's tab strip so the collapsed size follows the live tab
79
+ * height. The strip's cross-axis size (height for top/bottom, width for
80
+ * left/right) is exactly what a collapsed edge group should occupy; a
81
+ * ResizeObserver keeps them in sync when the tab height changes at runtime.
82
+ */
83
+ private _observeTabStrip;
84
+ /**
85
+ * Apply a freshly-measured tab-strip cross size. When the group is
86
+ * collapsed this resizes it in the parent splitview so the collapsed strip
87
+ * always shows the full tab height.
88
+ */
89
+ private _applyMeasuredTabSize;
69
90
  layout(size: number, orthogonalSize: number): void;
70
91
  setCollapsed(collapsed: boolean): void;
71
92
  setVisible(_visible: boolean): void;
@@ -76,11 +97,12 @@ export declare class EdgeGroupView implements IView {
76
97
  */
77
98
  restoreExpandedSize(size: number): void;
78
99
  /**
79
- * Apply new effective collapsed and expanded-minimum sizes after a theme
80
- * or gap change. The caller (ShellManager) is responsible for computing
81
- * the correct values from the original config and the new gap.
100
+ * Apply a new base (pre-gap) collapsed size, base minimum size and gap
101
+ * contribution after a theme or gap change. Base values come from the
102
+ * original config; the ShellManager owns the gap arithmetic. A live
103
+ * measured tab size (if any) continues to win over the base collapsed size.
82
104
  */
83
- updateCollapsedSize(newCollapsedSize: number, newExpandedMinimumSize: number): void;
105
+ updateSizing(baseCollapsedSize: number, baseMinimumSize: number | undefined, gapAdd: number): void;
84
106
  dispose(): void;
85
107
  }
86
108
  export declare class ShellManager implements IDisposable {