dockview-core 6.3.0 → 6.5.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 (123) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/dnd/backend.d.ts +70 -0
  3. package/dist/cjs/dnd/backend.js +171 -0
  4. package/dist/cjs/dnd/dropOverlay.d.ts +20 -0
  5. package/dist/cjs/dnd/dropOverlay.js +197 -0
  6. package/dist/cjs/dnd/droptarget.d.ts +20 -6
  7. package/dist/cjs/dnd/droptarget.js +14 -208
  8. package/dist/cjs/dnd/pointer/index.d.ts +11 -0
  9. package/dist/cjs/dnd/pointer/index.js +13 -0
  10. package/dist/cjs/dnd/pointer/longPress.d.ts +32 -0
  11. package/dist/cjs/dnd/pointer/longPress.js +151 -0
  12. package/dist/cjs/dnd/pointer/pointerDragController.d.ts +60 -0
  13. package/dist/cjs/dnd/pointer/pointerDragController.js +241 -0
  14. package/dist/cjs/dnd/pointer/pointerDragSource.d.ts +61 -0
  15. package/dist/cjs/dnd/pointer/pointerDragSource.js +195 -0
  16. package/dist/cjs/dnd/pointer/pointerDropTarget.d.ts +39 -0
  17. package/dist/cjs/dnd/pointer/pointerDropTarget.js +198 -0
  18. package/dist/cjs/dnd/pointer/pointerGhost.d.ts +30 -0
  19. package/dist/cjs/dnd/pointer/pointerGhost.js +44 -0
  20. package/dist/cjs/dnd/pointer/types.d.ts +16 -0
  21. package/dist/cjs/dnd/pointer/types.js +2 -0
  22. package/dist/cjs/dockview/components/panel/content.d.ts +3 -1
  23. package/dist/cjs/dockview/components/panel/content.js +33 -16
  24. package/dist/cjs/dockview/components/popupService.js +34 -0
  25. package/dist/cjs/dockview/components/tab/tab.d.ts +11 -3
  26. package/dist/cjs/dockview/components/tab/tab.js +151 -117
  27. package/dist/cjs/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
  28. package/dist/cjs/dockview/components/titlebar/tabGroupChip.js +15 -6
  29. package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +33 -5
  30. package/dist/cjs/dockview/components/titlebar/tabGroups.js +231 -40
  31. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +38 -1
  32. package/dist/cjs/dockview/components/titlebar/tabs.js +372 -251
  33. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +5 -3
  34. package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +6 -2
  35. package/dist/cjs/dockview/components/titlebar/voidContainer.js +189 -27
  36. package/dist/cjs/dockview/contextMenu.js +19 -4
  37. package/dist/cjs/dockview/dndCapabilities.d.ts +19 -0
  38. package/dist/cjs/dockview/dndCapabilities.js +39 -0
  39. package/dist/cjs/dockview/dockviewComponent.d.ts +1 -0
  40. package/dist/cjs/dockview/dockviewComponent.js +54 -33
  41. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +9 -5
  42. package/dist/cjs/dockview/dockviewGroupPanelModel.js +25 -11
  43. package/dist/cjs/dockview/events.d.ts +2 -1
  44. package/dist/cjs/dockview/events.js +1 -0
  45. package/dist/cjs/dockview/options.d.ts +18 -3
  46. package/dist/cjs/dockview/options.js +1 -0
  47. package/dist/cjs/dom.js +7 -3
  48. package/dist/cjs/overlay/overlay.d.ts +12 -0
  49. package/dist/cjs/overlay/overlay.js +84 -16
  50. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
  51. package/dist/cjs/paneview/draggablePaneviewPanel.js +27 -26
  52. package/dist/cjs/paneview/options.d.ts +4 -3
  53. package/dist/dockview-core.js +2199 -834
  54. package/dist/dockview-core.min.js +2 -2
  55. package/dist/dockview-core.min.js.map +1 -1
  56. package/dist/dockview-core.min.noStyle.js +2 -2
  57. package/dist/dockview-core.min.noStyle.js.map +1 -1
  58. package/dist/dockview-core.noStyle.js +2202 -837
  59. package/dist/esm/dnd/backend.d.ts +70 -0
  60. package/dist/esm/dnd/backend.js +148 -0
  61. package/dist/esm/dnd/dropOverlay.d.ts +20 -0
  62. package/dist/esm/dnd/dropOverlay.js +192 -0
  63. package/dist/esm/dnd/droptarget.d.ts +20 -6
  64. package/dist/esm/dnd/droptarget.js +16 -210
  65. package/dist/esm/dnd/pointer/index.d.ts +11 -0
  66. package/dist/esm/dnd/pointer/index.js +5 -0
  67. package/dist/esm/dnd/pointer/longPress.d.ts +32 -0
  68. package/dist/esm/dnd/pointer/longPress.js +127 -0
  69. package/dist/esm/dnd/pointer/pointerDragController.d.ts +60 -0
  70. package/dist/esm/dnd/pointer/pointerDragController.js +191 -0
  71. package/dist/esm/dnd/pointer/pointerDragSource.d.ts +61 -0
  72. package/dist/esm/dnd/pointer/pointerDragSource.js +171 -0
  73. package/dist/esm/dnd/pointer/pointerDropTarget.d.ts +39 -0
  74. package/dist/esm/dnd/pointer/pointerDropTarget.js +168 -0
  75. package/dist/esm/dnd/pointer/pointerGhost.d.ts +30 -0
  76. package/dist/esm/dnd/pointer/pointerGhost.js +39 -0
  77. package/dist/esm/dnd/pointer/types.d.ts +16 -0
  78. package/dist/esm/dnd/pointer/types.js +1 -0
  79. package/dist/esm/dockview/components/panel/content.d.ts +3 -1
  80. package/dist/esm/dockview/components/panel/content.js +33 -16
  81. package/dist/esm/dockview/components/popupService.js +34 -0
  82. package/dist/esm/dockview/components/tab/tab.d.ts +11 -3
  83. package/dist/esm/dockview/components/tab/tab.js +139 -114
  84. package/dist/esm/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
  85. package/dist/esm/dockview/components/titlebar/tabGroupChip.js +15 -6
  86. package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +33 -5
  87. package/dist/esm/dockview/components/titlebar/tabGroups.js +177 -12
  88. package/dist/esm/dockview/components/titlebar/tabs.d.ts +38 -1
  89. package/dist/esm/dockview/components/titlebar/tabs.js +348 -227
  90. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +5 -3
  91. package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +6 -2
  92. package/dist/esm/dockview/components/titlebar/voidContainer.js +179 -31
  93. package/dist/esm/dockview/contextMenu.js +19 -4
  94. package/dist/esm/dockview/dndCapabilities.d.ts +19 -0
  95. package/dist/esm/dockview/dndCapabilities.js +36 -0
  96. package/dist/esm/dockview/dockviewComponent.d.ts +1 -0
  97. package/dist/esm/dockview/dockviewComponent.js +55 -34
  98. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +9 -5
  99. package/dist/esm/dockview/dockviewGroupPanelModel.js +24 -11
  100. package/dist/esm/dockview/events.d.ts +2 -1
  101. package/dist/esm/dockview/events.js +1 -0
  102. package/dist/esm/dockview/options.d.ts +18 -3
  103. package/dist/esm/dockview/options.js +1 -0
  104. package/dist/esm/dom.js +7 -3
  105. package/dist/esm/overlay/overlay.d.ts +12 -0
  106. package/dist/esm/overlay/overlay.js +85 -17
  107. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
  108. package/dist/esm/paneview/draggablePaneviewPanel.js +26 -20
  109. package/dist/esm/paneview/options.d.ts +4 -3
  110. package/dist/package/main.cjs.js +2202 -837
  111. package/dist/package/main.cjs.min.js +2 -2
  112. package/dist/package/main.esm.min.mjs +2 -2
  113. package/dist/package/main.esm.mjs +2202 -837
  114. package/dist/styles/dockview.css +117 -1
  115. package/package.json +3 -1
  116. package/dist/cjs/dnd/abstractDragHandler.d.ts +0 -14
  117. package/dist/cjs/dnd/abstractDragHandler.js +0 -86
  118. package/dist/cjs/dnd/groupDragHandler.d.ts +0 -12
  119. package/dist/cjs/dnd/groupDragHandler.js +0 -104
  120. package/dist/esm/dnd/abstractDragHandler.d.ts +0 -14
  121. package/dist/esm/dnd/abstractDragHandler.js +0 -63
  122. package/dist/esm/dnd/groupDragHandler.d.ts +0 -12
  123. package/dist/esm/dnd/groupDragHandler.js +0 -81
@@ -39,9 +39,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.TabGroupManager = void 0;
40
40
  var dom_1 = require("../../../dom");
41
41
  var events_1 = require("../../../events");
42
+ var dataTransfer_1 = require("../../../dnd/dataTransfer");
43
+ var backend_1 = require("../../../dnd/backend");
44
+ var longPress_1 = require("../../../dnd/pointer/longPress");
42
45
  var lifecycle_1 = require("../../../lifecycle");
46
+ var dndCapabilities_1 = require("../../dndCapabilities");
43
47
  var tabGroupAccent_1 = require("../../tabGroupAccent");
44
48
  var tabGroupChip_1 = require("./tabGroupChip");
49
+ var droptarget_1 = require("../../../dnd/droptarget");
50
+ var dataTransfer_2 = require("../../../dnd/dataTransfer");
45
51
  var tabGroupIndicator_1 = require("./tabGroupIndicator");
46
52
  var EMPTY_MAP = new Map();
47
53
  var TabGroupManager = /** @class */ (function () {
@@ -168,8 +174,25 @@ var TabGroupManager = /** @class */ (function () {
168
174
  finally { if (e_4) throw e_4.error; }
169
175
  }
170
176
  };
171
- TabGroupManager.prototype.snapshotChipWidths = function () {
177
+ TabGroupManager.prototype.updateDirection = function () {
172
178
  var e_5, _a;
179
+ var isVertical = this._ctx.getDirection() === 'vertical';
180
+ try {
181
+ for (var _b = __values(this._chipRenderers), _c = _b.next(); !_c.done; _c = _b.next()) {
182
+ var _d = __read(_c.value, 2), entry = _d[1];
183
+ entry.dropTarget.setTargetZones(isVertical ? ['top'] : ['left']);
184
+ }
185
+ }
186
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
187
+ finally {
188
+ try {
189
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
190
+ }
191
+ finally { if (e_5) throw e_5.error; }
192
+ }
193
+ };
194
+ TabGroupManager.prototype.snapshotChipWidths = function () {
195
+ var e_6, _a;
173
196
  var widths = new Map();
174
197
  try {
175
198
  for (var _b = __values(this._chipRenderers), _c = _b.next(); !_c.done; _c = _b.next()) {
@@ -177,12 +200,12 @@ var TabGroupManager = /** @class */ (function () {
177
200
  widths.set(groupId, entry.chip.element.getBoundingClientRect().width);
178
201
  }
179
202
  }
180
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
203
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
181
204
  finally {
182
205
  try {
183
206
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
184
207
  }
185
- finally { if (e_5) throw e_5.error; }
208
+ finally { if (e_6) throw e_6.error; }
186
209
  }
187
210
  return widths;
188
211
  };
@@ -272,8 +295,58 @@ var TabGroupManager = /** @class */ (function () {
272
295
  (_a = this._pendingTransitionCleanups.get(panelId)) === null || _a === void 0 ? void 0 : _a();
273
296
  this._pendingTransitionCleanups.delete(panelId);
274
297
  };
298
+ TabGroupManager.prototype.updateDragAndDropState = function () {
299
+ var e_7, _a;
300
+ var caps = (0, dndCapabilities_1.resolveDndCapabilities)(this._ctx.accessor.options);
301
+ try {
302
+ for (var _b = __values(this._chipRenderers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
303
+ var entry = _c.value;
304
+ entry.chip.element.draggable = caps.html5;
305
+ entry.html5DragSource.setDisabled(!caps.html5);
306
+ entry.pointerDragSource.setDisabled(!caps.pointer);
307
+ entry.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
308
+ }
309
+ }
310
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
311
+ finally {
312
+ try {
313
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
314
+ }
315
+ finally { if (e_7) throw e_7.error; }
316
+ }
317
+ };
318
+ /**
319
+ * Synchronously dispose the chip drag sources for an in-flight chip
320
+ * drag. Called from `_commitGroupMove` so the transfer payload +
321
+ * iframe shield are released BEFORE the cross-group move detaches
322
+ * the chip (chip dispose is scheduled on a microtask via
323
+ * `_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
+ */
327
+ TabGroupManager.prototype.disposeChipDrag = function (tabGroupId) {
328
+ var _a, _b;
329
+ var entry = this._chipRenderers.get(tabGroupId);
330
+ if (!entry) {
331
+ return;
332
+ }
333
+ // Optional-chained because tests may inject minimal entries
334
+ // 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();
337
+ };
338
+ /** Cloned chip rect used as the pointer follow-finger ghost. */
339
+ TabGroupManager.prototype._buildChipGhostElement = function (chipEl) {
340
+ var style = getComputedStyle(chipEl);
341
+ var clone = chipEl.cloneNode(true);
342
+ Array.from(style).forEach(function (key) {
343
+ clone.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));
344
+ });
345
+ clone.style.position = 'absolute';
346
+ return clone;
347
+ };
275
348
  TabGroupManager.prototype.disposeAll = function () {
276
- var e_6, _a, e_7, _b;
349
+ var e_8, _a, e_9, _b;
277
350
  var _c;
278
351
  (_c = this._indicator) === null || _c === void 0 ? void 0 : _c.dispose();
279
352
  this._indicator = null;
@@ -283,12 +356,12 @@ var TabGroupManager = /** @class */ (function () {
283
356
  cleanup();
284
357
  }
285
358
  }
286
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
359
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
287
360
  finally {
288
361
  try {
289
362
  if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
290
363
  }
291
- finally { if (e_6) throw e_6.error; }
364
+ finally { if (e_8) throw e_8.error; }
292
365
  }
293
366
  this._pendingTransitionCleanups.clear();
294
367
  try {
@@ -299,12 +372,12 @@ var TabGroupManager = /** @class */ (function () {
299
372
  entry.disposable.dispose();
300
373
  }
301
374
  }
302
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
375
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
303
376
  finally {
304
377
  try {
305
378
  if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
306
379
  }
307
- finally { if (e_7) throw e_7.error; }
380
+ finally { if (e_9) throw e_9.error; }
308
381
  }
309
382
  this._chipRenderers.clear();
310
383
  };
@@ -340,6 +413,78 @@ var TabGroupManager = /** @class */ (function () {
340
413
  ? createChip(tabGroup)
341
414
  : new tabGroupChip_1.TabGroupChip(this._ctx.accessor.tabGroupColorPalette);
342
415
  chip.init({ tabGroup: tabGroup, api: this._ctx.accessor.api });
416
+ var caps = (0, dndCapabilities_1.resolveDndCapabilities)(this._ctx.accessor.options);
417
+ chip.element.draggable = caps.html5;
418
+ var panelTransfer = dataTransfer_1.LocalSelectionTransfer.getInstance();
419
+ // Shared `getData` for both backends. Sets a group-level
420
+ // PanelTransfer (panelId=null, tabGroupId identifies the group).
421
+ // The returned disposer clears it on drag end.
422
+ var getData = function () {
423
+ panelTransfer.setData([
424
+ new dataTransfer_1.PanelTransfer(_this._ctx.accessor.id, _this._ctx.group.id, null, tabGroup.id),
425
+ ], dataTransfer_1.PanelTransfer.prototype);
426
+ return {
427
+ dispose: function () {
428
+ panelTransfer.clearData(dataTransfer_1.PanelTransfer.prototype);
429
+ },
430
+ };
431
+ };
432
+ // The chip's HTML5 drag image is the cloned tabs list (chip only),
433
+ // mounted inside the dockview root for CSS-variable inheritance and
434
+ // positioned against the chip's in-place rect. Layout-dependent
435
+ // offset means we set the drag image directly in `onDragStart`
436
+ // (inside the dragstart handler) rather than via the generic
437
+ // `createGhost` factory, which only knows about ghost specs that
438
+ // can be appended to `document.body`.
439
+ var html5DragSource = backend_1.html5Backend.createDragSource(chip.element, {
440
+ getData: getData,
441
+ disabled: !caps.html5,
442
+ isCancelled: function () {
443
+ return !(0, dndCapabilities_1.resolveDndCapabilities)(_this._ctx.accessor.options).html5;
444
+ },
445
+ onDragStart: function (event) {
446
+ // Type guard via `dataTransfer` — `instanceof DragEvent`
447
+ // would throw in jsdom which doesn't ship a DragEvent
448
+ // constructor.
449
+ if ('dataTransfer' in event && event.dataTransfer) {
450
+ _this.setGroupDragImage(event, tabGroup, chip.element);
451
+ }
452
+ _this._callbacks.onChipDragStart(tabGroup, chip, event);
453
+ },
454
+ onDragEnd: function (event) {
455
+ var _a, _b;
456
+ (_b = (_a = _this._callbacks).onChipDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, tabGroup, chip, event);
457
+ },
458
+ });
459
+ // Synchronous panelTransfer cleanup directly on the chip element.
460
+ // `Html5DragSource`'s dragend defers data disposal via `setTimeout(0)`
461
+ // so drop handlers can read the payload — but a chip drag that
462
+ // ends via `moveGroupOrPanel` (no actual drop event) needs the
463
+ // singleton cleared immediately, otherwise a synchronous
464
+ // `getPanelData()` after the move still sees the stale chip
465
+ // payload. Attached directly (not via `addDisposableListener`) so
466
+ // the listener survives chip disposal in the detach-then-dragend
467
+ // cross-group path; `once: true` auto-removes after the single
468
+ // dragend that we care about. (#1254)
469
+ chip.element.addEventListener('dragend', function () {
470
+ panelTransfer.clearData(dataTransfer_1.PanelTransfer.prototype);
471
+ }, { once: true });
472
+ var pointerDragSource = backend_1.pointerBackend.createDragSource(chip.element, {
473
+ getData: getData,
474
+ disabled: !caps.pointer,
475
+ touchOnly: !caps.pointerHandlesMouse,
476
+ isCancelled: function () {
477
+ return !(0, dndCapabilities_1.resolveDndCapabilities)(_this._ctx.accessor.options).pointer;
478
+ },
479
+ createGhost: function () { return ({
480
+ element: _this._buildChipGhostElement(chip.element),
481
+ offsetX: 8,
482
+ offsetY: 8,
483
+ }); },
484
+ onDragStart: function (event) {
485
+ _this._callbacks.onChipDragStart(tabGroup, chip, event);
486
+ },
487
+ });
343
488
  var disposables = [
344
489
  tabGroup.onDidChange(function () {
345
490
  var _a;
@@ -353,24 +498,70 @@ var TabGroupManager = /** @class */ (function () {
353
498
  tabGroup.onDidCollapseChange(function () {
354
499
  _this._updateTabGroupClasses();
355
500
  }),
501
+ html5DragSource,
502
+ pointerDragSource,
356
503
  ];
357
- // Wire chip context menu and drag for all chip renderers
504
+ // Context menu: built-in TabGroupChip already aggregates right-click
505
+ // + touch long-press into `onContextMenu`. Custom chip renderers
506
+ // don't, so attach a long-press detector and contextmenu listener
507
+ // directly on their element.
508
+ var onContextMenu = function (event) {
509
+ // A long-press on a chip should preempt the in-flight pointer
510
+ // drag and open the menu instead.
511
+ pointerDragSource.cancelPending();
512
+ _this._callbacks.onChipContextMenu(tabGroup, event);
513
+ };
358
514
  if (chip instanceof tabGroupChip_1.TabGroupChip) {
359
- disposables.push(chip.onContextMenu(function (event) {
360
- _this._callbacks.onChipContextMenu(tabGroup, event);
361
- }), chip.onDragStart(function (event) {
362
- _this._callbacks.onChipDragStart(tabGroup, chip, event);
363
- }));
515
+ disposables.push(chip.onContextMenu(onContextMenu));
364
516
  }
365
517
  else {
366
- disposables.push((0, events_1.addDisposableListener)(chip.element, 'contextmenu', function (event) {
367
- _this._callbacks.onChipContextMenu(tabGroup, event);
368
- }), (0, events_1.addDisposableListener)(chip.element, 'dragstart', function (event) {
369
- _this._callbacks.onChipDragStart(tabGroup, chip, event);
370
- }));
371
- }
518
+ disposables.push(new longPress_1.LongPressDetector(chip.element, {
519
+ onLongPress: onContextMenu,
520
+ }), (0, events_1.addDisposableListener)(chip.element, 'contextmenu', onContextMenu));
521
+ }
522
+ // The chip sits before its group's first tab in the DOM, so it
523
+ // covers the "drop before the group" position. Without a drop
524
+ // target here, dropping a tab over the chip is a dead zone —
525
+ // particularly visible when the group is first in the tabs list
526
+ // and there's no preceding tab whose right zone covers position 0.
527
+ // The smooth animation path already shifts the chip's margin to
528
+ // open a gap, so suppress the overlay in that mode.
529
+ var isVertical = this._ctx.getDirection() === 'vertical';
530
+ var dropTarget = new droptarget_1.Droptarget(chip.element, {
531
+ acceptedTargetZones: isVertical ? ['top'] : ['left'],
532
+ overlayModel: {
533
+ activationSize: { value: 100, type: 'percentage' },
534
+ },
535
+ canDisplayOverlay: function (event, position) {
536
+ var _a;
537
+ if (_this._ctx.group.locked) {
538
+ return false;
539
+ }
540
+ if (_this._ctx.accessor.options.disableDnd) {
541
+ return false;
542
+ }
543
+ var data = (0, dataTransfer_2.getPanelData)();
544
+ if (data && _this._ctx.accessor.id === data.viewId) {
545
+ if (((_a = _this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) ===
546
+ 'smooth') {
547
+ return false;
548
+ }
549
+ return true;
550
+ }
551
+ return _this._ctx.group.model.canDisplayOverlay(event, position, 'tab');
552
+ },
553
+ });
554
+ disposables.push(dropTarget, dropTarget.onDrop(function (event) {
555
+ _this._callbacks.onChipDrop(tabGroup, event);
556
+ }));
372
557
  var disposable = new (lifecycle_1.CompositeDisposable.bind.apply(lifecycle_1.CompositeDisposable, __spreadArray([void 0], __read(disposables), false)))();
373
- this._chipRenderers.set(tabGroup.id, { chip: chip, disposable: disposable });
558
+ this._chipRenderers.set(tabGroup.id, {
559
+ chip: chip,
560
+ html5DragSource: html5DragSource,
561
+ pointerDragSource: pointerDragSource,
562
+ disposable: disposable,
563
+ dropTarget: dropTarget,
564
+ });
374
565
  // Group is born collapsed (cross-group drop, layout restore, etc.):
375
566
  // its tabs are about to be added without the collapsed class. Skip
376
567
  // the animation in the upcoming _updateTabGroupClasses call so they
@@ -404,7 +595,7 @@ var TabGroupManager = /** @class */ (function () {
404
595
  }
405
596
  };
406
597
  TabGroupManager.prototype._updateTabGroupClasses = function () {
407
- var e_8, _a, e_9, _b, e_10, _c, e_11, _d, e_12, _e, e_13, _f, e_14, _g;
598
+ var e_10, _a, e_11, _b, e_12, _c, e_13, _d, e_14, _e, e_15, _f, e_16, _g;
408
599
  var _this = this;
409
600
  var _h;
410
601
  var model = this._ctx.group.model;
@@ -418,26 +609,26 @@ var TabGroupManager = /** @class */ (function () {
418
609
  for (var tabGroups_2 = __values(tabGroups), tabGroups_2_1 = tabGroups_2.next(); !tabGroups_2_1.done; tabGroups_2_1 = tabGroups_2.next()) {
419
610
  var tg = tabGroups_2_1.value;
420
611
  try {
421
- for (var _j = (e_9 = void 0, __values(tg.panelIds)), _k = _j.next(); !_k.done; _k = _j.next()) {
612
+ for (var _j = (e_11 = void 0, __values(tg.panelIds)), _k = _j.next(); !_k.done; _k = _j.next()) {
422
613
  var pid = _k.value;
423
614
  panelGroupMap.set(pid, tg);
424
615
  }
425
616
  }
426
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
617
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
427
618
  finally {
428
619
  try {
429
620
  if (_k && !_k.done && (_b = _j.return)) _b.call(_j);
430
621
  }
431
- finally { if (e_9) throw e_9.error; }
622
+ finally { if (e_11) throw e_11.error; }
432
623
  }
433
624
  }
434
625
  }
435
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
626
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
436
627
  finally {
437
628
  try {
438
629
  if (tabGroups_2_1 && !tabGroups_2_1.done && (_a = tabGroups_2.return)) _a.call(tabGroups_2);
439
630
  }
440
- finally { if (e_8) throw e_8.error; }
631
+ finally { if (e_10) throw e_10.error; }
441
632
  }
442
633
  var _loop_1 = function (tabEntry) {
443
634
  var tab = tabEntry.value;
@@ -493,12 +684,12 @@ var TabGroupManager = /** @class */ (function () {
493
684
  _loop_1(tabEntry);
494
685
  }
495
686
  }
496
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
687
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
497
688
  finally {
498
689
  try {
499
690
  if (tabs_1_1 && !tabs_1_1.done && (_c = tabs_1.return)) _c.call(tabs_1);
500
691
  }
501
- finally { if (e_10) throw e_10.error; }
692
+ finally { if (e_12) throw e_12.error; }
502
693
  }
503
694
  // Track active group IDs for underline/collapse handling
504
695
  var activeGroupIds = new Set();
@@ -521,7 +712,7 @@ var TabGroupManager = /** @class */ (function () {
521
712
  // dv-tab--group-collapsed doesn't fire.
522
713
  var affected = [];
523
714
  try {
524
- for (var _l = (e_12 = void 0, __values(tg.panelIds)), _m = _l.next(); !_m.done; _m = _l.next()) {
715
+ for (var _l = (e_14 = void 0, __values(tg.panelIds)), _m = _l.next(); !_m.done; _m = _l.next()) {
525
716
  var pid = _m.value;
526
717
  var te = tabMap.get(pid);
527
718
  if (te) {
@@ -531,27 +722,27 @@ var TabGroupManager = /** @class */ (function () {
531
722
  }
532
723
  }
533
724
  }
534
- catch (e_12_1) { e_12 = { error: e_12_1 }; }
725
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
535
726
  finally {
536
727
  try {
537
728
  if (_m && !_m.done && (_e = _l.return)) _e.call(_l);
538
729
  }
539
- finally { if (e_12) throw e_12.error; }
730
+ finally { if (e_14) throw e_14.error; }
540
731
  }
541
732
  if (affected.length > 0) {
542
733
  void affected[0].offsetHeight; // single reflow
543
734
  try {
544
- for (var affected_1 = (e_13 = void 0, __values(affected)), affected_1_1 = affected_1.next(); !affected_1_1.done; affected_1_1 = affected_1.next()) {
735
+ for (var affected_1 = (e_15 = void 0, __values(affected)), affected_1_1 = affected_1.next(); !affected_1_1.done; affected_1_1 = affected_1.next()) {
545
736
  var el = affected_1_1.value;
546
737
  el.style.removeProperty('transition');
547
738
  }
548
739
  }
549
- catch (e_13_1) { e_13 = { error: e_13_1 }; }
740
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
550
741
  finally {
551
742
  try {
552
743
  if (affected_1_1 && !affected_1_1.done && (_f = affected_1.return)) _f.call(affected_1);
553
744
  }
554
- finally { if (e_13) throw e_13.error; }
745
+ finally { if (e_15) throw e_15.error; }
555
746
  }
556
747
  }
557
748
  }
@@ -559,7 +750,7 @@ var TabGroupManager = /** @class */ (function () {
559
750
  hasAnimation = true;
560
751
  var isVert = this._ctx.getDirection() === 'vertical';
561
752
  try {
562
- for (var _o = (e_14 = void 0, __values(tg.panelIds)), _p = _o.next(); !_p.done; _p = _o.next()) {
753
+ for (var _o = (e_16 = void 0, __values(tg.panelIds)), _p = _o.next(); !_p.done; _p = _o.next()) {
563
754
  var pid = _p.value;
564
755
  var te = tabMap.get(pid);
565
756
  if (te &&
@@ -576,23 +767,23 @@ var TabGroupManager = /** @class */ (function () {
576
767
  }
577
768
  }
578
769
  }
579
- catch (e_14_1) { e_14 = { error: e_14_1 }; }
770
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
580
771
  finally {
581
772
  try {
582
773
  if (_p && !_p.done && (_g = _o.return)) _g.call(_o);
583
774
  }
584
- finally { if (e_14) throw e_14.error; }
775
+ finally { if (e_16) throw e_16.error; }
585
776
  }
586
777
  }
587
778
  }
588
779
  }
589
780
  }
590
- catch (e_11_1) { e_11 = { error: e_11_1 }; }
781
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
591
782
  finally {
592
783
  try {
593
784
  if (tabGroups_3_1 && !tabGroups_3_1.done && (_d = tabGroups_3.return)) _d.call(tabGroups_3);
594
785
  }
595
- finally { if (e_11) throw e_11.error; }
786
+ finally { if (e_13) throw e_13.error; }
596
787
  }
597
788
  this._skipNextCollapseAnimation = false;
598
789
  // Sync indicator underlines and position them
@@ -26,7 +26,7 @@ export declare class Tabs extends CompositeDisposable {
26
26
  private _voidContainer;
27
27
  private _voidContainerListeners;
28
28
  private _extendedDropZone;
29
- private _chipDragCleanup;
29
+ private _pointerInsideTabsList;
30
30
  private readonly _tabGroupManager;
31
31
  private readonly _onTabDragStart;
32
32
  readonly onTabDragStart: Event<TabDragEvent>;
@@ -72,7 +72,22 @@ export declare class Tabs extends CompositeDisposable {
72
72
  */
73
73
  updateTabGroups(): void;
74
74
  refreshTabGroupAccent(): void;
75
+ /**
76
+ * Tabs-list-specific side effects of a chip drag start. The chip's
77
+ * drag sources (constructed by `TabGroupManager`) own the transfer
78
+ * payload, iframe shielding, dataTransfer setup, and the HTML5 drag
79
+ * image. This method just sets up the smooth-reorder anim state and
80
+ * collapses the source-group tabs in the tabs list.
81
+ */
75
82
  private _handleChipDragStart;
83
+ /**
84
+ * A drop on a tab group chip means "insert before this group". Resolve to
85
+ * the index of the group's first tab, adjusting for same-group removal
86
+ * (when the source tab is currently to the left of the target slot, its
87
+ * removal shifts the insertion index down by one). Always clears
88
+ * `targetTabGroupId` so the dropped tab lands outside the group.
89
+ */
90
+ private _handleChipDrop;
76
91
  /**
77
92
  * Sets the broader container that is part of the same logical drop surface
78
93
  * as this tab list (e.g. the full header element). When a dragleave from
@@ -94,6 +109,28 @@ export declare class Tabs extends CompositeDisposable {
94
109
  clearExternalAnimState(): void;
95
110
  private snapshotTabPositions;
96
111
  private getAverageTabWidth;
112
+ /**
113
+ * Pointer-event entry point. The HTML5 path enters via the per-element
114
+ * `dragover` listener; this one hit-tests the global pointer-drag
115
+ * position against the tabs list and routes through the same shared
116
+ * `_processDragOver` / `_processDragLeave` helpers.
117
+ */
118
+ private _handlePointerDragMove;
119
+ /**
120
+ * Shared body of the dragover entry point. Refreshes stale anim state
121
+ * for a changed drag identity, initializes anim state for incoming
122
+ * cross-group drags, and dispatches to the gap-following math in
123
+ * `handleDragOver`. Returns true when this tabs list has taken
124
+ * ownership of the drag — HTML5 callers use this to gate
125
+ * `event.preventDefault()`.
126
+ */
127
+ private _processDragOver;
128
+ /**
129
+ * Shared body of the dragleave entry point. Preserves anim state when
130
+ * the drag moves between tabs-list children, into the extended drop
131
+ * zone, or into the void container; tears it down otherwise.
132
+ */
133
+ private _processDragLeave;
97
134
  private handleDragOver;
98
135
  /**
99
136
  * Batch-remove a CSS class from multiple elements instantly,