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
@@ -352,7 +352,6 @@ export declare class DockviewApi implements CommonApi<SerializedDockview> {
352
352
  * Total number of panels.
353
353
  */
354
354
  get totalPanels(): number;
355
- get gap(): number;
356
355
  /**
357
356
  * Invoked when the active group changes. May be undefined if no group is active.
358
357
  */
@@ -514,7 +513,6 @@ export declare class DockviewApi implements CommonApi<SerializedDockview> {
514
513
  window: Window;
515
514
  }) => void;
516
515
  }): Promise<boolean>;
517
- setGap(gap: number | undefined): void;
518
516
  updateOptions(options: Partial<DockviewComponentOptions>): void;
519
517
  /**
520
518
  * Release resources and teardown component. Do not call when using framework versions of dockview.
@@ -473,9 +473,6 @@ export class DockviewApi {
473
473
  get totalPanels() {
474
474
  return this.component.totalPanels;
475
475
  }
476
- get gap() {
477
- return this.component.gap;
478
- }
479
476
  /**
480
477
  * Invoked when the active group changes. May be undefined if no group is active.
481
478
  */
@@ -706,9 +703,6 @@ export class DockviewApi {
706
703
  addPopoutGroup(item, options) {
707
704
  return this.component.addPopoutGroup(item, options);
708
705
  }
709
- setGap(gap) {
710
- this.component.updateOptions({ gap });
711
- }
712
706
  updateOptions(options) {
713
707
  this.component.updateOptions(options);
714
708
  }
@@ -42,14 +42,16 @@ export class DragHandler extends CompositeDisposable {
42
42
  * For example: in react-dnd if dataTransfer.types is not set then the dragStart event will be cancelled
43
43
  * through .preventDefault(). Since this is applied globally to all drag events this would break dockviews
44
44
  * dnd logic. You can see the code at
45
- * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
45
+ P * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
46
46
  */
47
47
  event.dataTransfer.setData('text/plain', '');
48
48
  }
49
49
  }
50
50
  }), addDisposableListener(this.el, 'dragend', () => {
51
51
  this.pointerEventsDisposable.dispose();
52
- this.dataDisposable.dispose();
52
+ setTimeout(() => {
53
+ this.dataDisposable.dispose(); // allow the data to be read by other handlers before disposing
54
+ }, 0);
53
55
  }));
54
56
  }
55
57
  }
@@ -0,0 +1,16 @@
1
+ import { CompositeDisposable } from '../lifecycle';
2
+ import { DropTargetTargetModel } from './droptarget';
3
+ export declare class DropTargetAnchorContainer extends CompositeDisposable {
4
+ readonly element: HTMLElement;
5
+ private _model;
6
+ private _outline;
7
+ private _disabled;
8
+ get disabled(): boolean;
9
+ set disabled(value: boolean);
10
+ get model(): DropTargetTargetModel | undefined;
11
+ constructor(element: HTMLElement, options: {
12
+ disabled: boolean;
13
+ });
14
+ private createContainer;
15
+ private createAnchor;
16
+ }
@@ -0,0 +1,74 @@
1
+ import { CompositeDisposable, Disposable } from '../lifecycle';
2
+ export class DropTargetAnchorContainer extends CompositeDisposable {
3
+ get disabled() {
4
+ return this._disabled;
5
+ }
6
+ set disabled(value) {
7
+ var _a;
8
+ if (this.disabled === value) {
9
+ return;
10
+ }
11
+ this._disabled = value;
12
+ if (value) {
13
+ (_a = this.model) === null || _a === void 0 ? void 0 : _a.clear();
14
+ }
15
+ }
16
+ get model() {
17
+ if (this.disabled) {
18
+ return undefined;
19
+ }
20
+ return {
21
+ clear: () => {
22
+ var _a;
23
+ if (this._model) {
24
+ (_a = this._model.root.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(this._model.root);
25
+ }
26
+ this._model = undefined;
27
+ },
28
+ exists: () => {
29
+ return !!this._model;
30
+ },
31
+ getElements: (event, outline) => {
32
+ const changed = this._outline !== outline;
33
+ this._outline = outline;
34
+ if (this._model) {
35
+ this._model.changed = changed;
36
+ return this._model;
37
+ }
38
+ const container = this.createContainer();
39
+ const anchor = this.createAnchor();
40
+ this._model = { root: container, overlay: anchor, changed };
41
+ container.appendChild(anchor);
42
+ this.element.appendChild(container);
43
+ if ((event === null || event === void 0 ? void 0 : event.target) instanceof HTMLElement) {
44
+ const targetBox = event.target.getBoundingClientRect();
45
+ const box = this.element.getBoundingClientRect();
46
+ anchor.style.left = `${targetBox.left - box.left}px`;
47
+ anchor.style.top = `${targetBox.top - box.top}px`;
48
+ }
49
+ return this._model;
50
+ },
51
+ };
52
+ }
53
+ constructor(element, options) {
54
+ super();
55
+ this.element = element;
56
+ this._disabled = false;
57
+ this._disabled = options.disabled;
58
+ this.addDisposables(Disposable.from(() => {
59
+ var _a;
60
+ (_a = this.model) === null || _a === void 0 ? void 0 : _a.clear();
61
+ }));
62
+ }
63
+ createContainer() {
64
+ const el = document.createElement('div');
65
+ el.className = 'dv-drop-target-container';
66
+ return el;
67
+ }
68
+ createAnchor() {
69
+ const el = document.createElement('div');
70
+ el.className = 'dv-drop-target-anchor';
71
+ el.style.visibility = 'hidden';
72
+ return el;
73
+ }
74
+ }
@@ -27,10 +27,22 @@ export type DroptargetOverlayModel = {
27
27
  size?: MeasuredValue;
28
28
  activationSize?: MeasuredValue;
29
29
  };
30
+ export interface DropTargetTargetModel {
31
+ getElements(event?: DragEvent, outline?: HTMLElement): {
32
+ root: HTMLElement;
33
+ overlay: HTMLElement;
34
+ changed: boolean;
35
+ };
36
+ exists(): boolean;
37
+ clear(): void;
38
+ }
30
39
  export interface DroptargetOptions {
31
40
  canDisplayOverlay: CanDisplayOverlay;
32
41
  acceptedTargetZones: Position[];
33
42
  overlayModel?: DroptargetOverlayModel;
43
+ getOverrideTarget?: () => DropTargetTargetModel | undefined;
44
+ className?: string;
45
+ getOverlayOutline?: () => HTMLElement | null;
34
46
  }
35
47
  export declare class Droptarget extends CompositeDisposable {
36
48
  private readonly element;
@@ -45,6 +57,10 @@ export declare class Droptarget extends CompositeDisposable {
45
57
  readonly onWillShowOverlay: Event<WillShowOverlayEvent>;
46
58
  readonly dnd: DragAndDropObserver;
47
59
  private static USED_EVENT_ID;
60
+ private static ACTUAL_TARGET;
61
+ private _disabled;
62
+ get disabled(): boolean;
63
+ set disabled(value: boolean);
48
64
  get state(): Position | undefined;
49
65
  constructor(element: HTMLElement, options: DroptargetOptions);
50
66
  setTargetZones(acceptedTargetZones: Position[]): void;
@@ -58,6 +58,12 @@ const DEFAULT_SIZE = {
58
58
  const SMALL_WIDTH_BOUNDARY = 100;
59
59
  const SMALL_HEIGHT_BOUNDARY = 100;
60
60
  export class Droptarget extends CompositeDisposable {
61
+ get disabled() {
62
+ return this._disabled;
63
+ }
64
+ set disabled(value) {
65
+ this._disabled = value;
66
+ }
61
67
  get state() {
62
68
  return this._state;
63
69
  }
@@ -69,23 +75,34 @@ export class Droptarget extends CompositeDisposable {
69
75
  this.onDrop = this._onDrop.event;
70
76
  this._onWillShowOverlay = new Emitter();
71
77
  this.onWillShowOverlay = this._onWillShowOverlay.event;
78
+ this._disabled = false;
72
79
  // use a set to take advantage of #<set>.has
73
80
  this._acceptedTargetZonesSet = new Set(this.options.acceptedTargetZones);
74
81
  this.dnd = new DragAndDropObserver(this.element, {
75
- onDragEnter: () => undefined,
82
+ onDragEnter: () => {
83
+ var _a, _b, _c;
84
+ (_c = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.getElements();
85
+ },
76
86
  onDragOver: (e) => {
87
+ var _a, _b, _c, _d, _e, _f, _g;
88
+ Droptarget.ACTUAL_TARGET = this;
89
+ const overrideTraget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
77
90
  if (this._acceptedTargetZonesSet.size === 0) {
91
+ if (overrideTraget) {
92
+ return;
93
+ }
78
94
  this.removeDropTarget();
79
95
  return;
80
96
  }
81
- const width = this.element.clientWidth;
82
- const height = this.element.clientHeight;
97
+ const target = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;
98
+ const width = target.offsetWidth;
99
+ const height = target.offsetHeight;
83
100
  if (width === 0 || height === 0) {
84
101
  return; // avoid div!0
85
102
  }
86
103
  const rect = e.currentTarget.getBoundingClientRect();
87
- const x = e.clientX - rect.left;
88
- const y = e.clientY - rect.top;
104
+ const x = ((_f = e.clientX) !== null && _f !== void 0 ? _f : 0) - rect.left;
105
+ const y = ((_g = e.clientY) !== null && _g !== void 0 ? _g : 0) - rect.top;
89
106
  const quadrant = this.calculateQuadrant(this._acceptedTargetZonesSet, x, y, width, height);
90
107
  /**
91
108
  * If the event has already been used by another DropTarget instance
@@ -98,6 +115,9 @@ export class Droptarget extends CompositeDisposable {
98
115
  return;
99
116
  }
100
117
  if (!this.options.canDisplayOverlay(e, quadrant)) {
118
+ if (overrideTraget) {
119
+ return;
120
+ }
101
121
  this.removeDropTarget();
102
122
  return;
103
123
  }
@@ -115,29 +135,59 @@ export class Droptarget extends CompositeDisposable {
115
135
  return;
116
136
  }
117
137
  this.markAsUsed(e);
118
- if (!this.targetElement) {
138
+ if (overrideTraget) {
139
+ //
140
+ }
141
+ else if (!this.targetElement) {
119
142
  this.targetElement = document.createElement('div');
120
143
  this.targetElement.className = 'dv-drop-target-dropzone';
121
144
  this.overlayElement = document.createElement('div');
122
145
  this.overlayElement.className = 'dv-drop-target-selection';
123
146
  this._state = 'center';
124
147
  this.targetElement.appendChild(this.overlayElement);
125
- this.element.classList.add('dv-drop-target');
126
- this.element.append(this.targetElement);
148
+ target.classList.add('dv-drop-target');
149
+ target.append(this.targetElement);
150
+ // this.overlayElement.style.opacity = '0';
151
+ // requestAnimationFrame(() => {
152
+ // if (this.overlayElement) {
153
+ // this.overlayElement.style.opacity = '';
154
+ // }
155
+ // });
127
156
  }
128
157
  this.toggleClasses(quadrant, width, height);
129
158
  this._state = quadrant;
130
159
  },
131
160
  onDragLeave: () => {
161
+ var _a, _b;
162
+ const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
163
+ if (target) {
164
+ return;
165
+ }
132
166
  this.removeDropTarget();
133
167
  },
134
- onDragEnd: () => {
168
+ onDragEnd: (e) => {
169
+ var _a, _b;
170
+ const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
171
+ if (target && Droptarget.ACTUAL_TARGET === this) {
172
+ if (this._state) {
173
+ // only stop the propagation of the event if we are dealing with it
174
+ // which is only when the target has state
175
+ e.stopPropagation();
176
+ this._onDrop.fire({
177
+ position: this._state,
178
+ nativeEvent: e,
179
+ });
180
+ }
181
+ }
135
182
  this.removeDropTarget();
183
+ target === null || target === void 0 ? void 0 : target.clear();
136
184
  },
137
185
  onDrop: (e) => {
186
+ var _a, _b, _c;
138
187
  e.preventDefault();
139
188
  const state = this._state;
140
189
  this.removeDropTarget();
190
+ (_c = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.clear();
141
191
  if (state) {
142
192
  // only stop the propagation of the event if we are dealing with it
143
193
  // which is only when the target has state
@@ -172,8 +222,9 @@ export class Droptarget extends CompositeDisposable {
172
222
  return typeof value === 'boolean' && value;
173
223
  }
174
224
  toggleClasses(quadrant, width, height) {
175
- var _a, _b;
176
- if (!this.overlayElement) {
225
+ var _a, _b, _c, _d, _e, _f, _g;
226
+ const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
227
+ if (!target && !this.overlayElement) {
177
228
  return;
178
229
  }
179
230
  const isSmallX = width < SMALL_WIDTH_BOUNDARY;
@@ -187,7 +238,7 @@ export class Droptarget extends CompositeDisposable {
187
238
  const topClass = !isSmallY && isTop;
188
239
  const bottomClass = !isSmallY && isBottom;
189
240
  let size = 1;
190
- const sizeOptions = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : DEFAULT_SIZE;
241
+ const sizeOptions = (_d = (_c = this.options.overlayModel) === null || _c === void 0 ? void 0 : _c.size) !== null && _d !== void 0 ? _d : DEFAULT_SIZE;
191
242
  if (sizeOptions.type === 'percentage') {
192
243
  size = clamp(sizeOptions.value, 0, 100) / 100;
193
244
  }
@@ -199,6 +250,74 @@ export class Droptarget extends CompositeDisposable {
199
250
  size = clamp(0, sizeOptions.value, height) / height;
200
251
  }
201
252
  }
253
+ if (target) {
254
+ const outlineEl = (_g = (_f = (_e = this.options).getOverlayOutline) === null || _f === void 0 ? void 0 : _f.call(_e)) !== null && _g !== void 0 ? _g : this.element;
255
+ const elBox = outlineEl.getBoundingClientRect();
256
+ const ta = target.getElements(undefined, outlineEl);
257
+ const el = ta.root;
258
+ const overlay = ta.overlay;
259
+ const bigbox = el.getBoundingClientRect();
260
+ const rootTop = elBox.top - bigbox.top;
261
+ const rootLeft = elBox.left - bigbox.left;
262
+ const box = {
263
+ top: rootTop,
264
+ left: rootLeft,
265
+ width: width,
266
+ height: height,
267
+ };
268
+ if (rightClass) {
269
+ box.left = rootLeft + width * (1 - size);
270
+ box.width = width * size;
271
+ }
272
+ else if (leftClass) {
273
+ box.width = width * size;
274
+ }
275
+ else if (topClass) {
276
+ box.height = height * size;
277
+ }
278
+ else if (bottomClass) {
279
+ box.top = rootTop + height * (1 - size);
280
+ box.height = height * size;
281
+ }
282
+ if (isSmallX && isLeft) {
283
+ box.width = 4;
284
+ }
285
+ if (isSmallX && isRight) {
286
+ box.left = rootLeft + width - 4;
287
+ box.width = 4;
288
+ }
289
+ const topPx = `${Math.round(box.top)}px`;
290
+ const leftPx = `${Math.round(box.left)}px`;
291
+ const widthPx = `${Math.round(box.width)}px`;
292
+ const heightPx = `${Math.round(box.height)}px`;
293
+ if (overlay.style.top === topPx &&
294
+ overlay.style.left === leftPx &&
295
+ overlay.style.width === widthPx &&
296
+ overlay.style.height === heightPx) {
297
+ return;
298
+ }
299
+ overlay.style.top = topPx;
300
+ overlay.style.left = leftPx;
301
+ overlay.style.width = widthPx;
302
+ overlay.style.height = heightPx;
303
+ overlay.style.visibility = 'visible';
304
+ overlay.className = `dv-drop-target-anchor${this.options.className ? ` ${this.options.className}` : ''}`;
305
+ toggleClass(overlay, 'dv-drop-target-left', isLeft);
306
+ toggleClass(overlay, 'dv-drop-target-right', isRight);
307
+ toggleClass(overlay, 'dv-drop-target-top', isTop);
308
+ toggleClass(overlay, 'dv-drop-target-bottom', isBottom);
309
+ toggleClass(overlay, 'dv-drop-target-center', quadrant === 'center');
310
+ if (ta.changed) {
311
+ toggleClass(overlay, 'dv-drop-target-anchor-container-changed', true);
312
+ setTimeout(() => {
313
+ toggleClass(overlay, 'dv-drop-target-anchor-container-changed', false);
314
+ }, 10);
315
+ }
316
+ return;
317
+ }
318
+ if (!this.overlayElement) {
319
+ return;
320
+ }
202
321
  const box = { top: '0px', left: '0px', width: '100%', height: '100%' };
203
322
  /**
204
323
  * You can also achieve the overlay placement using the transform CSS property
@@ -255,12 +374,13 @@ export class Droptarget extends CompositeDisposable {
255
374
  return calculateQuadrantAsPixels(overlayType, x, y, width, height, activationSizeOptions.value);
256
375
  }
257
376
  removeDropTarget() {
377
+ var _a;
258
378
  if (this.targetElement) {
259
379
  this._state = undefined;
260
- this.element.removeChild(this.targetElement);
380
+ (_a = this.targetElement.parentElement) === null || _a === void 0 ? void 0 : _a.classList.remove('dv-drop-target');
381
+ this.targetElement.remove();
261
382
  this.targetElement = undefined;
262
383
  this.overlayElement = undefined;
263
- this.element.classList.remove('dv-drop-target');
264
384
  }
265
385
  }
266
386
  }
@@ -1 +1,4 @@
1
- export declare function addGhostImage(dataTransfer: DataTransfer, ghostElement: HTMLElement): void;
1
+ export declare function addGhostImage(dataTransfer: DataTransfer, ghostElement: HTMLElement, options?: {
2
+ x?: number;
3
+ y?: number;
4
+ }): void;
@@ -1,9 +1,10 @@
1
1
  import { addClasses, removeClasses } from '../dom';
2
- export function addGhostImage(dataTransfer, ghostElement) {
2
+ export function addGhostImage(dataTransfer, ghostElement, options) {
3
+ var _a, _b;
3
4
  // class dockview provides to force ghost image to be drawn on a different layer and prevent weird rendering issues
4
5
  addClasses(ghostElement, 'dv-dragged');
5
6
  document.body.appendChild(ghostElement);
6
- dataTransfer.setDragImage(ghostElement, 0, 0);
7
+ dataTransfer.setDragImage(ghostElement, (_a = options === null || options === void 0 ? void 0 : options.x) !== null && _a !== void 0 ? _a : 0, (_b = options === null || options === void 0 ? void 0 : options.y) !== null && _b !== void 0 ? _b : 0);
7
8
  setTimeout(() => {
8
9
  removeClasses(ghostElement, 'dv-dragged');
9
10
  ghostElement.remove();
@@ -42,8 +42,10 @@ export class GroupDragHandler extends DragHandler {
42
42
  ghostElement.style.lineHeight = '20px';
43
43
  ghostElement.style.borderRadius = '12px';
44
44
  ghostElement.style.position = 'absolute';
45
+ ghostElement.style.pointerEvents = 'none';
46
+ ghostElement.style.top = '-9999px';
45
47
  ghostElement.textContent = `Multiple Panels (${this.group.size})`;
46
- addGhostImage(dataTransfer, ghostElement);
48
+ addGhostImage(dataTransfer, ghostElement, { y: -10, x: 30 });
47
49
  }
48
50
  return {
49
51
  dispose: () => {
@@ -20,7 +20,15 @@ export class ContentContainer extends CompositeDisposable {
20
20
  this._element.className = 'dv-content-container';
21
21
  this._element.tabIndex = -1;
22
22
  this.addDisposables(this._onDidFocus, this._onDidBlur);
23
+ const target = group.dropTargetContainer;
23
24
  this.dropTarget = new Droptarget(this.element, {
25
+ getOverlayOutline: () => {
26
+ var _a;
27
+ return ((_a = accessor.options.theme) === null || _a === void 0 ? void 0 : _a.dndPanelOverlay) === 'group'
28
+ ? this.element.parentElement
29
+ : null;
30
+ },
31
+ className: 'dv-drop-target-content',
24
32
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
25
33
  canDisplayOverlay: (event, position) => {
26
34
  if (this.group.locked === 'no-drop-target' ||
@@ -34,22 +42,11 @@ export class ContentContainer extends CompositeDisposable {
34
42
  return false;
35
43
  }
36
44
  if (data && data.viewId === this.accessor.id) {
37
- if (data.groupId === this.group.id) {
38
- if (position === 'center') {
39
- // don't allow to drop on self for center position
40
- return false;
41
- }
42
- if (data.panelId === null) {
43
- // don't allow group move to drop anywhere on self
44
- return false;
45
- }
46
- }
47
- const groupHasOnePanelAndIsActiveDragElement = this.group.panels.length === 1 &&
48
- data.groupId === this.group.id;
49
- return !groupHasOnePanelAndIsActiveDragElement;
45
+ return true;
50
46
  }
51
47
  return this.group.canDisplayOverlay(event, position, 'content');
52
48
  },
49
+ getOverrideTarget: target ? () => target.model : undefined,
53
50
  });
54
51
  this.addDisposables(this.dropTarget);
55
52
  }
@@ -0,0 +1,13 @@
1
+ import { CompositeDisposable } from '../../lifecycle';
2
+ export declare class PopupService extends CompositeDisposable {
3
+ private readonly root;
4
+ private readonly _element;
5
+ private _active;
6
+ private readonly _activeDisposable;
7
+ constructor(root: HTMLElement);
8
+ openPopover(element: HTMLElement, position: {
9
+ x: number;
10
+ y: number;
11
+ }): void;
12
+ close(): void;
13
+ }
@@ -0,0 +1,53 @@
1
+ import { addDisposableWindowListener } from '../../events';
2
+ import { CompositeDisposable, Disposable, MutableDisposable, } from '../../lifecycle';
3
+ export class PopupService extends CompositeDisposable {
4
+ constructor(root) {
5
+ super();
6
+ this.root = root;
7
+ this._active = null;
8
+ this._activeDisposable = new MutableDisposable();
9
+ this._element = document.createElement('div');
10
+ this._element.className = 'dv-popover-anchor';
11
+ this._element.style.position = 'relative';
12
+ this.root.prepend(this._element);
13
+ this.addDisposables(Disposable.from(() => {
14
+ this.close();
15
+ }), this._activeDisposable);
16
+ }
17
+ openPopover(element, position) {
18
+ this.close();
19
+ const wrapper = document.createElement('div');
20
+ wrapper.style.position = 'absolute';
21
+ wrapper.style.zIndex = '99';
22
+ wrapper.appendChild(element);
23
+ const anchorBox = this._element.getBoundingClientRect();
24
+ const offsetX = anchorBox.left;
25
+ const offsetY = anchorBox.top;
26
+ wrapper.style.top = `${position.y - offsetY}px`;
27
+ wrapper.style.left = `${position.x - offsetX}px`;
28
+ this._element.appendChild(wrapper);
29
+ this._active = wrapper;
30
+ this._activeDisposable.value = new CompositeDisposable(addDisposableWindowListener(window, 'pointerdown', (event) => {
31
+ var _a;
32
+ const target = event.target;
33
+ if (!(target instanceof HTMLElement)) {
34
+ return;
35
+ }
36
+ let el = target;
37
+ while (el && el !== wrapper) {
38
+ el = (_a = el === null || el === void 0 ? void 0 : el.parentElement) !== null && _a !== void 0 ? _a : null;
39
+ }
40
+ if (el) {
41
+ return; // clicked within popover
42
+ }
43
+ this.close();
44
+ }));
45
+ }
46
+ close() {
47
+ if (this._active) {
48
+ this._active.remove();
49
+ this._activeDisposable.dispose();
50
+ this._active = null;
51
+ }
52
+ }
53
+ }
@@ -4,6 +4,7 @@ import { getPanelData, LocalSelectionTransfer, PanelTransfer, } from '../../../d
4
4
  import { toggleClass } from '../../../dom';
5
5
  import { Droptarget, } from '../../../dnd/droptarget';
6
6
  import { DragHandler } from '../../../dnd/abstractDragHandler';
7
+ import { addGhostImage } from '../../../dnd/ghost';
7
8
  class TabDragHandler extends DragHandler {
8
9
  constructor(element, accessor, group, panel) {
9
10
  super(element);
@@ -44,25 +45,32 @@ export class Tab extends CompositeDisposable {
44
45
  toggleClass(this.element, 'dv-inactive-tab', true);
45
46
  const dragHandler = new TabDragHandler(this._element, this.accessor, this.group, this.panel);
46
47
  this.dropTarget = new Droptarget(this._element, {
47
- acceptedTargetZones: ['center'],
48
+ acceptedTargetZones: ['left', 'right'],
49
+ overlayModel: { activationSize: { value: 50, type: 'percentage' } },
48
50
  canDisplayOverlay: (event, position) => {
49
51
  if (this.group.locked) {
50
52
  return false;
51
53
  }
52
54
  const data = getPanelData();
53
55
  if (data && this.accessor.id === data.viewId) {
54
- if (data.panelId === null &&
55
- data.groupId === this.group.id) {
56
- // don't allow group move to drop on self
57
- return false;
58
- }
59
- return this.panel.id !== data.panelId;
56
+ return true;
60
57
  }
61
58
  return this.group.model.canDisplayOverlay(event, position, 'tab');
62
59
  },
60
+ getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
63
61
  });
64
62
  this.onWillShowOverlay = this.dropTarget.onWillShowOverlay;
65
63
  this.addDisposables(this._onPointDown, this._onDropped, this._onDragStart, dragHandler.onDragStart((event) => {
64
+ if (event.dataTransfer) {
65
+ const style = getComputedStyle(this.element);
66
+ const newNode = this.element.cloneNode(true);
67
+ Array.from(style).forEach((key) => newNode.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key)));
68
+ newNode.style.position = 'absolute';
69
+ addGhostImage(event.dataTransfer, newNode, {
70
+ y: -10,
71
+ x: 30,
72
+ });
73
+ }
66
74
  this._onDragStart.fire(event);
67
75
  }), dragHandler, addDisposableListener(this._element, 'pointerdown', (event) => {
68
76
  this._onPointDown.fire(event);
@@ -0,0 +1,8 @@
1
+ export type DropdownElement = {
2
+ element: HTMLElement;
3
+ update: (params: {
4
+ tabs: number;
5
+ }) => void;
6
+ dispose?: () => void;
7
+ };
8
+ export declare function createDropdownElementHandle(): DropdownElement;
@@ -0,0 +1,16 @@
1
+ import { createChevronRightButton } from '../../../svg';
2
+ export function createDropdownElementHandle() {
3
+ const el = document.createElement('div');
4
+ el.className = 'dv-tabs-overflow-dropdown-default';
5
+ const text = document.createElement('span');
6
+ text.textContent = ``;
7
+ const icon = createChevronRightButton();
8
+ el.appendChild(icon);
9
+ el.appendChild(text);
10
+ return {
11
+ element: el,
12
+ update: (params) => {
13
+ text.textContent = `${params.tabs}`;
14
+ },
15
+ };
16
+ }