dockview-core 6.3.0 → 6.4.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
@@ -14,36 +14,26 @@ var __extends = (this && this.__extends) || (function () {
14
14
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
15
  };
16
16
  })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
17
28
  Object.defineProperty(exports, "__esModule", { value: true });
18
29
  exports.Tab = void 0;
19
30
  var events_1 = require("../../../events");
20
31
  var lifecycle_1 = require("../../../lifecycle");
21
32
  var dataTransfer_1 = require("../../../dnd/dataTransfer");
22
33
  var dom_1 = require("../../../dom");
23
- var droptarget_1 = require("../../../dnd/droptarget");
24
- var abstractDragHandler_1 = require("../../../dnd/abstractDragHandler");
25
- var ghost_1 = require("../../../dnd/ghost");
26
- var TabDragHandler = /** @class */ (function (_super) {
27
- __extends(TabDragHandler, _super);
28
- function TabDragHandler(element, accessor, group, panel, disabled) {
29
- var _this = _super.call(this, element, disabled) || this;
30
- _this.accessor = accessor;
31
- _this.group = group;
32
- _this.panel = panel;
33
- _this.panelTransfer = dataTransfer_1.LocalSelectionTransfer.getInstance();
34
- return _this;
35
- }
36
- TabDragHandler.prototype.getData = function (event) {
37
- var _this = this;
38
- this.panelTransfer.setData([new dataTransfer_1.PanelTransfer(this.accessor.id, this.group.id, this.panel.id)], dataTransfer_1.PanelTransfer.prototype);
39
- return {
40
- dispose: function () {
41
- _this.panelTransfer.clearData(dataTransfer_1.PanelTransfer.prototype);
42
- },
43
- };
44
- };
45
- return TabDragHandler;
46
- }(abstractDragHandler_1.DragHandler));
34
+ var backend_1 = require("../../../dnd/backend");
35
+ var longPress_1 = require("../../../dnd/pointer/longPress");
36
+ var dndCapabilities_1 = require("../../dndCapabilities");
47
37
  var Tab = /** @class */ (function (_super) {
48
38
  __extends(Tab, _super);
49
39
  function Tab(panel, accessor, group) {
@@ -52,6 +42,7 @@ var Tab = /** @class */ (function (_super) {
52
42
  _this.accessor = accessor;
53
43
  _this.group = group;
54
44
  _this.content = undefined;
45
+ _this.panelTransfer = dataTransfer_1.LocalSelectionTransfer.getInstance();
55
46
  _this._direction = 'horizontal';
56
47
  _this._onPointDown = new events_1.Emitter();
57
48
  _this.onPointerDown = _this._onPointDown.event;
@@ -63,114 +54,108 @@ var Tab = /** @class */ (function (_super) {
63
54
  _this.onDragStart = _this._onDragStart.event;
64
55
  _this._onDragEnd = new events_1.Emitter();
65
56
  _this.onDragEnd = _this._onDragEnd.event;
57
+ var caps = (0, dndCapabilities_1.resolveDndCapabilities)(_this.accessor.options);
66
58
  _this._element = document.createElement('div');
67
59
  _this._element.className = 'dv-tab';
68
60
  _this._element.tabIndex = 0;
69
- _this._element.draggable = !_this.accessor.options.disableDnd;
61
+ _this._element.draggable = caps.html5;
70
62
  (0, dom_1.toggleClass)(_this.element, 'dv-inactive-tab', true);
71
- _this.dragHandler = new TabDragHandler(_this._element, _this.accessor, _this.group, _this.panel, !!_this.accessor.options.disableDnd);
72
- _this.dropTarget = new droptarget_1.Droptarget(_this._element, {
63
+ var canDisplayOverlay = function (event, position) {
64
+ var _a;
65
+ if (_this.group.locked) {
66
+ return false;
67
+ }
68
+ var data = (0, dataTransfer_1.getPanelData)();
69
+ if (data && _this.accessor.id === data.viewId) {
70
+ // Smooth-reorder takes over the in-flight visual when active,
71
+ // so individual tab overlays are suppressed for internal drags.
72
+ if (((_a = _this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
73
+ return false;
74
+ }
75
+ return true;
76
+ }
77
+ return _this.group.model.canDisplayOverlay(event, position, 'tab');
78
+ };
79
+ _this.dropTarget = backend_1.html5Backend.createDropTarget(_this._element, {
80
+ acceptedTargetZones: ['left', 'right'],
81
+ overlayModel: _this._buildOverlayModel(),
82
+ canDisplayOverlay: canDisplayOverlay,
83
+ getOverrideTarget: function () { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
84
+ });
85
+ _this.pointerDropTarget = backend_1.pointerBackend.createDropTarget(_this._element, {
73
86
  acceptedTargetZones: ['left', 'right'],
74
87
  overlayModel: _this._buildOverlayModel(),
75
- canDisplayOverlay: function (event, position) {
88
+ canDisplayOverlay: canDisplayOverlay,
89
+ getOverrideTarget: function () { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
90
+ });
91
+ var sharedDragOptions = {
92
+ getData: function () {
93
+ _this.panelTransfer.setData([
94
+ new dataTransfer_1.PanelTransfer(_this.accessor.id, _this.group.id, _this.panel.id),
95
+ ], dataTransfer_1.PanelTransfer.prototype);
96
+ return {
97
+ dispose: function () {
98
+ _this.panelTransfer.clearData(dataTransfer_1.PanelTransfer.prototype);
99
+ },
100
+ };
101
+ },
102
+ // 30/-10 matches the HTML5 setDragImage offset that has been
103
+ // shipped for years; pointer backend wraps in PointerGhost,
104
+ // HTML5 backend feeds into setDragImage.
105
+ createGhost: function () { return ({
106
+ element: _this._buildGhostElement(),
107
+ offsetX: 30,
108
+ offsetY: -10,
109
+ }); },
110
+ onDragStart: function (event) {
76
111
  var _a;
77
- if (_this.group.locked) {
78
- return false;
112
+ _this._onDragStart.fire(event);
113
+ if (!(event instanceof PointerEvent) &&
114
+ ((_a = _this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
115
+ // Delay collapse to next frame so the browser
116
+ // captures the full drag image first.
117
+ requestAnimationFrame(function () {
118
+ (0, dom_1.toggleClass)(_this.element, 'dv-tab--dragging', true);
119
+ });
79
120
  }
80
- var data = (0, dataTransfer_1.getPanelData)();
81
- if (data && _this.accessor.id === data.viewId) {
82
- if (((_a = _this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
83
- // When smooth reorder is enabled, the Tabs
84
- // container handles all intra-accessor drops
85
- // (both same-group and cross-group) via
86
- // animation. Suppress the per-tab overlay so
87
- // the tab is dropped *beside* rather than *on*.
88
- return false;
89
- }
90
- return true;
91
- }
92
- return _this.group.model.canDisplayOverlay(event, position, 'tab');
93
121
  },
94
- getOverrideTarget: function () { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
95
- });
96
- _this.onWillShowOverlay = _this.dropTarget.onWillShowOverlay;
122
+ onDragEnd: function (event) {
123
+ _this._onDragEnd.fire(event);
124
+ },
125
+ };
126
+ _this.html5DragSource = backend_1.html5Backend.createDragSource(_this._element, __assign(__assign({}, sharedDragOptions), { disabled: !caps.html5 }));
127
+ _this.pointerDragSource = backend_1.pointerBackend.createDragSource(_this._element, __assign(__assign({}, sharedDragOptions), { disabled: !caps.pointer, touchOnly: !caps.pointerHandlesMouse, isCancelled: function () {
128
+ return !(0, dndCapabilities_1.resolveDndCapabilities)(_this.accessor.options).pointer;
129
+ } }));
130
+ // Both droptargets feed the same downstream stream; consumers don't
131
+ // need to know which path produced the overlay.
132
+ _this.onWillShowOverlay = events_1.Event.any(_this.dropTarget.onWillShowOverlay, _this.pointerDropTarget.onWillShowOverlay);
97
133
  _this.addDisposables(_this._onPointDown, _this._onTabClick, _this._onDropped, _this._onDragStart, _this._onDragEnd, _this.accessor.onDidOptionsChange(function () {
98
- _this.dropTarget.setOverlayModel(_this._buildOverlayModel());
99
- }), _this.dragHandler.onDragStart(function (event) {
100
- var _a;
101
- if (event.dataTransfer) {
102
- var style_1 = getComputedStyle(_this.element);
103
- var newNode_1 = _this.element.cloneNode(true);
104
- var isVertical_1 = _this._direction === 'vertical';
105
- /**
106
- * Properties to skip when copying computed styles for a
107
- * vertical tab ghost. `writing-mode` is excluded so we
108
- * can force `horizontal-tb`. Size and margin logical
109
- * properties are excluded because their physical meaning
110
- * flips when writing-mode changes, which would produce
111
- * incorrect dimensions.
112
- */
113
- var verticalSkip_1 = new Set([
114
- 'writing-mode',
115
- 'inline-size',
116
- 'block-size',
117
- 'min-inline-size',
118
- 'min-block-size',
119
- 'max-inline-size',
120
- 'max-block-size',
121
- 'margin-inline',
122
- 'margin-inline-start',
123
- 'margin-inline-end',
124
- 'margin-block',
125
- 'margin-block-start',
126
- 'margin-block-end',
127
- 'padding-inline',
128
- 'padding-inline-start',
129
- 'padding-inline-end',
130
- 'padding-block',
131
- 'padding-block-start',
132
- 'padding-block-end',
133
- ]);
134
- Array.from(style_1).forEach(function (key) {
135
- if (isVertical_1 && verticalSkip_1.has(key)) {
136
- return;
137
- }
138
- newNode_1.style.setProperty(key, style_1.getPropertyValue(key), style_1.getPropertyPriority(key));
139
- });
140
- if (isVertical_1) {
141
- // Force horizontal text flow and swap the physical
142
- // dimensions so the ghost appears as a horizontal tab.
143
- newNode_1.style.setProperty('writing-mode', 'horizontal-tb');
144
- newNode_1.style.setProperty('width', style_1.height);
145
- newNode_1.style.setProperty('height', style_1.width);
146
- }
147
- newNode_1.style.position = 'absolute';
148
- newNode_1.classList.add('dv-tab-ghost-drag');
149
- (0, ghost_1.addGhostImage)(event.dataTransfer, newNode_1, {
150
- y: -10,
151
- x: 30,
152
- });
153
- }
154
- _this._onDragStart.fire(event);
155
- if (((_a = _this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
156
- // Delay collapse to next frame so the browser
157
- // captures the full drag image first
158
- requestAnimationFrame(function () {
159
- (0, dom_1.toggleClass)(_this.element, 'dv-tab--dragging', true);
160
- });
161
- }
162
- }), (0, events_1.addDisposableListener)(_this._element, 'dragend', function (event) {
134
+ var model = _this._buildOverlayModel();
135
+ _this.dropTarget.setOverlayModel(model);
136
+ _this.pointerDropTarget.setOverlayModel(model);
137
+ }), (0, events_1.addDisposableListener)(_this._element, 'dragend', function () {
138
+ // The shared onDragEnd handler already fires _onDragEnd via
139
+ // the HTML5 backend; just strip the dragging class here.
163
140
  (0, dom_1.toggleClass)(_this.element, 'dv-tab--dragging', false);
164
- _this._onDragEnd.fire(event);
165
- }), _this.dragHandler, (0, events_1.addDisposableListener)(_this._element, 'pointerdown', function (event) {
141
+ }), _this.html5DragSource, (0, events_1.addDisposableListener)(_this._element, 'pointerdown', function (event) {
166
142
  _this._onPointDown.fire(event);
167
143
  }), (0, events_1.addDisposableListener)(_this._element, 'click', function (event) {
168
144
  _this._onTabClick.fire(event);
169
145
  }), (0, events_1.addDisposableListener)(_this._element, 'contextmenu', function (event) {
170
146
  _this.accessor.contextMenuController.show(_this.panel, _this.group, event);
147
+ }), new longPress_1.LongPressDetector(_this._element, {
148
+ onLongPress: function (event) {
149
+ // Don't let a subsequent finger move arm a drag on top
150
+ // of the just-opened menu.
151
+ _this.pointerDragSource.cancelPending();
152
+ _this.accessor.contextMenuController.show(_this.panel, _this.group, event);
153
+ },
171
154
  }), _this.dropTarget.onDrop(function (event) {
172
155
  _this._onDropped.fire(event);
173
- }), _this.dropTarget);
156
+ }), _this.pointerDropTarget.onDrop(function (event) {
157
+ _this._onDropped.fire(event);
158
+ }), _this.dropTarget, _this.pointerDropTarget, _this.pointerDragSource);
174
159
  return _this;
175
160
  }
176
161
  Object.defineProperty(Tab.prototype, "element", {
@@ -208,11 +193,60 @@ var Tab = /** @class */ (function (_super) {
208
193
  };
209
194
  Tab.prototype.setDirection = function (direction) {
210
195
  this._direction = direction;
211
- this.dropTarget.setTargetZones(direction === 'vertical' ? ['top', 'bottom'] : ['left', 'right']);
196
+ var zones = direction === 'vertical' ? ['top', 'bottom'] : ['left', 'right'];
197
+ this.dropTarget.setTargetZones(zones);
198
+ this.pointerDropTarget.setTargetZones(zones);
212
199
  };
213
200
  Tab.prototype.updateDragAndDropState = function () {
214
- this._element.draggable = !this.accessor.options.disableDnd;
215
- this.dragHandler.setDisabled(!!this.accessor.options.disableDnd);
201
+ var caps = (0, dndCapabilities_1.resolveDndCapabilities)(this.accessor.options);
202
+ this._element.draggable = caps.html5;
203
+ this.html5DragSource.setDisabled(!caps.html5);
204
+ this.pointerDragSource.setDisabled(!caps.pointer);
205
+ this.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
206
+ };
207
+ /**
208
+ * Vertical tabs are flipped to horizontal so the ghost stays readable
209
+ * during the drag rather than appearing sideways-rotated.
210
+ */
211
+ Tab.prototype._buildGhostElement = function () {
212
+ var style = getComputedStyle(this.element);
213
+ var newNode = this.element.cloneNode(true);
214
+ var isVertical = this._direction === 'vertical';
215
+ var verticalSkip = new Set([
216
+ 'writing-mode',
217
+ 'inline-size',
218
+ 'block-size',
219
+ 'min-inline-size',
220
+ 'min-block-size',
221
+ 'max-inline-size',
222
+ 'max-block-size',
223
+ 'margin-inline',
224
+ 'margin-inline-start',
225
+ 'margin-inline-end',
226
+ 'margin-block',
227
+ 'margin-block-start',
228
+ 'margin-block-end',
229
+ 'padding-inline',
230
+ 'padding-inline-start',
231
+ 'padding-inline-end',
232
+ 'padding-block',
233
+ 'padding-block-start',
234
+ 'padding-block-end',
235
+ ]);
236
+ Array.from(style).forEach(function (key) {
237
+ if (isVertical && verticalSkip.has(key)) {
238
+ return;
239
+ }
240
+ newNode.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));
241
+ });
242
+ if (isVertical) {
243
+ newNode.style.setProperty('writing-mode', 'horizontal-tb');
244
+ newNode.style.setProperty('width', style.height);
245
+ newNode.style.setProperty('height', style.width);
246
+ }
247
+ newNode.style.position = 'absolute';
248
+ newNode.classList.add('dv-tab-ghost-drag');
249
+ return newNode;
216
250
  };
217
251
  return Tab;
218
252
  }(lifecycle_1.CompositeDisposable));
@@ -4,6 +4,14 @@ import { ITabGroup } from '../../tabGroup';
4
4
  import { TabGroupColorPalette } from '../../tabGroupAccent';
5
5
  import { ITabGroupChipRenderer } from '../../framework';
6
6
  import { DockviewApi } from '../../../api/component.api';
7
+ /**
8
+ * Visual chip for a tab group. Owns the DOM element, label, click /
9
+ * context-menu interactions, and exposes a long-press gesture as a
10
+ * second `onContextMenu` source. Drag-and-drop wiring lives in
11
+ * `TabGroupManager` — the manager constructs the drag sources on this
12
+ * chip's element so it can include tabs-list context (custom group
13
+ * drag image, tab-group transfer payload).
14
+ */
7
15
  export declare class TabGroupChip extends CompositeDisposable implements ITabGroupChipRenderer {
8
16
  private readonly _palette?;
9
17
  private readonly _element;
@@ -12,9 +20,8 @@ export declare class TabGroupChip extends CompositeDisposable implements ITabGro
12
20
  private readonly _onClick;
13
21
  readonly onClick: Event<MouseEvent>;
14
22
  private readonly _onContextMenu;
23
+ /** Fires on right-click and on touch long-press. */
15
24
  readonly onContextMenu: Event<MouseEvent>;
16
- private readonly _onDragStart;
17
- readonly onDragStart: Event<DragEvent>;
18
25
  get element(): HTMLElement;
19
26
  constructor(_palette?: TabGroupColorPalette | undefined);
20
27
  init(params: {
@@ -20,6 +20,15 @@ var events_1 = require("../../../events");
20
20
  var lifecycle_1 = require("../../../lifecycle");
21
21
  var dom_1 = require("../../../dom");
22
22
  var tabGroupAccent_1 = require("../../tabGroupAccent");
23
+ var longPress_1 = require("../../../dnd/pointer/longPress");
24
+ /**
25
+ * Visual chip for a tab group. Owns the DOM element, label, click /
26
+ * context-menu interactions, and exposes a long-press gesture as a
27
+ * second `onContextMenu` source. Drag-and-drop wiring lives in
28
+ * `TabGroupManager` — the manager constructs the drag sources on this
29
+ * chip's element so it can include tabs-list context (custom group
30
+ * drag image, tab-group transfer payload).
31
+ */
23
32
  var TabGroupChip = /** @class */ (function (_super) {
24
33
  __extends(TabGroupChip, _super);
25
34
  function TabGroupChip(_palette) {
@@ -28,22 +37,22 @@ var TabGroupChip = /** @class */ (function (_super) {
28
37
  _this._onClick = new events_1.Emitter();
29
38
  _this.onClick = _this._onClick.event;
30
39
  _this._onContextMenu = new events_1.Emitter();
40
+ /** Fires on right-click and on touch long-press. */
31
41
  _this.onContextMenu = _this._onContextMenu.event;
32
- _this._onDragStart = new events_1.Emitter();
33
- _this.onDragStart = _this._onDragStart.event;
34
42
  _this._element = document.createElement('div');
35
43
  _this._element.className = 'dv-tab-group-chip';
36
44
  _this._element.tabIndex = 0;
37
- _this._element.draggable = true;
38
45
  _this._label = document.createElement('span');
39
46
  _this._label.className = 'dv-tab-group-chip-label';
40
47
  _this._element.appendChild(_this._label);
41
- _this.addDisposables(_this._onClick, _this._onContextMenu, _this._onDragStart, (0, events_1.addDisposableListener)(_this._element, 'click', function (event) {
48
+ _this.addDisposables(_this._onClick, _this._onContextMenu, new longPress_1.LongPressDetector(_this._element, {
49
+ onLongPress: function (event) {
50
+ _this._onContextMenu.fire(event);
51
+ },
52
+ }), (0, events_1.addDisposableListener)(_this._element, 'click', function (event) {
42
53
  _this._onClick.fire(event);
43
54
  }), (0, events_1.addDisposableListener)(_this._element, 'contextmenu', function (event) {
44
55
  _this._onContextMenu.fire(event);
45
- }), (0, events_1.addDisposableListener)(_this._element, 'dragstart', function (event) {
46
- _this._onDragStart.fire(event);
47
56
  }));
48
57
  return _this;
49
58
  }
@@ -1,3 +1,4 @@
1
+ import { IDragSource } from '../../../dnd/backend';
1
2
  import { IDisposable, IValueDisposable } from '../../../lifecycle';
2
3
  import { DockviewComponent } from '../../dockviewComponent';
3
4
  import { DockviewGroupPanel } from '../../dockviewGroupPanel';
@@ -5,6 +6,7 @@ import { DockviewHeaderDirection } from '../../options';
5
6
  import { Tab } from '../tab/tab';
6
7
  import { ITabGroup } from '../../tabGroup';
7
8
  import { ITabGroupChipRenderer } from '../../framework';
9
+ import { Droptarget, DroptargetEvent } from '../../../dnd/droptarget';
8
10
  export interface TabGroupManagerContext {
9
11
  readonly group: DockviewGroupPanel;
10
12
  readonly accessor: DockviewComponent;
@@ -15,7 +17,21 @@ export interface TabGroupManagerContext {
15
17
  }
16
18
  export interface TabGroupManagerCallbacks {
17
19
  onChipContextMenu(tabGroup: ITabGroup, event: MouseEvent): void;
18
- onChipDragStart(tabGroup: ITabGroup, chip: ITabGroupChipRenderer, event: DragEvent): void;
20
+ onChipDragStart(tabGroup: ITabGroup, chip: ITabGroupChipRenderer, event: DragEvent | PointerEvent): void;
21
+ /**
22
+ * HTML5 chip dragend only. Pointer dragend is handled centrally via
23
+ * `PointerDragController.onDragEnd` in `tabs.ts`.
24
+ */
25
+ onChipDragEnd?(tabGroup: ITabGroup, chip: ITabGroupChipRenderer, event: DragEvent | PointerEvent): void;
26
+ onChipDrop(tabGroup: ITabGroup, event: DroptargetEvent): void;
27
+ }
28
+ interface ChipRendererEntry {
29
+ chip: ITabGroupChipRenderer;
30
+ /** Created by the manager so it can be toggled live on strategy changes. */
31
+ html5DragSource: IDragSource;
32
+ pointerDragSource: IDragSource;
33
+ disposable: IDisposable;
34
+ dropTarget: Droptarget;
19
35
  }
20
36
  export declare class TabGroupManager {
21
37
  private readonly _ctx;
@@ -24,10 +40,7 @@ export declare class TabGroupManager {
24
40
  private _indicator;
25
41
  private _skipNextCollapseAnimation;
26
42
  private readonly _pendingTransitionCleanups;
27
- get chipRenderers(): ReadonlyMap<string, {
28
- chip: ITabGroupChipRenderer;
29
- disposable: IDisposable;
30
- }>;
43
+ get chipRenderers(): ReadonlyMap<string, ChipRendererEntry>;
31
44
  get groupUnderlines(): ReadonlyMap<string, HTMLElement>;
32
45
  get skipNextCollapseAnimation(): boolean;
33
46
  set skipNextCollapseAnimation(value: boolean);
@@ -44,14 +57,29 @@ export declare class TabGroupManager {
44
57
  */
45
58
  refreshAccents(): void;
46
59
  positionAllChips(): void;
60
+ updateDirection(): void;
47
61
  snapshotChipWidths(): Map<string, number>;
48
62
  positionUnderlines(): void;
49
63
  trackUnderlines(): void;
50
64
  setGroupDragImage(event: DragEvent, tabGroup: ITabGroup, chipEl: HTMLElement): void;
51
65
  cleanupTransition(panelId: string): void;
66
+ updateDragAndDropState(): void;
67
+ /**
68
+ * Synchronously dispose the chip drag sources for an in-flight chip
69
+ * drag. Called from `_commitGroupMove` so the transfer payload +
70
+ * iframe shield are released BEFORE the cross-group move detaches
71
+ * the chip (chip dispose is scheduled on a microtask via
72
+ * `_scheduleTabGroupUpdate`, which is too late for callers that read
73
+ * `getPanelData()` synchronously after the move). Idempotent — the
74
+ * subsequent `update()` will also dispose the sources.
75
+ */
76
+ disposeChipDrag(tabGroupId: string): void;
77
+ /** Cloned chip rect used as the pointer follow-finger ghost. */
78
+ private _buildChipGhostElement;
52
79
  disposeAll(): void;
53
80
  private _ensureIndicator;
54
81
  private _ensureChipForGroup;
55
82
  private _positionChipForGroup;
56
83
  private _updateTabGroupClasses;
57
84
  }
85
+ export {};