dockview-core 1.8.5 → 1.9.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 (289) hide show
  1. package/README.md +18 -11
  2. package/dist/cjs/api/component.api.d.ts +12 -0
  3. package/dist/cjs/api/component.api.d.ts.map +1 -1
  4. package/dist/cjs/api/component.api.js +22 -0
  5. package/dist/cjs/api/component.api.js.map +1 -1
  6. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +15 -8
  7. package/dist/cjs/api/dockviewGroupPanelApi.d.ts.map +1 -1
  8. package/dist/cjs/api/dockviewGroupPanelApi.js +39 -9
  9. package/dist/cjs/api/dockviewGroupPanelApi.js.map +1 -1
  10. package/dist/cjs/api/dockviewPanelApi.d.ts +19 -2
  11. package/dist/cjs/api/dockviewPanelApi.d.ts.map +1 -1
  12. package/dist/cjs/api/dockviewPanelApi.js +23 -3
  13. package/dist/cjs/api/dockviewPanelApi.js.map +1 -1
  14. package/dist/cjs/api/gridviewPanelApi.js.map +1 -1
  15. package/dist/cjs/api/panelApi.js.map +1 -1
  16. package/dist/cjs/api/paneviewPanelApi.js.map +1 -1
  17. package/dist/cjs/api/splitviewPanelApi.js.map +1 -1
  18. package/dist/cjs/array.js.map +1 -1
  19. package/dist/cjs/constants.d.ts +6 -0
  20. package/dist/cjs/constants.d.ts.map +1 -0
  21. package/dist/cjs/constants.js +6 -0
  22. package/dist/cjs/constants.js.map +1 -0
  23. package/dist/cjs/dnd/abstractDragHandler.js.map +1 -1
  24. package/dist/cjs/dnd/dataTransfer.js.map +1 -1
  25. package/dist/cjs/dnd/dnd.d.ts +5 -0
  26. package/dist/cjs/dnd/dnd.d.ts.map +1 -1
  27. package/dist/cjs/dnd/dnd.js +28 -13
  28. package/dist/cjs/dnd/dnd.js.map +1 -1
  29. package/dist/cjs/dnd/droptarget.d.ts +13 -12
  30. package/dist/cjs/dnd/droptarget.d.ts.map +1 -1
  31. package/dist/cjs/dnd/droptarget.js +40 -49
  32. package/dist/cjs/dnd/droptarget.js.map +1 -1
  33. package/dist/cjs/dnd/groupDragHandler.js +1 -1
  34. package/dist/cjs/dnd/groupDragHandler.js.map +1 -1
  35. package/dist/cjs/dnd/overlay.d.ts +4 -17
  36. package/dist/cjs/dnd/overlay.d.ts.map +1 -1
  37. package/dist/cjs/dnd/overlay.js.map +1 -1
  38. package/dist/cjs/dockview/components/panel/content.d.ts +14 -1
  39. package/dist/cjs/dockview/components/panel/content.d.ts.map +1 -1
  40. package/dist/cjs/dockview/components/panel/content.js +85 -26
  41. package/dist/cjs/dockview/components/panel/content.js.map +1 -1
  42. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  43. package/dist/cjs/dockview/components/tab/tab.js.map +1 -1
  44. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +2 -2
  45. package/dist/cjs/dockview/components/titlebar/tabsContainer.js.map +1 -1
  46. package/dist/cjs/dockview/components/titlebar/voidContainer.js.map +1 -1
  47. package/dist/cjs/dockview/components/watermark/watermark.js.map +1 -1
  48. package/dist/cjs/dockview/deserializer.d.ts +2 -2
  49. package/dist/cjs/dockview/deserializer.d.ts.map +1 -1
  50. package/dist/cjs/dockview/deserializer.js +6 -4
  51. package/dist/cjs/dockview/deserializer.js.map +1 -1
  52. package/dist/cjs/dockview/dockviewComponent.d.ts +23 -10
  53. package/dist/cjs/dockview/dockviewComponent.d.ts.map +1 -1
  54. package/dist/cjs/dockview/dockviewComponent.js +305 -115
  55. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  56. package/dist/cjs/dockview/dockviewFloatingGroupPanel.js.map +1 -1
  57. package/dist/cjs/dockview/dockviewGroupPanel.d.ts.map +1 -1
  58. package/dist/cjs/dockview/dockviewGroupPanel.js +4 -2
  59. package/dist/cjs/dockview/dockviewGroupPanel.js.map +1 -1
  60. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +5 -4
  61. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts.map +1 -1
  62. package/dist/cjs/dockview/dockviewGroupPanelModel.js +37 -43
  63. package/dist/cjs/dockview/dockviewGroupPanelModel.js.map +1 -1
  64. package/dist/cjs/dockview/dockviewPanel.d.ts +8 -1
  65. package/dist/cjs/dockview/dockviewPanel.d.ts.map +1 -1
  66. package/dist/cjs/dockview/dockviewPanel.js +23 -1
  67. package/dist/cjs/dockview/dockviewPanel.js.map +1 -1
  68. package/dist/cjs/dockview/dockviewPanelModel.js.map +1 -1
  69. package/dist/cjs/dockview/dockviewPopoutGroupPanel.d.ts +16 -0
  70. package/dist/cjs/dockview/dockviewPopoutGroupPanel.d.ts.map +1 -0
  71. package/dist/cjs/dockview/dockviewPopoutGroupPanel.js +50 -0
  72. package/dist/cjs/dockview/dockviewPopoutGroupPanel.js.map +1 -0
  73. package/dist/cjs/dockview/options.d.ts +7 -1
  74. package/dist/cjs/dockview/options.d.ts.map +1 -1
  75. package/dist/cjs/dockview/options.js.map +1 -1
  76. package/dist/cjs/dockview/types.d.ts +2 -0
  77. package/dist/cjs/dockview/types.d.ts.map +1 -1
  78. package/dist/cjs/dockview/types.js.map +1 -1
  79. package/dist/cjs/dom.d.ts +12 -0
  80. package/dist/cjs/dom.d.ts.map +1 -1
  81. package/dist/cjs/dom.js +80 -1
  82. package/dist/cjs/dom.js.map +1 -1
  83. package/dist/cjs/events.js.map +1 -1
  84. package/dist/cjs/gridview/baseComponentGridview.d.ts +10 -0
  85. package/dist/cjs/gridview/baseComponentGridview.d.ts.map +1 -1
  86. package/dist/cjs/gridview/baseComponentGridview.js +19 -0
  87. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  88. package/dist/cjs/gridview/basePanelView.js.map +1 -1
  89. package/dist/cjs/gridview/branchNode.d.ts +2 -0
  90. package/dist/cjs/gridview/branchNode.d.ts.map +1 -1
  91. package/dist/cjs/gridview/branchNode.js +37 -10
  92. package/dist/cjs/gridview/branchNode.js.map +1 -1
  93. package/dist/cjs/gridview/gridview.d.ts +10 -3
  94. package/dist/cjs/gridview/gridview.d.ts.map +1 -1
  95. package/dist/cjs/gridview/gridview.js +80 -0
  96. package/dist/cjs/gridview/gridview.js.map +1 -1
  97. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  98. package/dist/cjs/gridview/gridviewPanel.js.map +1 -1
  99. package/dist/cjs/gridview/leafNode.d.ts.map +1 -1
  100. package/dist/cjs/gridview/leafNode.js +1 -2
  101. package/dist/cjs/gridview/leafNode.js.map +1 -1
  102. package/dist/cjs/index.d.ts +3 -2
  103. package/dist/cjs/index.d.ts.map +1 -1
  104. package/dist/cjs/index.js.map +1 -1
  105. package/dist/cjs/lifecycle.d.ts +1 -0
  106. package/dist/cjs/lifecycle.d.ts.map +1 -1
  107. package/dist/cjs/lifecycle.js +8 -0
  108. package/dist/cjs/lifecycle.js.map +1 -1
  109. package/dist/cjs/math.js.map +1 -1
  110. package/dist/cjs/overlayRenderContainer.d.ts +19 -0
  111. package/dist/cjs/overlayRenderContainer.d.ts.map +1 -0
  112. package/dist/cjs/overlayRenderContainer.js +170 -0
  113. package/dist/cjs/overlayRenderContainer.js.map +1 -0
  114. package/dist/cjs/panel/componentFactory.js.map +1 -1
  115. package/dist/cjs/paneview/defaultPaneviewHeader.js.map +1 -1
  116. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  117. package/dist/cjs/paneview/paneview.js.map +1 -1
  118. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  119. package/dist/cjs/paneview/paneviewPanel.js.map +1 -1
  120. package/dist/cjs/popoutWindow.d.ts +18 -0
  121. package/dist/cjs/popoutWindow.d.ts.map +1 -0
  122. package/dist/cjs/popoutWindow.js +130 -0
  123. package/dist/cjs/popoutWindow.js.map +1 -0
  124. package/dist/cjs/resizable.d.ts.map +1 -1
  125. package/dist/cjs/resizable.js +16 -1
  126. package/dist/cjs/resizable.js.map +1 -1
  127. package/dist/cjs/splitview/splitview.d.ts +5 -4
  128. package/dist/cjs/splitview/splitview.d.ts.map +1 -1
  129. package/dist/cjs/splitview/splitview.js +31 -8
  130. package/dist/cjs/splitview/splitview.js.map +1 -1
  131. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  132. package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
  133. package/dist/cjs/splitview/viewItem.js.map +1 -1
  134. package/dist/cjs/types.d.ts +6 -0
  135. package/dist/cjs/types.d.ts.map +1 -1
  136. package/dist/dockview-core.amd.js +966 -229
  137. package/dist/dockview-core.amd.js.map +1 -1
  138. package/dist/dockview-core.amd.min.js +2 -2
  139. package/dist/dockview-core.amd.min.js.map +1 -1
  140. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  141. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  142. package/dist/dockview-core.amd.noStyle.js +965 -228
  143. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  144. package/dist/dockview-core.cjs.js +966 -229
  145. package/dist/dockview-core.cjs.js.map +1 -1
  146. package/dist/dockview-core.esm.js +966 -229
  147. package/dist/dockview-core.esm.js.map +1 -1
  148. package/dist/dockview-core.esm.min.js +2 -2
  149. package/dist/dockview-core.esm.min.js.map +1 -1
  150. package/dist/dockview-core.js +966 -229
  151. package/dist/dockview-core.js.map +1 -1
  152. package/dist/dockview-core.min.js +2 -2
  153. package/dist/dockview-core.min.js.map +1 -1
  154. package/dist/dockview-core.min.noStyle.js +2 -2
  155. package/dist/dockview-core.min.noStyle.js.map +1 -1
  156. package/dist/dockview-core.noStyle.js +965 -228
  157. package/dist/dockview-core.noStyle.js.map +1 -1
  158. package/dist/esm/api/component.api.d.ts +12 -0
  159. package/dist/esm/api/component.api.d.ts.map +1 -1
  160. package/dist/esm/api/component.api.js +18 -0
  161. package/dist/esm/api/component.api.js.map +1 -1
  162. package/dist/esm/api/dockviewGroupPanelApi.d.ts +15 -8
  163. package/dist/esm/api/dockviewGroupPanelApi.d.ts.map +1 -1
  164. package/dist/esm/api/dockviewGroupPanelApi.js +39 -9
  165. package/dist/esm/api/dockviewGroupPanelApi.js.map +1 -1
  166. package/dist/esm/api/dockviewPanelApi.d.ts +19 -2
  167. package/dist/esm/api/dockviewPanelApi.d.ts.map +1 -1
  168. package/dist/esm/api/dockviewPanelApi.js +19 -3
  169. package/dist/esm/api/dockviewPanelApi.js.map +1 -1
  170. package/dist/esm/api/gridviewPanelApi.js.map +1 -1
  171. package/dist/esm/array.js.map +1 -1
  172. package/dist/esm/constants.d.ts +6 -0
  173. package/dist/esm/constants.d.ts.map +1 -0
  174. package/dist/esm/constants.js +3 -0
  175. package/dist/esm/constants.js.map +1 -0
  176. package/dist/esm/dnd/abstractDragHandler.js.map +1 -1
  177. package/dist/esm/dnd/dataTransfer.js.map +1 -1
  178. package/dist/esm/dnd/dnd.d.ts +5 -0
  179. package/dist/esm/dnd/dnd.d.ts.map +1 -1
  180. package/dist/esm/dnd/dnd.js +28 -13
  181. package/dist/esm/dnd/dnd.js.map +1 -1
  182. package/dist/esm/dnd/droptarget.d.ts +13 -12
  183. package/dist/esm/dnd/droptarget.d.ts.map +1 -1
  184. package/dist/esm/dnd/droptarget.js +40 -49
  185. package/dist/esm/dnd/droptarget.js.map +1 -1
  186. package/dist/esm/dnd/groupDragHandler.js +1 -1
  187. package/dist/esm/dnd/groupDragHandler.js.map +1 -1
  188. package/dist/esm/dnd/overlay.d.ts +4 -17
  189. package/dist/esm/dnd/overlay.d.ts.map +1 -1
  190. package/dist/esm/dnd/overlay.js.map +1 -1
  191. package/dist/esm/dockview/components/panel/content.d.ts +14 -1
  192. package/dist/esm/dockview/components/panel/content.d.ts.map +1 -1
  193. package/dist/esm/dockview/components/panel/content.js +84 -26
  194. package/dist/esm/dockview/components/panel/content.js.map +1 -1
  195. package/dist/esm/dockview/components/tab/defaultTab.js.map +1 -1
  196. package/dist/esm/dockview/components/tab/tab.js.map +1 -1
  197. package/dist/esm/dockview/components/titlebar/tabsContainer.js +2 -2
  198. package/dist/esm/dockview/components/titlebar/tabsContainer.js.map +1 -1
  199. package/dist/esm/dockview/components/titlebar/voidContainer.js.map +1 -1
  200. package/dist/esm/dockview/components/watermark/watermark.js.map +1 -1
  201. package/dist/esm/dockview/deserializer.d.ts +2 -2
  202. package/dist/esm/dockview/deserializer.d.ts.map +1 -1
  203. package/dist/esm/dockview/deserializer.js +6 -4
  204. package/dist/esm/dockview/deserializer.js.map +1 -1
  205. package/dist/esm/dockview/dockviewComponent.d.ts +23 -10
  206. package/dist/esm/dockview/dockviewComponent.d.ts.map +1 -1
  207. package/dist/esm/dockview/dockviewComponent.js +207 -55
  208. package/dist/esm/dockview/dockviewComponent.js.map +1 -1
  209. package/dist/esm/dockview/dockviewGroupPanel.d.ts.map +1 -1
  210. package/dist/esm/dockview/dockviewGroupPanel.js +4 -2
  211. package/dist/esm/dockview/dockviewGroupPanel.js.map +1 -1
  212. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +5 -4
  213. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts.map +1 -1
  214. package/dist/esm/dockview/dockviewGroupPanelModel.js +39 -45
  215. package/dist/esm/dockview/dockviewGroupPanelModel.js.map +1 -1
  216. package/dist/esm/dockview/dockviewPanel.d.ts +8 -1
  217. package/dist/esm/dockview/dockviewPanel.d.ts.map +1 -1
  218. package/dist/esm/dockview/dockviewPanel.js +19 -1
  219. package/dist/esm/dockview/dockviewPanel.js.map +1 -1
  220. package/dist/esm/dockview/dockviewPanelModel.js.map +1 -1
  221. package/dist/esm/dockview/dockviewPopoutGroupPanel.d.ts +16 -0
  222. package/dist/esm/dockview/dockviewPopoutGroupPanel.d.ts.map +1 -0
  223. package/dist/esm/dockview/dockviewPopoutGroupPanel.js +28 -0
  224. package/dist/esm/dockview/dockviewPopoutGroupPanel.js.map +1 -0
  225. package/dist/esm/dockview/options.d.ts +7 -1
  226. package/dist/esm/dockview/options.d.ts.map +1 -1
  227. package/dist/esm/dockview/options.js.map +1 -1
  228. package/dist/esm/dockview/types.d.ts +2 -0
  229. package/dist/esm/dockview/types.d.ts.map +1 -1
  230. package/dist/esm/dockview/types.js.map +1 -1
  231. package/dist/esm/dom.d.ts +12 -0
  232. package/dist/esm/dom.d.ts.map +1 -1
  233. package/dist/esm/dom.js +55 -0
  234. package/dist/esm/dom.js.map +1 -1
  235. package/dist/esm/events.js.map +1 -1
  236. package/dist/esm/gridview/baseComponentGridview.d.ts +10 -0
  237. package/dist/esm/gridview/baseComponentGridview.d.ts.map +1 -1
  238. package/dist/esm/gridview/baseComponentGridview.js +15 -0
  239. package/dist/esm/gridview/baseComponentGridview.js.map +1 -1
  240. package/dist/esm/gridview/basePanelView.js.map +1 -1
  241. package/dist/esm/gridview/branchNode.d.ts +2 -0
  242. package/dist/esm/gridview/branchNode.d.ts.map +1 -1
  243. package/dist/esm/gridview/branchNode.js +26 -5
  244. package/dist/esm/gridview/branchNode.js.map +1 -1
  245. package/dist/esm/gridview/gridview.d.ts +10 -3
  246. package/dist/esm/gridview/gridview.d.ts.map +1 -1
  247. package/dist/esm/gridview/gridview.js +80 -0
  248. package/dist/esm/gridview/gridview.js.map +1 -1
  249. package/dist/esm/gridview/gridviewComponent.js.map +1 -1
  250. package/dist/esm/gridview/gridviewPanel.js.map +1 -1
  251. package/dist/esm/gridview/leafNode.d.ts.map +1 -1
  252. package/dist/esm/gridview/leafNode.js +0 -1
  253. package/dist/esm/gridview/leafNode.js.map +1 -1
  254. package/dist/esm/index.d.ts +3 -2
  255. package/dist/esm/index.d.ts.map +1 -1
  256. package/dist/esm/index.js.map +1 -1
  257. package/dist/esm/lifecycle.d.ts +1 -0
  258. package/dist/esm/lifecycle.d.ts.map +1 -1
  259. package/dist/esm/lifecycle.js +8 -0
  260. package/dist/esm/lifecycle.js.map +1 -1
  261. package/dist/esm/math.js.map +1 -1
  262. package/dist/esm/overlayRenderContainer.d.ts +19 -0
  263. package/dist/esm/overlayRenderContainer.d.ts.map +1 -0
  264. package/dist/esm/overlayRenderContainer.js +125 -0
  265. package/dist/esm/overlayRenderContainer.js.map +1 -0
  266. package/dist/esm/panel/componentFactory.js.map +1 -1
  267. package/dist/esm/paneview/defaultPaneviewHeader.js.map +1 -1
  268. package/dist/esm/paneview/draggablePaneviewPanel.js.map +1 -1
  269. package/dist/esm/paneview/paneview.js.map +1 -1
  270. package/dist/esm/paneview/paneviewComponent.js.map +1 -1
  271. package/dist/esm/paneview/paneviewPanel.js.map +1 -1
  272. package/dist/esm/popoutWindow.d.ts +18 -0
  273. package/dist/esm/popoutWindow.d.ts.map +1 -0
  274. package/dist/esm/popoutWindow.js +88 -0
  275. package/dist/esm/popoutWindow.js.map +1 -0
  276. package/dist/esm/resizable.d.ts.map +1 -1
  277. package/dist/esm/resizable.js +17 -2
  278. package/dist/esm/resizable.js.map +1 -1
  279. package/dist/esm/splitview/splitview.d.ts +5 -4
  280. package/dist/esm/splitview/splitview.d.ts.map +1 -1
  281. package/dist/esm/splitview/splitview.js +25 -8
  282. package/dist/esm/splitview/splitview.js.map +1 -1
  283. package/dist/esm/splitview/splitviewComponent.js.map +1 -1
  284. package/dist/esm/splitview/splitviewPanel.js.map +1 -1
  285. package/dist/esm/splitview/viewItem.js.map +1 -1
  286. package/dist/esm/types.d.ts +6 -0
  287. package/dist/esm/types.d.ts.map +1 -1
  288. package/dist/styles/dockview.css +38 -7
  289. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 1.8.5
3
+ * @version 1.9.1
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -232,6 +232,14 @@ define(['exports'], (function (exports) { 'use strict';
232
232
  // noop
233
233
  },
234
234
  };
235
+ function from(func) {
236
+ return {
237
+ dispose: () => {
238
+ func();
239
+ },
240
+ };
241
+ }
242
+ Disposable.from = from;
235
243
  })(Disposable || (Disposable = {}));
236
244
  class CompositeDisposable {
237
245
  get isDisposed() {
@@ -416,6 +424,61 @@ define(['exports'], (function (exports) { 'use strict';
416
424
  function quasiDefaultPrevented(event) {
417
425
  return event[QUASI_PREVENT_DEFAULT_KEY];
418
426
  }
427
+ function addStyles(document, styleSheetList) {
428
+ const styleSheets = Array.from(styleSheetList);
429
+ for (const styleSheet of styleSheets) {
430
+ if (styleSheet.href) {
431
+ const link = document.createElement('link');
432
+ link.href = styleSheet.href;
433
+ link.type = styleSheet.type;
434
+ link.rel = 'stylesheet';
435
+ document.head.appendChild(link);
436
+ }
437
+ let cssTexts = [];
438
+ try {
439
+ if (styleSheet.cssRules) {
440
+ cssTexts = Array.from(styleSheet.cssRules).map((rule) => rule.cssText);
441
+ }
442
+ }
443
+ catch (err) {
444
+ // security errors (lack of permissions), ignore
445
+ }
446
+ for (const rule of cssTexts) {
447
+ const style = document.createElement('style');
448
+ style.appendChild(document.createTextNode(rule));
449
+ document.head.appendChild(style);
450
+ }
451
+ }
452
+ }
453
+ function getDomNodePagePosition(domNode) {
454
+ const { left, top, width, height } = domNode.getBoundingClientRect();
455
+ return {
456
+ left: left + window.scrollX,
457
+ top: top + window.scrollY,
458
+ width: width,
459
+ height: height,
460
+ };
461
+ }
462
+ /**
463
+ * Check whether an element is in the DOM (including the Shadow DOM)
464
+ * @see https://terodox.tech/how-to-tell-if-an-element-is-in-the-dom-including-the-shadow-dom/
465
+ */
466
+ function isInDocument(element) {
467
+ let currentElement = element;
468
+ while (currentElement === null || currentElement === void 0 ? void 0 : currentElement.parentNode) {
469
+ if (currentElement.parentNode === document) {
470
+ return true;
471
+ }
472
+ else if (currentElement.parentNode instanceof DocumentFragment) {
473
+ // handle shadow DOMs
474
+ currentElement = currentElement.parentNode.host;
475
+ }
476
+ else {
477
+ currentElement = currentElement.parentNode;
478
+ }
479
+ }
480
+ return false;
481
+ }
419
482
 
420
483
  function tail(arr) {
421
484
  if (arr.length === 0) {
@@ -613,6 +676,9 @@ define(['exports'], (function (exports) { 'use strict';
613
676
  Sizing.Invisible = Invisible;
614
677
  })(exports.Sizing || (exports.Sizing = {}));
615
678
  class Splitview {
679
+ get contentSize() {
680
+ return this._contentSize;
681
+ }
616
682
  get size() {
617
683
  return this._size;
618
684
  }
@@ -678,7 +744,7 @@ define(['exports'], (function (exports) { 'use strict';
678
744
  this.sashes = [];
679
745
  this._size = 0;
680
746
  this._orthogonalSize = 0;
681
- this.contentSize = 0;
747
+ this._contentSize = 0;
682
748
  this._proportions = undefined;
683
749
  this._startSnappingEnabled = true;
684
750
  this._endSnappingEnabled = true;
@@ -797,7 +863,7 @@ define(['exports'], (function (exports) { 'use strict';
797
863
  );
798
864
  });
799
865
  // Initialize content size and proportions for first layout
800
- this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
866
+ this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
801
867
  this.saveProportions();
802
868
  }
803
869
  }
@@ -1071,7 +1137,7 @@ define(['exports'], (function (exports) { 'use strict';
1071
1137
  this.addView(view, sizing, to);
1072
1138
  }
1073
1139
  layout(size, orthogonalSize) {
1074
- const previousSize = Math.max(this.size, this.contentSize);
1140
+ const previousSize = Math.max(this.size, this._contentSize);
1075
1141
  this.size = size;
1076
1142
  this.orthogonalSize = orthogonalSize;
1077
1143
  if (!this.proportions) {
@@ -1081,9 +1147,23 @@ define(['exports'], (function (exports) { 'use strict';
1081
1147
  this.resize(this.viewItems.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);
1082
1148
  }
1083
1149
  else {
1150
+ let total = 0;
1084
1151
  for (let i = 0; i < this.viewItems.length; i++) {
1085
1152
  const item = this.viewItems[i];
1086
- item.size = clamp(Math.round(this.proportions[i] * size), item.minimumSize, item.maximumSize);
1153
+ const proportion = this.proportions[i];
1154
+ if (typeof proportion === 'number') {
1155
+ total += proportion;
1156
+ }
1157
+ else {
1158
+ size -= item.size;
1159
+ }
1160
+ }
1161
+ for (let i = 0; i < this.viewItems.length; i++) {
1162
+ const item = this.viewItems[i];
1163
+ const proportion = this.proportions[i];
1164
+ if (typeof proportion === 'number' && total > 0) {
1165
+ item.size = clamp(Math.round((proportion * size) / total), item.minimumSize, item.maximumSize);
1166
+ }
1087
1167
  }
1088
1168
  }
1089
1169
  this.distributeEmptySpace();
@@ -1120,12 +1200,12 @@ define(['exports'], (function (exports) { 'use strict';
1120
1200
  }
1121
1201
  }
1122
1202
  saveProportions() {
1123
- if (this.proportionalLayout && this.contentSize > 0) {
1124
- this._proportions = this.viewItems.map((i) => i.size / this.contentSize);
1203
+ if (this.proportionalLayout && this._contentSize > 0) {
1204
+ this._proportions = this.viewItems.map((i) => i.visible ? i.size / this._contentSize : undefined);
1125
1205
  }
1126
1206
  }
1127
1207
  layoutViews() {
1128
- this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
1208
+ this._contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
1129
1209
  let sum = 0;
1130
1210
  const x = [];
1131
1211
  this.updateSashEnablement();
@@ -1219,7 +1299,7 @@ define(['exports'], (function (exports) { 'use strict';
1219
1299
  }
1220
1300
  else if (snappedAfter &&
1221
1301
  collapsesDown[index] &&
1222
- (position < this.contentSize || this.endSnappingEnabled)) {
1302
+ (position < this._contentSize || this.endSnappingEnabled)) {
1223
1303
  this.updateSash(sash, exports.SashState.MAXIMUM);
1224
1304
  }
1225
1305
  else {
@@ -1508,7 +1588,6 @@ define(['exports'], (function (exports) { 'use strict';
1508
1588
  setVisible(visible) {
1509
1589
  if (this.view.setVisible) {
1510
1590
  this.view.setVisible(visible);
1511
- this._onDidChange.fire({});
1512
1591
  }
1513
1592
  }
1514
1593
  layout(size, orthogonalSize) {
@@ -1540,10 +1619,14 @@ define(['exports'], (function (exports) { 'use strict';
1540
1619
  get minimumSize() {
1541
1620
  return this.children.length === 0
1542
1621
  ? 0
1543
- : Math.max(...this.children.map((c) => c.minimumOrthogonalSize));
1622
+ : Math.max(...this.children.map((c, index) => this.splitview.isViewVisible(index)
1623
+ ? c.minimumOrthogonalSize
1624
+ : 0));
1544
1625
  }
1545
1626
  get maximumSize() {
1546
- return Math.min(...this.children.map((c) => c.maximumOrthogonalSize));
1627
+ return Math.min(...this.children.map((c, index) => this.splitview.isViewVisible(index)
1628
+ ? c.maximumOrthogonalSize
1629
+ : Number.POSITIVE_INFINITY));
1547
1630
  }
1548
1631
  get minimumOrthogonalSize() {
1549
1632
  return this.splitview.minimumSize;
@@ -1601,6 +1684,8 @@ define(['exports'], (function (exports) { 'use strict';
1601
1684
  this.children = [];
1602
1685
  this._onDidChange = new Emitter();
1603
1686
  this.onDidChange = this._onDidChange.event;
1687
+ this._onDidVisibilityChange = new Emitter();
1688
+ this.onDidVisibilityChange = this._onDidVisibilityChange.event;
1604
1689
  this._orthogonalSize = orthogonalSize;
1605
1690
  this._size = size;
1606
1691
  this.element = document.createElement('div');
@@ -1635,7 +1720,7 @@ define(['exports'], (function (exports) { 'use strict';
1635
1720
  styles,
1636
1721
  });
1637
1722
  }
1638
- this.addDisposables(this._onDidChange, this.splitview.onDidSashEnd(() => {
1723
+ this.addDisposables(this._onDidChange, this._onDidVisibilityChange, this.splitview.onDidSashEnd(() => {
1639
1724
  this._onDidChange.fire({});
1640
1725
  }));
1641
1726
  this.setupChildrenEvents();
@@ -1658,7 +1743,15 @@ define(['exports'], (function (exports) { 'use strict';
1658
1743
  if (this.splitview.isViewVisible(index) === visible) {
1659
1744
  return;
1660
1745
  }
1746
+ const wereAllChildrenHidden = this.splitview.contentSize === 0;
1661
1747
  this.splitview.setViewVisible(index, visible);
1748
+ const areAllChildrenHidden = this.splitview.contentSize === 0;
1749
+ // If all children are hidden then the parent should hide the entire splitview
1750
+ // If the entire splitview is hidden then the parent should show the splitview when a child is shown
1751
+ if ((visible && wereAllChildrenHidden) ||
1752
+ (!visible && areAllChildrenHidden)) {
1753
+ this._onDidVisibilityChange.fire(visible);
1754
+ }
1662
1755
  }
1663
1756
  moveChild(from, to) {
1664
1757
  if (from === to) {
@@ -1722,13 +1815,20 @@ define(['exports'], (function (exports) { 'use strict';
1722
1815
  }
1723
1816
  setupChildrenEvents() {
1724
1817
  this._childrenDisposable.dispose();
1725
- this._childrenDisposable = exports.DockviewEvent.any(...this.children.map((c) => c.onDidChange))((e) => {
1818
+ this._childrenDisposable = new CompositeDisposable(exports.DockviewEvent.any(...this.children.map((c) => c.onDidChange))((e) => {
1726
1819
  /**
1727
1820
  * indicate a change has occured to allows any re-rendering but don't bubble
1728
1821
  * event because that was specific to this branch
1729
1822
  */
1730
1823
  this._onDidChange.fire({ size: e.orthogonalSize });
1731
- });
1824
+ }), ...this.children.map((c, i) => {
1825
+ if (c instanceof BranchNode) {
1826
+ return c.onDidVisibilityChange((visible) => {
1827
+ this.setChildVisible(i, visible);
1828
+ });
1829
+ }
1830
+ return Disposable.NONE;
1831
+ }));
1732
1832
  }
1733
1833
  dispose() {
1734
1834
  this._childrenDisposable.dispose();
@@ -1889,7 +1989,69 @@ define(['exports'], (function (exports) { 'use strict';
1889
1989
  get maximumHeight() {
1890
1990
  return this.root.maximumHeight;
1891
1991
  }
1992
+ maximizedView() {
1993
+ var _a;
1994
+ return (_a = this._maximizedNode) === null || _a === void 0 ? void 0 : _a.view;
1995
+ }
1996
+ hasMaximizedView() {
1997
+ return this._maximizedNode !== undefined;
1998
+ }
1999
+ maximizeView(view) {
2000
+ const location = getGridLocation(view.element);
2001
+ const [_, node] = this.getNode(location);
2002
+ if (!(node instanceof LeafNode)) {
2003
+ return;
2004
+ }
2005
+ if (this._maximizedNode === node) {
2006
+ return;
2007
+ }
2008
+ if (this.hasMaximizedView()) {
2009
+ this.exitMaximizedView();
2010
+ }
2011
+ function hideAllViewsBut(parent, exclude) {
2012
+ for (let i = 0; i < parent.children.length; i++) {
2013
+ const child = parent.children[i];
2014
+ if (child instanceof LeafNode) {
2015
+ if (child !== exclude) {
2016
+ parent.setChildVisible(i, false);
2017
+ }
2018
+ }
2019
+ else {
2020
+ hideAllViewsBut(child, exclude);
2021
+ }
2022
+ }
2023
+ }
2024
+ hideAllViewsBut(this.root, node);
2025
+ this._maximizedNode = node;
2026
+ this._onDidMaxmizedNodeChange.fire();
2027
+ }
2028
+ exitMaximizedView() {
2029
+ if (!this._maximizedNode) {
2030
+ return;
2031
+ }
2032
+ function showViewsInReverseOrder(parent) {
2033
+ for (let index = parent.children.length - 1; index >= 0; index--) {
2034
+ const child = parent.children[index];
2035
+ if (child instanceof LeafNode) {
2036
+ parent.setChildVisible(index, true);
2037
+ }
2038
+ else {
2039
+ showViewsInReverseOrder(child);
2040
+ }
2041
+ }
2042
+ }
2043
+ showViewsInReverseOrder(this.root);
2044
+ this._maximizedNode = undefined;
2045
+ this._onDidMaxmizedNodeChange.fire();
2046
+ }
1892
2047
  serialize() {
2048
+ if (this.hasMaximizedView()) {
2049
+ /**
2050
+ * do not persist maximized view state but we must first exit any maximized views
2051
+ * before serialization to ensure the correct dimensions are persisted
2052
+ */
2053
+ this.exitMaximizedView();
2054
+ }
1893
2055
  const root = serializeBranchNode(this.getView(), this.orientation);
1894
2056
  return {
1895
2057
  root,
@@ -1901,7 +2063,9 @@ define(['exports'], (function (exports) { 'use strict';
1901
2063
  dispose() {
1902
2064
  this.disposable.dispose();
1903
2065
  this._onDidChange.dispose();
2066
+ this._onDidMaxmizedNodeChange.dispose();
1904
2067
  this.root.dispose();
2068
+ this._maximizedNode = undefined;
1905
2069
  this.element.remove();
1906
2070
  }
1907
2071
  clear() {
@@ -1942,6 +2106,7 @@ define(['exports'], (function (exports) { 'use strict';
1942
2106
  const oldRoot = this._root;
1943
2107
  if (oldRoot) {
1944
2108
  oldRoot.dispose();
2109
+ this._maximizedNode = undefined;
1945
2110
  this.element.removeChild(oldRoot.element);
1946
2111
  }
1947
2112
  this._root = root;
@@ -2028,9 +2193,12 @@ define(['exports'], (function (exports) { 'use strict';
2028
2193
  constructor(proportionalLayout, styles, orientation) {
2029
2194
  this.proportionalLayout = proportionalLayout;
2030
2195
  this.styles = styles;
2196
+ this._maximizedNode = undefined;
2031
2197
  this.disposable = new MutableDisposable();
2032
2198
  this._onDidChange = new Emitter();
2033
2199
  this.onDidChange = this._onDidChange.event;
2200
+ this._onDidMaxmizedNodeChange = new Emitter();
2201
+ this.onDidMaxmizedNodeChange = this._onDidMaxmizedNodeChange.event;
2034
2202
  this.element = document.createElement('div');
2035
2203
  this.element.className = 'grid-view';
2036
2204
  this.root = new BranchNode(orientation, proportionalLayout, styles, 0, 0);
@@ -2044,6 +2212,9 @@ define(['exports'], (function (exports) { 'use strict';
2044
2212
  return parent.isChildVisible(index);
2045
2213
  }
2046
2214
  setViewVisible(location, visible) {
2215
+ if (this.hasMaximizedView()) {
2216
+ this.exitMaximizedView();
2217
+ }
2047
2218
  const [rest, index] = tail(location);
2048
2219
  const [, parent] = this.getNode(rest);
2049
2220
  if (!(parent instanceof BranchNode)) {
@@ -2052,6 +2223,9 @@ define(['exports'], (function (exports) { 'use strict';
2052
2223
  parent.setChildVisible(index, visible);
2053
2224
  }
2054
2225
  moveView(parentLocation, from, to) {
2226
+ if (this.hasMaximizedView()) {
2227
+ this.exitMaximizedView();
2228
+ }
2055
2229
  const [, parent] = this.getNode(parentLocation);
2056
2230
  if (!(parent instanceof BranchNode)) {
2057
2231
  throw new Error('Invalid location');
@@ -2059,6 +2233,9 @@ define(['exports'], (function (exports) { 'use strict';
2059
2233
  parent.moveChild(from, to);
2060
2234
  }
2061
2235
  addView(view, size, location) {
2236
+ if (this.hasMaximizedView()) {
2237
+ this.exitMaximizedView();
2238
+ }
2062
2239
  const [rest, index] = tail(location);
2063
2240
  const [pathToParent, parent] = this.getNode(rest);
2064
2241
  if (parent instanceof BranchNode) {
@@ -2091,6 +2268,9 @@ define(['exports'], (function (exports) { 'use strict';
2091
2268
  return this.removeView(location, sizing);
2092
2269
  }
2093
2270
  removeView(location, sizing) {
2271
+ if (this.hasMaximizedView()) {
2272
+ this.exitMaximizedView();
2273
+ }
2094
2274
  const [rest, index] = tail(location);
2095
2275
  const [pathToParent, parent] = this.getNode(rest);
2096
2276
  if (!(parent instanceof BranchNode)) {
@@ -2828,6 +3008,24 @@ define(['exports'], (function (exports) { 'use strict';
2828
3008
  moveToPrevious(options) {
2829
3009
  this.component.moveToPrevious(options);
2830
3010
  }
3011
+ maximizeGroup(panel) {
3012
+ this.component.maximizeGroup(panel.group);
3013
+ }
3014
+ hasMaximizedGroup() {
3015
+ return this.component.hasMaximizedGroup();
3016
+ }
3017
+ exitMaxmizedGroup() {
3018
+ this.component.exitMaximizedGroup();
3019
+ }
3020
+ get onDidMaxmizedGroupChange() {
3021
+ return this.component.onDidMaxmizedGroupChange;
3022
+ }
3023
+ /**
3024
+ * Add a popout group in a new Window
3025
+ */
3026
+ addPopoutGroup(item, options) {
3027
+ this.component.addPopoutGroup(item, options);
3028
+ }
2831
3029
  }
2832
3030
 
2833
3031
  class DragAndDropObserver extends CompositeDisposable {
@@ -2838,36 +3036,48 @@ define(['exports'], (function (exports) { 'use strict';
2838
3036
  this.target = null;
2839
3037
  this.registerListeners();
2840
3038
  }
3039
+ onDragEnter(e) {
3040
+ this.target = e.target;
3041
+ this.callbacks.onDragEnter(e);
3042
+ }
3043
+ onDragOver(e) {
3044
+ e.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome)
3045
+ if (this.callbacks.onDragOver) {
3046
+ this.callbacks.onDragOver(e);
3047
+ }
3048
+ }
3049
+ onDragLeave(e) {
3050
+ if (this.target === e.target) {
3051
+ this.target = null;
3052
+ this.callbacks.onDragLeave(e);
3053
+ }
3054
+ }
3055
+ onDragEnd(e) {
3056
+ this.target = null;
3057
+ this.callbacks.onDragEnd(e);
3058
+ }
3059
+ onDrop(e) {
3060
+ this.callbacks.onDrop(e);
3061
+ }
2841
3062
  registerListeners() {
2842
3063
  this.addDisposables(addDisposableListener(this.element, 'dragenter', (e) => {
2843
- this.target = e.target;
2844
- this.callbacks.onDragEnter(e);
3064
+ this.onDragEnter(e);
2845
3065
  }, true));
2846
3066
  this.addDisposables(addDisposableListener(this.element, 'dragover', (e) => {
2847
- e.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome)
2848
- if (this.callbacks.onDragOver) {
2849
- this.callbacks.onDragOver(e);
2850
- }
3067
+ this.onDragOver(e);
2851
3068
  }, true));
2852
3069
  this.addDisposables(addDisposableListener(this.element, 'dragleave', (e) => {
2853
- if (this.target === e.target) {
2854
- this.target = null;
2855
- this.callbacks.onDragLeave(e);
2856
- }
3070
+ this.onDragLeave(e);
2857
3071
  }));
2858
3072
  this.addDisposables(addDisposableListener(this.element, 'dragend', (e) => {
2859
- this.target = null;
2860
- this.callbacks.onDragEnd(e);
3073
+ this.onDragEnd(e);
2861
3074
  }));
2862
3075
  this.addDisposables(addDisposableListener(this.element, 'drop', (e) => {
2863
- this.callbacks.onDrop(e);
3076
+ this.onDrop(e);
2864
3077
  }));
2865
3078
  }
2866
3079
  }
2867
3080
 
2868
- function numberOrFallback(maybeNumber, fallback) {
2869
- return typeof maybeNumber === 'number' ? maybeNumber : fallback;
2870
- }
2871
3081
  function directionToPosition(direction) {
2872
3082
  switch (direction) {
2873
3083
  case 'above':
@@ -2900,6 +3110,16 @@ define(['exports'], (function (exports) { 'use strict';
2900
3110
  throw new Error(`invalid position '${position}'`);
2901
3111
  }
2902
3112
  }
3113
+ const DEFAULT_ACTIVATION_SIZE = {
3114
+ value: 20,
3115
+ type: 'percentage',
3116
+ };
3117
+ const DEFAULT_SIZE = {
3118
+ value: 50,
3119
+ type: 'percentage',
3120
+ };
3121
+ const SMALL_WIDTH_BOUNDARY = 100;
3122
+ const SMALL_HEIGHT_BOUNDARY = 100;
2903
3123
  class Droptarget extends CompositeDisposable {
2904
3124
  get state() {
2905
3125
  return this._state;
@@ -2912,7 +3132,7 @@ define(['exports'], (function (exports) { 'use strict';
2912
3132
  this.onDrop = this._onDrop.event;
2913
3133
  // use a set to take advantage of #<set>.has
2914
3134
  this._acceptedTargetZonesSet = new Set(this.options.acceptedTargetZones);
2915
- this.addDisposables(this._onDrop, new DragAndDropObserver(this.element, {
3135
+ this.dnd = new DragAndDropObserver(this.element, {
2916
3136
  onDragEnter: () => undefined,
2917
3137
  onDragOver: (e) => {
2918
3138
  if (this._acceptedTargetZonesSet.size === 0) {
@@ -2960,7 +3180,7 @@ define(['exports'], (function (exports) { 'use strict';
2960
3180
  this.element.append(this.targetElement);
2961
3181
  }
2962
3182
  this.toggleClasses(quadrant, width, height);
2963
- this.setState(quadrant);
3183
+ this._state = quadrant;
2964
3184
  },
2965
3185
  onDragLeave: () => {
2966
3186
  this.removeDropTarget();
@@ -2979,11 +3199,15 @@ define(['exports'], (function (exports) { 'use strict';
2979
3199
  this._onDrop.fire({ position: state, nativeEvent: e });
2980
3200
  }
2981
3201
  },
2982
- }));
3202
+ });
3203
+ this.addDisposables(this._onDrop, this.dnd);
2983
3204
  }
2984
3205
  setTargetZones(acceptedTargetZones) {
2985
3206
  this._acceptedTargetZonesSet = new Set(acceptedTargetZones);
2986
3207
  }
3208
+ setOverlayModel(model) {
3209
+ this.options.overlayModel = model;
3210
+ }
2987
3211
  dispose() {
2988
3212
  this.removeDropTarget();
2989
3213
  super.dispose();
@@ -2995,19 +3219,19 @@ define(['exports'], (function (exports) { 'use strict';
2995
3219
  event[Droptarget.USED_EVENT_ID] = true;
2996
3220
  }
2997
3221
  /**
2998
- * Check is the event has already been used by another instance od DropTarget
3222
+ * Check is the event has already been used by another instance of DropTarget
2999
3223
  */
3000
3224
  isAlreadyUsed(event) {
3001
3225
  const value = event[Droptarget.USED_EVENT_ID];
3002
3226
  return typeof value === 'boolean' && value;
3003
3227
  }
3004
3228
  toggleClasses(quadrant, width, height) {
3005
- var _a, _b, _c, _d;
3229
+ var _a, _b;
3006
3230
  if (!this.overlayElement) {
3007
3231
  return;
3008
3232
  }
3009
- const isSmallX = width < 100;
3010
- const isSmallY = height < 100;
3233
+ const isSmallX = width < SMALL_WIDTH_BOUNDARY;
3234
+ const isSmallY = height < SMALL_HEIGHT_BOUNDARY;
3011
3235
  const isLeft = quadrant === 'left';
3012
3236
  const isRight = quadrant === 'right';
3013
3237
  const isTop = quadrant === 'top';
@@ -3016,20 +3240,17 @@ define(['exports'], (function (exports) { 'use strict';
3016
3240
  const leftClass = !isSmallX && isLeft;
3017
3241
  const topClass = !isSmallY && isTop;
3018
3242
  const bottomClass = !isSmallY && isBottom;
3019
- let size = 0.5;
3020
- if (((_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.size) === null || _b === void 0 ? void 0 : _b.type) === 'percentage') {
3021
- size = clamp(this.options.overlayModel.size.value, 0, 100) / 100;
3243
+ let size = 1;
3244
+ const sizeOptions = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : DEFAULT_SIZE;
3245
+ if (sizeOptions.type === 'percentage') {
3246
+ size = clamp(sizeOptions.value, 0, 100) / 100;
3022
3247
  }
3023
- if (((_d = (_c = this.options.overlayModel) === null || _c === void 0 ? void 0 : _c.size) === null || _d === void 0 ? void 0 : _d.type) === 'pixels') {
3248
+ else {
3024
3249
  if (rightClass || leftClass) {
3025
- size =
3026
- clamp(0, this.options.overlayModel.size.value, width) /
3027
- width;
3250
+ size = clamp(0, sizeOptions.value, width) / width;
3028
3251
  }
3029
3252
  if (topClass || bottomClass) {
3030
- size =
3031
- clamp(0, this.options.overlayModel.size.value, height) /
3032
- height;
3253
+ size = clamp(0, sizeOptions.value, height) / height;
3033
3254
  }
3034
3255
  }
3035
3256
  const translate = (1 - size) / 2;
@@ -3051,39 +3272,22 @@ define(['exports'], (function (exports) { 'use strict';
3051
3272
  transform = '';
3052
3273
  }
3053
3274
  this.overlayElement.style.transform = transform;
3054
- toggleClass(this.overlayElement, 'small-right', isSmallX && isRight);
3055
- toggleClass(this.overlayElement, 'small-left', isSmallX && isLeft);
3056
- toggleClass(this.overlayElement, 'small-top', isSmallY && isTop);
3057
- toggleClass(this.overlayElement, 'small-bottom', isSmallY && isBottom);
3058
- }
3059
- setState(quadrant) {
3060
- switch (quadrant) {
3061
- case 'top':
3062
- this._state = 'top';
3063
- break;
3064
- case 'left':
3065
- this._state = 'left';
3066
- break;
3067
- case 'bottom':
3068
- this._state = 'bottom';
3069
- break;
3070
- case 'right':
3071
- this._state = 'right';
3072
- break;
3073
- case 'center':
3074
- this._state = 'center';
3075
- break;
3076
- }
3275
+ toggleClass(this.overlayElement, 'dv-drop-target-small-vertical', isSmallY);
3276
+ toggleClass(this.overlayElement, 'dv-drop-target-small-horizontal', isSmallX);
3277
+ toggleClass(this.overlayElement, 'dv-drop-target-left', isLeft);
3278
+ toggleClass(this.overlayElement, 'dv-drop-target-right', isRight);
3279
+ toggleClass(this.overlayElement, 'dv-drop-target-top', isTop);
3280
+ toggleClass(this.overlayElement, 'dv-drop-target-bottom', isBottom);
3281
+ toggleClass(this.overlayElement, 'dv-drop-target-center', quadrant === 'center');
3077
3282
  }
3078
3283
  calculateQuadrant(overlayType, x, y, width, height) {
3079
- var _a, _b, _c, _d, _e, _f;
3080
- const isPercentage = ((_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) === undefined ||
3081
- ((_c = (_b = this.options.overlayModel) === null || _b === void 0 ? void 0 : _b.activationSize) === null || _c === void 0 ? void 0 : _c.type) === 'percentage';
3082
- const value = numberOrFallback((_f = (_e = (_d = this.options) === null || _d === void 0 ? void 0 : _d.overlayModel) === null || _e === void 0 ? void 0 : _e.activationSize) === null || _f === void 0 ? void 0 : _f.value, 20);
3284
+ var _a, _b;
3285
+ const activationSizeOptions = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE;
3286
+ const isPercentage = activationSizeOptions.type === 'percentage';
3083
3287
  if (isPercentage) {
3084
- return calculateQuadrantAsPercentage(overlayType, x, y, width, height, value);
3288
+ return calculateQuadrantAsPercentage(overlayType, x, y, width, height, activationSizeOptions.value);
3085
3289
  }
3086
- return calculateQuadrantAsPixels(overlayType, x, y, width, height, value);
3290
+ return calculateQuadrantAsPixels(overlayType, x, y, width, height, activationSizeOptions.value);
3087
3291
  }
3088
3292
  removeDropTarget() {
3089
3293
  if (this.targetElement) {
@@ -3135,12 +3339,22 @@ define(['exports'], (function (exports) { 'use strict';
3135
3339
  return 'center';
3136
3340
  }
3137
3341
 
3342
+ exports.DockviewDropTargets = void 0;
3343
+ (function (DockviewDropTargets) {
3344
+ DockviewDropTargets[DockviewDropTargets["Tab"] = 0] = "Tab";
3345
+ DockviewDropTargets[DockviewDropTargets["Panel"] = 1] = "Panel";
3346
+ DockviewDropTargets[DockviewDropTargets["TabContainer"] = 2] = "TabContainer";
3347
+ DockviewDropTargets[DockviewDropTargets["Edge"] = 3] = "Edge";
3348
+ })(exports.DockviewDropTargets || (exports.DockviewDropTargets = {}));
3349
+
3138
3350
  class ContentContainer extends CompositeDisposable {
3139
3351
  get element() {
3140
3352
  return this._element;
3141
3353
  }
3142
- constructor() {
3354
+ constructor(accessor, group) {
3143
3355
  super();
3356
+ this.accessor = accessor;
3357
+ this.group = group;
3144
3358
  this.disposable = new MutableDisposable();
3145
3359
  this._onDidFocus = new Emitter();
3146
3360
  this.onDidFocus = this._onDidFocus.event;
@@ -3150,11 +3364,38 @@ define(['exports'], (function (exports) { 'use strict';
3150
3364
  this._element.className = 'content-container';
3151
3365
  this._element.tabIndex = -1;
3152
3366
  this.addDisposables(this._onDidFocus, this._onDidBlur);
3153
- // for hosted containers
3154
- // 1) register a drop target on the host
3155
- // 2) register window dragStart events to disable pointer events
3156
- // 3) register dragEnd events
3157
- // 4) register mouseMove events (if no buttons are present we take this as a dragEnd event)
3367
+ this.dropTarget = new Droptarget(this.element, {
3368
+ acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
3369
+ canDisplayOverlay: (event, position) => {
3370
+ if (this.group.locked === 'no-drop-target' ||
3371
+ (this.group.locked && position === 'center')) {
3372
+ return false;
3373
+ }
3374
+ const data = getPanelData();
3375
+ if (!data &&
3376
+ event.shiftKey &&
3377
+ this.group.location !== 'floating') {
3378
+ return false;
3379
+ }
3380
+ if (data && data.viewId === this.accessor.id) {
3381
+ if (data.groupId === this.group.id) {
3382
+ if (position === 'center') {
3383
+ // don't allow to drop on self for center position
3384
+ return false;
3385
+ }
3386
+ if (data.panelId === null) {
3387
+ // don't allow group move to drop anywhere on self
3388
+ return false;
3389
+ }
3390
+ }
3391
+ const groupHasOnePanelAndIsActiveDragElement = this.group.panels.length === 1 &&
3392
+ data.groupId === this.group.id;
3393
+ return !groupHasOnePanelAndIsActiveDragElement;
3394
+ }
3395
+ return this.group.canDisplayOverlay(event, position, exports.DockviewDropTargets.Panel);
3396
+ },
3397
+ });
3398
+ this.addDisposables(this.dropTarget);
3158
3399
  }
3159
3400
  show() {
3160
3401
  this.element.style.display = '';
@@ -3162,23 +3403,43 @@ define(['exports'], (function (exports) { 'use strict';
3162
3403
  hide() {
3163
3404
  this.element.style.display = 'none';
3164
3405
  }
3165
- openPanel(panel) {
3166
- var _a;
3167
- if (this.panel === panel) {
3168
- return;
3169
- }
3170
- if (this.panel) {
3171
- if ((_a = this.panel.view) === null || _a === void 0 ? void 0 : _a.content) {
3172
- this._element.removeChild(this.panel.view.content.element);
3173
- }
3174
- this.panel = undefined;
3406
+ renderPanel(panel, options = { asActive: true }) {
3407
+ const doRender = options.asActive ||
3408
+ (this.panel && this.group.isPanelActive(this.panel));
3409
+ if (this.panel &&
3410
+ this.panel.view.content.element.parentElement === this._element) {
3411
+ /**
3412
+ * If the currently attached panel is mounted directly to the content then remove it
3413
+ */
3414
+ this._element.removeChild(this.panel.view.content.element);
3175
3415
  }
3176
3416
  this.panel = panel;
3177
- const disposable = new CompositeDisposable();
3178
- if (this.panel.view) {
3179
- const _onDidFocus = this.panel.view.content.onDidFocus;
3180
- const _onDidBlur = this.panel.view.content.onDidBlur;
3181
- const focusTracker = trackFocus(this._element);
3417
+ let container;
3418
+ switch (panel.api.renderer) {
3419
+ case 'onlyWhenVisibile':
3420
+ this.accessor.overlayRenderContainer.detatch(panel);
3421
+ if (this.panel) {
3422
+ if (doRender) {
3423
+ this._element.appendChild(this.panel.view.content.element);
3424
+ }
3425
+ }
3426
+ container = this._element;
3427
+ break;
3428
+ case 'always':
3429
+ if (panel.view.content.element.parentElement === this._element) {
3430
+ this._element.removeChild(panel.view.content.element);
3431
+ }
3432
+ container = this.accessor.overlayRenderContainer.attach({
3433
+ panel,
3434
+ referenceContainer: this,
3435
+ });
3436
+ break;
3437
+ }
3438
+ if (doRender) {
3439
+ const _onDidFocus = panel.view.content.onDidFocus;
3440
+ const _onDidBlur = panel.view.content.onDidBlur;
3441
+ const focusTracker = trackFocus(container);
3442
+ const disposable = new CompositeDisposable();
3182
3443
  disposable.addDisposables(focusTracker, focusTracker.onDidFocus(() => this._onDidFocus.fire()), focusTracker.onDidBlur(() => this._onDidBlur.fire()));
3183
3444
  if (_onDidFocus) {
3184
3445
  disposable.addDisposables(_onDidFocus(() => this._onDidFocus.fire()));
@@ -3186,17 +3447,23 @@ define(['exports'], (function (exports) { 'use strict';
3186
3447
  if (_onDidBlur) {
3187
3448
  disposable.addDisposables(_onDidBlur(() => this._onDidBlur.fire()));
3188
3449
  }
3189
- this._element.appendChild(this.panel.view.content.element);
3450
+ this.disposable.value = disposable;
3451
+ }
3452
+ }
3453
+ openPanel(panel) {
3454
+ if (this.panel === panel) {
3455
+ return;
3190
3456
  }
3191
- this.disposable.value = disposable;
3457
+ this.renderPanel(panel);
3192
3458
  }
3193
3459
  layout(_width, _height) {
3194
3460
  // noop
3195
3461
  }
3196
3462
  closePanel() {
3197
- var _a, _b, _c;
3198
- if ((_c = (_b = (_a = this.panel) === null || _a === void 0 ? void 0 : _a.view) === null || _b === void 0 ? void 0 : _b.content) === null || _c === void 0 ? void 0 : _c.element) {
3199
- this._element.removeChild(this.panel.view.content.element);
3463
+ if (this.panel) {
3464
+ if (this.accessor.options.defaultRenderer === 'onlyWhenVisibile') {
3465
+ this._element.removeChild(this.panel.view.content.element);
3466
+ }
3200
3467
  this.panel = undefined;
3201
3468
  }
3202
3469
  }
@@ -3206,14 +3473,6 @@ define(['exports'], (function (exports) { 'use strict';
3206
3473
  }
3207
3474
  }
3208
3475
 
3209
- exports.DockviewDropTargets = void 0;
3210
- (function (DockviewDropTargets) {
3211
- DockviewDropTargets[DockviewDropTargets["Tab"] = 0] = "Tab";
3212
- DockviewDropTargets[DockviewDropTargets["Panel"] = 1] = "Panel";
3213
- DockviewDropTargets[DockviewDropTargets["TabContainer"] = 2] = "TabContainer";
3214
- DockviewDropTargets[DockviewDropTargets["Edge"] = 3] = "Edge";
3215
- })(exports.DockviewDropTargets || (exports.DockviewDropTargets = {}));
3216
-
3217
3476
  class DragHandler extends CompositeDisposable {
3218
3477
  constructor(el) {
3219
3478
  super();
@@ -3388,7 +3647,7 @@ define(['exports'], (function (exports) { 'use strict';
3388
3647
  }, true));
3389
3648
  }
3390
3649
  isCancelled(_event) {
3391
- if (this.group.api.isFloating && !_event.shiftKey) {
3650
+ if (this.group.api.location === 'floating' && !_event.shiftKey) {
3392
3651
  return true;
3393
3652
  }
3394
3653
  return false;
@@ -3590,7 +3849,7 @@ define(['exports'], (function (exports) { 'use strict';
3590
3849
  const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;
3591
3850
  if (isFloatingGroupsEnabled &&
3592
3851
  event.shiftKey &&
3593
- !this.group.api.isFloating) {
3852
+ this.group.api.location !== 'floating') {
3594
3853
  event.preventDefault();
3595
3854
  const { top, left } = this.element.getBoundingClientRect();
3596
3855
  const { top: rootTop, left: rootLeft } = this.accessor.element.getBoundingClientRect();
@@ -3655,7 +3914,7 @@ define(['exports'], (function (exports) { 'use strict';
3655
3914
  }), tab.onChanged((event) => {
3656
3915
  var _a;
3657
3916
  const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;
3658
- const isFloatingWithOnePanel = this.group.api.isFloating && this.size === 1;
3917
+ const isFloatingWithOnePanel = this.group.api.location === 'floating' && this.size === 1;
3659
3918
  if (isFloatingGroupsEnabled &&
3660
3919
  !isFloatingWithOnePanel &&
3661
3920
  event.shiftKey) {
@@ -3738,15 +3997,37 @@ define(['exports'], (function (exports) { 'use strict';
3738
3997
  }
3739
3998
  return isAncestor(document.activeElement, this.contentContainer.element);
3740
3999
  }
3741
- get isFloating() {
3742
- return this._isFloating;
3743
- }
3744
- set isFloating(value) {
3745
- this._isFloating = value;
3746
- this.dropTarget.setTargetZones(value ? ['center'] : ['top', 'bottom', 'left', 'right', 'center']);
3747
- toggleClass(this.container, 'dv-groupview-floating', value);
3748
- this.groupPanel.api._onDidFloatingStateChange.fire({
3749
- isFloating: this.isFloating,
4000
+ get location() {
4001
+ return this._location;
4002
+ }
4003
+ set location(value) {
4004
+ this._location = value;
4005
+ toggleClass(this.container, 'dv-groupview-floating', false);
4006
+ toggleClass(this.container, 'dv-groupview-popout', false);
4007
+ switch (value) {
4008
+ case 'grid':
4009
+ this.contentContainer.dropTarget.setTargetZones([
4010
+ 'top',
4011
+ 'bottom',
4012
+ 'left',
4013
+ 'right',
4014
+ 'center',
4015
+ ]);
4016
+ break;
4017
+ case 'floating':
4018
+ this.contentContainer.dropTarget.setTargetZones(['center']);
4019
+ this.contentContainer.dropTarget.setTargetZones(value
4020
+ ? ['center']
4021
+ : ['top', 'bottom', 'left', 'right', 'center']);
4022
+ toggleClass(this.container, 'dv-groupview-floating', true);
4023
+ break;
4024
+ case 'popout':
4025
+ this.contentContainer.dropTarget.setTargetZones(['center']);
4026
+ toggleClass(this.container, 'dv-groupview-popout', true);
4027
+ break;
4028
+ }
4029
+ this.groupPanel.api._onDidLocationChange.fire({
4030
+ location: this.location,
3750
4031
  });
3751
4032
  }
3752
4033
  constructor(container, accessor, id, options, groupPanel) {
@@ -3759,7 +4040,7 @@ define(['exports'], (function (exports) { 'use strict';
3759
4040
  this.groupPanel = groupPanel;
3760
4041
  this._isGroupActive = false;
3761
4042
  this._locked = false;
3762
- this._isFloating = false;
4043
+ this._location = 'grid';
3763
4044
  this.mostRecentlyUsed = [];
3764
4045
  this._onDidChange = new Emitter();
3765
4046
  this.onDidChange = this._onDidChange.event;
@@ -3782,35 +4063,7 @@ define(['exports'], (function (exports) { 'use strict';
3782
4063
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
3783
4064
  toggleClass(this.container, 'groupview', true);
3784
4065
  this.tabsContainer = new TabsContainer(this.accessor, this.groupPanel);
3785
- this.contentContainer = new ContentContainer();
3786
- this.dropTarget = new Droptarget(this.contentContainer.element, {
3787
- acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
3788
- canDisplayOverlay: (event, position) => {
3789
- if (this.locked === 'no-drop-target' ||
3790
- (this.locked && position === 'center')) {
3791
- return false;
3792
- }
3793
- const data = getPanelData();
3794
- if (!data && event.shiftKey && !this.isFloating) {
3795
- return false;
3796
- }
3797
- if (data && data.viewId === this.accessor.id) {
3798
- if (data.groupId === this.id) {
3799
- if (position === 'center') {
3800
- // don't allow to drop on self for center position
3801
- return false;
3802
- }
3803
- if (data.panelId === null) {
3804
- // don't allow group move to drop anywhere on self
3805
- return false;
3806
- }
3807
- }
3808
- const groupHasOnePanelAndIsActiveDragElement = this._panels.length === 1 && data.groupId === this.id;
3809
- return !groupHasOnePanelAndIsActiveDragElement;
3810
- }
3811
- return this.canDisplayOverlay(event, position, exports.DockviewDropTargets.Panel);
3812
- },
3813
- });
4066
+ this.contentContainer = new ContentContainer(this.accessor, this);
3814
4067
  container.append(this.tabsContainer.element, this.contentContainer.element);
3815
4068
  this.header.hidden = !!options.hideHeader;
3816
4069
  this.locked = (_a = options.locked) !== null && _a !== void 0 ? _a : false;
@@ -3824,7 +4077,7 @@ define(['exports'], (function (exports) { 'use strict';
3824
4077
  this.accessor.doSetGroupActive(this.groupPanel, true);
3825
4078
  }), this.contentContainer.onDidBlur(() => {
3826
4079
  // noop
3827
- }), this.dropTarget.onDrop((event) => {
4080
+ }), this.contentContainer.dropTarget.onDrop((event) => {
3828
4081
  this.handleDropEvent(event.nativeEvent, event.position);
3829
4082
  }), this._onMove, this._onDidChange, this._onDidDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange);
3830
4083
  }
@@ -3873,6 +4126,9 @@ define(['exports'], (function (exports) { 'use strict';
3873
4126
  this.tabsContainer.setPrefixActionsElement(this._prefixHeaderActions.element);
3874
4127
  }
3875
4128
  }
4129
+ rerender(panel) {
4130
+ this.contentContainer.renderPanel(panel, { asActive: false });
4131
+ }
3876
4132
  indexOf(panel) {
3877
4133
  return this.tabsContainer.indexOf(panel.id);
3878
4134
  }
@@ -4064,12 +4320,12 @@ define(['exports'], (function (exports) { 'use strict';
4064
4320
  doAddPanel(panel, index = this.panels.length, skipSetActive = false) {
4065
4321
  const existingPanel = this._panels.indexOf(panel);
4066
4322
  const hasExistingPanel = existingPanel > -1;
4323
+ this.tabsContainer.show();
4324
+ this.contentContainer.show();
4067
4325
  this.tabsContainer.openPanel(panel, index);
4068
4326
  if (!skipSetActive) {
4069
4327
  this.contentContainer.openPanel(panel);
4070
4328
  }
4071
- this.tabsContainer.show();
4072
- this.contentContainer.show();
4073
4329
  if (hasExistingPanel) {
4074
4330
  // TODO - need to ensure ordering hasn't changed and if it has need to re-order this.panels
4075
4331
  return;
@@ -4185,7 +4441,6 @@ define(['exports'], (function (exports) { 'use strict';
4185
4441
  for (const panel of this.panels) {
4186
4442
  panel.dispose();
4187
4443
  }
4188
- this.dropTarget.dispose();
4189
4444
  this.tabsContainer.dispose();
4190
4445
  this.contentContainer.dispose();
4191
4446
  }
@@ -4224,7 +4479,22 @@ define(['exports'], (function (exports) { 'use strict';
4224
4479
  if (this.disableResizing) {
4225
4480
  return;
4226
4481
  }
4227
- if (!document.body.contains(this._element)) {
4482
+ if (!this._element.offsetParent) {
4483
+ /**
4484
+ * offsetParent === null is equivalent to display: none being set on the element or one
4485
+ * of it's parents. In the display: none case the size will become (0, 0) which we do
4486
+ * not want to propagate.
4487
+ *
4488
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent
4489
+ *
4490
+ * You could use checkVisibility() but at the time of writing it's not supported across
4491
+ * all Browsers
4492
+ *
4493
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/checkVisibility
4494
+ */
4495
+ return;
4496
+ }
4497
+ if (!isInDocument(this._element)) {
4228
4498
  /**
4229
4499
  * since the event is dispatched through requestAnimationFrame there is a small chance
4230
4500
  * the component is no longer attached to the DOM, if that is the case the dimensions
@@ -4316,6 +4586,21 @@ define(['exports'], (function (exports) { 'use strict';
4316
4586
  isVisible(panel) {
4317
4587
  return this.gridview.isViewVisible(getGridLocation(panel.element));
4318
4588
  }
4589
+ maximizeGroup(panel) {
4590
+ this.gridview.maximizeView(panel);
4591
+ }
4592
+ isMaximizedGroup(panel) {
4593
+ return this.gridview.maximizedView() === panel;
4594
+ }
4595
+ exitMaximizedGroup() {
4596
+ this.gridview.exitMaximizedView();
4597
+ }
4598
+ hasMaximizedGroup() {
4599
+ return this.gridview.hasMaximizedView();
4600
+ }
4601
+ get onDidMaxmizedGroupChange() {
4602
+ return this.gridview.onDidMaxmizedNodeChange;
4603
+ }
4319
4604
  doAddGroup(group, location = [0], size) {
4320
4605
  this.gridview.addView(group, size !== null && size !== void 0 ? size : exports.Sizing.Distribute, location);
4321
4606
  this._onDidAddGroup.fire(group);
@@ -5092,32 +5377,63 @@ define(['exports'], (function (exports) { 'use strict';
5092
5377
  }
5093
5378
  }
5094
5379
 
5380
+ // TODO find a better way to initialize and avoid needing null checks
5381
+ const NOT_INITIALIZED_MESSAGE = 'DockviewGroupPanelApiImpl not initialized';
5095
5382
  class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
5096
- get isFloating() {
5383
+ get location() {
5097
5384
  if (!this._group) {
5098
- throw new Error(`DockviewGroupPanelApiImpl not initialized`);
5385
+ throw new Error(NOT_INITIALIZED_MESSAGE);
5099
5386
  }
5100
- return this._group.model.isFloating;
5387
+ return this._group.model.location;
5101
5388
  }
5102
5389
  constructor(id, accessor) {
5103
5390
  super(id);
5104
5391
  this.accessor = accessor;
5105
- this._onDidFloatingStateChange = new Emitter();
5106
- this.onDidFloatingStateChange = this._onDidFloatingStateChange.event;
5107
- this.addDisposables(this._onDidFloatingStateChange);
5392
+ this._onDidLocationChange = new Emitter();
5393
+ this.onDidLocationChange = this._onDidLocationChange.event;
5394
+ this.addDisposables(this._onDidLocationChange);
5108
5395
  }
5109
5396
  moveTo(options) {
5110
- var _a;
5397
+ var _a, _b, _c;
5398
+ if (!this._group) {
5399
+ throw new Error(NOT_INITIALIZED_MESSAGE);
5400
+ }
5401
+ const group = (_a = options.group) !== null && _a !== void 0 ? _a : this.accessor.addGroup({
5402
+ direction: positionToDirection((_b = options.position) !== null && _b !== void 0 ? _b : 'right'),
5403
+ });
5404
+ this.accessor.moveGroupOrPanel(group, this._group.id, undefined, options.group ? (_c = options.position) !== null && _c !== void 0 ? _c : 'center' : 'center');
5405
+ }
5406
+ maximize() {
5407
+ if (!this._group) {
5408
+ throw new Error(NOT_INITIALIZED_MESSAGE);
5409
+ }
5410
+ if (this.location !== 'grid') {
5411
+ // only grid groups can be maximized
5412
+ return;
5413
+ }
5414
+ this.accessor.maximizeGroup(this._group);
5415
+ }
5416
+ isMaximized() {
5111
5417
  if (!this._group) {
5112
- throw new Error(`DockviewGroupPanelApiImpl not initialized`);
5418
+ throw new Error(NOT_INITIALIZED_MESSAGE);
5419
+ }
5420
+ return this.accessor.isMaximizedGroup(this._group);
5421
+ }
5422
+ exitMaximized() {
5423
+ if (!this._group) {
5424
+ throw new Error(NOT_INITIALIZED_MESSAGE);
5425
+ }
5426
+ if (this.isMaximized()) {
5427
+ this.accessor.exitMaximizedGroup();
5113
5428
  }
5114
- this.accessor.moveGroupOrPanel(options.group, this._group.id, undefined, (_a = options.position) !== null && _a !== void 0 ? _a : 'center');
5115
5429
  }
5116
5430
  initialize(group) {
5117
5431
  this._group = group;
5118
5432
  }
5119
5433
  }
5120
5434
 
5435
+ const MINIMUM_DOCKVIEW_GROUP_PANEL_WIDTH = 100;
5436
+ const MINIMUM_DOCKVIEW_GROUP_PANEL_HEIGHT = 100;
5121
5437
  class DockviewGroupPanel extends GridviewPanel {
5122
5438
  get panels() {
5123
5439
  return this._model.panels;
@@ -5142,8 +5458,8 @@ define(['exports'], (function (exports) { 'use strict';
5142
5458
  }
5143
5459
  constructor(accessor, id, options) {
5144
5460
  super(id, 'groupview_default', {
5145
- minimumHeight: 100,
5146
- minimumWidth: 100,
5461
+ minimumHeight: MINIMUM_DOCKVIEW_GROUP_PANEL_HEIGHT,
5462
+ minimumWidth: MINIMUM_DOCKVIEW_GROUP_PANEL_WIDTH,
5147
5463
  }, new DockviewGroupPanelApiImpl(id, accessor));
5148
5464
  this.api.initialize(this); // cannot use 'this' after after 'super' call
5149
5465
  this._model = new DockviewGroupPanelModel(this.element, accessor, id, options, this);
@@ -5197,8 +5513,10 @@ define(['exports'], (function (exports) { 'use strict';
5197
5513
  return this.panel.title;
5198
5514
  }
5199
5515
  get isGroupActive() {
5200
- var _a;
5201
- return !!((_a = this.group) === null || _a === void 0 ? void 0 : _a.isActive);
5516
+ return this.group.isActive;
5517
+ }
5518
+ get renderer() {
5519
+ return this.panel.renderer;
5202
5520
  }
5203
5521
  set group(value) {
5204
5522
  const isOldGroupActive = this.isGroupActive;
@@ -5226,10 +5544,12 @@ define(['exports'], (function (exports) { 'use strict';
5226
5544
  this.onDidActiveGroupChange = this._onDidActiveGroupChange.event;
5227
5545
  this._onDidGroupChange = new Emitter();
5228
5546
  this.onDidGroupChange = this._onDidGroupChange.event;
5547
+ this._onDidRendererChange = new Emitter();
5548
+ this.onDidRendererChange = this._onDidRendererChange.event;
5229
5549
  this.disposable = new MutableDisposable();
5230
5550
  this.initialize(panel);
5231
5551
  this._group = group;
5232
- this.addDisposables(this.disposable, this._onDidTitleChange, this._onDidGroupChange, this._onDidActiveGroupChange);
5552
+ this.addDisposables(this.disposable, this._onDidRendererChange, this._onDidTitleChange, this._onDidGroupChange, this._onDidActiveGroupChange);
5233
5553
  }
5234
5554
  moveTo(options) {
5235
5555
  var _a;
@@ -5238,9 +5558,21 @@ define(['exports'], (function (exports) { 'use strict';
5238
5558
  setTitle(title) {
5239
5559
  this.panel.setTitle(title);
5240
5560
  }
5561
+ setRenderer(renderer) {
5562
+ this.panel.setRenderer(renderer);
5563
+ }
5241
5564
  close() {
5242
5565
  this.group.model.closePanel(this.panel);
5243
5566
  }
5567
+ maximize() {
5568
+ this.group.api.maximize();
5569
+ }
5570
+ isMaximized() {
5571
+ return this.group.api.isMaximized();
5572
+ }
5573
+ exitMaximized() {
5574
+ this.group.api.exitMaximized();
5575
+ }
5244
5576
  }
5245
5577
 
5246
5578
  class DockviewPanel extends CompositeDisposable {
@@ -5253,11 +5585,17 @@ define(['exports'], (function (exports) { 'use strict';
5253
5585
  get group() {
5254
5586
  return this._group;
5255
5587
  }
5256
- constructor(id, accessor, containerApi, group, view) {
5588
+ get renderer() {
5589
+ var _a;
5590
+ return (_a = this._renderer) !== null && _a !== void 0 ? _a : this.accessor.renderer;
5591
+ }
5592
+ constructor(id, accessor, containerApi, group, view, options) {
5257
5593
  super();
5258
5594
  this.id = id;
5595
+ this.accessor = accessor;
5259
5596
  this.containerApi = containerApi;
5260
5597
  this.view = view;
5598
+ this._renderer = options.renderer;
5261
5599
  this._group = group;
5262
5600
  this.api = new DockviewPanelApiImpl(this, this._group, accessor);
5263
5601
  this.addDisposables(this.api.onActiveChange(() => {
@@ -5266,6 +5604,8 @@ define(['exports'], (function (exports) { 'use strict';
5266
5604
  // forward the resize event to the group since if you want to resize a panel
5267
5605
  // you are actually just resizing the panels parent which is the group
5268
5606
  this.group.api.setSize(event);
5607
+ }), this.api.onDidRendererChange((event) => {
5608
+ this.group.model.rerender(this);
5269
5609
  }));
5270
5610
  }
5271
5611
  init(params) {
@@ -5285,6 +5625,7 @@ define(['exports'], (function (exports) { 'use strict';
5285
5625
  ? this._params
5286
5626
  : undefined,
5287
5627
  title: this.title,
5628
+ renderer: this._renderer,
5288
5629
  };
5289
5630
  }
5290
5631
  setTitle(title) {
@@ -5300,6 +5641,15 @@ define(['exports'], (function (exports) { 'use strict';
5300
5641
  this.api._onDidTitleChange.fire({ title });
5301
5642
  }
5302
5643
  }
5644
+ setRenderer(renderer) {
5645
+ const didChange = renderer !== this.renderer;
5646
+ if (didChange) {
5647
+ this._renderer = renderer;
5648
+ this.api._onDidRendererChange.fire({
5649
+ renderer: renderer,
5650
+ });
5651
+ }
5652
+ }
5303
5653
  update(event) {
5304
5654
  var _a;
5305
5655
  // merge the new parameters with the existing parameters
@@ -5518,8 +5868,8 @@ define(['exports'], (function (exports) { 'use strict';
5518
5868
  }
5519
5869
 
5520
5870
  class DefaultDockviewDeserialzier {
5521
- constructor(layout) {
5522
- this.layout = layout;
5871
+ constructor(accessor) {
5872
+ this.accessor = accessor;
5523
5873
  }
5524
5874
  fromJSON(panelData, group) {
5525
5875
  var _a, _b;
@@ -5533,8 +5883,10 @@ define(['exports'], (function (exports) { 'use strict';
5533
5883
  const tabComponent = viewData
5534
5884
  ? (_b = viewData.tab) === null || _b === void 0 ? void 0 : _b.id
5535
5885
  : panelData.tabComponent;
5536
- const view = new DockviewPanelModel(this.layout, panelId, contentComponent, tabComponent);
5537
- const panel = new DockviewPanel(panelId, this.layout, new DockviewApi(this.layout), group, view);
5886
+ const view = new DockviewPanelModel(this.accessor, panelId, contentComponent, tabComponent);
5887
+ const panel = new DockviewPanel(panelId, this.accessor, new DockviewApi(this.accessor), group, view, {
5888
+ renderer: panelData.renderer,
5889
+ });
5538
5890
  panel.init({
5539
5891
  title: title !== null && title !== void 0 ? title : panelId,
5540
5892
  params: params !== null && params !== void 0 ? params : {},
@@ -5914,7 +6266,265 @@ define(['exports'], (function (exports) { 'use strict';
5914
6266
  }
5915
6267
  }
5916
6268
 
6269
+ class PopoutWindow extends CompositeDisposable {
6270
+ constructor(id, className, options) {
6271
+ super();
6272
+ this.id = id;
6273
+ this.className = className;
6274
+ this.options = options;
6275
+ this._onDidClose = new Emitter();
6276
+ this.onDidClose = this._onDidClose.event;
6277
+ this._window = null;
6278
+ this.addDisposables(this._onDidClose, {
6279
+ dispose: () => {
6280
+ this.close();
6281
+ },
6282
+ });
6283
+ }
6284
+ dimensions() {
6285
+ if (!this._window) {
6286
+ return null;
6287
+ }
6288
+ const left = this._window.value.screenX;
6289
+ const top = this._window.value.screenY;
6290
+ const width = this._window.value.innerWidth;
6291
+ const height = this._window.value.innerHeight;
6292
+ return { top, left, width, height };
6293
+ }
6294
+ close() {
6295
+ if (this._window) {
6296
+ this._window.disposable.dispose();
6297
+ this._window.value.close();
6298
+ this._window = null;
6299
+ }
6300
+ }
6301
+ open(content) {
6302
+ if (this._window) {
6303
+ throw new Error('instance of popout window is already open');
6304
+ }
6305
+ const url = `${this.options.url}`;
6306
+ const features = Object.entries({
6307
+ top: this.options.top,
6308
+ left: this.options.left,
6309
+ width: this.options.width,
6310
+ height: this.options.height,
6311
+ })
6312
+ .map(([key, value]) => `${key}=${value}`)
6313
+ .join(',');
6314
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/open
6315
+ const externalWindow = window.open(url, this.id, features);
6316
+ if (!externalWindow) {
6317
+ return;
6318
+ }
6319
+ const disposable = new CompositeDisposable();
6320
+ this._window = { value: externalWindow, disposable };
6321
+ const cleanUp = () => {
6322
+ this._onDidClose.fire();
6323
+ this._window = null;
6324
+ };
6325
+ // prevent any default content from loading
6326
+ // externalWindow.document.body.replaceWith(document.createElement('div'));
6327
+ disposable.addDisposables(addDisposableWindowListener(window, 'beforeunload', () => {
6328
+ cleanUp();
6329
+ this.close();
6330
+ }));
6331
+ externalWindow.addEventListener('load', () => {
6332
+ const externalDocument = externalWindow.document;
6333
+ externalDocument.title = document.title;
6334
+ const div = document.createElement('div');
6335
+ div.classList.add('dv-popout-window');
6336
+ div.style.position = 'absolute';
6337
+ div.style.width = '100%';
6338
+ div.style.height = '100%';
6339
+ div.style.top = '0px';
6340
+ div.style.left = '0px';
6341
+ div.classList.add(this.className);
6342
+ div.appendChild(content);
6343
+ externalDocument.body.replaceChildren(div);
6344
+ externalDocument.body.classList.add(this.className);
6345
+ addStyles(externalDocument, window.document.styleSheets);
6346
+ externalWindow.addEventListener('beforeunload', () => {
6347
+ // TODO: indicate external window is closing
6348
+ cleanUp();
6349
+ });
6350
+ });
6351
+ }
6352
+ }
6353
+
6354
+ class DockviewPopoutGroupPanel extends CompositeDisposable {
6355
+ constructor(id, group, options) {
6356
+ var _a;
6357
+ super();
6358
+ this.id = id;
6359
+ this.group = group;
6360
+ this.options = options;
6361
+ this.window = new PopoutWindow(id, (_a = options.className) !== null && _a !== void 0 ? _a : '', {
6362
+ url: this.options.popoutUrl,
6363
+ left: this.options.box.left,
6364
+ top: this.options.box.top,
6365
+ width: this.options.box.width,
6366
+ height: this.options.box.height,
6367
+ });
6368
+ group.model.location = 'popout';
6369
+ this.addDisposables(this.window, {
6370
+ dispose: () => {
6371
+ group.model.location = 'grid';
6372
+ },
6373
+ }, this.window.onDidClose(() => {
6374
+ this.dispose();
6375
+ }));
6376
+ this.window.open(group.element);
6377
+ }
6378
+ }
6379
+
5917
6380
  const DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE = 100;
6381
+ const DEFAULT_FLOATING_GROUP_POSITION = { left: 100, top: 100 };
6382
+
6383
+ function createFocusableElement() {
6384
+ const element = document.createElement('div');
6385
+ element.tabIndex = -1;
6386
+ return element;
6387
+ }
6388
+ class OverlayRenderContainer extends CompositeDisposable {
6389
+ constructor(element) {
6390
+ super();
6391
+ this.element = element;
6392
+ this.map = {};
6393
+ this.addDisposables(Disposable.from(() => {
6394
+ for (const value of Object.values(this.map)) {
6395
+ value.disposable.dispose();
6396
+ value.destroy.dispose();
6397
+ }
6398
+ }));
6399
+ }
6400
+ detatch(panel) {
6401
+ if (this.map[panel.api.id]) {
6402
+ const { disposable, destroy } = this.map[panel.api.id];
6403
+ disposable.dispose();
6404
+ destroy.dispose();
6405
+ delete this.map[panel.api.id];
6406
+ return true;
6407
+ }
6408
+ return false;
6409
+ }
6410
+ attach(options) {
6411
+ const { panel, referenceContainer } = options;
6412
+ if (!this.map[panel.api.id]) {
6413
+ const element = createFocusableElement();
6414
+ element.className = 'dv-render-overlay';
6415
+ this.map[panel.api.id] = {
6416
+ panel,
6417
+ disposable: Disposable.NONE,
6418
+ destroy: Disposable.NONE,
6419
+ element,
6420
+ };
6421
+ }
6422
+ const focusContainer = this.map[panel.api.id].element;
6423
+ if (panel.view.content.element.parentElement !== focusContainer) {
6424
+ focusContainer.appendChild(panel.view.content.element);
6425
+ }
6426
+ if (focusContainer.parentElement !== this.element) {
6427
+ this.element.appendChild(focusContainer);
6428
+ }
6429
+ const resize = () => {
6430
+ // TODO propagate position to avoid getDomNodePagePosition calls, possible performance bottleneck?
6431
+ const box = getDomNodePagePosition(referenceContainer.element);
6432
+ const box2 = getDomNodePagePosition(this.element);
6433
+ focusContainer.style.left = `${box.left - box2.left}px`;
6434
+ focusContainer.style.top = `${box.top - box2.top}px`;
6435
+ focusContainer.style.width = `${box.width}px`;
6436
+ focusContainer.style.height = `${box.height}px`;
6437
+ toggleClass(focusContainer, 'dv-render-overlay-float', panel.group.api.location === 'floating');
6438
+ };
6439
+ const visibilityChanged = () => {
6440
+ if (panel.api.isVisible) {
6441
+ resize();
6442
+ }
6443
+ focusContainer.style.display = panel.api.isVisible ? '' : 'none';
6444
+ };
6445
+ const disposable = new CompositeDisposable(
6446
+ /**
6447
+ * since container is positioned absoutely we must explicitly forward
6448
+ * the dnd events for the expect behaviours to continue to occur in terms of dnd
6449
+ *
6450
+ * the dnd observer does not need to be conditional on whether the panel is visible since
6451
+ * non-visible panels are 'display: none' and in such case the dnd observer will not fire.
6452
+ */
6453
+ new DragAndDropObserver(focusContainer, {
6454
+ onDragEnd: (e) => {
6455
+ referenceContainer.dropTarget.dnd.onDragEnd(e);
6456
+ },
6457
+ onDragEnter: (e) => {
6458
+ referenceContainer.dropTarget.dnd.onDragEnter(e);
6459
+ },
6460
+ onDragLeave: (e) => {
6461
+ referenceContainer.dropTarget.dnd.onDragLeave(e);
6462
+ },
6463
+ onDrop: (e) => {
6464
+ referenceContainer.dropTarget.dnd.onDrop(e);
6465
+ },
6466
+ onDragOver: (e) => {
6467
+ referenceContainer.dropTarget.dnd.onDragOver(e);
6468
+ },
6469
+ }), panel.api.onDidVisibilityChange((event) => {
6470
+ /**
6471
+ * Control the visibility of the content, however even when not visible (display: none)
6472
+ * the content is still maintained within the DOM hence DOM specific attributes
6473
+ * such as scroll position are maintained when next made visible.
6474
+ */
6475
+ visibilityChanged();
6476
+ }), panel.api.onDidDimensionsChange(() => {
6477
+ if (!panel.api.isVisible) {
6478
+ return;
6479
+ }
6480
+ resize();
6481
+ }));
6482
+ this.map[panel.api.id].destroy = Disposable.from(() => {
6483
+ focusContainer.removeChild(panel.view.content.element);
6484
+ this.element.removeChild(focusContainer);
6485
+ });
6486
+ queueMicrotask(() => {
6487
+ if (this.isDisposed) {
6488
+ return;
6489
+ }
6490
+ /**
6491
+ * wait until everything has finished in the current stack-frame call before
6492
+ * calling the first resize as other size-altering events may still occur before
6493
+ * the end of the stack-frame.
6494
+ */
6495
+ visibilityChanged();
6496
+ });
6497
+ // dispose of logic asoccciated with previous reference-container
6498
+ this.map[panel.api.id].disposable.dispose();
6499
+ // and reset the disposable to the active reference-container
6500
+ this.map[panel.api.id].disposable = disposable;
6501
+ return focusContainer;
6502
+ }
6503
+ }
6504
+
6505
+ const DEFAULT_ROOT_OVERLAY_MODEL = {
6506
+ activationSize: { type: 'pixels', value: 10 },
6507
+ size: { type: 'pixels', value: 20 },
6508
+ };
6509
+ function getTheme(element) {
6510
+ function toClassList(element) {
6511
+ const list = [];
6512
+ for (let i = 0; i < element.classList.length; i++) {
6513
+ list.push(element.classList.item(i));
6514
+ }
6515
+ return list;
6516
+ }
6517
+ let theme = undefined;
6518
+ let parent = element;
6519
+ while (parent !== null) {
6520
+ theme = toClassList(parent).find((cls) => cls.startsWith('dockview-theme-'));
6521
+ if (typeof theme === 'string') {
6522
+ break;
6523
+ }
6524
+ parent = parent.parentElement;
6525
+ }
6526
+ return theme;
6527
+ }
5918
6528
  class DockviewComponent extends BaseGrid {
5919
6529
  get orientation() {
5920
6530
  return this.gridview.orientation;
@@ -5935,8 +6545,12 @@ define(['exports'], (function (exports) { 'use strict';
5935
6545
  }
5936
6546
  return activeGroup.activePanel;
5937
6547
  }
5938
- constructor(options) {
6548
+ get renderer() {
5939
6549
  var _a;
6550
+ return (_a = this.options.defaultRenderer) !== null && _a !== void 0 ? _a : 'onlyWhenVisibile';
6551
+ }
6552
+ constructor(options) {
6553
+ var _a, _b;
5940
6554
  super({
5941
6555
  proportionalLayout: true,
5942
6556
  orientation: (_a = options.orientation) !== null && _a !== void 0 ? _a : exports.Orientation.HORIZONTAL,
@@ -5961,12 +6575,27 @@ define(['exports'], (function (exports) { 'use strict';
5961
6575
  this.onDidLayoutFromJSON = this._onDidLayoutFromJSON.event;
5962
6576
  this._onDidActivePanelChange = new Emitter();
5963
6577
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
5964
- this.floatingGroups = [];
6578
+ this._floatingGroups = [];
6579
+ this._popoutGroups = [];
6580
+ const gready = document.createElement('div');
6581
+ gready.className = 'dv-overlay-render-container';
6582
+ this.gridview.element.appendChild(gready);
6583
+ this.overlayRenderContainer = new OverlayRenderContainer(gready);
5965
6584
  toggleClass(this.gridview.element, 'dv-dockview', true);
5966
- this.addDisposables(this._onWillDragPanel, this._onWillDragGroup, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, exports.DockviewEvent.any(this.onDidAddGroup, this.onDidRemoveGroup)(() => {
6585
+ toggleClass(this.element, 'dv-debug', !!options.debug);
6586
+ this.addDisposables(this.overlayRenderContainer, this._onWillDragPanel, this._onWillDragGroup, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, exports.DockviewEvent.any(this.onDidAddGroup, this.onDidRemoveGroup)(() => {
5967
6587
  this.updateWatermark();
5968
6588
  }), exports.DockviewEvent.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidActivePanelChange)(() => {
5969
6589
  this._bufferOnDidLayoutChange.fire();
6590
+ }), Disposable.from(() => {
6591
+ // iterate over a copy of the array since .dispose() mutates the original array
6592
+ for (const group of [...this._floatingGroups]) {
6593
+ group.dispose();
6594
+ }
6595
+ // iterate over a copy of the array since .dispose() mutates the original array
6596
+ for (const group of [...this._popoutGroups]) {
6597
+ group.dispose();
6598
+ }
5970
6599
  }));
5971
6600
  this._options = options;
5972
6601
  if (!this.options.components) {
@@ -5985,7 +6614,7 @@ define(['exports'], (function (exports) { 'use strict';
5985
6614
  !this.options.watermarkFrameworkComponent) {
5986
6615
  this.options.watermarkComponent = Watermark;
5987
6616
  }
5988
- const dropTarget = new Droptarget(this.element, {
6617
+ this._rootDropTarget = new Droptarget(this.element, {
5989
6618
  canDisplayOverlay: (event, position) => {
5990
6619
  const data = getPanelData();
5991
6620
  if (data) {
@@ -6018,12 +6647,9 @@ define(['exports'], (function (exports) { 'use strict';
6018
6647
  return false;
6019
6648
  },
6020
6649
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
6021
- overlayModel: {
6022
- activationSize: { type: 'pixels', value: 10 },
6023
- size: { type: 'pixels', value: 20 },
6024
- },
6650
+ overlayModel: (_b = this.options.rootOverlayModel) !== null && _b !== void 0 ? _b : DEFAULT_ROOT_OVERLAY_MODEL,
6025
6651
  });
6026
- this.addDisposables(dropTarget.onDrop((event) => {
6652
+ this.addDisposables(this._rootDropTarget.onDrop((event) => {
6027
6653
  var _a;
6028
6654
  const data = getPanelData();
6029
6655
  if (data) {
@@ -6032,10 +6658,59 @@ define(['exports'], (function (exports) { 'use strict';
6032
6658
  else {
6033
6659
  this._onDidDrop.fire(Object.assign(Object.assign({}, event), { api: this._api, group: null, getData: getPanelData }));
6034
6660
  }
6035
- }), dropTarget);
6661
+ }), this._rootDropTarget);
6036
6662
  this._api = new DockviewApi(this);
6037
6663
  this.updateWatermark();
6038
6664
  }
6665
+ addPopoutGroup(item, options) {
6666
+ var _a;
6667
+ let group;
6668
+ let box = options === null || options === void 0 ? void 0 : options.position;
6669
+ if (item instanceof DockviewPanel) {
6670
+ group = this.createGroup();
6671
+ this.removePanel(item, {
6672
+ removeEmptyGroup: true,
6673
+ skipDispose: true,
6674
+ });
6675
+ group.model.openPanel(item);
6676
+ if (!box) {
6677
+ box = this.element.getBoundingClientRect();
6678
+ }
6679
+ }
6680
+ else {
6681
+ group = item;
6682
+ if (!box) {
6683
+ box = group.element.getBoundingClientRect();
6684
+ }
6685
+ const skip = typeof (options === null || options === void 0 ? void 0 : options.skipRemoveGroup) === 'boolean' &&
6686
+ options.skipRemoveGroup;
6687
+ if (!skip) {
6688
+ this.doRemoveGroup(item, { skipDispose: true });
6689
+ }
6690
+ }
6691
+ const theme = getTheme(this.gridview.element);
6692
+ const popoutWindow = new DockviewPopoutGroupPanel(`${this.id}-${group.id}`, // globally unique within dockview
6693
+ group, {
6694
+ className: theme !== null && theme !== void 0 ? theme : '',
6695
+ popoutUrl: (_a = options === null || options === void 0 ? void 0 : options.popoutUrl) !== null && _a !== void 0 ? _a : '/popout.html',
6696
+ box: {
6697
+ left: window.screenX + box.left,
6698
+ top: window.screenY + box.top,
6699
+ width: box.width,
6700
+ height: box.height,
6701
+ },
6702
+ });
6703
+ popoutWindow.addDisposables({
6704
+ dispose: () => {
6705
+ remove(this._popoutGroups, popoutWindow);
6706
+ this.updateWatermark();
6707
+ },
6708
+ }, popoutWindow.window.onDidClose(() => {
6709
+ this.doAddGroup(group, [0]);
6710
+ }));
6711
+ this._popoutGroups.push(popoutWindow);
6712
+ this.updateWatermark();
6713
+ }
6039
6714
  addFloatingGroup(item, coord, options) {
6040
6715
  var _a, _b, _c, _d, _e, _f;
6041
6716
  let group;
@@ -6055,9 +6730,13 @@ define(['exports'], (function (exports) { 'use strict';
6055
6730
  this.doRemoveGroup(item, { skipDispose: true });
6056
6731
  }
6057
6732
  }
6058
- group.model.isFloating = true;
6059
- const overlayLeft = typeof (coord === null || coord === void 0 ? void 0 : coord.x) === 'number' ? Math.max(coord.x, 0) : 100;
6060
- const overlayTop = typeof (coord === null || coord === void 0 ? void 0 : coord.y) === 'number' ? Math.max(coord.y, 0) : 100;
6733
+ group.model.location = 'floating';
6734
+ const overlayLeft = typeof (coord === null || coord === void 0 ? void 0 : coord.x) === 'number'
6735
+ ? Math.max(coord.x, 0)
6736
+ : DEFAULT_FLOATING_GROUP_POSITION.left;
6737
+ const overlayTop = typeof (coord === null || coord === void 0 ? void 0 : coord.y) === 'number'
6738
+ ? Math.max(coord.y, 0)
6739
+ : DEFAULT_FLOATING_GROUP_POSITION.top;
6061
6740
  const overlay = new Overlay({
6062
6741
  container: this.gridview.element,
6063
6742
  content: group.element,
@@ -6101,12 +6780,12 @@ define(['exports'], (function (exports) { 'use strict';
6101
6780
  }), {
6102
6781
  dispose: () => {
6103
6782
  disposable.dispose();
6104
- group.model.isFloating = false;
6105
- remove(this.floatingGroups, floatingGroupPanel);
6783
+ group.model.location = 'grid';
6784
+ remove(this._floatingGroups, floatingGroupPanel);
6106
6785
  this.updateWatermark();
6107
6786
  },
6108
6787
  });
6109
- this.floatingGroups.push(floatingGroupPanel);
6788
+ this._floatingGroups.push(floatingGroupPanel);
6110
6789
  this.updateWatermark();
6111
6790
  }
6112
6791
  orthogonalize(position) {
@@ -6142,16 +6821,18 @@ define(['exports'], (function (exports) { 'use strict';
6142
6821
  }
6143
6822
  updateOptions(options) {
6144
6823
  var _a, _b;
6145
- const hasOrientationChanged = typeof options.orientation === 'string' &&
6824
+ const changed_orientation = typeof options.orientation === 'string' &&
6146
6825
  this.gridview.orientation !== options.orientation;
6147
- const hasFloatingGroupOptionsChanged = options.floatingGroupBounds !== undefined &&
6826
+ const changed_floatingGroupBounds = options.floatingGroupBounds !== undefined &&
6148
6827
  options.floatingGroupBounds !== this.options.floatingGroupBounds;
6828
+ const changed_rootOverlayOptions = options.rootOverlayModel !== undefined &&
6829
+ options.rootOverlayModel !== this.options.rootOverlayModel;
6149
6830
  this._options = Object.assign(Object.assign({}, this.options), options);
6150
- if (hasOrientationChanged) {
6831
+ if (changed_orientation) {
6151
6832
  this.gridview.orientation = options.orientation;
6152
6833
  }
6153
- if (hasFloatingGroupOptionsChanged) {
6154
- for (const group of this.floatingGroups) {
6834
+ if (changed_floatingGroupBounds) {
6835
+ for (const group of this._floatingGroups) {
6155
6836
  switch (this.options.floatingGroupBounds) {
6156
6837
  case 'boundedWithinViewport':
6157
6838
  group.overlay.minimumInViewportHeight = undefined;
@@ -6172,12 +6853,15 @@ define(['exports'], (function (exports) { 'use strict';
6172
6853
  group.overlay.setBounds({});
6173
6854
  }
6174
6855
  }
6856
+ if (changed_rootOverlayOptions) {
6857
+ this._rootDropTarget.setOverlayModel(options.rootOverlayModel);
6858
+ }
6175
6859
  this.layout(this.gridview.width, this.gridview.height, true);
6176
6860
  }
6177
6861
  layout(width, height, forceResize) {
6178
6862
  super.layout(width, height, forceResize);
6179
- if (this.floatingGroups) {
6180
- for (const floating of this.floatingGroups) {
6863
+ if (this._floatingGroups) {
6864
+ for (const floating of this._floatingGroups) {
6181
6865
  // ensure floting groups stay within visible boundaries
6182
6866
  floating.overlay.setBounds();
6183
6867
  }
@@ -6245,10 +6929,16 @@ define(['exports'], (function (exports) { 'use strict';
6245
6929
  collection[panel.id] = panel.toJSON();
6246
6930
  return collection;
6247
6931
  }, {});
6248
- const floats = this.floatingGroups.map((floatingGroup) => {
6932
+ const floats = this._floatingGroups.map((group) => {
6249
6933
  return {
6250
- data: floatingGroup.group.toJSON(),
6251
- position: floatingGroup.overlay.toJSON(),
6934
+ data: group.group.toJSON(),
6935
+ position: group.overlay.toJSON(),
6936
+ };
6937
+ });
6938
+ const popoutGroups = this._popoutGroups.map((group) => {
6939
+ return {
6940
+ data: group.group.toJSON(),
6941
+ position: group.window.dimensions(),
6252
6942
  };
6253
6943
  });
6254
6944
  const result = {
@@ -6259,10 +6949,13 @@ define(['exports'], (function (exports) { 'use strict';
6259
6949
  if (floats.length > 0) {
6260
6950
  result.floatingGroups = floats;
6261
6951
  }
6952
+ if (popoutGroups.length > 0) {
6953
+ result.popoutGroups = popoutGroups;
6954
+ }
6262
6955
  return result;
6263
6956
  }
6264
6957
  fromJSON(data) {
6265
- var _a;
6958
+ var _a, _b;
6266
6959
  this.clear();
6267
6960
  if (typeof data !== 'object' || data === null) {
6268
6961
  throw new Error('serialized layout must be a non-null object');
@@ -6329,7 +7022,16 @@ define(['exports'], (function (exports) { 'use strict';
6329
7022
  width: position.width,
6330
7023
  }, { skipRemoveGroup: true, inDragMode: false });
6331
7024
  }
6332
- for (const floatingGroup of this.floatingGroups) {
7025
+ const serializedPopoutGroups = (_b = data.popoutGroups) !== null && _b !== void 0 ? _b : [];
7026
+ for (const serializedPopoutGroup of serializedPopoutGroups) {
7027
+ const { data, position } = serializedPopoutGroup;
7028
+ const group = createGroupFromSerializedState(data);
7029
+ this.addPopoutGroup(group, {
7030
+ skipRemoveGroup: true,
7031
+ position: position !== null && position !== void 0 ? position : undefined,
7032
+ });
7033
+ }
7034
+ for (const floatingGroup of this._floatingGroups) {
6333
7035
  floatingGroup.overlay.setBounds();
6334
7036
  }
6335
7037
  if (typeof activeGroup === 'string') {
@@ -6361,7 +7063,7 @@ define(['exports'], (function (exports) { 'use strict';
6361
7063
  this._onDidRemoveGroup.fire(group);
6362
7064
  }
6363
7065
  // iterate over a reassigned array since original array will be modified
6364
- for (const floatingGroup of [...this.floatingGroups]) {
7066
+ for (const floatingGroup of [...this._floatingGroups]) {
6365
7067
  floatingGroup.dispose();
6366
7068
  }
6367
7069
  // fires clean-up events and clears the underlying HTML gridview.
@@ -6453,7 +7155,8 @@ define(['exports'], (function (exports) { 'use strict';
6453
7155
  group.model.openPanel(panel);
6454
7156
  this.doSetGroupAndPanelActive(group);
6455
7157
  }
6456
- else if (referenceGroup.api.isFloating || target === 'center') {
7158
+ else if (referenceGroup.api.location === 'floating' ||
7159
+ target === 'center') {
6457
7160
  panel = this.createPanel(options, referenceGroup);
6458
7161
  referenceGroup.model.openPanel(panel);
6459
7162
  }
@@ -6497,6 +7200,7 @@ define(['exports'], (function (exports) { 'use strict';
6497
7200
  }
6498
7201
  group.model.removePanel(panel);
6499
7202
  if (!options.skipDispose) {
7203
+ this.overlayRenderContainer.detatch(panel);
6500
7204
  panel.dispose();
6501
7205
  }
6502
7206
  if (group.size === 0 && options.removeEmptyGroup) {
@@ -6513,7 +7217,7 @@ define(['exports'], (function (exports) { 'use strict';
6513
7217
  }
6514
7218
  updateWatermark() {
6515
7219
  var _a, _b;
6516
- if (this.groups.filter((x) => !x.api.isFloating).length === 0) {
7220
+ if (this.groups.filter((x) => x.api.location === 'grid').length === 0) {
6517
7221
  if (!this.watermark) {
6518
7222
  this.watermark = this.createWatermarkComponent();
6519
7223
  this.watermark.init({
@@ -6588,19 +7292,40 @@ define(['exports'], (function (exports) { 'use strict';
6588
7292
  }
6589
7293
  }
6590
7294
  doRemoveGroup(group, options) {
6591
- const floatingGroup = this.floatingGroups.find((_) => _.group === group);
6592
- if (floatingGroup) {
6593
- if (!(options === null || options === void 0 ? void 0 : options.skipDispose)) {
6594
- floatingGroup.group.dispose();
6595
- this._groups.delete(group.id);
6596
- this._onDidRemoveGroup.fire(group);
7295
+ if (group.api.location === 'floating') {
7296
+ const floatingGroup = this._floatingGroups.find((_) => _.group === group);
7297
+ if (floatingGroup) {
7298
+ if (!(options === null || options === void 0 ? void 0 : options.skipDispose)) {
7299
+ floatingGroup.group.dispose();
7300
+ this._groups.delete(group.id);
7301
+ this._onDidRemoveGroup.fire(group);
7302
+ }
7303
+ remove(this._floatingGroups, floatingGroup);
7304
+ floatingGroup.dispose();
7305
+ if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {
7306
+ const groups = Array.from(this._groups.values());
7307
+ this.doSetGroupActive(groups.length > 0 ? groups[0].value : undefined);
7308
+ }
7309
+ return floatingGroup.group;
6597
7310
  }
6598
- floatingGroup.dispose();
6599
- if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {
6600
- const groups = Array.from(this._groups.values());
6601
- this.doSetGroupActive(groups.length > 0 ? groups[0].value : undefined);
7311
+ throw new Error('failed to find floating group');
7312
+ }
7313
+ if (group.api.location === 'popout') {
7314
+ const selectedGroup = this._popoutGroups.find((_) => _.group === group);
7315
+ if (selectedGroup) {
7316
+ if (!(options === null || options === void 0 ? void 0 : options.skipDispose)) {
7317
+ selectedGroup.group.dispose();
7318
+ this._groups.delete(group.id);
7319
+ this._onDidRemoveGroup.fire(group);
7320
+ }
7321
+ selectedGroup.dispose();
7322
+ if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {
7323
+ const groups = Array.from(this._groups.values());
7324
+ this.doSetGroupActive(groups.length > 0 ? groups[0].value : undefined);
7325
+ }
7326
+ return selectedGroup.group;
6602
7327
  }
6603
- return floatingGroup.group;
7328
+ throw new Error('failed to find popout group');
6604
7329
  }
6605
7330
  return super.doRemoveGroup(group, options);
6606
7331
  }
@@ -6632,8 +7357,7 @@ define(['exports'], (function (exports) { 'use strict';
6632
7357
  const targetLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, destinationTarget);
6633
7358
  if (sourceGroup && sourceGroup.size < 2) {
6634
7359
  const [targetParentLocation, to] = tail(targetLocation);
6635
- const isFloating = this.floatingGroups.find((x) => x.group === sourceGroup);
6636
- if (!isFloating) {
7360
+ if (sourceGroup.api.location === 'grid') {
6637
7361
  const sourceLocation = getGridLocation(sourceGroup.element);
6638
7362
  const [sourceParentLocation, from] = tail(sourceLocation);
6639
7363
  if (sequenceEquals(sourceParentLocation, targetParentLocation)) {
@@ -6679,12 +7403,25 @@ define(['exports'], (function (exports) { 'use strict';
6679
7403
  }
6680
7404
  }
6681
7405
  else {
6682
- const floatingGroup = this.floatingGroups.find((x) => x.group === sourceGroup);
6683
- if (floatingGroup) {
6684
- floatingGroup.dispose();
6685
- }
6686
- else {
6687
- this.gridview.removeView(getGridLocation(sourceGroup.element));
7406
+ switch (sourceGroup.api.location) {
7407
+ case 'grid':
7408
+ this.gridview.removeView(getGridLocation(sourceGroup.element));
7409
+ break;
7410
+ case 'floating': {
7411
+ const selectedFloatingGroup = this._floatingGroups.find((x) => x.group === sourceGroup);
7412
+ if (!selectedFloatingGroup) {
7413
+ throw new Error('failed to find floating group');
7414
+ }
7415
+ selectedFloatingGroup.dispose();
7416
+ break;
7417
+ }
7418
+ case 'popout': {
7419
+ const selectedPopoutGroup = this._popoutGroups.find((x) => x.group === sourceGroup);
7420
+ if (!selectedPopoutGroup) {
7421
+ throw new Error('failed to find popout group');
7422
+ }
7423
+ selectedPopoutGroup.dispose();
7424
+ }
6688
7425
  }
6689
7426
  const referenceLocation = getGridLocation(referenceGroup.element);
6690
7427
  const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, target);
@@ -6746,7 +7483,7 @@ define(['exports'], (function (exports) { 'use strict';
6746
7483
  const contentComponent = options.component;
6747
7484
  const tabComponent = (_a = options.tabComponent) !== null && _a !== void 0 ? _a : this.options.defaultTabComponent;
6748
7485
  const view = new DockviewPanelModel(this, options.id, contentComponent, tabComponent);
6749
- const panel = new DockviewPanel(options.id, this, this._api, group, view);
7486
+ const panel = new DockviewPanel(options.id, this, this._api, group, view, { renderer: options.renderer });
6750
7487
  panel.init({
6751
7488
  title: (_b = options.title) !== null && _b !== void 0 ? _b : options.id,
6752
7489
  params: (_c = options === null || options === void 0 ? void 0 : options.params) !== null && _c !== void 0 ? _c : {},