dockview 4.13.1 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -13
- package/dist/cjs/dockview/headerActionsRenderer.js +1 -0
- package/dist/dockview.js +38 -11341
- package/dist/dockview.min.js +2 -2
- package/dist/dockview.min.js.map +1 -1
- package/dist/esm/dockview/headerActionsRenderer.js +1 -0
- package/dist/package/main.cjs.js +945 -0
- package/dist/package/main.cjs.min.js +7 -0
- package/dist/package/main.esm.min.mjs +7 -0
- package/dist/package/main.esm.mjs +930 -0
- package/dist/styles/dockview.css +63 -7
- package/package.json +70 -59
- package/dist/dockview.amd.js +0 -12246
- package/dist/dockview.amd.js.map +0 -1
- package/dist/dockview.amd.min.js +0 -8
- package/dist/dockview.amd.min.js.map +0 -1
- package/dist/dockview.amd.min.noStyle.js +0 -8
- package/dist/dockview.amd.min.noStyle.js.map +0 -1
- package/dist/dockview.amd.noStyle.js +0 -12216
- package/dist/dockview.amd.noStyle.js.map +0 -1
- package/dist/dockview.cjs.js +0 -12247
- package/dist/dockview.cjs.js.map +0 -1
- package/dist/dockview.esm.js +0 -12171
- package/dist/dockview.esm.js.map +0 -1
- package/dist/dockview.esm.min.js +0 -8
- package/dist/dockview.esm.min.js.map +0 -1
- package/dist/dockview.js.map +0 -1
- package/dist/dockview.min.noStyle.js +0 -8
- package/dist/dockview.min.noStyle.js.map +0 -1
- package/dist/dockview.noStyle.js +0 -12220
- package/dist/dockview.noStyle.js.map +0 -1
|
@@ -0,0 +1,930 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dockview
|
|
3
|
+
* @version 5.1.0
|
|
4
|
+
* @link https://github.com/mathuo/dockview
|
|
5
|
+
* @license MIT
|
|
6
|
+
*/
|
|
7
|
+
import { DockviewDisposable, DockviewEmitter, DockviewMutableDisposable, DockviewCompositeDisposable, PROPERTY_KEYS_DOCKVIEW, createDockview, SplitviewPanel, SplitviewApi, PROPERTY_KEYS_SPLITVIEW, createSplitview, GridviewPanel, GridviewApi, PROPERTY_KEYS_GRIDVIEW, createGridview, PROPERTY_KEYS_PANEVIEW, createPaneview } from 'dockview-core';
|
|
8
|
+
export * from 'dockview-core';
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import ReactDOM from 'react-dom';
|
|
11
|
+
|
|
12
|
+
function styleInject(css, ref) {
|
|
13
|
+
if ( ref === void 0 ) ref = {};
|
|
14
|
+
var insertAt = ref.insertAt;
|
|
15
|
+
|
|
16
|
+
if (!css || typeof document === 'undefined') { return; }
|
|
17
|
+
|
|
18
|
+
var head = document.head || document.getElementsByTagName('head')[0];
|
|
19
|
+
var style = document.createElement('style');
|
|
20
|
+
style.type = 'text/css';
|
|
21
|
+
|
|
22
|
+
if (insertAt === 'top') {
|
|
23
|
+
if (head.firstChild) {
|
|
24
|
+
head.insertBefore(style, head.firstChild);
|
|
25
|
+
} else {
|
|
26
|
+
head.appendChild(style);
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
head.appendChild(style);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (style.styleSheet) {
|
|
33
|
+
style.styleSheet.cssText = css;
|
|
34
|
+
} else {
|
|
35
|
+
style.appendChild(document.createTextNode(css));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var css_248z = ".dv-scrollable {\n position: relative;\n overflow: hidden;\n}\n.dv-scrollable .dv-scrollbar {\n position: absolute;\n border-radius: 2px;\n background-color: transparent;\n /* GPU optimizations */\n will-change: background-color, transform;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n transition-property: background-color;\n transition-timing-function: ease-in-out;\n transition-duration: 1s;\n transition-delay: 0s;\n}\n.dv-scrollable .dv-scrollbar-horizontal {\n bottom: 0px;\n left: 0px;\n height: 4px;\n}\n.dv-scrollable .dv-scrollbar-vertical {\n right: 0px;\n top: 0px;\n width: 4px;\n}\n.dv-scrollable:hover .dv-scrollbar, .dv-scrollable.dv-scrollable-resizing .dv-scrollbar, .dv-scrollable.dv-scrollable-scrolling .dv-scrollbar {\n background-color: var(--dv-scrollbar-background-color, rgba(255, 255, 255, 0.25));\n}\n.dv-svg {\n display: inline-block;\n fill: currentcolor;\n line-height: 1;\n stroke: currentcolor;\n stroke-width: 0;\n}\n.dockview-theme-dark {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-group-view-background-color: #1e1e1e;\n --dv-tabs-and-actions-container-background-color: #252526;\n --dv-activegroup-visiblepanel-tab-background-color: #1e1e1e;\n --dv-activegroup-hiddenpanel-tab-background-color: #2d2d2d;\n --dv-inactivegroup-visiblepanel-tab-background-color: #1e1e1e;\n --dv-inactivegroup-hiddenpanel-tab-background-color: #2d2d2d;\n --dv-tab-divider-color: #1e1e1e;\n --dv-activegroup-visiblepanel-tab-color: white;\n --dv-activegroup-hiddenpanel-tab-color: #969696;\n --dv-inactivegroup-visiblepanel-tab-color: #8f8f8f;\n --dv-inactivegroup-hiddenpanel-tab-color: #626262;\n --dv-separator-border: rgb(68, 68, 68);\n --dv-paneview-header-border-color: rgba(204, 204, 204, 0.2);\n}\n.dockview-theme-dark .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n\n.dockview-theme-light {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-group-view-background-color: white;\n --dv-tabs-and-actions-container-background-color: #f3f3f3;\n --dv-activegroup-visiblepanel-tab-background-color: white;\n --dv-activegroup-hiddenpanel-tab-background-color: #ececec;\n --dv-inactivegroup-visiblepanel-tab-background-color: white;\n --dv-inactivegroup-hiddenpanel-tab-background-color: #ececec;\n --dv-tab-divider-color: white;\n --dv-activegroup-visiblepanel-tab-color: rgb(51, 51, 51);\n --dv-activegroup-hiddenpanel-tab-color: rgba(51, 51, 51, 0.7);\n --dv-inactivegroup-visiblepanel-tab-color: rgba(51, 51, 51, 0.7);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(51, 51, 51, 0.35);\n --dv-separator-border: rgba(128, 128, 128, 0.35);\n --dv-paneview-header-border-color: rgb(51, 51, 51);\n --dv-scrollbar-background-color: rgba(0, 0, 0, 0.25);\n}\n.dockview-theme-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n\n.dockview-theme-vs {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-group-view-background-color: #1e1e1e;\n --dv-tabs-and-actions-container-background-color: #252526;\n --dv-activegroup-visiblepanel-tab-background-color: #1e1e1e;\n --dv-activegroup-hiddenpanel-tab-background-color: #2d2d2d;\n --dv-inactivegroup-visiblepanel-tab-background-color: #1e1e1e;\n --dv-inactivegroup-hiddenpanel-tab-background-color: #2d2d2d;\n --dv-tab-divider-color: #1e1e1e;\n --dv-activegroup-visiblepanel-tab-color: white;\n --dv-activegroup-hiddenpanel-tab-color: #969696;\n --dv-inactivegroup-visiblepanel-tab-color: #8f8f8f;\n --dv-inactivegroup-hiddenpanel-tab-color: #626262;\n --dv-separator-border: rgb(68, 68, 68);\n --dv-paneview-header-border-color: rgba(204, 204, 204, 0.2);\n --dv-tabs-and-actions-container-background-color: #2d2d30;\n --dv-tabs-and-actions-container-height: 20px;\n --dv-tabs-and-actions-container-font-size: 11px;\n --dv-activegroup-visiblepanel-tab-background-color: #007acc;\n --dv-inactivegroup-visiblepanel-tab-background-color: #3f3f46;\n --dv-activegroup-visiblepanel-tab-color: white;\n --dv-activegroup-hiddenpanel-tab-color: white;\n --dv-inactivegroup-visiblepanel-tab-color: white;\n --dv-inactivegroup-hiddenpanel-tab-color: white;\n}\n.dockview-theme-vs .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-vs .dv-groupview.dv-active-group > .dv-tabs-and-actions-container {\n box-sizing: content-box;\n border-bottom: 2px solid var(--dv-activegroup-visiblepanel-tab-background-color);\n}\n.dockview-theme-vs .dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tab.dv-active-tab {\n border-top: 2px solid var(--dv-activegroup-visiblepanel-tab-background-color);\n}\n.dockview-theme-vs .dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tab.dv-inactive-tab {\n border-top: 2px solid var(--dv-activegroup-hiddenpanel-tab-background-color);\n}\n.dockview-theme-vs .dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container {\n box-sizing: content-box;\n border-bottom: 2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color);\n}\n.dockview-theme-vs .dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container .dv-tab.dv-active-tab {\n border-top: 2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color);\n}\n.dockview-theme-vs .dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container .dv-tab.dv-inactive-tab {\n border-top: 2px solid var(--dv-inactivegroup-hiddenpanel-tab-background-color);\n}\n\n.dockview-theme-abyss {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-color-abyss-dark: #000c18;\n --dv-color-abyss: #10192c;\n --dv-color-abyss-light: #1c1c2a;\n --dv-color-abyss-lighter: #2b2b4a;\n --dv-color-abyss-accent: rgb(91, 30, 207);\n --dv-color-abyss-primary-text: white;\n --dv-color-abyss-secondary-text: rgb(148, 151, 169);\n --dv-group-view-background-color: var(--dv-color-abyss-dark);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-abyss-light\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-abyss-dark\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(--dv-color-abyss);\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-abyss-dark\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(--dv-color-abyss);\n --dv-tab-divider-color: var(--dv-color-abyss-lighter);\n --dv-activegroup-visiblepanel-tab-color: white;\n --dv-activegroup-hiddenpanel-tab-color: rgba(255, 255, 255, 0.5);\n --dv-inactivegroup-visiblepanel-tab-color: rgba(255, 255, 255, 0.5);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(255, 255, 255, 0.25);\n --dv-separator-border: var(--dv-color-abyss-lighter);\n --dv-paneview-header-border-color: var(--dv-color-abyss-lighter);\n --dv-paneview-active-outline-color: #596f99;\n}\n.dockview-theme-abyss .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n\n.dockview-theme-dracula {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-group-view-background-color: #282a36;\n --dv-tabs-and-actions-container-background-color: #191a21;\n --dv-activegroup-visiblepanel-tab-background-color: #282a36;\n --dv-activegroup-hiddenpanel-tab-background-color: #21222c;\n --dv-inactivegroup-visiblepanel-tab-background-color: #282a36;\n --dv-inactivegroup-hiddenpanel-tab-background-color: #21222c;\n --dv-tab-divider-color: #191a21;\n --dv-activegroup-visiblepanel-tab-color: rgb(248, 248, 242);\n --dv-activegroup-hiddenpanel-tab-color: rgb(98, 114, 164);\n --dv-inactivegroup-visiblepanel-tab-color: rgba(248, 248, 242, 0.5);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(98, 114, 164, 0.5);\n --dv-separator-border: #bd93f9;\n --dv-paneview-header-border-color: #bd93f9;\n --dv-paneview-active-outline-color: #6272a4;\n}\n.dockview-theme-dracula .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-dracula .dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-active-tab {\n position: relative;\n}\n.dockview-theme-dracula .dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-active-tab::after {\n position: absolute;\n left: 0px;\n top: 0px;\n content: \"\";\n width: 100%;\n height: 1px;\n background-color: #94527e;\n z-index: 999;\n}\n.dockview-theme-dracula .dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-active-tab {\n position: relative;\n}\n.dockview-theme-dracula .dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-active-tab::after {\n position: absolute;\n left: 0px;\n bottom: 0px;\n content: \"\";\n width: 100%;\n height: 1px;\n background-color: #5e3d5a;\n z-index: 999;\n}\n\n.dockview-theme-replit {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n box-sizing: border-box;\n padding: 10px;\n background-color: #ebeced;\n --dv-group-view-background-color: #ebeced;\n --dv-tabs-and-actions-container-background-color: #fcfcfc;\n --dv-activegroup-visiblepanel-tab-background-color: #f0f1f2;\n --dv-activegroup-hiddenpanel-tab-background-color: #fcfcfc;\n --dv-inactivegroup-visiblepanel-tab-background-color: #f0f1f2;\n --dv-inactivegroup-hiddenpanel-tab-background-color: #fcfcfc;\n --dv-tab-divider-color: transparent;\n --dv-activegroup-visiblepanel-tab-color: rgb(51, 51, 51);\n --dv-activegroup-hiddenpanel-tab-color: rgb(51, 51, 51);\n --dv-inactivegroup-visiblepanel-tab-color: rgb(51, 51, 51);\n --dv-inactivegroup-hiddenpanel-tab-color: rgb(51, 51, 51);\n --dv-separator-border: transparent;\n --dv-paneview-header-border-color: rgb(51, 51, 51);\n --dv-sash-color: #cfd1d3;\n --dv-active-sash-color: #babbbb;\n}\n.dockview-theme-replit .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-replit .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-replit .dv-resize-container {\n border-radius: 10px !important;\n border: none;\n}\n.dockview-theme-replit .dv-groupview {\n overflow: hidden;\n border-radius: 10px;\n}\n.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container {\n border-bottom: 1px solid rgba(128, 128, 128, 0.35);\n}\n.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab {\n margin: 4px;\n border-radius: 8px;\n}\n.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab .dv-svg {\n height: 8px;\n width: 8px;\n}\n.dockview-theme-replit .dv-groupview .dv-tabs-and-actions-container .dv-tab:hover {\n background-color: #e4e5e6 !important;\n}\n.dockview-theme-replit .dv-groupview .dv-content-container {\n background-color: #fcfcfc;\n}\n.dockview-theme-replit .dv-groupview.dv-active-group {\n border: 1px solid rgba(128, 128, 128, 0.35);\n}\n.dockview-theme-replit .dv-groupview.dv-inactive-group {\n border: 1px solid transparent;\n}\n.dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash {\n background-color: transparent;\n}\n.dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled)::after {\n content: \"\";\n height: 4px;\n width: 40px;\n border-radius: 2px;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: var(--dv-sash-color);\n position: absolute;\n}\n.dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled):hover, .dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled):active {\n background-color: transparent;\n}\n.dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled):hover::after, .dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled):active::after {\n background-color: var(--dv-active-sash-color);\n}\n.dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash {\n background-color: transparent;\n}\n.dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash:not(.disabled)::after {\n content: \"\";\n height: 40px;\n width: 4px;\n border-radius: 2px;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: var(--dv-sash-color);\n position: absolute;\n}\n.dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash:not(.disabled):hover, .dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash:not(.disabled):active {\n background-color: transparent;\n}\n.dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash:not(.disabled):hover::after, .dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash:not(.disabled):active::after {\n background-color: var(--dv-active-sash-color);\n}\n\n.dockview-theme-abyss-spaced {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-tab-font-size: 12px;\n --dv-border-radius: 20px;\n --dv-tab-margin: 0.5rem 0.25rem;\n --dv-tabs-and-actions-container-height: 44px;\n --dv-border-radius: 20px;\n box-sizing: border-box;\n --dv-color-abyss-dark: rgb(11, 6, 17);\n --dv-color-abyss: #16121f;\n --dv-color-abyss-light: #201d2b;\n --dv-color-abyss-lighter: #2a2837;\n --dv-color-abyss-accent: rgb(91, 30, 207);\n --dv-color-abyss-primary-text: white;\n --dv-color-abyss-secondary-text: rgb(148, 151, 169);\n --dv-drag-over-border: 2px solid var(--dv-color-abyss-accent);\n --dv-drag-over-background-color: \"\";\n --dv-group-view-background-color: var(--dv-color-abyss-dark);\n --dv-tabs-and-actions-container-background-color: var(--dv-color-abyss);\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-abyss-lighter\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-abyss-light\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-abyss-lighter\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-abyss-light\n );\n --dv-tab-divider-color: transparent;\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-abyss-primary-text);\n --dv-activegroup-hiddenpanel-tab-color: var(\n --dv-color-abyss-secondary-text\n );\n --dv-inactivegroup-visiblepanel-tab-color: var(\n --dv-color-abyss-primary-text\n );\n --dv-inactivegroup-hiddenpanel-tab-color: var(\n --dv-color-abyss-secondary-text\n );\n --dv-separator-border: transparent;\n --dv-paneview-header-border-color: rgb(51, 51, 51);\n --dv-active-sash-color: var(--dv-color-abyss-accent);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(0, 0, 0, 0.5);\n padding: 10px;\n background-color: var(--dv-color-abyss-dark);\n}\n.dockview-theme-abyss-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-abyss-spaced .dv-sash {\n border-radius: 4px;\n}\n.dockview-theme-abyss-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-abyss-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-abyss-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-abyss-spaced .dv-tabs-overflow-container,\n.dockview-theme-abyss-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: 8px;\n height: unset !important;\n}\n.dockview-theme-abyss-spaced .dv-tab {\n border-radius: 8px;\n}\n.dockview-theme-abyss-spaced .dv-tab .dv-svg {\n height: 8px;\n width: 8px;\n}\n.dockview-theme-abyss-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-abyss-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-abyss-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n}\n.dockview-theme-abyss-spaced .dv-resize-container .dv-groupview {\n border: 2px solid var(--dv-color-abyss-dark);\n}\n\n.dockview-theme-light-spaced {\n --dv-paneview-active-outline-color: dodgerblue;\n --dv-tabs-and-actions-container-font-size: 13px;\n --dv-tabs-and-actions-container-height: 35px;\n --dv-drag-over-background-color: rgba(83, 89, 93, 0.5);\n --dv-drag-over-border-color: transparent;\n --dv-tabs-container-scrollbar-color: #888;\n --dv-icon-hover-background-color: rgba(90, 93, 94, 0.31);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(83, 89, 93, 0.5);\n --dv-overlay-z-index: 999;\n --dv-tab-font-size: inherit;\n --dv-border-radius: 0px;\n --dv-tab-margin: 0;\n --dv-sash-color: transparent;\n --dv-active-sash-color: transparent;\n --dv-active-sash-transition-duration: 0.1s;\n --dv-active-sash-transition-delay: 0.5s;\n --dv-tab-font-size: 12px;\n --dv-border-radius: 20px;\n --dv-tab-margin: 0.5rem 0.25rem;\n --dv-tabs-and-actions-container-height: 44px;\n --dv-border-radius: 20px;\n box-sizing: border-box;\n --dv-drag-over-border: 2px solid rgb(91, 30, 207);\n --dv-drag-over-background-color: \"\";\n --dv-group-view-background-color: #f6f5f9;\n --dv-tabs-and-actions-container-background-color: white;\n --dv-activegroup-visiblepanel-tab-background-color: #ededf0;\n --dv-activegroup-hiddenpanel-tab-background-color: #f9f9fa;\n --dv-inactivegroup-visiblepanel-tab-background-color: #ededf0;\n --dv-inactivegroup-hiddenpanel-tab-background-color: #f9f9fa;\n --dv-tab-divider-color: transparent;\n --dv-activegroup-visiblepanel-tab-color: rgb(104, 107, 130);\n --dv-activegroup-hiddenpanel-tab-color: rgb(148, 151, 169);\n --dv-inactivegroup-visiblepanel-tab-color: rgb(104, 107, 130);\n --dv-inactivegroup-hiddenpanel-tab-color: rgb(148, 151, 169);\n --dv-separator-border: transparent;\n --dv-paneview-header-border-color: rgb(51, 51, 51);\n --dv-active-sash-color: rgb(91, 30, 207);\n --dv-floating-box-shadow: 8px 8px 8px 0px rgba(0, 0, 0, 0.1);\n padding: 10px;\n background-color: #f6f5f9;\n --dv-scrollbar-background-color: rgba(0, 0, 0, 0.25);\n}\n.dockview-theme-light-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-light-spaced .dv-sash {\n border-radius: 4px;\n}\n.dockview-theme-light-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-light-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-light-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: 8px;\n height: unset !important;\n}\n.dockview-theme-light-spaced .dv-tab {\n border-radius: 8px;\n}\n.dockview-theme-light-spaced .dv-tab .dv-svg {\n height: 8px;\n width: 8px;\n}\n.dockview-theme-light-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-light-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n}\n.dockview-theme-light-spaced .dv-resize-container .dv-groupview {\n border: 2px solid rgba(255, 255, 255, 0.1);\n}\n.dv-drop-target-container {\n position: absolute;\n z-index: 9999;\n top: 0px;\n left: 0px;\n height: 100%;\n width: 100%;\n pointer-events: none;\n overflow: hidden;\n --dv-transition-duration: 300ms;\n}\n.dv-drop-target-container .dv-drop-target-anchor {\n position: relative;\n border: var(--dv-drag-over-border);\n background-color: var(--dv-drag-over-background-color);\n opacity: 1;\n /* GPU optimizations */\n will-change: transform, opacity;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n contain: layout paint;\n transition: opacity var(--dv-transition-duration) ease-in, transform var(--dv-transition-duration) ease-out;\n}\n.dv-drop-target {\n position: relative;\n --dv-transition-duration: 70ms;\n}\n.dv-drop-target > .dv-drop-target-dropzone {\n position: absolute;\n left: 0px;\n top: 0px;\n height: 100%;\n width: 100%;\n z-index: 1000;\n pointer-events: none;\n}\n.dv-drop-target > .dv-drop-target-dropzone > .dv-drop-target-selection {\n position: relative;\n box-sizing: border-box;\n height: 100%;\n width: 100%;\n border: var(--dv-drag-over-border);\n background-color: var(--dv-drag-over-background-color);\n transition: top var(--dv-transition-duration) ease-out, left var(--dv-transition-duration) ease-out, width var(--dv-transition-duration) ease-out, height var(--dv-transition-duration) ease-out, opacity var(--dv-transition-duration) ease-out;\n will-change: transform;\n pointer-events: none;\n}\n.dv-drop-target > .dv-drop-target-dropzone > .dv-drop-target-selection.dv-drop-target-top.dv-drop-target-small-vertical {\n border-top: 1px solid var(--dv-drag-over-border-color);\n}\n.dv-drop-target > .dv-drop-target-dropzone > .dv-drop-target-selection.dv-drop-target-bottom.dv-drop-target-small-vertical {\n border-bottom: 1px solid var(--dv-drag-over-border-color);\n}\n.dv-drop-target > .dv-drop-target-dropzone > .dv-drop-target-selection.dv-drop-target-left.dv-drop-target-small-horizontal {\n border-left: 1px solid var(--dv-drag-over-border-color);\n}\n.dv-drop-target > .dv-drop-target-dropzone > .dv-drop-target-selection.dv-drop-target-right.dv-drop-target-small-horizontal {\n border-right: 1px solid var(--dv-drag-over-border-color);\n}\n.dv-dockview {\n position: relative;\n background-color: var(--dv-group-view-background-color);\n contain: layout;\n}\n.dv-dockview .dv-watermark-container {\n position: absolute;\n top: 0px;\n left: 0px;\n height: 100%;\n width: 100%;\n z-index: 1;\n}\n.dv-dockview .dv-overlay-render-container {\n position: relative;\n}\n\n.dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-active-tab {\n background-color: var(--dv-activegroup-visiblepanel-tab-background-color);\n color: var(--dv-activegroup-visiblepanel-tab-color);\n}\n.dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-inactive-tab {\n background-color: var(--dv-activegroup-hiddenpanel-tab-background-color);\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n}\n.dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-active-tab {\n background-color: var(--dv-inactivegroup-visiblepanel-tab-background-color);\n color: var(--dv-inactivegroup-visiblepanel-tab-color);\n}\n.dv-groupview.dv-inactive-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab.dv-inactive-tab {\n background-color: var(--dv-inactivegroup-hiddenpanel-tab-background-color);\n color: var(--dv-inactivegroup-hiddenpanel-tab-color);\n}\n\n/**\n * when a tab is dragged we lose the above stylings because they are conditional on parent elements\n * therefore we also set some stylings for the dragging event\n **/\n.dv-tab.dv-tab-dragging {\n background-color: var(--dv-activegroup-visiblepanel-tab-background-color);\n color: var(--dv-activegroup-visiblepanel-tab-color);\n}\n.dv-groupview {\n display: flex;\n height: 100%;\n background-color: var(--dv-group-view-background-color);\n overflow: hidden;\n flex-direction: column;\n}\n.dv-groupview:focus {\n outline: none;\n}\n.dv-groupview > .dv-content-container {\n flex-grow: 1;\n min-height: 0;\n outline: none;\n}\n.dv-groupview.dv-groupview-header-bottom {\n flex-direction: column-reverse;\n}\n.dv-groupview.dv-groupview-header-left {\n flex-direction: row;\n}\n.dv-groupview.dv-groupview-header-right {\n flex-direction: row-reverse;\n}\n.dv-root-wrapper {\n height: 100%;\n width: 100%;\n}\n.dv-grid-view,\n.dv-branch-node {\n height: 100%;\n width: 100%;\n}\n.dv-debug .dv-resize-container .dv-resize-handle-top {\n background-color: red;\n}\n.dv-debug .dv-resize-container .dv-resize-handle-bottom {\n background-color: green;\n}\n.dv-debug .dv-resize-container .dv-resize-handle-left {\n background-color: yellow;\n}\n.dv-debug .dv-resize-container .dv-resize-handle-right {\n background-color: blue;\n}\n.dv-debug .dv-resize-container .dv-resize-handle-topleft,\n.dv-debug .dv-resize-container .dv-resize-handle-topright,\n.dv-debug .dv-resize-container .dv-resize-handle-bottomleft,\n.dv-debug .dv-resize-container .dv-resize-handle-bottomright {\n background-color: cyan;\n}\n\n.dv-resize-container {\n --dv-overlay-z-index: var(--dv-overlay-z-index, 999);\n position: absolute;\n z-index: calc(var(--dv-overlay-z-index) - 2);\n border: 1px solid var(--dv-tab-divider-color);\n box-shadow: var(--dv-floating-box-shadow);\n /* GPU optimizations for floating group movement */\n will-change: transform, opacity;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n}\n.dv-resize-container.dv-hidden {\n display: none;\n}\n.dv-resize-container.dv-resize-container-dragging {\n opacity: 0.5;\n /* Enhanced GPU acceleration during drag */\n will-change: transform, opacity;\n}\n.dv-resize-container .dv-resize-handle-top {\n height: 4px;\n width: calc(100% - 8px);\n left: 4px;\n top: -2px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: ns-resize;\n}\n.dv-resize-container .dv-resize-handle-bottom {\n height: 4px;\n width: calc(100% - 8px);\n left: 4px;\n bottom: -2px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: ns-resize;\n}\n.dv-resize-container .dv-resize-handle-left {\n height: calc(100% - 8px);\n width: 4px;\n left: -2px;\n top: 4px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: ew-resize;\n}\n.dv-resize-container .dv-resize-handle-right {\n height: calc(100% - 8px);\n width: 4px;\n right: -2px;\n top: 4px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: ew-resize;\n}\n.dv-resize-container .dv-resize-handle-topleft {\n height: 4px;\n width: 4px;\n top: -2px;\n left: -2px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: nw-resize;\n}\n.dv-resize-container .dv-resize-handle-topright {\n height: 4px;\n width: 4px;\n right: -2px;\n top: -2px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: ne-resize;\n}\n.dv-resize-container .dv-resize-handle-bottomleft {\n height: 4px;\n width: 4px;\n left: -2px;\n bottom: -2px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: sw-resize;\n}\n.dv-resize-container .dv-resize-handle-bottomright {\n height: 4px;\n width: 4px;\n right: -2px;\n bottom: -2px;\n z-index: var(--dv-overlay-z-index);\n position: absolute;\n cursor: se-resize;\n}\n.dv-render-overlay {\n --dv-overlay-z-index: var(--dv-overlay-z-index, 999);\n position: absolute;\n z-index: 1;\n width: 100%;\n height: 100%;\n contain: layout paint;\n isolation: isolate;\n /* GPU optimizations */\n will-change: transform;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n}\n.dv-render-overlay.dv-render-overlay-float {\n z-index: calc(var(--dv-overlay-z-index) - 1);\n}\n\n.dv-debug .dv-render-overlay {\n outline: 1px solid red;\n outline-offset: -1;\n}\n.dv-pane-container {\n height: 100%;\n width: 100%;\n}\n.dv-pane-container.dv-animated .dv-view {\n /* GPU optimizations for smooth pane animations */\n will-change: transform;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n transition: transform 0.15s ease-out;\n}\n.dv-pane-container .dv-view {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n padding: 0px !important;\n}\n.dv-pane-container .dv-view:not(:first-child)::before {\n background-color: transparent !important;\n}\n.dv-pane-container .dv-view:not(:first-child) .dv-pane > .dv-pane-header {\n border-top: 1px solid var(--dv-paneview-header-border-color);\n}\n.dv-pane-container .dv-view .dv-default-header {\n background-color: var(--dv-group-view-background-color);\n color: var(--dv-activegroup-visiblepanel-tab-color);\n display: flex;\n padding: 0px 8px;\n cursor: pointer;\n}\n.dv-pane-container .dv-view .dv-default-header .dv-pane-header-icon {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.dv-pane-container .dv-view .dv-default-header > span {\n padding-left: 8px;\n flex-grow: 1;\n}\n.dv-pane-container:first-of-type > .dv-pane > .dv-pane-header {\n border-top: none !important;\n}\n.dv-pane-container .dv-pane {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n height: 100%;\n}\n.dv-pane-container .dv-pane .dv-pane-header {\n box-sizing: border-box;\n user-select: none;\n position: relative;\n outline: none;\n}\n.dv-pane-container .dv-pane .dv-pane-header.dv-pane-draggable {\n cursor: pointer;\n}\n.dv-pane-container .dv-pane .dv-pane-header:focus:before, .dv-pane-container .dv-pane .dv-pane-header:focus-within:before {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 5;\n content: \"\";\n pointer-events: none;\n outline: 1px solid;\n outline-width: -1px;\n outline-style: solid;\n outline-offset: -1px;\n outline-color: var(--dv-paneview-active-outline-color);\n}\n.dv-pane-container .dv-pane .dv-pane-body {\n overflow-y: auto;\n overflow-x: hidden;\n flex-grow: 1;\n position: relative;\n outline: none;\n}\n.dv-pane-container .dv-pane .dv-pane-body:focus:before, .dv-pane-container .dv-pane .dv-pane-body:focus-within:before {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 5;\n content: \"\";\n pointer-events: none;\n outline: 1px solid;\n outline-width: -1px;\n outline-style: solid;\n outline-offset: -1px;\n outline-color: var(--dv-paneview-active-outline-color);\n}\n.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-enabled {\n background-color: black;\n}\n.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-disabled {\n background-color: orange;\n}\n.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-maximum {\n background-color: green;\n}\n.dv-debug .dv-split-view-container .dv-sash-container .dv-sash.dv-minimum {\n background-color: red;\n}\n\n.dv-split-view-container {\n position: relative;\n overflow: hidden;\n height: 100%;\n width: 100%;\n}\n.dv-split-view-container.dv-splitview-disabled > .dv-sash-container > .dv-sash {\n pointer-events: none;\n}\n.dv-split-view-container.dv-animation .dv-view,\n.dv-split-view-container.dv-animation .dv-sash {\n /* GPU optimizations for smooth animations */\n will-change: transform;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n transition: transform 0.15s ease-out;\n}\n.dv-split-view-container.dv-horizontal {\n height: 100%;\n}\n.dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash {\n height: 100%;\n width: 4px;\n}\n.dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash.dv-enabled {\n cursor: ew-resize;\n}\n.dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash.dv-disabled {\n cursor: default;\n}\n.dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash.dv-maximum {\n cursor: w-resize;\n}\n.dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash.dv-minimum {\n cursor: e-resize;\n}\n.dv-split-view-container.dv-horizontal > .dv-view-container > .dv-view:not(:first-child)::before {\n height: 100%;\n width: 1px;\n}\n.dv-split-view-container.dv-vertical {\n width: 100%;\n}\n.dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash {\n width: 100%;\n height: 4px;\n}\n.dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash.dv-enabled {\n cursor: ns-resize;\n}\n.dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash.dv-disabled {\n cursor: default;\n}\n.dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash.dv-maximum {\n cursor: n-resize;\n}\n.dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash.dv-minimum {\n cursor: s-resize;\n}\n.dv-split-view-container.dv-vertical > .dv-view-container > .dv-view {\n width: 100%;\n}\n.dv-split-view-container.dv-vertical > .dv-view-container > .dv-view:not(:first-child)::before {\n height: 1px;\n width: 100%;\n}\n.dv-split-view-container .dv-sash-container {\n height: 100%;\n width: 100%;\n position: absolute;\n}\n.dv-split-view-container .dv-sash-container .dv-sash {\n position: absolute;\n z-index: 99;\n outline: none;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n touch-action: none;\n background-color: var(--dv-sash-color, transparent);\n}\n.dv-split-view-container .dv-sash-container .dv-sash:not(.disabled):active, .dv-split-view-container .dv-sash-container .dv-sash:not(.disabled):hover {\n background-color: var(--dv-active-sash-color, transparent);\n transition-property: background-color;\n transition-timing-function: ease-in-out;\n transition-duration: var(--dv-active-sash-transition-duration, 0.1s);\n transition-delay: var(--dv-active-sash-transition-delay, 0.5s);\n}\n.dv-split-view-container .dv-view-container {\n position: relative;\n height: 100%;\n width: 100%;\n}\n.dv-split-view-container .dv-view-container .dv-view {\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n position: absolute;\n}\n.dv-split-view-container.dv-separator-border .dv-view:not(:first-child)::before {\n content: \" \";\n position: absolute;\n top: 0;\n left: 0;\n z-index: 5;\n pointer-events: none;\n background-color: var(--dv-separator-border);\n}\n.dv-dragged {\n transform: translate3d(0px, 0px, 0px); /* forces tab to be drawn on a separate layer (see https://github.com/microsoft/vscode/issues/18733) */\n}\n\n.dv-tab {\n flex-shrink: 0;\n}\n.dv-tab:focus-within, .dv-tab:focus {\n position: relative;\n}\n.dv-tab:focus-within::after, .dv-tab:focus::after {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n top: 0px;\n left: 0px;\n pointer-events: none;\n outline: 1px solid var(--dv-tab-divider-color) !important;\n outline-offset: -1px;\n z-index: 5;\n}\n.dv-tab.dv-tab-dragging .dv-default-tab-action {\n background-color: var(--dv-activegroup-visiblepanel-tab-color);\n}\n.dv-tab.dv-active-tab .dv-default-tab .dv-default-tab-action {\n visibility: visible;\n}\n.dv-tab.dv-inactive-tab .dv-default-tab .dv-default-tab-action {\n visibility: hidden;\n}\n.dv-tab.dv-inactive-tab .dv-default-tab:hover .dv-default-tab-action {\n visibility: visible;\n}\n.dv-tab .dv-default-tab {\n position: relative;\n height: 100%;\n width: 100%;\n display: flex;\n align-items: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.dv-tab .dv-default-tab .dv-default-tab-content {\n flex-grow: 1;\n margin-right: 4px;\n}\n.dv-tab .dv-default-tab .dv-default-tab-action {\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n.dv-tab .dv-default-tab .dv-default-tab-action:hover {\n border-radius: 2px;\n background-color: var(--dv-icon-hover-background-color);\n}\n.dv-tabs-overflow-dropdown-default {\n height: 100%;\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n margin: var(--dv-tab-margin);\n display: flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0.25rem 0.5rem;\n cursor: pointer;\n}\n.dv-tabs-overflow-dropdown-default > span {\n padding-left: 0.25rem;\n}\n.dv-tabs-overflow-dropdown-default > svg {\n transform: rotate(90deg);\n}\n.dv-tabs-container {\n display: flex;\n height: 100%;\n overflow: auto;\n scrollbar-width: thin;\n /* GPU optimizations for smooth scrolling */\n will-change: scroll-position;\n transform: translate3d(0, 0, 0);\n /* Track */\n /* Handle */\n}\n.dv-tabs-container.dv-tabs-container-vertical {\n width: 100%;\n height: fit-content;\n max-height: 100%;\n writing-mode: vertical-rl;\n}\n.dv-tabs-container.dv-horizontal .dv-tab:not(:first-child)::before, .dv-tabs-container.dv-vertical .dv-tab:not(:first-child)::before {\n content: \" \";\n position: absolute;\n top: 0;\n left: 0;\n z-index: 5;\n pointer-events: none;\n background-color: var(--dv-tab-divider-color);\n}\n.dv-tabs-container.dv-horizontal .dv-tab:not(:first-child)::before {\n width: 1px;\n height: 100%;\n}\n.dv-tabs-container.dv-vertical .dv-tab:not(:first-child)::before {\n width: 100%;\n height: 1px;\n}\n.dv-tabs-container::-webkit-scrollbar {\n height: 3px;\n}\n.dv-tabs-container::-webkit-scrollbar-track {\n background: transparent;\n}\n.dv-tabs-container::-webkit-scrollbar-thumb {\n background: var(--dv-tabs-container-scrollbar-color);\n}\n\n.dv-scrollable > .dv-tabs-container {\n overflow: hidden;\n}\n\n.dv-tab {\n -webkit-user-drag: element;\n outline: none;\n padding: 0.25rem 0.5rem;\n cursor: pointer;\n position: relative;\n box-sizing: border-box;\n font-size: var(--dv-tab-font-size);\n margin: var(--dv-tab-margin);\n}\n\n.dv-tabs-container-vertical .dv-tab {\n padding: 0.5rem 0.25rem;\n}\n\n.dv-tabs-overflow-container {\n flex-direction: column;\n height: unset;\n max-height: min(50vh, 400px);\n overflow-y: auto;\n border: 1px solid var(--dv-tab-divider-color);\n background-color: var(--dv-group-view-background-color);\n /* Scrollbar styling for webkit browsers */\n /* Firefox scrollbar */\n scrollbar-width: thin;\n}\n.dv-tabs-overflow-container::-webkit-scrollbar {\n width: 6px;\n}\n.dv-tabs-overflow-container::-webkit-scrollbar-track {\n background: transparent;\n}\n.dv-tabs-overflow-container::-webkit-scrollbar-thumb {\n background: var(--dv-tabs-container-scrollbar-color);\n border-radius: 3px;\n}\n.dv-tabs-overflow-container .dv-tab:not(:last-child) {\n border-bottom: 1px solid var(--dv-tab-divider-color);\n}\n.dv-tabs-overflow-container .dv-active-tab {\n background-color: var(--dv-activegroup-visiblepanel-tab-background-color);\n color: var(--dv-activegroup-visiblepanel-tab-color);\n}\n.dv-tabs-overflow-container .dv-inactive-tab {\n background-color: var(--dv-activegroup-hiddenpanel-tab-background-color);\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n}\n.dv-tabs-and-actions-container {\n display: flex;\n background-color: var(--dv-tabs-and-actions-container-background-color);\n flex-shrink: 0;\n box-sizing: border-box;\n height: var(--dv-tabs-and-actions-container-height);\n font-size: var(--dv-tabs-and-actions-container-font-size);\n}\n.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-scrollable {\n flex-grow: 1;\n}\n.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-tabs-container {\n flex-grow: 1;\n}\n.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-tabs-container .dv-tab {\n flex-grow: 1;\n padding: 0px;\n}\n.dv-tabs-and-actions-container.dv-single-tab.dv-full-width-single-tab .dv-void-container {\n flex-grow: 0;\n}\n.dv-tabs-and-actions-container .dv-void-container {\n display: flex;\n flex-grow: 1;\n}\n.dv-tabs-and-actions-container .dv-void-container.dv-draggable {\n cursor: grab;\n}\n.dv-tabs-and-actions-container .dv-right-actions-container {\n display: flex;\n}\n.dv-tabs-and-actions-container .dv-right-actions-container.dv-right-actions-container-vertical {\n flex-direction: column;\n}\n.dv-tabs-and-actions-container.dv-groupview-header-vertical {\n flex-direction: column;\n height: auto;\n width: var(--dv-tabs-and-actions-container-height);\n}\n.dv-watermark {\n display: flex;\n height: 100%;\n}";
|
|
40
|
+
styleInject(css_248z);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* This component is intended to interface between vanilla-js and React hence we need to be
|
|
44
|
+
* creative in how we update props.
|
|
45
|
+
* A ref of the component is exposed with an update method; which when called stores the props
|
|
46
|
+
* as a ref within this component and forcefully triggers a re-render of the component using
|
|
47
|
+
* the ref of props we just set on the renderered component as the props passed to the inner
|
|
48
|
+
* component
|
|
49
|
+
*/
|
|
50
|
+
const ReactComponentBridge = (props, ref) => {
|
|
51
|
+
const [_, triggerRender] = React.useState();
|
|
52
|
+
const _props = React.useRef(props.componentProps);
|
|
53
|
+
React.useImperativeHandle(ref, () => ({
|
|
54
|
+
update: (componentProps) => {
|
|
55
|
+
_props.current = Object.assign(Object.assign({}, _props.current), componentProps);
|
|
56
|
+
/**
|
|
57
|
+
* setting a arbitrary piece of state within this component will
|
|
58
|
+
* trigger a re-render.
|
|
59
|
+
* we use this rather than updating through a prop since we can
|
|
60
|
+
* pass a ref into the vanilla-js world.
|
|
61
|
+
*/
|
|
62
|
+
triggerRender(Date.now());
|
|
63
|
+
},
|
|
64
|
+
}), []);
|
|
65
|
+
return React.createElement(props.component, _props.current);
|
|
66
|
+
};
|
|
67
|
+
ReactComponentBridge.displayName = 'DockviewReactJsBridge';
|
|
68
|
+
/**
|
|
69
|
+
* Since we are storing the React.Portal references in a rendered array they
|
|
70
|
+
* require a key property like any other React element rendered in an array
|
|
71
|
+
* to prevent excessive re-rendering
|
|
72
|
+
*/
|
|
73
|
+
const uniquePortalKeyGenerator = (() => {
|
|
74
|
+
let value = 1;
|
|
75
|
+
return { next: () => `dockview_react_portal_key_${(value++).toString()}` };
|
|
76
|
+
})();
|
|
77
|
+
const ReactPartContext = React.createContext({});
|
|
78
|
+
class ReactPart {
|
|
79
|
+
constructor(parent, portalStore, component, parameters, context) {
|
|
80
|
+
this.parent = parent;
|
|
81
|
+
this.portalStore = portalStore;
|
|
82
|
+
this.component = component;
|
|
83
|
+
this.parameters = parameters;
|
|
84
|
+
this.context = context;
|
|
85
|
+
this._initialProps = {};
|
|
86
|
+
this.disposed = false;
|
|
87
|
+
this.createPortal();
|
|
88
|
+
}
|
|
89
|
+
update(props) {
|
|
90
|
+
if (this.disposed) {
|
|
91
|
+
throw new Error('invalid operation: resource is already disposed');
|
|
92
|
+
}
|
|
93
|
+
if (!this.componentInstance) {
|
|
94
|
+
// if the component is yet to be mounted store the props
|
|
95
|
+
this._initialProps = Object.assign(Object.assign({}, this._initialProps), props);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.componentInstance.update(props);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
createPortal() {
|
|
102
|
+
if (this.disposed) {
|
|
103
|
+
throw new Error('invalid operation: resource is already disposed');
|
|
104
|
+
}
|
|
105
|
+
if (!isReactComponent(this.component)) {
|
|
106
|
+
/**
|
|
107
|
+
* we know this isn't a React.FunctionComponent so throw an error here.
|
|
108
|
+
* if we do not intercept then React library will throw a very obsure error
|
|
109
|
+
* for the same reason... at least at this point we will emit a sensible stacktrace.
|
|
110
|
+
*/
|
|
111
|
+
throw new Error('Dockview: Only React.memo(...), React.ForwardRef(...) and functional components are accepted as components');
|
|
112
|
+
}
|
|
113
|
+
const bridgeComponent = React.createElement(React.forwardRef(ReactComponentBridge), {
|
|
114
|
+
component: this
|
|
115
|
+
.component,
|
|
116
|
+
componentProps: this.parameters,
|
|
117
|
+
ref: (element) => {
|
|
118
|
+
this.componentInstance = element;
|
|
119
|
+
if (Object.keys(this._initialProps).length > 0) {
|
|
120
|
+
this.componentInstance.update(this._initialProps);
|
|
121
|
+
this._initialProps = {}; // don't keep a reference to the users object once no longer required
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
const node = this.context
|
|
126
|
+
? React.createElement(ReactPartContext.Provider, { value: this.context }, bridgeComponent)
|
|
127
|
+
: bridgeComponent;
|
|
128
|
+
const portal = ReactDOM.createPortal(node, this.parent, uniquePortalKeyGenerator.next());
|
|
129
|
+
this.ref = {
|
|
130
|
+
portal,
|
|
131
|
+
disposable: this.portalStore.addPortal(portal),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
dispose() {
|
|
135
|
+
var _a;
|
|
136
|
+
(_a = this.ref) === null || _a === void 0 ? void 0 : _a.disposable.dispose();
|
|
137
|
+
this.disposed = true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* A React Hook that returns an array of portals to be rendered by the user of this hook
|
|
142
|
+
* and a disposable function to add a portal. Calling dispose removes this portal from the
|
|
143
|
+
* portal array
|
|
144
|
+
*/
|
|
145
|
+
const usePortalsLifecycle = () => {
|
|
146
|
+
const [portals, setPortals] = React.useState([]);
|
|
147
|
+
React.useDebugValue(`Portal count: ${portals.length}`);
|
|
148
|
+
const addPortal = React.useCallback((portal) => {
|
|
149
|
+
setPortals((existingPortals) => [...existingPortals, portal]);
|
|
150
|
+
let disposed = false;
|
|
151
|
+
return DockviewDisposable.from(() => {
|
|
152
|
+
if (disposed) {
|
|
153
|
+
throw new Error('invalid operation: resource already disposed');
|
|
154
|
+
}
|
|
155
|
+
disposed = true;
|
|
156
|
+
setPortals((existingPortals) => existingPortals.filter((p) => p !== portal));
|
|
157
|
+
});
|
|
158
|
+
}, []);
|
|
159
|
+
return [portals, addPortal];
|
|
160
|
+
};
|
|
161
|
+
function isReactComponent(component) {
|
|
162
|
+
/**
|
|
163
|
+
* Yes, we could use "react-is" but that would introduce an unwanted peer dependency
|
|
164
|
+
* so for now we will check in a rather crude fashion...
|
|
165
|
+
*/
|
|
166
|
+
return (typeof component === 'function' /** Functional Componnts */ ||
|
|
167
|
+
!!(component === null || component === void 0 ? void 0 : component.$$typeof) /** React.memo(...) Components */);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
class ReactPanelContentPart {
|
|
171
|
+
get element() {
|
|
172
|
+
return this._element;
|
|
173
|
+
}
|
|
174
|
+
constructor(id, component, reactPortalStore) {
|
|
175
|
+
this.id = id;
|
|
176
|
+
this.component = component;
|
|
177
|
+
this.reactPortalStore = reactPortalStore;
|
|
178
|
+
this._onDidFocus = new DockviewEmitter();
|
|
179
|
+
this.onDidFocus = this._onDidFocus.event;
|
|
180
|
+
this._onDidBlur = new DockviewEmitter();
|
|
181
|
+
this.onDidBlur = this._onDidBlur.event;
|
|
182
|
+
this._element = document.createElement('div');
|
|
183
|
+
this._element.className = 'dv-react-part';
|
|
184
|
+
this._element.style.height = '100%';
|
|
185
|
+
this._element.style.width = '100%';
|
|
186
|
+
}
|
|
187
|
+
focus() {
|
|
188
|
+
// TODO
|
|
189
|
+
}
|
|
190
|
+
init(parameters) {
|
|
191
|
+
this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {
|
|
192
|
+
params: parameters.params,
|
|
193
|
+
api: parameters.api,
|
|
194
|
+
containerApi: parameters.containerApi,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
update(event) {
|
|
198
|
+
var _a;
|
|
199
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ params: event.params });
|
|
200
|
+
}
|
|
201
|
+
layout(_width, _height) {
|
|
202
|
+
// noop
|
|
203
|
+
}
|
|
204
|
+
dispose() {
|
|
205
|
+
var _a;
|
|
206
|
+
this._onDidFocus.dispose();
|
|
207
|
+
this._onDidBlur.dispose();
|
|
208
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
class ReactPanelHeaderPart {
|
|
213
|
+
get element() {
|
|
214
|
+
return this._element;
|
|
215
|
+
}
|
|
216
|
+
constructor(id, component, reactPortalStore) {
|
|
217
|
+
this.id = id;
|
|
218
|
+
this.component = component;
|
|
219
|
+
this.reactPortalStore = reactPortalStore;
|
|
220
|
+
this._element = document.createElement('div');
|
|
221
|
+
this._element.className = 'dv-react-part';
|
|
222
|
+
this._element.style.height = '100%';
|
|
223
|
+
this._element.style.width = '100%';
|
|
224
|
+
}
|
|
225
|
+
focus() {
|
|
226
|
+
//noop
|
|
227
|
+
}
|
|
228
|
+
init(parameters) {
|
|
229
|
+
this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {
|
|
230
|
+
params: parameters.params,
|
|
231
|
+
api: parameters.api,
|
|
232
|
+
containerApi: parameters.containerApi,
|
|
233
|
+
tabLocation: parameters.tabLocation,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
update(event) {
|
|
237
|
+
var _a;
|
|
238
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ params: event.params });
|
|
239
|
+
}
|
|
240
|
+
layout(_width, _height) {
|
|
241
|
+
// noop - retrieval from api
|
|
242
|
+
}
|
|
243
|
+
dispose() {
|
|
244
|
+
var _a;
|
|
245
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
class ReactWatermarkPart {
|
|
250
|
+
get element() {
|
|
251
|
+
return this._element;
|
|
252
|
+
}
|
|
253
|
+
constructor(id, component, reactPortalStore) {
|
|
254
|
+
this.id = id;
|
|
255
|
+
this.component = component;
|
|
256
|
+
this.reactPortalStore = reactPortalStore;
|
|
257
|
+
this._element = document.createElement('div');
|
|
258
|
+
this._element.className = 'dv-react-part';
|
|
259
|
+
this._element.style.height = '100%';
|
|
260
|
+
this._element.style.width = '100%';
|
|
261
|
+
}
|
|
262
|
+
init(parameters) {
|
|
263
|
+
this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {
|
|
264
|
+
group: parameters.group,
|
|
265
|
+
containerApi: parameters.containerApi,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
focus() {
|
|
269
|
+
// noop
|
|
270
|
+
}
|
|
271
|
+
update(params) {
|
|
272
|
+
var _a, _b, _c;
|
|
273
|
+
if (this.parameters) {
|
|
274
|
+
this.parameters.params = params.params;
|
|
275
|
+
}
|
|
276
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.update({ params: (_c = (_b = this.parameters) === null || _b === void 0 ? void 0 : _b.params) !== null && _c !== void 0 ? _c : {} });
|
|
277
|
+
}
|
|
278
|
+
layout(_width, _height) {
|
|
279
|
+
// noop - retrieval from api
|
|
280
|
+
}
|
|
281
|
+
dispose() {
|
|
282
|
+
var _a;
|
|
283
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
class ReactHeaderActionsRendererPart {
|
|
288
|
+
get element() {
|
|
289
|
+
return this._element;
|
|
290
|
+
}
|
|
291
|
+
get part() {
|
|
292
|
+
return this._part;
|
|
293
|
+
}
|
|
294
|
+
constructor(component, reactPortalStore, _group) {
|
|
295
|
+
this.component = component;
|
|
296
|
+
this.reactPortalStore = reactPortalStore;
|
|
297
|
+
this._group = _group;
|
|
298
|
+
this.mutableDisposable = new DockviewMutableDisposable();
|
|
299
|
+
this._element = document.createElement('div');
|
|
300
|
+
this._element.className = 'dv-react-part';
|
|
301
|
+
this._element.style.height = '100%';
|
|
302
|
+
this._element.style.width = '100%';
|
|
303
|
+
}
|
|
304
|
+
init(parameters) {
|
|
305
|
+
this.mutableDisposable.value = new DockviewCompositeDisposable(this._group.model.onDidAddPanel(() => {
|
|
306
|
+
this.updatePanels();
|
|
307
|
+
}), this._group.model.onDidRemovePanel(() => {
|
|
308
|
+
this.updatePanels();
|
|
309
|
+
}), this._group.model.onDidActivePanelChange(() => {
|
|
310
|
+
this.updateActivePanel();
|
|
311
|
+
}), parameters.api.onDidActiveChange(() => {
|
|
312
|
+
this.updateGroupActive();
|
|
313
|
+
}));
|
|
314
|
+
this._part = new ReactPart(this.element, this.reactPortalStore, this.component, {
|
|
315
|
+
api: parameters.api,
|
|
316
|
+
containerApi: parameters.containerApi,
|
|
317
|
+
panels: this._group.model.panels,
|
|
318
|
+
activePanel: this._group.model.activePanel,
|
|
319
|
+
isGroupActive: this._group.api.isActive,
|
|
320
|
+
group: this._group,
|
|
321
|
+
headerPosition: this._group.model.headerPosition,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
dispose() {
|
|
325
|
+
var _a;
|
|
326
|
+
this.mutableDisposable.dispose();
|
|
327
|
+
(_a = this._part) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
328
|
+
}
|
|
329
|
+
update(event) {
|
|
330
|
+
var _a;
|
|
331
|
+
(_a = this._part) === null || _a === void 0 ? void 0 : _a.update(event.params);
|
|
332
|
+
}
|
|
333
|
+
updatePanels() {
|
|
334
|
+
this.update({ params: { panels: this._group.model.panels } });
|
|
335
|
+
}
|
|
336
|
+
updateActivePanel() {
|
|
337
|
+
this.update({
|
|
338
|
+
params: {
|
|
339
|
+
activePanel: this._group.model.activePanel,
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
updateGroupActive() {
|
|
344
|
+
this.update({
|
|
345
|
+
params: {
|
|
346
|
+
isGroupActive: this._group.api.isActive,
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function createGroupControlElement(component, store) {
|
|
353
|
+
return component
|
|
354
|
+
? (groupPanel) => {
|
|
355
|
+
return new ReactHeaderActionsRendererPart(component, store, groupPanel);
|
|
356
|
+
}
|
|
357
|
+
: undefined;
|
|
358
|
+
}
|
|
359
|
+
const DEFAULT_REACT_TAB = 'props.defaultTabComponent';
|
|
360
|
+
function extractCoreOptions$3(props) {
|
|
361
|
+
const coreOptions = PROPERTY_KEYS_DOCKVIEW.reduce((obj, key) => {
|
|
362
|
+
if (key in props) {
|
|
363
|
+
obj[key] = props[key];
|
|
364
|
+
}
|
|
365
|
+
return obj;
|
|
366
|
+
}, {});
|
|
367
|
+
return coreOptions;
|
|
368
|
+
}
|
|
369
|
+
const DockviewReact = React.forwardRef((props, ref) => {
|
|
370
|
+
const domRef = React.useRef(null);
|
|
371
|
+
const dockviewRef = React.useRef();
|
|
372
|
+
const [portals, addPortal] = usePortalsLifecycle();
|
|
373
|
+
React.useImperativeHandle(ref, () => domRef.current, []);
|
|
374
|
+
const prevProps = React.useRef({});
|
|
375
|
+
React.useEffect(() => {
|
|
376
|
+
const changes = {};
|
|
377
|
+
PROPERTY_KEYS_DOCKVIEW.forEach((propKey) => {
|
|
378
|
+
const key = propKey;
|
|
379
|
+
const propValue = props[key];
|
|
380
|
+
if (key in props && propValue !== prevProps.current[key]) {
|
|
381
|
+
changes[key] = propValue;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
if (dockviewRef.current) {
|
|
385
|
+
dockviewRef.current.updateOptions(changes);
|
|
386
|
+
}
|
|
387
|
+
prevProps.current = props;
|
|
388
|
+
}, PROPERTY_KEYS_DOCKVIEW.map((key) => props[key]));
|
|
389
|
+
React.useEffect(() => {
|
|
390
|
+
var _a;
|
|
391
|
+
if (!domRef.current) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const frameworkTabComponents = (_a = props.tabComponents) !== null && _a !== void 0 ? _a : {};
|
|
395
|
+
if (props.defaultTabComponent) {
|
|
396
|
+
frameworkTabComponents[DEFAULT_REACT_TAB] =
|
|
397
|
+
props.defaultTabComponent;
|
|
398
|
+
}
|
|
399
|
+
const frameworkOptions = {
|
|
400
|
+
createLeftHeaderActionComponent: createGroupControlElement(props.leftHeaderActionsComponent, { addPortal }),
|
|
401
|
+
createRightHeaderActionComponent: createGroupControlElement(props.rightHeaderActionsComponent, { addPortal }),
|
|
402
|
+
createPrefixHeaderActionComponent: createGroupControlElement(props.prefixHeaderActionsComponent, { addPortal }),
|
|
403
|
+
createComponent: (options) => {
|
|
404
|
+
return new ReactPanelContentPart(options.id, props.components[options.name], {
|
|
405
|
+
addPortal,
|
|
406
|
+
});
|
|
407
|
+
},
|
|
408
|
+
createTabComponent(options) {
|
|
409
|
+
return new ReactPanelHeaderPart(options.id, frameworkTabComponents[options.name], {
|
|
410
|
+
addPortal,
|
|
411
|
+
});
|
|
412
|
+
},
|
|
413
|
+
createWatermarkComponent: props.watermarkComponent
|
|
414
|
+
? () => {
|
|
415
|
+
return new ReactWatermarkPart('watermark', props.watermarkComponent, {
|
|
416
|
+
addPortal,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
: undefined,
|
|
420
|
+
defaultTabComponent: props.defaultTabComponent
|
|
421
|
+
? DEFAULT_REACT_TAB
|
|
422
|
+
: undefined,
|
|
423
|
+
};
|
|
424
|
+
const api = createDockview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions$3(props)), frameworkOptions));
|
|
425
|
+
const { clientWidth, clientHeight } = domRef.current;
|
|
426
|
+
api.layout(clientWidth, clientHeight);
|
|
427
|
+
if (props.onReady) {
|
|
428
|
+
props.onReady({ api });
|
|
429
|
+
}
|
|
430
|
+
dockviewRef.current = api;
|
|
431
|
+
return () => {
|
|
432
|
+
dockviewRef.current = undefined;
|
|
433
|
+
api.dispose();
|
|
434
|
+
};
|
|
435
|
+
}, []);
|
|
436
|
+
React.useEffect(() => {
|
|
437
|
+
if (!dockviewRef.current) {
|
|
438
|
+
return () => {
|
|
439
|
+
// noop
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
const disposable = dockviewRef.current.onDidDrop((event) => {
|
|
443
|
+
if (props.onDidDrop) {
|
|
444
|
+
props.onDidDrop(event);
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
return () => {
|
|
448
|
+
disposable.dispose();
|
|
449
|
+
};
|
|
450
|
+
}, [props.onDidDrop]);
|
|
451
|
+
React.useEffect(() => {
|
|
452
|
+
if (!dockviewRef.current) {
|
|
453
|
+
return () => {
|
|
454
|
+
// noop
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
const disposable = dockviewRef.current.onWillDrop((event) => {
|
|
458
|
+
if (props.onWillDrop) {
|
|
459
|
+
props.onWillDrop(event);
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
return () => {
|
|
463
|
+
disposable.dispose();
|
|
464
|
+
};
|
|
465
|
+
}, [props.onWillDrop]);
|
|
466
|
+
React.useEffect(() => {
|
|
467
|
+
if (!dockviewRef.current) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
dockviewRef.current.updateOptions({
|
|
471
|
+
createComponent: (options) => {
|
|
472
|
+
return new ReactPanelContentPart(options.id, props.components[options.name], {
|
|
473
|
+
addPortal,
|
|
474
|
+
});
|
|
475
|
+
},
|
|
476
|
+
});
|
|
477
|
+
}, [props.components]);
|
|
478
|
+
React.useEffect(() => {
|
|
479
|
+
var _a;
|
|
480
|
+
if (!dockviewRef.current) {
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const frameworkTabComponents = (_a = props.tabComponents) !== null && _a !== void 0 ? _a : {};
|
|
484
|
+
if (props.defaultTabComponent) {
|
|
485
|
+
frameworkTabComponents[DEFAULT_REACT_TAB] =
|
|
486
|
+
props.defaultTabComponent;
|
|
487
|
+
}
|
|
488
|
+
dockviewRef.current.updateOptions({
|
|
489
|
+
defaultTabComponent: props.defaultTabComponent
|
|
490
|
+
? DEFAULT_REACT_TAB
|
|
491
|
+
: undefined,
|
|
492
|
+
createTabComponent(options) {
|
|
493
|
+
return new ReactPanelHeaderPart(options.id, frameworkTabComponents[options.name], {
|
|
494
|
+
addPortal,
|
|
495
|
+
});
|
|
496
|
+
},
|
|
497
|
+
});
|
|
498
|
+
}, [props.tabComponents, props.defaultTabComponent]);
|
|
499
|
+
React.useEffect(() => {
|
|
500
|
+
if (!dockviewRef.current) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
dockviewRef.current.updateOptions({
|
|
504
|
+
createWatermarkComponent: props.watermarkComponent
|
|
505
|
+
? () => {
|
|
506
|
+
return new ReactWatermarkPart('watermark', props.watermarkComponent, {
|
|
507
|
+
addPortal,
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
: undefined,
|
|
511
|
+
});
|
|
512
|
+
}, [props.watermarkComponent]);
|
|
513
|
+
React.useEffect(() => {
|
|
514
|
+
if (!dockviewRef.current) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
dockviewRef.current.updateOptions({
|
|
518
|
+
createRightHeaderActionComponent: createGroupControlElement(props.rightHeaderActionsComponent, { addPortal }),
|
|
519
|
+
});
|
|
520
|
+
}, [props.rightHeaderActionsComponent]);
|
|
521
|
+
React.useEffect(() => {
|
|
522
|
+
if (!dockviewRef.current) {
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
dockviewRef.current.updateOptions({
|
|
526
|
+
createLeftHeaderActionComponent: createGroupControlElement(props.leftHeaderActionsComponent, { addPortal }),
|
|
527
|
+
});
|
|
528
|
+
}, [props.leftHeaderActionsComponent]);
|
|
529
|
+
React.useEffect(() => {
|
|
530
|
+
if (!dockviewRef.current) {
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
dockviewRef.current.updateOptions({
|
|
534
|
+
createPrefixHeaderActionComponent: createGroupControlElement(props.prefixHeaderActionsComponent, { addPortal }),
|
|
535
|
+
});
|
|
536
|
+
}, [props.prefixHeaderActionsComponent]);
|
|
537
|
+
return (React.createElement("div", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));
|
|
538
|
+
});
|
|
539
|
+
DockviewReact.displayName = 'DockviewComponent';
|
|
540
|
+
|
|
541
|
+
/******************************************************************************
|
|
542
|
+
Copyright (c) Microsoft Corporation.
|
|
543
|
+
|
|
544
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
545
|
+
purpose with or without fee is hereby granted.
|
|
546
|
+
|
|
547
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
548
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
549
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
550
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
551
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
552
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
553
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
554
|
+
***************************************************************************** */
|
|
555
|
+
/* global Reflect, Promise, SuppressedError, Symbol */
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
function __rest(s, e) {
|
|
559
|
+
var t = {};
|
|
560
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
561
|
+
t[p] = s[p];
|
|
562
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
563
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
564
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
565
|
+
t[p[i]] = s[p[i]];
|
|
566
|
+
}
|
|
567
|
+
return t;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
571
|
+
var e = new Error(message);
|
|
572
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
const CloseButton = () => (React.createElement("svg", { height: "11", width: "11", viewBox: "0 0 28 28", "aria-hidden": 'false', focusable: false, className: "dv-svg" },
|
|
576
|
+
React.createElement("path", { d: "M2.1 27.3L0 25.2L11.55 13.65L0 2.1L2.1 0L13.65 11.55L25.2 0L27.3 2.1L15.75 13.65L27.3 25.2L25.2 27.3L13.65 15.75L2.1 27.3Z" })));
|
|
577
|
+
|
|
578
|
+
function useTitle(api) {
|
|
579
|
+
const [title, setTitle] = React.useState(api.title);
|
|
580
|
+
React.useEffect(() => {
|
|
581
|
+
const disposable = api.onDidTitleChange((event) => {
|
|
582
|
+
setTitle(event.title);
|
|
583
|
+
});
|
|
584
|
+
// Depending on the order in which React effects are run, the title may already be out of sync (cf. issue #1003).
|
|
585
|
+
if (title !== api.title) {
|
|
586
|
+
setTitle(api.title);
|
|
587
|
+
}
|
|
588
|
+
return () => {
|
|
589
|
+
disposable.dispose();
|
|
590
|
+
};
|
|
591
|
+
}, [api]);
|
|
592
|
+
return title;
|
|
593
|
+
}
|
|
594
|
+
const DockviewDefaultTab = (_a) => {
|
|
595
|
+
var { api, containerApi: _containerApi, params: _params, hideClose, closeActionOverride, onPointerDown, onPointerUp, onPointerLeave, tabLocation } = _a, rest = __rest(_a, ["api", "containerApi", "params", "hideClose", "closeActionOverride", "onPointerDown", "onPointerUp", "onPointerLeave", "tabLocation"]);
|
|
596
|
+
const title = useTitle(api);
|
|
597
|
+
const isMiddleMouseButton = React.useRef(false);
|
|
598
|
+
const onClose = React.useCallback((event) => {
|
|
599
|
+
event.preventDefault();
|
|
600
|
+
if (closeActionOverride) {
|
|
601
|
+
closeActionOverride();
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
api.close();
|
|
605
|
+
}
|
|
606
|
+
}, [api, closeActionOverride]);
|
|
607
|
+
const onBtnPointerDown = React.useCallback((event) => {
|
|
608
|
+
event.preventDefault();
|
|
609
|
+
}, []);
|
|
610
|
+
const _onPointerDown = React.useCallback((event) => {
|
|
611
|
+
isMiddleMouseButton.current = event.button === 1;
|
|
612
|
+
onPointerDown === null || onPointerDown === void 0 ? void 0 : onPointerDown(event);
|
|
613
|
+
}, [onPointerDown]);
|
|
614
|
+
const _onPointerUp = React.useCallback((event) => {
|
|
615
|
+
if (isMiddleMouseButton && event.button === 1 && !hideClose) {
|
|
616
|
+
isMiddleMouseButton.current = false;
|
|
617
|
+
onClose(event);
|
|
618
|
+
}
|
|
619
|
+
onPointerUp === null || onPointerUp === void 0 ? void 0 : onPointerUp(event);
|
|
620
|
+
}, [onPointerUp, onClose, hideClose]);
|
|
621
|
+
const _onPointerLeave = React.useCallback((event) => {
|
|
622
|
+
isMiddleMouseButton.current = false;
|
|
623
|
+
onPointerLeave === null || onPointerLeave === void 0 ? void 0 : onPointerLeave(event);
|
|
624
|
+
}, [onPointerLeave]);
|
|
625
|
+
return (React.createElement("div", Object.assign({ "data-testid": "dockview-dv-default-tab" }, rest, { onPointerDown: _onPointerDown, onPointerUp: _onPointerUp, onPointerLeave: _onPointerLeave, className: "dv-default-tab" }),
|
|
626
|
+
React.createElement("span", { className: "dv-default-tab-content" }, title),
|
|
627
|
+
!hideClose && (React.createElement("div", { className: "dv-default-tab-action", onPointerDown: onBtnPointerDown, onClick: onClose },
|
|
628
|
+
React.createElement(CloseButton, null)))));
|
|
629
|
+
};
|
|
630
|
+
|
|
631
|
+
class ReactPanelView extends SplitviewPanel {
|
|
632
|
+
constructor(id, component, reactComponent, reactPortalStore) {
|
|
633
|
+
super(id, component);
|
|
634
|
+
this.reactComponent = reactComponent;
|
|
635
|
+
this.reactPortalStore = reactPortalStore;
|
|
636
|
+
}
|
|
637
|
+
getComponent() {
|
|
638
|
+
var _a, _b;
|
|
639
|
+
return new ReactPart(this.element, this.reactPortalStore, this.reactComponent, {
|
|
640
|
+
params: (_b = (_a = this._params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {},
|
|
641
|
+
api: this.api,
|
|
642
|
+
containerApi: new SplitviewApi(this._params.accessor),
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
function extractCoreOptions$2(props) {
|
|
648
|
+
const coreOptions = PROPERTY_KEYS_SPLITVIEW.reduce((obj, key) => {
|
|
649
|
+
if (key in props) {
|
|
650
|
+
obj[key] = props[key];
|
|
651
|
+
}
|
|
652
|
+
return obj;
|
|
653
|
+
}, {});
|
|
654
|
+
return coreOptions;
|
|
655
|
+
}
|
|
656
|
+
const SplitviewReact = React.forwardRef((props, ref) => {
|
|
657
|
+
const domRef = React.useRef(null);
|
|
658
|
+
const splitviewRef = React.useRef();
|
|
659
|
+
const [portals, addPortal] = usePortalsLifecycle();
|
|
660
|
+
React.useImperativeHandle(ref, () => domRef.current, []);
|
|
661
|
+
const prevProps = React.useRef({});
|
|
662
|
+
React.useEffect(() => {
|
|
663
|
+
const changes = {};
|
|
664
|
+
PROPERTY_KEYS_SPLITVIEW.forEach((propKey) => {
|
|
665
|
+
const key = propKey;
|
|
666
|
+
const propValue = props[key];
|
|
667
|
+
if (key in props && propValue !== prevProps.current[key]) {
|
|
668
|
+
changes[key] = propValue;
|
|
669
|
+
}
|
|
670
|
+
});
|
|
671
|
+
if (splitviewRef.current) {
|
|
672
|
+
splitviewRef.current.updateOptions(changes);
|
|
673
|
+
}
|
|
674
|
+
prevProps.current = props;
|
|
675
|
+
}, PROPERTY_KEYS_SPLITVIEW.map((key) => props[key]));
|
|
676
|
+
React.useEffect(() => {
|
|
677
|
+
if (!domRef.current) {
|
|
678
|
+
return () => {
|
|
679
|
+
// noop
|
|
680
|
+
};
|
|
681
|
+
}
|
|
682
|
+
const frameworkOptions = {
|
|
683
|
+
createComponent: (options) => {
|
|
684
|
+
return new ReactPanelView(options.id, options.name, props.components[options.name], { addPortal });
|
|
685
|
+
},
|
|
686
|
+
};
|
|
687
|
+
const api = createSplitview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions$2(props)), frameworkOptions));
|
|
688
|
+
const { clientWidth, clientHeight } = domRef.current;
|
|
689
|
+
api.layout(clientWidth, clientHeight);
|
|
690
|
+
if (props.onReady) {
|
|
691
|
+
props.onReady({ api });
|
|
692
|
+
}
|
|
693
|
+
splitviewRef.current = api;
|
|
694
|
+
return () => {
|
|
695
|
+
splitviewRef.current = undefined;
|
|
696
|
+
api.dispose();
|
|
697
|
+
};
|
|
698
|
+
}, []);
|
|
699
|
+
React.useEffect(() => {
|
|
700
|
+
if (!splitviewRef.current) {
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
splitviewRef.current.updateOptions({
|
|
704
|
+
createComponent: (options) => {
|
|
705
|
+
return new ReactPanelView(options.id, options.name, props.components[options.name], { addPortal });
|
|
706
|
+
},
|
|
707
|
+
});
|
|
708
|
+
}, [props.components]);
|
|
709
|
+
return (React.createElement("div", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));
|
|
710
|
+
});
|
|
711
|
+
SplitviewReact.displayName = 'SplitviewComponent';
|
|
712
|
+
|
|
713
|
+
class ReactGridPanelView extends GridviewPanel {
|
|
714
|
+
constructor(id, component, reactComponent, reactPortalStore) {
|
|
715
|
+
super(id, component);
|
|
716
|
+
this.reactComponent = reactComponent;
|
|
717
|
+
this.reactPortalStore = reactPortalStore;
|
|
718
|
+
}
|
|
719
|
+
getComponent() {
|
|
720
|
+
var _a, _b;
|
|
721
|
+
return new ReactPart(this.element, this.reactPortalStore, this.reactComponent, {
|
|
722
|
+
params: (_b = (_a = this._params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {},
|
|
723
|
+
api: this.api,
|
|
724
|
+
// TODO: fix casting hack
|
|
725
|
+
containerApi: new GridviewApi(this._params
|
|
726
|
+
.accessor),
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
function extractCoreOptions$1(props) {
|
|
732
|
+
const coreOptions = PROPERTY_KEYS_GRIDVIEW.reduce((obj, key) => {
|
|
733
|
+
if (key in props) {
|
|
734
|
+
obj[key] = props[key];
|
|
735
|
+
}
|
|
736
|
+
return obj;
|
|
737
|
+
}, {});
|
|
738
|
+
return coreOptions;
|
|
739
|
+
}
|
|
740
|
+
const GridviewReact = React.forwardRef((props, ref) => {
|
|
741
|
+
const domRef = React.useRef(null);
|
|
742
|
+
const gridviewRef = React.useRef();
|
|
743
|
+
const [portals, addPortal] = usePortalsLifecycle();
|
|
744
|
+
React.useImperativeHandle(ref, () => domRef.current, []);
|
|
745
|
+
const prevProps = React.useRef({});
|
|
746
|
+
React.useEffect(() => {
|
|
747
|
+
const changes = {};
|
|
748
|
+
PROPERTY_KEYS_GRIDVIEW.forEach((propKey) => {
|
|
749
|
+
const key = propKey;
|
|
750
|
+
const propValue = props[key];
|
|
751
|
+
if (key in props && propValue !== prevProps.current[key]) {
|
|
752
|
+
changes[key] = propValue;
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
if (gridviewRef.current) {
|
|
756
|
+
gridviewRef.current.updateOptions(changes);
|
|
757
|
+
}
|
|
758
|
+
prevProps.current = props;
|
|
759
|
+
}, PROPERTY_KEYS_GRIDVIEW.map((key) => props[key]));
|
|
760
|
+
React.useEffect(() => {
|
|
761
|
+
if (!domRef.current) {
|
|
762
|
+
return () => {
|
|
763
|
+
// noop
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
const frameworkOptions = {
|
|
767
|
+
createComponent: (options) => {
|
|
768
|
+
return new ReactGridPanelView(options.id, options.name, props.components[options.name], { addPortal });
|
|
769
|
+
},
|
|
770
|
+
};
|
|
771
|
+
const api = createGridview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions$1(props)), frameworkOptions));
|
|
772
|
+
const { clientWidth, clientHeight } = domRef.current;
|
|
773
|
+
api.layout(clientWidth, clientHeight);
|
|
774
|
+
if (props.onReady) {
|
|
775
|
+
props.onReady({ api });
|
|
776
|
+
}
|
|
777
|
+
gridviewRef.current = api;
|
|
778
|
+
return () => {
|
|
779
|
+
gridviewRef.current = undefined;
|
|
780
|
+
api.dispose();
|
|
781
|
+
};
|
|
782
|
+
}, []);
|
|
783
|
+
React.useEffect(() => {
|
|
784
|
+
if (!gridviewRef.current) {
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
gridviewRef.current.updateOptions({
|
|
788
|
+
createComponent: (options) => {
|
|
789
|
+
return new ReactGridPanelView(options.id, options.name, props.components[options.name], { addPortal });
|
|
790
|
+
},
|
|
791
|
+
});
|
|
792
|
+
}, [props.components]);
|
|
793
|
+
return (React.createElement("div", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));
|
|
794
|
+
});
|
|
795
|
+
GridviewReact.displayName = 'GridviewComponent';
|
|
796
|
+
|
|
797
|
+
class PanePanelSection {
|
|
798
|
+
get element() {
|
|
799
|
+
return this._element;
|
|
800
|
+
}
|
|
801
|
+
constructor(id, component, reactPortalStore) {
|
|
802
|
+
this.id = id;
|
|
803
|
+
this.component = component;
|
|
804
|
+
this.reactPortalStore = reactPortalStore;
|
|
805
|
+
this._element = document.createElement('div');
|
|
806
|
+
this._element.style.height = '100%';
|
|
807
|
+
this._element.style.width = '100%';
|
|
808
|
+
}
|
|
809
|
+
init(parameters) {
|
|
810
|
+
this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {
|
|
811
|
+
params: parameters.params,
|
|
812
|
+
api: parameters.api,
|
|
813
|
+
title: parameters.title,
|
|
814
|
+
containerApi: parameters.containerApi,
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
toJSON() {
|
|
818
|
+
return {
|
|
819
|
+
id: this.id,
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
update(params) {
|
|
823
|
+
var _a;
|
|
824
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.update(params.params);
|
|
825
|
+
}
|
|
826
|
+
dispose() {
|
|
827
|
+
var _a;
|
|
828
|
+
(_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
function extractCoreOptions(props) {
|
|
833
|
+
const coreOptions = PROPERTY_KEYS_PANEVIEW.reduce((obj, key) => {
|
|
834
|
+
if (key in props) {
|
|
835
|
+
obj[key] = props[key];
|
|
836
|
+
}
|
|
837
|
+
return obj;
|
|
838
|
+
}, {});
|
|
839
|
+
return coreOptions;
|
|
840
|
+
}
|
|
841
|
+
const PaneviewReact = React.forwardRef((props, ref) => {
|
|
842
|
+
const domRef = React.useRef(null);
|
|
843
|
+
const paneviewRef = React.useRef();
|
|
844
|
+
const [portals, addPortal] = usePortalsLifecycle();
|
|
845
|
+
React.useImperativeHandle(ref, () => domRef.current, []);
|
|
846
|
+
const prevProps = React.useRef({});
|
|
847
|
+
React.useEffect(() => {
|
|
848
|
+
const changes = {};
|
|
849
|
+
PROPERTY_KEYS_PANEVIEW.forEach((propKey) => {
|
|
850
|
+
const key = propKey;
|
|
851
|
+
const propValue = props[key];
|
|
852
|
+
if (key in props && propValue !== prevProps.current[key]) {
|
|
853
|
+
changes[key] = propValue;
|
|
854
|
+
}
|
|
855
|
+
});
|
|
856
|
+
if (paneviewRef.current) {
|
|
857
|
+
paneviewRef.current.updateOptions(changes);
|
|
858
|
+
}
|
|
859
|
+
prevProps.current = props;
|
|
860
|
+
}, PROPERTY_KEYS_PANEVIEW.map((key) => props[key]));
|
|
861
|
+
React.useEffect(() => {
|
|
862
|
+
var _a;
|
|
863
|
+
if (!domRef.current) {
|
|
864
|
+
return () => {
|
|
865
|
+
// noop
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
const headerComponents = (_a = props.headerComponents) !== null && _a !== void 0 ? _a : {};
|
|
869
|
+
const frameworkOptions = {
|
|
870
|
+
createComponent: (options) => {
|
|
871
|
+
return new PanePanelSection(options.id, props.components[options.name], { addPortal });
|
|
872
|
+
},
|
|
873
|
+
createHeaderComponent: (options) => {
|
|
874
|
+
return new PanePanelSection(options.id, headerComponents[options.name], { addPortal });
|
|
875
|
+
},
|
|
876
|
+
};
|
|
877
|
+
const api = createPaneview(domRef.current, Object.assign(Object.assign({}, extractCoreOptions(props)), frameworkOptions));
|
|
878
|
+
const { clientWidth, clientHeight } = domRef.current;
|
|
879
|
+
api.layout(clientWidth, clientHeight);
|
|
880
|
+
if (props.onReady) {
|
|
881
|
+
props.onReady({ api });
|
|
882
|
+
}
|
|
883
|
+
paneviewRef.current = api;
|
|
884
|
+
return () => {
|
|
885
|
+
paneviewRef.current = undefined;
|
|
886
|
+
api.dispose();
|
|
887
|
+
};
|
|
888
|
+
}, []);
|
|
889
|
+
React.useEffect(() => {
|
|
890
|
+
if (!paneviewRef.current) {
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
893
|
+
paneviewRef.current.updateOptions({
|
|
894
|
+
createComponent: (options) => {
|
|
895
|
+
return new PanePanelSection(options.id, props.components[options.name], { addPortal });
|
|
896
|
+
},
|
|
897
|
+
});
|
|
898
|
+
}, [props.components]);
|
|
899
|
+
React.useEffect(() => {
|
|
900
|
+
var _a;
|
|
901
|
+
if (!paneviewRef.current) {
|
|
902
|
+
return;
|
|
903
|
+
}
|
|
904
|
+
const headerComponents = (_a = props.headerComponents) !== null && _a !== void 0 ? _a : {};
|
|
905
|
+
paneviewRef.current.updateOptions({
|
|
906
|
+
createHeaderComponent: (options) => {
|
|
907
|
+
return new PanePanelSection(options.id, headerComponents[options.name], { addPortal });
|
|
908
|
+
},
|
|
909
|
+
});
|
|
910
|
+
}, [props.headerComponents]);
|
|
911
|
+
React.useEffect(() => {
|
|
912
|
+
if (!paneviewRef.current) {
|
|
913
|
+
return () => {
|
|
914
|
+
// noop
|
|
915
|
+
};
|
|
916
|
+
}
|
|
917
|
+
const disposable = paneviewRef.current.onDidDrop((event) => {
|
|
918
|
+
if (props.onDidDrop) {
|
|
919
|
+
props.onDidDrop(event);
|
|
920
|
+
}
|
|
921
|
+
});
|
|
922
|
+
return () => {
|
|
923
|
+
disposable.dispose();
|
|
924
|
+
};
|
|
925
|
+
}, [props.onDidDrop]);
|
|
926
|
+
return (React.createElement("div", { style: { height: '100%', width: '100%' }, ref: domRef }, portals));
|
|
927
|
+
});
|
|
928
|
+
PaneviewReact.displayName = 'PaneviewComponent';
|
|
929
|
+
|
|
930
|
+
export { DockviewDefaultTab, DockviewReact, GridviewReact, PaneviewReact, ReactPart, ReactPartContext, SplitviewReact, isReactComponent, usePortalsLifecycle };
|