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
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.PointerDropTarget = void 0;
19
+ var events_1 = require("../../events");
20
+ var lifecycle_1 = require("../../lifecycle");
21
+ var dropOverlay_1 = require("../dropOverlay");
22
+ var droptarget_1 = require("../droptarget");
23
+ var pointerDragController_1 = require("./pointerDragController");
24
+ var DEFAULT_ACTIVATION_SIZE = {
25
+ value: 20,
26
+ type: 'percentage',
27
+ };
28
+ /** Pointer-driven counterpart to `Droptarget` with identical visual output. */
29
+ var PointerDropTarget = /** @class */ (function (_super) {
30
+ __extends(PointerDropTarget, _super);
31
+ function PointerDropTarget(element, options) {
32
+ var _this = _super.call(this) || this;
33
+ _this.element = element;
34
+ _this.options = options;
35
+ _this._onDrop = new events_1.Emitter();
36
+ _this.onDrop = _this._onDrop.event;
37
+ _this._onWillShowOverlay = new events_1.Emitter();
38
+ _this.onWillShowOverlay = _this._onWillShowOverlay.event;
39
+ _this._disabled = false;
40
+ _this._acceptedTargetZonesSet = new Set(options.acceptedTargetZones);
41
+ var handle = {
42
+ element: _this.element,
43
+ handleDragOver: function (e) { return _this._onDragOver(e); },
44
+ handleDragLeave: function () { return _this._onDragLeave(); },
45
+ handleDrop: function (e) { return _this._onDropEvent(e); },
46
+ };
47
+ _this.addDisposables(_this._onDrop, _this._onWillShowOverlay, pointerDragController_1.PointerDragController.getInstance().registerTarget(handle));
48
+ return _this;
49
+ }
50
+ Object.defineProperty(PointerDropTarget.prototype, "disabled", {
51
+ get: function () {
52
+ return this._disabled;
53
+ },
54
+ set: function (value) {
55
+ this._disabled = value;
56
+ if (value) {
57
+ this._removeOverlay();
58
+ }
59
+ },
60
+ enumerable: false,
61
+ configurable: true
62
+ });
63
+ Object.defineProperty(PointerDropTarget.prototype, "state", {
64
+ get: function () {
65
+ return this._state;
66
+ },
67
+ enumerable: false,
68
+ configurable: true
69
+ });
70
+ PointerDropTarget.prototype.setTargetZones = function (zones) {
71
+ this._acceptedTargetZonesSet = new Set(zones);
72
+ };
73
+ PointerDropTarget.prototype.setOverlayModel = function (model) {
74
+ this.options.overlayModel = model;
75
+ };
76
+ PointerDropTarget.prototype.dispose = function () {
77
+ this._removeOverlay();
78
+ _super.prototype.dispose.call(this);
79
+ };
80
+ PointerDropTarget.prototype._onDragOver = function (event) {
81
+ var _a, _b, _c, _d, _e;
82
+ if (this._disabled) {
83
+ this._removeOverlay();
84
+ return;
85
+ }
86
+ var overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
87
+ if (this._acceptedTargetZonesSet.size === 0) {
88
+ if (overrideTarget) {
89
+ return;
90
+ }
91
+ this._removeOverlay();
92
+ return;
93
+ }
94
+ var outlineEl = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;
95
+ var width = outlineEl.offsetWidth;
96
+ var height = outlineEl.offsetHeight;
97
+ if (width === 0 || height === 0) {
98
+ return;
99
+ }
100
+ var rect = outlineEl.getBoundingClientRect();
101
+ var x = event.clientX - rect.left;
102
+ var y = event.clientY - rect.top;
103
+ var quadrant = this._calculateQuadrant(x, y, width, height);
104
+ if (quadrant === null) {
105
+ this._removeOverlay();
106
+ return;
107
+ }
108
+ if (!this.options.canDisplayOverlay(event.pointerEvent, quadrant)) {
109
+ if (overrideTarget) {
110
+ return;
111
+ }
112
+ this._removeOverlay();
113
+ return;
114
+ }
115
+ var willShow = new droptarget_1.WillShowOverlayEvent({
116
+ nativeEvent: event.pointerEvent,
117
+ position: quadrant,
118
+ });
119
+ this._onWillShowOverlay.fire(willShow);
120
+ if (willShow.defaultPrevented) {
121
+ this._removeOverlay();
122
+ return;
123
+ }
124
+ if (overrideTarget) {
125
+ (0, dropOverlay_1.renderAnchoredOverlay)({
126
+ outlineElement: outlineEl,
127
+ targetModel: overrideTarget,
128
+ quadrant: quadrant,
129
+ width: width,
130
+ height: height,
131
+ overlayModel: this.options.overlayModel,
132
+ className: this.options.className,
133
+ });
134
+ this._state = quadrant;
135
+ return;
136
+ }
137
+ if (!this._targetElement) {
138
+ var els = (0, dropOverlay_1.createOverlayElements)();
139
+ this._targetElement = els.dropzone;
140
+ this._overlayElement = els.selection;
141
+ this._state = 'center';
142
+ this.element.classList.add('dv-drop-target');
143
+ this.element.append(this._targetElement);
144
+ }
145
+ if (this._overlayElement) {
146
+ (0, dropOverlay_1.renderInPlaceOverlay)(this._overlayElement, quadrant, width, height, this.options.overlayModel);
147
+ }
148
+ this._state = quadrant;
149
+ };
150
+ PointerDropTarget.prototype._onDragLeave = function () {
151
+ var _a, _b;
152
+ var overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
153
+ // Anchor target owns its own lifecycle; just clear our latched
154
+ // state so a subsequent pointerup doesn't fire a stale drop.
155
+ if (overrideTarget) {
156
+ this._state = undefined;
157
+ overrideTarget.clear();
158
+ return;
159
+ }
160
+ this._removeOverlay();
161
+ };
162
+ PointerDropTarget.prototype._onDropEvent = function (event) {
163
+ var _a, _b;
164
+ var state = this._state;
165
+ var overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
166
+ this._removeOverlay();
167
+ overrideTarget === null || overrideTarget === void 0 ? void 0 : overrideTarget.clear();
168
+ if (state) {
169
+ this._onDrop.fire({
170
+ position: state,
171
+ nativeEvent: event.pointerEvent,
172
+ });
173
+ }
174
+ };
175
+ PointerDropTarget.prototype._calculateQuadrant = function (x, y, width, height) {
176
+ var _a, _b;
177
+ var activation = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE;
178
+ if (activation.type === 'percentage') {
179
+ return (0, droptarget_1.calculateQuadrantAsPercentage)(this._acceptedTargetZonesSet, x, y, width, height, activation.value);
180
+ }
181
+ return (0, droptarget_1.calculateQuadrantAsPixels)(this._acceptedTargetZonesSet, x, y, width, height, activation.value);
182
+ };
183
+ PointerDropTarget.prototype._removeOverlay = function () {
184
+ var _a;
185
+ if (this._targetElement) {
186
+ this._state = undefined;
187
+ (_a = this._targetElement.parentElement) === null || _a === void 0 ? void 0 : _a.classList.remove('dv-drop-target');
188
+ this._targetElement.remove();
189
+ this._targetElement = undefined;
190
+ this._overlayElement = undefined;
191
+ }
192
+ else {
193
+ this._state = undefined;
194
+ }
195
+ };
196
+ return PointerDropTarget;
197
+ }(lifecycle_1.CompositeDisposable));
198
+ exports.PointerDropTarget = PointerDropTarget;
@@ -0,0 +1,30 @@
1
+ import { IDisposable } from '../../lifecycle';
2
+ export interface PointerGhostOptions {
3
+ element: HTMLElement;
4
+ initialX: number;
5
+ initialY: number;
6
+ /** Pointer position within the ghost; default top-left. */
7
+ offsetX?: number;
8
+ offsetY?: number;
9
+ /** Default 0.8. */
10
+ opacity?: number;
11
+ /**
12
+ * Source element whose `ownerDocument.body` hosts the ghost — pass for
13
+ * popout-window drags so the ghost renders in the popout's document.
14
+ */
15
+ owner?: Element;
16
+ }
17
+ /**
18
+ * Floating clone that follows the pointer; appended to the owning
19
+ * document's body with `pointer-events: none` so it doesn't intercept
20
+ * hit-testing.
21
+ */
22
+ export declare class PointerGhost implements IDisposable {
23
+ private readonly element;
24
+ private readonly offsetX;
25
+ private readonly offsetY;
26
+ private _disposed;
27
+ constructor(opts: PointerGhostOptions);
28
+ update(clientX: number, clientY: number): void;
29
+ dispose(): void;
30
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointerGhost = void 0;
4
+ /**
5
+ * Floating clone that follows the pointer; appended to the owning
6
+ * document's body with `pointer-events: none` so it doesn't intercept
7
+ * hit-testing.
8
+ */
9
+ var PointerGhost = /** @class */ (function () {
10
+ function PointerGhost(opts) {
11
+ var _a, _b, _c, _d, _e;
12
+ this._disposed = false;
13
+ this.element = opts.element;
14
+ this.offsetX = (_a = opts.offsetX) !== null && _a !== void 0 ? _a : 0;
15
+ this.offsetY = (_b = opts.offsetY) !== null && _b !== void 0 ? _b : 0;
16
+ // Animate via transform (see update); position:fixed for scroll-independence.
17
+ this.element.style.position = 'fixed';
18
+ this.element.style.left = '0px';
19
+ this.element.style.top = '0px';
20
+ this.element.style.pointerEvents = 'none';
21
+ this.element.style.zIndex = '99999';
22
+ this.element.style.opacity = String((_c = opts.opacity) !== null && _c !== void 0 ? _c : 0.8);
23
+ this.element.style.willChange = 'transform';
24
+ this.element.style.transform = "translate3d(".concat(opts.initialX - this.offsetX, "px, ").concat(opts.initialY - this.offsetY, "px, 0)");
25
+ var ownerDocument = (_e = (_d = opts.owner) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : document;
26
+ ownerDocument.body.appendChild(this.element);
27
+ }
28
+ PointerGhost.prototype.update = function (clientX, clientY) {
29
+ if (this._disposed) {
30
+ return;
31
+ }
32
+ // translate3d composites on the GPU — no layout per pointermove.
33
+ this.element.style.transform = "translate3d(".concat(clientX - this.offsetX, "px, ").concat(clientY - this.offsetY, "px, 0)");
34
+ };
35
+ PointerGhost.prototype.dispose = function () {
36
+ if (this._disposed) {
37
+ return;
38
+ }
39
+ this._disposed = true;
40
+ this.element.remove();
41
+ };
42
+ return PointerGhost;
43
+ }());
44
+ exports.PointerGhost = PointerGhost;
@@ -0,0 +1,16 @@
1
+ import { Position } from '../droptarget';
2
+ export interface PointerDragEvent {
3
+ readonly clientX: number;
4
+ readonly clientY: number;
5
+ readonly pointerEvent: PointerEvent;
6
+ }
7
+ export interface PointerDroptargetEvent {
8
+ readonly position: Position;
9
+ readonly nativeEvent: PointerEvent;
10
+ }
11
+ export interface IPointerDropTargetHandle {
12
+ readonly element: HTMLElement;
13
+ handleDragOver(event: PointerDragEvent): void;
14
+ handleDragLeave(): void;
15
+ handleDrop(event: PointerDragEvent): void;
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,10 +2,11 @@ import { CompositeDisposable, IDisposable } from '../../../lifecycle';
2
2
  import { Event } from '../../../events';
3
3
  import { IDockviewPanel } from '../../dockviewPanel';
4
4
  import { DockviewComponent } from '../../dockviewComponent';
5
- import { Droptarget } from '../../../dnd/droptarget';
5
+ import { Droptarget, IDropTarget } from '../../../dnd/droptarget';
6
6
  import { DockviewGroupPanelModel } from '../../dockviewGroupPanelModel';
7
7
  export interface IContentContainer extends IDisposable {
8
8
  readonly dropTarget: Droptarget;
9
+ readonly pointerDropTarget: IDropTarget;
9
10
  onDidFocus: Event<void>;
10
11
  onDidBlur: Event<void>;
11
12
  element: HTMLElement;
@@ -32,6 +33,7 @@ export declare class ContentContainer extends CompositeDisposable implements ICo
32
33
  readonly onDidBlur: Event<void>;
33
34
  get element(): HTMLElement;
34
35
  readonly dropTarget: Droptarget;
36
+ readonly pointerDropTarget: IDropTarget;
35
37
  constructor(accessor: DockviewComponent, group: DockviewGroupPanelModel);
36
38
  show(): void;
37
39
  hide(): void;
@@ -20,6 +20,7 @@ var lifecycle_1 = require("../../../lifecycle");
20
20
  var events_1 = require("../../../events");
21
21
  var dom_1 = require("../../../dom");
22
22
  var droptarget_1 = require("../../../dnd/droptarget");
23
+ var backend_1 = require("../../../dnd/backend");
23
24
  var dataTransfer_1 = require("../../../dnd/dataTransfer");
24
25
  var ContentContainer = /** @class */ (function (_super) {
25
26
  __extends(ContentContainer, _super);
@@ -37,6 +38,25 @@ var ContentContainer = /** @class */ (function (_super) {
37
38
  _this._element.tabIndex = -1;
38
39
  _this.addDisposables(_this._onDidFocus, _this._onDidBlur);
39
40
  var target = group.dropTargetContainer;
41
+ var canDisplayOverlay = function (event, position) {
42
+ if (_this.group.locked === 'no-drop-target' ||
43
+ (_this.group.locked && position === 'center')) {
44
+ return false;
45
+ }
46
+ var data = (0, dataTransfer_1.getPanelData)();
47
+ if (!data &&
48
+ event.shiftKey &&
49
+ _this.group.location.type !== 'floating') {
50
+ return false;
51
+ }
52
+ if (data && data.viewId === _this.accessor.id) {
53
+ return true;
54
+ }
55
+ return _this.group.canDisplayOverlay(event, position, 'content');
56
+ };
57
+ // `dropTarget` stays the concrete `Droptarget` (not via the backend
58
+ // factory) because overlayRenderContainer forwards HTML5 drag events
59
+ // through `dropTarget.dnd` — that field is not part of `IDropTarget`.
40
60
  _this.dropTarget = new droptarget_1.Droptarget(_this.element, {
41
61
  getOverlayOutline: function () {
42
62
  var _a;
@@ -46,25 +66,22 @@ var ContentContainer = /** @class */ (function (_super) {
46
66
  },
47
67
  className: 'dv-drop-target-content',
48
68
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
49
- canDisplayOverlay: function (event, position) {
50
- if (_this.group.locked === 'no-drop-target' ||
51
- (_this.group.locked && position === 'center')) {
52
- return false;
53
- }
54
- var data = (0, dataTransfer_1.getPanelData)();
55
- if (!data &&
56
- event.shiftKey &&
57
- _this.group.location.type !== 'floating') {
58
- return false;
59
- }
60
- if (data && data.viewId === _this.accessor.id) {
61
- return true;
62
- }
63
- return _this.group.canDisplayOverlay(event, position, 'content');
69
+ canDisplayOverlay: canDisplayOverlay,
70
+ getOverrideTarget: target ? function () { return target.model; } : undefined,
71
+ });
72
+ _this.pointerDropTarget = backend_1.pointerBackend.createDropTarget(_this.element, {
73
+ acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
74
+ canDisplayOverlay: canDisplayOverlay,
75
+ getOverlayOutline: function () {
76
+ var _a;
77
+ return ((_a = accessor.options.theme) === null || _a === void 0 ? void 0 : _a.dndPanelOverlay) === 'group'
78
+ ? _this.element.parentElement
79
+ : null;
64
80
  },
81
+ className: 'dv-drop-target-content',
65
82
  getOverrideTarget: target ? function () { return target.model; } : undefined,
66
83
  });
67
- _this.addDisposables(_this.dropTarget);
84
+ _this.addDisposables(_this.dropTarget, _this.pointerDropTarget);
68
85
  return _this;
69
86
  }
70
87
  Object.defineProperty(ContentContainer.prototype, "element", {
@@ -19,6 +19,14 @@ exports.PopupService = void 0;
19
19
  var dom_1 = require("../../dom");
20
20
  var events_1 = require("../../events");
21
21
  var lifecycle_1 = require("../../lifecycle");
22
+ function isCoarsePrimaryInput(win) {
23
+ if (!win.matchMedia) {
24
+ return false;
25
+ }
26
+ var coarse = win.matchMedia('(pointer: coarse)').matches;
27
+ var fine = win.matchMedia('(pointer: fine)').matches;
28
+ return coarse && !fine;
29
+ }
22
30
  var PopupService = /** @class */ (function (_super) {
23
31
  __extends(PopupService, _super);
24
32
  function PopupService(root, win) {
@@ -61,8 +69,22 @@ var PopupService = /** @class */ (function (_super) {
61
69
  wrapper.style.left = "".concat(position.x - offsetX, "px");
62
70
  this._element.appendChild(wrapper);
63
71
  this._active = wrapper;
72
+ // Outside-pointerdown dismissal is suppressed for a short grace
73
+ // window after opening. Touch long-press callers (chip / tab context
74
+ // menus) open the popover while the user's finger is still pressing
75
+ // the source element — Android Chrome can dispatch a follow-up
76
+ // synthetic pointerdown tied to the gesture, and the release-then-
77
+ // retap motion can land just outside the wrapper. Either would
78
+ // dismiss the popover before the user can see or interact with it.
79
+ // The grace window is short enough that intentional outside taps
80
+ // still feel responsive.
81
+ var openedAt = Date.now();
82
+ var POINTERDOWN_GRACE_MS = 200;
64
83
  this._activeDisposable.value = new lifecycle_1.CompositeDisposable((0, events_1.addDisposableListener)(this._window, 'pointerdown', function (event) {
65
84
  var _a;
85
+ if (Date.now() - openedAt < POINTERDOWN_GRACE_MS) {
86
+ return;
87
+ }
66
88
  var target = event.target;
67
89
  if (!(target instanceof HTMLElement)) {
68
90
  return;
@@ -80,6 +102,18 @@ var PopupService = /** @class */ (function (_super) {
80
102
  _this.close();
81
103
  }
82
104
  }), (0, events_1.addDisposableListener)(this._window, 'resize', function () {
105
+ // On touch-primary devices, common interactions resize the
106
+ // window: on-screen keyboard pop, orientation change, browser
107
+ // address-bar collapse. None of these mean "the user wants
108
+ // the popover dismissed". Specifically, focusing the chip
109
+ // context menu's rename input pops the keyboard, which would
110
+ // otherwise close the menu the moment the user goes to edit
111
+ // it. Desktop / hybrid input keeps the existing behaviour —
112
+ // there a resize genuinely means the user has resized the
113
+ // window and the popover position is now stale.
114
+ if (isCoarsePrimaryInput(_this._window)) {
115
+ return;
116
+ }
83
117
  _this.close();
84
118
  }));
85
119
  this._window.requestAnimationFrame(function () {
@@ -12,8 +12,11 @@ export declare class Tab extends CompositeDisposable {
12
12
  private readonly group;
13
13
  private readonly _element;
14
14
  private readonly dropTarget;
15
+ private readonly pointerDropTarget;
15
16
  private content;
16
- private readonly dragHandler;
17
+ private readonly html5DragSource;
18
+ private readonly pointerDragSource;
19
+ private readonly panelTransfer;
17
20
  private _direction;
18
21
  private readonly _onPointDown;
19
22
  readonly onPointerDown: Event<MouseEvent>;
@@ -22,9 +25,9 @@ export declare class Tab extends CompositeDisposable {
22
25
  private readonly _onDropped;
23
26
  readonly onDrop: Event<DroptargetEvent>;
24
27
  private readonly _onDragStart;
25
- readonly onDragStart: Event<DragEvent>;
28
+ readonly onDragStart: Event<PointerEvent | DragEvent>;
26
29
  private readonly _onDragEnd;
27
- readonly onDragEnd: Event<DragEvent>;
30
+ readonly onDragEnd: Event<PointerEvent | DragEvent>;
28
31
  readonly onWillShowOverlay: Event<WillShowOverlayEvent>;
29
32
  get element(): HTMLElement;
30
33
  constructor(panel: IDockviewPanel, accessor: DockviewComponent, group: DockviewGroupPanel);
@@ -33,4 +36,9 @@ export declare class Tab extends CompositeDisposable {
33
36
  private _buildOverlayModel;
34
37
  setDirection(direction: DockviewHeaderDirection): void;
35
38
  updateDragAndDropState(): void;
39
+ /**
40
+ * Vertical tabs are flipped to horizontal so the ghost stays readable
41
+ * during the drag rather than appearing sideways-rotated.
42
+ */
43
+ private _buildGhostElement;
36
44
  }