dockview-core 3.2.0 → 4.0.1

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 (110) hide show
  1. package/dist/cjs/api/component.api.d.ts +0 -2
  2. package/dist/cjs/api/component.api.js +0 -10
  3. package/dist/cjs/dnd/abstractDragHandler.js +4 -2
  4. package/dist/cjs/dnd/dropTargetAnchorContainer.d.ts +16 -0
  5. package/dist/cjs/dnd/dropTargetAnchorContainer.js +105 -0
  6. package/dist/cjs/dnd/droptarget.d.ts +16 -0
  7. package/dist/cjs/dnd/droptarget.js +138 -14
  8. package/dist/cjs/dnd/ghost.d.ts +4 -1
  9. package/dist/cjs/dnd/ghost.js +3 -2
  10. package/dist/cjs/dnd/groupDragHandler.js +3 -1
  11. package/dist/cjs/dockview/components/panel/content.js +10 -13
  12. package/dist/cjs/dockview/components/popupService.d.ts +13 -0
  13. package/dist/cjs/dockview/components/popupService.js +76 -0
  14. package/dist/cjs/dockview/components/tab/tab.js +17 -7
  15. package/dist/cjs/dockview/components/titlebar/tabOverflowControl.d.ts +8 -0
  16. package/dist/cjs/dockview/components/titlebar/tabOverflowControl.js +20 -0
  17. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +45 -0
  18. package/dist/cjs/dockview/components/titlebar/tabs.js +288 -0
  19. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +8 -9
  20. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +108 -152
  21. package/dist/cjs/dockview/components/titlebar/voidContainer.js +2 -9
  22. package/dist/cjs/dockview/dockviewComponent.d.ts +10 -3
  23. package/dist/cjs/dockview/dockviewComponent.js +71 -30
  24. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +4 -0
  25. package/dist/cjs/dockview/dockviewGroupPanelModel.js +31 -0
  26. package/dist/cjs/dockview/dockviewPanelModel.d.ts +5 -3
  27. package/dist/cjs/dockview/dockviewPanelModel.js +25 -4
  28. package/dist/cjs/dockview/framework.d.ts +4 -1
  29. package/dist/cjs/dockview/options.d.ts +8 -5
  30. package/dist/cjs/dockview/options.js +3 -1
  31. package/dist/cjs/dockview/theme.d.ts +31 -0
  32. package/dist/cjs/dockview/theme.js +42 -0
  33. package/dist/cjs/dockview/types.d.ts +5 -1
  34. package/dist/cjs/dom.d.ts +1 -0
  35. package/dist/cjs/dom.js +15 -1
  36. package/dist/cjs/gridview/baseComponentGridview.d.ts +3 -0
  37. package/dist/cjs/index.d.ts +1 -0
  38. package/dist/cjs/index.js +1 -0
  39. package/dist/cjs/paneview/paneviewComponent.js +1 -0
  40. package/dist/cjs/scrollbar.d.ts +12 -0
  41. package/dist/cjs/scrollbar.js +106 -0
  42. package/dist/cjs/splitview/splitview.js +1 -0
  43. package/dist/cjs/splitview/splitviewComponent.js +1 -0
  44. package/dist/dockview-core.amd.js +930 -293
  45. package/dist/dockview-core.amd.js.map +1 -1
  46. package/dist/dockview-core.amd.min.js +2 -2
  47. package/dist/dockview-core.amd.min.js.map +1 -1
  48. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  49. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  50. package/dist/dockview-core.amd.noStyle.js +929 -292
  51. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  52. package/dist/dockview-core.cjs.js +930 -293
  53. package/dist/dockview-core.cjs.js.map +1 -1
  54. package/dist/dockview-core.esm.js +923 -294
  55. package/dist/dockview-core.esm.js.map +1 -1
  56. package/dist/dockview-core.esm.min.js +2 -2
  57. package/dist/dockview-core.esm.min.js.map +1 -1
  58. package/dist/dockview-core.js +930 -293
  59. package/dist/dockview-core.js.map +1 -1
  60. package/dist/dockview-core.min.js +2 -2
  61. package/dist/dockview-core.min.js.map +1 -1
  62. package/dist/dockview-core.min.noStyle.js +2 -2
  63. package/dist/dockview-core.min.noStyle.js.map +1 -1
  64. package/dist/dockview-core.noStyle.js +929 -292
  65. package/dist/dockview-core.noStyle.js.map +1 -1
  66. package/dist/esm/api/component.api.d.ts +0 -2
  67. package/dist/esm/api/component.api.js +0 -6
  68. package/dist/esm/dnd/abstractDragHandler.js +4 -2
  69. package/dist/esm/dnd/dropTargetAnchorContainer.d.ts +16 -0
  70. package/dist/esm/dnd/dropTargetAnchorContainer.js +74 -0
  71. package/dist/esm/dnd/droptarget.d.ts +16 -0
  72. package/dist/esm/dnd/droptarget.js +134 -14
  73. package/dist/esm/dnd/ghost.d.ts +4 -1
  74. package/dist/esm/dnd/ghost.js +3 -2
  75. package/dist/esm/dnd/groupDragHandler.js +3 -1
  76. package/dist/esm/dockview/components/panel/content.js +10 -13
  77. package/dist/esm/dockview/components/popupService.d.ts +13 -0
  78. package/dist/esm/dockview/components/popupService.js +53 -0
  79. package/dist/esm/dockview/components/tab/tab.js +15 -7
  80. package/dist/esm/dockview/components/titlebar/tabOverflowControl.d.ts +8 -0
  81. package/dist/esm/dockview/components/titlebar/tabOverflowControl.js +16 -0
  82. package/dist/esm/dockview/components/titlebar/tabs.d.ts +45 -0
  83. package/dist/esm/dockview/components/titlebar/tabs.js +183 -0
  84. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +8 -9
  85. package/dist/esm/dockview/components/titlebar/tabsContainer.js +133 -162
  86. package/dist/esm/dockview/components/titlebar/voidContainer.js +2 -9
  87. package/dist/esm/dockview/dockviewComponent.d.ts +10 -3
  88. package/dist/esm/dockview/dockviewComponent.js +69 -24
  89. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +4 -0
  90. package/dist/esm/dockview/dockviewGroupPanelModel.js +27 -0
  91. package/dist/esm/dockview/dockviewPanelModel.d.ts +5 -3
  92. package/dist/esm/dockview/dockviewPanelModel.js +14 -4
  93. package/dist/esm/dockview/framework.d.ts +4 -1
  94. package/dist/esm/dockview/options.d.ts +8 -5
  95. package/dist/esm/dockview/options.js +3 -1
  96. package/dist/esm/dockview/theme.d.ts +31 -0
  97. package/dist/esm/dockview/theme.js +39 -0
  98. package/dist/esm/dockview/types.d.ts +5 -1
  99. package/dist/esm/dom.d.ts +1 -0
  100. package/dist/esm/dom.js +13 -0
  101. package/dist/esm/gridview/baseComponentGridview.d.ts +3 -0
  102. package/dist/esm/index.d.ts +1 -0
  103. package/dist/esm/index.js +1 -0
  104. package/dist/esm/paneview/paneviewComponent.js +1 -0
  105. package/dist/esm/scrollbar.d.ts +12 -0
  106. package/dist/esm/scrollbar.js +80 -0
  107. package/dist/esm/splitview/splitview.js +1 -0
  108. package/dist/esm/splitview/splitviewComponent.js +1 -0
  109. package/dist/styles/dockview.css +423 -69
  110. package/package.json +1 -1
@@ -14,6 +14,8 @@ import { DockviewFloatingGroupPanel } from './dockviewFloatingGroupPanel';
14
14
  import { GroupDragEvent, TabDragEvent } from './components/titlebar/tabsContainer';
15
15
  import { AnchoredBox, AnchorPosition, Box } from '../types';
16
16
  import { DockviewPanelRenderer, OverlayRenderContainer } from '../overlay/overlayRenderContainer';
17
+ import { PopupService } from './components/popupService';
18
+ import { DropTargetAnchorContainer } from '../dnd/dropTargetAnchorContainer';
17
19
  export interface DockviewPopoutGroupOptions {
18
20
  /**
19
21
  * The position of the popout group
@@ -110,7 +112,6 @@ export interface IDockviewComponent extends IBaseGrid<DockviewGroupPanel> {
110
112
  readonly totalPanels: number;
111
113
  readonly panels: IDockviewPanel[];
112
114
  readonly orientation: Orientation;
113
- readonly gap: number;
114
115
  readonly onDidDrop: Event<DockviewDidDropEvent>;
115
116
  readonly onWillDrop: Event<DockviewWillDropEvent>;
116
117
  readonly onWillShowOverlay: Event<WillShowOverlayLocationEvent>;
@@ -163,8 +164,11 @@ export declare class DockviewComponent extends BaseGrid<DockviewGroupPanel> impl
163
164
  private readonly _deserializer;
164
165
  private readonly _api;
165
166
  private _options;
166
- private watermark;
167
+ private _watermark;
168
+ private readonly _themeClassnames;
167
169
  readonly overlayRenderContainer: OverlayRenderContainer;
170
+ readonly popupService: PopupService;
171
+ readonly rootDropTargetContainer: DropTargetAnchorContainer;
168
172
  private readonly _onWillDragPanel;
169
173
  readonly onWillDragPanel: Event<TabDragEvent>;
170
174
  private readonly _onWillDragGroup;
@@ -196,6 +200,8 @@ export declare class DockviewComponent extends BaseGrid<DockviewGroupPanel> impl
196
200
  readonly onDidRemoveGroup: Event<DockviewGroupPanel>;
197
201
  protected readonly _onDidAddGroup: Emitter<DockviewGroupPanel>;
198
202
  readonly onDidAddGroup: Event<DockviewGroupPanel>;
203
+ private readonly _onDidOptionsChange;
204
+ readonly onDidOptionsChange: Event<void>;
199
205
  private readonly _onDidActiveGroupChange;
200
206
  readonly onDidActiveGroupChange: Event<DockviewGroupPanel | undefined>;
201
207
  get orientation(): Orientation;
@@ -205,7 +211,6 @@ export declare class DockviewComponent extends BaseGrid<DockviewGroupPanel> impl
205
211
  get activePanel(): IDockviewPanel | undefined;
206
212
  get renderer(): DockviewPanelRenderer;
207
213
  get api(): DockviewApi;
208
- get gap(): number;
209
214
  get floatingGroups(): DockviewFloatingGroupPanel[];
210
215
  constructor(container: HTMLElement, options: DockviewComponentOptions);
211
216
  setVisible(panel: DockviewGroupPanel, visible: boolean): void;
@@ -262,5 +267,7 @@ export declare class DockviewComponent extends BaseGrid<DockviewGroupPanel> impl
262
267
  private createGroupAtLocation;
263
268
  private findGroup;
264
269
  private orientationAtLocation;
270
+ private updateDropTargetModel;
271
+ private updateTheme;
265
272
  }
266
273
  export {};
@@ -16,12 +16,15 @@ import { DockviewGroupPanel } from './dockviewGroupPanel';
16
16
  import { DockviewPanelModel } from './dockviewPanelModel';
17
17
  import { getPanelData } from '../dnd/dataTransfer';
18
18
  import { Overlay } from '../overlay/overlay';
19
- import { addTestId, getDockviewTheme, toggleClass, watchElementResize, } from '../dom';
19
+ import { addTestId, Classnames, getDockviewTheme, toggleClass, watchElementResize, } from '../dom';
20
20
  import { DockviewFloatingGroupPanel } from './dockviewFloatingGroupPanel';
21
21
  import { DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE, DEFAULT_FLOATING_GROUP_POSITION, } from '../constants';
22
22
  import { OverlayRenderContainer, } from '../overlay/overlayRenderContainer';
23
23
  import { PopoutWindow } from '../popoutWindow';
24
24
  import { StrictEventsSequencing } from './strictEventsSequencing';
25
+ import { PopupService } from './components/popupService';
26
+ import { DropTargetAnchorContainer } from '../dnd/dropTargetAnchorContainer';
27
+ import { themeAbyss } from './theme';
25
28
  const DEFAULT_ROOT_OVERLAY_MODEL = {
26
29
  activationSize: { type: 'pixels', value: 10 },
27
30
  size: { type: 'pixels', value: 20 },
@@ -67,14 +70,11 @@ export class DockviewComponent extends BaseGrid {
67
70
  get api() {
68
71
  return this._api;
69
72
  }
70
- get gap() {
71
- return this.gridview.margin;
72
- }
73
73
  get floatingGroups() {
74
74
  return this._floatingGroups;
75
75
  }
76
76
  constructor(container, options) {
77
- var _a;
77
+ var _a, _b, _c;
78
78
  super(container, {
79
79
  proportionalLayout: true,
80
80
  orientation: Orientation.HORIZONTAL,
@@ -83,12 +83,12 @@ export class DockviewComponent extends BaseGrid {
83
83
  : undefined,
84
84
  disableAutoResizing: options.disableAutoResizing,
85
85
  locked: options.locked,
86
- margin: options.gap,
86
+ margin: (_b = (_a = options.theme) === null || _a === void 0 ? void 0 : _a.gap) !== null && _b !== void 0 ? _b : 0,
87
87
  className: options.className,
88
88
  });
89
89
  this.nextGroupId = sequentialNumberGenerator();
90
90
  this._deserializer = new DefaultDockviewDeserialzier(this);
91
- this.watermark = null;
91
+ this._watermark = null;
92
92
  this._onWillDragPanel = new Emitter();
93
93
  this.onWillDragPanel = this._onWillDragPanel.event;
94
94
  this._onWillDragGroup = new Emitter();
@@ -119,16 +119,22 @@ export class DockviewComponent extends BaseGrid {
119
119
  this.onDidRemoveGroup = this._onDidRemoveGroup.event;
120
120
  this._onDidAddGroup = new Emitter();
121
121
  this.onDidAddGroup = this._onDidAddGroup.event;
122
+ this._onDidOptionsChange = new Emitter();
123
+ this.onDidOptionsChange = this._onDidOptionsChange.event;
122
124
  this._onDidActiveGroupChange = new Emitter();
123
125
  this.onDidActiveGroupChange = this._onDidActiveGroupChange.event;
124
126
  this._moving = false;
127
+ this.popupService = new PopupService(this.element);
128
+ this.updateDropTargetModel(options);
129
+ this._themeClassnames = new Classnames(this.element);
130
+ this.rootDropTargetContainer = new DropTargetAnchorContainer(this.element, { disabled: true });
125
131
  this.overlayRenderContainer = new OverlayRenderContainer(this.gridview.element, this);
126
132
  toggleClass(this.gridview.element, 'dv-dockview', true);
127
133
  toggleClass(this.element, 'dv-debug', !!options.debug);
128
134
  if (options.debug) {
129
135
  this.addDisposables(new StrictEventsSequencing(this));
130
136
  }
131
- this.addDisposables(this.overlayRenderContainer, this._onWillDragPanel, this._onWillDragGroup, this._onWillShowOverlay, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, this._onWillDrop, this._onDidMovePanel, this._onDidAddGroup, this._onDidRemoveGroup, this._onDidActiveGroupChange, this._onUnhandledDragOverEvent, this._onDidMaximizedGroupChange, this.onDidViewVisibilityChangeMicroTaskQueue(() => {
137
+ this.addDisposables(this.rootDropTargetContainer, this.overlayRenderContainer, this._onWillDragPanel, this._onWillDragGroup, this._onWillShowOverlay, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, this._onWillDrop, this._onDidMovePanel, this._onDidAddGroup, this._onDidRemoveGroup, this._onDidActiveGroupChange, this._onUnhandledDragOverEvent, this._onDidMaximizedGroupChange, this._onDidOptionsChange, this.onDidViewVisibilityChangeMicroTaskQueue(() => {
132
138
  this.updateWatermark();
133
139
  }), this.onDidAdd((event) => {
134
140
  if (!this._moving) {
@@ -162,7 +168,9 @@ export class DockviewComponent extends BaseGrid {
162
168
  }
163
169
  }));
164
170
  this._options = options;
171
+ this.updateTheme();
165
172
  this._rootDropTarget = new Droptarget(this.element, {
173
+ className: 'dv-drop-target-edge',
166
174
  canDisplayOverlay: (event, position) => {
167
175
  const data = getPanelData();
168
176
  if (data) {
@@ -189,7 +197,8 @@ export class DockviewComponent extends BaseGrid {
189
197
  return firedEvent.isAccepted;
190
198
  },
191
199
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
192
- overlayModel: (_a = this.options.rootOverlayModel) !== null && _a !== void 0 ? _a : DEFAULT_ROOT_OVERLAY_MODEL,
200
+ overlayModel: (_c = this.options.rootOverlayModel) !== null && _c !== void 0 ? _c : DEFAULT_ROOT_OVERLAY_MODEL,
201
+ getOverrideTarget: () => { var _a; return (_a = this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
193
202
  });
194
203
  this.addDisposables(this._rootDropTarget, this._rootDropTarget.onWillShowOverlay((event) => {
195
204
  if (this.gridview.length > 0 && event.position === 'center') {
@@ -367,6 +376,10 @@ export class DockviewComponent extends BaseGrid {
367
376
  popoutContainer.style.overflow = 'hidden';
368
377
  popoutContainer.appendChild(gready);
369
378
  popoutContainer.appendChild(group.element);
379
+ const anchor = document.createElement('div');
380
+ const dropTargetContainer = new DropTargetAnchorContainer(anchor, { disabled: this.rootDropTargetContainer.disabled });
381
+ popoutContainer.appendChild(anchor);
382
+ group.model.dropTargetContainer = dropTargetContainer;
370
383
  group.model.location = {
371
384
  type: 'popout',
372
385
  getWindow: () => _window.window,
@@ -433,6 +446,8 @@ export class DockviewComponent extends BaseGrid {
433
446
  else if (this.getPanel(group.id)) {
434
447
  group.model.renderContainer =
435
448
  this.overlayRenderContainer;
449
+ group.model.dropTargetContainer =
450
+ this.rootDropTargetContainer;
436
451
  returnedGroup = group;
437
452
  const alreadyRemoved = !this._popoutGroups.find((p) => p.popoutGroup === group);
438
453
  if (alreadyRemoved) {
@@ -655,7 +670,7 @@ export class DockviewComponent extends BaseGrid {
655
670
  }
656
671
  }
657
672
  updateOptions(options) {
658
- var _a, _b, _c, _d;
673
+ var _a, _b;
659
674
  super.updateOptions(options);
660
675
  if ('floatingGroupBounds' in options) {
661
676
  for (const group of this._floatingGroups) {
@@ -679,13 +694,11 @@ export class DockviewComponent extends BaseGrid {
679
694
  group.overlay.setBounds();
680
695
  }
681
696
  }
682
- if ('rootOverlayModel' in options) {
683
- this._rootDropTarget.setOverlayModel((_c = options.rootOverlayModel) !== null && _c !== void 0 ? _c : DEFAULT_ROOT_OVERLAY_MODEL);
684
- }
685
- if ('gap' in options) {
686
- this.gridview.margin = (_d = options.gap) !== null && _d !== void 0 ? _d : 0;
687
- }
697
+ this.updateDropTargetModel(options);
688
698
  this._options = Object.assign(Object.assign({}, this.options), options);
699
+ if ('theme' in options) {
700
+ this.updateTheme();
701
+ }
689
702
  this.layout(this.gridview.width, this.gridview.height, true);
690
703
  }
691
704
  layout(width, height, forceResize) {
@@ -1103,22 +1116,22 @@ export class DockviewComponent extends BaseGrid {
1103
1116
  updateWatermark() {
1104
1117
  var _a, _b;
1105
1118
  if (this.groups.filter((x) => x.api.location.type === 'grid' && x.api.isVisible).length === 0) {
1106
- if (!this.watermark) {
1107
- this.watermark = this.createWatermarkComponent();
1108
- this.watermark.init({
1119
+ if (!this._watermark) {
1120
+ this._watermark = this.createWatermarkComponent();
1121
+ this._watermark.init({
1109
1122
  containerApi: new DockviewApi(this),
1110
1123
  });
1111
1124
  const watermarkContainer = document.createElement('div');
1112
1125
  watermarkContainer.className = 'dv-watermark-container';
1113
1126
  addTestId(watermarkContainer, 'watermark-component');
1114
- watermarkContainer.appendChild(this.watermark.element);
1127
+ watermarkContainer.appendChild(this._watermark.element);
1115
1128
  this.gridview.element.appendChild(watermarkContainer);
1116
1129
  }
1117
1130
  }
1118
- else if (this.watermark) {
1119
- this.watermark.element.parentElement.remove();
1120
- (_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
1121
- this.watermark = null;
1131
+ else if (this._watermark) {
1132
+ this._watermark.element.parentElement.remove();
1133
+ (_b = (_a = this._watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
1134
+ this._watermark = null;
1122
1135
  }
1123
1136
  }
1124
1137
  addGroup(options) {
@@ -1604,4 +1617,36 @@ export class DockviewComponent extends BaseGrid {
1604
1617
  ? rootOrientation
1605
1618
  : orthogonal(rootOrientation);
1606
1619
  }
1620
+ updateDropTargetModel(options) {
1621
+ if ('dndEdges' in options) {
1622
+ this._rootDropTarget.disabled =
1623
+ typeof options.dndEdges === 'boolean' &&
1624
+ options.dndEdges === false;
1625
+ if (typeof options.dndEdges === 'object' &&
1626
+ options.dndEdges !== null) {
1627
+ this._rootDropTarget.setOverlayModel(options.dndEdges);
1628
+ }
1629
+ else {
1630
+ this._rootDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
1631
+ }
1632
+ }
1633
+ if ('rootOverlayModel' in options) {
1634
+ this.updateDropTargetModel({ dndEdges: options.dndEdges });
1635
+ }
1636
+ }
1637
+ updateTheme() {
1638
+ var _a, _b;
1639
+ const theme = (_a = this._options.theme) !== null && _a !== void 0 ? _a : themeAbyss;
1640
+ this._themeClassnames.setClassNames(theme.className);
1641
+ this.gridview.margin = (_b = theme.gap) !== null && _b !== void 0 ? _b : 0;
1642
+ switch (theme.dndOverlayMounting) {
1643
+ case 'absolute':
1644
+ this.rootDropTargetContainer.disabled = false;
1645
+ break;
1646
+ case 'relative':
1647
+ default:
1648
+ this.rootDropTargetContainer.disabled = true;
1649
+ break;
1650
+ }
1651
+ }
1607
1652
  }
@@ -13,6 +13,7 @@ import { DockviewDndOverlayEvent } from './options';
13
13
  import { OverlayRenderContainer } from '../overlay/overlayRenderContainer';
14
14
  import { TitleEvent } from '../api/dockviewPanelApi';
15
15
  import { Contraints } from '../gridview/gridviewPanel';
16
+ import { DropTargetAnchorContainer } from '../dnd/dropTargetAnchorContainer';
16
17
  interface GroupMoveEvent {
17
18
  groupId: string;
18
19
  itemId?: string;
@@ -160,6 +161,7 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
160
161
  private _location;
161
162
  private mostRecentlyUsed;
162
163
  private _overwriteRenderContainer;
164
+ private _overwriteDropTargetContainer;
163
165
  private readonly _onDidChange;
164
166
  readonly onDidChange: Event<IViewSize | undefined>;
165
167
  private _width;
@@ -208,6 +210,8 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
208
210
  focusContent(): void;
209
211
  set renderContainer(value: OverlayRenderContainer | null);
210
212
  get renderContainer(): OverlayRenderContainer;
213
+ set dropTargetContainer(value: DropTargetAnchorContainer | null);
214
+ get dropTargetContainer(): DropTargetAnchorContainer | null;
211
215
  initialize(): void;
212
216
  rerender(panel: IDockviewPanel): void;
213
217
  indexOf(panel: IDockviewPanel): number;
@@ -156,6 +156,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
156
156
  this._location = { type: 'grid' };
157
157
  this.mostRecentlyUsed = [];
158
158
  this._overwriteRenderContainer = null;
159
+ this._overwriteDropTargetContainer = null;
159
160
  this._onDidChange = new Emitter();
160
161
  this.onDidChange = this._onDidChange.event;
161
162
  this._width = 0;
@@ -233,6 +234,13 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
233
234
  var _a;
234
235
  return ((_a = this._overwriteRenderContainer) !== null && _a !== void 0 ? _a : this.accessor.overlayRenderContainer);
235
236
  }
237
+ set dropTargetContainer(value) {
238
+ this._overwriteDropTargetContainer = value;
239
+ }
240
+ get dropTargetContainer() {
241
+ var _a;
242
+ return ((_a = this._overwriteDropTargetContainer) !== null && _a !== void 0 ? _a : this.accessor.rootDropTargetContainer);
243
+ }
236
244
  initialize() {
237
245
  if (this.options.panels) {
238
246
  this.options.panels.forEach((panel) => {
@@ -581,6 +589,25 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
581
589
  }
582
590
  const data = getPanelData();
583
591
  if (data && data.viewId === this.accessor.id) {
592
+ if (type === 'content') {
593
+ if (data.groupId === this.id) {
594
+ // don't allow to drop on self for center position
595
+ if (position === 'center') {
596
+ return;
597
+ }
598
+ if (data.panelId === null) {
599
+ // don't allow group move to drop anywhere on self
600
+ return;
601
+ }
602
+ }
603
+ }
604
+ if (type === 'header') {
605
+ if (data.groupId === this.id) {
606
+ if (data.panelId === null) {
607
+ return;
608
+ }
609
+ }
610
+ }
584
611
  if (data.panelId === null) {
585
612
  // this is a group move dnd event
586
613
  const { groupId } = data;
@@ -1,8 +1,8 @@
1
1
  import { GroupPanelPartInitParameters, IContentRenderer, ITabRenderer } from './types';
2
- import { DockviewGroupPanel } from './dockviewGroupPanel';
3
2
  import { IDisposable } from '../lifecycle';
4
3
  import { IDockviewComponent } from './dockviewComponent';
5
4
  import { PanelUpdateEvent } from '../panel/types';
5
+ import { TabLocation } from './framework';
6
6
  export interface IDockviewPanelModel extends IDisposable {
7
7
  readonly contentComponent: string;
8
8
  readonly tabComponent?: string;
@@ -11,7 +11,7 @@ export interface IDockviewPanelModel extends IDisposable {
11
11
  update(event: PanelUpdateEvent): void;
12
12
  layout(width: number, height: number): void;
13
13
  init(params: GroupPanelPartInitParameters): void;
14
- updateParentGroup(group: DockviewGroupPanel, isPanelVisible: boolean): void;
14
+ createTabRenderer(tabLocation: TabLocation): ITabRenderer;
15
15
  }
16
16
  export declare class DockviewPanelModel implements IDockviewPanelModel {
17
17
  private readonly accessor;
@@ -20,11 +20,13 @@ export declare class DockviewPanelModel implements IDockviewPanelModel {
20
20
  readonly tabComponent?: string | undefined;
21
21
  private readonly _content;
22
22
  private readonly _tab;
23
+ private _params;
24
+ private _updateEvent;
23
25
  get content(): IContentRenderer;
24
26
  get tab(): ITabRenderer;
25
27
  constructor(accessor: IDockviewComponent, id: string, contentComponent: string, tabComponent?: string | undefined);
28
+ createTabRenderer(tabLocation: TabLocation): ITabRenderer;
26
29
  init(params: GroupPanelPartInitParameters): void;
27
- updateParentGroup(_group: DockviewGroupPanel, _isPanelVisible: boolean): void;
28
30
  layout(width: number, height: number): void;
29
31
  update(event: PanelUpdateEvent): void;
30
32
  dispose(): void;
@@ -14,12 +14,21 @@ export class DockviewPanelModel {
14
14
  this._content = this.createContentComponent(this.id, contentComponent);
15
15
  this._tab = this.createTabComponent(this.id, tabComponent);
16
16
  }
17
+ createTabRenderer(tabLocation) {
18
+ var _a;
19
+ const cmp = this.createTabComponent(this.id, this.tabComponent);
20
+ if (this._params) {
21
+ cmp.init(Object.assign(Object.assign({}, this._params), { tabLocation }));
22
+ }
23
+ if (this._updateEvent) {
24
+ (_a = cmp.update) === null || _a === void 0 ? void 0 : _a.call(cmp, this._updateEvent);
25
+ }
26
+ return cmp;
27
+ }
17
28
  init(params) {
29
+ this._params = params;
18
30
  this.content.init(params);
19
- this.tab.init(params);
20
- }
21
- updateParentGroup(_group, _isPanelVisible) {
22
- // noop
31
+ this.tab.init(Object.assign(Object.assign({}, params), { tabLocation: 'header' }));
23
32
  }
24
33
  layout(width, height) {
25
34
  var _a, _b;
@@ -27,6 +36,7 @@ export class DockviewPanelModel {
27
36
  }
28
37
  update(event) {
29
38
  var _a, _b, _c, _d;
39
+ this._updateEvent = event;
30
40
  (_b = (_a = this.content).update) === null || _b === void 0 ? void 0 : _b.call(_a, event);
31
41
  (_d = (_c = this.tab).update) === null || _d === void 0 ? void 0 : _d.call(_c, event);
32
42
  }
@@ -10,9 +10,12 @@ export interface IGroupPanelBaseProps<T extends {
10
10
  api: DockviewPanelApi;
11
11
  containerApi: DockviewApi;
12
12
  }
13
+ export type TabLocation = 'header' | 'headerOverflow';
13
14
  export type IDockviewPanelHeaderProps<T extends {
14
15
  [index: string]: any;
15
- } = any> = IGroupPanelBaseProps<T>;
16
+ } = any> = IGroupPanelBaseProps<T> & {
17
+ tabLocation: TabLocation;
18
+ };
16
19
  export type IDockviewPanelProps<T extends {
17
20
  [index: string]: any;
18
21
  } = any> = IGroupPanelBaseProps<T>;
@@ -14,6 +14,7 @@ import { IGroupHeaderProps } from './framework';
14
14
  import { FloatingGroupOptions } from './dockviewComponent';
15
15
  import { Contraints } from '../gridview/gridviewPanel';
16
16
  import { AcceptableEvent, IAcceptableEvent } from '../events';
17
+ import { DockviewTheme } from './theme';
17
18
  export interface IHeaderActionsRenderer extends IDisposable {
18
19
  readonly element: HTMLElement;
19
20
  init(params: IGroupHeaderProps): void;
@@ -43,18 +44,20 @@ export interface DockviewOptions {
43
44
  popoutUrl?: string;
44
45
  defaultRenderer?: DockviewPanelRenderer;
45
46
  debug?: boolean;
47
+ dndEdges?: false | DroptargetOverlayModel;
48
+ /**
49
+ * @deprecated use `dndEdges` instead. To be removed in a future version.
50
+ * */
46
51
  rootOverlayModel?: DroptargetOverlayModel;
47
- locked?: boolean;
48
52
  disableDnd?: boolean;
53
+ locked?: boolean;
49
54
  className?: string;
50
- /**
51
- * Pixel gap between groups
52
- */
53
- gap?: number;
54
55
  /**
55
56
  * Define the behaviour of the dock when there are no panels to display. Defaults to `watermark`.
56
57
  */
57
58
  noPanelsOverlay?: 'emptyGroup' | 'watermark';
59
+ theme?: DockviewTheme;
60
+ disableTabsOverflowList?: boolean;
58
61
  }
59
62
  export interface DockviewDndOverlayEvent extends IAcceptableEvent {
60
63
  nativeEvent: DragEvent;
@@ -26,9 +26,11 @@ export const PROPERTY_KEYS_DOCKVIEW = (() => {
26
26
  rootOverlayModel: undefined,
27
27
  locked: undefined,
28
28
  disableDnd: undefined,
29
- gap: undefined,
30
29
  className: undefined,
31
30
  noPanelsOverlay: undefined,
31
+ dndEdges: undefined,
32
+ theme: undefined,
33
+ disableTabsOverflowList: undefined,
32
34
  };
33
35
  return Object.keys(properties);
34
36
  })();
@@ -0,0 +1,31 @@
1
+ export interface DockviewTheme {
2
+ /**
3
+ * The name of the theme
4
+ */
5
+ name: string;
6
+ /**
7
+ * The class name to apply to the theme containing the CSS variables settings.
8
+ */
9
+ className: string;
10
+ /**
11
+ * The gap between the groups
12
+ */
13
+ gap?: number;
14
+ /**
15
+ * The mouting position of the overlay shown when dragging a panel. `absolute`
16
+ * will mount the overlay to root of the dockview component whereas `relative` will mount the overlay to the group container.
17
+ */
18
+ dndOverlayMounting?: 'absolute' | 'relative';
19
+ /**
20
+ * When dragging a panel, the overlay can either encompass the panel contents or the entire group including the tab header space.
21
+ */
22
+ dndPanelOverlay?: 'content' | 'group';
23
+ }
24
+ export declare const themeDark: DockviewTheme;
25
+ export declare const themeLight: DockviewTheme;
26
+ export declare const themeVisualStudio: DockviewTheme;
27
+ export declare const themeAbyss: DockviewTheme;
28
+ export declare const themeDracula: DockviewTheme;
29
+ export declare const themeReplit: DockviewTheme;
30
+ export declare const themeAbyssSpaced: DockviewTheme;
31
+ export declare const themeLightSpaced: DockviewTheme;
@@ -0,0 +1,39 @@
1
+ export const themeDark = {
2
+ name: 'dark',
3
+ className: 'dockview-theme-dark',
4
+ };
5
+ export const themeLight = {
6
+ name: 'light',
7
+ className: 'dockview-theme-light',
8
+ };
9
+ export const themeVisualStudio = {
10
+ name: 'visualStudio',
11
+ className: 'dockview-theme-vs',
12
+ };
13
+ export const themeAbyss = {
14
+ name: 'abyss',
15
+ className: 'dockview-theme-abyss',
16
+ };
17
+ export const themeDracula = {
18
+ name: 'dracula',
19
+ className: 'dockview-theme-dracula',
20
+ };
21
+ export const themeReplit = {
22
+ name: 'replit',
23
+ className: 'dockview-theme-replit',
24
+ gap: 10,
25
+ };
26
+ export const themeAbyssSpaced = {
27
+ name: 'abyssSpaced',
28
+ className: 'dockview-theme-abyss-spaced',
29
+ gap: 10,
30
+ dndOverlayMounting: 'absolute',
31
+ dndPanelOverlay: 'group',
32
+ };
33
+ export const themeLightSpaced = {
34
+ name: 'lightSpaced',
35
+ className: 'dockview-theme-light-spaced',
36
+ gap: 10,
37
+ dndOverlayMounting: 'absolute',
38
+ dndPanelOverlay: 'group',
39
+ };
@@ -4,6 +4,7 @@ import { DockviewApi } from '../api/component.api';
4
4
  import { Optional } from '../types';
5
5
  import { IDockviewGroupPanel } from './dockviewGroupPanel';
6
6
  import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
7
+ import { TabLocation } from './framework';
7
8
  export interface HeaderPartInitParameters {
8
9
  title: string;
9
10
  }
@@ -20,9 +21,12 @@ export interface IWatermarkRenderer extends Optional<Omit<IPanel, 'id' | 'init'>
20
21
  readonly element: HTMLElement;
21
22
  init: (params: WatermarkRendererInitParameters) => void;
22
23
  }
24
+ export interface TabPartInitParameters extends GroupPanelPartInitParameters {
25
+ tabLocation: TabLocation;
26
+ }
23
27
  export interface ITabRenderer extends Optional<Omit<IPanel, 'id'>, RendererMethodOptionalList> {
24
28
  readonly element: HTMLElement;
25
- init(parameters: GroupPanelPartInitParameters): void;
29
+ init(parameters: TabPartInitParameters): void;
26
30
  }
27
31
  export interface IContentRenderer extends Optional<Omit<IPanel, 'id'>, RendererMethodOptionalList> {
28
32
  readonly element: HTMLElement;
package/dist/esm/dom.d.ts CHANGED
@@ -47,3 +47,4 @@ export declare class Classnames {
47
47
  constructor(element: HTMLElement);
48
48
  setClassNames(classNames: string): void;
49
49
  }
50
+ export declare function isChildEntirelyVisibleWithinParent(child: HTMLElement, parent: HTMLElement): boolean;
package/dist/esm/dom.js CHANGED
@@ -252,3 +252,16 @@ export class Classnames {
252
252
  }
253
253
  }
254
254
  }
255
+ export function isChildEntirelyVisibleWithinParent(child, parent) {
256
+ //
257
+ const childPosition = getDomNodePagePosition(child);
258
+ const parentPosition = getDomNodePagePosition(parent);
259
+ if (childPosition.left < parentPosition.left) {
260
+ return false;
261
+ }
262
+ if (childPosition.left + childPosition.width >
263
+ parentPosition.left + parentPosition.width) {
264
+ return false;
265
+ }
266
+ return true;
267
+ }
@@ -6,6 +6,9 @@ import { ISplitviewStyles, Orientation } from '../splitview/splitview';
6
6
  import { IPanel } from '../panel/types';
7
7
  import { MovementOptions2 } from '../dockview/options';
8
8
  import { Resizable } from '../resizable';
9
+ /**
10
+ * A direction in which a panel can be moved or placed relative to another panel.
11
+ */
9
12
  export type Direction = 'left' | 'right' | 'above' | 'below' | 'within';
10
13
  export declare function toTarget(direction: Direction): Position;
11
14
  export interface MaximizedChanged<T extends IGridPanelView> {
@@ -22,6 +22,7 @@ export * from './dockview/types';
22
22
  export * from './dockview/dockviewGroupPanel';
23
23
  export { IGroupPanelBaseProps, IDockviewPanelHeaderProps, IDockviewPanelProps, IDockviewHeaderActionsProps, IGroupHeaderProps, IWatermarkPanelProps, DockviewReadyEvent, } from './dockview/framework';
24
24
  export * from './dockview/options';
25
+ export * from './dockview/theme';
25
26
  export * from './dockview/dockviewPanel';
26
27
  export { DefaultTab } from './dockview/components/tab/defaultTab';
27
28
  export { DefaultDockviewDeserialzier, IPanelDeserializer, } from './dockview/deserializer';
package/dist/esm/index.js CHANGED
@@ -20,6 +20,7 @@ export * from './dockview/dockviewGroupPanelModel';
20
20
  export * from './dockview/types';
21
21
  export * from './dockview/dockviewGroupPanel';
22
22
  export * from './dockview/options';
23
+ export * from './dockview/theme';
23
24
  export * from './dockview/dockviewPanel';
24
25
  export { DefaultTab } from './dockview/components/tab/defaultTab';
25
26
  export { DefaultDockviewDeserialzier, } from './dockview/deserializer';
@@ -282,6 +282,7 @@ export class PaneviewComponent extends Resizable {
282
282
  value.dispose();
283
283
  }
284
284
  this._viewDisposables.clear();
285
+ this.element.remove();
285
286
  this.paneview.dispose();
286
287
  }
287
288
  }
@@ -0,0 +1,12 @@
1
+ import { CompositeDisposable } from './lifecycle';
2
+ export declare class Scrollbar extends CompositeDisposable {
3
+ private readonly scrollableElement;
4
+ private readonly _element;
5
+ private readonly _horizontalScrollbar;
6
+ private _scrollLeft;
7
+ private _animationTimer;
8
+ static MouseWheelSpeed: number;
9
+ get element(): HTMLElement;
10
+ constructor(scrollableElement: HTMLElement);
11
+ private calculateScrollbarStyles;
12
+ }