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
@@ -47,7 +47,6 @@ var dndCapabilities_1 = require("../../dndCapabilities");
47
47
  var tabGroupAccent_1 = require("../../tabGroupAccent");
48
48
  var tabGroupChip_1 = require("./tabGroupChip");
49
49
  var droptarget_1 = require("../../../dnd/droptarget");
50
- var dataTransfer_2 = require("../../../dnd/dataTransfer");
51
50
  var tabGroupIndicator_1 = require("./tabGroupIndicator");
52
51
  var EMPTY_MAP = new Map();
53
52
  var TabGroupManager = /** @class */ (function () {
@@ -90,6 +89,7 @@ var TabGroupManager = /** @class */ (function () {
90
89
  */
91
90
  TabGroupManager.prototype.update = function () {
92
91
  var e_1, _a, e_2, _b;
92
+ var _c;
93
93
  var model = this._ctx.group.model;
94
94
  var tabGroups = model.getTabGroups();
95
95
  // Track which group IDs are still active
@@ -111,11 +111,12 @@ var TabGroupManager = /** @class */ (function () {
111
111
  }
112
112
  try {
113
113
  // Remove chips for dissolved/destroyed groups
114
- for (var _c = __values(this._chipRenderers), _d = _c.next(); !_d.done; _d = _c.next()) {
115
- var _e = __read(_d.value, 2), groupId = _e[0], entry = _e[1];
114
+ for (var _d = __values(this._chipRenderers), _e = _d.next(); !_e.done; _e = _d.next()) {
115
+ var _f = __read(_e.value, 2), groupId = _f[0], entry = _f[1];
116
116
  if (!activeGroupIds.has(groupId)) {
117
117
  entry.chip.element.remove();
118
118
  entry.chip.dispose();
119
+ (_c = entry.dragSourcesDisposable) === null || _c === void 0 ? void 0 : _c.dispose();
119
120
  entry.disposable.dispose();
120
121
  this._chipRenderers.delete(groupId);
121
122
  }
@@ -124,7 +125,7 @@ var TabGroupManager = /** @class */ (function () {
124
125
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
125
126
  finally {
126
127
  try {
127
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
128
+ if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
128
129
  }
129
130
  finally { if (e_2) throw e_2.error; }
130
131
  }
@@ -297,20 +298,21 @@ var TabGroupManager = /** @class */ (function () {
297
298
  };
298
299
  TabGroupManager.prototype.updateDragAndDropState = function () {
299
300
  var e_7, _a;
301
+ var _b, _c, _d;
300
302
  var caps = (0, dndCapabilities_1.resolveDndCapabilities)(this._ctx.accessor.options);
301
303
  try {
302
- for (var _b = __values(this._chipRenderers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
303
- var entry = _c.value;
304
+ for (var _e = __values(this._chipRenderers.values()), _f = _e.next(); !_f.done; _f = _e.next()) {
305
+ var entry = _f.value;
304
306
  entry.chip.element.draggable = caps.html5;
305
- entry.html5DragSource.setDisabled(!caps.html5);
306
- entry.pointerDragSource.setDisabled(!caps.pointer);
307
- entry.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
307
+ (_b = entry.html5DragSource) === null || _b === void 0 ? void 0 : _b.setDisabled(!caps.html5);
308
+ (_c = entry.pointerDragSource) === null || _c === void 0 ? void 0 : _c.setDisabled(!caps.pointer);
309
+ (_d = entry.pointerDragSource) === null || _d === void 0 ? void 0 : _d.setTouchOnly(!caps.pointerHandlesMouse);
308
310
  }
309
311
  }
310
312
  catch (e_7_1) { e_7 = { error: e_7_1 }; }
311
313
  finally {
312
314
  try {
313
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
315
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
314
316
  }
315
317
  finally { if (e_7) throw e_7.error; }
316
318
  }
@@ -321,19 +323,28 @@ var TabGroupManager = /** @class */ (function () {
321
323
  * iframe shield are released BEFORE the cross-group move detaches
322
324
  * the chip (chip dispose is scheduled on a microtask via
323
325
  * `_scheduleTabGroupUpdate`, which is too late for callers that read
324
- * `getPanelData()` synchronously after the move). Idempotent — the
325
- * subsequent `update()` will also dispose the sources.
326
+ * `getPanelData()` synchronously after the move).
327
+ *
328
+ * A cross-group move dissolves the source chip entirely, but a
329
+ * within-group reorder keeps the same chip element — so the sources are
330
+ * cleared to `undefined` here and the subsequent `update()` re-arms them
331
+ * via `_ensureChipForGroup`. Without that re-arm the chip would fire a
332
+ * native `dragstart` (the element keeps `draggable=true`) but never set
333
+ * a transfer payload, leaving the group permanently undraggable after
334
+ * its first move. (#1410)
326
335
  */
327
336
  TabGroupManager.prototype.disposeChipDrag = function (tabGroupId) {
328
- var _a, _b;
337
+ var _a;
329
338
  var entry = this._chipRenderers.get(tabGroupId);
330
339
  if (!entry) {
331
340
  return;
332
341
  }
333
342
  // Optional-chained because tests may inject minimal entries
334
343
  // that skip the manager's normal `_ensureChipForGroup` flow.
335
- (_a = entry.html5DragSource) === null || _a === void 0 ? void 0 : _a.dispose();
336
- (_b = entry.pointerDragSource) === null || _b === void 0 ? void 0 : _b.dispose();
344
+ (_a = entry.dragSourcesDisposable) === null || _a === void 0 ? void 0 : _a.dispose();
345
+ entry.html5DragSource = undefined;
346
+ entry.pointerDragSource = undefined;
347
+ entry.dragSourcesDisposable = undefined;
337
348
  };
338
349
  /** Cloned chip rect used as the pointer follow-finger ghost. */
339
350
  TabGroupManager.prototype._buildChipGhostElement = function (chipEl) {
@@ -347,35 +358,36 @@ var TabGroupManager = /** @class */ (function () {
347
358
  };
348
359
  TabGroupManager.prototype.disposeAll = function () {
349
360
  var e_8, _a, e_9, _b;
350
- var _c;
361
+ var _c, _d;
351
362
  (_c = this._indicator) === null || _c === void 0 ? void 0 : _c.dispose();
352
363
  this._indicator = null;
353
364
  try {
354
- for (var _d = __values(this._pendingTransitionCleanups), _e = _d.next(); !_e.done; _e = _d.next()) {
355
- var _f = __read(_e.value, 2), cleanup = _f[1];
365
+ for (var _e = __values(this._pendingTransitionCleanups), _f = _e.next(); !_f.done; _f = _e.next()) {
366
+ var _g = __read(_f.value, 2), cleanup = _g[1];
356
367
  cleanup();
357
368
  }
358
369
  }
359
370
  catch (e_8_1) { e_8 = { error: e_8_1 }; }
360
371
  finally {
361
372
  try {
362
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
373
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
363
374
  }
364
375
  finally { if (e_8) throw e_8.error; }
365
376
  }
366
377
  this._pendingTransitionCleanups.clear();
367
378
  try {
368
- for (var _g = __values(this._chipRenderers), _h = _g.next(); !_h.done; _h = _g.next()) {
369
- var _j = __read(_h.value, 2), entry = _j[1];
379
+ for (var _h = __values(this._chipRenderers), _j = _h.next(); !_j.done; _j = _h.next()) {
380
+ var _k = __read(_j.value, 2), entry = _k[1];
370
381
  entry.chip.element.remove();
371
382
  entry.chip.dispose();
383
+ (_d = entry.dragSourcesDisposable) === null || _d === void 0 ? void 0 : _d.dispose();
372
384
  entry.disposable.dispose();
373
385
  }
374
386
  }
375
387
  catch (e_9_1) { e_9 = { error: e_9_1 }; }
376
388
  finally {
377
389
  try {
378
- if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
390
+ if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
379
391
  }
380
392
  finally { if (e_9) throw e_9.error; }
381
393
  }
@@ -383,7 +395,7 @@ var TabGroupManager = /** @class */ (function () {
383
395
  };
384
396
  TabGroupManager.prototype._ensureIndicator = function () {
385
397
  var _this = this;
386
- var _a, _b;
398
+ var _a, _b, _c;
387
399
  var mode = (_b = (_a = this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabGroupIndicator) !== null && _b !== void 0 ? _b : 'wrap';
388
400
  var Ctor = mode === 'none' ? tabGroupIndicator_1.NoneTabGroupIndicator : tabGroupIndicator_1.WrapTabGroupIndicator;
389
401
  // Re-create if the indicator type changed (e.g. theme switch)
@@ -391,28 +403,25 @@ var TabGroupManager = /** @class */ (function () {
391
403
  this._indicator.dispose();
392
404
  this._indicator = null;
393
405
  }
394
- if (!this._indicator) {
395
- this._indicator = new Ctor({
396
- tabsList: this._ctx.tabsList,
397
- getTabGroups: function () { return _this._ctx.group.model.getTabGroups(); },
398
- getActivePanelId: function () { var _a; return (_a = _this._ctx.group.activePanel) === null || _a === void 0 ? void 0 : _a.id; },
399
- getTabMap: function () { return _this._ctx.getTabMap(); },
400
- getChipElement: function (id) { var _a; return (_a = _this._chipRenderers.get(id)) === null || _a === void 0 ? void 0 : _a.chip.element; },
401
- getDirection: function () { return _this._ctx.getDirection(); },
402
- getColorPalette: function () { return _this._ctx.accessor.tabGroupColorPalette; },
403
- });
404
- }
406
+ (_c = this._indicator) !== null && _c !== void 0 ? _c : (this._indicator = new Ctor({
407
+ tabsList: this._ctx.tabsList,
408
+ getTabGroups: function () { return _this._ctx.group.model.getTabGroups(); },
409
+ getActivePanelId: function () { var _a; return (_a = _this._ctx.group.activePanel) === null || _a === void 0 ? void 0 : _a.id; },
410
+ getTabMap: function () { return _this._ctx.getTabMap(); },
411
+ getChipElement: function (id) { var _a; return (_a = _this._chipRenderers.get(id)) === null || _a === void 0 ? void 0 : _a.chip.element; },
412
+ getDirection: function () { return _this._ctx.getDirection(); },
413
+ getHeaderPosition: function () { return _this._ctx.group.model.headerPosition; },
414
+ getColorPalette: function () { return _this._ctx.accessor.tabGroupColorPalette; },
415
+ }));
405
416
  };
406
- TabGroupManager.prototype._ensureChipForGroup = function (tabGroup) {
417
+ /**
418
+ * Create the HTML5 + pointer drag sources for a chip (and the direct
419
+ * dragend listener that clears the transfer synchronously). Extracted so
420
+ * both the initial chip build and the post-move re-arm in
421
+ * `_ensureChipForGroup` share one wiring path. (#1410)
422
+ */
423
+ TabGroupManager.prototype._createChipDragSources = function (chip, tabGroup) {
407
424
  var _this = this;
408
- if (this._chipRenderers.has(tabGroup.id)) {
409
- return;
410
- }
411
- var createChip = this._ctx.accessor.options.createTabGroupChipComponent;
412
- var chip = createChip
413
- ? createChip(tabGroup)
414
- : new tabGroupChip_1.TabGroupChip(this._ctx.accessor.tabGroupColorPalette);
415
- chip.init({ tabGroup: tabGroup, api: this._ctx.accessor.api });
416
425
  var caps = (0, dndCapabilities_1.resolveDndCapabilities)(this._ctx.accessor.options);
417
426
  chip.element.draggable = caps.html5;
418
427
  var panelTransfer = dataTransfer_1.LocalSelectionTransfer.getInstance();
@@ -466,9 +475,12 @@ var TabGroupManager = /** @class */ (function () {
466
475
  // the listener survives chip disposal in the detach-then-dragend
467
476
  // cross-group path; `once: true` auto-removes after the single
468
477
  // dragend that we care about. (#1254)
469
- chip.element.addEventListener('dragend', function () {
478
+ var onDragEndClear = function () {
470
479
  panelTransfer.clearData(dataTransfer_1.PanelTransfer.prototype);
471
- }, { once: true });
480
+ };
481
+ chip.element.addEventListener('dragend', onDragEndClear, {
482
+ once: true,
483
+ });
472
484
  var pointerDragSource = backend_1.pointerBackend.createDragSource(chip.element, {
473
485
  getData: getData,
474
486
  disabled: !caps.pointer,
@@ -485,6 +497,42 @@ var TabGroupManager = /** @class */ (function () {
485
497
  _this._callbacks.onChipDragStart(tabGroup, chip, event);
486
498
  },
487
499
  });
500
+ return {
501
+ html5DragSource: html5DragSource,
502
+ pointerDragSource: pointerDragSource,
503
+ disposable: {
504
+ dispose: function () {
505
+ html5DragSource.dispose();
506
+ pointerDragSource.dispose();
507
+ chip.element.removeEventListener('dragend', onDragEndClear);
508
+ },
509
+ },
510
+ };
511
+ };
512
+ TabGroupManager.prototype._ensureChipForGroup = function (tabGroup) {
513
+ var _this = this;
514
+ var existing = this._chipRenderers.get(tabGroup.id);
515
+ if (existing) {
516
+ // A committed group move tears down the chip's drag sources via
517
+ // `disposeChipDrag`, but a within-group reorder keeps the same
518
+ // chip element alive. Re-arm the sources so the group stays
519
+ // draggable; without this the chip is stuck after its first
520
+ // move — `dragstart` still fires (the element keeps
521
+ // `draggable=true`) but no transfer payload is set. (#1410)
522
+ if (!existing.html5DragSource) {
523
+ var sources = this._createChipDragSources(existing.chip, tabGroup);
524
+ existing.html5DragSource = sources.html5DragSource;
525
+ existing.pointerDragSource = sources.pointerDragSource;
526
+ existing.dragSourcesDisposable = sources.disposable;
527
+ }
528
+ return;
529
+ }
530
+ var createChip = this._ctx.accessor.options.createTabGroupChipComponent;
531
+ var chip = createChip
532
+ ? createChip(tabGroup)
533
+ : new tabGroupChip_1.TabGroupChip(this._ctx.accessor.tabGroupColorPalette);
534
+ chip.init({ tabGroup: tabGroup, api: this._ctx.accessor.api });
535
+ var dragSources = this._createChipDragSources(chip, tabGroup);
488
536
  var disposables = [
489
537
  tabGroup.onDidChange(function () {
490
538
  var _a;
@@ -498,17 +546,19 @@ var TabGroupManager = /** @class */ (function () {
498
546
  tabGroup.onDidCollapseChange(function () {
499
547
  _this._updateTabGroupClasses();
500
548
  }),
501
- html5DragSource,
502
- pointerDragSource,
503
549
  ];
504
550
  // Context menu: built-in TabGroupChip already aggregates right-click
505
551
  // + touch long-press into `onContextMenu`. Custom chip renderers
506
552
  // don't, so attach a long-press detector and contextmenu listener
507
553
  // directly on their element.
508
554
  var onContextMenu = function (event) {
555
+ var _a, _b;
509
556
  // A long-press on a chip should preempt the in-flight pointer
510
- // drag and open the menu instead.
511
- pointerDragSource.cancelPending();
557
+ // drag and open the menu instead. Resolve the source from the
558
+ // entry so a post-move re-armed source is cancelled, not the
559
+ // stale one captured at build time. (#1410)
560
+ (_b = (_a = _this._chipRenderers
561
+ .get(tabGroup.id)) === null || _a === void 0 ? void 0 : _a.pointerDragSource) === null || _b === void 0 ? void 0 : _b.cancelPending();
512
562
  _this._callbacks.onChipContextMenu(tabGroup, event);
513
563
  };
514
564
  if (chip instanceof tabGroupChip_1.TabGroupChip) {
@@ -540,8 +590,8 @@ var TabGroupManager = /** @class */ (function () {
540
590
  if (_this._ctx.accessor.options.disableDnd) {
541
591
  return false;
542
592
  }
543
- var data = (0, dataTransfer_2.getPanelData)();
544
- if (data && _this._ctx.accessor.id === data.viewId) {
593
+ var data = (0, dataTransfer_1.getPanelData)();
594
+ if (_this._ctx.accessor.id === (data === null || data === void 0 ? void 0 : data.viewId)) {
545
595
  if (((_a = _this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) ===
546
596
  'smooth') {
547
597
  return false;
@@ -557,8 +607,9 @@ var TabGroupManager = /** @class */ (function () {
557
607
  var disposable = new (lifecycle_1.CompositeDisposable.bind.apply(lifecycle_1.CompositeDisposable, __spreadArray([void 0], __read(disposables), false)))();
558
608
  this._chipRenderers.set(tabGroup.id, {
559
609
  chip: chip,
560
- html5DragSource: html5DragSource,
561
- pointerDragSource: pointerDragSource,
610
+ html5DragSource: dragSources.html5DragSource,
611
+ pointerDragSource: dragSources.pointerDragSource,
612
+ dragSourcesDisposable: dragSources.disposable,
562
613
  disposable: disposable,
563
614
  dropTarget: dropTarget,
564
615
  });
@@ -59,7 +59,19 @@ export declare class Tabs extends CompositeDisposable {
59
59
  showTabsOverflowControl: boolean;
60
60
  });
61
61
  indexOf(id: string): number;
62
+ /** DOM id of the tab element for a panel — for the tabpanel's `aria-labelledby`. */
63
+ getTabId(panelId: string): string | undefined;
62
64
  isActive(tab: Tab): boolean;
65
+ private _onKeyDown;
66
+ /**
67
+ * Close the tab at `index` and move roving focus to a neighbouring tab so
68
+ * keyboard focus stays in the tablist.
69
+ */
70
+ private _closeTab;
71
+ /** Move the roving focus to the tab at `index` (updates tabindex + DOM focus). */
72
+ private _focusTab;
73
+ /** Move DOM focus to the active tab — the entry point into the tablist. */
74
+ focusActiveTab(): void;
63
75
  setActivePanel(panel: IDockviewPanel): void;
64
76
  openPanel(panel: IDockviewPanel, index?: number): void;
65
77
  delete(id: string): void;
@@ -92,6 +92,9 @@ var Tabs = /** @class */ (function (_super) {
92
92
  _this.onOverflowTabsChange = _this._onOverflowTabsChange.event;
93
93
  _this._tabsList = document.createElement('div');
94
94
  _this._tabsList.className = 'dv-tabs-container';
95
+ // WAI-ARIA Tabs pattern: the strip of tabs is the tablist.
96
+ _this._tabsList.setAttribute('role', 'tablist');
97
+ _this._tabsList.setAttribute('aria-orientation', _this._direction === 'vertical' ? 'vertical' : 'horizontal');
95
98
  _this.showTabsOverflowControl = options.showTabsOverflowControl;
96
99
  if (accessor.options.scrollbars === 'native') {
97
100
  _this._element = _this._tabsList;
@@ -111,7 +114,8 @@ var Tabs = /** @class */ (function (_super) {
111
114
  getDirection: function () { return _this._direction; },
112
115
  }, {
113
116
  onChipContextMenu: function (tabGroup, event) {
114
- _this.accessor.contextMenuController.showForChip(tabGroup, _this.group, event);
117
+ var _a;
118
+ (_a = _this.accessor.contextMenuService) === null || _a === void 0 ? void 0 : _a.showForChip(tabGroup, _this.group, event);
115
119
  },
116
120
  onChipDragStart: function (tabGroup, chip, event) {
117
121
  _this._handleChipDragStart(tabGroup, chip, event);
@@ -204,7 +208,14 @@ var Tabs = /** @class */ (function (_super) {
204
208
  else {
205
209
  _this._tabsList.scrollLeft = current + primary;
206
210
  }
207
- }, { passive: false }), (0, events_1.addDisposableListener)(_this._tabsList, 'dragover', function (event) {
211
+ }, { passive: false }),
212
+ // WAI-ARIA Tabs keyboard pattern: arrow keys move the roving
213
+ // focus along the strip, Home/End jump to the ends, and
214
+ // Enter/Space activate the focused tab (manual activation, so
215
+ // arrowing through tabs doesn't switch panels until committed).
216
+ (0, events_1.addDisposableListener)(_this._tabsList, 'keydown', function (event) {
217
+ _this._onKeyDown(event);
218
+ }), (0, events_1.addDisposableListener)(_this._tabsList, 'dragover', function (event) {
208
219
  if (_this._processDragOver(event.clientX)) {
209
220
  // Allow `drop` to fire on the tabs list container.
210
221
  event.preventDefault();
@@ -401,6 +412,7 @@ var Tabs = /** @class */ (function (_super) {
401
412
  return;
402
413
  }
403
414
  this._direction = value;
415
+ this._tabsList.setAttribute('aria-orientation', value === 'vertical' ? 'vertical' : 'horizontal');
404
416
  if (this._scrollbar) {
405
417
  this._scrollbar.orientation = value;
406
418
  }
@@ -433,10 +445,101 @@ var Tabs = /** @class */ (function (_super) {
433
445
  Tabs.prototype.indexOf = function (id) {
434
446
  return this._tabs.findIndex(function (tab) { return tab.value.panel.id === id; });
435
447
  };
448
+ /** DOM id of the tab element for a panel — for the tabpanel's `aria-labelledby`. */
449
+ Tabs.prototype.getTabId = function (panelId) {
450
+ var _a;
451
+ return (_a = this._tabMap.get(panelId)) === null || _a === void 0 ? void 0 : _a.value.element.id;
452
+ };
436
453
  Tabs.prototype.isActive = function (tab) {
437
454
  return (this.selectedIndex > -1 &&
438
455
  this._tabs[this.selectedIndex].value === tab);
439
456
  };
457
+ Tabs.prototype._onKeyDown = function (event) {
458
+ var _this = this;
459
+ // Only handle when a tab element itself is focused — never hijack keys
460
+ // typed inside a custom tab renderer's own controls (inputs etc.).
461
+ var index = this._tabs.findIndex(function (tab) { return tab.value.element === event.target; });
462
+ if (index === -1) {
463
+ return;
464
+ }
465
+ var isVertical = this._direction === 'vertical';
466
+ var nextKey = isVertical ? 'ArrowDown' : 'ArrowRight';
467
+ var prevKey = isVertical ? 'ArrowUp' : 'ArrowLeft';
468
+ var last = this._tabs.length - 1;
469
+ switch (event.key) {
470
+ case nextKey:
471
+ event.preventDefault();
472
+ this._focusTab(Math.min(index + 1, last));
473
+ break;
474
+ case prevKey:
475
+ event.preventDefault();
476
+ this._focusTab(Math.max(index - 1, 0));
477
+ break;
478
+ case 'Home':
479
+ event.preventDefault();
480
+ this._focusTab(0);
481
+ break;
482
+ case 'End':
483
+ event.preventDefault();
484
+ this._focusTab(last);
485
+ break;
486
+ case 'Enter':
487
+ case ' ':
488
+ // Manual activation of the focused tab.
489
+ event.preventDefault();
490
+ this.accessor.withOrigin('user', function () {
491
+ return _this._tabs[index].value.panel.api.setActive();
492
+ });
493
+ break;
494
+ case 'Delete':
495
+ case 'Backspace':
496
+ // Close the focused tab (Backspace covers macOS, where the
497
+ // primary delete key reports as Backspace).
498
+ event.preventDefault();
499
+ this._closeTab(index);
500
+ break;
501
+ }
502
+ };
503
+ /**
504
+ * Close the tab at `index` and move roving focus to a neighbouring tab so
505
+ * keyboard focus stays in the tablist.
506
+ */
507
+ Tabs.prototype._closeTab = function (index) {
508
+ var _a, _b, _c, _d, _e;
509
+ var tab = (_a = this._tabs[index]) === null || _a === void 0 ? void 0 : _a.value;
510
+ if (!tab) {
511
+ return;
512
+ }
513
+ // Resolve the post-close focus target before closing mutates the list:
514
+ // prefer the next tab, otherwise the previous.
515
+ var neighbourId = (_e = ((_c = (_b = this._tabs[index + 1]) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : (_d = this._tabs[index - 1]) === null || _d === void 0 ? void 0 : _d.value)) === null || _e === void 0 ? void 0 : _e.panel.id;
516
+ tab.panel.api.close();
517
+ if (neighbourId !== undefined) {
518
+ var nextIndex = this._tabs.findIndex(function (t) { return t.value.panel.id === neighbourId; });
519
+ if (nextIndex > -1) {
520
+ this._focusTab(nextIndex);
521
+ }
522
+ }
523
+ };
524
+ /** Move the roving focus to the tab at `index` (updates tabindex + DOM focus). */
525
+ Tabs.prototype._focusTab = function (index) {
526
+ for (var i = 0; i < this._tabs.length; i++) {
527
+ this._tabs[i].value.element.tabIndex = i === index ? 0 : -1;
528
+ }
529
+ this._tabs[index].value.element.focus();
530
+ };
531
+ /** Move DOM focus to the active tab — the entry point into the tablist. */
532
+ Tabs.prototype.focusActiveTab = function () {
533
+ var _a;
534
+ if (this._tabs.length === 0) {
535
+ return;
536
+ }
537
+ var activeId = (_a = this.group.activePanel) === null || _a === void 0 ? void 0 : _a.id;
538
+ var activeIndex = activeId
539
+ ? this._tabs.findIndex(function (t) { return t.value.panel.id === activeId; })
540
+ : -1;
541
+ this._focusTab(activeIndex > -1 ? activeIndex : 0);
542
+ };
440
543
  Tabs.prototype.setActivePanel = function (panel) {
441
544
  var e_3, _a;
442
545
  var isVertical = this._direction === 'vertical';
@@ -456,12 +559,10 @@ var Tabs = /** @class */ (function (_super) {
456
559
  parentElement.scrollTop = running;
457
560
  }
458
561
  }
459
- else {
460
- if (running < parentElement.scrollLeft ||
461
- running + element.clientWidth >
462
- parentElement.scrollLeft + parentElement.clientWidth) {
463
- parentElement.scrollLeft = running;
464
- }
562
+ else if (running < parentElement.scrollLeft ||
563
+ running + element.clientWidth >
564
+ parentElement.scrollLeft + parentElement.clientWidth) {
565
+ parentElement.scrollLeft = running;
465
566
  }
466
567
  }
467
568
  running += isVertical
@@ -583,18 +684,13 @@ var Tabs = /** @class */ (function (_super) {
583
684
  });
584
685
  return;
585
686
  }
586
- switch (event.button) {
587
- case 0:
588
- if (_this.group.api.location.type === 'edge') {
589
- // All tab interaction for edge groups is handled by
590
- // onTabClick to avoid race conditions with active panel state
591
- }
592
- else {
593
- if (_this.group.activePanel !== panel) {
594
- _this.group.model.openPanel(panel);
595
- }
596
- }
597
- break;
687
+ // Edge groups are skipped here: all their tab interaction
688
+ // is handled by onTabClick to avoid race conditions with
689
+ // active panel state.
690
+ if (event.button === 0 &&
691
+ _this.group.api.location.type !== 'edge' &&
692
+ _this.group.activePanel !== panel) {
693
+ _this.group.model.openPanel(panel);
598
694
  }
599
695
  }), tab.onDrop(function (event) {
600
696
  var _a, _b, _c, _d;
@@ -617,12 +713,12 @@ var Tabs = /** @class */ (function (_super) {
617
713
  targetTabGroupId: animState.targetTabGroupId,
618
714
  });
619
715
  if (((_b = _this.accessor.options.theme) === null || _b === void 0 ? void 0 : _b.tabAnimation) === 'smooth') {
620
- _this.runFlipAnimation(firstPositions, animState.sourceTabId, animState.sourceIndex === -1, animState.sourceIndex !== -1
621
- ? {
716
+ _this.runFlipAnimation(firstPositions, animState.sourceTabId, animState.sourceIndex === -1, animState.sourceIndex === -1
717
+ ? undefined
718
+ : {
622
719
  from: Math.min(animState.sourceIndex, dropIndex),
623
720
  to: Math.max(animState.sourceIndex, dropIndex),
624
- }
625
- : undefined);
721
+ });
626
722
  }
627
723
  }
628
724
  else {
@@ -939,7 +1035,7 @@ var Tabs = /** @class */ (function (_super) {
939
1035
  return;
940
1036
  }
941
1037
  var data = (0, dataTransfer_1.getPanelData)();
942
- var sourceIndex = data && data.groupId === this.group.id && data.panelId
1038
+ var sourceIndex = (data === null || data === void 0 ? void 0 : data.groupId) === this.group.id && (data === null || data === void 0 ? void 0 : data.panelId)
943
1039
  ? this._tabs.findIndex(function (x) { return x.value.panel.id === data.panelId; })
944
1040
  : -1;
945
1041
  var adjustedIndex = insertionIndex -
@@ -33,8 +33,10 @@ export interface ITabsContainer extends IDisposable {
33
33
  direction: DockviewHeaderDirection;
34
34
  delete(id: string): void;
35
35
  indexOf(id: string): number;
36
+ getTabId(panelId: string): string | undefined;
36
37
  setActive(isGroupActive: boolean): void;
37
38
  setActivePanel(panel: IDockviewPanel): void;
39
+ focusActiveTab(): void;
38
40
  isActive(tab: Tab): boolean;
39
41
  closePanel(panel: IDockviewPanel): void;
40
42
  openPanel(panel: IDockviewPanel, index?: number): void;
@@ -87,9 +89,11 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
87
89
  setPrefixActionsElement(element: HTMLElement | undefined): void;
88
90
  isActive(tab: Tab): boolean;
89
91
  indexOf(id: string): number;
92
+ getTabId(panelId: string): string | undefined;
90
93
  setActive(_isGroupActive: boolean): void;
91
94
  delete(id: string): void;
92
95
  setActivePanel(panel: IDockviewPanel): void;
96
+ focusActiveTab(): void;
93
97
  openPanel(panel: IDockviewPanel, index?: number): void;
94
98
  closePanel(panel: IDockviewPanel): void;
95
99
  private updateClassnames;
@@ -253,6 +253,9 @@ var TabsContainer = /** @class */ (function (_super) {
253
253
  TabsContainer.prototype.indexOf = function (id) {
254
254
  return this.tabs.indexOf(id);
255
255
  };
256
+ TabsContainer.prototype.getTabId = function (panelId) {
257
+ return this.tabs.getTabId(panelId);
258
+ };
256
259
  TabsContainer.prototype.setActive = function (_isGroupActive) {
257
260
  // noop
258
261
  };
@@ -263,6 +266,9 @@ var TabsContainer = /** @class */ (function (_super) {
263
266
  TabsContainer.prototype.setActivePanel = function (panel) {
264
267
  this.tabs.setActivePanel(panel);
265
268
  };
269
+ TabsContainer.prototype.focusActiveTab = function () {
270
+ this.tabs.focusActiveTab();
271
+ };
266
272
  TabsContainer.prototype.openPanel = function (panel, index) {
267
273
  if (index === void 0) { index = this.tabs.size; }
268
274
  this.tabs.openPanel(panel, index);
@@ -374,8 +380,10 @@ var TabsContainer = /** @class */ (function (_super) {
374
380
  // Activate the first panel in the group
375
381
  var firstPanelId = tg.panelIds[0];
376
382
  if (firstPanelId) {
377
- var panel = _this.group.panels.find(function (p) { return p.id === firstPanelId; });
378
- panel === null || panel === void 0 ? void 0 : panel.api.setActive();
383
+ var panel_1 = _this.group.panels.find(function (p) { return p.id === firstPanelId; });
384
+ _this.accessor.withOrigin('user', function () {
385
+ return panel_1 === null || panel_1 === void 0 ? void 0 : panel_1.api.setActive();
386
+ });
379
387
  }
380
388
  });
381
389
  el.appendChild(groupHeader);
@@ -401,7 +409,9 @@ var TabsContainer = /** @class */ (function (_super) {
401
409
  tg.expand();
402
410
  }
403
411
  tab.element.scrollIntoView();
404
- tab.panel.api.setActive();
412
+ _this.accessor.withOrigin('user', function () {
413
+ return tab.panel.api.setActive();
414
+ });
405
415
  });
406
416
  wrapper.appendChild(child);
407
417
  el.appendChild(wrapper);
@@ -9,9 +9,7 @@ export declare class VoidContainer extends CompositeDisposable {
9
9
  private readonly _element;
10
10
  private readonly dropTarget;
11
11
  private readonly pointerDropTarget;
12
- private readonly html5DragSource;
13
- private readonly pointerDragSource;
14
- private readonly panelTransfer;
12
+ private readonly dragSource;
15
13
  private readonly _onDrop;
16
14
  readonly onDrop: Event<DroptargetEvent>;
17
15
  private readonly _onDragStart;
@@ -20,5 +18,4 @@ export declare class VoidContainer extends CompositeDisposable {
20
18
  get element(): HTMLElement;
21
19
  constructor(accessor: DockviewComponent, group: DockviewGroupPanel);
22
20
  updateDragAndDropState(): void;
23
- private getFloatingOverlay;
24
21
  }