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
package/README.md CHANGED
@@ -26,6 +26,7 @@ Please see the website: https://dockview.dev
26
26
  - Support for split-views, grid-views and 'dockable' views
27
27
  - Themeable and customizable
28
28
  - Tab and Group docking / Drag n' Drop
29
+ - Touch & mobile support
29
30
  - Popout Windows
30
31
  - Floating Groups
31
32
  - Edge Groups
@@ -0,0 +1,70 @@
1
+ import { IDisposable } from '../lifecycle';
2
+ import { DroptargetOptions, IDropTarget } from './droptarget';
3
+ /**
4
+ * Backend factory surface. Each implementation hides one concrete DnD
5
+ * mechanism (HTML5 native events, pointer events) behind a uniform set of
6
+ * `createX` methods.
7
+ *
8
+ * The backends are stateless — `html5Backend` and `pointerBackend` below
9
+ * are exported as module-level singletons so they need no construction
10
+ * or wiring through the component tree.
11
+ */
12
+ export interface IDragBackend {
13
+ /** Stable identifier, mostly for debugging / tests. */
14
+ readonly kind: 'html5' | 'pointer';
15
+ createDropTarget(element: HTMLElement, options: DroptargetOptions): IDropTarget;
16
+ createDragSource(element: HTMLElement, options: DragSourceOptions): IDragSource;
17
+ }
18
+ /**
19
+ * Visual specification handed to the backend. HTML5 calls `setDragImage`
20
+ * with `(element, offsetX, offsetY)` and discards the element after a
21
+ * microtask. Pointer wraps the element in a `PointerGhost` that follows
22
+ * the cursor for the duration of the drag.
23
+ */
24
+ export interface IDragGhostSpec {
25
+ element: HTMLElement;
26
+ /** Pixels from cursor to ghost's top-left. Default 0. */
27
+ offsetX?: number;
28
+ offsetY?: number;
29
+ /**
30
+ * Called when the backend is done with the ghost. HTML5 fires it after
31
+ * the drag-image snapshot is captured (next tick); pointer fires it
32
+ * when the follow-cursor ghost is removed at drag end. Use for custom
33
+ * framework renderers that need teardown.
34
+ */
35
+ dispose?: () => void;
36
+ }
37
+ export interface DragSourceOptions {
38
+ /** Populate transfer; returned disposer clears it on drag end. */
39
+ getData: (event: DragEvent | PointerEvent) => IDisposable;
40
+ /** Veto a drag at start time. */
41
+ isCancelled?: (event: DragEvent | PointerEvent) => boolean;
42
+ createGhost?: (event: DragEvent | PointerEvent) => IDragGhostSpec | undefined;
43
+ onDragStart?: (event: DragEvent | PointerEvent) => void;
44
+ onDragEnd?: (event: DragEvent | PointerEvent) => void;
45
+ /** Initial disabled state; toggle later via `setDisabled`. */
46
+ disabled?: boolean;
47
+ /**
48
+ * Pointer-only. When true (default), the pointer backend ignores mouse
49
+ * pointers and lets the HTML5 path handle them. HTML5 backend ignores.
50
+ */
51
+ touchOnly?: boolean;
52
+ /**
53
+ * Pointer-only long-press delay in ms. May be a function so the value
54
+ * can vary per gesture (e.g. floating-group redock vs docked rearrange).
55
+ */
56
+ touchInitiationDelay?: number | (() => number);
57
+ /** Pointer-only pre-arm movement tolerance in px. May also be a function. */
58
+ pressTolerance?: number | (() => number);
59
+ /** Pointer-only movement threshold to promote pointerdown → drag. */
60
+ threshold?: number;
61
+ }
62
+ export interface IDragSource extends IDisposable {
63
+ setDisabled(value: boolean): void;
64
+ /** Pointer-only knob; no-op on HTML5 backend. */
65
+ setTouchOnly(value: boolean): void;
66
+ /** Pointer-only; no-op on HTML5 backend. */
67
+ cancelPending(): void;
68
+ }
69
+ export declare const html5Backend: IDragBackend;
70
+ export declare const pointerBackend: IDragBackend;
@@ -0,0 +1,171 @@
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.pointerBackend = exports.html5Backend = void 0;
19
+ var events_1 = require("../events");
20
+ var lifecycle_1 = require("../lifecycle");
21
+ var droptarget_1 = require("./droptarget");
22
+ var ghost_1 = require("./ghost");
23
+ var pointerDropTarget_1 = require("./pointer/pointerDropTarget");
24
+ var pointerDragSource_1 = require("./pointer/pointerDragSource");
25
+ var pointerGhost_1 = require("./pointer/pointerGhost");
26
+ var dom_1 = require("../dom");
27
+ /**
28
+ * HTML5 drag source. Listens for the native `dragstart` event, calls
29
+ * `getData` to populate transfer, optionally renders the ghost via
30
+ * `setDragImage`, fires `onDragStart` / `onDragEnd`, and tears down the
31
+ * transfer disposer after `dragend`.
32
+ */
33
+ var Html5DragSource = /** @class */ (function (_super) {
34
+ __extends(Html5DragSource, _super);
35
+ function Html5DragSource(el, opts) {
36
+ var _this = _super.call(this) || this;
37
+ _this.el = el;
38
+ _this.opts = opts;
39
+ _this._dataDisposable = new lifecycle_1.MutableDisposable();
40
+ _this._pointerEventsDisposable = new lifecycle_1.MutableDisposable();
41
+ _this._disabled = !!opts.disabled;
42
+ _this.addDisposables(_this._dataDisposable, _this._pointerEventsDisposable, (0, events_1.addDisposableListener)(_this.el, 'dragstart', function (event) {
43
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
44
+ if (event.defaultPrevented ||
45
+ _this._disabled ||
46
+ ((_b = (_a = _this.opts).isCancelled) === null || _b === void 0 ? void 0 : _b.call(_a, event))) {
47
+ event.preventDefault();
48
+ return;
49
+ }
50
+ // Iframes capture pointermove once the cursor enters them,
51
+ // which freezes drag tracking from the parent window's
52
+ // POV. Shield the source's owning document so popout-window
53
+ // drags shield the popout, not the main window.
54
+ var iframes = (0, dom_1.disableIframePointEvents)((_c = _this.el.ownerDocument) !== null && _c !== void 0 ? _c : document);
55
+ _this._pointerEventsDisposable.value = {
56
+ dispose: function () { return iframes.release(); },
57
+ };
58
+ _this.el.classList.add('dv-dragged');
59
+ setTimeout(function () { return _this.el.classList.remove('dv-dragged'); }, 0);
60
+ _this._dataDisposable.value = _this.opts.getData(event);
61
+ var ghost = (_e = (_d = _this.opts).createGhost) === null || _e === void 0 ? void 0 : _e.call(_d, event);
62
+ if (ghost && event.dataTransfer) {
63
+ (0, ghost_1.addGhostImage)(event.dataTransfer, ghost.element, {
64
+ x: (_f = ghost.offsetX) !== null && _f !== void 0 ? _f : 0,
65
+ y: (_g = ghost.offsetY) !== null && _g !== void 0 ? _g : 0,
66
+ });
67
+ if (ghost.dispose) {
68
+ // addGhostImage removes the element from the DOM on
69
+ // the next tick; dispose the framework renderer on
70
+ // the same schedule.
71
+ var disposeGhost_1 = ghost.dispose;
72
+ setTimeout(function () { return disposeGhost_1(); }, 0);
73
+ }
74
+ }
75
+ if (event.dataTransfer) {
76
+ event.dataTransfer.effectAllowed = 'move';
77
+ // Some third-party DnD libs (e.g. react-dnd) cancel the
78
+ // dragstart when `dataTransfer.types` is empty.
79
+ if (event.dataTransfer.items.length === 0) {
80
+ event.dataTransfer.setData('text/plain', '');
81
+ }
82
+ }
83
+ (_j = (_h = _this.opts).onDragStart) === null || _j === void 0 ? void 0 : _j.call(_h, event);
84
+ }), (0, events_1.addDisposableListener)(_this.el, 'dragend', function (event) {
85
+ var _a, _b;
86
+ _this._pointerEventsDisposable.dispose();
87
+ // Defer disposal so drop handlers can still read the
88
+ // transfer payload before it clears.
89
+ setTimeout(function () { return _this._dataDisposable.dispose(); }, 0);
90
+ (_b = (_a = _this.opts).onDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, event);
91
+ }));
92
+ return _this;
93
+ }
94
+ Html5DragSource.prototype.setDisabled = function (value) {
95
+ this._disabled = value;
96
+ };
97
+ Html5DragSource.prototype.setTouchOnly = function (_) {
98
+ // No-op — HTML5 path can't filter by pointer type.
99
+ };
100
+ Html5DragSource.prototype.cancelPending = function () {
101
+ // No-op — HTML5 has no pre-arm phase to cancel.
102
+ };
103
+ return Html5DragSource;
104
+ }(lifecycle_1.CompositeDisposable));
105
+ var Html5DragBackend = /** @class */ (function () {
106
+ function Html5DragBackend() {
107
+ this.kind = 'html5';
108
+ }
109
+ Html5DragBackend.prototype.createDropTarget = function (element, options) {
110
+ return new droptarget_1.Droptarget(element, options);
111
+ };
112
+ Html5DragBackend.prototype.createDragSource = function (element, options) {
113
+ return new Html5DragSource(element, options);
114
+ };
115
+ return Html5DragBackend;
116
+ }());
117
+ var PointerDragBackend = /** @class */ (function () {
118
+ function PointerDragBackend() {
119
+ this.kind = 'pointer';
120
+ }
121
+ PointerDragBackend.prototype.createDropTarget = function (element, options) {
122
+ return new pointerDropTarget_1.PointerDropTarget(element, options);
123
+ };
124
+ PointerDragBackend.prototype.createDragSource = function (element, options) {
125
+ var pointerCreateGhost = options.createGhost
126
+ ? function (event) {
127
+ var spec = options.createGhost(event);
128
+ if (!spec) {
129
+ return undefined;
130
+ }
131
+ var ghost = new pointerGhost_1.PointerGhost({
132
+ element: spec.element,
133
+ initialX: event.clientX,
134
+ initialY: event.clientY,
135
+ offsetX: spec.offsetX,
136
+ offsetY: spec.offsetY,
137
+ owner: element,
138
+ });
139
+ if (spec.dispose) {
140
+ var baseDispose_1 = ghost.dispose.bind(ghost);
141
+ var disposeSpec_1 = spec.dispose;
142
+ ghost.dispose = function () {
143
+ baseDispose_1();
144
+ disposeSpec_1();
145
+ };
146
+ }
147
+ return ghost;
148
+ }
149
+ : undefined;
150
+ var source = new pointerDragSource_1.PointerDragSource(element, {
151
+ getData: options.getData,
152
+ isCancelled: options.isCancelled,
153
+ onDragStart: options.onDragStart,
154
+ onDragEnd: options.onDragEnd
155
+ ? function (event) { return options.onDragEnd(event.pointerEvent); }
156
+ : undefined,
157
+ createGhost: pointerCreateGhost,
158
+ touchOnly: options.touchOnly,
159
+ touchInitiationDelay: options.touchInitiationDelay,
160
+ pressTolerance: options.pressTolerance,
161
+ threshold: options.threshold,
162
+ });
163
+ if (options.disabled) {
164
+ source.setDisabled(true);
165
+ }
166
+ return source;
167
+ };
168
+ return PointerDragBackend;
169
+ }());
170
+ exports.html5Backend = new Html5DragBackend();
171
+ exports.pointerBackend = new PointerDragBackend();
@@ -0,0 +1,20 @@
1
+ import { DropTargetTargetModel, DroptargetOverlayModel, Position } from './droptarget';
2
+ export interface OverlayElements {
3
+ dropzone: HTMLElement;
4
+ selection: HTMLElement;
5
+ }
6
+ export declare function createOverlayElements(): OverlayElements;
7
+ export declare function renderInPlaceOverlay(overlay: HTMLElement, quadrant: Position, width: number, height: number, overlayModel?: DroptargetOverlayModel): void;
8
+ /** `boundsChanged: false` lets callers skip redundant work on tight drag loops. */
9
+ export declare function renderAnchoredOverlay(args: {
10
+ outlineElement: HTMLElement;
11
+ targetModel: DropTargetTargetModel;
12
+ quadrant: Position;
13
+ width: number;
14
+ height: number;
15
+ overlayModel?: DroptargetOverlayModel;
16
+ className?: string;
17
+ }): {
18
+ boundsChanged: boolean;
19
+ targetChanged: boolean;
20
+ };
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ // Two render paths: in-place (dropzone appended to drop element) and
3
+ // anchored (overlay rendered into an external anchor container).
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.createOverlayElements = createOverlayElements;
6
+ exports.renderInPlaceOverlay = renderInPlaceOverlay;
7
+ exports.renderAnchoredOverlay = renderAnchoredOverlay;
8
+ var dom_1 = require("../dom");
9
+ var math_1 = require("../math");
10
+ var DEFAULT_SIZE = { value: 50, type: 'percentage' };
11
+ var SMALL_WIDTH_BOUNDARY = 100;
12
+ var SMALL_HEIGHT_BOUNDARY = 100;
13
+ function createOverlayElements() {
14
+ var dropzone = document.createElement('div');
15
+ dropzone.className = 'dv-drop-target-dropzone';
16
+ var selection = document.createElement('div');
17
+ selection.className = 'dv-drop-target-selection';
18
+ dropzone.appendChild(selection);
19
+ return { dropzone: dropzone, selection: selection };
20
+ }
21
+ function computeOverlayShape(quadrant, width, height, overlayModel) {
22
+ var _a, _b, _c;
23
+ var smallWidthBoundary = (_a = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.smallWidthBoundary) !== null && _a !== void 0 ? _a : SMALL_WIDTH_BOUNDARY;
24
+ var smallHeightBoundary = (_b = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.smallHeightBoundary) !== null && _b !== void 0 ? _b : SMALL_HEIGHT_BOUNDARY;
25
+ var isSmallX = width < smallWidthBoundary;
26
+ var isSmallY = height < smallHeightBoundary;
27
+ var isLeft = quadrant === 'left';
28
+ var isRight = quadrant === 'right';
29
+ var isTop = quadrant === 'top';
30
+ var isBottom = quadrant === 'bottom';
31
+ var rightClass = !isSmallX && isRight;
32
+ var leftClass = !isSmallX && isLeft;
33
+ var topClass = !isSmallY && isTop;
34
+ var bottomClass = !isSmallY && isBottom;
35
+ var size = 1;
36
+ var sizeOptions = (_c = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.size) !== null && _c !== void 0 ? _c : DEFAULT_SIZE;
37
+ if (sizeOptions.type === 'percentage') {
38
+ size = (0, math_1.clamp)(sizeOptions.value, 0, 100) / 100;
39
+ }
40
+ else {
41
+ if (rightClass || leftClass) {
42
+ size = (0, math_1.clamp)(0, sizeOptions.value, width) / width;
43
+ }
44
+ if (topClass || bottomClass) {
45
+ size = (0, math_1.clamp)(0, sizeOptions.value, height) / height;
46
+ }
47
+ }
48
+ return {
49
+ isSmallX: isSmallX,
50
+ isSmallY: isSmallY,
51
+ isLeft: isLeft,
52
+ isRight: isRight,
53
+ isTop: isTop,
54
+ isBottom: isBottom,
55
+ rightClass: rightClass,
56
+ leftClass: leftClass,
57
+ topClass: topClass,
58
+ bottomClass: bottomClass,
59
+ size: size,
60
+ };
61
+ }
62
+ function renderInPlaceOverlay(overlay, quadrant, width, height, overlayModel) {
63
+ var shape = computeOverlayShape(quadrant, width, height, overlayModel);
64
+ var rightClass = shape.rightClass, leftClass = shape.leftClass, topClass = shape.topClass, bottomClass = shape.bottomClass, size = shape.size;
65
+ var box = { top: '0px', left: '0px', width: '100%', height: '100%' };
66
+ if (rightClass) {
67
+ box.left = "".concat(100 * (1 - size), "%");
68
+ box.width = "".concat(100 * size, "%");
69
+ }
70
+ else if (leftClass) {
71
+ box.width = "".concat(100 * size, "%");
72
+ }
73
+ else if (topClass) {
74
+ box.height = "".concat(100 * size, "%");
75
+ }
76
+ else if (bottomClass) {
77
+ box.top = "".concat(100 * (1 - size), "%");
78
+ box.height = "".concat(100 * size, "%");
79
+ }
80
+ if (shape.isSmallX && shape.isLeft) {
81
+ box.width = '4px';
82
+ }
83
+ if (shape.isSmallX && shape.isRight) {
84
+ box.left = "".concat(width - 4, "px");
85
+ box.width = '4px';
86
+ }
87
+ if (shape.isSmallY && shape.isTop) {
88
+ box.height = '4px';
89
+ }
90
+ if (shape.isSmallY && shape.isBottom) {
91
+ box.top = "".concat(height - 4, "px");
92
+ box.height = '4px';
93
+ }
94
+ overlay.style.top = box.top;
95
+ overlay.style.left = box.left;
96
+ overlay.style.width = box.width;
97
+ overlay.style.height = box.height;
98
+ overlay.style.visibility = 'visible';
99
+ if (!overlay.style.transform || overlay.style.transform === '') {
100
+ overlay.style.transform = 'translate3d(0, 0, 0)';
101
+ }
102
+ var isLine = (shape.isSmallX && (shape.isLeft || shape.isRight)) ||
103
+ (shape.isSmallY && (shape.isTop || shape.isBottom));
104
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-small-vertical', shape.isSmallY);
105
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-small-horizontal', shape.isSmallX);
106
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-selection-line', isLine);
107
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-left', shape.isLeft);
108
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-right', shape.isRight);
109
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-top', shape.isTop);
110
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-bottom', shape.isBottom);
111
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-center', quadrant === 'center');
112
+ }
113
+ function checkAnchoredBoundsChanged(overlay, bounds) {
114
+ var topPx = "".concat(Math.round(bounds.top), "px");
115
+ var leftPx = "".concat(Math.round(bounds.left), "px");
116
+ var widthPx = "".concat(Math.round(bounds.width), "px");
117
+ var heightPx = "".concat(Math.round(bounds.height), "px");
118
+ return (overlay.style.top !== topPx ||
119
+ overlay.style.left !== leftPx ||
120
+ overlay.style.width !== widthPx ||
121
+ overlay.style.height !== heightPx);
122
+ }
123
+ function applyAnchoredBounds(overlay, bounds) {
124
+ overlay.style.top = "".concat(Math.round(bounds.top), "px");
125
+ overlay.style.left = "".concat(Math.round(bounds.left), "px");
126
+ overlay.style.width = "".concat(Math.round(bounds.width), "px");
127
+ overlay.style.height = "".concat(Math.round(bounds.height), "px");
128
+ overlay.style.visibility = 'visible';
129
+ if (!overlay.style.transform || overlay.style.transform === '') {
130
+ overlay.style.transform = 'translate3d(0, 0, 0)';
131
+ }
132
+ }
133
+ /** `boundsChanged: false` lets callers skip redundant work on tight drag loops. */
134
+ function renderAnchoredOverlay(args) {
135
+ var shape = computeOverlayShape(args.quadrant, args.width, args.height, args.overlayModel);
136
+ var rightClass = shape.rightClass, leftClass = shape.leftClass, topClass = shape.topClass, bottomClass = shape.bottomClass, size = shape.size;
137
+ var elBox = args.outlineElement.getBoundingClientRect();
138
+ var ta = args.targetModel.getElements(undefined, args.outlineElement);
139
+ var el = ta.root;
140
+ var overlay = ta.overlay;
141
+ var bigbox = el.getBoundingClientRect();
142
+ var rootTop = elBox.top - bigbox.top;
143
+ var rootLeft = elBox.left - bigbox.left;
144
+ var box = {
145
+ top: rootTop,
146
+ left: rootLeft,
147
+ width: args.width,
148
+ height: args.height,
149
+ };
150
+ if (rightClass) {
151
+ box.left = rootLeft + args.width * (1 - size);
152
+ box.width = args.width * size;
153
+ }
154
+ else if (leftClass) {
155
+ box.width = args.width * size;
156
+ }
157
+ else if (topClass) {
158
+ box.height = args.height * size;
159
+ }
160
+ else if (bottomClass) {
161
+ box.top = rootTop + args.height * (1 - size);
162
+ box.height = args.height * size;
163
+ }
164
+ if (shape.isSmallX && shape.isLeft) {
165
+ box.width = 4;
166
+ }
167
+ if (shape.isSmallX && shape.isRight) {
168
+ box.left = rootLeft + args.width - 4;
169
+ box.width = 4;
170
+ }
171
+ if (shape.isSmallY && shape.isTop) {
172
+ box.height = 4;
173
+ }
174
+ if (shape.isSmallY && shape.isBottom) {
175
+ box.top = rootTop + args.height - 4;
176
+ box.height = 4;
177
+ }
178
+ if (!checkAnchoredBoundsChanged(overlay, box)) {
179
+ return { boundsChanged: false, targetChanged: ta.changed };
180
+ }
181
+ applyAnchoredBounds(overlay, box);
182
+ overlay.className = "dv-drop-target-anchor".concat(args.className ? " ".concat(args.className) : '');
183
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-left', shape.isLeft);
184
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-right', shape.isRight);
185
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-top', shape.isTop);
186
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-bottom', shape.isBottom);
187
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-anchor-line', (shape.isSmallX && (shape.isLeft || shape.isRight)) ||
188
+ (shape.isSmallY && (shape.isTop || shape.isBottom)));
189
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-center', args.quadrant === 'center');
190
+ if (ta.changed) {
191
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-anchor-container-changed', true);
192
+ setTimeout(function () {
193
+ (0, dom_1.toggleClass)(overlay, 'dv-drop-target-anchor-container-changed', false);
194
+ }, 10);
195
+ }
196
+ return { boundsChanged: true, targetChanged: ta.changed };
197
+ }
@@ -1,24 +1,25 @@
1
1
  import { DockviewEvent, Event } from '../events';
2
- import { CompositeDisposable } from '../lifecycle';
2
+ import { CompositeDisposable, IDisposable } from '../lifecycle';
3
3
  import { DragAndDropObserver } from './dnd';
4
4
  import { Direction } from '../gridview/baseComponentGridview';
5
5
  export interface DroptargetEvent {
6
6
  readonly position: Position;
7
- readonly nativeEvent: DragEvent;
7
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
8
+ readonly nativeEvent: DragEvent | PointerEvent;
8
9
  }
9
10
  export declare class WillShowOverlayEvent extends DockviewEvent implements DroptargetEvent {
10
11
  private readonly options;
11
- get nativeEvent(): DragEvent;
12
+ get nativeEvent(): DragEvent | PointerEvent;
12
13
  get position(): Position;
13
14
  constructor(options: {
14
- nativeEvent: DragEvent;
15
+ nativeEvent: DragEvent | PointerEvent;
15
16
  position: Position;
16
17
  });
17
18
  }
18
19
  export declare function directionToPosition(direction: Direction): Position;
19
20
  export declare function positionToDirection(position: Position): Direction;
20
21
  export type Position = 'top' | 'bottom' | 'left' | 'right' | 'center';
21
- export type CanDisplayOverlay = (dragEvent: DragEvent, state: Position) => boolean;
22
+ export type CanDisplayOverlay = (dragEvent: DragEvent | PointerEvent, state: Position) => boolean;
22
23
  export type MeasuredValue = {
23
24
  value: number;
24
25
  type: 'pixels' | 'percentage';
@@ -56,7 +57,20 @@ export interface DroptargetOptions {
56
57
  className?: string;
57
58
  getOverlayOutline?: () => HTMLElement | null;
58
59
  }
59
- export declare class Droptarget extends CompositeDisposable {
60
+ /**
61
+ * Backend-agnostic drop target. Both the HTML5 `Droptarget` and the pointer
62
+ * `PointerDropTarget` implement this shape so consumers can hold one field
63
+ * regardless of which DnD backend produced it.
64
+ */
65
+ export interface IDropTarget extends IDisposable {
66
+ readonly onDrop: Event<DroptargetEvent>;
67
+ readonly onWillShowOverlay: Event<WillShowOverlayEvent>;
68
+ readonly state: Position | undefined;
69
+ disabled: boolean;
70
+ setTargetZones(zones: Position[]): void;
71
+ setOverlayModel(model: DroptargetOverlayModel): void;
72
+ }
73
+ export declare class Droptarget extends CompositeDisposable implements IDropTarget {
60
74
  private readonly element;
61
75
  private readonly options;
62
76
  private targetElement;