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
@@ -20,53 +20,10 @@ exports.directionToPosition = directionToPosition;
20
20
  exports.positionToDirection = positionToDirection;
21
21
  exports.calculateQuadrantAsPercentage = calculateQuadrantAsPercentage;
22
22
  exports.calculateQuadrantAsPixels = calculateQuadrantAsPixels;
23
- var dom_1 = require("../dom");
24
23
  var events_1 = require("../events");
25
24
  var lifecycle_1 = require("../lifecycle");
26
25
  var dnd_1 = require("./dnd");
27
- var math_1 = require("../math");
28
- function setGPUOptimizedBounds(element, bounds) {
29
- var top = bounds.top, left = bounds.left, width = bounds.width, height = bounds.height;
30
- var topPx = "".concat(Math.round(top), "px");
31
- var leftPx = "".concat(Math.round(left), "px");
32
- var widthPx = "".concat(Math.round(width), "px");
33
- var heightPx = "".concat(Math.round(height), "px");
34
- // Use traditional positioning but maintain GPU layer
35
- element.style.top = topPx;
36
- element.style.left = leftPx;
37
- element.style.width = widthPx;
38
- element.style.height = heightPx;
39
- element.style.visibility = 'visible';
40
- // Ensure GPU layer is maintained
41
- if (!element.style.transform || element.style.transform === '') {
42
- element.style.transform = 'translate3d(0, 0, 0)';
43
- }
44
- }
45
- function setGPUOptimizedBoundsFromStrings(element, bounds) {
46
- var top = bounds.top, left = bounds.left, width = bounds.width, height = bounds.height;
47
- // Use traditional positioning but maintain GPU layer
48
- element.style.top = top;
49
- element.style.left = left;
50
- element.style.width = width;
51
- element.style.height = height;
52
- element.style.visibility = 'visible';
53
- // Ensure GPU layer is maintained
54
- if (!element.style.transform || element.style.transform === '') {
55
- element.style.transform = 'translate3d(0, 0, 0)';
56
- }
57
- }
58
- function checkBoundsChanged(element, bounds) {
59
- var top = bounds.top, left = bounds.left, width = bounds.width, height = bounds.height;
60
- var topPx = "".concat(Math.round(top), "px");
61
- var leftPx = "".concat(Math.round(left), "px");
62
- var widthPx = "".concat(Math.round(width), "px");
63
- var heightPx = "".concat(Math.round(height), "px");
64
- // Check if position or size changed (back to traditional method)
65
- return (element.style.top !== topPx ||
66
- element.style.left !== leftPx ||
67
- element.style.width !== widthPx ||
68
- element.style.height !== heightPx);
69
- }
26
+ var dropOverlay_1 = require("./dropOverlay");
70
27
  var WillShowOverlayEvent = /** @class */ (function (_super) {
71
28
  __extends(WillShowOverlayEvent, _super);
72
29
  function WillShowOverlayEvent(options) {
@@ -127,12 +84,6 @@ var DEFAULT_ACTIVATION_SIZE = {
127
84
  value: 20,
128
85
  type: 'percentage',
129
86
  };
130
- var DEFAULT_SIZE = {
131
- value: 50,
132
- type: 'percentage',
133
- };
134
- var SMALL_WIDTH_BOUNDARY = 100;
135
- var SMALL_HEIGHT_BOUNDARY = 100;
136
87
  var Droptarget = /** @class */ (function (_super) {
137
88
  __extends(Droptarget, _super);
138
89
  function Droptarget(element, options) {
@@ -207,20 +158,12 @@ var Droptarget = /** @class */ (function (_super) {
207
158
  //
208
159
  }
209
160
  else if (!_this.targetElement) {
210
- _this.targetElement = document.createElement('div');
211
- _this.targetElement.className = 'dv-drop-target-dropzone';
212
- _this.overlayElement = document.createElement('div');
213
- _this.overlayElement.className = 'dv-drop-target-selection';
161
+ var els = (0, dropOverlay_1.createOverlayElements)();
162
+ _this.targetElement = els.dropzone;
163
+ _this.overlayElement = els.selection;
214
164
  _this._state = 'center';
215
- _this.targetElement.appendChild(_this.overlayElement);
216
165
  target.classList.add('dv-drop-target');
217
166
  target.append(_this.targetElement);
218
- // this.overlayElement.style.opacity = '0';
219
- // requestAnimationFrame(() => {
220
- // if (this.overlayElement) {
221
- // this.overlayElement.style.opacity = '';
222
- // }
223
- // });
224
167
  }
225
168
  _this.toggleClasses(quadrant, width, height);
226
169
  _this._state = quadrant;
@@ -308,162 +251,25 @@ var Droptarget = /** @class */ (function (_super) {
308
251
  return typeof value === 'boolean' && value;
309
252
  };
310
253
  Droptarget.prototype.toggleClasses = function (quadrant, width, height) {
311
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
254
+ var _a, _b, _c, _d, _e;
312
255
  var target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
313
- if (!target && !this.overlayElement) {
314
- return;
315
- }
316
- var smallWidthBoundary = (_d = (_c = this.options.overlayModel) === null || _c === void 0 ? void 0 : _c.smallWidthBoundary) !== null && _d !== void 0 ? _d : SMALL_WIDTH_BOUNDARY;
317
- var smallHeightBoundary = (_f = (_e = this.options.overlayModel) === null || _e === void 0 ? void 0 : _e.smallHeightBoundary) !== null && _f !== void 0 ? _f : SMALL_HEIGHT_BOUNDARY;
318
- var isSmallX = width < smallWidthBoundary;
319
- var isSmallY = height < smallHeightBoundary;
320
- var isLeft = quadrant === 'left';
321
- var isRight = quadrant === 'right';
322
- var isTop = quadrant === 'top';
323
- var isBottom = quadrant === 'bottom';
324
- var rightClass = !isSmallX && isRight;
325
- var leftClass = !isSmallX && isLeft;
326
- var topClass = !isSmallY && isTop;
327
- var bottomClass = !isSmallY && isBottom;
328
- var size = 1;
329
- var sizeOptions = (_h = (_g = this.options.overlayModel) === null || _g === void 0 ? void 0 : _g.size) !== null && _h !== void 0 ? _h : DEFAULT_SIZE;
330
- if (sizeOptions.type === 'percentage') {
331
- size = (0, math_1.clamp)(sizeOptions.value, 0, 100) / 100;
332
- }
333
- else {
334
- if (rightClass || leftClass) {
335
- size = (0, math_1.clamp)(0, sizeOptions.value, width) / width;
336
- }
337
- if (topClass || bottomClass) {
338
- size = (0, math_1.clamp)(0, sizeOptions.value, height) / height;
339
- }
340
- }
341
256
  if (target) {
342
- var outlineEl = (_l = (_k = (_j = this.options).getOverlayOutline) === null || _k === void 0 ? void 0 : _k.call(_j)) !== null && _l !== void 0 ? _l : this.element;
343
- var elBox = outlineEl.getBoundingClientRect();
344
- var ta = target.getElements(undefined, outlineEl);
345
- var el = ta.root;
346
- var overlay_1 = ta.overlay;
347
- var bigbox = el.getBoundingClientRect();
348
- var rootTop = elBox.top - bigbox.top;
349
- var rootLeft = elBox.left - bigbox.left;
350
- var box_1 = {
351
- top: rootTop,
352
- left: rootLeft,
257
+ var outlineEl = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;
258
+ (0, dropOverlay_1.renderAnchoredOverlay)({
259
+ outlineElement: outlineEl,
260
+ targetModel: target,
261
+ quadrant: quadrant,
353
262
  width: width,
354
263
  height: height,
355
- };
356
- if (rightClass) {
357
- box_1.left = rootLeft + width * (1 - size);
358
- box_1.width = width * size;
359
- }
360
- else if (leftClass) {
361
- box_1.width = width * size;
362
- }
363
- else if (topClass) {
364
- box_1.height = height * size;
365
- }
366
- else if (bottomClass) {
367
- box_1.top = rootTop + height * (1 - size);
368
- box_1.height = height * size;
369
- }
370
- if (isSmallX && isLeft) {
371
- box_1.width = 4;
372
- }
373
- if (isSmallX && isRight) {
374
- box_1.left = rootLeft + width - 4;
375
- box_1.width = 4;
376
- }
377
- if (isSmallY && isTop) {
378
- box_1.height = 4;
379
- }
380
- if (isSmallY && isBottom) {
381
- box_1.top = rootTop + height - 4;
382
- box_1.height = 4;
383
- }
384
- // Use GPU-optimized bounds checking and setting
385
- if (!checkBoundsChanged(overlay_1, box_1)) {
386
- return;
387
- }
388
- setGPUOptimizedBounds(overlay_1, box_1);
389
- overlay_1.className = "dv-drop-target-anchor".concat(this.options.className ? " ".concat(this.options.className) : '');
390
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-left', isLeft);
391
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-right', isRight);
392
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-top', isTop);
393
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-bottom', isBottom);
394
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-anchor-line', (isSmallX && (isLeft || isRight)) ||
395
- (isSmallY && (isTop || isBottom)));
396
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-center', quadrant === 'center');
397
- if (ta.changed) {
398
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-anchor-container-changed', true);
399
- setTimeout(function () {
400
- (0, dom_1.toggleClass)(overlay_1, 'dv-drop-target-anchor-container-changed', false);
401
- }, 10);
402
- }
264
+ overlayModel: this.options.overlayModel,
265
+ className: this.options.className,
266
+ });
403
267
  return;
404
268
  }
405
269
  if (!this.overlayElement) {
406
270
  return;
407
271
  }
408
- var box = { top: '0px', left: '0px', width: '100%', height: '100%' };
409
- /**
410
- * You can also achieve the overlay placement using the transform CSS property
411
- * to translate and scale the element however this has the undesired effect of
412
- * 'skewing' the element. Comment left here for anybody that ever revisits this.
413
- *
414
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform
415
- *
416
- * right
417
- * translateX(${100 * (1 - size) / 2}%) scaleX(${scale})
418
- *
419
- * left
420
- * translateX(-${100 * (1 - size) / 2}%) scaleX(${scale})
421
- *
422
- * top
423
- * translateY(-${100 * (1 - size) / 2}%) scaleY(${scale})
424
- *
425
- * bottom
426
- * translateY(${100 * (1 - size) / 2}%) scaleY(${scale})
427
- */
428
- if (rightClass) {
429
- box.left = "".concat(100 * (1 - size), "%");
430
- box.width = "".concat(100 * size, "%");
431
- }
432
- else if (leftClass) {
433
- box.width = "".concat(100 * size, "%");
434
- }
435
- else if (topClass) {
436
- box.height = "".concat(100 * size, "%");
437
- }
438
- else if (bottomClass) {
439
- box.top = "".concat(100 * (1 - size), "%");
440
- box.height = "".concat(100 * size, "%");
441
- }
442
- if (isSmallX && isLeft) {
443
- box.width = '4px';
444
- }
445
- if (isSmallX && isRight) {
446
- box.left = "".concat(width - 4, "px");
447
- box.width = '4px';
448
- }
449
- if (isSmallY && isTop) {
450
- box.height = '4px';
451
- }
452
- if (isSmallY && isBottom) {
453
- box.top = "".concat(height - 4, "px");
454
- box.height = '4px';
455
- }
456
- setGPUOptimizedBoundsFromStrings(this.overlayElement, box);
457
- var isLine = (isSmallX && (isLeft || isRight)) ||
458
- (isSmallY && (isTop || isBottom));
459
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-small-vertical', isSmallY);
460
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-small-horizontal', isSmallX);
461
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-selection-line', isLine);
462
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-left', isLeft);
463
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-right', isRight);
464
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-top', isTop);
465
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-bottom', isBottom);
466
- (0, dom_1.toggleClass)(this.overlayElement, 'dv-drop-target-center', quadrant === 'center');
272
+ (0, dropOverlay_1.renderInPlaceOverlay)(this.overlayElement, quadrant, width, height, this.options.overlayModel);
467
273
  };
468
274
  Droptarget.prototype.calculateQuadrant = function (overlayType, x, y, width, height) {
469
275
  var _a, _b;
@@ -0,0 +1,11 @@
1
+ export { PointerDragController } from './pointerDragController';
2
+ export type { ActiveDrag } from './pointerDragController';
3
+ export { PointerDragSource } from './pointerDragSource';
4
+ export type { PointerDragSourceOptions } from './pointerDragSource';
5
+ export { PointerDropTarget } from './pointerDropTarget';
6
+ export type { PointerDropTargetOptions } from './pointerDropTarget';
7
+ export type { PointerDragEvent, PointerDroptargetEvent, IPointerDropTargetHandle, } from './types';
8
+ export { LongPressDetector } from './longPress';
9
+ export type { LongPressOptions } from './longPress';
10
+ export { PointerGhost } from './pointerGhost';
11
+ export type { PointerGhostOptions } from './pointerGhost';
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointerGhost = exports.LongPressDetector = exports.PointerDropTarget = exports.PointerDragSource = exports.PointerDragController = void 0;
4
+ var pointerDragController_1 = require("./pointerDragController");
5
+ Object.defineProperty(exports, "PointerDragController", { enumerable: true, get: function () { return pointerDragController_1.PointerDragController; } });
6
+ var pointerDragSource_1 = require("./pointerDragSource");
7
+ Object.defineProperty(exports, "PointerDragSource", { enumerable: true, get: function () { return pointerDragSource_1.PointerDragSource; } });
8
+ var pointerDropTarget_1 = require("./pointerDropTarget");
9
+ Object.defineProperty(exports, "PointerDropTarget", { enumerable: true, get: function () { return pointerDropTarget_1.PointerDropTarget; } });
10
+ var longPress_1 = require("./longPress");
11
+ Object.defineProperty(exports, "LongPressDetector", { enumerable: true, get: function () { return longPress_1.LongPressDetector; } });
12
+ var pointerGhost_1 = require("./pointerGhost");
13
+ Object.defineProperty(exports, "PointerGhost", { enumerable: true, get: function () { return pointerGhost_1.PointerGhost; } });
@@ -0,0 +1,32 @@
1
+ import { CompositeDisposable } from '../../lifecycle';
2
+ export interface LongPressOptions {
3
+ /** Default 500ms. */
4
+ delay?: number;
5
+ /** Default 8px. */
6
+ tolerance?: number;
7
+ /** Default true: mouse users have right-click and don't need this. */
8
+ touchOnly?: boolean;
9
+ /** Receives the `pointerdown` event so consumers can read `clientX/Y`. */
10
+ onLongPress: (event: PointerEvent) => void;
11
+ }
12
+ /**
13
+ * Passive — does not consume the pointer; movement past `tolerance`
14
+ * cancels silently so a sibling `PointerDragSource` can take over.
15
+ */
16
+ export declare class LongPressDetector extends CompositeDisposable {
17
+ private readonly element;
18
+ private readonly options;
19
+ private _pointerId;
20
+ private _startX;
21
+ private _startY;
22
+ private _timer;
23
+ private _moveListener;
24
+ private _upListener;
25
+ private _cancelListener;
26
+ constructor(element: HTMLElement, options: LongPressOptions);
27
+ private _onPointerDown;
28
+ private _installContextMenuGuard;
29
+ private _installClickGuard;
30
+ private _cancelPending;
31
+ dispose(): void;
32
+ }
@@ -0,0 +1,151 @@
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.LongPressDetector = void 0;
19
+ var events_1 = require("../../events");
20
+ var lifecycle_1 = require("../../lifecycle");
21
+ var DEFAULT_DELAY = 500;
22
+ var DEFAULT_TOLERANCE = 8;
23
+ /**
24
+ * Passive — does not consume the pointer; movement past `tolerance`
25
+ * cancels silently so a sibling `PointerDragSource` can take over.
26
+ */
27
+ var LongPressDetector = /** @class */ (function (_super) {
28
+ __extends(LongPressDetector, _super);
29
+ function LongPressDetector(element, options) {
30
+ var _this = _super.call(this) || this;
31
+ _this.element = element;
32
+ _this.options = options;
33
+ _this._startX = 0;
34
+ _this._startY = 0;
35
+ _this.addDisposables((0, events_1.addDisposableListener)(_this.element, 'pointerdown', function (e) {
36
+ _this._onPointerDown(e);
37
+ }));
38
+ return _this;
39
+ }
40
+ LongPressDetector.prototype._onPointerDown = function (event) {
41
+ var _this = this;
42
+ var _a, _b, _c, _d, _e;
43
+ var touchOnly = (_a = this.options.touchOnly) !== null && _a !== void 0 ? _a : true;
44
+ if (touchOnly &&
45
+ event.pointerType !== 'touch' &&
46
+ event.pointerType !== 'pen') {
47
+ return;
48
+ }
49
+ // Defensive — supersede any in-flight press.
50
+ this._cancelPending();
51
+ this._pointerId = event.pointerId;
52
+ this._startX = event.clientX;
53
+ this._startY = event.clientY;
54
+ var delay = (_b = this.options.delay) !== null && _b !== void 0 ? _b : DEFAULT_DELAY;
55
+ var tolerance = (_c = this.options.tolerance) !== null && _c !== void 0 ? _c : DEFAULT_TOLERANCE;
56
+ // Source's owning window — popout drags fire on their own window.
57
+ var targetWindow = (_e = (_d = this.element.ownerDocument) === null || _d === void 0 ? void 0 : _d.defaultView) !== null && _e !== void 0 ? _e : window;
58
+ this._timer = setTimeout(function () {
59
+ _this._timer = undefined;
60
+ _this._cancelPending();
61
+ // Touch browsers synthesize a compatibility `contextmenu` event
62
+ // for long-press. preventDefault on the original pointerdown is
63
+ // too late (already dispatched), so install a one-shot
64
+ // capture-phase guard for the next contextmenu. Without this,
65
+ // consumers that don't preventDefault inside their onLongPress
66
+ // (or that early-return before doing so) leak the browser's
67
+ // native menu on top of theirs.
68
+ _this._installContextMenuGuard(targetWindow);
69
+ // Same idea for `click`: when the user releases their finger
70
+ // after the long-press, touch browsers dispatch a `click` to
71
+ // the element the touch ended on (the source). Consumers
72
+ // typically wire click to a primary action (e.g. tab activate,
73
+ // tab-group chip collapse-toggle). Without this guard, the
74
+ // long-press immediately fires both the context menu AND the
75
+ // primary action — and the action's side effects (e.g. a chip
76
+ // collapse animation) read as a screen wobble while the menu
77
+ // is supposed to be open. Scoped to the source element so
78
+ // clicks on menu items elsewhere remain effective.
79
+ _this._installClickGuard(targetWindow);
80
+ _this.options.onLongPress(event);
81
+ }, delay);
82
+ this._moveListener = (0, events_1.addDisposableListener)(targetWindow, 'pointermove', function (moveEvent) {
83
+ if (moveEvent.pointerId !== _this._pointerId) {
84
+ return;
85
+ }
86
+ var dx = moveEvent.clientX - _this._startX;
87
+ var dy = moveEvent.clientY - _this._startY;
88
+ if (Math.hypot(dx, dy) > tolerance) {
89
+ _this._cancelPending();
90
+ }
91
+ });
92
+ this._upListener = (0, events_1.addDisposableListener)(targetWindow, 'pointerup', function (upEvent) {
93
+ if (upEvent.pointerId !== _this._pointerId) {
94
+ return;
95
+ }
96
+ _this._cancelPending();
97
+ });
98
+ this._cancelListener = (0, events_1.addDisposableListener)(targetWindow, 'pointercancel', function (cancelEvent) {
99
+ if (cancelEvent.pointerId !== _this._pointerId) {
100
+ return;
101
+ }
102
+ _this._cancelPending();
103
+ });
104
+ };
105
+ LongPressDetector.prototype._installContextMenuGuard = function (targetWindow) {
106
+ var guard;
107
+ var timeout = setTimeout(function () { return guard === null || guard === void 0 ? void 0 : guard.dispose(); }, 500);
108
+ guard = (0, events_1.addDisposableListener)(targetWindow, 'contextmenu', function (event) {
109
+ event.preventDefault();
110
+ clearTimeout(timeout);
111
+ guard === null || guard === void 0 ? void 0 : guard.dispose();
112
+ }, { capture: true });
113
+ };
114
+ LongPressDetector.prototype._installClickGuard = function (targetWindow) {
115
+ var _this = this;
116
+ var guard;
117
+ var timeout = setTimeout(function () { return guard === null || guard === void 0 ? void 0 : guard.dispose(); }, 500);
118
+ guard = (0, events_1.addDisposableListener)(targetWindow, 'click', function (event) {
119
+ // Only suppress clicks targeted at the long-pressed element
120
+ // or its descendants. A user tap on a context menu item (or
121
+ // anywhere else) still gets through unchanged.
122
+ var target = event.target;
123
+ if (target && _this.element.contains(target)) {
124
+ event.preventDefault();
125
+ event.stopPropagation();
126
+ }
127
+ clearTimeout(timeout);
128
+ guard === null || guard === void 0 ? void 0 : guard.dispose();
129
+ }, { capture: true });
130
+ };
131
+ LongPressDetector.prototype._cancelPending = function () {
132
+ var _a, _b, _c;
133
+ if (this._timer !== undefined) {
134
+ clearTimeout(this._timer);
135
+ this._timer = undefined;
136
+ }
137
+ this._pointerId = undefined;
138
+ (_a = this._moveListener) === null || _a === void 0 ? void 0 : _a.dispose();
139
+ (_b = this._upListener) === null || _b === void 0 ? void 0 : _b.dispose();
140
+ (_c = this._cancelListener) === null || _c === void 0 ? void 0 : _c.dispose();
141
+ this._moveListener = undefined;
142
+ this._upListener = undefined;
143
+ this._cancelListener = undefined;
144
+ };
145
+ LongPressDetector.prototype.dispose = function () {
146
+ this._cancelPending();
147
+ _super.prototype.dispose.call(this);
148
+ };
149
+ return LongPressDetector;
150
+ }(lifecycle_1.CompositeDisposable));
151
+ exports.LongPressDetector = LongPressDetector;
@@ -0,0 +1,60 @@
1
+ import { Event } from '../../events';
2
+ import { CompositeDisposable, IDisposable } from '../../lifecycle';
3
+ import { PointerGhost } from './pointerGhost';
4
+ import { IPointerDropTargetHandle, PointerDragEvent } from './types';
5
+ export interface ActiveDrag {
6
+ readonly pointerId: number;
7
+ readonly startX: number;
8
+ readonly startY: number;
9
+ readonly source: HTMLElement;
10
+ }
11
+ /**
12
+ * Singleton — only one pointer-driven drag active at a time.
13
+ *
14
+ * State is shared across every Dockview instance on the page. Targets
15
+ * from instance B receive hit-tests from drags originating in instance A;
16
+ * that's intentional for cross-instance drops since `LocalSelectionTransfer`
17
+ * is also process-wide. The corollary is that every Tabs subscriber to
18
+ * `onDragMove` fires for every pointer drag globally — each subscriber
19
+ * hit-tests against its own DOM, so this is O(N) per pointermove where N
20
+ * is the number of registered listeners across all instances.
21
+ */
22
+ export declare class PointerDragController extends CompositeDisposable {
23
+ private static _instance;
24
+ static getInstance(): PointerDragController;
25
+ private readonly _targets;
26
+ /** Kept in sync with `_targets` so hit-testing is allocation-free. */
27
+ private readonly _targetByElement;
28
+ private _active;
29
+ private _currentTarget;
30
+ private _dataDisposable;
31
+ private _ghost;
32
+ private _moveListener;
33
+ private _upListener;
34
+ private _cancelListener;
35
+ private _iframeShield;
36
+ private _onDragMoveCallback?;
37
+ private _onDragEndCallback?;
38
+ private readonly _onDragStart;
39
+ readonly onDragStart: Event<PointerDragEvent>;
40
+ private readonly _onDragMove;
41
+ readonly onDragMove: Event<PointerDragEvent>;
42
+ private readonly _onDragEnd;
43
+ readonly onDragEnd: Event<PointerDragEvent>;
44
+ private constructor();
45
+ get active(): ActiveDrag | undefined;
46
+ registerTarget(target: IPointerDropTargetHandle): IDisposable;
47
+ beginDrag(args: {
48
+ pointerEvent: PointerEvent;
49
+ source: HTMLElement;
50
+ getData: () => IDisposable;
51
+ ghost?: PointerGhost;
52
+ onDragMove?: (e: PointerDragEvent) => void;
53
+ onDragEnd?: (e: PointerDragEvent, dropped: boolean) => void;
54
+ }): void;
55
+ cancel(): void;
56
+ private _findTargetUnder;
57
+ private _handleMove;
58
+ private _handleEnd;
59
+ private _teardown;
60
+ }