dockview-core 1.8.1 → 1.8.3

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 (149) hide show
  1. package/dist/cjs/api/component.api.d.ts +8 -4
  2. package/dist/cjs/api/component.api.d.ts.map +1 -1
  3. package/dist/cjs/api/component.api.js +14 -0
  4. package/dist/cjs/api/component.api.js.map +1 -1
  5. package/dist/cjs/dnd/abstractDragHandler.d.ts +2 -2
  6. package/dist/cjs/dnd/abstractDragHandler.d.ts.map +1 -1
  7. package/dist/cjs/dnd/abstractDragHandler.js +16 -12
  8. package/dist/cjs/dnd/abstractDragHandler.js.map +1 -1
  9. package/dist/cjs/dnd/groupDragHandler.d.ts +4 -3
  10. package/dist/cjs/dnd/groupDragHandler.d.ts.map +1 -1
  11. package/dist/cjs/dnd/groupDragHandler.js +5 -4
  12. package/dist/cjs/dnd/groupDragHandler.js.map +1 -1
  13. package/dist/cjs/dnd/overlay.d.ts +6 -2
  14. package/dist/cjs/dnd/overlay.d.ts.map +1 -1
  15. package/dist/cjs/dnd/overlay.js +54 -23
  16. package/dist/cjs/dnd/overlay.js.map +1 -1
  17. package/dist/cjs/dockview/components/tab/tab.d.ts +7 -4
  18. package/dist/cjs/dockview/components/tab/tab.d.ts.map +1 -1
  19. package/dist/cjs/dockview/components/tab/tab.js +36 -28
  20. package/dist/cjs/dockview/components/tab/tab.js.map +1 -1
  21. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +15 -1
  22. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts.map +1 -1
  23. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +26 -15
  24. package/dist/cjs/dockview/components/titlebar/tabsContainer.js.map +1 -1
  25. package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +2 -0
  26. package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts.map +1 -1
  27. package/dist/cjs/dockview/components/titlebar/voidContainer.js +7 -3
  28. package/dist/cjs/dockview/components/titlebar/voidContainer.js.map +1 -1
  29. package/dist/cjs/dockview/dockviewComponent.d.ts +11 -4
  30. package/dist/cjs/dockview/dockviewComponent.d.ts.map +1 -1
  31. package/dist/cjs/dockview/dockviewComponent.js +78 -36
  32. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  33. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +4 -4
  34. package/dist/cjs/dockview/dockviewGroupPanel.d.ts.map +1 -1
  35. package/dist/cjs/dockview/dockviewGroupPanel.js.map +1 -1
  36. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +10 -4
  37. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts.map +1 -1
  38. package/dist/cjs/dockview/dockviewGroupPanelModel.js +18 -6
  39. package/dist/cjs/dockview/dockviewGroupPanelModel.js.map +1 -1
  40. package/dist/cjs/dockview/dockviewPanel.d.ts +1 -1
  41. package/dist/cjs/dockview/dockviewPanel.d.ts.map +1 -1
  42. package/dist/cjs/dockview/options.d.ts +8 -5
  43. package/dist/cjs/dockview/options.d.ts.map +1 -1
  44. package/dist/cjs/dockview/options.js.map +1 -1
  45. package/dist/cjs/gridview/basePanelView.d.ts +4 -4
  46. package/dist/cjs/gridview/basePanelView.d.ts.map +1 -1
  47. package/dist/cjs/gridview/basePanelView.js.map +1 -1
  48. package/dist/cjs/gridview/gridviewComponent.d.ts +4 -4
  49. package/dist/cjs/gridview/gridviewComponent.d.ts.map +1 -1
  50. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  51. package/dist/cjs/lifecycle.d.ts +0 -1
  52. package/dist/cjs/lifecycle.d.ts.map +1 -1
  53. package/dist/cjs/lifecycle.js +0 -32
  54. package/dist/cjs/lifecycle.js.map +1 -1
  55. package/dist/cjs/panel/types.d.ts +2 -2
  56. package/dist/cjs/panel/types.d.ts.map +1 -1
  57. package/dist/cjs/paneview/paneviewComponent.d.ts +5 -6
  58. package/dist/cjs/paneview/paneviewComponent.d.ts.map +1 -1
  59. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  60. package/dist/cjs/splitview/splitviewComponent.d.ts +4 -4
  61. package/dist/cjs/splitview/splitviewComponent.d.ts.map +1 -1
  62. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  63. package/dist/cjs/splitview/splitviewPanel.d.ts +1 -1
  64. package/dist/dockview-core.amd.js +201 -104
  65. package/dist/dockview-core.amd.js.map +1 -1
  66. package/dist/dockview-core.amd.min.js +2 -2
  67. package/dist/dockview-core.amd.min.js.map +1 -1
  68. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  69. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  70. package/dist/dockview-core.amd.noStyle.js +201 -104
  71. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  72. package/dist/dockview-core.cjs.js +201 -104
  73. package/dist/dockview-core.cjs.js.map +1 -1
  74. package/dist/dockview-core.esm.js +201 -104
  75. package/dist/dockview-core.esm.js.map +1 -1
  76. package/dist/dockview-core.esm.min.js +2 -2
  77. package/dist/dockview-core.esm.min.js.map +1 -1
  78. package/dist/dockview-core.js +201 -104
  79. package/dist/dockview-core.js.map +1 -1
  80. package/dist/dockview-core.min.js +2 -2
  81. package/dist/dockview-core.min.js.map +1 -1
  82. package/dist/dockview-core.min.noStyle.js +2 -2
  83. package/dist/dockview-core.min.noStyle.js.map +1 -1
  84. package/dist/dockview-core.noStyle.js +201 -104
  85. package/dist/dockview-core.noStyle.js.map +1 -1
  86. package/dist/esm/api/component.api.d.ts +8 -4
  87. package/dist/esm/api/component.api.d.ts.map +1 -1
  88. package/dist/esm/api/component.api.js +6 -0
  89. package/dist/esm/api/component.api.js.map +1 -1
  90. package/dist/esm/dnd/abstractDragHandler.d.ts +2 -2
  91. package/dist/esm/dnd/abstractDragHandler.d.ts.map +1 -1
  92. package/dist/esm/dnd/abstractDragHandler.js +16 -12
  93. package/dist/esm/dnd/abstractDragHandler.js.map +1 -1
  94. package/dist/esm/dnd/groupDragHandler.d.ts +4 -3
  95. package/dist/esm/dnd/groupDragHandler.d.ts.map +1 -1
  96. package/dist/esm/dnd/groupDragHandler.js +5 -4
  97. package/dist/esm/dnd/groupDragHandler.js.map +1 -1
  98. package/dist/esm/dnd/overlay.d.ts +6 -2
  99. package/dist/esm/dnd/overlay.d.ts.map +1 -1
  100. package/dist/esm/dnd/overlay.js +46 -23
  101. package/dist/esm/dnd/overlay.js.map +1 -1
  102. package/dist/esm/dockview/components/tab/tab.d.ts +7 -4
  103. package/dist/esm/dockview/components/tab/tab.d.ts.map +1 -1
  104. package/dist/esm/dockview/components/tab/tab.js +32 -24
  105. package/dist/esm/dockview/components/tab/tab.js.map +1 -1
  106. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +15 -1
  107. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts.map +1 -1
  108. package/dist/esm/dockview/components/titlebar/tabsContainer.js +26 -15
  109. package/dist/esm/dockview/components/titlebar/tabsContainer.js.map +1 -1
  110. package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +2 -0
  111. package/dist/esm/dockview/components/titlebar/voidContainer.d.ts.map +1 -1
  112. package/dist/esm/dockview/components/titlebar/voidContainer.js +7 -3
  113. package/dist/esm/dockview/components/titlebar/voidContainer.js.map +1 -1
  114. package/dist/esm/dockview/dockviewComponent.d.ts +11 -4
  115. package/dist/esm/dockview/dockviewComponent.d.ts.map +1 -1
  116. package/dist/esm/dockview/dockviewComponent.js +44 -13
  117. package/dist/esm/dockview/dockviewComponent.js.map +1 -1
  118. package/dist/esm/dockview/dockviewGroupPanel.d.ts +4 -4
  119. package/dist/esm/dockview/dockviewGroupPanel.d.ts.map +1 -1
  120. package/dist/esm/dockview/dockviewGroupPanel.js.map +1 -1
  121. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +10 -4
  122. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts.map +1 -1
  123. package/dist/esm/dockview/dockviewGroupPanelModel.js +18 -6
  124. package/dist/esm/dockview/dockviewGroupPanelModel.js.map +1 -1
  125. package/dist/esm/dockview/dockviewPanel.d.ts +1 -1
  126. package/dist/esm/dockview/dockviewPanel.d.ts.map +1 -1
  127. package/dist/esm/dockview/options.d.ts +8 -5
  128. package/dist/esm/dockview/options.d.ts.map +1 -1
  129. package/dist/esm/dockview/options.js.map +1 -1
  130. package/dist/esm/gridview/basePanelView.d.ts +4 -4
  131. package/dist/esm/gridview/basePanelView.d.ts.map +1 -1
  132. package/dist/esm/gridview/basePanelView.js.map +1 -1
  133. package/dist/esm/gridview/gridviewComponent.d.ts +4 -4
  134. package/dist/esm/gridview/gridviewComponent.d.ts.map +1 -1
  135. package/dist/esm/gridview/gridviewComponent.js.map +1 -1
  136. package/dist/esm/lifecycle.d.ts +0 -1
  137. package/dist/esm/lifecycle.d.ts.map +1 -1
  138. package/dist/esm/lifecycle.js +0 -3
  139. package/dist/esm/lifecycle.js.map +1 -1
  140. package/dist/esm/panel/types.d.ts +2 -2
  141. package/dist/esm/panel/types.d.ts.map +1 -1
  142. package/dist/esm/paneview/paneviewComponent.d.ts +5 -6
  143. package/dist/esm/paneview/paneviewComponent.d.ts.map +1 -1
  144. package/dist/esm/paneview/paneviewComponent.js.map +1 -1
  145. package/dist/esm/splitview/splitviewComponent.d.ts +4 -4
  146. package/dist/esm/splitview/splitviewComponent.d.ts.map +1 -1
  147. package/dist/esm/splitview/splitviewComponent.js.map +1 -1
  148. package/dist/esm/splitview/splitviewPanel.d.ts +1 -1
  149. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 1.8.1
3
+ * @version 1.8.3
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -270,9 +270,6 @@ class CompositeDisposable {
270
270
  get isDisposed() {
271
271
  return this._isDisposed;
272
272
  }
273
- static from(...args) {
274
- return new CompositeDisposable(...args);
275
- }
276
273
  constructor(...args) {
277
274
  this._isDisposed = false;
278
275
  this._disposables = args;
@@ -2476,6 +2473,12 @@ class DockviewApi {
2476
2473
  get onDidDrop() {
2477
2474
  return this.component.onDidDrop;
2478
2475
  }
2476
+ get onWillDragGroup() {
2477
+ return this.component.onWillDragGroup;
2478
+ }
2479
+ get onWillDragPanel() {
2480
+ return this.component.onWillDragPanel;
2481
+ }
2479
2482
  get panels() {
2480
2483
  return this.component.panels;
2481
2484
  }
@@ -2938,7 +2941,7 @@ class DragHandler extends CompositeDisposable {
2938
2941
  }
2939
2942
  configure() {
2940
2943
  this.addDisposables(this._onDragStart, addDisposableListener(this.el, 'dragstart', (event) => {
2941
- if (this.isCancelled(event)) {
2944
+ if (event.defaultPrevented || this.isCancelled(event)) {
2942
2945
  event.preventDefault();
2943
2946
  return;
2944
2947
  }
@@ -2958,19 +2961,23 @@ class DragHandler extends CompositeDisposable {
2958
2961
  }
2959
2962
  this.el.classList.add('dv-dragged');
2960
2963
  setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
2961
- this.dataDisposable.value = this.getData(event.dataTransfer);
2964
+ this.dataDisposable.value = this.getData(event);
2965
+ this._onDragStart.fire(event);
2962
2966
  if (event.dataTransfer) {
2963
2967
  event.dataTransfer.effectAllowed = 'move';
2964
- /**
2965
- * Although this is not used by dockview many third party dnd libraries will check
2966
- * dataTransfer.types to determine valid drag events.
2967
- *
2968
- * For example: in react-dnd if dataTransfer.types is not set then the dragStart event will be cancelled
2969
- * through .preventDefault(). Since this is applied globally to all drag events this would break dockviews
2970
- * dnd logic. You can see the code at
2971
- * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
2972
- */
2973
- event.dataTransfer.setData('text/plain', '__dockview_internal_drag_event__');
2968
+ const hasData = event.dataTransfer.items.length > 0;
2969
+ if (!hasData) {
2970
+ /**
2971
+ * Although this is not used by dockview many third party dnd libraries will check
2972
+ * dataTransfer.types to determine valid drag events.
2973
+ *
2974
+ * For example: in react-dnd if dataTransfer.types is not set then the dragStart event will be cancelled
2975
+ * through .preventDefault(). Since this is applied globally to all drag events this would break dockviews
2976
+ * dnd logic. You can see the code at
2977
+ * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
2978
+ */
2979
+ event.dataTransfer.setData('text/plain', '__dockview_internal_drag_event__');
2980
+ }
2974
2981
  }
2975
2982
  }), addDisposableListener(this.el, 'dragend', () => {
2976
2983
  this.pointerEventsDisposable.dispose();
@@ -2979,44 +2986,45 @@ class DragHandler extends CompositeDisposable {
2979
2986
  }
2980
2987
  }
2981
2988
 
2989
+ class TabDragHandler extends DragHandler {
2990
+ constructor(element, accessor, group, panel) {
2991
+ super(element);
2992
+ this.accessor = accessor;
2993
+ this.group = group;
2994
+ this.panel = panel;
2995
+ this.panelTransfer = LocalSelectionTransfer.getInstance();
2996
+ }
2997
+ getData(event) {
2998
+ this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, this.panel.id)], PanelTransfer.prototype);
2999
+ return {
3000
+ dispose: () => {
3001
+ this.panelTransfer.clearData(PanelTransfer.prototype);
3002
+ },
3003
+ };
3004
+ }
3005
+ }
2982
3006
  class Tab extends CompositeDisposable {
2983
3007
  get element() {
2984
3008
  return this._element;
2985
3009
  }
2986
- constructor(panelId, accessor, group) {
3010
+ constructor(panel, accessor, group) {
2987
3011
  super();
2988
- this.panelId = panelId;
3012
+ this.panel = panel;
2989
3013
  this.accessor = accessor;
2990
3014
  this.group = group;
3015
+ this.content = undefined;
2991
3016
  this._onChanged = new Emitter();
2992
3017
  this.onChanged = this._onChanged.event;
2993
3018
  this._onDropped = new Emitter();
2994
3019
  this.onDrop = this._onDropped.event;
3020
+ this._onDragStart = new Emitter();
3021
+ this.onDragStart = this._onDragStart.event;
2995
3022
  this._element = document.createElement('div');
2996
3023
  this._element.className = 'tab';
2997
3024
  this._element.tabIndex = 0;
2998
3025
  this._element.draggable = true;
2999
3026
  toggleClass(this.element, 'inactive-tab', true);
3000
- this.addDisposables(this._onChanged, this._onDropped, new (class Handler extends DragHandler {
3001
- constructor() {
3002
- super(...arguments);
3003
- this.panelTransfer = LocalSelectionTransfer.getInstance();
3004
- }
3005
- getData() {
3006
- this.panelTransfer.setData([new PanelTransfer(accessor.id, group.id, panelId)], PanelTransfer.prototype);
3007
- return {
3008
- dispose: () => {
3009
- this.panelTransfer.clearData(PanelTransfer.prototype);
3010
- },
3011
- };
3012
- }
3013
- })(this._element));
3014
- this.addDisposables(addDisposableListener(this._element, 'mousedown', (event) => {
3015
- if (event.defaultPrevented) {
3016
- return;
3017
- }
3018
- this._onChanged.fire(event);
3019
- }));
3027
+ const dragHandler = new TabDragHandler(this._element, this.accessor, this.group, this.panel);
3020
3028
  this.droptarget = new Droptarget(this._element, {
3021
3029
  acceptedTargetZones: ['center'],
3022
3030
  canDisplayOverlay: (event, position) => {
@@ -3030,12 +3038,19 @@ class Tab extends CompositeDisposable {
3030
3038
  // don't allow group move to drop on self
3031
3039
  return false;
3032
3040
  }
3033
- return this.panelId !== data.panelId;
3041
+ return this.panel.id !== data.panelId;
3034
3042
  }
3035
3043
  return this.group.model.canDisplayOverlay(event, position, exports.DockviewDropTargets.Tab);
3036
3044
  },
3037
3045
  });
3038
- this.addDisposables(this.droptarget.onDrop((event) => {
3046
+ this.addDisposables(this._onChanged, this._onDropped, this._onDragStart, dragHandler.onDragStart((event) => {
3047
+ this._onDragStart.fire(event);
3048
+ }), dragHandler, addDisposableListener(this._element, 'mousedown', (event) => {
3049
+ if (event.defaultPrevented) {
3050
+ return;
3051
+ }
3052
+ this._onChanged.fire(event);
3053
+ }), this.droptarget.onDrop((event) => {
3039
3054
  this._onDropped.fire(event);
3040
3055
  }), this.droptarget);
3041
3056
  }
@@ -3067,9 +3082,9 @@ function addGhostImage(dataTransfer, ghostElement) {
3067
3082
  }
3068
3083
 
3069
3084
  class GroupDragHandler extends DragHandler {
3070
- constructor(element, accessorId, group) {
3085
+ constructor(element, accessor, group) {
3071
3086
  super(element);
3072
- this.accessorId = accessorId;
3087
+ this.accessor = accessor;
3073
3088
  this.group = group;
3074
3089
  this.panelTransfer = LocalSelectionTransfer.getInstance();
3075
3090
  this.addDisposables(addDisposableListener(element, 'mousedown', (e) => {
@@ -3089,8 +3104,9 @@ class GroupDragHandler extends DragHandler {
3089
3104
  }
3090
3105
  return false;
3091
3106
  }
3092
- getData(dataTransfer) {
3093
- this.panelTransfer.setData([new PanelTransfer(this.accessorId, this.group.id, null)], PanelTransfer.prototype);
3107
+ getData(dragEvent) {
3108
+ const dataTransfer = dragEvent.dataTransfer;
3109
+ this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, null)], PanelTransfer.prototype);
3094
3110
  const style = window.getComputedStyle(this.el);
3095
3111
  const bgColor = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-background-color');
3096
3112
  const color = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-color');
@@ -3125,14 +3141,16 @@ class VoidContainer extends CompositeDisposable {
3125
3141
  this.group = group;
3126
3142
  this._onDrop = new Emitter();
3127
3143
  this.onDrop = this._onDrop.event;
3144
+ this._onDragStart = new Emitter();
3145
+ this.onDragStart = this._onDragStart.event;
3128
3146
  this._element = document.createElement('div');
3129
3147
  this._element.className = 'void-container';
3130
3148
  this._element.tabIndex = 0;
3131
3149
  this._element.draggable = true;
3132
- this.addDisposables(this._onDrop, addDisposableListener(this._element, 'click', () => {
3150
+ this.addDisposables(this._onDrop, this._onDragStart, addDisposableListener(this._element, 'click', () => {
3133
3151
  this.accessor.doSetGroupActive(this.group);
3134
3152
  }));
3135
- const handler = new GroupDragHandler(this._element, accessor.id, group);
3153
+ const handler = new GroupDragHandler(this._element, accessor, group);
3136
3154
  this.voidDropTarget = new Droptarget(this._element, {
3137
3155
  acceptedTargetZones: ['center'],
3138
3156
  canDisplayOverlay: (event, position) => {
@@ -3150,7 +3168,9 @@ class VoidContainer extends CompositeDisposable {
3150
3168
  return group.model.canDisplayOverlay(event, position, exports.DockviewDropTargets.Panel);
3151
3169
  },
3152
3170
  });
3153
- this.addDisposables(handler, this.voidDropTarget.onDrop((event) => {
3171
+ this.addDisposables(handler, handler.onDragStart((event) => {
3172
+ this._onDragStart.fire(event);
3173
+ }), this.voidDropTarget.onDrop((event) => {
3154
3174
  this._onDrop.fire(event);
3155
3175
  }), this.voidDropTarget);
3156
3176
  }
@@ -3158,7 +3178,7 @@ class VoidContainer extends CompositeDisposable {
3158
3178
 
3159
3179
  class TabsContainer extends CompositeDisposable {
3160
3180
  get panels() {
3161
- return this.tabs.map((_) => _.value.panelId);
3181
+ return this.tabs.map((_) => _.value.panel.id);
3162
3182
  }
3163
3183
  get size() {
3164
3184
  return this.tabs.length;
@@ -3212,7 +3232,7 @@ class TabsContainer extends CompositeDisposable {
3212
3232
  this.tabs[this.selectedIndex].value === tab);
3213
3233
  }
3214
3234
  indexOf(id) {
3215
- return this.tabs.findIndex((tab) => tab.value.panelId === id);
3235
+ return this.tabs.findIndex((tab) => tab.value.panel.id === id);
3216
3236
  }
3217
3237
  constructor(accessor, group) {
3218
3238
  super();
@@ -3223,7 +3243,11 @@ class TabsContainer extends CompositeDisposable {
3223
3243
  this._hidden = false;
3224
3244
  this._onDrop = new Emitter();
3225
3245
  this.onDrop = this._onDrop.event;
3226
- this.addDisposables(this._onDrop);
3246
+ this._onTabDragStart = new Emitter();
3247
+ this.onTabDragStart = this._onTabDragStart.event;
3248
+ this._onGroupDragStart = new Emitter();
3249
+ this.onGroupDragStart = this._onGroupDragStart.event;
3250
+ this.addDisposables(this._onDrop, this._onTabDragStart, this._onGroupDragStart);
3227
3251
  this._element = document.createElement('div');
3228
3252
  this._element.className = 'tabs-and-actions-container';
3229
3253
  toggleClass(this._element, 'dv-full-width-single-tab', this.accessor.options.singleTabMode === 'fullwidth');
@@ -3247,7 +3271,12 @@ class TabsContainer extends CompositeDisposable {
3247
3271
  this._element.appendChild(this.leftActionsContainer);
3248
3272
  this._element.appendChild(this.voidContainer.element);
3249
3273
  this._element.appendChild(this.rightActionsContainer);
3250
- this.addDisposables(this.voidContainer, this.voidContainer.onDrop((event) => {
3274
+ this.addDisposables(this.voidContainer, this.voidContainer.onDragStart((event) => {
3275
+ this._onGroupDragStart.fire({
3276
+ nativeEvent: event,
3277
+ group: this.group,
3278
+ });
3279
+ }), this.voidContainer.onDrop((event) => {
3251
3280
  this._onDrop.fire({
3252
3281
  event: event.nativeEvent,
3253
3282
  index: this.tabs.length,
@@ -3293,7 +3322,7 @@ class TabsContainer extends CompositeDisposable {
3293
3322
  }
3294
3323
  }
3295
3324
  delete(id) {
3296
- const index = this.tabs.findIndex((tab) => tab.value.panelId === id);
3325
+ const index = this.tabs.findIndex((tab) => tab.value.panel.id === id);
3297
3326
  const tabToRemove = this.tabs.splice(index, 1)[0];
3298
3327
  const { value, disposable } = tabToRemove;
3299
3328
  disposable.dispose();
@@ -3302,21 +3331,23 @@ class TabsContainer extends CompositeDisposable {
3302
3331
  }
3303
3332
  setActivePanel(panel) {
3304
3333
  this.tabs.forEach((tab) => {
3305
- const isActivePanel = panel.id === tab.value.panelId;
3334
+ const isActivePanel = panel.id === tab.value.panel.id;
3306
3335
  tab.value.setActive(isActivePanel);
3307
3336
  });
3308
3337
  }
3309
3338
  openPanel(panel, index = this.tabs.length) {
3310
3339
  var _a;
3311
- if (this.tabs.find((tab) => tab.value.panelId === panel.id)) {
3340
+ if (this.tabs.find((tab) => tab.value.panel.id === panel.id)) {
3312
3341
  return;
3313
3342
  }
3314
- const tabToAdd = new Tab(panel.id, this.accessor, this.group);
3343
+ const tab = new Tab(panel, this.accessor, this.group);
3315
3344
  if (!((_a = panel.view) === null || _a === void 0 ? void 0 : _a.tab)) {
3316
3345
  throw new Error('invalid header component');
3317
3346
  }
3318
- tabToAdd.setContent(panel.view.tab);
3319
- const disposable = CompositeDisposable.from(tabToAdd.onChanged((event) => {
3347
+ tab.setContent(panel.view.tab);
3348
+ const disposable = new CompositeDisposable(tab.onDragStart((event) => {
3349
+ this._onTabDragStart.fire({ nativeEvent: event, panel });
3350
+ }), tab.onChanged((event) => {
3320
3351
  var _a;
3321
3352
  const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;
3322
3353
  const isFloatingWithOnePanel = this.group.api.isFloating && this.size === 1;
@@ -3324,8 +3355,8 @@ class TabsContainer extends CompositeDisposable {
3324
3355
  !isFloatingWithOnePanel &&
3325
3356
  event.shiftKey) {
3326
3357
  event.preventDefault();
3327
- const panel = this.accessor.getGroupPanel(tabToAdd.panelId);
3328
- const { top, left } = tabToAdd.element.getBoundingClientRect();
3358
+ const panel = this.accessor.getGroupPanel(tab.panel.id);
3359
+ const { top, left } = tab.element.getBoundingClientRect();
3329
3360
  const { top: rootTop, left: rootLeft } = this.accessor.element.getBoundingClientRect();
3330
3361
  this.accessor.addFloatingGroup(panel, {
3331
3362
  x: left - rootLeft,
@@ -3342,13 +3373,13 @@ class TabsContainer extends CompositeDisposable {
3342
3373
  this.group.model.openPanel(panel, {
3343
3374
  skipFocus: alreadyFocused,
3344
3375
  });
3345
- }), tabToAdd.onDrop((event) => {
3376
+ }), tab.onDrop((event) => {
3346
3377
  this._onDrop.fire({
3347
3378
  event: event.nativeEvent,
3348
- index: this.tabs.findIndex((x) => x.value === tabToAdd),
3379
+ index: this.tabs.findIndex((x) => x.value === tab),
3349
3380
  });
3350
3381
  }));
3351
- const value = { value: tabToAdd, disposable };
3382
+ const value = { value: tab, disposable };
3352
3383
  this.addTab(value, index);
3353
3384
  }
3354
3385
  closePanel(panel) {
@@ -3376,7 +3407,7 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3376
3407
  }
3377
3408
  set locked(value) {
3378
3409
  this._locked = value;
3379
- toggleClass(this.container, 'locked-groupview', value);
3410
+ toggleClass(this.container, 'locked-groupview', value === 'no-drop-target' || value);
3380
3411
  }
3381
3412
  get isActive() {
3382
3413
  return this._isGroupActive;
@@ -3433,6 +3464,10 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3433
3464
  this.onMove = this._onMove.event;
3434
3465
  this._onDidDrop = new Emitter();
3435
3466
  this.onDidDrop = this._onDidDrop.event;
3467
+ this._onTabDragStart = new Emitter();
3468
+ this.onTabDragStart = this._onTabDragStart.event;
3469
+ this._onGroupDragStart = new Emitter();
3470
+ this.onGroupDragStart = this._onGroupDragStart.event;
3436
3471
  this._onDidAddPanel = new Emitter();
3437
3472
  this.onDidAddPanel = this._onDidAddPanel.event;
3438
3473
  this._onDidRemovePanel = new Emitter();
@@ -3445,7 +3480,8 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3445
3480
  this.dropTarget = new Droptarget(this.contentContainer.element, {
3446
3481
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
3447
3482
  canDisplayOverlay: (event, position) => {
3448
- if (this.locked && position === 'center') {
3483
+ if (this.locked === 'no-drop-target' ||
3484
+ (this.locked && position === 'center')) {
3449
3485
  return false;
3450
3486
  }
3451
3487
  const data = getPanelData();
@@ -3471,8 +3507,12 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3471
3507
  });
3472
3508
  container.append(this.tabsContainer.element, this.contentContainer.element);
3473
3509
  this.header.hidden = !!options.hideHeader;
3474
- this.locked = !!options.locked;
3475
- this.addDisposables(this.tabsContainer.onDrop((event) => {
3510
+ this.locked = options.locked || false;
3511
+ this.addDisposables(this._onTabDragStart, this._onGroupDragStart, this.tabsContainer.onTabDragStart((event) => {
3512
+ this._onTabDragStart.fire(event);
3513
+ }), this.tabsContainer.onGroupDragStart((event) => {
3514
+ this._onGroupDragStart.fire(event);
3515
+ }), this.tabsContainer.onDrop((event) => {
3476
3516
  this.handleDropEvent(event.event, 'center', event.index);
3477
3517
  }), this.contentContainer.onDidFocus(() => {
3478
3518
  this.accessor.doSetGroupActive(this.groupPanel, true);
@@ -3527,8 +3567,8 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3527
3567
  activeView: (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.id,
3528
3568
  id: this.id,
3529
3569
  };
3530
- if (this.locked) {
3531
- result.locked = true;
3570
+ if (this.locked !== false) {
3571
+ result.locked = this.locked;
3532
3572
  }
3533
3573
  if (this.header.hidden) {
3534
3574
  result.hideHeader = true;
@@ -3778,6 +3818,9 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3778
3818
  return false;
3779
3819
  }
3780
3820
  handleDropEvent(event, position, index) {
3821
+ if (this.locked === 'no-drop-target') {
3822
+ return;
3823
+ }
3781
3824
  const data = getPanelData();
3782
3825
  if (data && data.viewId === this.accessor.id) {
3783
3826
  if (data.panelId === null) {
@@ -5235,6 +5278,12 @@ const bringElementToFront = (() => {
5235
5278
  return pushToTop;
5236
5279
  })();
5237
5280
  class Overlay extends CompositeDisposable {
5281
+ set minimumInViewportWidth(value) {
5282
+ this.options.minimumInViewportWidth = value;
5283
+ }
5284
+ set minimumInViewportHeight(value) {
5285
+ this.options.minimumInViewportHeight = value;
5286
+ }
5238
5287
  constructor(options) {
5239
5288
  super();
5240
5289
  this.options = options;
@@ -5280,9 +5329,11 @@ class Overlay extends CompositeDisposable {
5280
5329
  const overlayRect = this._element.getBoundingClientRect();
5281
5330
  // region: ensure bounds within allowable limits
5282
5331
  // a minimum width of minimumViewportWidth must be inside the viewport
5283
- const xOffset = Math.max(0, overlayRect.width - this.options.minimumInViewportWidth);
5332
+ const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));
5284
5333
  // a minimum height of minimumViewportHeight must be inside the viewport
5285
- const yOffset = Math.max(0, overlayRect.height - this.options.minimumInViewportHeight);
5334
+ const yOffset = typeof this.options.minimumInViewportHeight === 'number'
5335
+ ? Math.max(0, this.getMinimumHeight(overlayRect.height))
5336
+ : 0;
5286
5337
  const left = clamp(overlayRect.left - containerRect.left, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
5287
5338
  const top = clamp(overlayRect.top - containerRect.top, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
5288
5339
  this._element.style.left = `${left}px`;
@@ -5328,9 +5379,10 @@ class Overlay extends CompositeDisposable {
5328
5379
  y: e.clientY - overlayRect.top,
5329
5380
  };
5330
5381
  }
5331
- const xOffset = Math.max(0, overlayRect.width - this.options.minimumInViewportWidth);
5332
- const yOffset = Math.max(0, overlayRect.height -
5333
- this.options.minimumInViewportHeight);
5382
+ const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));
5383
+ const yOffset = Math.max(0, this.options.minimumInViewportHeight
5384
+ ? this.getMinimumHeight(overlayRect.height)
5385
+ : 0);
5334
5386
  const left = clamp(x - offset.x, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
5335
5387
  const top = clamp(y - offset.y, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
5336
5388
  this.setBounds({ top, left });
@@ -5404,14 +5456,11 @@ class Overlay extends CompositeDisposable {
5404
5456
  let height = undefined;
5405
5457
  let left = undefined;
5406
5458
  let width = undefined;
5407
- const minimumInViewportHeight = this.options.minimumInViewportHeight;
5408
- const minimumInViewportWidth = this.options.minimumInViewportWidth;
5409
- function moveTop() {
5459
+ const moveTop = () => {
5410
5460
  top = clamp(y, -Number.MAX_VALUE, startPosition.originalY +
5411
5461
  startPosition.originalHeight >
5412
5462
  containerRect.height
5413
- ? containerRect.height -
5414
- minimumInViewportHeight
5463
+ ? this.getMinimumHeight(containerRect.height)
5415
5464
  : Math.max(0, startPosition.originalY +
5416
5465
  startPosition.originalHeight -
5417
5466
  Overlay.MINIMUM_HEIGHT));
@@ -5419,21 +5468,23 @@ class Overlay extends CompositeDisposable {
5419
5468
  startPosition.originalY +
5420
5469
  startPosition.originalHeight -
5421
5470
  top;
5422
- }
5423
- function moveBottom() {
5471
+ };
5472
+ const moveBottom = () => {
5424
5473
  top =
5425
5474
  startPosition.originalY -
5426
5475
  startPosition.originalHeight;
5427
- height = clamp(y - top, top < 0
5428
- ? -top + minimumInViewportHeight
5476
+ height = clamp(y - top, top < 0 &&
5477
+ typeof this.options
5478
+ .minimumInViewportHeight === 'number'
5479
+ ? -top +
5480
+ this.options.minimumInViewportHeight
5429
5481
  : Overlay.MINIMUM_HEIGHT, Number.MAX_VALUE);
5430
- }
5431
- function moveLeft() {
5482
+ };
5483
+ const moveLeft = () => {
5432
5484
  left = clamp(x, -Number.MAX_VALUE, startPosition.originalX +
5433
5485
  startPosition.originalWidth >
5434
5486
  containerRect.width
5435
- ? containerRect.width -
5436
- minimumInViewportWidth
5487
+ ? this.getMinimumWidth(containerRect.width)
5437
5488
  : Math.max(0, startPosition.originalX +
5438
5489
  startPosition.originalWidth -
5439
5490
  Overlay.MINIMUM_WIDTH));
@@ -5441,15 +5492,18 @@ class Overlay extends CompositeDisposable {
5441
5492
  startPosition.originalX +
5442
5493
  startPosition.originalWidth -
5443
5494
  left;
5444
- }
5445
- function moveRight() {
5495
+ };
5496
+ const moveRight = () => {
5446
5497
  left =
5447
5498
  startPosition.originalX -
5448
5499
  startPosition.originalWidth;
5449
- width = clamp(x - left, left < 0
5450
- ? -left + minimumInViewportWidth
5500
+ width = clamp(x - left, left < 0 &&
5501
+ typeof this.options
5502
+ .minimumInViewportWidth === 'number'
5503
+ ? -left +
5504
+ this.options.minimumInViewportWidth
5451
5505
  : Overlay.MINIMUM_WIDTH, Number.MAX_VALUE);
5452
- }
5506
+ };
5453
5507
  switch (direction) {
5454
5508
  case 'top':
5455
5509
  moveTop();
@@ -5493,6 +5547,18 @@ class Overlay extends CompositeDisposable {
5493
5547
  }));
5494
5548
  }));
5495
5549
  }
5550
+ getMinimumWidth(width) {
5551
+ if (typeof this.options.minimumInViewportWidth === 'number') {
5552
+ return width - this.options.minimumInViewportWidth;
5553
+ }
5554
+ return 0;
5555
+ }
5556
+ getMinimumHeight(height) {
5557
+ if (typeof this.options.minimumInViewportHeight === 'number') {
5558
+ return height - this.options.minimumInViewportHeight;
5559
+ }
5560
+ return height;
5561
+ }
5496
5562
  dispose() {
5497
5563
  this._element.remove();
5498
5564
  super.dispose();
@@ -5513,6 +5579,7 @@ class DockviewFloatingGroupPanel extends CompositeDisposable {
5513
5579
  }
5514
5580
  }
5515
5581
 
5582
+ const DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE = 100;
5516
5583
  class DockviewComponent extends BaseGrid {
5517
5584
  get orientation() {
5518
5585
  return this.gridview.orientation;
@@ -5543,6 +5610,10 @@ class DockviewComponent extends BaseGrid {
5543
5610
  this.nextGroupId = sequentialNumberGenerator();
5544
5611
  this._deserializer = new DefaultDockviewDeserialzier(this);
5545
5612
  this.watermark = null;
5613
+ this._onWillDragPanel = new Emitter();
5614
+ this.onWillDragPanel = this._onWillDragPanel.event;
5615
+ this._onWillDragGroup = new Emitter();
5616
+ this.onWillDragGroup = this._onWillDragGroup.event;
5546
5617
  this._onDidDrop = new Emitter();
5547
5618
  this.onDidDrop = this._onDidDrop.event;
5548
5619
  this._onDidRemovePanel = new Emitter();
@@ -5555,7 +5626,7 @@ class DockviewComponent extends BaseGrid {
5555
5626
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
5556
5627
  this.floatingGroups = [];
5557
5628
  toggleClass(this.gridview.element, 'dv-dockview', true);
5558
- this.addDisposables(this._onDidDrop, exports.DockviewEvent.any(this.onDidAddGroup, this.onDidRemoveGroup)(() => {
5629
+ this.addDisposables(this._onWillDragPanel, this._onWillDragGroup, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, exports.DockviewEvent.any(this.onDidAddGroup, this.onDidRemoveGroup)(() => {
5559
5630
  this.updateWatermark();
5560
5631
  }), exports.DockviewEvent.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidActivePanelChange)(() => {
5561
5632
  this._bufferOnDidLayoutChange.fire();
@@ -5592,7 +5663,7 @@ class DockviewComponent extends BaseGrid {
5592
5663
  return true;
5593
5664
  }
5594
5665
  if (this.options.showDndOverlay) {
5595
- if (position === 'center') {
5666
+ if (position === 'center' && this.gridview.length !== 0) {
5596
5667
  /**
5597
5668
  * for external events only show the four-corner drag overlays, disable
5598
5669
  * the center position so that external drag events can fall through to the group
@@ -5628,7 +5699,7 @@ class DockviewComponent extends BaseGrid {
5628
5699
  this.updateWatermark();
5629
5700
  }
5630
5701
  addFloatingGroup(item, coord, options) {
5631
- var _a, _b;
5702
+ var _a, _b, _c, _d, _e, _f;
5632
5703
  let group;
5633
5704
  if (item instanceof DockviewPanel) {
5634
5705
  group = this.createGroup();
@@ -5656,8 +5727,12 @@ class DockviewComponent extends BaseGrid {
5656
5727
  width: (_b = coord === null || coord === void 0 ? void 0 : coord.width) !== null && _b !== void 0 ? _b : 300,
5657
5728
  left: overlayLeft,
5658
5729
  top: overlayTop,
5659
- minimumInViewportWidth: 100,
5660
- minimumInViewportHeight: 100,
5730
+ minimumInViewportWidth: this.options.floatingGroupBounds === 'boundedWithinViewport'
5731
+ ? undefined
5732
+ : (_d = (_c = this.options.floatingGroupBounds) === null || _c === void 0 ? void 0 : _c.minimumWidthWithinViewport) !== null && _d !== void 0 ? _d : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE,
5733
+ minimumInViewportHeight: this.options.floatingGroupBounds === 'boundedWithinViewport'
5734
+ ? undefined
5735
+ : (_f = (_e = this.options.floatingGroupBounds) === null || _e === void 0 ? void 0 : _e.minimumHeightWithinViewport) !== null && _f !== void 0 ? _f : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE,
5661
5736
  });
5662
5737
  const el = group.element.querySelector('.void-container');
5663
5738
  if (!el) {
@@ -5728,12 +5803,37 @@ class DockviewComponent extends BaseGrid {
5728
5803
  }
5729
5804
  }
5730
5805
  updateOptions(options) {
5806
+ var _a, _b;
5731
5807
  const hasOrientationChanged = typeof options.orientation === 'string' &&
5732
5808
  this.gridview.orientation !== options.orientation;
5809
+ const hasFloatingGroupOptionsChanged = options.floatingGroupBounds !== undefined &&
5810
+ options.floatingGroupBounds !== this.options.floatingGroupBounds;
5733
5811
  this._options = Object.assign(Object.assign({}, this.options), options);
5734
5812
  if (hasOrientationChanged) {
5735
5813
  this.gridview.orientation = options.orientation;
5736
5814
  }
5815
+ if (hasFloatingGroupOptionsChanged) {
5816
+ for (const group of this.floatingGroups) {
5817
+ switch (this.options.floatingGroupBounds) {
5818
+ case 'boundedWithinViewport':
5819
+ group.overlay.minimumInViewportHeight = undefined;
5820
+ group.overlay.minimumInViewportWidth = undefined;
5821
+ break;
5822
+ case undefined:
5823
+ group.overlay.minimumInViewportHeight =
5824
+ DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE;
5825
+ group.overlay.minimumInViewportWidth =
5826
+ DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE;
5827
+ break;
5828
+ default:
5829
+ group.overlay.minimumInViewportHeight =
5830
+ (_a = this.options.floatingGroupBounds) === null || _a === void 0 ? void 0 : _a.minimumHeightWithinViewport;
5831
+ group.overlay.minimumInViewportWidth =
5832
+ (_b = this.options.floatingGroupBounds) === null || _b === void 0 ? void 0 : _b.minimumWidthWithinViewport;
5833
+ }
5834
+ group.overlay.setBounds({});
5835
+ }
5836
+ }
5737
5837
  this.layout(this.gridview.width, this.gridview.height, true);
5738
5838
  }
5739
5839
  layout(width, height, forceResize) {
@@ -6216,7 +6316,11 @@ class DockviewComponent extends BaseGrid {
6216
6316
  const view = new DockviewGroupPanel(this, id, options);
6217
6317
  view.init({ params: {}, accessor: null }); // required to initialized .part and allow for correct disposal of group
6218
6318
  if (!this._groups.has(view.id)) {
6219
- const disposable = new CompositeDisposable(view.model.onMove((event) => {
6319
+ const disposable = new CompositeDisposable(view.model.onTabDragStart((event) => {
6320
+ this._onWillDragPanel.fire(event);
6321
+ }), view.model.onGroupDragStart((event) => {
6322
+ this._onWillDragGroup.fire(event);
6323
+ }), view.model.onMove((event) => {
6220
6324
  const { groupId, itemId, target, index } = event;
6221
6325
  this.moveGroupOrPanel(view, groupId, itemId, target, index);
6222
6326
  }), view.model.onDidDrop((event) => {
@@ -6255,13 +6359,6 @@ class DockviewComponent extends BaseGrid {
6255
6359
  var _a;
6256
6360
  return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;
6257
6361
  }
6258
- dispose() {
6259
- this._onDidActivePanelChange.dispose();
6260
- this._onDidAddPanel.dispose();
6261
- this._onDidRemovePanel.dispose();
6262
- this._onDidLayoutFromJSON.dispose();
6263
- super.dispose();
6264
- }
6265
6362
  }
6266
6363
 
6267
6364
  class GridviewComponent extends BaseGrid {