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.
Files changed (145) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +10 -1
  3. package/dist/cjs/api/dockviewGroupPanelApi.js +16 -0
  4. package/dist/cjs/dnd/backend.d.ts +70 -0
  5. package/dist/cjs/dnd/backend.js +171 -0
  6. package/dist/cjs/dnd/dropOverlay.d.ts +20 -0
  7. package/dist/cjs/dnd/dropOverlay.js +197 -0
  8. package/dist/cjs/dnd/droptarget.d.ts +20 -6
  9. package/dist/cjs/dnd/droptarget.js +14 -208
  10. package/dist/cjs/dnd/pointer/index.d.ts +11 -0
  11. package/dist/cjs/dnd/pointer/index.js +13 -0
  12. package/dist/cjs/dnd/pointer/longPress.d.ts +32 -0
  13. package/dist/cjs/dnd/pointer/longPress.js +151 -0
  14. package/dist/cjs/dnd/pointer/pointerDragController.d.ts +60 -0
  15. package/dist/cjs/dnd/pointer/pointerDragController.js +241 -0
  16. package/dist/cjs/dnd/pointer/pointerDragSource.d.ts +61 -0
  17. package/dist/cjs/dnd/pointer/pointerDragSource.js +195 -0
  18. package/dist/cjs/dnd/pointer/pointerDropTarget.d.ts +39 -0
  19. package/dist/cjs/dnd/pointer/pointerDropTarget.js +198 -0
  20. package/dist/cjs/dnd/pointer/pointerGhost.d.ts +30 -0
  21. package/dist/cjs/dnd/pointer/pointerGhost.js +44 -0
  22. package/dist/cjs/dnd/pointer/types.d.ts +16 -0
  23. package/dist/cjs/dnd/pointer/types.js +2 -0
  24. package/dist/cjs/dockview/components/panel/content.d.ts +3 -1
  25. package/dist/cjs/dockview/components/panel/content.js +33 -16
  26. package/dist/cjs/dockview/components/popupService.js +34 -0
  27. package/dist/cjs/dockview/components/tab/tab.d.ts +11 -3
  28. package/dist/cjs/dockview/components/tab/tab.js +151 -117
  29. package/dist/cjs/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
  30. package/dist/cjs/dockview/components/titlebar/tabGroupChip.js +15 -6
  31. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.js +2 -2
  32. package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +33 -5
  33. package/dist/cjs/dockview/components/titlebar/tabGroups.js +231 -40
  34. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +38 -1
  35. package/dist/cjs/dockview/components/titlebar/tabs.js +381 -253
  36. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +5 -3
  37. package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +6 -2
  38. package/dist/cjs/dockview/components/titlebar/voidContainer.js +190 -22
  39. package/dist/cjs/dockview/contextMenu.js +19 -4
  40. package/dist/cjs/dockview/dndCapabilities.d.ts +19 -0
  41. package/dist/cjs/dockview/dndCapabilities.js +39 -0
  42. package/dist/cjs/dockview/dockviewComponent.d.ts +2 -0
  43. package/dist/cjs/dockview/dockviewComponent.js +241 -158
  44. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +10 -5
  45. package/dist/cjs/dockview/dockviewGroupPanelModel.js +34 -11
  46. package/dist/cjs/dockview/dockviewPanel.js +5 -0
  47. package/dist/cjs/dockview/dockviewPanelModel.d.ts +2 -0
  48. package/dist/cjs/dockview/dockviewPanelModel.js +8 -0
  49. package/dist/cjs/dockview/events.d.ts +2 -1
  50. package/dist/cjs/dockview/events.js +1 -0
  51. package/dist/cjs/dockview/framework.d.ts +8 -0
  52. package/dist/cjs/dockview/options.d.ts +31 -5
  53. package/dist/cjs/dockview/options.js +3 -0
  54. package/dist/cjs/dom.d.ts +5 -1
  55. package/dist/cjs/dom.js +21 -5
  56. package/dist/cjs/index.d.ts +1 -1
  57. package/dist/cjs/overlay/overlay.d.ts +12 -0
  58. package/dist/cjs/overlay/overlay.js +84 -16
  59. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
  60. package/dist/cjs/paneview/draggablePaneviewPanel.js +27 -26
  61. package/dist/cjs/paneview/options.d.ts +4 -3
  62. package/dist/cjs/popoutWindow.d.ts +2 -0
  63. package/dist/cjs/popoutWindow.js +3 -1
  64. package/dist/dockview-core.js +2431 -937
  65. package/dist/dockview-core.min.js +2 -2
  66. package/dist/dockview-core.min.js.map +1 -1
  67. package/dist/dockview-core.min.noStyle.js +2 -2
  68. package/dist/dockview-core.min.noStyle.js.map +1 -1
  69. package/dist/dockview-core.noStyle.js +2430 -936
  70. package/dist/esm/api/dockviewGroupPanelApi.d.ts +10 -1
  71. package/dist/esm/api/dockviewGroupPanelApi.js +12 -0
  72. package/dist/esm/dnd/backend.d.ts +70 -0
  73. package/dist/esm/dnd/backend.js +148 -0
  74. package/dist/esm/dnd/dropOverlay.d.ts +20 -0
  75. package/dist/esm/dnd/dropOverlay.js +192 -0
  76. package/dist/esm/dnd/droptarget.d.ts +20 -6
  77. package/dist/esm/dnd/droptarget.js +16 -210
  78. package/dist/esm/dnd/pointer/index.d.ts +11 -0
  79. package/dist/esm/dnd/pointer/index.js +5 -0
  80. package/dist/esm/dnd/pointer/longPress.d.ts +32 -0
  81. package/dist/esm/dnd/pointer/longPress.js +127 -0
  82. package/dist/esm/dnd/pointer/pointerDragController.d.ts +60 -0
  83. package/dist/esm/dnd/pointer/pointerDragController.js +191 -0
  84. package/dist/esm/dnd/pointer/pointerDragSource.d.ts +61 -0
  85. package/dist/esm/dnd/pointer/pointerDragSource.js +171 -0
  86. package/dist/esm/dnd/pointer/pointerDropTarget.d.ts +39 -0
  87. package/dist/esm/dnd/pointer/pointerDropTarget.js +168 -0
  88. package/dist/esm/dnd/pointer/pointerGhost.d.ts +30 -0
  89. package/dist/esm/dnd/pointer/pointerGhost.js +39 -0
  90. package/dist/esm/dnd/pointer/types.d.ts +16 -0
  91. package/dist/esm/dnd/pointer/types.js +1 -0
  92. package/dist/esm/dockview/components/panel/content.d.ts +3 -1
  93. package/dist/esm/dockview/components/panel/content.js +33 -16
  94. package/dist/esm/dockview/components/popupService.js +34 -0
  95. package/dist/esm/dockview/components/tab/tab.d.ts +11 -3
  96. package/dist/esm/dockview/components/tab/tab.js +139 -114
  97. package/dist/esm/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
  98. package/dist/esm/dockview/components/titlebar/tabGroupChip.js +15 -6
  99. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.js +2 -2
  100. package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +33 -5
  101. package/dist/esm/dockview/components/titlebar/tabGroups.js +177 -12
  102. package/dist/esm/dockview/components/titlebar/tabs.d.ts +38 -1
  103. package/dist/esm/dockview/components/titlebar/tabs.js +360 -229
  104. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +5 -3
  105. package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +6 -2
  106. package/dist/esm/dockview/components/titlebar/voidContainer.js +180 -26
  107. package/dist/esm/dockview/contextMenu.js +19 -4
  108. package/dist/esm/dockview/dndCapabilities.d.ts +19 -0
  109. package/dist/esm/dockview/dndCapabilities.js +36 -0
  110. package/dist/esm/dockview/dockviewComponent.d.ts +2 -0
  111. package/dist/esm/dockview/dockviewComponent.js +104 -41
  112. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +10 -5
  113. package/dist/esm/dockview/dockviewGroupPanelModel.js +33 -11
  114. package/dist/esm/dockview/dockviewPanel.js +5 -0
  115. package/dist/esm/dockview/dockviewPanelModel.d.ts +2 -0
  116. package/dist/esm/dockview/dockviewPanelModel.js +8 -0
  117. package/dist/esm/dockview/events.d.ts +2 -1
  118. package/dist/esm/dockview/events.js +1 -0
  119. package/dist/esm/dockview/framework.d.ts +8 -0
  120. package/dist/esm/dockview/options.d.ts +31 -5
  121. package/dist/esm/dockview/options.js +3 -0
  122. package/dist/esm/dom.d.ts +5 -1
  123. package/dist/esm/dom.js +20 -5
  124. package/dist/esm/index.d.ts +1 -1
  125. package/dist/esm/overlay/overlay.d.ts +12 -0
  126. package/dist/esm/overlay/overlay.js +85 -17
  127. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
  128. package/dist/esm/paneview/draggablePaneviewPanel.js +26 -20
  129. package/dist/esm/paneview/options.d.ts +4 -3
  130. package/dist/esm/popoutWindow.d.ts +2 -0
  131. package/dist/esm/popoutWindow.js +3 -1
  132. package/dist/package/main.cjs.js +2430 -936
  133. package/dist/package/main.cjs.min.js +2 -2
  134. package/dist/package/main.esm.min.mjs +2 -2
  135. package/dist/package/main.esm.mjs +2430 -936
  136. package/dist/styles/dockview.css +117 -1
  137. package/package.json +3 -1
  138. package/dist/cjs/dnd/abstractDragHandler.d.ts +0 -14
  139. package/dist/cjs/dnd/abstractDragHandler.js +0 -86
  140. package/dist/cjs/dnd/groupDragHandler.d.ts +0 -12
  141. package/dist/cjs/dnd/groupDragHandler.js +0 -82
  142. package/dist/esm/dnd/abstractDragHandler.d.ts +0 -14
  143. package/dist/esm/dnd/abstractDragHandler.js +0 -63
  144. package/dist/esm/dnd/groupDragHandler.d.ts +0 -12
  145. 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
- document.head.appendChild(style);
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
- findIframesInNode(document.documentElement);
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);
@@ -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.addDisposables(this._onDidChange, this._onDidChangeEnd);
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 move = new MutableDisposable();
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
- move.value = new CompositeDisposable({
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
- }), addDisposableListener(window, 'pointerup', () => {
206
- toggleClass(this._element, 'dv-resize-container-dragging', false);
207
- move.dispose();
208
- this._onDidChangeEnd.fire();
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(move, addDisposableListener(dragTarget, 'pointerdown', (event) => {
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 handler;
15
+ private html5DragSource;
16
+ private pointerDragSource;
16
17
  private target;
18
+ private pointerTarget;
17
19
  private readonly _onDidDrop;
18
20
  readonly onDidDrop: Event<PaneviewDidDropEvent>;
19
21
  private readonly _onUnhandledDragOverEvent;
@@ -1,7 +1,6 @@
1
1
  import { PaneviewApi } from '../api/component.api';
2
- import { DragHandler } from '../dnd/abstractDragHandler';
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
- this.handler = new (class PaneDragHandler extends DragHandler {
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
- })(this.header);
48
- this.target = new Droptarget(this.element, {
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: (event, position) => {
54
- const data = getPaneData();
55
- if (data) {
56
- if (data.paneId !== this.id &&
57
- data.viewId === this.accessor.id) {
58
- return true;
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
- nativeEvent: DragEvent;
18
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
19
+ nativeEvent: DragEvent | PointerEvent;
19
20
  position: Position;
20
21
  panel: IPaneviewPanel;
21
22
  getData: () => PaneTransfer | undefined;
22
23
  }
23
24
  export declare class PaneviewUnhandledDragOverEvent extends AcceptableEvent implements PaneviewDndOverlayEvent {
24
- readonly nativeEvent: DragEvent;
25
+ readonly nativeEvent: DragEvent | PointerEvent;
25
26
  readonly position: Position;
26
27
  readonly getData: () => PaneTransfer | undefined;
27
28
  readonly panel: IPaneviewPanel;
28
- constructor(nativeEvent: DragEvent, position: Position, getData: () => PaneTransfer | undefined, panel: IPaneviewPanel);
29
+ constructor(nativeEvent: DragEvent | PointerEvent, position: Position, getData: () => PaneTransfer | undefined, panel: IPaneviewPanel);
29
30
  }
@@ -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:`,
@@ -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