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
@@ -7,16 +7,18 @@ import { DockviewComponent } from '../../dockviewComponent';
7
7
  import { DockviewWillShowOverlayLocationEvent } from '../../events';
8
8
  import { DockviewHeaderDirection } from '../../options';
9
9
  export interface TabDropIndexEvent {
10
- readonly event: DragEvent;
10
+ readonly event: DragEvent | PointerEvent;
11
11
  readonly index: number;
12
12
  readonly targetTabGroupId?: string | null;
13
13
  }
14
14
  export interface TabDragEvent {
15
- readonly nativeEvent: DragEvent;
15
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
16
+ readonly nativeEvent: DragEvent | PointerEvent;
16
17
  readonly panel: IDockviewPanel;
17
18
  }
18
19
  export interface GroupDragEvent {
19
- readonly nativeEvent: DragEvent;
20
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
21
+ readonly nativeEvent: DragEvent | PointerEvent;
20
22
  readonly group: DockviewGroupPanel;
21
23
  }
22
24
  export interface ITabsContainer extends IDisposable {
@@ -8,13 +8,17 @@ export declare class VoidContainer extends CompositeDisposable {
8
8
  private readonly group;
9
9
  private readonly _element;
10
10
  private readonly dropTarget;
11
- private readonly handler;
11
+ private readonly pointerDropTarget;
12
+ private readonly html5DragSource;
13
+ private readonly pointerDragSource;
14
+ private readonly panelTransfer;
12
15
  private readonly _onDrop;
13
16
  readonly onDrop: Event<DroptargetEvent>;
14
17
  private readonly _onDragStart;
15
- readonly onDragStart: Event<DragEvent>;
18
+ readonly onDragStart: Event<PointerEvent | DragEvent>;
16
19
  readonly onWillShowOverlay: Event<WillShowOverlayEvent>;
17
20
  get element(): HTMLElement;
18
21
  constructor(accessor: DockviewComponent, group: DockviewGroupPanel);
19
22
  updateDragAndDropState(): void;
23
+ private getFloatingOverlay;
20
24
  }
@@ -14,55 +14,206 @@ 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.VoidContainer = void 0;
19
30
  var dataTransfer_1 = require("../../../dnd/dataTransfer");
20
- var droptarget_1 = require("../../../dnd/droptarget");
21
- var groupDragHandler_1 = require("../../../dnd/groupDragHandler");
31
+ var backend_1 = require("../../../dnd/backend");
22
32
  var events_1 = require("../../../events");
23
33
  var lifecycle_1 = require("../../../lifecycle");
24
34
  var dom_1 = require("../../../dom");
35
+ var dndCapabilities_1 = require("../../dndCapabilities");
36
+ // Floating-group redock via touch: require a deliberate long press so the
37
+ // "move the float around" gesture doesn't double-trigger the redock ghost.
38
+ // Infinity pressTolerance disables the pre-arm flick override; any motion
39
+ // during the wait is treated as drag-the-float, not redock intent.
40
+ var FLOATING_REDOCK_INITIATION_DELAY_MS = 500;
25
41
  var VoidContainer = /** @class */ (function (_super) {
26
42
  __extends(VoidContainer, _super);
27
43
  function VoidContainer(accessor, group) {
44
+ var _a, _b;
28
45
  var _this = _super.call(this) || this;
29
46
  _this.accessor = accessor;
30
47
  _this.group = group;
48
+ _this.panelTransfer = dataTransfer_1.LocalSelectionTransfer.getInstance();
31
49
  _this._onDrop = new events_1.Emitter();
32
50
  _this.onDrop = _this._onDrop.event;
33
51
  _this._onDragStart = new events_1.Emitter();
34
52
  _this.onDragStart = _this._onDragStart.event;
53
+ var caps = (0, dndCapabilities_1.resolveDndCapabilities)(_this.accessor.options);
35
54
  _this._element = document.createElement('div');
36
55
  _this._element.className = 'dv-void-container';
37
- _this._element.draggable = !_this.accessor.options.disableDnd;
38
- (0, dom_1.toggleClass)(_this._element, 'dv-draggable', !_this.accessor.options.disableDnd);
56
+ _this._element.draggable = caps.html5;
57
+ (0, dom_1.toggleClass)(_this._element, 'dv-draggable', caps.html5 || caps.pointer);
39
58
  _this.addDisposables(_this._onDrop, _this._onDragStart, (0, events_1.addDisposableListener)(_this._element, 'pointerdown', function () {
40
59
  _this.accessor.doSetGroupActive(_this.group);
41
- }));
42
- _this.handler = new groupDragHandler_1.GroupDragHandler(_this._element, accessor, group, !!_this.accessor.options.disableDnd);
43
- _this.dropTarget = new droptarget_1.Droptarget(_this._element, {
60
+ }),
61
+ // Shift+pointerdown marks the event so the group's overlay
62
+ // drag (move-by-floating) sees it was consumed and doesn't
63
+ // fire alongside the HTML5 drag. quasiPreventDefault sets the
64
+ // marker without calling preventDefault — that would also
65
+ // block dragstart, which we need to fire.
66
+ (0, events_1.addDisposableListener)(_this._element, 'pointerdown', function (e) {
67
+ if (e.shiftKey) {
68
+ (0, dom_1.quasiPreventDefault)(e);
69
+ }
70
+ }, true));
71
+ var canDisplayOverlay = function (event, position) {
72
+ if (_this.group.api.locked) {
73
+ // Dropping on the void/header space adds the panel
74
+ // to this group, which `locked` is meant to prevent
75
+ // (both `true` and `'no-drop-target'`).
76
+ return false;
77
+ }
78
+ var data = (0, dataTransfer_1.getPanelData)();
79
+ if (data && _this.accessor.id === data.viewId) {
80
+ return true;
81
+ }
82
+ return group.model.canDisplayOverlay(event, position, 'header_space');
83
+ };
84
+ _this.dropTarget = backend_1.html5Backend.createDropTarget(_this._element, {
44
85
  acceptedTargetZones: ['center'],
45
- canDisplayOverlay: function (event, position) {
46
- if (_this.group.api.locked) {
47
- // Dropping on the void/header space adds the panel
48
- // to this group, which `locked` is meant to prevent
49
- // (both `true` and `'no-drop-target'`).
50
- return false;
86
+ canDisplayOverlay: canDisplayOverlay,
87
+ getOverrideTarget: function () { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
88
+ });
89
+ _this.pointerDropTarget = backend_1.pointerBackend.createDropTarget(_this._element, {
90
+ acceptedTargetZones: ['center'],
91
+ canDisplayOverlay: canDisplayOverlay,
92
+ getOverrideTarget: function () { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
93
+ });
94
+ var buildMultiPanelsGhost = function () {
95
+ var ghostEl = document.createElement('div');
96
+ var style = window.getComputedStyle(_this._element);
97
+ var bgColor = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-background-color');
98
+ var color = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-color');
99
+ ghostEl.style.backgroundColor = bgColor;
100
+ ghostEl.style.color = color;
101
+ ghostEl.style.padding = '2px 8px';
102
+ ghostEl.style.height = '24px';
103
+ ghostEl.style.fontSize = '11px';
104
+ ghostEl.style.lineHeight = '20px';
105
+ ghostEl.style.borderRadius = '12px';
106
+ ghostEl.style.whiteSpace = 'nowrap';
107
+ ghostEl.style.boxSizing = 'border-box';
108
+ // HTML5 setDragImage snapshots the element as appended to the
109
+ // document; a default block-level div would stretch to the
110
+ // body's width and render as a viewport-wide bar.
111
+ ghostEl.style.display = 'inline-block';
112
+ ghostEl.textContent = "Multiple Panels (".concat(_this.group.size, ")");
113
+ return ghostEl;
114
+ };
115
+ var buildGhostSpec = function () {
116
+ var createGhost = _this.accessor.options.createGroupDragGhostComponent;
117
+ if (createGhost) {
118
+ var renderer_1 = createGhost(_this.group);
119
+ renderer_1.init({
120
+ group: _this.group,
121
+ api: _this.accessor.api,
122
+ });
123
+ return {
124
+ element: renderer_1.element,
125
+ offsetX: 30,
126
+ offsetY: -10,
127
+ dispose: renderer_1.dispose
128
+ ? function () { var _a; return (_a = renderer_1.dispose) === null || _a === void 0 ? void 0 : _a.call(renderer_1); }
129
+ : undefined,
130
+ };
131
+ }
132
+ return {
133
+ element: buildMultiPanelsGhost(),
134
+ offsetX: 30,
135
+ offsetY: -10,
136
+ };
137
+ };
138
+ var sharedDragOptions = {
139
+ getData: function () {
140
+ _this.panelTransfer.setData([new dataTransfer_1.PanelTransfer(_this.accessor.id, _this.group.id, null)], dataTransfer_1.PanelTransfer.prototype);
141
+ return {
142
+ dispose: function () {
143
+ _this.panelTransfer.clearData(dataTransfer_1.PanelTransfer.prototype);
144
+ },
145
+ };
146
+ },
147
+ createGhost: buildGhostSpec,
148
+ onDragStart: function (event) {
149
+ _this._onDragStart.fire(event);
150
+ },
151
+ };
152
+ _this.html5DragSource = backend_1.html5Backend.createDragSource(_this._element, __assign(__assign({}, sharedDragOptions), { disabled: !caps.html5, isCancelled: function (event) {
153
+ // HTML5: floating groups need shift+drag as the explicit
154
+ // detach gesture (otherwise click-and-drag conflicts with
155
+ // moving the floating group itself).
156
+ if (_this.group.api.location.type === 'floating' &&
157
+ !event.shiftKey) {
158
+ return true;
51
159
  }
52
- var data = (0, dataTransfer_1.getPanelData)();
53
- if (data && _this.accessor.id === data.viewId) {
160
+ if (_this.group.api.location.type === 'edge' &&
161
+ _this.group.size === 0) {
54
162
  return true;
55
163
  }
56
- return group.model.canDisplayOverlay(event, position, 'header_space');
57
- },
58
- getOverrideTarget: function () { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
59
- });
60
- _this.onWillShowOverlay = _this.dropTarget.onWillShowOverlay;
61
- _this.addDisposables(_this.handler, _this.handler.onDragStart(function (event) {
62
- _this._onDragStart.fire(event);
63
- }), _this.dropTarget.onDrop(function (event) {
164
+ return false;
165
+ } }));
166
+ var isFloating = function () { var _a, _b, _c; return ((_c = (_b = (_a = _this.group) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.location) === null || _c === void 0 ? void 0 : _c.type) === 'floating'; };
167
+ _this.pointerDragSource = backend_1.pointerBackend.createDragSource(_this._element, __assign(__assign({}, sharedDragOptions), { disabled: !caps.pointer, touchOnly: !caps.pointerHandlesMouse,
168
+ // Floating groups share this element with the overlay's
169
+ // move-the-float drag. Without a longer hold + tolerance
170
+ // override, both gestures commit simultaneously and the
171
+ // user sees the float follow their finger *and* a ghost.
172
+ touchInitiationDelay: function () {
173
+ return isFloating() ? FLOATING_REDOCK_INITIATION_DELAY_MS : 250;
174
+ }, pressTolerance: function () { return (isFloating() ? Infinity : 8); }, isCancelled: function () {
175
+ if (!(0, dndCapabilities_1.resolveDndCapabilities)(_this.accessor.options).pointer) {
176
+ return true;
177
+ }
178
+ // Pointer: long-press IS the deliberate gesture, so
179
+ // floating groups don't need the shift gate.
180
+ if (_this.group.api.location.type === 'edge' &&
181
+ _this.group.size === 0) {
182
+ return true;
183
+ }
184
+ return false;
185
+ }, onDragStart: function (event) {
186
+ var _a;
187
+ // Redock just committed — abort any in-flight overlay
188
+ // move so the float stops following the finger while
189
+ // the ghost takes over.
190
+ (_a = _this.getFloatingOverlay()) === null || _a === void 0 ? void 0 : _a.cancelPendingDrag();
191
+ _this._onDragStart.fire(event);
192
+ } }));
193
+ // Mirror direction: once the overlay's move-the-float gesture has
194
+ // actually moved something, cancel the pending redock arm so the
195
+ // ghost doesn't appear mid-drag if the user holds past 500ms.
196
+ var overlayMoveSub = new lifecycle_1.MutableDisposable();
197
+ var refreshOverlayMoveSub = function () {
198
+ var overlay = _this.getFloatingOverlay();
199
+ overlayMoveSub.value = overlay
200
+ ? overlay.onDidStartMoving(function () {
201
+ _this.pointerDragSource.cancelPending();
202
+ })
203
+ : lifecycle_1.Disposable.NONE;
204
+ };
205
+ refreshOverlayMoveSub();
206
+ _this.addDisposables(overlayMoveSub);
207
+ var locationChange = (_b = (_a = _this.group) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.onDidLocationChange;
208
+ if (locationChange) {
209
+ _this.addDisposables(locationChange(refreshOverlayMoveSub));
210
+ }
211
+ _this.onWillShowOverlay = events_1.Event.any(_this.dropTarget.onWillShowOverlay, _this.pointerDropTarget.onWillShowOverlay);
212
+ _this.addDisposables(_this.html5DragSource, _this.dropTarget.onDrop(function (event) {
64
213
  _this._onDrop.fire(event);
65
- }), _this.dropTarget);
214
+ }), _this.pointerDropTarget.onDrop(function (event) {
215
+ _this._onDrop.fire(event);
216
+ }), _this.dropTarget, _this.pointerDropTarget, _this.pointerDragSource);
66
217
  return _this;
67
218
  }
68
219
  Object.defineProperty(VoidContainer.prototype, "element", {
@@ -73,9 +224,20 @@ var VoidContainer = /** @class */ (function (_super) {
73
224
  configurable: true
74
225
  });
75
226
  VoidContainer.prototype.updateDragAndDropState = function () {
76
- this._element.draggable = !this.accessor.options.disableDnd;
77
- (0, dom_1.toggleClass)(this._element, 'dv-draggable', !this.accessor.options.disableDnd);
78
- this.handler.setDisabled(!!this.accessor.options.disableDnd);
227
+ var caps = (0, dndCapabilities_1.resolveDndCapabilities)(this.accessor.options);
228
+ this._element.draggable = caps.html5;
229
+ (0, dom_1.toggleClass)(this._element, 'dv-draggable', caps.html5 || caps.pointer);
230
+ this.html5DragSource.setDisabled(!caps.html5);
231
+ this.pointerDragSource.setDisabled(!caps.pointer);
232
+ this.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
233
+ };
234
+ VoidContainer.prototype.getFloatingOverlay = function () {
235
+ var _this = this;
236
+ var _a, _b;
237
+ if (!this.group) {
238
+ return undefined;
239
+ }
240
+ return (_b = (_a = this.accessor.floatingGroups) === null || _a === void 0 ? void 0 : _a.find(function (fg) { return fg.group === _this.group; })) === null || _b === void 0 ? void 0 : _b.overlay;
79
241
  };
80
242
  return VoidContainer;
81
243
  }(lifecycle_1.CompositeDisposable));
@@ -79,6 +79,14 @@ function buildSeparator() {
79
79
  el.setAttribute('role', 'separator');
80
80
  return el;
81
81
  }
82
+ function isCoarsePrimaryInput() {
83
+ if (typeof window === 'undefined' || !window.matchMedia) {
84
+ return false;
85
+ }
86
+ var coarse = window.matchMedia('(pointer: coarse)').matches;
87
+ var fine = window.matchMedia('(pointer: fine)').matches;
88
+ return coarse && !fine;
89
+ }
82
90
  function buildRenameInput(tabGroup) {
83
91
  var wrapper = document.createElement('div');
84
92
  wrapper.className = 'dv-context-menu-rename';
@@ -99,10 +107,17 @@ function buildRenameInput(tabGroup) {
99
107
  e.stopPropagation();
100
108
  });
101
109
  wrapper.appendChild(input);
102
- requestAnimationFrame(function () {
103
- input.focus();
104
- input.select();
105
- });
110
+ // Skip auto-focus on touch-primary devices: focusing the input pops the
111
+ // on-screen keyboard, which fires `window resize`, which `PopupService`
112
+ // listens to and uses to dismiss the popover — so the menu opens, the
113
+ // keyboard appears, and the menu immediately closes before the user can
114
+ // type. The user can still tap the input to focus it intentionally.
115
+ if (!isCoarsePrimaryInput()) {
116
+ requestAnimationFrame(function () {
117
+ input.focus();
118
+ input.select();
119
+ });
120
+ }
106
121
  return wrapper;
107
122
  }
108
123
  function buildColorPicker(tabGroup, palette) {
@@ -0,0 +1,19 @@
1
+ import { DockviewOptions } from './options';
2
+ /**
3
+ * Internal mapping of the user-facing `dndStrategy` option into the
4
+ * per-backend capability flags consumed by drag-source / drop-target
5
+ * construction sites. Not part of the public API — consumers only see
6
+ * the `dndStrategy` option itself.
7
+ */
8
+ export interface DndCapabilities {
9
+ /** HTML5 drag/drop wiring active (draggable attr, dragstart). */
10
+ readonly html5: boolean;
11
+ /** Pointer-event drag source active. */
12
+ readonly pointer: boolean;
13
+ /**
14
+ * When true, the pointer source handles mouse pointers too
15
+ * (`touchOnly: false`). Implies `pointer` is true.
16
+ */
17
+ readonly pointerHandlesMouse: boolean;
18
+ }
19
+ export declare function resolveDndCapabilities(options: Pick<DockviewOptions, 'dndStrategy' | 'disableDnd'>): DndCapabilities;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDndCapabilities = resolveDndCapabilities;
4
+ function resolveDndCapabilities(options) {
5
+ if (options.disableDnd) {
6
+ return { html5: false, pointer: false, pointerHandlesMouse: false };
7
+ }
8
+ switch (options.dndStrategy) {
9
+ case 'pointer':
10
+ return { html5: false, pointer: true, pointerHandlesMouse: true };
11
+ case 'html5':
12
+ return { html5: true, pointer: false, pointerHandlesMouse: false };
13
+ case 'auto':
14
+ case undefined:
15
+ default:
16
+ // On touch-primary devices (phones / basic tablets) HTML5 DnD's
17
+ // native long-press intercepts the gesture before our pointer
18
+ // backend can react — Android Chrome launches a system drag with
19
+ // its half-transparent thumbnail, and the long-press context menu
20
+ // never opens. Disable HTML5 there so the pointer backend owns
21
+ // every gesture. Hybrid devices (touchscreen laptops, Surface,
22
+ // iPad with mouse) keep both backends — mouse uses HTML5, touch
23
+ // falls back to whichever backend the underlying element wired.
24
+ return isCoarsePrimaryInput()
25
+ ? { html5: false, pointer: true, pointerHandlesMouse: true }
26
+ : { html5: true, pointer: true, pointerHandlesMouse: false };
27
+ }
28
+ }
29
+ function isCoarsePrimaryInput() {
30
+ if (typeof window === 'undefined' || !window.matchMedia) {
31
+ return false;
32
+ }
33
+ // Coarse pointer without any fine pointer = phone-class device. A laptop
34
+ // touchscreen reports both, and we want HTML5 to remain available there
35
+ // because a real mouse is also plugged in.
36
+ var coarse = window.matchMedia('(pointer: coarse)').matches;
37
+ var fine = window.matchMedia('(pointer: fine)').matches;
38
+ return coarse && !fine;
39
+ }
@@ -261,6 +261,7 @@ export declare class DockviewComponent extends BaseGrid<DockviewGroupPanel> impl
261
261
  private readonly _floatingGroups;
262
262
  private readonly _popoutGroups;
263
263
  private readonly _rootDropTarget;
264
+ private readonly _rootPointerDropTarget;
264
265
  private _popoutRestorationPromise;
265
266
  private readonly _popoutRestorationCleanups;
266
267
  private readonly _onDidRemoveGroup;
@@ -65,6 +65,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
65
65
  exports.DockviewComponent = void 0;
66
66
  var gridview_1 = require("../gridview/gridview");
67
67
  var droptarget_1 = require("../dnd/droptarget");
68
+ var backend_1 = require("../dnd/backend");
68
69
  var array_1 = require("../array");
69
70
  var dockviewPanel_1 = require("./dockviewPanel");
70
71
  var lifecycle_1 = require("../lifecycle");
@@ -121,7 +122,7 @@ function moveGroupWithoutDestroying(options) {
121
122
  var DockviewComponent = /** @class */ (function (_super) {
122
123
  __extends(DockviewComponent, _super);
123
124
  function DockviewComponent(container, options) {
124
- var _a, _b, _c, _d, _e, _f;
125
+ var _a, _b, _c, _d, _e, _f, _g;
125
126
  var _this = _super.call(this, container, {
126
127
  proportionalLayout: true,
127
128
  orientation: splitview_1.Orientation.HORIZONTAL,
@@ -220,37 +221,51 @@ var DockviewComponent = /** @class */ (function (_super) {
220
221
  _this._floatingOverlayHost = document.createElement('div');
221
222
  _this._floatingOverlayHost.className = 'dv-floating-overlay-host';
222
223
  _this._shellManager.element.appendChild(_this._floatingOverlayHost);
223
- _this._rootDropTarget = new droptarget_1.Droptarget(_this.element, {
224
- className: 'dv-drop-target-edge',
225
- canDisplayOverlay: function (event, position) {
226
- var data = (0, dataTransfer_1.getPanelData)();
227
- if (data) {
228
- if (data.viewId !== _this.id) {
229
- return false;
230
- }
231
- if (position === 'center') {
232
- // center drop target is only allowed if there are no panels in the grid
233
- // floating panels are allowed
234
- return _this.gridview.length === 0;
235
- }
236
- return true;
237
- }
238
- if (position === 'center' && _this.gridview.length !== 0) {
239
- /**
240
- * for external events only show the four-corner drag overlays, disable
241
- * the center position so that external drag events can fall through to the group
242
- * and panel drop target handlers
243
- */
224
+ var rootCanDisplayOverlay = function (event, position) {
225
+ var data = (0, dataTransfer_1.getPanelData)();
226
+ if (data) {
227
+ if (data.viewId !== _this.id) {
244
228
  return false;
245
229
  }
246
- var firedEvent = new options_1.DockviewUnhandledDragOverEvent(event, 'edge', position, dataTransfer_1.getPanelData);
247
- _this._onUnhandledDragOverEvent.fire(firedEvent);
248
- return firedEvent.isAccepted;
249
- },
230
+ if (position === 'center') {
231
+ // center drop target is only allowed if there are no panels in the grid
232
+ // floating panels are allowed
233
+ return _this.gridview.length === 0;
234
+ }
235
+ return true;
236
+ }
237
+ if (position === 'center' && _this.gridview.length !== 0) {
238
+ /**
239
+ * for external events only show the four-corner drag overlays, disable
240
+ * the center position so that external drag events can fall through to the group
241
+ * and panel drop target handlers
242
+ */
243
+ return false;
244
+ }
245
+ var firedEvent = new options_1.DockviewUnhandledDragOverEvent(event, 'edge', position, dataTransfer_1.getPanelData);
246
+ _this._onUnhandledDragOverEvent.fire(firedEvent);
247
+ return firedEvent.isAccepted;
248
+ };
249
+ _this._rootDropTarget = backend_1.html5Backend.createDropTarget(_this.element, {
250
+ className: 'dv-drop-target-edge',
251
+ canDisplayOverlay: rootCanDisplayOverlay,
250
252
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
251
253
  overlayModel: (_f = options.rootOverlayModel) !== null && _f !== void 0 ? _f : DEFAULT_ROOT_OVERLAY_MODEL,
252
254
  getOverrideTarget: function () { var _a; return (_a = _this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
253
255
  });
256
+ _this._rootPointerDropTarget = backend_1.pointerBackend.createDropTarget(_this.element, {
257
+ className: 'dv-drop-target-edge',
258
+ canDisplayOverlay: rootCanDisplayOverlay,
259
+ acceptedTargetZones: [
260
+ 'top',
261
+ 'bottom',
262
+ 'left',
263
+ 'right',
264
+ 'center',
265
+ ],
266
+ overlayModel: (_g = options.rootOverlayModel) !== null && _g !== void 0 ? _g : DEFAULT_ROOT_OVERLAY_MODEL,
267
+ getOverrideTarget: function () { var _a; return (_a = _this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
268
+ });
254
269
  _this.updateDropTargetModel(options);
255
270
  (0, dom_1.toggleClass)(_this.gridview.element, 'dv-dockview', true);
256
271
  (0, dom_1.toggleClass)(_this.element, 'dv-debug', !!options.debug);
@@ -353,7 +368,7 @@ var DockviewComponent = /** @class */ (function (_super) {
353
368
  finally { if (e_4) throw e_4.error; }
354
369
  }
355
370
  _this._edgeGroupDisposables.clear();
356
- }), _this._rootDropTarget, _this._rootDropTarget.onWillShowOverlay(function (event) {
371
+ }), _this._rootDropTarget, _this._rootPointerDropTarget, events_1.Event.any(_this._rootDropTarget.onWillShowOverlay, _this._rootPointerDropTarget.onWillShowOverlay)(function (event) {
357
372
  if (_this.gridview.length > 0 && event.position === 'center') {
358
373
  // option only available when no panels in primary grid
359
374
  return;
@@ -365,7 +380,7 @@ var DockviewComponent = /** @class */ (function (_super) {
365
380
  group: undefined,
366
381
  getData: dataTransfer_1.getPanelData,
367
382
  }));
368
- }), _this._rootDropTarget.onDrop(function (event) {
383
+ }), events_1.Event.any(_this._rootDropTarget.onDrop, _this._rootPointerDropTarget.onDrop)(function (event) {
369
384
  var _a;
370
385
  var willDropEvent = new dockviewGroupPanelModel_1.DockviewWillDropEvent({
371
386
  nativeEvent: event.nativeEvent,
@@ -403,7 +418,7 @@ var DockviewComponent = /** @class */ (function (_super) {
403
418
  getData: dataTransfer_1.getPanelData,
404
419
  }));
405
420
  }
406
- }), _this._rootDropTarget);
421
+ }));
407
422
  return _this;
408
423
  }
409
424
  Object.defineProperty(DockviewComponent.prototype, "orientation", {
@@ -1035,9 +1050,12 @@ var DockviewComponent = /** @class */ (function (_super) {
1035
1050
  }
1036
1051
  this.updateDropTargetModel(options);
1037
1052
  var oldDisableDnd = this.options.disableDnd;
1053
+ var oldDndStrategy = this.options.dndStrategy;
1038
1054
  this._options = __assign(__assign({}, this.options), options);
1039
1055
  var newDisableDnd = this.options.disableDnd;
1040
- if (oldDisableDnd !== newDisableDnd) {
1056
+ var newDndStrategy = this.options.dndStrategy;
1057
+ if (oldDisableDnd !== newDisableDnd ||
1058
+ oldDndStrategy !== newDndStrategy) {
1041
1059
  this.updateDragAndDropState();
1042
1060
  }
1043
1061
  if ('theme' in options) {
@@ -2993,15 +3011,18 @@ var DockviewComponent = /** @class */ (function (_super) {
2993
3011
  };
2994
3012
  DockviewComponent.prototype.updateDropTargetModel = function (options) {
2995
3013
  if ('dndEdges' in options) {
2996
- this._rootDropTarget.disabled =
2997
- typeof options.dndEdges === 'boolean' &&
2998
- options.dndEdges === false;
3014
+ var disabled = typeof options.dndEdges === 'boolean' &&
3015
+ options.dndEdges === false;
3016
+ this._rootDropTarget.disabled = disabled;
3017
+ this._rootPointerDropTarget.disabled = disabled;
2999
3018
  if (typeof options.dndEdges === 'object' &&
3000
3019
  options.dndEdges !== null) {
3001
3020
  this._rootDropTarget.setOverlayModel(options.dndEdges);
3021
+ this._rootPointerDropTarget.setOverlayModel(options.dndEdges);
3002
3022
  }
3003
3023
  else {
3004
3024
  this._rootDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
3025
+ this._rootPointerDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
3005
3026
  }
3006
3027
  }
3007
3028
  if ('rootOverlayModel' in options) {
@@ -52,13 +52,17 @@ export interface CreateTabGroupOptions extends TabGroupOptions {
52
52
  }
53
53
  export declare class DockviewDidDropEvent extends DockviewEvent {
54
54
  private readonly options;
55
- get nativeEvent(): DragEvent;
55
+ /**
56
+ * `PointerEvent` for touch drags has no `dataTransfer`; use
57
+ * `getData()` for the dockview payload regardless of input method.
58
+ */
59
+ get nativeEvent(): DragEvent | PointerEvent;
56
60
  get position(): Position;
57
61
  get panel(): IDockviewPanel | undefined;
58
62
  get group(): DockviewGroupPanel | undefined;
59
63
  get api(): DockviewApi;
60
64
  constructor(options: {
61
- readonly nativeEvent: DragEvent;
65
+ readonly nativeEvent: DragEvent | PointerEvent;
62
66
  readonly position: Position;
63
67
  readonly panel?: IDockviewPanel;
64
68
  getData(): PanelTransfer | undefined;
@@ -71,7 +75,7 @@ export declare class DockviewWillDropEvent extends DockviewDidDropEvent {
71
75
  private readonly _kind;
72
76
  get kind(): DockviewGroupDropLocation;
73
77
  constructor(options: {
74
- readonly nativeEvent: DragEvent;
78
+ readonly nativeEvent: DragEvent | PointerEvent;
75
79
  readonly position: Position;
76
80
  readonly panel?: IDockviewPanel;
77
81
  getData(): PanelTransfer | undefined;
@@ -122,7 +126,7 @@ export interface IDockviewGroupPanelModel extends IPanel {
122
126
  panel?: IDockviewPanel;
123
127
  suppressRoll?: boolean;
124
128
  }): void;
125
- canDisplayOverlay(event: DragEvent, position: Position, target: DockviewGroupDropLocation): boolean;
129
+ canDisplayOverlay(event: DragEvent | PointerEvent, position: Position, target: DockviewGroupDropLocation): boolean;
126
130
  }
127
131
  export type DockviewGroupLocation = {
128
132
  type: 'grid';
@@ -324,7 +328,7 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
324
328
  private doSetActivePanel;
325
329
  private updateMru;
326
330
  private updateContainer;
327
- canDisplayOverlay(event: DragEvent, position: Position, target: DockviewGroupDropLocation): boolean;
331
+ canDisplayOverlay(event: DragEvent | PointerEvent, position: Position, target: DockviewGroupDropLocation): boolean;
328
332
  private handleDropEvent;
329
333
  updateDragAndDropState(): void;
330
334
  dispose(): void;