dockview-core 6.2.2 → 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/api/dockviewGroupPanelApi.d.ts +10 -1
- package/dist/cjs/api/dockviewGroupPanelApi.js +16 -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/tabGroupIndicator.js +2 -2
- 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 +381 -253
- 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 +190 -22
- 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 +2 -0
- package/dist/cjs/dockview/dockviewComponent.js +241 -158
- package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +10 -5
- package/dist/cjs/dockview/dockviewGroupPanelModel.js +34 -11
- package/dist/cjs/dockview/dockviewPanel.js +5 -0
- package/dist/cjs/dockview/dockviewPanelModel.d.ts +2 -0
- package/dist/cjs/dockview/dockviewPanelModel.js +8 -0
- package/dist/cjs/dockview/events.d.ts +2 -1
- package/dist/cjs/dockview/events.js +1 -0
- package/dist/cjs/dockview/framework.d.ts +8 -0
- package/dist/cjs/dockview/options.d.ts +31 -5
- package/dist/cjs/dockview/options.js +3 -0
- package/dist/cjs/dom.d.ts +5 -1
- package/dist/cjs/dom.js +21 -5
- package/dist/cjs/index.d.ts +1 -1
- 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/cjs/popoutWindow.d.ts +2 -0
- package/dist/cjs/popoutWindow.js +3 -1
- package/dist/dockview-core.js +2431 -937
- 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 +2430 -936
- package/dist/esm/api/dockviewGroupPanelApi.d.ts +10 -1
- package/dist/esm/api/dockviewGroupPanelApi.js +12 -0
- 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/tabGroupIndicator.js +2 -2
- 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 +360 -229
- 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 +180 -26
- 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 +2 -0
- package/dist/esm/dockview/dockviewComponent.js +104 -41
- package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +10 -5
- package/dist/esm/dockview/dockviewGroupPanelModel.js +33 -11
- package/dist/esm/dockview/dockviewPanel.js +5 -0
- package/dist/esm/dockview/dockviewPanelModel.d.ts +2 -0
- package/dist/esm/dockview/dockviewPanelModel.js +8 -0
- package/dist/esm/dockview/events.d.ts +2 -1
- package/dist/esm/dockview/events.js +1 -0
- package/dist/esm/dockview/framework.d.ts +8 -0
- package/dist/esm/dockview/options.d.ts +31 -5
- package/dist/esm/dockview/options.js +3 -0
- package/dist/esm/dom.d.ts +5 -1
- package/dist/esm/dom.js +20 -5
- package/dist/esm/index.d.ts +1 -1
- 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/esm/popoutWindow.d.ts +2 -0
- package/dist/esm/popoutWindow.js +3 -1
- package/dist/package/main.cjs.js +2430 -936
- package/dist/package/main.cjs.min.js +2 -2
- package/dist/package/main.esm.min.mjs +2 -2
- package/dist/package/main.esm.mjs +2430 -936
- 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 -82
- 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 -59
package/dist/esm/dom.js
CHANGED
|
@@ -132,8 +132,10 @@ export function quasiPreventDefault(event) {
|
|
|
132
132
|
export function quasiDefaultPrevented(event) {
|
|
133
133
|
return event[QUASI_PREVENT_DEFAULT_KEY];
|
|
134
134
|
}
|
|
135
|
-
export function addStyles(document, styleSheetList) {
|
|
135
|
+
export function addStyles(document, styleSheetList, options = {}) {
|
|
136
136
|
const styleSheets = Array.from(styleSheetList);
|
|
137
|
+
const { nonce } = options;
|
|
138
|
+
const resolvedNonce = typeof nonce === 'function' ? nonce(document) : nonce;
|
|
137
139
|
for (const styleSheet of styleSheets) {
|
|
138
140
|
if (styleSheet.href) {
|
|
139
141
|
const link = document.createElement('link');
|
|
@@ -141,6 +143,10 @@ export function addStyles(document, styleSheetList) {
|
|
|
141
143
|
link.type = styleSheet.type;
|
|
142
144
|
link.rel = 'stylesheet';
|
|
143
145
|
document.head.appendChild(link);
|
|
146
|
+
// The <link> will load and apply its rules in the target
|
|
147
|
+
// document. Reading cssRules here would duplicate them
|
|
148
|
+
// (and throws for cross-origin sheets).
|
|
149
|
+
continue;
|
|
144
150
|
}
|
|
145
151
|
let cssTexts = [];
|
|
146
152
|
try {
|
|
@@ -151,11 +157,16 @@ export function addStyles(document, styleSheetList) {
|
|
|
151
157
|
catch (err) {
|
|
152
158
|
console.warn('dockview: failed to access stylesheet rules due to security restrictions', err);
|
|
153
159
|
}
|
|
160
|
+
const fragment = document.createDocumentFragment();
|
|
154
161
|
for (const rule of cssTexts) {
|
|
155
162
|
const style = document.createElement('style');
|
|
163
|
+
if (resolvedNonce) {
|
|
164
|
+
style.setAttribute('nonce', resolvedNonce);
|
|
165
|
+
}
|
|
156
166
|
style.appendChild(document.createTextNode(rule));
|
|
157
|
-
|
|
167
|
+
fragment.appendChild(style);
|
|
158
168
|
}
|
|
169
|
+
document.head.appendChild(fragment);
|
|
159
170
|
}
|
|
160
171
|
}
|
|
161
172
|
export function getDomNodePagePosition(domNode) {
|
|
@@ -194,7 +205,7 @@ export function addTestId(element, id) {
|
|
|
194
205
|
* Should be more efficient than element.querySelectorAll("*") since there
|
|
195
206
|
* is no need to store every element in-memory using this approach
|
|
196
207
|
*/
|
|
197
|
-
function allTagsNamesInclusiveOfShadowDoms(tagNames) {
|
|
208
|
+
function allTagsNamesInclusiveOfShadowDoms(tagNames, rootNode) {
|
|
198
209
|
const iframes = [];
|
|
199
210
|
function findIframesInNode(node) {
|
|
200
211
|
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
@@ -209,11 +220,15 @@ function allTagsNamesInclusiveOfShadowDoms(tagNames) {
|
|
|
209
220
|
}
|
|
210
221
|
}
|
|
211
222
|
}
|
|
212
|
-
|
|
223
|
+
// Document → walk from its root element. Element → walk from itself.
|
|
224
|
+
const startEl = rootNode instanceof Document
|
|
225
|
+
? rootNode.documentElement
|
|
226
|
+
: rootNode;
|
|
227
|
+
findIframesInNode(startEl);
|
|
213
228
|
return iframes;
|
|
214
229
|
}
|
|
215
230
|
export function disableIframePointEvents(rootNode = document) {
|
|
216
|
-
const iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW']);
|
|
231
|
+
const iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW'], rootNode);
|
|
217
232
|
const original = new WeakMap(); // don't hold onto HTMLElement references longer than required
|
|
218
233
|
for (const iframe of iframes) {
|
|
219
234
|
original.set(iframe, iframe.style.pointerEvents);
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export { DockviewWillShowOverlayLocationEvent, DockviewTabGroupChangeEvent, Dock
|
|
|
21
21
|
export { TabDragEvent, GroupDragEvent, } from './dockview/components/titlebar/tabsContainer';
|
|
22
22
|
export * from './dockview/types';
|
|
23
23
|
export * from './dockview/dockviewGroupPanel';
|
|
24
|
-
export { IGroupPanelBaseProps, IDockviewPanelHeaderProps, IDockviewPanelProps, IDockviewHeaderActionsProps, IGroupHeaderProps, IWatermarkPanelProps, DockviewReadyEvent, ITabGroupChipRenderer, } from './dockview/framework';
|
|
24
|
+
export { IGroupPanelBaseProps, IDockviewPanelHeaderProps, IDockviewPanelProps, IDockviewHeaderActionsProps, IGroupHeaderProps, IWatermarkPanelProps, DockviewReadyEvent, ITabGroupChipRenderer, IGroupDragGhostRenderer, } from './dockview/framework';
|
|
25
25
|
export * from './dockview/options';
|
|
26
26
|
export * from './dockview/theme';
|
|
27
27
|
export * from './dockview/dockviewPanel';
|
|
@@ -8,6 +8,11 @@ export declare class Overlay extends CompositeDisposable {
|
|
|
8
8
|
readonly onDidChange: Event<void>;
|
|
9
9
|
private readonly _onDidChangeEnd;
|
|
10
10
|
readonly onDidChangeEnd: Event<void>;
|
|
11
|
+
private readonly _onDidStartMoving;
|
|
12
|
+
/** Fires once per drag, the first time the float actually moves. */
|
|
13
|
+
readonly onDidStartMoving: Event<void>;
|
|
14
|
+
private readonly _dragMove;
|
|
15
|
+
private _dragCancelled;
|
|
11
16
|
private static readonly MINIMUM_HEIGHT;
|
|
12
17
|
private static readonly MINIMUM_WIDTH;
|
|
13
18
|
private verticalAlignment;
|
|
@@ -27,6 +32,13 @@ export declare class Overlay extends CompositeDisposable {
|
|
|
27
32
|
bringToFront(): void;
|
|
28
33
|
setBounds(bounds?: Partial<AnchoredBox>): void;
|
|
29
34
|
toJSON(): AnchoredBox;
|
|
35
|
+
/**
|
|
36
|
+
* Abort an in-flight move-the-float drag. Used by the void container
|
|
37
|
+
* when a redock long-press fires after the move started, so the ghost
|
|
38
|
+
* gesture wins without the float continuing to follow the finger.
|
|
39
|
+
* Does not emit `onDidChangeEnd` because no change is being committed.
|
|
40
|
+
*/
|
|
41
|
+
cancelPendingDrag(): void;
|
|
30
42
|
setupDrag(dragTarget: HTMLElement, options?: {
|
|
31
43
|
inDragMode: boolean;
|
|
32
44
|
}): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { disableIframePointEvents, quasiDefaultPrevented, toggleClass, } from '../dom';
|
|
2
2
|
import { Emitter, addDisposableListener } from '../events';
|
|
3
|
-
import { CompositeDisposable, MutableDisposable } from '../lifecycle';
|
|
3
|
+
import { CompositeDisposable, Disposable, MutableDisposable, } from '../lifecycle';
|
|
4
4
|
import { clamp } from '../math';
|
|
5
5
|
class AriaLevelTracker {
|
|
6
6
|
constructor() {
|
|
@@ -47,7 +47,12 @@ export class Overlay extends CompositeDisposable {
|
|
|
47
47
|
this.onDidChange = this._onDidChange.event;
|
|
48
48
|
this._onDidChangeEnd = new Emitter();
|
|
49
49
|
this.onDidChangeEnd = this._onDidChangeEnd.event;
|
|
50
|
-
this.
|
|
50
|
+
this._onDidStartMoving = new Emitter();
|
|
51
|
+
/** Fires once per drag, the first time the float actually moves. */
|
|
52
|
+
this.onDidStartMoving = this._onDidStartMoving.event;
|
|
53
|
+
this._dragMove = new MutableDisposable();
|
|
54
|
+
this._dragCancelled = false;
|
|
55
|
+
this.addDisposables(this._onDidChange, this._onDidChangeEnd, this._onDidStartMoving, this._dragMove);
|
|
51
56
|
this._element.className = 'dv-resize-container';
|
|
52
57
|
this._isVisible = true;
|
|
53
58
|
this.setupResize('top');
|
|
@@ -156,16 +161,60 @@ export class Overlay extends CompositeDisposable {
|
|
|
156
161
|
result.height = element.height;
|
|
157
162
|
return result;
|
|
158
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Abort an in-flight move-the-float drag. Used by the void container
|
|
166
|
+
* when a redock long-press fires after the move started, so the ghost
|
|
167
|
+
* gesture wins without the float continuing to follow the finger.
|
|
168
|
+
* Does not emit `onDidChangeEnd` because no change is being committed.
|
|
169
|
+
*/
|
|
170
|
+
cancelPendingDrag() {
|
|
171
|
+
if (!this._dragMove.value) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
this._dragCancelled = true;
|
|
175
|
+
toggleClass(this._element, 'dv-resize-container-dragging', false);
|
|
176
|
+
this._dragMove.value = Disposable.NONE;
|
|
177
|
+
}
|
|
159
178
|
setupDrag(dragTarget, options = { inDragMode: false }) {
|
|
160
|
-
const
|
|
161
|
-
const track = () => {
|
|
179
|
+
const track = (captureTarget, pointerId) => {
|
|
162
180
|
let offset = null;
|
|
181
|
+
let hasMoved = false;
|
|
182
|
+
this._dragCancelled = false;
|
|
163
183
|
const iframes = disableIframePointEvents();
|
|
164
|
-
|
|
184
|
+
if (captureTarget &&
|
|
185
|
+
typeof pointerId === 'number' &&
|
|
186
|
+
typeof captureTarget.setPointerCapture === 'function') {
|
|
187
|
+
try {
|
|
188
|
+
captureTarget.setPointerCapture(pointerId);
|
|
189
|
+
}
|
|
190
|
+
catch (_a) {
|
|
191
|
+
// ignore – non-fatal if the browser refuses capture
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const end = () => {
|
|
195
|
+
toggleClass(this._element, 'dv-resize-container-dragging', false);
|
|
196
|
+
this._dragMove.value = Disposable.NONE;
|
|
197
|
+
this._onDidChangeEnd.fire();
|
|
198
|
+
};
|
|
199
|
+
this._dragMove.value = new CompositeDisposable({
|
|
165
200
|
dispose: () => {
|
|
166
201
|
iframes.release();
|
|
202
|
+
if (captureTarget &&
|
|
203
|
+
typeof pointerId === 'number' &&
|
|
204
|
+
typeof captureTarget.releasePointerCapture ===
|
|
205
|
+
'function') {
|
|
206
|
+
try {
|
|
207
|
+
captureTarget.releasePointerCapture(pointerId);
|
|
208
|
+
}
|
|
209
|
+
catch (_a) {
|
|
210
|
+
// ignore – pointer may already be released
|
|
211
|
+
}
|
|
212
|
+
}
|
|
167
213
|
},
|
|
168
214
|
}, addDisposableListener(window, 'pointermove', (e) => {
|
|
215
|
+
if (this._dragCancelled) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
169
218
|
const containerRect = this.options.container.getBoundingClientRect();
|
|
170
219
|
const x = e.clientX - containerRect.left;
|
|
171
220
|
const y = e.clientY - containerRect.top;
|
|
@@ -202,13 +251,13 @@ export class Overlay extends CompositeDisposable {
|
|
|
202
251
|
bounds.right = right;
|
|
203
252
|
}
|
|
204
253
|
this.setBounds(bounds);
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}));
|
|
254
|
+
if (!hasMoved) {
|
|
255
|
+
hasMoved = true;
|
|
256
|
+
this._onDidStartMoving.fire();
|
|
257
|
+
}
|
|
258
|
+
}), addDisposableListener(window, 'pointerup', end), addDisposableListener(window, 'pointercancel', end));
|
|
210
259
|
};
|
|
211
|
-
this.addDisposables(
|
|
260
|
+
this.addDisposables(addDisposableListener(dragTarget, 'pointerdown', (event) => {
|
|
212
261
|
if (event.defaultPrevented) {
|
|
213
262
|
event.preventDefault();
|
|
214
263
|
return;
|
|
@@ -218,7 +267,7 @@ export class Overlay extends CompositeDisposable {
|
|
|
218
267
|
if (quasiDefaultPrevented(event)) {
|
|
219
268
|
return;
|
|
220
269
|
}
|
|
221
|
-
track();
|
|
270
|
+
track(dragTarget, event.pointerId);
|
|
222
271
|
}), addDisposableListener(this.options.content, 'pointerdown', (event) => {
|
|
223
272
|
if (event.defaultPrevented) {
|
|
224
273
|
return;
|
|
@@ -229,7 +278,7 @@ export class Overlay extends CompositeDisposable {
|
|
|
229
278
|
return;
|
|
230
279
|
}
|
|
231
280
|
if (event.shiftKey) {
|
|
232
|
-
track();
|
|
281
|
+
track(this.options.content, event.pointerId);
|
|
233
282
|
}
|
|
234
283
|
}), addDisposableListener(this.options.content, 'pointerdown', () => {
|
|
235
284
|
arialLevelTracker.push(this._element);
|
|
@@ -247,6 +296,19 @@ export class Overlay extends CompositeDisposable {
|
|
|
247
296
|
e.preventDefault();
|
|
248
297
|
let startPosition = null;
|
|
249
298
|
const iframes = disableIframePointEvents();
|
|
299
|
+
const pointerId = e.pointerId;
|
|
300
|
+
if (typeof resizeHandleElement.setPointerCapture === 'function') {
|
|
301
|
+
try {
|
|
302
|
+
resizeHandleElement.setPointerCapture(pointerId);
|
|
303
|
+
}
|
|
304
|
+
catch (_a) {
|
|
305
|
+
// ignore – non-fatal if the browser refuses capture
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const end = () => {
|
|
309
|
+
move.dispose();
|
|
310
|
+
this._onDidChangeEnd.fire();
|
|
311
|
+
};
|
|
250
312
|
move.value = new CompositeDisposable(addDisposableListener(window, 'pointermove', (e) => {
|
|
251
313
|
const containerRect = this.options.container.getBoundingClientRect();
|
|
252
314
|
const overlayRect = this._element.getBoundingClientRect();
|
|
@@ -381,11 +443,17 @@ export class Overlay extends CompositeDisposable {
|
|
|
381
443
|
}), {
|
|
382
444
|
dispose: () => {
|
|
383
445
|
iframes.release();
|
|
446
|
+
if (typeof resizeHandleElement.releasePointerCapture ===
|
|
447
|
+
'function') {
|
|
448
|
+
try {
|
|
449
|
+
resizeHandleElement.releasePointerCapture(pointerId);
|
|
450
|
+
}
|
|
451
|
+
catch (_a) {
|
|
452
|
+
// ignore – pointer may already be released
|
|
453
|
+
}
|
|
454
|
+
}
|
|
384
455
|
},
|
|
385
|
-
}, addDisposableListener(window, 'pointerup',
|
|
386
|
-
move.dispose();
|
|
387
|
-
this._onDidChangeEnd.fire();
|
|
388
|
-
}));
|
|
456
|
+
}, addDisposableListener(window, 'pointerup', end), addDisposableListener(window, 'pointercancel', end));
|
|
389
457
|
}));
|
|
390
458
|
}
|
|
391
459
|
getMinimumWidth(width) {
|
|
@@ -12,8 +12,10 @@ export interface PaneviewDidDropEvent extends DroptargetEvent {
|
|
|
12
12
|
api: PaneviewApi;
|
|
13
13
|
}
|
|
14
14
|
export declare abstract class DraggablePaneviewPanel extends PaneviewPanel {
|
|
15
|
-
private
|
|
15
|
+
private html5DragSource;
|
|
16
|
+
private pointerDragSource;
|
|
16
17
|
private target;
|
|
18
|
+
private pointerTarget;
|
|
17
19
|
private readonly _onDidDrop;
|
|
18
20
|
readonly onDidDrop: Event<PaneviewDidDropEvent>;
|
|
19
21
|
private readonly _onUnhandledDragOverEvent;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { PaneviewApi } from '../api/component.api';
|
|
2
|
-
import {
|
|
2
|
+
import { html5Backend, pointerBackend, } from '../dnd/backend';
|
|
3
3
|
import { getPaneData, LocalSelectionTransfer, PaneTransfer, } from '../dnd/dataTransfer';
|
|
4
|
-
import { Droptarget } from '../dnd/droptarget';
|
|
5
4
|
import { Emitter } from '../events';
|
|
6
5
|
import { PaneviewUnhandledDragOverEvent, } from './options';
|
|
7
6
|
import { PaneviewPanel, } from './paneviewPanel';
|
|
@@ -35,35 +34,42 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
|
|
|
35
34
|
const id = this.id;
|
|
36
35
|
const accessorId = this.accessor.id;
|
|
37
36
|
this.header.draggable = true;
|
|
38
|
-
|
|
39
|
-
getData() {
|
|
37
|
+
const sharedDragOptions = {
|
|
38
|
+
getData: () => {
|
|
40
39
|
LocalSelectionTransfer.getInstance().setData([new PaneTransfer(accessorId, id)], PaneTransfer.prototype);
|
|
41
40
|
return {
|
|
42
41
|
dispose: () => {
|
|
43
42
|
LocalSelectionTransfer.getInstance().clearData(PaneTransfer.prototype);
|
|
44
43
|
},
|
|
45
44
|
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
this.html5DragSource = html5Backend.createDragSource(this.header, sharedDragOptions);
|
|
48
|
+
this.pointerDragSource = pointerBackend.createDragSource(this.header, sharedDragOptions);
|
|
49
|
+
const canDisplayOverlay = (event, position) => {
|
|
50
|
+
const data = getPaneData();
|
|
51
|
+
if (data) {
|
|
52
|
+
if (data.paneId !== this.id &&
|
|
53
|
+
data.viewId === this.accessor.id) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
46
56
|
}
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
const firedEvent = new PaneviewUnhandledDragOverEvent(event, position, getPaneData, this);
|
|
58
|
+
this._onUnhandledDragOverEvent.fire(firedEvent);
|
|
59
|
+
return firedEvent.isAccepted;
|
|
60
|
+
};
|
|
61
|
+
const dropTargetOptions = {
|
|
49
62
|
acceptedTargetZones: ['top', 'bottom'],
|
|
50
63
|
overlayModel: {
|
|
51
64
|
activationSize: { type: 'percentage', value: 50 },
|
|
52
65
|
},
|
|
53
|
-
canDisplayOverlay
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
const firedEvent = new PaneviewUnhandledDragOverEvent(event, position, getPaneData, this);
|
|
62
|
-
this._onUnhandledDragOverEvent.fire(firedEvent);
|
|
63
|
-
return firedEvent.isAccepted;
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
this.addDisposables(this._onDidDrop, this.handler, this.target, this.target.onDrop((event) => {
|
|
66
|
+
canDisplayOverlay,
|
|
67
|
+
};
|
|
68
|
+
this.target = html5Backend.createDropTarget(this.element, dropTargetOptions);
|
|
69
|
+
this.pointerTarget = pointerBackend.createDropTarget(this.element, dropTargetOptions);
|
|
70
|
+
this.addDisposables(this._onDidDrop, this.html5DragSource, this.pointerDragSource, this.target, this.pointerTarget, this.target.onDrop((event) => {
|
|
71
|
+
this.onDrop(event);
|
|
72
|
+
}), this.pointerTarget.onDrop((event) => {
|
|
67
73
|
this.onDrop(event);
|
|
68
74
|
}));
|
|
69
75
|
}
|
|
@@ -15,15 +15,16 @@ export interface PaneviewFrameworkOptions {
|
|
|
15
15
|
export type PaneviewComponentOptions = PaneviewOptions & PaneviewFrameworkOptions;
|
|
16
16
|
export declare const PROPERTY_KEYS_PANEVIEW: (keyof PaneviewOptions)[];
|
|
17
17
|
export interface PaneviewDndOverlayEvent extends IAcceptableEvent {
|
|
18
|
-
|
|
18
|
+
/** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
|
|
19
|
+
nativeEvent: DragEvent | PointerEvent;
|
|
19
20
|
position: Position;
|
|
20
21
|
panel: IPaneviewPanel;
|
|
21
22
|
getData: () => PaneTransfer | undefined;
|
|
22
23
|
}
|
|
23
24
|
export declare class PaneviewUnhandledDragOverEvent extends AcceptableEvent implements PaneviewDndOverlayEvent {
|
|
24
|
-
readonly nativeEvent: DragEvent;
|
|
25
|
+
readonly nativeEvent: DragEvent | PointerEvent;
|
|
25
26
|
readonly position: Position;
|
|
26
27
|
readonly getData: () => PaneTransfer | undefined;
|
|
27
28
|
readonly panel: IPaneviewPanel;
|
|
28
|
-
constructor(nativeEvent: DragEvent, position: Position, getData: () => PaneTransfer | undefined, panel: IPaneviewPanel);
|
|
29
|
+
constructor(nativeEvent: DragEvent | PointerEvent, position: Position, getData: () => PaneTransfer | undefined, panel: IPaneviewPanel);
|
|
29
30
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CspNonceProvider } from './dom';
|
|
1
2
|
import { CompositeDisposable } from './lifecycle';
|
|
2
3
|
import { Box } from './types';
|
|
3
4
|
export type PopoutWindowOptions = {
|
|
@@ -10,6 +11,7 @@ export type PopoutWindowOptions = {
|
|
|
10
11
|
id: string;
|
|
11
12
|
window: Window;
|
|
12
13
|
}) => void;
|
|
14
|
+
nonce?: CspNonceProvider;
|
|
13
15
|
} & Box;
|
|
14
16
|
/**
|
|
15
17
|
* Reject popout URLs that aren't same-origin http(s). Blocks `javascript:`,
|
package/dist/esm/popoutWindow.js
CHANGED
|
@@ -133,7 +133,9 @@ export class PopoutWindow extends CompositeDisposable {
|
|
|
133
133
|
const externalDocument = externalWindow.document;
|
|
134
134
|
externalDocument.title = document.title;
|
|
135
135
|
externalDocument.body.appendChild(container);
|
|
136
|
-
addStyles(externalDocument, window.document.styleSheets
|
|
136
|
+
addStyles(externalDocument, window.document.styleSheets, {
|
|
137
|
+
nonce: this.options.nonce,
|
|
138
|
+
});
|
|
137
139
|
/**
|
|
138
140
|
* beforeunload must be registered after load for reasons I could not determine
|
|
139
141
|
* otherwise the beforeunload event will not fire when the window is closed
|