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.
- package/README.md +1 -0
- package/dist/cjs/dnd/backend.d.ts +70 -0
- package/dist/cjs/dnd/backend.js +171 -0
- package/dist/cjs/dnd/dropOverlay.d.ts +20 -0
- package/dist/cjs/dnd/dropOverlay.js +197 -0
- package/dist/cjs/dnd/droptarget.d.ts +20 -6
- package/dist/cjs/dnd/droptarget.js +14 -208
- package/dist/cjs/dnd/pointer/index.d.ts +11 -0
- package/dist/cjs/dnd/pointer/index.js +13 -0
- package/dist/cjs/dnd/pointer/longPress.d.ts +32 -0
- package/dist/cjs/dnd/pointer/longPress.js +151 -0
- package/dist/cjs/dnd/pointer/pointerDragController.d.ts +60 -0
- package/dist/cjs/dnd/pointer/pointerDragController.js +241 -0
- package/dist/cjs/dnd/pointer/pointerDragSource.d.ts +61 -0
- package/dist/cjs/dnd/pointer/pointerDragSource.js +195 -0
- package/dist/cjs/dnd/pointer/pointerDropTarget.d.ts +39 -0
- package/dist/cjs/dnd/pointer/pointerDropTarget.js +198 -0
- package/dist/cjs/dnd/pointer/pointerGhost.d.ts +30 -0
- package/dist/cjs/dnd/pointer/pointerGhost.js +44 -0
- package/dist/cjs/dnd/pointer/types.d.ts +16 -0
- package/dist/cjs/dnd/pointer/types.js +2 -0
- package/dist/cjs/dockview/components/panel/content.d.ts +3 -1
- package/dist/cjs/dockview/components/panel/content.js +33 -16
- package/dist/cjs/dockview/components/popupService.js +34 -0
- package/dist/cjs/dockview/components/tab/tab.d.ts +11 -3
- package/dist/cjs/dockview/components/tab/tab.js +151 -117
- package/dist/cjs/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
- package/dist/cjs/dockview/components/titlebar/tabGroupChip.js +15 -6
- package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +33 -5
- package/dist/cjs/dockview/components/titlebar/tabGroups.js +231 -40
- package/dist/cjs/dockview/components/titlebar/tabs.d.ts +38 -1
- package/dist/cjs/dockview/components/titlebar/tabs.js +372 -251
- package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +5 -3
- package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +6 -2
- package/dist/cjs/dockview/components/titlebar/voidContainer.js +189 -27
- package/dist/cjs/dockview/contextMenu.js +19 -4
- package/dist/cjs/dockview/dndCapabilities.d.ts +19 -0
- package/dist/cjs/dockview/dndCapabilities.js +39 -0
- package/dist/cjs/dockview/dockviewComponent.d.ts +1 -0
- package/dist/cjs/dockview/dockviewComponent.js +54 -33
- package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +9 -5
- package/dist/cjs/dockview/dockviewGroupPanelModel.js +25 -11
- package/dist/cjs/dockview/events.d.ts +2 -1
- package/dist/cjs/dockview/events.js +1 -0
- package/dist/cjs/dockview/options.d.ts +18 -3
- package/dist/cjs/dockview/options.js +1 -0
- package/dist/cjs/dom.js +7 -3
- package/dist/cjs/overlay/overlay.d.ts +12 -0
- package/dist/cjs/overlay/overlay.js +84 -16
- package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
- package/dist/cjs/paneview/draggablePaneviewPanel.js +27 -26
- package/dist/cjs/paneview/options.d.ts +4 -3
- package/dist/dockview-core.js +2199 -834
- package/dist/dockview-core.min.js +2 -2
- package/dist/dockview-core.min.js.map +1 -1
- package/dist/dockview-core.min.noStyle.js +2 -2
- package/dist/dockview-core.min.noStyle.js.map +1 -1
- package/dist/dockview-core.noStyle.js +2202 -837
- package/dist/esm/dnd/backend.d.ts +70 -0
- package/dist/esm/dnd/backend.js +148 -0
- package/dist/esm/dnd/dropOverlay.d.ts +20 -0
- package/dist/esm/dnd/dropOverlay.js +192 -0
- package/dist/esm/dnd/droptarget.d.ts +20 -6
- package/dist/esm/dnd/droptarget.js +16 -210
- package/dist/esm/dnd/pointer/index.d.ts +11 -0
- package/dist/esm/dnd/pointer/index.js +5 -0
- package/dist/esm/dnd/pointer/longPress.d.ts +32 -0
- package/dist/esm/dnd/pointer/longPress.js +127 -0
- package/dist/esm/dnd/pointer/pointerDragController.d.ts +60 -0
- package/dist/esm/dnd/pointer/pointerDragController.js +191 -0
- package/dist/esm/dnd/pointer/pointerDragSource.d.ts +61 -0
- package/dist/esm/dnd/pointer/pointerDragSource.js +171 -0
- package/dist/esm/dnd/pointer/pointerDropTarget.d.ts +39 -0
- package/dist/esm/dnd/pointer/pointerDropTarget.js +168 -0
- package/dist/esm/dnd/pointer/pointerGhost.d.ts +30 -0
- package/dist/esm/dnd/pointer/pointerGhost.js +39 -0
- package/dist/esm/dnd/pointer/types.d.ts +16 -0
- package/dist/esm/dnd/pointer/types.js +1 -0
- package/dist/esm/dockview/components/panel/content.d.ts +3 -1
- package/dist/esm/dockview/components/panel/content.js +33 -16
- package/dist/esm/dockview/components/popupService.js +34 -0
- package/dist/esm/dockview/components/tab/tab.d.ts +11 -3
- package/dist/esm/dockview/components/tab/tab.js +139 -114
- package/dist/esm/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
- package/dist/esm/dockview/components/titlebar/tabGroupChip.js +15 -6
- package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +33 -5
- package/dist/esm/dockview/components/titlebar/tabGroups.js +177 -12
- package/dist/esm/dockview/components/titlebar/tabs.d.ts +38 -1
- package/dist/esm/dockview/components/titlebar/tabs.js +348 -227
- package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +5 -3
- package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +6 -2
- package/dist/esm/dockview/components/titlebar/voidContainer.js +179 -31
- package/dist/esm/dockview/contextMenu.js +19 -4
- package/dist/esm/dockview/dndCapabilities.d.ts +19 -0
- package/dist/esm/dockview/dndCapabilities.js +36 -0
- package/dist/esm/dockview/dockviewComponent.d.ts +1 -0
- package/dist/esm/dockview/dockviewComponent.js +55 -34
- package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +9 -5
- package/dist/esm/dockview/dockviewGroupPanelModel.js +24 -11
- package/dist/esm/dockview/events.d.ts +2 -1
- package/dist/esm/dockview/events.js +1 -0
- package/dist/esm/dockview/options.d.ts +18 -3
- package/dist/esm/dockview/options.js +1 -0
- package/dist/esm/dom.js +7 -3
- package/dist/esm/overlay/overlay.d.ts +12 -0
- package/dist/esm/overlay/overlay.js +85 -17
- package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
- package/dist/esm/paneview/draggablePaneviewPanel.js +26 -20
- package/dist/esm/paneview/options.d.ts +4 -3
- package/dist/package/main.cjs.js +2202 -837
- package/dist/package/main.cjs.min.js +2 -2
- package/dist/package/main.esm.min.mjs +2 -2
- package/dist/package/main.esm.mjs +2202 -837
- package/dist/styles/dockview.css +117 -1
- package/package.json +3 -1
- package/dist/cjs/dnd/abstractDragHandler.d.ts +0 -14
- package/dist/cjs/dnd/abstractDragHandler.js +0 -86
- package/dist/cjs/dnd/groupDragHandler.d.ts +0 -12
- package/dist/cjs/dnd/groupDragHandler.js +0 -104
- package/dist/esm/dnd/abstractDragHandler.d.ts +0 -14
- package/dist/esm/dnd/abstractDragHandler.js +0 -63
- package/dist/esm/dnd/groupDragHandler.d.ts +0 -12
- 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
|
-
|
|
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
|
-
|
|
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;
|