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.
@@ -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 };