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
@@ -70,6 +70,10 @@ var DockviewDidDropEvent = /** @class */ (function (_super) {
70
70
  return _this;
71
71
  }
72
72
  Object.defineProperty(DockviewDidDropEvent.prototype, "nativeEvent", {
73
+ /**
74
+ * `PointerEvent` for touch drags has no `dataTransfer`; use
75
+ * `getData()` for the dockview payload regardless of input method.
76
+ */
73
77
  get: function () {
74
78
  return this.options.nativeEvent;
75
79
  },
@@ -261,6 +265,8 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
261
265
  // noop
262
266
  }), _this.contentContainer.dropTarget.onDrop(function (event) {
263
267
  _this.handleDropEvent('content', event.nativeEvent, event.position);
268
+ }), _this.contentContainer.pointerDropTarget.onDrop(function (event) {
269
+ _this.handleDropEvent('content', event.nativeEvent, event.position);
264
270
  }), _this.tabsContainer.onWillShowOverlay(function (event) {
265
271
  _this._onWillShowOverlay.fire(event);
266
272
  }), _this.contentContainer.dropTarget.onWillShowOverlay(function (event) {
@@ -271,6 +277,14 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
271
277
  group: _this.groupPanel,
272
278
  getData: dataTransfer_1.getPanelData,
273
279
  }));
280
+ }), _this.contentContainer.pointerDropTarget.onWillShowOverlay(function (event) {
281
+ _this._onWillShowOverlay.fire(new events_2.DockviewWillShowOverlayLocationEvent(event, {
282
+ kind: 'content',
283
+ panel: _this.activePanel,
284
+ api: _this._api,
285
+ group: _this.groupPanel,
286
+ getData: dataTransfer_1.getPanelData,
287
+ }));
274
288
  }), _this._onMove, _this._onDidChange, _this._onDidDrop, _this._onWillDrop, _this._onDidAddPanel, _this._onDidRemovePanel, _this._onDidActivePanelChange, _this._onUnhandledDragOverEvent, _this._onDidPanelTitleChange, _this._onDidPanelParametersChange, _this._onDidCreateTabGroup, _this._onDidDestroyTabGroup, _this._onDidAddPanelToTabGroup, _this._onDidRemovePanelFromTabGroup, _this._onDidTabGroupChange, _this._onDidTabGroupCollapsedChange, _this._onDidCreateTabGroup.event(function () {
275
289
  _this._scheduleTabGroupUpdate();
276
290
  }), _this._onDidDestroyTabGroup.event(function () {
@@ -402,33 +416,33 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
402
416
  return this._location;
403
417
  },
404
418
  set: function (value) {
419
+ var _this = this;
405
420
  this._location = value;
406
421
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-floating', false);
407
422
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-popout', false);
408
423
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-edge', false);
424
+ // Mouse and touch drop targets must agree on accepted zones.
425
+ var applyZones = function (zones) {
426
+ _this.contentContainer.dropTarget.setTargetZones(zones);
427
+ _this.contentContainer.pointerDropTarget.setTargetZones(zones);
428
+ };
409
429
  switch (value.type) {
410
430
  case 'grid':
411
- this.contentContainer.dropTarget.setTargetZones([
412
- 'top',
413
- 'bottom',
414
- 'left',
415
- 'right',
416
- 'center',
417
- ]);
431
+ applyZones(['top', 'bottom', 'left', 'right', 'center']);
418
432
  break;
419
433
  case 'floating':
420
- this.contentContainer.dropTarget.setTargetZones(['center']);
421
- this.contentContainer.dropTarget.setTargetZones(value
434
+ applyZones(['center']);
435
+ applyZones(value
422
436
  ? ['center']
423
437
  : ['top', 'bottom', 'left', 'right', 'center']);
424
438
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-floating', true);
425
439
  break;
426
440
  case 'popout':
427
- this.contentContainer.dropTarget.setTargetZones(['center']);
441
+ applyZones(['center']);
428
442
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-popout', true);
429
443
  break;
430
444
  case 'edge':
431
- this.contentContainer.dropTarget.setTargetZones(['center']);
445
+ applyZones(['center']);
432
446
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-edge', true);
433
447
  break;
434
448
  }
@@ -25,7 +25,8 @@ export declare class DockviewWillShowOverlayLocationEvent implements IDockviewEv
25
25
  private readonly event;
26
26
  readonly options: DockviewWillShowOverlayLocationEventOptions;
27
27
  get kind(): DockviewGroupDropLocation;
28
- get nativeEvent(): DragEvent;
28
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
29
+ get nativeEvent(): DragEvent | PointerEvent;
29
30
  get position(): Position;
30
31
  get defaultPrevented(): boolean;
31
32
  get panel(): IDockviewPanel | undefined;
@@ -14,6 +14,7 @@ var DockviewWillShowOverlayLocationEvent = /** @class */ (function () {
14
14
  configurable: true
15
15
  });
16
16
  Object.defineProperty(DockviewWillShowOverlayLocationEvent.prototype, "nativeEvent", {
17
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
17
18
  get: function () {
18
19
  return this.event.nativeEvent;
19
20
  },
@@ -77,6 +77,7 @@ export interface ViewFactoryData {
77
77
  }
78
78
  export type DockviewHeaderPosition = 'top' | 'bottom' | 'left' | 'right';
79
79
  export type DockviewHeaderDirection = 'horizontal' | 'vertical';
80
+ export type DockviewDndStrategy = 'auto' | 'pointer' | 'html5';
80
81
  export interface DockviewOptions {
81
82
  /**
82
83
  * Disable the auto-resizing which is controlled through a `ResizeObserver`.
@@ -101,6 +102,19 @@ export interface DockviewOptions {
101
102
  * */
102
103
  rootOverlayModel?: DroptargetOverlayModel;
103
104
  disableDnd?: boolean;
105
+ /**
106
+ * Selects which drag-and-drop implementation is active.
107
+ *
108
+ * - `'auto'` (default): HTML5 drag-and-drop drives mouse drags; pointer
109
+ * events drive touch and pen drags. Matches the historical behaviour.
110
+ * - `'pointer'`: pointer events drive every input type. Useful in
111
+ * environments where HTML5 drag-and-drop is unreliable (some Linux
112
+ * browsers, certain Safari versions, embedded webviews). Cross-window
113
+ * HTML5 drag and the HTML5 native drag image are not available in this
114
+ * mode.
115
+ * - `'html5'`: HTML5 drag-and-drop only — disables touch / pen drag.
116
+ */
117
+ dndStrategy?: DockviewDndStrategy;
104
118
  locked?: boolean;
105
119
  className?: string;
106
120
  /**
@@ -177,19 +191,20 @@ export interface DockviewOptions {
177
191
  }
178
192
  export type TabAnimation = 'smooth' | 'default';
179
193
  export interface DockviewDndOverlayEvent extends IAcceptableEvent {
180
- nativeEvent: DragEvent;
194
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
195
+ nativeEvent: DragEvent | PointerEvent;
181
196
  target: DockviewGroupDropLocation;
182
197
  position: Position;
183
198
  group?: DockviewGroupPanel;
184
199
  getData: () => PanelTransfer | undefined;
185
200
  }
186
201
  export declare class DockviewUnhandledDragOverEvent extends AcceptableEvent implements DockviewDndOverlayEvent {
187
- readonly nativeEvent: DragEvent;
202
+ readonly nativeEvent: DragEvent | PointerEvent;
188
203
  readonly target: DockviewGroupDropLocation;
189
204
  readonly position: Position;
190
205
  readonly getData: () => PanelTransfer | undefined;
191
206
  readonly group?: DockviewGroupPanel | undefined;
192
- constructor(nativeEvent: DragEvent, target: DockviewGroupDropLocation, position: Position, getData: () => PanelTransfer | undefined, group?: DockviewGroupPanel | undefined);
207
+ constructor(nativeEvent: DragEvent | PointerEvent, target: DockviewGroupDropLocation, position: Position, getData: () => PanelTransfer | undefined, group?: DockviewGroupPanel | undefined);
193
208
  }
194
209
  export declare const PROPERTY_KEYS_DOCKVIEW: (keyof DockviewOptions)[];
195
210
  export interface CreateComponentOptions {
@@ -54,6 +54,7 @@ exports.PROPERTY_KEYS_DOCKVIEW = (function () {
54
54
  rootOverlayModel: undefined,
55
55
  locked: undefined,
56
56
  disableDnd: undefined,
57
+ dndStrategy: undefined,
57
58
  className: undefined,
58
59
  noPanelsOverlay: undefined,
59
60
  dndEdges: undefined,
package/dist/cjs/dom.js CHANGED
@@ -313,7 +313,7 @@ function addTestId(element, id) {
313
313
  * Should be more efficient than element.querySelectorAll("*") since there
314
314
  * is no need to store every element in-memory using this approach
315
315
  */
316
- function allTagsNamesInclusiveOfShadowDoms(tagNames) {
316
+ function allTagsNamesInclusiveOfShadowDoms(tagNames, rootNode) {
317
317
  var iframes = [];
318
318
  function findIframesInNode(node) {
319
319
  var e_5, _a;
@@ -339,13 +339,17 @@ function allTagsNamesInclusiveOfShadowDoms(tagNames) {
339
339
  }
340
340
  }
341
341
  }
342
- findIframesInNode(document.documentElement);
342
+ // Document → walk from its root element. Element → walk from itself.
343
+ var startEl = rootNode instanceof Document
344
+ ? rootNode.documentElement
345
+ : rootNode;
346
+ findIframesInNode(startEl);
343
347
  return iframes;
344
348
  }
345
349
  function disableIframePointEvents(rootNode) {
346
350
  var e_6, _a;
347
351
  if (rootNode === void 0) { rootNode = document; }
348
- var iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW']);
352
+ var iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW'], rootNode);
349
353
  var original = new WeakMap(); // don't hold onto HTMLElement references longer than required
350
354
  try {
351
355
  for (var iframes_1 = __values(iframes), iframes_1_1 = iframes_1.next(); !iframes_1_1.done; iframes_1_1 = iframes_1.next()) {
@@ -8,6 +8,11 @@ export declare class Overlay extends CompositeDisposable {
8
8
  readonly onDidChange: Event<void>;
9
9
  private readonly _onDidChangeEnd;
10
10
  readonly onDidChangeEnd: Event<void>;
11
+ private readonly _onDidStartMoving;
12
+ /** Fires once per drag, the first time the float actually moves. */
13
+ readonly onDidStartMoving: Event<void>;
14
+ private readonly _dragMove;
15
+ private _dragCancelled;
11
16
  private static readonly MINIMUM_HEIGHT;
12
17
  private static readonly MINIMUM_WIDTH;
13
18
  private verticalAlignment;
@@ -27,6 +32,13 @@ export declare class Overlay extends CompositeDisposable {
27
32
  bringToFront(): void;
28
33
  setBounds(bounds?: Partial<AnchoredBox>): void;
29
34
  toJSON(): AnchoredBox;
35
+ /**
36
+ * Abort an in-flight move-the-float drag. Used by the void container
37
+ * when a redock long-press fires after the move started, so the ghost
38
+ * gesture wins without the float continuing to follow the finger.
39
+ * Does not emit `onDidChangeEnd` because no change is being committed.
40
+ */
41
+ cancelPendingDrag(): void;
30
42
  setupDrag(dragTarget: HTMLElement, options?: {
31
43
  inDragMode: boolean;
32
44
  }): void;
@@ -90,7 +90,12 @@ var Overlay = /** @class */ (function (_super) {
90
90
  _this.onDidChange = _this._onDidChange.event;
91
91
  _this._onDidChangeEnd = new events_1.Emitter();
92
92
  _this.onDidChangeEnd = _this._onDidChangeEnd.event;
93
- _this.addDisposables(_this._onDidChange, _this._onDidChangeEnd);
93
+ _this._onDidStartMoving = new events_1.Emitter();
94
+ /** Fires once per drag, the first time the float actually moves. */
95
+ _this.onDidStartMoving = _this._onDidStartMoving.event;
96
+ _this._dragMove = new lifecycle_1.MutableDisposable();
97
+ _this._dragCancelled = false;
98
+ _this.addDisposables(_this._onDidChange, _this._onDidChangeEnd, _this._onDidStartMoving, _this._dragMove);
94
99
  _this._element.className = 'dv-resize-container';
95
100
  _this._isVisible = true;
96
101
  _this.setupResize('top');
@@ -229,18 +234,62 @@ var Overlay = /** @class */ (function (_super) {
229
234
  result.height = element.height;
230
235
  return result;
231
236
  };
237
+ /**
238
+ * Abort an in-flight move-the-float drag. Used by the void container
239
+ * when a redock long-press fires after the move started, so the ghost
240
+ * gesture wins without the float continuing to follow the finger.
241
+ * Does not emit `onDidChangeEnd` because no change is being committed.
242
+ */
243
+ Overlay.prototype.cancelPendingDrag = function () {
244
+ if (!this._dragMove.value) {
245
+ return;
246
+ }
247
+ this._dragCancelled = true;
248
+ (0, dom_1.toggleClass)(this._element, 'dv-resize-container-dragging', false);
249
+ this._dragMove.value = lifecycle_1.Disposable.NONE;
250
+ };
232
251
  Overlay.prototype.setupDrag = function (dragTarget, options) {
233
252
  var _this = this;
234
253
  if (options === void 0) { options = { inDragMode: false }; }
235
- var move = new lifecycle_1.MutableDisposable();
236
- var track = function () {
254
+ var track = function (captureTarget, pointerId) {
237
255
  var offset = null;
256
+ var hasMoved = false;
257
+ _this._dragCancelled = false;
238
258
  var iframes = (0, dom_1.disableIframePointEvents)();
239
- move.value = new lifecycle_1.CompositeDisposable({
259
+ if (captureTarget &&
260
+ typeof pointerId === 'number' &&
261
+ typeof captureTarget.setPointerCapture === 'function') {
262
+ try {
263
+ captureTarget.setPointerCapture(pointerId);
264
+ }
265
+ catch (_a) {
266
+ // ignore – non-fatal if the browser refuses capture
267
+ }
268
+ }
269
+ var end = function () {
270
+ (0, dom_1.toggleClass)(_this._element, 'dv-resize-container-dragging', false);
271
+ _this._dragMove.value = lifecycle_1.Disposable.NONE;
272
+ _this._onDidChangeEnd.fire();
273
+ };
274
+ _this._dragMove.value = new lifecycle_1.CompositeDisposable({
240
275
  dispose: function () {
241
276
  iframes.release();
277
+ if (captureTarget &&
278
+ typeof pointerId === 'number' &&
279
+ typeof captureTarget.releasePointerCapture ===
280
+ 'function') {
281
+ try {
282
+ captureTarget.releasePointerCapture(pointerId);
283
+ }
284
+ catch (_a) {
285
+ // ignore – pointer may already be released
286
+ }
287
+ }
242
288
  },
243
289
  }, (0, events_1.addDisposableListener)(window, 'pointermove', function (e) {
290
+ if (_this._dragCancelled) {
291
+ return;
292
+ }
244
293
  var containerRect = _this.options.container.getBoundingClientRect();
245
294
  var x = e.clientX - containerRect.left;
246
295
  var y = e.clientY - containerRect.top;
@@ -277,13 +326,13 @@ var Overlay = /** @class */ (function (_super) {
277
326
  bounds.right = right;
278
327
  }
279
328
  _this.setBounds(bounds);
280
- }), (0, events_1.addDisposableListener)(window, 'pointerup', function () {
281
- (0, dom_1.toggleClass)(_this._element, 'dv-resize-container-dragging', false);
282
- move.dispose();
283
- _this._onDidChangeEnd.fire();
284
- }));
329
+ if (!hasMoved) {
330
+ hasMoved = true;
331
+ _this._onDidStartMoving.fire();
332
+ }
333
+ }), (0, events_1.addDisposableListener)(window, 'pointerup', end), (0, events_1.addDisposableListener)(window, 'pointercancel', end));
285
334
  };
286
- this.addDisposables(move, (0, events_1.addDisposableListener)(dragTarget, 'pointerdown', function (event) {
335
+ this.addDisposables((0, events_1.addDisposableListener)(dragTarget, 'pointerdown', function (event) {
287
336
  if (event.defaultPrevented) {
288
337
  event.preventDefault();
289
338
  return;
@@ -293,7 +342,7 @@ var Overlay = /** @class */ (function (_super) {
293
342
  if ((0, dom_1.quasiDefaultPrevented)(event)) {
294
343
  return;
295
344
  }
296
- track();
345
+ track(dragTarget, event.pointerId);
297
346
  }), (0, events_1.addDisposableListener)(this.options.content, 'pointerdown', function (event) {
298
347
  if (event.defaultPrevented) {
299
348
  return;
@@ -304,7 +353,7 @@ var Overlay = /** @class */ (function (_super) {
304
353
  return;
305
354
  }
306
355
  if (event.shiftKey) {
307
- track();
356
+ track(_this.options.content, event.pointerId);
308
357
  }
309
358
  }), (0, events_1.addDisposableListener)(this.options.content, 'pointerdown', function () {
310
359
  arialLevelTracker.push(_this._element);
@@ -323,6 +372,19 @@ var Overlay = /** @class */ (function (_super) {
323
372
  e.preventDefault();
324
373
  var startPosition = null;
325
374
  var iframes = (0, dom_1.disableIframePointEvents)();
375
+ var pointerId = e.pointerId;
376
+ if (typeof resizeHandleElement.setPointerCapture === 'function') {
377
+ try {
378
+ resizeHandleElement.setPointerCapture(pointerId);
379
+ }
380
+ catch (_a) {
381
+ // ignore – non-fatal if the browser refuses capture
382
+ }
383
+ }
384
+ var end = function () {
385
+ move.dispose();
386
+ _this._onDidChangeEnd.fire();
387
+ };
326
388
  move.value = new lifecycle_1.CompositeDisposable((0, events_1.addDisposableListener)(window, 'pointermove', function (e) {
327
389
  var containerRect = _this.options.container.getBoundingClientRect();
328
390
  var overlayRect = _this._element.getBoundingClientRect();
@@ -457,11 +519,17 @@ var Overlay = /** @class */ (function (_super) {
457
519
  }), {
458
520
  dispose: function () {
459
521
  iframes.release();
522
+ if (typeof resizeHandleElement.releasePointerCapture ===
523
+ 'function') {
524
+ try {
525
+ resizeHandleElement.releasePointerCapture(pointerId);
526
+ }
527
+ catch (_a) {
528
+ // ignore – pointer may already be released
529
+ }
530
+ }
460
531
  },
461
- }, (0, events_1.addDisposableListener)(window, 'pointerup', function () {
462
- move.dispose();
463
- _this._onDidChangeEnd.fire();
464
- }));
532
+ }, (0, events_1.addDisposableListener)(window, 'pointerup', end), (0, events_1.addDisposableListener)(window, 'pointercancel', end));
465
533
  }));
466
534
  };
467
535
  Overlay.prototype.getMinimumWidth = function (width) {
@@ -12,8 +12,10 @@ export interface PaneviewDidDropEvent extends DroptargetEvent {
12
12
  api: PaneviewApi;
13
13
  }
14
14
  export declare abstract class DraggablePaneviewPanel extends PaneviewPanel {
15
- private handler;
15
+ private html5DragSource;
16
+ private pointerDragSource;
16
17
  private target;
18
+ private pointerTarget;
17
19
  private readonly _onDidDrop;
18
20
  readonly onDidDrop: Event<PaneviewDidDropEvent>;
19
21
  private readonly _onUnhandledDragOverEvent;
@@ -28,9 +28,8 @@ var __assign = (this && this.__assign) || function () {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.DraggablePaneviewPanel = void 0;
30
30
  var component_api_1 = require("../api/component.api");
31
- var abstractDragHandler_1 = require("../dnd/abstractDragHandler");
31
+ var backend_1 = require("../dnd/backend");
32
32
  var dataTransfer_1 = require("../dnd/dataTransfer");
33
- var droptarget_1 = require("../dnd/droptarget");
34
33
  var events_1 = require("../events");
35
34
  var options_1 = require("./options");
36
35
  var paneviewPanel_1 = require("./paneviewPanel");
@@ -67,40 +66,42 @@ var DraggablePaneviewPanel = /** @class */ (function (_super) {
67
66
  var id = this.id;
68
67
  var accessorId = this.accessor.id;
69
68
  this.header.draggable = true;
70
- this.handler = new (/** @class */ (function (_super) {
71
- __extends(PaneDragHandler, _super);
72
- function PaneDragHandler() {
73
- return _super !== null && _super.apply(this, arguments) || this;
74
- }
75
- PaneDragHandler.prototype.getData = function () {
69
+ var sharedDragOptions = {
70
+ getData: function () {
76
71
  dataTransfer_1.LocalSelectionTransfer.getInstance().setData([new dataTransfer_1.PaneTransfer(accessorId, id)], dataTransfer_1.PaneTransfer.prototype);
77
72
  return {
78
73
  dispose: function () {
79
74
  dataTransfer_1.LocalSelectionTransfer.getInstance().clearData(dataTransfer_1.PaneTransfer.prototype);
80
75
  },
81
76
  };
82
- };
83
- return PaneDragHandler;
84
- }(abstractDragHandler_1.DragHandler)))(this.header);
85
- this.target = new droptarget_1.Droptarget(this.element, {
77
+ },
78
+ };
79
+ this.html5DragSource = backend_1.html5Backend.createDragSource(this.header, sharedDragOptions);
80
+ this.pointerDragSource = backend_1.pointerBackend.createDragSource(this.header, sharedDragOptions);
81
+ var canDisplayOverlay = function (event, position) {
82
+ var data = (0, dataTransfer_1.getPaneData)();
83
+ if (data) {
84
+ if (data.paneId !== _this.id &&
85
+ data.viewId === _this.accessor.id) {
86
+ return true;
87
+ }
88
+ }
89
+ var firedEvent = new options_1.PaneviewUnhandledDragOverEvent(event, position, dataTransfer_1.getPaneData, _this);
90
+ _this._onUnhandledDragOverEvent.fire(firedEvent);
91
+ return firedEvent.isAccepted;
92
+ };
93
+ var dropTargetOptions = {
86
94
  acceptedTargetZones: ['top', 'bottom'],
87
95
  overlayModel: {
88
96
  activationSize: { type: 'percentage', value: 50 },
89
97
  },
90
- canDisplayOverlay: function (event, position) {
91
- var data = (0, dataTransfer_1.getPaneData)();
92
- if (data) {
93
- if (data.paneId !== _this.id &&
94
- data.viewId === _this.accessor.id) {
95
- return true;
96
- }
97
- }
98
- var firedEvent = new options_1.PaneviewUnhandledDragOverEvent(event, position, dataTransfer_1.getPaneData, _this);
99
- _this._onUnhandledDragOverEvent.fire(firedEvent);
100
- return firedEvent.isAccepted;
101
- },
102
- });
103
- this.addDisposables(this._onDidDrop, this.handler, this.target, this.target.onDrop(function (event) {
98
+ canDisplayOverlay: canDisplayOverlay,
99
+ };
100
+ this.target = backend_1.html5Backend.createDropTarget(this.element, dropTargetOptions);
101
+ this.pointerTarget = backend_1.pointerBackend.createDropTarget(this.element, dropTargetOptions);
102
+ this.addDisposables(this._onDidDrop, this.html5DragSource, this.pointerDragSource, this.target, this.pointerTarget, this.target.onDrop(function (event) {
103
+ _this.onDrop(event);
104
+ }), this.pointerTarget.onDrop(function (event) {
104
105
  _this.onDrop(event);
105
106
  }));
106
107
  };
@@ -15,15 +15,16 @@ export interface PaneviewFrameworkOptions {
15
15
  export type PaneviewComponentOptions = PaneviewOptions & PaneviewFrameworkOptions;
16
16
  export declare const PROPERTY_KEYS_PANEVIEW: (keyof PaneviewOptions)[];
17
17
  export interface PaneviewDndOverlayEvent extends IAcceptableEvent {
18
- nativeEvent: DragEvent;
18
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
19
+ nativeEvent: DragEvent | PointerEvent;
19
20
  position: Position;
20
21
  panel: IPaneviewPanel;
21
22
  getData: () => PaneTransfer | undefined;
22
23
  }
23
24
  export declare class PaneviewUnhandledDragOverEvent extends AcceptableEvent implements PaneviewDndOverlayEvent {
24
- readonly nativeEvent: DragEvent;
25
+ readonly nativeEvent: DragEvent | PointerEvent;
25
26
  readonly position: Position;
26
27
  readonly getData: () => PaneTransfer | undefined;
27
28
  readonly panel: IPaneviewPanel;
28
- constructor(nativeEvent: DragEvent, position: Position, getData: () => PaneTransfer | undefined, panel: IPaneviewPanel);
29
+ constructor(nativeEvent: DragEvent | PointerEvent, position: Position, getData: () => PaneTransfer | undefined, panel: IPaneviewPanel);
29
30
  }