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
@@ -52,13 +52,17 @@ export interface CreateTabGroupOptions extends TabGroupOptions {
52
52
  }
53
53
  export declare class DockviewDidDropEvent extends DockviewEvent {
54
54
  private readonly options;
55
- get nativeEvent(): DragEvent;
55
+ /**
56
+ * `PointerEvent` for touch drags has no `dataTransfer`; use
57
+ * `getData()` for the dockview payload regardless of input method.
58
+ */
59
+ get nativeEvent(): DragEvent | PointerEvent;
56
60
  get position(): Position;
57
61
  get panel(): IDockviewPanel | undefined;
58
62
  get group(): DockviewGroupPanel | undefined;
59
63
  get api(): DockviewApi;
60
64
  constructor(options: {
61
- readonly nativeEvent: DragEvent;
65
+ readonly nativeEvent: DragEvent | PointerEvent;
62
66
  readonly position: Position;
63
67
  readonly panel?: IDockviewPanel;
64
68
  getData(): PanelTransfer | undefined;
@@ -71,7 +75,7 @@ export declare class DockviewWillDropEvent extends DockviewDidDropEvent {
71
75
  private readonly _kind;
72
76
  get kind(): DockviewGroupDropLocation;
73
77
  constructor(options: {
74
- readonly nativeEvent: DragEvent;
78
+ readonly nativeEvent: DragEvent | PointerEvent;
75
79
  readonly position: Position;
76
80
  readonly panel?: IDockviewPanel;
77
81
  getData(): PanelTransfer | undefined;
@@ -122,7 +126,7 @@ export interface IDockviewGroupPanelModel extends IPanel {
122
126
  panel?: IDockviewPanel;
123
127
  suppressRoll?: boolean;
124
128
  }): void;
125
- canDisplayOverlay(event: DragEvent, position: Position, target: DockviewGroupDropLocation): boolean;
129
+ canDisplayOverlay(event: DragEvent | PointerEvent, position: Position, target: DockviewGroupDropLocation): boolean;
126
130
  }
127
131
  export type DockviewGroupLocation = {
128
132
  type: 'grid';
@@ -272,6 +276,7 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
272
276
  getTabGroups(): readonly ITabGroup[];
273
277
  updateTabGroups(): void;
274
278
  refreshTabGroupAccent(): void;
279
+ refreshWatermark(): void;
275
280
  getTabGroupForPanel(panelId: string): ITabGroup | undefined;
276
281
  private _findTabGroupForPanel;
277
282
  private _removeTabGroupInternal;
@@ -323,7 +328,7 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
323
328
  private doSetActivePanel;
324
329
  private updateMru;
325
330
  private updateContainer;
326
- canDisplayOverlay(event: DragEvent, position: Position, target: DockviewGroupDropLocation): boolean;
331
+ canDisplayOverlay(event: DragEvent | PointerEvent, position: Position, target: DockviewGroupDropLocation): boolean;
327
332
  private handleDropEvent;
328
333
  updateDragAndDropState(): void;
329
334
  dispose(): void;
@@ -70,6 +70,10 @@ var DockviewDidDropEvent = /** @class */ (function (_super) {
70
70
  return _this;
71
71
  }
72
72
  Object.defineProperty(DockviewDidDropEvent.prototype, "nativeEvent", {
73
+ /**
74
+ * `PointerEvent` for touch drags has no `dataTransfer`; use
75
+ * `getData()` for the dockview payload regardless of input method.
76
+ */
73
77
  get: function () {
74
78
  return this.options.nativeEvent;
75
79
  },
@@ -261,6 +265,8 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
261
265
  // noop
262
266
  }), _this.contentContainer.dropTarget.onDrop(function (event) {
263
267
  _this.handleDropEvent('content', event.nativeEvent, event.position);
268
+ }), _this.contentContainer.pointerDropTarget.onDrop(function (event) {
269
+ _this.handleDropEvent('content', event.nativeEvent, event.position);
264
270
  }), _this.tabsContainer.onWillShowOverlay(function (event) {
265
271
  _this._onWillShowOverlay.fire(event);
266
272
  }), _this.contentContainer.dropTarget.onWillShowOverlay(function (event) {
@@ -271,6 +277,14 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
271
277
  group: _this.groupPanel,
272
278
  getData: dataTransfer_1.getPanelData,
273
279
  }));
280
+ }), _this.contentContainer.pointerDropTarget.onWillShowOverlay(function (event) {
281
+ _this._onWillShowOverlay.fire(new events_2.DockviewWillShowOverlayLocationEvent(event, {
282
+ kind: 'content',
283
+ panel: _this.activePanel,
284
+ api: _this._api,
285
+ group: _this.groupPanel,
286
+ getData: dataTransfer_1.getPanelData,
287
+ }));
274
288
  }), _this._onMove, _this._onDidChange, _this._onDidDrop, _this._onWillDrop, _this._onDidAddPanel, _this._onDidRemovePanel, _this._onDidActivePanelChange, _this._onUnhandledDragOverEvent, _this._onDidPanelTitleChange, _this._onDidPanelParametersChange, _this._onDidCreateTabGroup, _this._onDidDestroyTabGroup, _this._onDidAddPanelToTabGroup, _this._onDidRemovePanelFromTabGroup, _this._onDidTabGroupChange, _this._onDidTabGroupCollapsedChange, _this._onDidCreateTabGroup.event(function () {
275
289
  _this._scheduleTabGroupUpdate();
276
290
  }), _this._onDidDestroyTabGroup.event(function () {
@@ -402,33 +416,33 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
402
416
  return this._location;
403
417
  },
404
418
  set: function (value) {
419
+ var _this = this;
405
420
  this._location = value;
406
421
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-floating', false);
407
422
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-popout', false);
408
423
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-edge', false);
424
+ // Mouse and touch drop targets must agree on accepted zones.
425
+ var applyZones = function (zones) {
426
+ _this.contentContainer.dropTarget.setTargetZones(zones);
427
+ _this.contentContainer.pointerDropTarget.setTargetZones(zones);
428
+ };
409
429
  switch (value.type) {
410
430
  case 'grid':
411
- this.contentContainer.dropTarget.setTargetZones([
412
- 'top',
413
- 'bottom',
414
- 'left',
415
- 'right',
416
- 'center',
417
- ]);
431
+ applyZones(['top', 'bottom', 'left', 'right', 'center']);
418
432
  break;
419
433
  case 'floating':
420
- this.contentContainer.dropTarget.setTargetZones(['center']);
421
- this.contentContainer.dropTarget.setTargetZones(value
434
+ applyZones(['center']);
435
+ applyZones(value
422
436
  ? ['center']
423
437
  : ['top', 'bottom', 'left', 'right', 'center']);
424
438
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-floating', true);
425
439
  break;
426
440
  case 'popout':
427
- this.contentContainer.dropTarget.setTargetZones(['center']);
441
+ applyZones(['center']);
428
442
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-popout', true);
429
443
  break;
430
444
  case 'edge':
431
- this.contentContainer.dropTarget.setTargetZones(['center']);
445
+ applyZones(['center']);
432
446
  (0, dom_1.toggleClass)(this.container, 'dv-groupview-edge', true);
433
447
  break;
434
448
  }
@@ -721,6 +735,15 @@ var DockviewGroupPanelModel = /** @class */ (function (_super) {
721
735
  DockviewGroupPanelModel.prototype.refreshTabGroupAccent = function () {
722
736
  this.tabsContainer.refreshTabGroupAccent();
723
737
  };
738
+ DockviewGroupPanelModel.prototype.refreshWatermark = function () {
739
+ var _a, _b;
740
+ if (this.watermark) {
741
+ this.watermark.element.remove();
742
+ (_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
743
+ this.watermark = undefined;
744
+ }
745
+ this.updateContainer();
746
+ };
724
747
  DockviewGroupPanelModel.prototype.getTabGroupForPanel = function (panelId) {
725
748
  return this._findTabGroupForPanel(panelId);
726
749
  };
@@ -159,6 +159,11 @@ var DockviewPanel = /** @class */ (function (_super) {
159
159
  var didTitleChange = title !== this.title;
160
160
  if (didTitleChange) {
161
161
  this._title = title;
162
+ // keep the view-model's cached init params in sync so that tab
163
+ // renderers constructed lazily (e.g. the header overflow
164
+ // dropdown via createTabRenderer) see the updated title
165
+ // (#914).
166
+ this.view.setTitle(title);
162
167
  this.api._onDidTitleChange.fire({ title: title });
163
168
  }
164
169
  };
@@ -12,6 +12,7 @@ export interface IDockviewPanelModel extends IDisposable {
12
12
  layout(width: number, height: number): void;
13
13
  init(params: GroupPanelPartInitParameters): void;
14
14
  createTabRenderer(tabLocation: TabLocation): ITabRenderer;
15
+ setTitle(title: string): void;
15
16
  }
16
17
  export declare class DockviewPanelModel implements IDockviewPanelModel {
17
18
  private readonly accessor;
@@ -27,6 +28,7 @@ export declare class DockviewPanelModel implements IDockviewPanelModel {
27
28
  constructor(accessor: IDockviewComponent, id: string, contentComponent: string, tabComponent?: string | undefined);
28
29
  createTabRenderer(tabLocation: TabLocation): ITabRenderer;
29
30
  init(params: GroupPanelPartInitParameters): void;
31
+ setTitle(title: string): void;
30
32
  layout(width: number, height: number): void;
31
33
  update(event: PanelUpdateEvent): void;
32
34
  dispose(): void;
@@ -52,6 +52,14 @@ var DockviewPanelModel = /** @class */ (function () {
52
52
  this.content.init(params);
53
53
  this.tab.init(__assign(__assign({}, params), { tabLocation: 'header' }));
54
54
  };
55
+ DockviewPanelModel.prototype.setTitle = function (title) {
56
+ // keep the cached init params in sync so that tab renderers created
57
+ // lazily after the title changes (e.g. for the header overflow
58
+ // dropdown) see the current title rather than the stale original.
59
+ if (this._params) {
60
+ this._params.title = title;
61
+ }
62
+ };
55
63
  DockviewPanelModel.prototype.layout = function (width, height) {
56
64
  var _a, _b;
57
65
  (_b = (_a = this.content).layout) === null || _b === void 0 ? void 0 : _b.call(_a, width, height);
@@ -25,7 +25,8 @@ export declare class DockviewWillShowOverlayLocationEvent implements IDockviewEv
25
25
  private readonly event;
26
26
  readonly options: DockviewWillShowOverlayLocationEventOptions;
27
27
  get kind(): DockviewGroupDropLocation;
28
- get nativeEvent(): DragEvent;
28
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
29
+ get nativeEvent(): DragEvent | PointerEvent;
29
30
  get position(): Position;
30
31
  get defaultPrevented(): boolean;
31
32
  get panel(): IDockviewPanel | undefined;
@@ -14,6 +14,7 @@ var DockviewWillShowOverlayLocationEvent = /** @class */ (function () {
14
14
  configurable: true
15
15
  });
16
16
  Object.defineProperty(DockviewWillShowOverlayLocationEvent.prototype, "nativeEvent", {
17
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
17
18
  get: function () {
18
19
  return this.event.nativeEvent;
19
20
  },
@@ -55,3 +55,11 @@ export interface ITabGroupChipRenderer {
55
55
  }): void;
56
56
  dispose(): void;
57
57
  }
58
+ export interface IGroupDragGhostRenderer {
59
+ readonly element: HTMLElement;
60
+ init(params: {
61
+ group: IDockviewGroupPanel;
62
+ api: DockviewApi;
63
+ }): void;
64
+ dispose?(): void;
65
+ }
@@ -11,12 +11,14 @@ import { GroupOptions } from './dockviewGroupPanelModel';
11
11
  import { DockviewGroupDropLocation } from './events';
12
12
  import { IDockviewPanel } from './dockviewPanel';
13
13
  import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
14
- import { IGroupHeaderProps, ITabGroupChipRenderer } from './framework';
14
+ import { IGroupDragGhostRenderer, IGroupHeaderProps, ITabGroupChipRenderer } from './framework';
15
15
  import { FloatingGroupOptions } from './dockviewComponent';
16
16
  import { Contraints } from '../gridview/gridviewPanel';
17
17
  import { AcceptableEvent, IAcceptableEvent } from '../events';
18
18
  import { DockviewTheme } from './theme';
19
19
  import { ITabGroup } from './tabGroup';
20
+ import { CspNonceProvider } from '../dom';
21
+ export { CspNonceProvider };
20
22
  import { DockviewTabGroupColorEntry } from './tabGroupAccent';
21
23
  export interface IHeaderActionsRenderer extends IDisposable {
22
24
  readonly element: HTMLElement;
@@ -75,6 +77,7 @@ export interface ViewFactoryData {
75
77
  }
76
78
  export type DockviewHeaderPosition = 'top' | 'bottom' | 'left' | 'right';
77
79
  export type DockviewHeaderDirection = 'horizontal' | 'vertical';
80
+ export type DockviewDndStrategy = 'auto' | 'pointer' | 'html5';
78
81
  export interface DockviewOptions {
79
82
  /**
80
83
  * Disable the auto-resizing which is controlled through a `ResizeObserver`.
@@ -89,6 +92,7 @@ export interface DockviewOptions {
89
92
  minimumWidthWithinViewport?: number;
90
93
  };
91
94
  popoutUrl?: string;
95
+ nonce?: CspNonceProvider;
92
96
  defaultRenderer?: DockviewPanelRenderer;
93
97
  defaultHeaderPosition?: DockviewHeaderPosition;
94
98
  debug?: boolean;
@@ -98,6 +102,19 @@ export interface DockviewOptions {
98
102
  * */
99
103
  rootOverlayModel?: DroptargetOverlayModel;
100
104
  disableDnd?: boolean;
105
+ /**
106
+ * Selects which drag-and-drop implementation is active.
107
+ *
108
+ * - `'auto'` (default): HTML5 drag-and-drop drives mouse drags; pointer
109
+ * events drive touch and pen drags. Matches the historical behaviour.
110
+ * - `'pointer'`: pointer events drive every input type. Useful in
111
+ * environments where HTML5 drag-and-drop is unreliable (some Linux
112
+ * browsers, certain Safari versions, embedded webviews). Cross-window
113
+ * HTML5 drag and the HTML5 native drag image are not available in this
114
+ * mode.
115
+ * - `'html5'`: HTML5 drag-and-drop only — disables touch / pen drag.
116
+ */
117
+ dndStrategy?: DockviewDndStrategy;
101
118
  locked?: boolean;
102
119
  className?: string;
103
120
  /**
@@ -140,6 +157,15 @@ export interface DockviewOptions {
140
157
  * If not provided, the default chip renderer is used.
141
158
  */
142
159
  createTabGroupChipComponent?: (tabGroup: ITabGroup) => ITabGroupChipRenderer;
160
+ /**
161
+ * Factory to create the custom ghost element shown while dragging a
162
+ * group of panels (the small floating chip that follows the cursor).
163
+ *
164
+ * If not provided, a default ghost rendering `"Multiple Panels (N)"`
165
+ * is used. Supplying a factory replaces the entire default ghost,
166
+ * enabling i18n / custom visuals.
167
+ */
168
+ createGroupDragGhostComponent?: (group: DockviewGroupPanel) => IGroupDragGhostRenderer;
143
169
  /**
144
170
  * Replace the built-in tab group color palette with a user-defined list.
145
171
  *
@@ -165,19 +191,20 @@ export interface DockviewOptions {
165
191
  }
166
192
  export type TabAnimation = 'smooth' | 'default';
167
193
  export interface DockviewDndOverlayEvent extends IAcceptableEvent {
168
- nativeEvent: DragEvent;
194
+ /** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
195
+ nativeEvent: DragEvent | PointerEvent;
169
196
  target: DockviewGroupDropLocation;
170
197
  position: Position;
171
198
  group?: DockviewGroupPanel;
172
199
  getData: () => PanelTransfer | undefined;
173
200
  }
174
201
  export declare class DockviewUnhandledDragOverEvent extends AcceptableEvent implements DockviewDndOverlayEvent {
175
- readonly nativeEvent: DragEvent;
202
+ readonly nativeEvent: DragEvent | PointerEvent;
176
203
  readonly target: DockviewGroupDropLocation;
177
204
  readonly position: Position;
178
205
  readonly getData: () => PanelTransfer | undefined;
179
206
  readonly group?: DockviewGroupPanel | undefined;
180
- constructor(nativeEvent: DragEvent, target: DockviewGroupDropLocation, position: Position, getData: () => PanelTransfer | undefined, group?: DockviewGroupPanel | undefined);
207
+ constructor(nativeEvent: DragEvent | PointerEvent, target: DockviewGroupDropLocation, position: Position, getData: () => PanelTransfer | undefined, group?: DockviewGroupPanel | undefined);
181
208
  }
182
209
  export declare const PROPERTY_KEYS_DOCKVIEW: (keyof DockviewOptions)[];
183
210
  export interface CreateComponentOptions {
@@ -292,4 +319,3 @@ export interface MovementOptions extends MovementOptions2 {
292
319
  includePanel?: boolean;
293
320
  group?: DockviewGroupPanel;
294
321
  }
295
- export {};
@@ -47,12 +47,14 @@ exports.PROPERTY_KEYS_DOCKVIEW = (function () {
47
47
  disableFloatingGroups: undefined,
48
48
  floatingGroupBounds: undefined,
49
49
  popoutUrl: undefined,
50
+ nonce: undefined,
50
51
  defaultRenderer: undefined,
51
52
  defaultHeaderPosition: undefined,
52
53
  debug: undefined,
53
54
  rootOverlayModel: undefined,
54
55
  locked: undefined,
55
56
  disableDnd: undefined,
57
+ dndStrategy: undefined,
56
58
  className: undefined,
57
59
  noPanelsOverlay: undefined,
58
60
  dndEdges: undefined,
@@ -62,6 +64,7 @@ exports.PROPERTY_KEYS_DOCKVIEW = (function () {
62
64
  getTabContextMenuItems: undefined,
63
65
  getTabGroupChipContextMenuItems: undefined,
64
66
  createTabGroupChipComponent: undefined,
67
+ createGroupDragGhostComponent: undefined,
65
68
  tabGroupColors: undefined,
66
69
  tabGroupAccent: undefined,
67
70
  };
package/dist/cjs/dom.d.ts CHANGED
@@ -24,7 +24,11 @@ export interface IFocusTracker extends IDisposable {
24
24
  export declare function trackFocus(element: HTMLElement): IFocusTracker;
25
25
  export declare function quasiPreventDefault(event: Event): void;
26
26
  export declare function quasiDefaultPrevented(event: Event): boolean;
27
- export declare function addStyles(document: Document, styleSheetList: StyleSheetList): void;
27
+ export type CspNonceProvider = string | ((targetDocument: Document) => string | undefined);
28
+ export interface AddStylesOptions {
29
+ nonce?: CspNonceProvider;
30
+ }
31
+ export declare function addStyles(document: Document, styleSheetList: StyleSheetList, options?: AddStylesOptions): void;
28
32
  export declare function getDomNodePagePosition(domNode: Element): {
29
33
  left: number;
30
34
  top: number;
package/dist/cjs/dom.js CHANGED
@@ -218,9 +218,12 @@ function quasiPreventDefault(event) {
218
218
  function quasiDefaultPrevented(event) {
219
219
  return event[QUASI_PREVENT_DEFAULT_KEY];
220
220
  }
221
- function addStyles(document, styleSheetList) {
221
+ function addStyles(document, styleSheetList, options) {
222
222
  var e_3, _a, e_4, _b;
223
+ if (options === void 0) { options = {}; }
223
224
  var styleSheets = Array.from(styleSheetList);
225
+ var nonce = options.nonce;
226
+ var resolvedNonce = typeof nonce === 'function' ? nonce(document) : nonce;
224
227
  try {
225
228
  for (var styleSheets_1 = __values(styleSheets), styleSheets_1_1 = styleSheets_1.next(); !styleSheets_1_1.done; styleSheets_1_1 = styleSheets_1.next()) {
226
229
  var styleSheet = styleSheets_1_1.value;
@@ -230,6 +233,10 @@ function addStyles(document, styleSheetList) {
230
233
  link.type = styleSheet.type;
231
234
  link.rel = 'stylesheet';
232
235
  document.head.appendChild(link);
236
+ // The <link> will load and apply its rules in the target
237
+ // document. Reading cssRules here would duplicate them
238
+ // (and throws for cross-origin sheets).
239
+ continue;
233
240
  }
234
241
  var cssTexts = [];
235
242
  try {
@@ -240,12 +247,16 @@ function addStyles(document, styleSheetList) {
240
247
  catch (err) {
241
248
  console.warn('dockview: failed to access stylesheet rules due to security restrictions', err);
242
249
  }
250
+ var fragment = document.createDocumentFragment();
243
251
  try {
244
252
  for (var cssTexts_1 = (e_4 = void 0, __values(cssTexts)), cssTexts_1_1 = cssTexts_1.next(); !cssTexts_1_1.done; cssTexts_1_1 = cssTexts_1.next()) {
245
253
  var rule = cssTexts_1_1.value;
246
254
  var style = document.createElement('style');
255
+ if (resolvedNonce) {
256
+ style.setAttribute('nonce', resolvedNonce);
257
+ }
247
258
  style.appendChild(document.createTextNode(rule));
248
- document.head.appendChild(style);
259
+ fragment.appendChild(style);
249
260
  }
250
261
  }
251
262
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
@@ -255,6 +266,7 @@ function addStyles(document, styleSheetList) {
255
266
  }
256
267
  finally { if (e_4) throw e_4.error; }
257
268
  }
269
+ document.head.appendChild(fragment);
258
270
  }
259
271
  }
260
272
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
@@ -301,7 +313,7 @@ function addTestId(element, id) {
301
313
  * Should be more efficient than element.querySelectorAll("*") since there
302
314
  * is no need to store every element in-memory using this approach
303
315
  */
304
- function allTagsNamesInclusiveOfShadowDoms(tagNames) {
316
+ function allTagsNamesInclusiveOfShadowDoms(tagNames, rootNode) {
305
317
  var iframes = [];
306
318
  function findIframesInNode(node) {
307
319
  var e_5, _a;
@@ -327,13 +339,17 @@ function allTagsNamesInclusiveOfShadowDoms(tagNames) {
327
339
  }
328
340
  }
329
341
  }
330
- findIframesInNode(document.documentElement);
342
+ // Document → walk from its root element. Element → walk from itself.
343
+ var startEl = rootNode instanceof Document
344
+ ? rootNode.documentElement
345
+ : rootNode;
346
+ findIframesInNode(startEl);
331
347
  return iframes;
332
348
  }
333
349
  function disableIframePointEvents(rootNode) {
334
350
  var e_6, _a;
335
351
  if (rootNode === void 0) { rootNode = document; }
336
- var iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW']);
352
+ var iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW'], rootNode);
337
353
  var original = new WeakMap(); // don't hold onto HTMLElement references longer than required
338
354
  try {
339
355
  for (var iframes_1 = __values(iframes), iframes_1_1 = iframes_1.next(); !iframes_1_1.done; iframes_1_1 = iframes_1.next()) {
@@ -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;
@@ -90,7 +90,12 @@ var Overlay = /** @class */ (function (_super) {
90
90
  _this.onDidChange = _this._onDidChange.event;
91
91
  _this._onDidChangeEnd = new events_1.Emitter();
92
92
  _this.onDidChangeEnd = _this._onDidChangeEnd.event;
93
- _this.addDisposables(_this._onDidChange, _this._onDidChangeEnd);
93
+ _this._onDidStartMoving = new events_1.Emitter();
94
+ /** Fires once per drag, the first time the float actually moves. */
95
+ _this.onDidStartMoving = _this._onDidStartMoving.event;
96
+ _this._dragMove = new lifecycle_1.MutableDisposable();
97
+ _this._dragCancelled = false;
98
+ _this.addDisposables(_this._onDidChange, _this._onDidChangeEnd, _this._onDidStartMoving, _this._dragMove);
94
99
  _this._element.className = 'dv-resize-container';
95
100
  _this._isVisible = true;
96
101
  _this.setupResize('top');
@@ -229,18 +234,62 @@ var Overlay = /** @class */ (function (_super) {
229
234
  result.height = element.height;
230
235
  return result;
231
236
  };
237
+ /**
238
+ * Abort an in-flight move-the-float drag. Used by the void container
239
+ * when a redock long-press fires after the move started, so the ghost
240
+ * gesture wins without the float continuing to follow the finger.
241
+ * Does not emit `onDidChangeEnd` because no change is being committed.
242
+ */
243
+ Overlay.prototype.cancelPendingDrag = function () {
244
+ if (!this._dragMove.value) {
245
+ return;
246
+ }
247
+ this._dragCancelled = true;
248
+ (0, dom_1.toggleClass)(this._element, 'dv-resize-container-dragging', false);
249
+ this._dragMove.value = lifecycle_1.Disposable.NONE;
250
+ };
232
251
  Overlay.prototype.setupDrag = function (dragTarget, options) {
233
252
  var _this = this;
234
253
  if (options === void 0) { options = { inDragMode: false }; }
235
- var move = new lifecycle_1.MutableDisposable();
236
- var track = function () {
254
+ var track = function (captureTarget, pointerId) {
237
255
  var offset = null;
256
+ var hasMoved = false;
257
+ _this._dragCancelled = false;
238
258
  var iframes = (0, dom_1.disableIframePointEvents)();
239
- move.value = new lifecycle_1.CompositeDisposable({
259
+ if (captureTarget &&
260
+ typeof pointerId === 'number' &&
261
+ typeof captureTarget.setPointerCapture === 'function') {
262
+ try {
263
+ captureTarget.setPointerCapture(pointerId);
264
+ }
265
+ catch (_a) {
266
+ // ignore – non-fatal if the browser refuses capture
267
+ }
268
+ }
269
+ var end = function () {
270
+ (0, dom_1.toggleClass)(_this._element, 'dv-resize-container-dragging', false);
271
+ _this._dragMove.value = lifecycle_1.Disposable.NONE;
272
+ _this._onDidChangeEnd.fire();
273
+ };
274
+ _this._dragMove.value = new lifecycle_1.CompositeDisposable({
240
275
  dispose: function () {
241
276
  iframes.release();
277
+ if (captureTarget &&
278
+ typeof pointerId === 'number' &&
279
+ typeof captureTarget.releasePointerCapture ===
280
+ 'function') {
281
+ try {
282
+ captureTarget.releasePointerCapture(pointerId);
283
+ }
284
+ catch (_a) {
285
+ // ignore – pointer may already be released
286
+ }
287
+ }
242
288
  },
243
289
  }, (0, events_1.addDisposableListener)(window, 'pointermove', function (e) {
290
+ if (_this._dragCancelled) {
291
+ return;
292
+ }
244
293
  var containerRect = _this.options.container.getBoundingClientRect();
245
294
  var x = e.clientX - containerRect.left;
246
295
  var y = e.clientY - containerRect.top;
@@ -277,13 +326,13 @@ var Overlay = /** @class */ (function (_super) {
277
326
  bounds.right = right;
278
327
  }
279
328
  _this.setBounds(bounds);
280
- }), (0, events_1.addDisposableListener)(window, 'pointerup', function () {
281
- (0, dom_1.toggleClass)(_this._element, 'dv-resize-container-dragging', false);
282
- move.dispose();
283
- _this._onDidChangeEnd.fire();
284
- }));
329
+ if (!hasMoved) {
330
+ hasMoved = true;
331
+ _this._onDidStartMoving.fire();
332
+ }
333
+ }), (0, events_1.addDisposableListener)(window, 'pointerup', end), (0, events_1.addDisposableListener)(window, 'pointercancel', end));
285
334
  };
286
- this.addDisposables(move, (0, events_1.addDisposableListener)(dragTarget, 'pointerdown', function (event) {
335
+ this.addDisposables((0, events_1.addDisposableListener)(dragTarget, 'pointerdown', function (event) {
287
336
  if (event.defaultPrevented) {
288
337
  event.preventDefault();
289
338
  return;
@@ -293,7 +342,7 @@ var Overlay = /** @class */ (function (_super) {
293
342
  if ((0, dom_1.quasiDefaultPrevented)(event)) {
294
343
  return;
295
344
  }
296
- track();
345
+ track(dragTarget, event.pointerId);
297
346
  }), (0, events_1.addDisposableListener)(this.options.content, 'pointerdown', function (event) {
298
347
  if (event.defaultPrevented) {
299
348
  return;
@@ -304,7 +353,7 @@ var Overlay = /** @class */ (function (_super) {
304
353
  return;
305
354
  }
306
355
  if (event.shiftKey) {
307
- track();
356
+ track(_this.options.content, event.pointerId);
308
357
  }
309
358
  }), (0, events_1.addDisposableListener)(this.options.content, 'pointerdown', function () {
310
359
  arialLevelTracker.push(_this._element);
@@ -323,6 +372,19 @@ var Overlay = /** @class */ (function (_super) {
323
372
  e.preventDefault();
324
373
  var startPosition = null;
325
374
  var iframes = (0, dom_1.disableIframePointEvents)();
375
+ var pointerId = e.pointerId;
376
+ if (typeof resizeHandleElement.setPointerCapture === 'function') {
377
+ try {
378
+ resizeHandleElement.setPointerCapture(pointerId);
379
+ }
380
+ catch (_a) {
381
+ // ignore – non-fatal if the browser refuses capture
382
+ }
383
+ }
384
+ var end = function () {
385
+ move.dispose();
386
+ _this._onDidChangeEnd.fire();
387
+ };
326
388
  move.value = new lifecycle_1.CompositeDisposable((0, events_1.addDisposableListener)(window, 'pointermove', function (e) {
327
389
  var containerRect = _this.options.container.getBoundingClientRect();
328
390
  var overlayRect = _this._element.getBoundingClientRect();
@@ -457,11 +519,17 @@ var Overlay = /** @class */ (function (_super) {
457
519
  }), {
458
520
  dispose: function () {
459
521
  iframes.release();
522
+ if (typeof resizeHandleElement.releasePointerCapture ===
523
+ 'function') {
524
+ try {
525
+ resizeHandleElement.releasePointerCapture(pointerId);
526
+ }
527
+ catch (_a) {
528
+ // ignore – pointer may already be released
529
+ }
530
+ }
460
531
  },
461
- }, (0, events_1.addDisposableListener)(window, 'pointerup', function () {
462
- move.dispose();
463
- _this._onDidChangeEnd.fire();
464
- }));
532
+ }, (0, events_1.addDisposableListener)(window, 'pointerup', end), (0, events_1.addDisposableListener)(window, 'pointercancel', end));
465
533
  }));
466
534
  };
467
535
  Overlay.prototype.getMinimumWidth = function (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;