dockview-core 6.2.2 → 6.4.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 +1 -0
- package/dist/cjs/api/dockviewGroupPanelApi.d.ts +10 -1
- package/dist/cjs/api/dockviewGroupPanelApi.js +16 -0
- package/dist/cjs/dnd/backend.d.ts +70 -0
- package/dist/cjs/dnd/backend.js +171 -0
- package/dist/cjs/dnd/dropOverlay.d.ts +20 -0
- package/dist/cjs/dnd/dropOverlay.js +197 -0
- package/dist/cjs/dnd/droptarget.d.ts +20 -6
- package/dist/cjs/dnd/droptarget.js +14 -208
- package/dist/cjs/dnd/pointer/index.d.ts +11 -0
- package/dist/cjs/dnd/pointer/index.js +13 -0
- package/dist/cjs/dnd/pointer/longPress.d.ts +32 -0
- package/dist/cjs/dnd/pointer/longPress.js +151 -0
- package/dist/cjs/dnd/pointer/pointerDragController.d.ts +60 -0
- package/dist/cjs/dnd/pointer/pointerDragController.js +241 -0
- package/dist/cjs/dnd/pointer/pointerDragSource.d.ts +61 -0
- package/dist/cjs/dnd/pointer/pointerDragSource.js +195 -0
- package/dist/cjs/dnd/pointer/pointerDropTarget.d.ts +39 -0
- package/dist/cjs/dnd/pointer/pointerDropTarget.js +198 -0
- package/dist/cjs/dnd/pointer/pointerGhost.d.ts +30 -0
- package/dist/cjs/dnd/pointer/pointerGhost.js +44 -0
- package/dist/cjs/dnd/pointer/types.d.ts +16 -0
- package/dist/cjs/dnd/pointer/types.js +2 -0
- package/dist/cjs/dockview/components/panel/content.d.ts +3 -1
- package/dist/cjs/dockview/components/panel/content.js +33 -16
- package/dist/cjs/dockview/components/popupService.js +34 -0
- package/dist/cjs/dockview/components/tab/tab.d.ts +11 -3
- package/dist/cjs/dockview/components/tab/tab.js +151 -117
- package/dist/cjs/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
- package/dist/cjs/dockview/components/titlebar/tabGroupChip.js +15 -6
- package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.js +2 -2
- package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +33 -5
- package/dist/cjs/dockview/components/titlebar/tabGroups.js +231 -40
- package/dist/cjs/dockview/components/titlebar/tabs.d.ts +38 -1
- package/dist/cjs/dockview/components/titlebar/tabs.js +381 -253
- package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +5 -3
- package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +6 -2
- package/dist/cjs/dockview/components/titlebar/voidContainer.js +190 -22
- package/dist/cjs/dockview/contextMenu.js +19 -4
- package/dist/cjs/dockview/dndCapabilities.d.ts +19 -0
- package/dist/cjs/dockview/dndCapabilities.js +39 -0
- package/dist/cjs/dockview/dockviewComponent.d.ts +2 -0
- package/dist/cjs/dockview/dockviewComponent.js +241 -158
- package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +10 -5
- package/dist/cjs/dockview/dockviewGroupPanelModel.js +34 -11
- package/dist/cjs/dockview/dockviewPanel.js +5 -0
- package/dist/cjs/dockview/dockviewPanelModel.d.ts +2 -0
- package/dist/cjs/dockview/dockviewPanelModel.js +8 -0
- package/dist/cjs/dockview/events.d.ts +2 -1
- package/dist/cjs/dockview/events.js +1 -0
- package/dist/cjs/dockview/framework.d.ts +8 -0
- package/dist/cjs/dockview/options.d.ts +31 -5
- package/dist/cjs/dockview/options.js +3 -0
- package/dist/cjs/dom.d.ts +5 -1
- package/dist/cjs/dom.js +21 -5
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/overlay/overlay.d.ts +12 -0
- package/dist/cjs/overlay/overlay.js +84 -16
- package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
- package/dist/cjs/paneview/draggablePaneviewPanel.js +27 -26
- package/dist/cjs/paneview/options.d.ts +4 -3
- package/dist/cjs/popoutWindow.d.ts +2 -0
- package/dist/cjs/popoutWindow.js +3 -1
- package/dist/dockview-core.js +2431 -937
- package/dist/dockview-core.min.js +2 -2
- package/dist/dockview-core.min.js.map +1 -1
- package/dist/dockview-core.min.noStyle.js +2 -2
- package/dist/dockview-core.min.noStyle.js.map +1 -1
- package/dist/dockview-core.noStyle.js +2430 -936
- package/dist/esm/api/dockviewGroupPanelApi.d.ts +10 -1
- package/dist/esm/api/dockviewGroupPanelApi.js +12 -0
- package/dist/esm/dnd/backend.d.ts +70 -0
- package/dist/esm/dnd/backend.js +148 -0
- package/dist/esm/dnd/dropOverlay.d.ts +20 -0
- package/dist/esm/dnd/dropOverlay.js +192 -0
- package/dist/esm/dnd/droptarget.d.ts +20 -6
- package/dist/esm/dnd/droptarget.js +16 -210
- package/dist/esm/dnd/pointer/index.d.ts +11 -0
- package/dist/esm/dnd/pointer/index.js +5 -0
- package/dist/esm/dnd/pointer/longPress.d.ts +32 -0
- package/dist/esm/dnd/pointer/longPress.js +127 -0
- package/dist/esm/dnd/pointer/pointerDragController.d.ts +60 -0
- package/dist/esm/dnd/pointer/pointerDragController.js +191 -0
- package/dist/esm/dnd/pointer/pointerDragSource.d.ts +61 -0
- package/dist/esm/dnd/pointer/pointerDragSource.js +171 -0
- package/dist/esm/dnd/pointer/pointerDropTarget.d.ts +39 -0
- package/dist/esm/dnd/pointer/pointerDropTarget.js +168 -0
- package/dist/esm/dnd/pointer/pointerGhost.d.ts +30 -0
- package/dist/esm/dnd/pointer/pointerGhost.js +39 -0
- package/dist/esm/dnd/pointer/types.d.ts +16 -0
- package/dist/esm/dnd/pointer/types.js +1 -0
- package/dist/esm/dockview/components/panel/content.d.ts +3 -1
- package/dist/esm/dockview/components/panel/content.js +33 -16
- package/dist/esm/dockview/components/popupService.js +34 -0
- package/dist/esm/dockview/components/tab/tab.d.ts +11 -3
- package/dist/esm/dockview/components/tab/tab.js +139 -114
- package/dist/esm/dockview/components/titlebar/tabGroupChip.d.ts +9 -2
- package/dist/esm/dockview/components/titlebar/tabGroupChip.js +15 -6
- package/dist/esm/dockview/components/titlebar/tabGroupIndicator.js +2 -2
- package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +33 -5
- package/dist/esm/dockview/components/titlebar/tabGroups.js +177 -12
- package/dist/esm/dockview/components/titlebar/tabs.d.ts +38 -1
- package/dist/esm/dockview/components/titlebar/tabs.js +360 -229
- package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +5 -3
- package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +6 -2
- package/dist/esm/dockview/components/titlebar/voidContainer.js +180 -26
- package/dist/esm/dockview/contextMenu.js +19 -4
- package/dist/esm/dockview/dndCapabilities.d.ts +19 -0
- package/dist/esm/dockview/dndCapabilities.js +36 -0
- package/dist/esm/dockview/dockviewComponent.d.ts +2 -0
- package/dist/esm/dockview/dockviewComponent.js +104 -41
- package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +10 -5
- package/dist/esm/dockview/dockviewGroupPanelModel.js +33 -11
- package/dist/esm/dockview/dockviewPanel.js +5 -0
- package/dist/esm/dockview/dockviewPanelModel.d.ts +2 -0
- package/dist/esm/dockview/dockviewPanelModel.js +8 -0
- package/dist/esm/dockview/events.d.ts +2 -1
- package/dist/esm/dockview/events.js +1 -0
- package/dist/esm/dockview/framework.d.ts +8 -0
- package/dist/esm/dockview/options.d.ts +31 -5
- package/dist/esm/dockview/options.js +3 -0
- package/dist/esm/dom.d.ts +5 -1
- package/dist/esm/dom.js +20 -5
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/overlay/overlay.d.ts +12 -0
- package/dist/esm/overlay/overlay.js +85 -17
- package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
- package/dist/esm/paneview/draggablePaneviewPanel.js +26 -20
- package/dist/esm/paneview/options.d.ts +4 -3
- package/dist/esm/popoutWindow.d.ts +2 -0
- package/dist/esm/popoutWindow.js +3 -1
- package/dist/package/main.cjs.js +2430 -936
- package/dist/package/main.cjs.min.js +2 -2
- package/dist/package/main.esm.min.mjs +2 -2
- package/dist/package/main.esm.mjs +2430 -936
- package/dist/styles/dockview.css +117 -1
- package/package.json +3 -1
- package/dist/cjs/dnd/abstractDragHandler.d.ts +0 -14
- package/dist/cjs/dnd/abstractDragHandler.js +0 -86
- package/dist/cjs/dnd/groupDragHandler.d.ts +0 -12
- package/dist/cjs/dnd/groupDragHandler.js +0 -82
- package/dist/esm/dnd/abstractDragHandler.d.ts +0 -14
- package/dist/esm/dnd/abstractDragHandler.js +0 -63
- package/dist/esm/dnd/groupDragHandler.d.ts +0 -12
- package/dist/esm/dnd/groupDragHandler.js +0 -59
package/dist/dockview-core.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* dockview-core
|
|
3
|
-
* @version 6.
|
|
3
|
+
* @version 6.4.0
|
|
4
4
|
* @link https://github.com/mathuo/dockview
|
|
5
5
|
* @license MIT
|
|
6
6
|
*/
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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.dockview-theme-dark {\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\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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.dockview-theme-light {\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 --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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 {\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-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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.dockview-theme-abyss {\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\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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 {\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-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-nord {\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-nord .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-nord {\n --dv-color-nord-polar-0: #2e3440;\n --dv-color-nord-polar-1: #3b4252;\n --dv-color-nord-polar-2: #434c5e;\n --dv-color-nord-polar-3: #4c566a;\n --dv-color-nord-frost: #88c0d0;\n --dv-color-nord-frost-2: #81a1c1;\n --dv-color-nord-snow-0: #eceff4;\n --dv-color-nord-snow-1: #d8dee9;\n --dv-group-view-background-color: var(--dv-color-nord-polar-0);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-0\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-nord-snow-0);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-nord-snow-1);\n --dv-inactivegroup-visiblepanel-tab-color: #8a9bbf;\n --dv-inactivegroup-hiddenpanel-tab-color: #5e6f8e;\n --dv-separator-border: var(--dv-color-nord-polar-3);\n --dv-paneview-active-outline-color: var(--dv-color-nord-frost);\n --dv-active-sash-color: var(--dv-color-nord-frost);\n --dv-scrollbar-background-color: rgba(76, 86, 106, 0.5);\n}\n.dockview-theme-nord .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-nord .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 bottom: 0px;\n content: \"\";\n width: 100%;\n height: 2px;\n background-color: var(--dv-color-nord-frost);\n z-index: 999;\n}\n.dockview-theme-nord .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-nord .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: 2px;\n background-color: var(--dv-color-nord-frost-2);\n z-index: 999;\n}\n\n.dockview-theme-nord-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-nord-spaced {\n padding: 0;\n}\n.dockview-theme-nord-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-nord-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-nord-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-nord-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-nord-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-nord-spaced .dv-tabs-overflow-container,\n.dockview-theme-nord-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-nord-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-nord-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-nord-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-nord-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-nord-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-nord-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced {\n --dv-color-nord-polar-0: #2e3440;\n --dv-color-nord-polar-1: #3b4252;\n --dv-color-nord-polar-2: #434c5e;\n --dv-color-nord-polar-3: #4c566a;\n --dv-color-nord-frost: #88c0d0;\n --dv-color-nord-frost-2: #81a1c1;\n --dv-color-nord-snow-0: #eceff4;\n --dv-color-nord-snow-1: #d8dee9;\n --dv-group-view-background-color: var(--dv-color-nord-polar-0);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-nord-snow-0);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-nord-snow-1);\n --dv-inactivegroup-visiblepanel-tab-color: #8a9bbf;\n --dv-inactivegroup-hiddenpanel-tab-color: #5e6f8e;\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-nord-frost);\n --dv-active-sash-color: var(--dv-color-nord-frost);\n --dv-scrollbar-background-color: rgba(76, 86, 106, 0.5);\n --dv-floating-group-border: 2px solid var(--dv-color-nord-polar-0);\n}\n\n.dockview-theme-catppuccin-mocha {\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-catppuccin-mocha .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-catppuccin-mocha {\n --dv-color-mocha-crust: #11111b;\n --dv-color-mocha-mantle: #181825;\n --dv-color-mocha-base: #1e1e2e;\n --dv-color-mocha-surface0: #313244;\n --dv-color-mocha-surface1: #45475a;\n --dv-color-mocha-text: #cdd6f4;\n --dv-color-mocha-subtext1: #bac2de;\n --dv-color-mocha-subtext0: #a6adc8;\n --dv-color-mocha-mauve: #cba6f7;\n --dv-color-mocha-lavender: #b4befe;\n --dv-group-view-background-color: var(--dv-color-mocha-base);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-base\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-surface0\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-crust\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-mocha-text);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-mocha-subtext1);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-mocha-subtext0);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(166, 173, 200, 0.5);\n --dv-separator-border: var(--dv-color-mocha-surface1);\n --dv-paneview-active-outline-color: var(--dv-color-mocha-mauve);\n --dv-active-sash-color: var(--dv-color-mocha-mauve);\n --dv-scrollbar-background-color: rgba(49, 50, 68, 0.8);\n}\n.dockview-theme-catppuccin-mocha .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-catppuccin-mocha .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: 2px;\n background-color: var(--dv-color-mocha-mauve);\n z-index: 999;\n}\n.dockview-theme-catppuccin-mocha .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-catppuccin-mocha .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 top: 0px;\n content: \"\";\n width: 100%;\n height: 2px;\n background-color: rgba(180, 190, 254, 0.4);\n z-index: 999;\n}\n\n.dockview-theme-catppuccin-mocha-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-catppuccin-mocha-spaced {\n padding: 0;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tabs-overflow-container,\n.dockview-theme-catppuccin-mocha-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced {\n --dv-color-mocha-crust: #11111b;\n --dv-color-mocha-mantle: #181825;\n --dv-color-mocha-base: #1e1e2e;\n --dv-color-mocha-surface0: #313244;\n --dv-color-mocha-surface1: #45475a;\n --dv-color-mocha-text: #cdd6f4;\n --dv-color-mocha-subtext1: #bac2de;\n --dv-color-mocha-subtext0: #a6adc8;\n --dv-color-mocha-mauve: #cba6f7;\n --dv-color-mocha-lavender: #b4befe;\n --dv-group-view-background-color: var(--dv-color-mocha-crust);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-surface0\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-surface0\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-mocha-text);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-mocha-subtext1);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-mocha-subtext0);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(166, 173, 200, 0.5);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-mocha-mauve);\n --dv-active-sash-color: var(--dv-color-mocha-mauve);\n --dv-scrollbar-background-color: rgba(49, 50, 68, 0.8);\n --dv-floating-group-border: 2px solid var(--dv-color-mocha-crust);\n}\n\n.dockview-theme-monokai {\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-monokai .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-monokai {\n --dv-color-monokai-bg: #272822;\n --dv-color-monokai-bg-light: #3e3d32;\n --dv-color-monokai-comment: #75715e;\n --dv-color-monokai-fg: #f8f8f2;\n --dv-color-monokai-green: #a6e22e;\n --dv-group-view-background-color: var(--dv-color-monokai-bg);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-monokai-bg-light\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-monokai-bg\n );\n --dv-activegroup-hiddenpanel-tab-background-color: #2d2c25;\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-monokai-bg\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: #2d2c25;\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-monokai-fg);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-monokai-comment);\n --dv-inactivegroup-visiblepanel-tab-color: rgba(248, 248, 242, 0.5);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(117, 113, 94, 0.5);\n --dv-separator-border: var(--dv-color-monokai-bg-light);\n --dv-paneview-active-outline-color: var(--dv-color-monokai-green);\n --dv-active-sash-color: var(--dv-color-monokai-green);\n --dv-scrollbar-background-color: rgba(117, 113, 94, 0.5);\n}\n.dockview-theme-monokai .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-monokai .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 bottom: 0px;\n content: \"\";\n width: 100%;\n height: 2px;\n background-color: var(--dv-color-monokai-green);\n z-index: 999;\n}\n.dockview-theme-monokai .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-monokai .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: 2px;\n background-color: rgba(166, 226, 46, 0.35);\n z-index: 999;\n}\n\n.dockview-theme-solarized-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-solarized-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-solarized-light {\n --dv-color-sol-base3: #fdf6e3;\n --dv-color-sol-base2: #eee8d5;\n --dv-color-sol-base1: #93a1a1;\n --dv-color-sol-base00: #657b83;\n --dv-color-sol-base01: #586e75;\n --dv-color-sol-blue: #268bd2;\n --dv-group-view-background-color: var(--dv-color-sol-base3);\n --dv-tabs-and-actions-container-background-color: var(--dv-color-sol-base2);\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-activegroup-hiddenpanel-tab-background-color: #e8e2d0;\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: #e8e2d0;\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-sol-base01);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-sol-base00);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-sol-base1);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(147, 161, 161, 0.6);\n --dv-separator-border: var(--dv-color-sol-base2);\n --dv-paneview-active-outline-color: var(--dv-color-sol-blue);\n --dv-active-sash-color: var(--dv-color-sol-blue);\n --dv-scrollbar-background-color: rgba(101, 123, 131, 0.25);\n --dv-drag-over-background-color: rgba(38, 139, 210, 0.15);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.dockview-theme-solarized-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-solarized-light-spaced {\n padding: 0;\n}\n.dockview-theme-solarized-light-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-solarized-light-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-solarized-light-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-solarized-light-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-solarized-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-solarized-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-solarized-light-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-solarized-light-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-solarized-light-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-solarized-light-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-solarized-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced {\n --dv-color-sol-base3: #fdf6e3;\n --dv-color-sol-base2: #eee8d5;\n --dv-color-sol-base1: #93a1a1;\n --dv-color-sol-base00: #657b83;\n --dv-color-sol-base01: #586e75;\n --dv-color-sol-blue: #268bd2;\n --dv-drag-over-background-color: rgba(38, 139, 210, 0.1);\n --dv-group-view-background-color: var(--dv-color-sol-base2);\n --dv-tabs-and-actions-container-background-color: var(--dv-color-sol-base3);\n --dv-activegroup-visiblepanel-tab-background-color: #e8e2d0;\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: #e8e2d0;\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-sol-base01);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-sol-base00);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-sol-base1);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(147, 161, 161, 0.6);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-sol-blue);\n --dv-active-sash-color: var(--dv-color-sol-blue);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n --dv-scrollbar-background-color: rgba(101, 123, 131, 0.25);\n --dv-floating-group-border: 2px solid rgba(238, 232, 213, 0.5);\n}\n\n.dockview-theme-github-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-github-dark .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-github-dark {\n --dv-color-gh-canvas-default: #0d1117;\n --dv-color-gh-canvas-subtle: #161b22;\n --dv-color-gh-canvas-inset: #010409;\n --dv-color-gh-border: #30363d;\n --dv-color-gh-border-muted: #21262d;\n --dv-color-gh-fg-default: #e6edf3;\n --dv-color-gh-fg-muted: #8b949e;\n --dv-color-gh-fg-subtle: #6e7681;\n --dv-color-gh-accent: #58a6ff;\n --dv-group-view-background-color: var(--dv-color-gh-canvas-default);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-canvas-default\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-canvas-default\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-default);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-subtle);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.5);\n --dv-separator-border: var(--dv-color-gh-border);\n --dv-paneview-active-outline-color: var(--dv-color-gh-accent);\n --dv-active-sash-color: var(--dv-color-gh-accent);\n --dv-scrollbar-background-color: rgba(48, 54, 61, 0.7);\n --dv-drag-over-background-color: rgba(88, 166, 255, 0.15);\n}\n\n.dockview-theme-github-dark-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-github-dark-spaced {\n padding: 0;\n}\n.dockview-theme-github-dark-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-github-dark-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-github-dark-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-github-dark-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-github-dark-spaced .dv-tabs-overflow-container,\n.dockview-theme-github-dark-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-github-dark-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-github-dark-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-github-dark-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-github-dark-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-github-dark-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced {\n --dv-color-gh-canvas-default: #0d1117;\n --dv-color-gh-canvas-subtle: #161b22;\n --dv-color-gh-canvas-inset: #010409;\n --dv-color-gh-border: #30363d;\n --dv-color-gh-border-muted: #21262d;\n --dv-color-gh-fg-default: #e6edf3;\n --dv-color-gh-fg-muted: #8b949e;\n --dv-color-gh-fg-subtle: #6e7681;\n --dv-color-gh-accent: #58a6ff;\n --dv-drag-over-background-color: rgba(88, 166, 255, 0.1);\n --dv-group-view-background-color: var(--dv-color-gh-canvas-inset);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-border\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-border\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-default);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-subtle);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.5);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-gh-accent);\n --dv-active-sash-color: var(--dv-color-gh-accent);\n --dv-scrollbar-background-color: rgba(48, 54, 61, 0.7);\n --dv-floating-group-border: 2px solid var(--dv-color-gh-canvas-inset);\n}\n\n.dockview-theme-github-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-github-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-github-light {\n --dv-color-gh-light-canvas-default: #ffffff;\n --dv-color-gh-light-canvas-subtle: #f6f8fa;\n --dv-color-gh-light-canvas-inset: #f0f6ff;\n --dv-color-gh-light-border: #d0d7de;\n --dv-color-gh-light-fg-default: #1f2328;\n --dv-color-gh-light-fg-muted: #656d76;\n --dv-color-gh-light-fg-subtle: #6e7781;\n --dv-color-gh-light-accent: #0969da;\n --dv-group-view-background-color: var(--dv-color-gh-light-canvas-default);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-light-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-subtle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-default\n );\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-light-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-subtle\n );\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.4);\n --dv-separator-border: var(--dv-color-gh-light-border);\n --dv-paneview-active-outline-color: var(--dv-color-gh-light-accent);\n --dv-active-sash-color: var(--dv-color-gh-light-accent);\n --dv-scrollbar-background-color: rgba(208, 215, 222, 0.5);\n --dv-drag-over-background-color: rgba(9, 105, 218, 0.1);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.dockview-theme-github-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-github-light-spaced {\n padding: 0;\n}\n.dockview-theme-github-light-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-github-light-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-github-light-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-github-light-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-github-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-github-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-github-light-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-github-light-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-github-light-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-github-light-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-github-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced {\n --dv-color-gh-light-canvas-default: #ffffff;\n --dv-color-gh-light-canvas-subtle: #f6f8fa;\n --dv-color-gh-light-border: #d0d7de;\n --dv-color-gh-light-fg-default: #1f2328;\n --dv-color-gh-light-fg-muted: #656d76;\n --dv-color-gh-light-fg-subtle: #6e7781;\n --dv-color-gh-light-accent: #0969da;\n --dv-drag-over-background-color: rgba(9, 105, 218, 0.08);\n --dv-group-view-background-color: var(--dv-color-gh-light-canvas-subtle);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-border\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-border\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-activegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-default\n );\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-light-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-subtle\n );\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.4);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-gh-light-accent);\n --dv-active-sash-color: var(--dv-color-gh-light-accent);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n --dv-scrollbar-background-color: rgba(208, 215, 222, 0.5);\n --dv-floating-group-border: 2px solid rgba(208, 215, 222, 0.5);\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-abyss-spaced {\n padding: 0;\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: var(--dv-sash-border-radius);\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-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-abyss-spaced .dv-tabs-overflow-container,\n.dockview-theme-abyss-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-abyss-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-abyss-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-abyss-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-abyss-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\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-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-abyss-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-abyss-spaced {\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-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-group-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-light-spaced {\n padding: 0;\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: var(--dv-sash-border-radius);\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-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-light-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-light-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-light-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-light-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\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-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-light-spaced {\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:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n --dv-scrollbar-background-color: rgba(0, 0, 0, 0.25);\n --dv-floating-group-border: 2px solid rgba(255, 255, 255, 0.1);\n}\n\n.dockview-spaced {\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-spaced {\n padding: 0;\n}\n.dockview-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-spaced .dv-tabs-overflow-container,\n.dockview-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n\n.dv-context-menu {\n min-width: 160px;\n overflow: hidden;\n background: var(--dv-context-menu-background-color, var(--dv-activegroup-hiddenpanel-tab-background-color));\n color: var(--dv-context-menu-color, var(--dv-activegroup-hiddenpanel-tab-color));\n border: 1px solid var(--dv-tab-divider-color);\n border-radius: var(--dv-border-radius);\n box-shadow: var(--dv-floating-box-shadow);\n padding: 4px 0;\n}\n\n.dv-context-menu-item {\n height: 25px;\n padding: 0 12px;\n display: flex;\n align-items: center;\n cursor: pointer;\n font-size: var(--dv-tabs-and-actions-container-font-size);\n white-space: nowrap;\n user-select: none;\n}\n.dv-context-menu-item:hover {\n background: var(--dv-icon-hover-background-color);\n}\n.dv-context-menu-item.dv-context-menu-item--disabled {\n opacity: 0.4;\n cursor: default;\n pointer-events: none;\n}\n\n.dv-context-menu-separator {\n height: 1px;\n background: var(--dv-tab-divider-color);\n margin: 4px 0;\n}\n\n.dv-context-menu-rename {\n padding: 8px 12px 4px;\n}\n\n.dv-context-menu-rename-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid var(--dv-tab-divider-color);\n border-radius: var(--dv-border-radius);\n background: inherit;\n color: var(--dv-activegroup-visiblepanel-tab-color);\n font-size: var(--dv-tabs-and-actions-container-font-size);\n outline: none;\n}\n.dv-context-menu-rename-input:focus {\n border-color: var(--dv-activegroup-visiblepanel-tab-color);\n}\n.dv-context-menu-rename-input::placeholder {\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n}\n\n.dv-context-menu-color-picker {\n display: flex;\n flex-direction: row;\n gap: 6px;\n padding: 8px 12px;\n align-items: center;\n}\n\n.dv-context-menu-color-swatch {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n cursor: pointer;\n border: 2px solid transparent;\n flex-shrink: 0;\n background-color: var(--dv-tab-group-color);\n}\n.dv-context-menu-color-swatch:hover {\n opacity: 0.85;\n}\n.dv-context-menu-color-swatch.dv-context-menu-color-swatch--selected {\n outline: 2px solid var(--dv-tab-divider-color);\n outline-offset: 2px;\n}\n\n.dv-tab-group-indicator-none .dv-groupview-header-bottom .dv-tab-group-underline {\n top: auto;\n bottom: 0;\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, 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;\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}\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-groupview.dv-groupview-edge.dv-edge-collapsed > .dv-content-container {\n display: none;\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-floating-overlay-host {\n position: absolute;\n pointer-events: none;\n}\n.dv-floating-overlay-host > .dv-resize-container {\n pointer-events: auto;\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: var(--dv-floating-border);\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: var(--dv-floating-group-dragging-opacity);\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/* Applied to the ghost tab clone during drag so it shows the same border as a focused tab */\n.dv-tab-ghost-drag {\n position: relative;\n}\n.dv-tab-ghost-drag::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\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-overflow-dropdown-default:hover {\n border-radius: 2px;\n background-color: var(--dv-icon-hover-background-color);\n}\n.dv-tabs-container {\n display: flex;\n position: relative;\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}\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 {\n /* Track */\n}\n.dv-tabs-container::-webkit-scrollbar-track {\n background: transparent;\n}\n.dv-tabs-container {\n /* Handle */\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.dv-tab.dv-tab--shifting {\n will-change: transform, margin-left, margin-right, margin-top, margin-bottom;\n transition: transform var(--dv-transition-duration, 200ms) ease-out, margin-left var(--dv-transition-duration, 200ms) ease-out, margin-right var(--dv-transition-duration, 200ms) ease-out, margin-top var(--dv-transition-duration, 200ms) ease-out, margin-bottom var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab.dv-tab--dragging {\n width: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab.dv-tab--group-collapsed {\n width: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab.dv-tab--group-expanding {\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dv-tab {\n transition: none !important;\n }\n .dv-tab-group-chip {\n transition: none !important;\n }\n}\n.dv-tab-group-chip {\n display: inline-flex;\n align-items: center;\n align-self: center;\n padding: var(--dv-tab-group-chip-padding);\n margin: 0 8px 0 8px;\n border-radius: var(--dv-tab-group-chip-border-radius);\n font-size: var(--dv-tab-group-chip-font-size);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n box-sizing: border-box;\n line-height: 1;\n background-color: var(--dv-tab-group-color);\n color: white;\n}\n.dv-tab-group-chip.dv-tab-group-chip--accent-off {\n background-color: transparent;\n color: inherit;\n}\n.dv-tab-group-chip.dv-tab-group-chip--shifting {\n will-change: margin-left;\n transition: margin-left var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab-group-chip.dv-tab-group-chip--dragging {\n width: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab-group-chip .dv-tab-group-chip-label--empty {\n display: none;\n}\n.dv-tab-group-chip:has(.dv-tab-group-chip-label--empty) {\n position: relative;\n width: 12px;\n height: 12px;\n padding: 0;\n border-radius: 50%;\n}\n.dv-tab-group-chip:has(.dv-tab-group-chip-label--empty)::before {\n content: \"\";\n position: absolute;\n inset: -8px;\n}\n\n.dv-tab-group-underline {\n position: absolute;\n bottom: 0;\n opacity: var(--dv-tab-group-line-opacity);\n pointer-events: none;\n z-index: 10;\n}\n\n.dv-groupview-header-bottom .dv-tab-group-underline {\n bottom: auto;\n top: 0;\n}\n\n.dv-tabs-container-vertical .dv-tab-group-underline {\n bottom: auto;\n left: 0;\n}\n\n.dv-tabs-container-vertical .dv-tab-group-chip {\n margin: 8px 0 8px 0;\n}\n.dv-tabs-container-vertical .dv-tab {\n padding: 0.5rem 0.25rem;\n}\n.dv-tabs-container-vertical .dv-tab.dv-tab--group-collapsed {\n height: 0 !important;\n min-height: 0 !important;\n width: auto !important;\n min-width: initial !important;\n transition: height var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tabs-container-vertical .dv-tab.dv-tab--group-expanding {\n transition: height var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tabs-container-vertical .dv-tab.dv-tab--dragging {\n height: 0 !important;\n min-height: 0 !important;\n width: auto !important;\n min-width: initial !important;\n transition: height var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n\n.dv-tabs-overflow-container {\n flex-direction: column;\n height: unset;\n font-size: var(--dv-tabs-and-actions-container-font-size);\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}\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 {\n /* Firefox scrollbar */\n scrollbar-width: thin;\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-overflow-container .dv-tabs-overflow-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n font-size: 0.8em;\n font-weight: 600;\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n cursor: pointer;\n border-bottom: 1px solid var(--dv-tab-divider-color);\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-header:hover {\n background-color: var(--dv-icon-hover-background-color);\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-color {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: var(--dv-tab-group-color);\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-collapsed-badge {\n font-size: 0.75em;\n font-weight: 400;\n opacity: 0.7;\n padding: 1px 4px;\n border-radius: 3px;\n background-color: var(--dv-tab-divider-color);\n}\n.dv-tabs-overflow-container .dv-tab.dv-tab--grouped {\n padding-left: 16px;\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
|
+
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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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.dockview-theme-dark {\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\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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.dockview-theme-light {\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 --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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 {\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-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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.dockview-theme-abyss {\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\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\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 {\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-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-nord {\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-nord .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-nord {\n --dv-color-nord-polar-0: #2e3440;\n --dv-color-nord-polar-1: #3b4252;\n --dv-color-nord-polar-2: #434c5e;\n --dv-color-nord-polar-3: #4c566a;\n --dv-color-nord-frost: #88c0d0;\n --dv-color-nord-frost-2: #81a1c1;\n --dv-color-nord-snow-0: #eceff4;\n --dv-color-nord-snow-1: #d8dee9;\n --dv-group-view-background-color: var(--dv-color-nord-polar-0);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-0\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-nord-snow-0);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-nord-snow-1);\n --dv-inactivegroup-visiblepanel-tab-color: #8a9bbf;\n --dv-inactivegroup-hiddenpanel-tab-color: #5e6f8e;\n --dv-separator-border: var(--dv-color-nord-polar-3);\n --dv-paneview-active-outline-color: var(--dv-color-nord-frost);\n --dv-active-sash-color: var(--dv-color-nord-frost);\n --dv-scrollbar-background-color: rgba(76, 86, 106, 0.5);\n}\n.dockview-theme-nord .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-nord .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 bottom: 0px;\n content: \"\";\n width: 100%;\n height: 2px;\n background-color: var(--dv-color-nord-frost);\n z-index: 999;\n}\n.dockview-theme-nord .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-nord .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: 2px;\n background-color: var(--dv-color-nord-frost-2);\n z-index: 999;\n}\n\n.dockview-theme-nord-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-nord-spaced {\n padding: 0;\n}\n.dockview-theme-nord-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-nord-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-nord-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-nord-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-nord-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-nord-spaced .dv-tabs-overflow-container,\n.dockview-theme-nord-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-nord-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-nord-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-nord-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-nord-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-nord-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-nord-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-nord-spaced {\n --dv-color-nord-polar-0: #2e3440;\n --dv-color-nord-polar-1: #3b4252;\n --dv-color-nord-polar-2: #434c5e;\n --dv-color-nord-polar-3: #4c566a;\n --dv-color-nord-frost: #88c0d0;\n --dv-color-nord-frost-2: #81a1c1;\n --dv-color-nord-snow-0: #eceff4;\n --dv-color-nord-snow-1: #d8dee9;\n --dv-group-view-background-color: var(--dv-color-nord-polar-0);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-nord-polar-2\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-nord-polar-1\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-nord-snow-0);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-nord-snow-1);\n --dv-inactivegroup-visiblepanel-tab-color: #8a9bbf;\n --dv-inactivegroup-hiddenpanel-tab-color: #5e6f8e;\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-nord-frost);\n --dv-active-sash-color: var(--dv-color-nord-frost);\n --dv-scrollbar-background-color: rgba(76, 86, 106, 0.5);\n --dv-floating-group-border: 2px solid var(--dv-color-nord-polar-0);\n}\n\n.dockview-theme-catppuccin-mocha {\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-catppuccin-mocha .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-catppuccin-mocha {\n --dv-color-mocha-crust: #11111b;\n --dv-color-mocha-mantle: #181825;\n --dv-color-mocha-base: #1e1e2e;\n --dv-color-mocha-surface0: #313244;\n --dv-color-mocha-surface1: #45475a;\n --dv-color-mocha-text: #cdd6f4;\n --dv-color-mocha-subtext1: #bac2de;\n --dv-color-mocha-subtext0: #a6adc8;\n --dv-color-mocha-mauve: #cba6f7;\n --dv-color-mocha-lavender: #b4befe;\n --dv-group-view-background-color: var(--dv-color-mocha-base);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-base\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-surface0\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-crust\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-mocha-text);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-mocha-subtext1);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-mocha-subtext0);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(166, 173, 200, 0.5);\n --dv-separator-border: var(--dv-color-mocha-surface1);\n --dv-paneview-active-outline-color: var(--dv-color-mocha-mauve);\n --dv-active-sash-color: var(--dv-color-mocha-mauve);\n --dv-scrollbar-background-color: rgba(49, 50, 68, 0.8);\n}\n.dockview-theme-catppuccin-mocha .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-catppuccin-mocha .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: 2px;\n background-color: var(--dv-color-mocha-mauve);\n z-index: 999;\n}\n.dockview-theme-catppuccin-mocha .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-catppuccin-mocha .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 top: 0px;\n content: \"\";\n width: 100%;\n height: 2px;\n background-color: rgba(180, 190, 254, 0.4);\n z-index: 999;\n}\n\n.dockview-theme-catppuccin-mocha-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-catppuccin-mocha-spaced {\n padding: 0;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tabs-overflow-container,\n.dockview-theme-catppuccin-mocha-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-catppuccin-mocha-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-catppuccin-mocha-spaced {\n --dv-color-mocha-crust: #11111b;\n --dv-color-mocha-mantle: #181825;\n --dv-color-mocha-base: #1e1e2e;\n --dv-color-mocha-surface0: #313244;\n --dv-color-mocha-surface1: #45475a;\n --dv-color-mocha-text: #cdd6f4;\n --dv-color-mocha-subtext1: #bac2de;\n --dv-color-mocha-subtext0: #a6adc8;\n --dv-color-mocha-mauve: #cba6f7;\n --dv-color-mocha-lavender: #b4befe;\n --dv-group-view-background-color: var(--dv-color-mocha-crust);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-surface0\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-mocha-surface0\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-mocha-mantle\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-mocha-text);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-mocha-subtext1);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-mocha-subtext0);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(166, 173, 200, 0.5);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-mocha-mauve);\n --dv-active-sash-color: var(--dv-color-mocha-mauve);\n --dv-scrollbar-background-color: rgba(49, 50, 68, 0.8);\n --dv-floating-group-border: 2px solid var(--dv-color-mocha-crust);\n}\n\n.dockview-theme-monokai {\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-monokai .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-monokai {\n --dv-color-monokai-bg: #272822;\n --dv-color-monokai-bg-light: #3e3d32;\n --dv-color-monokai-comment: #75715e;\n --dv-color-monokai-fg: #f8f8f2;\n --dv-color-monokai-green: #a6e22e;\n --dv-group-view-background-color: var(--dv-color-monokai-bg);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-monokai-bg-light\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-monokai-bg\n );\n --dv-activegroup-hiddenpanel-tab-background-color: #2d2c25;\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-monokai-bg\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: #2d2c25;\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-monokai-fg);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-monokai-comment);\n --dv-inactivegroup-visiblepanel-tab-color: rgba(248, 248, 242, 0.5);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(117, 113, 94, 0.5);\n --dv-separator-border: var(--dv-color-monokai-bg-light);\n --dv-paneview-active-outline-color: var(--dv-color-monokai-green);\n --dv-active-sash-color: var(--dv-color-monokai-green);\n --dv-scrollbar-background-color: rgba(117, 113, 94, 0.5);\n}\n.dockview-theme-monokai .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-monokai .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 bottom: 0px;\n content: \"\";\n width: 100%;\n height: 2px;\n background-color: var(--dv-color-monokai-green);\n z-index: 999;\n}\n.dockview-theme-monokai .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-monokai .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: 2px;\n background-color: rgba(166, 226, 46, 0.35);\n z-index: 999;\n}\n\n.dockview-theme-solarized-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-solarized-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-solarized-light {\n --dv-color-sol-base3: #fdf6e3;\n --dv-color-sol-base2: #eee8d5;\n --dv-color-sol-base1: #93a1a1;\n --dv-color-sol-base00: #657b83;\n --dv-color-sol-base01: #586e75;\n --dv-color-sol-blue: #268bd2;\n --dv-group-view-background-color: var(--dv-color-sol-base3);\n --dv-tabs-and-actions-container-background-color: var(--dv-color-sol-base2);\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-activegroup-hiddenpanel-tab-background-color: #e8e2d0;\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: #e8e2d0;\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-sol-base01);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-sol-base00);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-sol-base1);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(147, 161, 161, 0.6);\n --dv-separator-border: var(--dv-color-sol-base2);\n --dv-paneview-active-outline-color: var(--dv-color-sol-blue);\n --dv-active-sash-color: var(--dv-color-sol-blue);\n --dv-scrollbar-background-color: rgba(101, 123, 131, 0.25);\n --dv-drag-over-background-color: rgba(38, 139, 210, 0.15);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.dockview-theme-solarized-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-solarized-light-spaced {\n padding: 0;\n}\n.dockview-theme-solarized-light-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-solarized-light-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-solarized-light-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-solarized-light-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-solarized-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-solarized-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-solarized-light-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-solarized-light-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-solarized-light-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-solarized-light-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-solarized-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-solarized-light-spaced {\n --dv-color-sol-base3: #fdf6e3;\n --dv-color-sol-base2: #eee8d5;\n --dv-color-sol-base1: #93a1a1;\n --dv-color-sol-base00: #657b83;\n --dv-color-sol-base01: #586e75;\n --dv-color-sol-blue: #268bd2;\n --dv-drag-over-background-color: rgba(38, 139, 210, 0.1);\n --dv-group-view-background-color: var(--dv-color-sol-base2);\n --dv-tabs-and-actions-container-background-color: var(--dv-color-sol-base3);\n --dv-activegroup-visiblepanel-tab-background-color: #e8e2d0;\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: #e8e2d0;\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-sol-base3\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-sol-base01);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-sol-base00);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-sol-base1);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(147, 161, 161, 0.6);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-sol-blue);\n --dv-active-sash-color: var(--dv-color-sol-blue);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n --dv-scrollbar-background-color: rgba(101, 123, 131, 0.25);\n --dv-floating-group-border: 2px solid rgba(238, 232, 213, 0.5);\n}\n\n.dockview-theme-github-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-github-dark .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-github-dark {\n --dv-color-gh-canvas-default: #0d1117;\n --dv-color-gh-canvas-subtle: #161b22;\n --dv-color-gh-canvas-inset: #010409;\n --dv-color-gh-border: #30363d;\n --dv-color-gh-border-muted: #21262d;\n --dv-color-gh-fg-default: #e6edf3;\n --dv-color-gh-fg-muted: #8b949e;\n --dv-color-gh-fg-subtle: #6e7681;\n --dv-color-gh-accent: #58a6ff;\n --dv-group-view-background-color: var(--dv-color-gh-canvas-default);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-canvas-default\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-canvas-default\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-default);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-subtle);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.5);\n --dv-separator-border: var(--dv-color-gh-border);\n --dv-paneview-active-outline-color: var(--dv-color-gh-accent);\n --dv-active-sash-color: var(--dv-color-gh-accent);\n --dv-scrollbar-background-color: rgba(48, 54, 61, 0.7);\n --dv-drag-over-background-color: rgba(88, 166, 255, 0.15);\n}\n\n.dockview-theme-github-dark-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-github-dark-spaced {\n padding: 0;\n}\n.dockview-theme-github-dark-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-github-dark-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-github-dark-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-github-dark-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-github-dark-spaced .dv-tabs-overflow-container,\n.dockview-theme-github-dark-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-github-dark-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-github-dark-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-github-dark-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-github-dark-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-github-dark-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-dark-spaced {\n --dv-color-gh-canvas-default: #0d1117;\n --dv-color-gh-canvas-subtle: #161b22;\n --dv-color-gh-canvas-inset: #010409;\n --dv-color-gh-border: #30363d;\n --dv-color-gh-border-muted: #21262d;\n --dv-color-gh-fg-default: #e6edf3;\n --dv-color-gh-fg-muted: #8b949e;\n --dv-color-gh-fg-subtle: #6e7681;\n --dv-color-gh-accent: #58a6ff;\n --dv-drag-over-background-color: rgba(88, 166, 255, 0.1);\n --dv-group-view-background-color: var(--dv-color-gh-canvas-inset);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-border\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-border\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-default);\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(--dv-color-gh-fg-subtle);\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.5);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-gh-accent);\n --dv-active-sash-color: var(--dv-color-gh-accent);\n --dv-scrollbar-background-color: rgba(48, 54, 61, 0.7);\n --dv-floating-group-border: 2px solid var(--dv-color-gh-canvas-inset);\n}\n\n.dockview-theme-github-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n}\n.dockview-theme-github-light .dv-drop-target-container .dv-drop-target-anchor.dv-drop-target-anchor-container-changed {\n opacity: 0;\n transition: none;\n}\n.dockview-theme-github-light {\n --dv-color-gh-light-canvas-default: #ffffff;\n --dv-color-gh-light-canvas-subtle: #f6f8fa;\n --dv-color-gh-light-canvas-inset: #f0f6ff;\n --dv-color-gh-light-border: #d0d7de;\n --dv-color-gh-light-fg-default: #1f2328;\n --dv-color-gh-light-fg-muted: #656d76;\n --dv-color-gh-light-fg-subtle: #6e7781;\n --dv-color-gh-light-accent: #0969da;\n --dv-group-view-background-color: var(--dv-color-gh-light-canvas-default);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-light-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-subtle\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-subtle\n );\n --dv-activegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-default\n );\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-light-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-subtle\n );\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.4);\n --dv-separator-border: var(--dv-color-gh-light-border);\n --dv-paneview-active-outline-color: var(--dv-color-gh-light-accent);\n --dv-active-sash-color: var(--dv-color-gh-light-accent);\n --dv-scrollbar-background-color: rgba(208, 215, 222, 0.5);\n --dv-drag-over-background-color: rgba(9, 105, 218, 0.1);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.dockview-theme-github-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-github-light-spaced {\n padding: 0;\n}\n.dockview-theme-github-light-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-theme-github-light-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-theme-github-light-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-theme-github-light-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-github-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-github-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-github-light-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-github-light-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-theme-github-light-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-theme-github-light-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-github-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-github-light-spaced {\n --dv-color-gh-light-canvas-default: #ffffff;\n --dv-color-gh-light-canvas-subtle: #f6f8fa;\n --dv-color-gh-light-border: #d0d7de;\n --dv-color-gh-light-fg-default: #1f2328;\n --dv-color-gh-light-fg-muted: #656d76;\n --dv-color-gh-light-fg-subtle: #6e7781;\n --dv-color-gh-light-accent: #0969da;\n --dv-drag-over-background-color: rgba(9, 105, 218, 0.08);\n --dv-group-view-background-color: var(--dv-color-gh-light-canvas-subtle);\n --dv-tabs-and-actions-container-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-activegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-border\n );\n --dv-activegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-inactivegroup-visiblepanel-tab-background-color: var(\n --dv-color-gh-light-border\n );\n --dv-inactivegroup-hiddenpanel-tab-background-color: var(\n --dv-color-gh-light-canvas-default\n );\n --dv-activegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-default\n );\n --dv-activegroup-hiddenpanel-tab-color: var(--dv-color-gh-light-fg-muted);\n --dv-inactivegroup-visiblepanel-tab-color: var(\n --dv-color-gh-light-fg-subtle\n );\n --dv-inactivegroup-hiddenpanel-tab-color: rgba(110, 118, 129, 0.4);\n --dv-separator-border: transparent;\n --dv-paneview-active-outline-color: var(--dv-color-gh-light-accent);\n --dv-active-sash-color: var(--dv-color-gh-light-accent);\n --dv-floating-box-shadow:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n --dv-scrollbar-background-color: rgba(208, 215, 222, 0.5);\n --dv-floating-group-border: 2px solid rgba(208, 215, 222, 0.5);\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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-abyss-spaced {\n padding: 0;\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: var(--dv-sash-border-radius);\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-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-abyss-spaced .dv-tabs-overflow-container,\n.dockview-theme-abyss-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-abyss-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-abyss-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-abyss-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-abyss-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\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-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-abyss-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-abyss-spaced {\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-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-group-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:\n 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.25);\n --dv-floating-border: 1px solid rgba(255, 255, 255, 0.1);\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-spacing-padding: 0px;\n --dv-tab-border-radius: 0px;\n --dv-sash-border-radius: 0px;\n --dv-dropdown-border-radius: 0px;\n --dv-tab-close-icon-size: inherit;\n --dv-floating-group-border: none;\n --dv-drag-over-border: none;\n --dv-floating-group-dragging-opacity: 0.5;\n --dv-tab-group-color-grey: #5f6368;\n --dv-tab-group-color-blue: #1a73e8;\n --dv-tab-group-color-red: #d93025;\n --dv-tab-group-color-yellow: #f9ab00;\n --dv-tab-group-color-green: #188038;\n --dv-tab-group-color-pink: #d01884;\n --dv-tab-group-color-purple: #a142f4;\n --dv-tab-group-color-cyan: #007b83;\n --dv-tab-group-color-orange: #e8710a;\n --dv-tab-group-chip-padding: 4px 8px;\n --dv-tab-group-chip-border-radius: 6px;\n --dv-tab-group-chip-font-size: 11px;\n --dv-tab-group-line-height: 2px;\n --dv-tab-group-line-opacity: 0.6;\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-theme-light-spaced {\n padding: 0;\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: var(--dv-sash-border-radius);\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-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-theme-light-spaced .dv-tabs-overflow-container,\n.dockview-theme-light-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-theme-light-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-light-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-theme-light-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-theme-light-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\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-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-theme-light-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-theme-light-spaced {\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:\n 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);\n --dv-floating-border: 1px solid rgba(0, 0, 0, 0.1);\n --dv-scrollbar-background-color: rgba(0, 0, 0, 0.25);\n --dv-floating-group-border: 2px solid rgba(255, 255, 255, 0.1);\n}\n\n.dockview-spaced {\n --dv-spacing-padding: 10px;\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-tab-border-radius: 8px;\n --dv-sash-border-radius: 4px;\n --dv-dropdown-border-radius: 8px;\n --dv-tab-close-icon-size: 8px;\n --dv-floating-group-border: 2px solid var(--dv-group-view-background-color);\n box-sizing: border-box;\n padding: var(--dv-spacing-padding);\n background-color: var(--dv-group-view-background-color);\n}\n.dv-shell .dockview-spaced {\n padding: 0;\n}\n.dockview-spaced .dv-resize-container:has(> .dv-groupview) {\n border-radius: 8px;\n}\n.dockview-spaced .dv-sash {\n border-radius: var(--dv-sash-border-radius);\n}\n.dockview-spaced .dv-drop-target-anchor {\n border-radius: calc(var(--dv-border-radius) / 4);\n}\n.dockview-spaced .dv-drop-target-anchor.dv-drop-target-content {\n border-radius: var(--dv-border-radius);\n}\n.dockview-spaced .dv-resize-container {\n border-radius: var(--dv-border-radius) !important;\n border: none;\n}\n.dockview-spaced .dv-resize-container .dv-groupview {\n border: var(--dv-floating-group-border);\n}\n.dockview-spaced .dv-tabs-overflow-container,\n.dockview-spaced .dv-tabs-overflow-dropdown-default {\n border-radius: var(--dv-dropdown-border-radius);\n height: unset !important;\n}\n.dockview-spaced .dv-render-overlay {\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n.dockview-spaced .dv-tab {\n border-radius: var(--dv-tab-border-radius);\n}\n.dockview-spaced .dv-tab .dv-svg {\n height: var(--dv-tab-close-icon-size);\n width: var(--dv-tab-close-icon-size);\n}\n.dockview-spaced .dv-tabs-container-vertical .dv-tab {\n margin: 0.25rem 0.5rem;\n}\n.dockview-spaced .dv-groupview {\n border-radius: var(--dv-border-radius);\n}\n.dockview-spaced .dv-groupview .dv-tabs-and-actions-container {\n padding: 0px calc(var(--dv-border-radius) / 2);\n}\n.dockview-spaced .dv-groupview .dv-tabs-and-actions-container.dv-groupview-header-vertical {\n padding: calc(var(--dv-border-radius) / 2) 0;\n}\n.dockview-spaced .dv-groupview .dv-content-container {\n background-color: var(--dv-tabs-and-actions-container-background-color);\n border-bottom-left-radius: var(--dv-border-radius);\n border-bottom-right-radius: var(--dv-border-radius);\n}\n\n.dv-context-menu {\n min-width: 160px;\n overflow: hidden;\n background: var(--dv-context-menu-background-color, var(--dv-activegroup-hiddenpanel-tab-background-color));\n color: var(--dv-context-menu-color, var(--dv-activegroup-hiddenpanel-tab-color));\n border: 1px solid var(--dv-tab-divider-color);\n border-radius: var(--dv-border-radius);\n box-shadow: var(--dv-floating-box-shadow);\n padding: 4px 0;\n}\n\n.dv-context-menu-item {\n height: 25px;\n padding: 0 12px;\n display: flex;\n align-items: center;\n cursor: pointer;\n font-size: var(--dv-tabs-and-actions-container-font-size);\n white-space: nowrap;\n user-select: none;\n}\n.dv-context-menu-item:hover {\n background: var(--dv-icon-hover-background-color);\n}\n.dv-context-menu-item.dv-context-menu-item--disabled {\n opacity: 0.4;\n cursor: default;\n pointer-events: none;\n}\n\n.dv-context-menu-separator {\n height: 1px;\n background: var(--dv-tab-divider-color);\n margin: 4px 0;\n}\n\n.dv-context-menu-rename {\n padding: 8px 12px 4px;\n}\n\n.dv-context-menu-rename-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid var(--dv-tab-divider-color);\n border-radius: var(--dv-border-radius);\n background: inherit;\n color: var(--dv-activegroup-visiblepanel-tab-color);\n font-size: var(--dv-tabs-and-actions-container-font-size);\n outline: none;\n}\n.dv-context-menu-rename-input:focus {\n border-color: var(--dv-activegroup-visiblepanel-tab-color);\n}\n.dv-context-menu-rename-input::placeholder {\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n}\n\n.dv-context-menu-color-picker {\n display: flex;\n flex-direction: row;\n gap: 6px;\n padding: 8px 12px;\n align-items: center;\n}\n\n.dv-context-menu-color-swatch {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n cursor: pointer;\n border: 2px solid transparent;\n flex-shrink: 0;\n background-color: var(--dv-tab-group-color);\n}\n.dv-context-menu-color-swatch:hover {\n opacity: 0.85;\n}\n.dv-context-menu-color-swatch.dv-context-menu-color-swatch--selected {\n outline: 2px solid var(--dv-tab-divider-color);\n outline-offset: 2px;\n}\n\n.dv-tab-group-indicator-none .dv-groupview-header-bottom .dv-tab-group-underline {\n top: auto;\n bottom: 0;\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, 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;\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}\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-groupview.dv-groupview-edge.dv-edge-collapsed > .dv-content-container {\n display: none;\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-floating-overlay-host {\n position: absolute;\n pointer-events: none;\n}\n.dv-floating-overlay-host > .dv-resize-container {\n pointer-events: auto;\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: var(--dv-floating-border);\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: var(--dv-floating-group-dragging-opacity);\n /* Enhanced GPU acceleration during drag */\n will-change: transform, opacity;\n}\n.dv-resize-container .dv-resize-handle-top,\n.dv-resize-container .dv-resize-handle-bottom,\n.dv-resize-container .dv-resize-handle-left,\n.dv-resize-container .dv-resize-handle-right,\n.dv-resize-container .dv-resize-handle-topleft,\n.dv-resize-container .dv-resize-handle-topright,\n.dv-resize-container .dv-resize-handle-bottomleft,\n.dv-resize-container .dv-resize-handle-bottomright {\n touch-action: none;\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@media (pointer: coarse) {\n .dv-resize-container .dv-resize-handle-top,\n .dv-resize-container .dv-resize-handle-bottom {\n height: 16px;\n width: calc(100% - 48px);\n left: 24px;\n }\n .dv-resize-container .dv-resize-handle-top {\n top: -10px;\n }\n .dv-resize-container .dv-resize-handle-bottom {\n bottom: -10px;\n }\n .dv-resize-container .dv-resize-handle-left,\n .dv-resize-container .dv-resize-handle-right {\n width: 16px;\n height: calc(100% - 48px);\n top: 24px;\n }\n .dv-resize-container .dv-resize-handle-left {\n left: -10px;\n }\n .dv-resize-container .dv-resize-handle-right {\n right: -10px;\n }\n .dv-resize-container .dv-resize-handle-topleft,\n .dv-resize-container .dv-resize-handle-topright,\n .dv-resize-container .dv-resize-handle-bottomleft,\n .dv-resize-container .dv-resize-handle-bottomright {\n height: 24px;\n width: 24px;\n }\n .dv-resize-container .dv-resize-handle-topleft {\n top: -12px;\n left: -12px;\n }\n .dv-resize-container .dv-resize-handle-topright {\n top: -12px;\n right: -12px;\n }\n .dv-resize-container .dv-resize-handle-bottomleft {\n bottom: -12px;\n left: -12px;\n }\n .dv-resize-container .dv-resize-handle-bottomright {\n bottom: -12px;\n right: -12px;\n }\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@media (pointer: coarse) {\n .dv-split-view-container .dv-sash-container > .dv-sash:not(.dv-disabled)::before {\n content: \"\";\n position: absolute;\n background: transparent;\n }\n .dv-split-view-container.dv-horizontal > .dv-sash-container > .dv-sash:not(.dv-disabled)::before {\n top: 0;\n bottom: 0;\n left: -10px;\n right: -10px;\n }\n .dv-split-view-container.dv-vertical > .dv-sash-container > .dv-sash:not(.dv-disabled)::before {\n left: 0;\n right: 0;\n top: -10px;\n bottom: -10px;\n }\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/* Applied to the ghost tab clone during drag so it shows the same border as a focused tab */\n.dv-tab-ghost-drag {\n position: relative;\n}\n.dv-tab-ghost-drag::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\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@media (hover: none) {\n .dv-tab.dv-inactive-tab .dv-default-tab .dv-default-tab-action {\n visibility: visible;\n }\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@media (pointer: coarse) {\n .dv-tab .dv-default-tab .dv-default-tab-action {\n padding: 8px;\n }\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-overflow-dropdown-default:hover {\n border-radius: 2px;\n background-color: var(--dv-icon-hover-background-color);\n}\n@charset \"UTF-8\";\n.dv-tabs-container {\n display: flex;\n position: relative;\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 /**\n * Stop scroll-chaining at the tab strip so that wheel / trackpad\n * overscroll past the strip's edges doesn't trigger the browser's\n * swipe-to-go-back-or-forward gesture (and doesn't scroll the page\n * either). `contain` keeps the native bounce visuals; `none` would\n * also disable them.\n */\n overscroll-behavior: contain;\n /**\n * Empty space between tabs (and the scrollbar lane) keeps pan-x so a\n * flick on those areas produces native momentum scroll. The tab and\n * chip elements themselves opt out (`touch-action: none`) so the\n * pointer drag source owns the gesture from pointerdown — a flick on\n * a tab or chip always becomes a drag, regardless of direction.\n */\n touch-action: pan-x;\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 touch-action: pan-y;\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 {\n /* Track */\n}\n.dv-tabs-container::-webkit-scrollbar-track {\n background: transparent;\n}\n.dv-tabs-container {\n /* Handle */\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 user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\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 touch-action: none;\n}\n.dv-tab.dv-tab--shifting {\n will-change: transform, margin-left, margin-right, margin-top, margin-bottom;\n transition: transform var(--dv-transition-duration, 200ms) ease-out, margin-left var(--dv-transition-duration, 200ms) ease-out, margin-right var(--dv-transition-duration, 200ms) ease-out, margin-top var(--dv-transition-duration, 200ms) ease-out, margin-bottom var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab.dv-tab--dragging {\n width: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab.dv-tab--group-collapsed {\n width: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab.dv-tab--group-expanding {\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dv-tab {\n transition: none !important;\n }\n .dv-tab-group-chip {\n transition: none !important;\n }\n}\n.dv-tab-group-chip {\n display: inline-flex;\n align-items: center;\n align-self: center;\n padding: var(--dv-tab-group-chip-padding);\n margin: 0 8px 0 8px;\n border-radius: var(--dv-tab-group-chip-border-radius);\n font-size: var(--dv-tab-group-chip-font-size);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n box-sizing: border-box;\n line-height: 1;\n touch-action: none;\n background-color: var(--dv-tab-group-color);\n color: white;\n}\n.dv-tab-group-chip.dv-tab-group-chip--accent-off {\n background-color: transparent;\n color: inherit;\n}\n.dv-tab-group-chip.dv-tab-group-chip--shifting {\n will-change: margin-left;\n transition: margin-left var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab-group-chip.dv-tab-group-chip--dragging {\n width: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition: width var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tab-group-chip .dv-tab-group-chip-label--empty {\n display: none;\n}\n.dv-tab-group-chip:has(.dv-tab-group-chip-label--empty) {\n position: relative;\n width: 12px;\n height: 12px;\n padding: 0;\n border-radius: 50%;\n}\n.dv-tab-group-chip:has(.dv-tab-group-chip-label--empty)::before {\n content: \"\";\n position: absolute;\n inset: -8px;\n}\n\n.dv-tab-group-underline {\n position: absolute;\n bottom: 0;\n opacity: var(--dv-tab-group-line-opacity);\n pointer-events: none;\n z-index: 10;\n}\n\n.dv-groupview-header-bottom .dv-tab-group-underline {\n bottom: auto;\n top: 0;\n}\n\n.dv-tabs-container-vertical .dv-tab-group-underline {\n bottom: auto;\n left: 0;\n}\n\n.dv-tabs-container-vertical .dv-tab-group-chip {\n margin: 8px 0 8px 0;\n}\n.dv-tabs-container-vertical .dv-tab {\n padding: 0.5rem 0.25rem;\n}\n.dv-tabs-container-vertical .dv-tab.dv-tab--group-collapsed {\n height: 0 !important;\n min-height: 0 !important;\n width: auto !important;\n min-width: initial !important;\n transition: height var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tabs-container-vertical .dv-tab.dv-tab--group-expanding {\n transition: height var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n.dv-tabs-container-vertical .dv-tab.dv-tab--dragging {\n height: 0 !important;\n min-height: 0 !important;\n width: auto !important;\n min-width: initial !important;\n transition: height var(--dv-transition-duration, 200ms) ease-out, padding var(--dv-transition-duration, 200ms) ease-out, margin var(--dv-transition-duration, 200ms) ease-out, opacity var(--dv-transition-duration, 200ms) ease-out;\n}\n\n.dv-tabs-overflow-container {\n flex-direction: column;\n height: unset;\n font-size: var(--dv-tabs-and-actions-container-font-size);\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}\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 {\n /* Firefox scrollbar */\n scrollbar-width: thin;\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-overflow-container .dv-tabs-overflow-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n font-size: 0.8em;\n font-weight: 600;\n color: var(--dv-activegroup-hiddenpanel-tab-color);\n cursor: pointer;\n border-bottom: 1px solid var(--dv-tab-divider-color);\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-header:hover {\n background-color: var(--dv-icon-hover-background-color);\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-color {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background-color: var(--dv-tab-group-color);\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dv-tabs-overflow-container .dv-tabs-overflow-group-collapsed-badge {\n font-size: 0.75em;\n font-weight: 400;\n opacity: 0.7;\n padding: 1px 4px;\n border-radius: 3px;\n background-color: var(--dv-tab-divider-color);\n}\n.dv-tabs-overflow-container .dv-tab.dv-tab--grouped {\n padding-left: 16px;\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 user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n touch-action: none;\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}";
|
|
41
41
|
styleInject(css_248z);
|
|
42
42
|
|
|
43
43
|
class TransferObject {
|
|
@@ -508,8 +508,10 @@
|
|
|
508
508
|
function quasiDefaultPrevented(event) {
|
|
509
509
|
return event[QUASI_PREVENT_DEFAULT_KEY];
|
|
510
510
|
}
|
|
511
|
-
function addStyles(document, styleSheetList) {
|
|
511
|
+
function addStyles(document, styleSheetList, options = {}) {
|
|
512
512
|
const styleSheets = Array.from(styleSheetList);
|
|
513
|
+
const { nonce } = options;
|
|
514
|
+
const resolvedNonce = typeof nonce === 'function' ? nonce(document) : nonce;
|
|
513
515
|
for (const styleSheet of styleSheets) {
|
|
514
516
|
if (styleSheet.href) {
|
|
515
517
|
const link = document.createElement('link');
|
|
@@ -517,6 +519,10 @@
|
|
|
517
519
|
link.type = styleSheet.type;
|
|
518
520
|
link.rel = 'stylesheet';
|
|
519
521
|
document.head.appendChild(link);
|
|
522
|
+
// The <link> will load and apply its rules in the target
|
|
523
|
+
// document. Reading cssRules here would duplicate them
|
|
524
|
+
// (and throws for cross-origin sheets).
|
|
525
|
+
continue;
|
|
520
526
|
}
|
|
521
527
|
let cssTexts = [];
|
|
522
528
|
try {
|
|
@@ -527,11 +533,16 @@
|
|
|
527
533
|
catch (err) {
|
|
528
534
|
console.warn('dockview: failed to access stylesheet rules due to security restrictions', err);
|
|
529
535
|
}
|
|
536
|
+
const fragment = document.createDocumentFragment();
|
|
530
537
|
for (const rule of cssTexts) {
|
|
531
538
|
const style = document.createElement('style');
|
|
539
|
+
if (resolvedNonce) {
|
|
540
|
+
style.setAttribute('nonce', resolvedNonce);
|
|
541
|
+
}
|
|
532
542
|
style.appendChild(document.createTextNode(rule));
|
|
533
|
-
|
|
543
|
+
fragment.appendChild(style);
|
|
534
544
|
}
|
|
545
|
+
document.head.appendChild(fragment);
|
|
535
546
|
}
|
|
536
547
|
}
|
|
537
548
|
function getDomNodePagePosition(domNode) {
|
|
@@ -570,7 +581,7 @@
|
|
|
570
581
|
* Should be more efficient than element.querySelectorAll("*") since there
|
|
571
582
|
* is no need to store every element in-memory using this approach
|
|
572
583
|
*/
|
|
573
|
-
function allTagsNamesInclusiveOfShadowDoms(tagNames) {
|
|
584
|
+
function allTagsNamesInclusiveOfShadowDoms(tagNames, rootNode) {
|
|
574
585
|
const iframes = [];
|
|
575
586
|
function findIframesInNode(node) {
|
|
576
587
|
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
@@ -585,11 +596,15 @@
|
|
|
585
596
|
}
|
|
586
597
|
}
|
|
587
598
|
}
|
|
588
|
-
|
|
599
|
+
// Document → walk from its root element. Element → walk from itself.
|
|
600
|
+
const startEl = rootNode instanceof Document
|
|
601
|
+
? rootNode.documentElement
|
|
602
|
+
: rootNode;
|
|
603
|
+
findIframesInNode(startEl);
|
|
589
604
|
return iframes;
|
|
590
605
|
}
|
|
591
606
|
function disableIframePointEvents(rootNode = document) {
|
|
592
|
-
const iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW']);
|
|
607
|
+
const iframes = allTagsNamesInclusiveOfShadowDoms(['IFRAME', 'WEBVIEW'], rootNode);
|
|
593
608
|
const original = new WeakMap(); // don't hold onto HTMLElement references longer than required
|
|
594
609
|
for (const iframe of iframes) {
|
|
595
610
|
original.set(iframe, iframe.style.pointerEvents);
|
|
@@ -4009,67 +4024,6 @@
|
|
|
4009
4024
|
}
|
|
4010
4025
|
}
|
|
4011
4026
|
|
|
4012
|
-
class DragHandler extends CompositeDisposable {
|
|
4013
|
-
constructor(el, disabled) {
|
|
4014
|
-
super();
|
|
4015
|
-
this.el = el;
|
|
4016
|
-
this.disabled = disabled;
|
|
4017
|
-
this.dataDisposable = new MutableDisposable();
|
|
4018
|
-
this.pointerEventsDisposable = new MutableDisposable();
|
|
4019
|
-
this._onDragStart = new Emitter();
|
|
4020
|
-
this.onDragStart = this._onDragStart.event;
|
|
4021
|
-
this.addDisposables(this._onDragStart, this.dataDisposable, this.pointerEventsDisposable);
|
|
4022
|
-
this.configure();
|
|
4023
|
-
}
|
|
4024
|
-
setDisabled(disabled) {
|
|
4025
|
-
this.disabled = disabled;
|
|
4026
|
-
}
|
|
4027
|
-
isCancelled(_event) {
|
|
4028
|
-
return false;
|
|
4029
|
-
}
|
|
4030
|
-
configure() {
|
|
4031
|
-
this.addDisposables(this._onDragStart, addDisposableListener(this.el, 'dragstart', (event) => {
|
|
4032
|
-
if (event.defaultPrevented ||
|
|
4033
|
-
this.isCancelled(event) ||
|
|
4034
|
-
this.disabled) {
|
|
4035
|
-
event.preventDefault();
|
|
4036
|
-
return;
|
|
4037
|
-
}
|
|
4038
|
-
const iframes = disableIframePointEvents();
|
|
4039
|
-
this.pointerEventsDisposable.value = {
|
|
4040
|
-
dispose: () => {
|
|
4041
|
-
iframes.release();
|
|
4042
|
-
},
|
|
4043
|
-
};
|
|
4044
|
-
this.el.classList.add('dv-dragged');
|
|
4045
|
-
setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
|
|
4046
|
-
this.dataDisposable.value = this.getData(event);
|
|
4047
|
-
this._onDragStart.fire(event);
|
|
4048
|
-
if (event.dataTransfer) {
|
|
4049
|
-
event.dataTransfer.effectAllowed = 'move';
|
|
4050
|
-
const hasData = event.dataTransfer.items.length > 0;
|
|
4051
|
-
if (!hasData) {
|
|
4052
|
-
/**
|
|
4053
|
-
* Although this is not used by dockview many third party dnd libraries will check
|
|
4054
|
-
* dataTransfer.types to determine valid drag events.
|
|
4055
|
-
*
|
|
4056
|
-
* For example: in react-dnd if dataTransfer.types is not set then the dragStart event will be cancelled
|
|
4057
|
-
* through .preventDefault(). Since this is applied globally to all drag events this would break dockviews
|
|
4058
|
-
* dnd logic. You can see the code at
|
|
4059
|
-
P * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
|
|
4060
|
-
*/
|
|
4061
|
-
event.dataTransfer.setData('text/plain', '');
|
|
4062
|
-
}
|
|
4063
|
-
}
|
|
4064
|
-
}), addDisposableListener(this.el, 'dragend', () => {
|
|
4065
|
-
this.pointerEventsDisposable.dispose();
|
|
4066
|
-
setTimeout(() => {
|
|
4067
|
-
this.dataDisposable.dispose(); // allow the data to be read by other handlers before disposing
|
|
4068
|
-
}, 0);
|
|
4069
|
-
}));
|
|
4070
|
-
}
|
|
4071
|
-
}
|
|
4072
|
-
|
|
4073
4027
|
class DragAndDropObserver extends CompositeDisposable {
|
|
4074
4028
|
constructor(element, callbacks) {
|
|
4075
4029
|
super();
|
|
@@ -4120,48 +4074,197 @@
|
|
|
4120
4074
|
}
|
|
4121
4075
|
}
|
|
4122
4076
|
|
|
4123
|
-
|
|
4124
|
-
|
|
4125
|
-
|
|
4126
|
-
|
|
4127
|
-
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
const
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4157
|
-
|
|
4158
|
-
|
|
4159
|
-
|
|
4160
|
-
|
|
4161
|
-
|
|
4162
|
-
|
|
4163
|
-
|
|
4077
|
+
// Two render paths: in-place (dropzone appended to drop element) and
|
|
4078
|
+
// anchored (overlay rendered into an external anchor container).
|
|
4079
|
+
const DEFAULT_SIZE = { value: 50, type: 'percentage' };
|
|
4080
|
+
const SMALL_WIDTH_BOUNDARY = 100;
|
|
4081
|
+
const SMALL_HEIGHT_BOUNDARY = 100;
|
|
4082
|
+
function createOverlayElements() {
|
|
4083
|
+
const dropzone = document.createElement('div');
|
|
4084
|
+
dropzone.className = 'dv-drop-target-dropzone';
|
|
4085
|
+
const selection = document.createElement('div');
|
|
4086
|
+
selection.className = 'dv-drop-target-selection';
|
|
4087
|
+
dropzone.appendChild(selection);
|
|
4088
|
+
return { dropzone, selection };
|
|
4089
|
+
}
|
|
4090
|
+
function computeOverlayShape(quadrant, width, height, overlayModel) {
|
|
4091
|
+
var _a, _b, _c;
|
|
4092
|
+
const smallWidthBoundary = (_a = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.smallWidthBoundary) !== null && _a !== void 0 ? _a : SMALL_WIDTH_BOUNDARY;
|
|
4093
|
+
const smallHeightBoundary = (_b = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.smallHeightBoundary) !== null && _b !== void 0 ? _b : SMALL_HEIGHT_BOUNDARY;
|
|
4094
|
+
const isSmallX = width < smallWidthBoundary;
|
|
4095
|
+
const isSmallY = height < smallHeightBoundary;
|
|
4096
|
+
const isLeft = quadrant === 'left';
|
|
4097
|
+
const isRight = quadrant === 'right';
|
|
4098
|
+
const isTop = quadrant === 'top';
|
|
4099
|
+
const isBottom = quadrant === 'bottom';
|
|
4100
|
+
const rightClass = !isSmallX && isRight;
|
|
4101
|
+
const leftClass = !isSmallX && isLeft;
|
|
4102
|
+
const topClass = !isSmallY && isTop;
|
|
4103
|
+
const bottomClass = !isSmallY && isBottom;
|
|
4104
|
+
let size = 1;
|
|
4105
|
+
const sizeOptions = (_c = overlayModel === null || overlayModel === void 0 ? void 0 : overlayModel.size) !== null && _c !== void 0 ? _c : DEFAULT_SIZE;
|
|
4106
|
+
if (sizeOptions.type === 'percentage') {
|
|
4107
|
+
size = clamp(sizeOptions.value, 0, 100) / 100;
|
|
4108
|
+
}
|
|
4109
|
+
else {
|
|
4110
|
+
if (rightClass || leftClass) {
|
|
4111
|
+
size = clamp(0, sizeOptions.value, width) / width;
|
|
4112
|
+
}
|
|
4113
|
+
if (topClass || bottomClass) {
|
|
4114
|
+
size = clamp(0, sizeOptions.value, height) / height;
|
|
4115
|
+
}
|
|
4116
|
+
}
|
|
4117
|
+
return {
|
|
4118
|
+
isSmallX,
|
|
4119
|
+
isSmallY,
|
|
4120
|
+
isLeft,
|
|
4121
|
+
isRight,
|
|
4122
|
+
isTop,
|
|
4123
|
+
isBottom,
|
|
4124
|
+
rightClass,
|
|
4125
|
+
leftClass,
|
|
4126
|
+
topClass,
|
|
4127
|
+
bottomClass,
|
|
4128
|
+
size,
|
|
4129
|
+
};
|
|
4130
|
+
}
|
|
4131
|
+
function renderInPlaceOverlay(overlay, quadrant, width, height, overlayModel) {
|
|
4132
|
+
const shape = computeOverlayShape(quadrant, width, height, overlayModel);
|
|
4133
|
+
const { rightClass, leftClass, topClass, bottomClass, size } = shape;
|
|
4134
|
+
const box = { top: '0px', left: '0px', width: '100%', height: '100%' };
|
|
4135
|
+
if (rightClass) {
|
|
4136
|
+
box.left = `${100 * (1 - size)}%`;
|
|
4137
|
+
box.width = `${100 * size}%`;
|
|
4138
|
+
}
|
|
4139
|
+
else if (leftClass) {
|
|
4140
|
+
box.width = `${100 * size}%`;
|
|
4141
|
+
}
|
|
4142
|
+
else if (topClass) {
|
|
4143
|
+
box.height = `${100 * size}%`;
|
|
4144
|
+
}
|
|
4145
|
+
else if (bottomClass) {
|
|
4146
|
+
box.top = `${100 * (1 - size)}%`;
|
|
4147
|
+
box.height = `${100 * size}%`;
|
|
4148
|
+
}
|
|
4149
|
+
if (shape.isSmallX && shape.isLeft) {
|
|
4150
|
+
box.width = '4px';
|
|
4151
|
+
}
|
|
4152
|
+
if (shape.isSmallX && shape.isRight) {
|
|
4153
|
+
box.left = `${width - 4}px`;
|
|
4154
|
+
box.width = '4px';
|
|
4155
|
+
}
|
|
4156
|
+
if (shape.isSmallY && shape.isTop) {
|
|
4157
|
+
box.height = '4px';
|
|
4158
|
+
}
|
|
4159
|
+
if (shape.isSmallY && shape.isBottom) {
|
|
4160
|
+
box.top = `${height - 4}px`;
|
|
4161
|
+
box.height = '4px';
|
|
4162
|
+
}
|
|
4163
|
+
overlay.style.top = box.top;
|
|
4164
|
+
overlay.style.left = box.left;
|
|
4165
|
+
overlay.style.width = box.width;
|
|
4166
|
+
overlay.style.height = box.height;
|
|
4167
|
+
overlay.style.visibility = 'visible';
|
|
4168
|
+
if (!overlay.style.transform || overlay.style.transform === '') {
|
|
4169
|
+
overlay.style.transform = 'translate3d(0, 0, 0)';
|
|
4170
|
+
}
|
|
4171
|
+
const isLine = (shape.isSmallX && (shape.isLeft || shape.isRight)) ||
|
|
4172
|
+
(shape.isSmallY && (shape.isTop || shape.isBottom));
|
|
4173
|
+
toggleClass(overlay, 'dv-drop-target-small-vertical', shape.isSmallY);
|
|
4174
|
+
toggleClass(overlay, 'dv-drop-target-small-horizontal', shape.isSmallX);
|
|
4175
|
+
toggleClass(overlay, 'dv-drop-target-selection-line', isLine);
|
|
4176
|
+
toggleClass(overlay, 'dv-drop-target-left', shape.isLeft);
|
|
4177
|
+
toggleClass(overlay, 'dv-drop-target-right', shape.isRight);
|
|
4178
|
+
toggleClass(overlay, 'dv-drop-target-top', shape.isTop);
|
|
4179
|
+
toggleClass(overlay, 'dv-drop-target-bottom', shape.isBottom);
|
|
4180
|
+
toggleClass(overlay, 'dv-drop-target-center', quadrant === 'center');
|
|
4181
|
+
}
|
|
4182
|
+
function checkAnchoredBoundsChanged(overlay, bounds) {
|
|
4183
|
+
const topPx = `${Math.round(bounds.top)}px`;
|
|
4184
|
+
const leftPx = `${Math.round(bounds.left)}px`;
|
|
4185
|
+
const widthPx = `${Math.round(bounds.width)}px`;
|
|
4186
|
+
const heightPx = `${Math.round(bounds.height)}px`;
|
|
4187
|
+
return (overlay.style.top !== topPx ||
|
|
4188
|
+
overlay.style.left !== leftPx ||
|
|
4189
|
+
overlay.style.width !== widthPx ||
|
|
4190
|
+
overlay.style.height !== heightPx);
|
|
4191
|
+
}
|
|
4192
|
+
function applyAnchoredBounds(overlay, bounds) {
|
|
4193
|
+
overlay.style.top = `${Math.round(bounds.top)}px`;
|
|
4194
|
+
overlay.style.left = `${Math.round(bounds.left)}px`;
|
|
4195
|
+
overlay.style.width = `${Math.round(bounds.width)}px`;
|
|
4196
|
+
overlay.style.height = `${Math.round(bounds.height)}px`;
|
|
4197
|
+
overlay.style.visibility = 'visible';
|
|
4198
|
+
if (!overlay.style.transform || overlay.style.transform === '') {
|
|
4199
|
+
overlay.style.transform = 'translate3d(0, 0, 0)';
|
|
4200
|
+
}
|
|
4201
|
+
}
|
|
4202
|
+
/** `boundsChanged: false` lets callers skip redundant work on tight drag loops. */
|
|
4203
|
+
function renderAnchoredOverlay(args) {
|
|
4204
|
+
const shape = computeOverlayShape(args.quadrant, args.width, args.height, args.overlayModel);
|
|
4205
|
+
const { rightClass, leftClass, topClass, bottomClass, size } = shape;
|
|
4206
|
+
const elBox = args.outlineElement.getBoundingClientRect();
|
|
4207
|
+
const ta = args.targetModel.getElements(undefined, args.outlineElement);
|
|
4208
|
+
const el = ta.root;
|
|
4209
|
+
const overlay = ta.overlay;
|
|
4210
|
+
const bigbox = el.getBoundingClientRect();
|
|
4211
|
+
const rootTop = elBox.top - bigbox.top;
|
|
4212
|
+
const rootLeft = elBox.left - bigbox.left;
|
|
4213
|
+
const box = {
|
|
4214
|
+
top: rootTop,
|
|
4215
|
+
left: rootLeft,
|
|
4216
|
+
width: args.width,
|
|
4217
|
+
height: args.height,
|
|
4218
|
+
};
|
|
4219
|
+
if (rightClass) {
|
|
4220
|
+
box.left = rootLeft + args.width * (1 - size);
|
|
4221
|
+
box.width = args.width * size;
|
|
4222
|
+
}
|
|
4223
|
+
else if (leftClass) {
|
|
4224
|
+
box.width = args.width * size;
|
|
4225
|
+
}
|
|
4226
|
+
else if (topClass) {
|
|
4227
|
+
box.height = args.height * size;
|
|
4228
|
+
}
|
|
4229
|
+
else if (bottomClass) {
|
|
4230
|
+
box.top = rootTop + args.height * (1 - size);
|
|
4231
|
+
box.height = args.height * size;
|
|
4232
|
+
}
|
|
4233
|
+
if (shape.isSmallX && shape.isLeft) {
|
|
4234
|
+
box.width = 4;
|
|
4235
|
+
}
|
|
4236
|
+
if (shape.isSmallX && shape.isRight) {
|
|
4237
|
+
box.left = rootLeft + args.width - 4;
|
|
4238
|
+
box.width = 4;
|
|
4239
|
+
}
|
|
4240
|
+
if (shape.isSmallY && shape.isTop) {
|
|
4241
|
+
box.height = 4;
|
|
4242
|
+
}
|
|
4243
|
+
if (shape.isSmallY && shape.isBottom) {
|
|
4244
|
+
box.top = rootTop + args.height - 4;
|
|
4245
|
+
box.height = 4;
|
|
4246
|
+
}
|
|
4247
|
+
if (!checkAnchoredBoundsChanged(overlay, box)) {
|
|
4248
|
+
return { boundsChanged: false, targetChanged: ta.changed };
|
|
4249
|
+
}
|
|
4250
|
+
applyAnchoredBounds(overlay, box);
|
|
4251
|
+
overlay.className = `dv-drop-target-anchor${args.className ? ` ${args.className}` : ''}`;
|
|
4252
|
+
toggleClass(overlay, 'dv-drop-target-left', shape.isLeft);
|
|
4253
|
+
toggleClass(overlay, 'dv-drop-target-right', shape.isRight);
|
|
4254
|
+
toggleClass(overlay, 'dv-drop-target-top', shape.isTop);
|
|
4255
|
+
toggleClass(overlay, 'dv-drop-target-bottom', shape.isBottom);
|
|
4256
|
+
toggleClass(overlay, 'dv-drop-target-anchor-line', (shape.isSmallX && (shape.isLeft || shape.isRight)) ||
|
|
4257
|
+
(shape.isSmallY && (shape.isTop || shape.isBottom)));
|
|
4258
|
+
toggleClass(overlay, 'dv-drop-target-center', args.quadrant === 'center');
|
|
4259
|
+
if (ta.changed) {
|
|
4260
|
+
toggleClass(overlay, 'dv-drop-target-anchor-container-changed', true);
|
|
4261
|
+
setTimeout(() => {
|
|
4262
|
+
toggleClass(overlay, 'dv-drop-target-anchor-container-changed', false);
|
|
4263
|
+
}, 10);
|
|
4264
|
+
}
|
|
4265
|
+
return { boundsChanged: true, targetChanged: ta.changed };
|
|
4164
4266
|
}
|
|
4267
|
+
|
|
4165
4268
|
class WillShowOverlayEvent extends DockviewEvent {
|
|
4166
4269
|
get nativeEvent() {
|
|
4167
4270
|
return this.options.nativeEvent;
|
|
@@ -4206,16 +4309,10 @@
|
|
|
4206
4309
|
throw new Error(`invalid position '${position}'`);
|
|
4207
4310
|
}
|
|
4208
4311
|
}
|
|
4209
|
-
const DEFAULT_ACTIVATION_SIZE = {
|
|
4312
|
+
const DEFAULT_ACTIVATION_SIZE$1 = {
|
|
4210
4313
|
value: 20,
|
|
4211
4314
|
type: 'percentage',
|
|
4212
4315
|
};
|
|
4213
|
-
const DEFAULT_SIZE = {
|
|
4214
|
-
value: 50,
|
|
4215
|
-
type: 'percentage',
|
|
4216
|
-
};
|
|
4217
|
-
const SMALL_WIDTH_BOUNDARY = 100;
|
|
4218
|
-
const SMALL_HEIGHT_BOUNDARY = 100;
|
|
4219
4316
|
class Droptarget extends CompositeDisposable {
|
|
4220
4317
|
get disabled() {
|
|
4221
4318
|
return this._disabled;
|
|
@@ -4296,20 +4393,12 @@
|
|
|
4296
4393
|
this.markAsUsed(e);
|
|
4297
4394
|
if (overrideTarget) ;
|
|
4298
4395
|
else if (!this.targetElement) {
|
|
4299
|
-
|
|
4300
|
-
this.targetElement
|
|
4301
|
-
this.overlayElement =
|
|
4302
|
-
this.overlayElement.className = 'dv-drop-target-selection';
|
|
4396
|
+
const els = createOverlayElements();
|
|
4397
|
+
this.targetElement = els.dropzone;
|
|
4398
|
+
this.overlayElement = els.selection;
|
|
4303
4399
|
this._state = 'center';
|
|
4304
|
-
this.targetElement.appendChild(this.overlayElement);
|
|
4305
4400
|
target.classList.add('dv-drop-target');
|
|
4306
4401
|
target.append(this.targetElement);
|
|
4307
|
-
// this.overlayElement.style.opacity = '0';
|
|
4308
|
-
// requestAnimationFrame(() => {
|
|
4309
|
-
// if (this.overlayElement) {
|
|
4310
|
-
// this.overlayElement.style.opacity = '';
|
|
4311
|
-
// }
|
|
4312
|
-
// });
|
|
4313
4402
|
}
|
|
4314
4403
|
this.toggleClasses(quadrant, width, height);
|
|
4315
4404
|
this._state = quadrant;
|
|
@@ -4379,166 +4468,29 @@
|
|
|
4379
4468
|
return typeof value === 'boolean' && value;
|
|
4380
4469
|
}
|
|
4381
4470
|
toggleClasses(quadrant, width, height) {
|
|
4382
|
-
var _a, _b, _c, _d, _e
|
|
4471
|
+
var _a, _b, _c, _d, _e;
|
|
4383
4472
|
const target = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
4384
|
-
if (!target && !this.overlayElement) {
|
|
4385
|
-
return;
|
|
4386
|
-
}
|
|
4387
|
-
const smallWidthBoundary = (_d = (_c = this.options.overlayModel) === null || _c === void 0 ? void 0 : _c.smallWidthBoundary) !== null && _d !== void 0 ? _d : SMALL_WIDTH_BOUNDARY;
|
|
4388
|
-
const smallHeightBoundary = (_f = (_e = this.options.overlayModel) === null || _e === void 0 ? void 0 : _e.smallHeightBoundary) !== null && _f !== void 0 ? _f : SMALL_HEIGHT_BOUNDARY;
|
|
4389
|
-
const isSmallX = width < smallWidthBoundary;
|
|
4390
|
-
const isSmallY = height < smallHeightBoundary;
|
|
4391
|
-
const isLeft = quadrant === 'left';
|
|
4392
|
-
const isRight = quadrant === 'right';
|
|
4393
|
-
const isTop = quadrant === 'top';
|
|
4394
|
-
const isBottom = quadrant === 'bottom';
|
|
4395
|
-
const rightClass = !isSmallX && isRight;
|
|
4396
|
-
const leftClass = !isSmallX && isLeft;
|
|
4397
|
-
const topClass = !isSmallY && isTop;
|
|
4398
|
-
const bottomClass = !isSmallY && isBottom;
|
|
4399
|
-
let size = 1;
|
|
4400
|
-
const sizeOptions = (_h = (_g = this.options.overlayModel) === null || _g === void 0 ? void 0 : _g.size) !== null && _h !== void 0 ? _h : DEFAULT_SIZE;
|
|
4401
|
-
if (sizeOptions.type === 'percentage') {
|
|
4402
|
-
size = clamp(sizeOptions.value, 0, 100) / 100;
|
|
4403
|
-
}
|
|
4404
|
-
else {
|
|
4405
|
-
if (rightClass || leftClass) {
|
|
4406
|
-
size = clamp(0, sizeOptions.value, width) / width;
|
|
4407
|
-
}
|
|
4408
|
-
if (topClass || bottomClass) {
|
|
4409
|
-
size = clamp(0, sizeOptions.value, height) / height;
|
|
4410
|
-
}
|
|
4411
|
-
}
|
|
4412
4473
|
if (target) {
|
|
4413
|
-
const outlineEl = (
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
left: rootLeft,
|
|
4424
|
-
width: width,
|
|
4425
|
-
height: height,
|
|
4426
|
-
};
|
|
4427
|
-
if (rightClass) {
|
|
4428
|
-
box.left = rootLeft + width * (1 - size);
|
|
4429
|
-
box.width = width * size;
|
|
4430
|
-
}
|
|
4431
|
-
else if (leftClass) {
|
|
4432
|
-
box.width = width * size;
|
|
4433
|
-
}
|
|
4434
|
-
else if (topClass) {
|
|
4435
|
-
box.height = height * size;
|
|
4436
|
-
}
|
|
4437
|
-
else if (bottomClass) {
|
|
4438
|
-
box.top = rootTop + height * (1 - size);
|
|
4439
|
-
box.height = height * size;
|
|
4440
|
-
}
|
|
4441
|
-
if (isSmallX && isLeft) {
|
|
4442
|
-
box.width = 4;
|
|
4443
|
-
}
|
|
4444
|
-
if (isSmallX && isRight) {
|
|
4445
|
-
box.left = rootLeft + width - 4;
|
|
4446
|
-
box.width = 4;
|
|
4447
|
-
}
|
|
4448
|
-
if (isSmallY && isTop) {
|
|
4449
|
-
box.height = 4;
|
|
4450
|
-
}
|
|
4451
|
-
if (isSmallY && isBottom) {
|
|
4452
|
-
box.top = rootTop + height - 4;
|
|
4453
|
-
box.height = 4;
|
|
4454
|
-
}
|
|
4455
|
-
// Use GPU-optimized bounds checking and setting
|
|
4456
|
-
if (!checkBoundsChanged(overlay, box)) {
|
|
4457
|
-
return;
|
|
4458
|
-
}
|
|
4459
|
-
setGPUOptimizedBounds(overlay, box);
|
|
4460
|
-
overlay.className = `dv-drop-target-anchor${this.options.className ? ` ${this.options.className}` : ''}`;
|
|
4461
|
-
toggleClass(overlay, 'dv-drop-target-left', isLeft);
|
|
4462
|
-
toggleClass(overlay, 'dv-drop-target-right', isRight);
|
|
4463
|
-
toggleClass(overlay, 'dv-drop-target-top', isTop);
|
|
4464
|
-
toggleClass(overlay, 'dv-drop-target-bottom', isBottom);
|
|
4465
|
-
toggleClass(overlay, 'dv-drop-target-anchor-line', (isSmallX && (isLeft || isRight)) ||
|
|
4466
|
-
(isSmallY && (isTop || isBottom)));
|
|
4467
|
-
toggleClass(overlay, 'dv-drop-target-center', quadrant === 'center');
|
|
4468
|
-
if (ta.changed) {
|
|
4469
|
-
toggleClass(overlay, 'dv-drop-target-anchor-container-changed', true);
|
|
4470
|
-
setTimeout(() => {
|
|
4471
|
-
toggleClass(overlay, 'dv-drop-target-anchor-container-changed', false);
|
|
4472
|
-
}, 10);
|
|
4473
|
-
}
|
|
4474
|
+
const outlineEl = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;
|
|
4475
|
+
renderAnchoredOverlay({
|
|
4476
|
+
outlineElement: outlineEl,
|
|
4477
|
+
targetModel: target,
|
|
4478
|
+
quadrant,
|
|
4479
|
+
width,
|
|
4480
|
+
height,
|
|
4481
|
+
overlayModel: this.options.overlayModel,
|
|
4482
|
+
className: this.options.className,
|
|
4483
|
+
});
|
|
4474
4484
|
return;
|
|
4475
4485
|
}
|
|
4476
4486
|
if (!this.overlayElement) {
|
|
4477
4487
|
return;
|
|
4478
4488
|
}
|
|
4479
|
-
|
|
4480
|
-
/**
|
|
4481
|
-
* You can also achieve the overlay placement using the transform CSS property
|
|
4482
|
-
* to translate and scale the element however this has the undesired effect of
|
|
4483
|
-
* 'skewing' the element. Comment left here for anybody that ever revisits this.
|
|
4484
|
-
*
|
|
4485
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform
|
|
4486
|
-
*
|
|
4487
|
-
* right
|
|
4488
|
-
* translateX(${100 * (1 - size) / 2}%) scaleX(${scale})
|
|
4489
|
-
*
|
|
4490
|
-
* left
|
|
4491
|
-
* translateX(-${100 * (1 - size) / 2}%) scaleX(${scale})
|
|
4492
|
-
*
|
|
4493
|
-
* top
|
|
4494
|
-
* translateY(-${100 * (1 - size) / 2}%) scaleY(${scale})
|
|
4495
|
-
*
|
|
4496
|
-
* bottom
|
|
4497
|
-
* translateY(${100 * (1 - size) / 2}%) scaleY(${scale})
|
|
4498
|
-
*/
|
|
4499
|
-
if (rightClass) {
|
|
4500
|
-
box.left = `${100 * (1 - size)}%`;
|
|
4501
|
-
box.width = `${100 * size}%`;
|
|
4502
|
-
}
|
|
4503
|
-
else if (leftClass) {
|
|
4504
|
-
box.width = `${100 * size}%`;
|
|
4505
|
-
}
|
|
4506
|
-
else if (topClass) {
|
|
4507
|
-
box.height = `${100 * size}%`;
|
|
4508
|
-
}
|
|
4509
|
-
else if (bottomClass) {
|
|
4510
|
-
box.top = `${100 * (1 - size)}%`;
|
|
4511
|
-
box.height = `${100 * size}%`;
|
|
4512
|
-
}
|
|
4513
|
-
if (isSmallX && isLeft) {
|
|
4514
|
-
box.width = '4px';
|
|
4515
|
-
}
|
|
4516
|
-
if (isSmallX && isRight) {
|
|
4517
|
-
box.left = `${width - 4}px`;
|
|
4518
|
-
box.width = '4px';
|
|
4519
|
-
}
|
|
4520
|
-
if (isSmallY && isTop) {
|
|
4521
|
-
box.height = '4px';
|
|
4522
|
-
}
|
|
4523
|
-
if (isSmallY && isBottom) {
|
|
4524
|
-
box.top = `${height - 4}px`;
|
|
4525
|
-
box.height = '4px';
|
|
4526
|
-
}
|
|
4527
|
-
setGPUOptimizedBoundsFromStrings(this.overlayElement, box);
|
|
4528
|
-
const isLine = (isSmallX && (isLeft || isRight)) ||
|
|
4529
|
-
(isSmallY && (isTop || isBottom));
|
|
4530
|
-
toggleClass(this.overlayElement, 'dv-drop-target-small-vertical', isSmallY);
|
|
4531
|
-
toggleClass(this.overlayElement, 'dv-drop-target-small-horizontal', isSmallX);
|
|
4532
|
-
toggleClass(this.overlayElement, 'dv-drop-target-selection-line', isLine);
|
|
4533
|
-
toggleClass(this.overlayElement, 'dv-drop-target-left', isLeft);
|
|
4534
|
-
toggleClass(this.overlayElement, 'dv-drop-target-right', isRight);
|
|
4535
|
-
toggleClass(this.overlayElement, 'dv-drop-target-top', isTop);
|
|
4536
|
-
toggleClass(this.overlayElement, 'dv-drop-target-bottom', isBottom);
|
|
4537
|
-
toggleClass(this.overlayElement, 'dv-drop-target-center', quadrant === 'center');
|
|
4489
|
+
renderInPlaceOverlay(this.overlayElement, quadrant, width, height, this.options.overlayModel);
|
|
4538
4490
|
}
|
|
4539
4491
|
calculateQuadrant(overlayType, x, y, width, height) {
|
|
4540
4492
|
var _a, _b;
|
|
4541
|
-
const activationSizeOptions = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE;
|
|
4493
|
+
const activationSizeOptions = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE$1;
|
|
4542
4494
|
const isPercentage = activationSizeOptions.type === 'percentage';
|
|
4543
4495
|
if (isPercentage) {
|
|
4544
4496
|
return calculateQuadrantAsPercentage(overlayType, x, y, width, height, activationSizeOptions.value);
|
|
@@ -4596,129 +4548,846 @@
|
|
|
4596
4548
|
return 'center';
|
|
4597
4549
|
}
|
|
4598
4550
|
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
4607
|
-
|
|
4608
|
-
|
|
4609
|
-
|
|
4610
|
-
|
|
4611
|
-
class PaneviewUnhandledDragOverEvent extends AcceptableEvent {
|
|
4612
|
-
constructor(nativeEvent, position, getData, panel) {
|
|
4613
|
-
super();
|
|
4614
|
-
this.nativeEvent = nativeEvent;
|
|
4615
|
-
this.position = position;
|
|
4616
|
-
this.getData = getData;
|
|
4617
|
-
this.panel = panel;
|
|
4618
|
-
}
|
|
4551
|
+
function addGhostImage(dataTransfer, ghostElement, options) {
|
|
4552
|
+
var _a, _b;
|
|
4553
|
+
// class dockview provides to force ghost image to be drawn on a different layer and prevent weird rendering issues
|
|
4554
|
+
addClasses(ghostElement, 'dv-dragged');
|
|
4555
|
+
// move the element off-screen initially otherwise it may in some cases be rendered at (0,0) momentarily
|
|
4556
|
+
ghostElement.style.top = '-9999px';
|
|
4557
|
+
document.body.appendChild(ghostElement);
|
|
4558
|
+
dataTransfer.setDragImage(ghostElement, (_a = options === null || options === void 0 ? void 0 : options.x) !== null && _a !== void 0 ? _a : 0, (_b = options === null || options === void 0 ? void 0 : options.y) !== null && _b !== void 0 ? _b : 0);
|
|
4559
|
+
setTimeout(() => {
|
|
4560
|
+
removeClasses(ghostElement, 'dv-dragged');
|
|
4561
|
+
ghostElement.remove();
|
|
4562
|
+
}, 0);
|
|
4619
4563
|
}
|
|
4620
4564
|
|
|
4621
|
-
class WillFocusEvent extends DockviewEvent {
|
|
4622
|
-
constructor() {
|
|
4623
|
-
super();
|
|
4624
|
-
}
|
|
4625
|
-
}
|
|
4626
4565
|
/**
|
|
4627
|
-
*
|
|
4566
|
+
* Singleton — only one pointer-driven drag active at a time.
|
|
4567
|
+
*
|
|
4568
|
+
* State is shared across every Dockview instance on the page. Targets
|
|
4569
|
+
* from instance B receive hit-tests from drags originating in instance A;
|
|
4570
|
+
* that's intentional for cross-instance drops since `LocalSelectionTransfer`
|
|
4571
|
+
* is also process-wide. The corollary is that every Tabs subscriber to
|
|
4572
|
+
* `onDragMove` fires for every pointer drag globally — each subscriber
|
|
4573
|
+
* hit-tests against its own DOM, so this is O(N) per pointermove where N
|
|
4574
|
+
* is the number of registered listeners across all instances.
|
|
4628
4575
|
*/
|
|
4629
|
-
class
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
return
|
|
4635
|
-
}
|
|
4636
|
-
get isVisible() {
|
|
4637
|
-
return this._isVisible;
|
|
4638
|
-
}
|
|
4639
|
-
get width() {
|
|
4640
|
-
return this._width;
|
|
4641
|
-
}
|
|
4642
|
-
get height() {
|
|
4643
|
-
return this._height;
|
|
4576
|
+
class PointerDragController extends CompositeDisposable {
|
|
4577
|
+
static getInstance() {
|
|
4578
|
+
if (!PointerDragController._instance) {
|
|
4579
|
+
PointerDragController._instance = new PointerDragController();
|
|
4580
|
+
}
|
|
4581
|
+
return PointerDragController._instance;
|
|
4644
4582
|
}
|
|
4645
|
-
constructor(
|
|
4583
|
+
constructor() {
|
|
4646
4584
|
super();
|
|
4647
|
-
this.
|
|
4648
|
-
|
|
4649
|
-
this.
|
|
4650
|
-
this.
|
|
4651
|
-
this.
|
|
4652
|
-
this.
|
|
4653
|
-
this.
|
|
4654
|
-
this.
|
|
4655
|
-
this.
|
|
4656
|
-
this.
|
|
4657
|
-
this.onDidDimensionsChange = this._onDidDimensionChange.event;
|
|
4658
|
-
this._onDidChangeFocus = new Emitter();
|
|
4659
|
-
this.onDidFocusChange = this._onDidChangeFocus.event;
|
|
4660
|
-
//
|
|
4661
|
-
this._onWillFocus = new Emitter();
|
|
4662
|
-
this.onWillFocus = this._onWillFocus.event;
|
|
4663
|
-
//
|
|
4664
|
-
this._onDidVisibilityChange = new Emitter();
|
|
4665
|
-
this.onDidVisibilityChange = this._onDidVisibilityChange.event;
|
|
4666
|
-
this._onWillVisibilityChange = new Emitter();
|
|
4667
|
-
this.onWillVisibilityChange = this._onWillVisibilityChange.event;
|
|
4668
|
-
this._onDidActiveChange = new Emitter();
|
|
4669
|
-
this.onDidActiveChange = this._onDidActiveChange.event;
|
|
4670
|
-
this._onActiveChange = new Emitter();
|
|
4671
|
-
this.onActiveChange = this._onActiveChange.event;
|
|
4672
|
-
this._onDidParametersChange = new Emitter();
|
|
4673
|
-
this.onDidParametersChange = this._onDidParametersChange.event;
|
|
4674
|
-
this.addDisposables(this.onDidFocusChange((event) => {
|
|
4675
|
-
this._isFocused = event.isFocused;
|
|
4676
|
-
}), this.onDidActiveChange((event) => {
|
|
4677
|
-
this._isActive = event.isActive;
|
|
4678
|
-
}), this.onDidVisibilityChange((event) => {
|
|
4679
|
-
this._isVisible = event.isVisible;
|
|
4680
|
-
}), this.onDidDimensionsChange((event) => {
|
|
4681
|
-
this._width = event.width;
|
|
4682
|
-
this._height = event.height;
|
|
4683
|
-
}), this.panelUpdatesDisposable, this._onDidDimensionChange, this._onDidChangeFocus, this._onDidVisibilityChange, this._onDidActiveChange, this._onWillFocus, this._onActiveChange, this._onWillFocus, this._onWillVisibilityChange, this._onDidParametersChange);
|
|
4585
|
+
this._targets = new Set();
|
|
4586
|
+
/** Kept in sync with `_targets` so hit-testing is allocation-free. */
|
|
4587
|
+
this._targetByElement = new Map();
|
|
4588
|
+
this._onDragStart = new Emitter();
|
|
4589
|
+
this.onDragStart = this._onDragStart.event;
|
|
4590
|
+
this._onDragMove = new Emitter();
|
|
4591
|
+
this.onDragMove = this._onDragMove.event;
|
|
4592
|
+
this._onDragEnd = new Emitter();
|
|
4593
|
+
this.onDragEnd = this._onDragEnd.event;
|
|
4594
|
+
this.addDisposables(this._onDragStart, this._onDragMove, this._onDragEnd);
|
|
4684
4595
|
}
|
|
4685
|
-
|
|
4686
|
-
return this.
|
|
4596
|
+
get active() {
|
|
4597
|
+
return this._active;
|
|
4687
4598
|
}
|
|
4688
|
-
|
|
4689
|
-
this.
|
|
4690
|
-
|
|
4691
|
-
|
|
4692
|
-
|
|
4693
|
-
|
|
4599
|
+
registerTarget(target) {
|
|
4600
|
+
this._targets.add(target);
|
|
4601
|
+
this._targetByElement.set(target.element, target);
|
|
4602
|
+
return {
|
|
4603
|
+
dispose: () => {
|
|
4604
|
+
this._targets.delete(target);
|
|
4605
|
+
if (this._targetByElement.get(target.element) === target) {
|
|
4606
|
+
this._targetByElement.delete(target.element);
|
|
4607
|
+
}
|
|
4608
|
+
if (this._currentTarget === target) {
|
|
4609
|
+
this._currentTarget = undefined;
|
|
4610
|
+
}
|
|
4611
|
+
},
|
|
4612
|
+
};
|
|
4613
|
+
}
|
|
4614
|
+
beginDrag(args) {
|
|
4615
|
+
var _a, _b, _c;
|
|
4616
|
+
if (this._active) {
|
|
4617
|
+
this.cancel();
|
|
4618
|
+
}
|
|
4619
|
+
const { pointerEvent, source } = args;
|
|
4620
|
+
// Call `getData()` before mutating controller state — a throw
|
|
4621
|
+
// here would otherwise leave `_active` populated with no window
|
|
4622
|
+
// listeners installed, blocking every subsequent drag.
|
|
4623
|
+
const dataDisposable = args.getData();
|
|
4624
|
+
this._active = {
|
|
4625
|
+
pointerId: pointerEvent.pointerId,
|
|
4626
|
+
startX: pointerEvent.clientX,
|
|
4627
|
+
startY: pointerEvent.clientY,
|
|
4628
|
+
source,
|
|
4629
|
+
};
|
|
4630
|
+
this._onDragMoveCallback = args.onDragMove;
|
|
4631
|
+
this._onDragEndCallback = args.onDragEnd;
|
|
4632
|
+
this._dataDisposable = dataDisposable;
|
|
4633
|
+
this._ghost = args.ghost;
|
|
4634
|
+
// Iframes capture pointermove once the cursor crosses into them,
|
|
4635
|
+
// which would freeze the drag from the parent window's POV.
|
|
4636
|
+
this._iframeShield = disableIframePointEvents((_a = source.ownerDocument) !== null && _a !== void 0 ? _a : document);
|
|
4637
|
+
const startEvent = {
|
|
4638
|
+
clientX: pointerEvent.clientX,
|
|
4639
|
+
clientY: pointerEvent.clientY,
|
|
4640
|
+
pointerEvent,
|
|
4641
|
+
};
|
|
4642
|
+
this._onDragStart.fire(startEvent);
|
|
4643
|
+
// Source's owning window — popout drags fire on their own window,
|
|
4644
|
+
// not the main one.
|
|
4645
|
+
const targetWindow = (_c = (_b = source.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView) !== null && _c !== void 0 ? _c : window;
|
|
4646
|
+
this._moveListener = addDisposableListener(targetWindow, 'pointermove', (e) => {
|
|
4647
|
+
if (!this._active || e.pointerId !== this._active.pointerId) {
|
|
4648
|
+
return;
|
|
4649
|
+
}
|
|
4650
|
+
this._handleMove(e);
|
|
4651
|
+
});
|
|
4652
|
+
this._upListener = addDisposableListener(targetWindow, 'pointerup', (e) => {
|
|
4653
|
+
if (!this._active || e.pointerId !== this._active.pointerId) {
|
|
4654
|
+
return;
|
|
4655
|
+
}
|
|
4656
|
+
this._handleEnd(e, true);
|
|
4657
|
+
});
|
|
4658
|
+
this._cancelListener = addDisposableListener(targetWindow, 'pointercancel', (e) => {
|
|
4659
|
+
if (!this._active || e.pointerId !== this._active.pointerId) {
|
|
4660
|
+
return;
|
|
4661
|
+
}
|
|
4662
|
+
this._handleEnd(e, false);
|
|
4694
4663
|
});
|
|
4695
4664
|
}
|
|
4696
|
-
|
|
4697
|
-
|
|
4665
|
+
cancel() {
|
|
4666
|
+
var _a, _b;
|
|
4667
|
+
if (!this._active) {
|
|
4668
|
+
return;
|
|
4669
|
+
}
|
|
4670
|
+
(_a = this._currentTarget) === null || _a === void 0 ? void 0 : _a.handleDragLeave();
|
|
4671
|
+
this._teardown();
|
|
4672
|
+
(_b = this._dataDisposable) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
4673
|
+
this._dataDisposable = undefined;
|
|
4698
4674
|
}
|
|
4699
|
-
|
|
4700
|
-
|
|
4675
|
+
_findTargetUnder(x, y) {
|
|
4676
|
+
var _a, _b;
|
|
4677
|
+
// `elementsFromPoint` is topmost-first; walk up to find the closest
|
|
4678
|
+
// registered ancestor (so a tab beats the layout-root that contains it).
|
|
4679
|
+
// Use the source's owning document so popout drags hit their own targets.
|
|
4680
|
+
const sourceDoc = (_b = (_a = this._active) === null || _a === void 0 ? void 0 : _a.source.ownerDocument) !== null && _b !== void 0 ? _b : document;
|
|
4681
|
+
const elements = sourceDoc.elementsFromPoint(x, y);
|
|
4682
|
+
for (const el of elements) {
|
|
4683
|
+
let current = el;
|
|
4684
|
+
while (current) {
|
|
4685
|
+
const target = this._targetByElement.get(current);
|
|
4686
|
+
if (target) {
|
|
4687
|
+
return target;
|
|
4688
|
+
}
|
|
4689
|
+
current = current.parentElement;
|
|
4690
|
+
}
|
|
4691
|
+
}
|
|
4692
|
+
return undefined;
|
|
4701
4693
|
}
|
|
4702
|
-
|
|
4703
|
-
|
|
4694
|
+
_handleMove(e) {
|
|
4695
|
+
var _a, _b, _c;
|
|
4696
|
+
(_a = this._ghost) === null || _a === void 0 ? void 0 : _a.update(e.clientX, e.clientY);
|
|
4697
|
+
const dragEvent = {
|
|
4698
|
+
clientX: e.clientX,
|
|
4699
|
+
clientY: e.clientY,
|
|
4700
|
+
pointerEvent: e,
|
|
4701
|
+
};
|
|
4702
|
+
const newTarget = this._findTargetUnder(e.clientX, e.clientY);
|
|
4703
|
+
if (newTarget !== this._currentTarget) {
|
|
4704
|
+
(_b = this._currentTarget) === null || _b === void 0 ? void 0 : _b.handleDragLeave();
|
|
4705
|
+
this._currentTarget = newTarget;
|
|
4706
|
+
}
|
|
4707
|
+
if (newTarget) {
|
|
4708
|
+
newTarget.handleDragOver(dragEvent);
|
|
4709
|
+
}
|
|
4710
|
+
(_c = this._onDragMoveCallback) === null || _c === void 0 ? void 0 : _c.call(this, dragEvent);
|
|
4711
|
+
this._onDragMove.fire(dragEvent);
|
|
4712
|
+
}
|
|
4713
|
+
_handleEnd(e, dropped) {
|
|
4714
|
+
var _a;
|
|
4715
|
+
const dragEvent = {
|
|
4716
|
+
clientX: e.clientX,
|
|
4717
|
+
clientY: e.clientY,
|
|
4718
|
+
pointerEvent: e,
|
|
4719
|
+
};
|
|
4720
|
+
if (dropped && this._currentTarget) {
|
|
4721
|
+
this._currentTarget.handleDrop(dragEvent);
|
|
4722
|
+
}
|
|
4723
|
+
else {
|
|
4724
|
+
(_a = this._currentTarget) === null || _a === void 0 ? void 0 : _a.handleDragLeave();
|
|
4725
|
+
}
|
|
4726
|
+
const onEnd = this._onDragEndCallback;
|
|
4727
|
+
const dataDisposable = this._dataDisposable;
|
|
4728
|
+
this._teardown();
|
|
4729
|
+
this._dataDisposable = undefined;
|
|
4730
|
+
// Defer disposal so drop handlers can still read the transfer data.
|
|
4731
|
+
setTimeout(() => dataDisposable === null || dataDisposable === void 0 ? void 0 : dataDisposable.dispose(), 0);
|
|
4732
|
+
onEnd === null || onEnd === void 0 ? void 0 : onEnd(dragEvent, dropped);
|
|
4733
|
+
this._onDragEnd.fire(dragEvent);
|
|
4734
|
+
}
|
|
4735
|
+
_teardown() {
|
|
4736
|
+
var _a, _b, _c, _d, _e;
|
|
4737
|
+
this._currentTarget = undefined;
|
|
4738
|
+
this._active = undefined;
|
|
4739
|
+
this._onDragMoveCallback = undefined;
|
|
4740
|
+
this._onDragEndCallback = undefined;
|
|
4741
|
+
(_a = this._ghost) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
4742
|
+
this._ghost = undefined;
|
|
4743
|
+
(_b = this._iframeShield) === null || _b === void 0 ? void 0 : _b.release();
|
|
4744
|
+
this._iframeShield = undefined;
|
|
4745
|
+
(_c = this._moveListener) === null || _c === void 0 ? void 0 : _c.dispose();
|
|
4746
|
+
(_d = this._upListener) === null || _d === void 0 ? void 0 : _d.dispose();
|
|
4747
|
+
(_e = this._cancelListener) === null || _e === void 0 ? void 0 : _e.dispose();
|
|
4748
|
+
this._moveListener = undefined;
|
|
4749
|
+
this._upListener = undefined;
|
|
4750
|
+
this._cancelListener = undefined;
|
|
4704
4751
|
}
|
|
4705
4752
|
}
|
|
4706
4753
|
|
|
4707
|
-
|
|
4708
|
-
|
|
4709
|
-
|
|
4710
|
-
|
|
4711
|
-
|
|
4712
|
-
|
|
4713
|
-
|
|
4714
|
-
this.
|
|
4715
|
-
|
|
4716
|
-
|
|
4717
|
-
this.
|
|
4718
|
-
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
|
|
4754
|
+
const DEFAULT_ACTIVATION_SIZE = {
|
|
4755
|
+
value: 20,
|
|
4756
|
+
type: 'percentage',
|
|
4757
|
+
};
|
|
4758
|
+
/** Pointer-driven counterpart to `Droptarget` with identical visual output. */
|
|
4759
|
+
class PointerDropTarget extends CompositeDisposable {
|
|
4760
|
+
get disabled() {
|
|
4761
|
+
return this._disabled;
|
|
4762
|
+
}
|
|
4763
|
+
set disabled(value) {
|
|
4764
|
+
this._disabled = value;
|
|
4765
|
+
if (value) {
|
|
4766
|
+
this._removeOverlay();
|
|
4767
|
+
}
|
|
4768
|
+
}
|
|
4769
|
+
get state() {
|
|
4770
|
+
return this._state;
|
|
4771
|
+
}
|
|
4772
|
+
constructor(element, options) {
|
|
4773
|
+
super();
|
|
4774
|
+
this.element = element;
|
|
4775
|
+
this.options = options;
|
|
4776
|
+
this._onDrop = new Emitter();
|
|
4777
|
+
this.onDrop = this._onDrop.event;
|
|
4778
|
+
this._onWillShowOverlay = new Emitter();
|
|
4779
|
+
this.onWillShowOverlay = this._onWillShowOverlay.event;
|
|
4780
|
+
this._disabled = false;
|
|
4781
|
+
this._acceptedTargetZonesSet = new Set(options.acceptedTargetZones);
|
|
4782
|
+
const handle = {
|
|
4783
|
+
element: this.element,
|
|
4784
|
+
handleDragOver: (e) => this._onDragOver(e),
|
|
4785
|
+
handleDragLeave: () => this._onDragLeave(),
|
|
4786
|
+
handleDrop: (e) => this._onDropEvent(e),
|
|
4787
|
+
};
|
|
4788
|
+
this.addDisposables(this._onDrop, this._onWillShowOverlay, PointerDragController.getInstance().registerTarget(handle));
|
|
4789
|
+
}
|
|
4790
|
+
setTargetZones(zones) {
|
|
4791
|
+
this._acceptedTargetZonesSet = new Set(zones);
|
|
4792
|
+
}
|
|
4793
|
+
setOverlayModel(model) {
|
|
4794
|
+
this.options.overlayModel = model;
|
|
4795
|
+
}
|
|
4796
|
+
dispose() {
|
|
4797
|
+
this._removeOverlay();
|
|
4798
|
+
super.dispose();
|
|
4799
|
+
}
|
|
4800
|
+
_onDragOver(event) {
|
|
4801
|
+
var _a, _b, _c, _d, _e;
|
|
4802
|
+
if (this._disabled) {
|
|
4803
|
+
this._removeOverlay();
|
|
4804
|
+
return;
|
|
4805
|
+
}
|
|
4806
|
+
const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
4807
|
+
if (this._acceptedTargetZonesSet.size === 0) {
|
|
4808
|
+
if (overrideTarget) {
|
|
4809
|
+
return;
|
|
4810
|
+
}
|
|
4811
|
+
this._removeOverlay();
|
|
4812
|
+
return;
|
|
4813
|
+
}
|
|
4814
|
+
const outlineEl = (_e = (_d = (_c = this.options).getOverlayOutline) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.element;
|
|
4815
|
+
const width = outlineEl.offsetWidth;
|
|
4816
|
+
const height = outlineEl.offsetHeight;
|
|
4817
|
+
if (width === 0 || height === 0) {
|
|
4818
|
+
return;
|
|
4819
|
+
}
|
|
4820
|
+
const rect = outlineEl.getBoundingClientRect();
|
|
4821
|
+
const x = event.clientX - rect.left;
|
|
4822
|
+
const y = event.clientY - rect.top;
|
|
4823
|
+
const quadrant = this._calculateQuadrant(x, y, width, height);
|
|
4824
|
+
if (quadrant === null) {
|
|
4825
|
+
this._removeOverlay();
|
|
4826
|
+
return;
|
|
4827
|
+
}
|
|
4828
|
+
if (!this.options.canDisplayOverlay(event.pointerEvent, quadrant)) {
|
|
4829
|
+
if (overrideTarget) {
|
|
4830
|
+
return;
|
|
4831
|
+
}
|
|
4832
|
+
this._removeOverlay();
|
|
4833
|
+
return;
|
|
4834
|
+
}
|
|
4835
|
+
const willShow = new WillShowOverlayEvent({
|
|
4836
|
+
nativeEvent: event.pointerEvent,
|
|
4837
|
+
position: quadrant,
|
|
4838
|
+
});
|
|
4839
|
+
this._onWillShowOverlay.fire(willShow);
|
|
4840
|
+
if (willShow.defaultPrevented) {
|
|
4841
|
+
this._removeOverlay();
|
|
4842
|
+
return;
|
|
4843
|
+
}
|
|
4844
|
+
if (overrideTarget) {
|
|
4845
|
+
renderAnchoredOverlay({
|
|
4846
|
+
outlineElement: outlineEl,
|
|
4847
|
+
targetModel: overrideTarget,
|
|
4848
|
+
quadrant,
|
|
4849
|
+
width,
|
|
4850
|
+
height,
|
|
4851
|
+
overlayModel: this.options.overlayModel,
|
|
4852
|
+
className: this.options.className,
|
|
4853
|
+
});
|
|
4854
|
+
this._state = quadrant;
|
|
4855
|
+
return;
|
|
4856
|
+
}
|
|
4857
|
+
if (!this._targetElement) {
|
|
4858
|
+
const els = createOverlayElements();
|
|
4859
|
+
this._targetElement = els.dropzone;
|
|
4860
|
+
this._overlayElement = els.selection;
|
|
4861
|
+
this._state = 'center';
|
|
4862
|
+
this.element.classList.add('dv-drop-target');
|
|
4863
|
+
this.element.append(this._targetElement);
|
|
4864
|
+
}
|
|
4865
|
+
if (this._overlayElement) {
|
|
4866
|
+
renderInPlaceOverlay(this._overlayElement, quadrant, width, height, this.options.overlayModel);
|
|
4867
|
+
}
|
|
4868
|
+
this._state = quadrant;
|
|
4869
|
+
}
|
|
4870
|
+
_onDragLeave() {
|
|
4871
|
+
var _a, _b;
|
|
4872
|
+
const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
4873
|
+
// Anchor target owns its own lifecycle; just clear our latched
|
|
4874
|
+
// state so a subsequent pointerup doesn't fire a stale drop.
|
|
4875
|
+
if (overrideTarget) {
|
|
4876
|
+
this._state = undefined;
|
|
4877
|
+
overrideTarget.clear();
|
|
4878
|
+
return;
|
|
4879
|
+
}
|
|
4880
|
+
this._removeOverlay();
|
|
4881
|
+
}
|
|
4882
|
+
_onDropEvent(event) {
|
|
4883
|
+
var _a, _b;
|
|
4884
|
+
const state = this._state;
|
|
4885
|
+
const overrideTarget = (_b = (_a = this.options).getOverrideTarget) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
4886
|
+
this._removeOverlay();
|
|
4887
|
+
overrideTarget === null || overrideTarget === void 0 ? void 0 : overrideTarget.clear();
|
|
4888
|
+
if (state) {
|
|
4889
|
+
this._onDrop.fire({
|
|
4890
|
+
position: state,
|
|
4891
|
+
nativeEvent: event.pointerEvent,
|
|
4892
|
+
});
|
|
4893
|
+
}
|
|
4894
|
+
}
|
|
4895
|
+
_calculateQuadrant(x, y, width, height) {
|
|
4896
|
+
var _a, _b;
|
|
4897
|
+
const activation = (_b = (_a = this.options.overlayModel) === null || _a === void 0 ? void 0 : _a.activationSize) !== null && _b !== void 0 ? _b : DEFAULT_ACTIVATION_SIZE;
|
|
4898
|
+
if (activation.type === 'percentage') {
|
|
4899
|
+
return calculateQuadrantAsPercentage(this._acceptedTargetZonesSet, x, y, width, height, activation.value);
|
|
4900
|
+
}
|
|
4901
|
+
return calculateQuadrantAsPixels(this._acceptedTargetZonesSet, x, y, width, height, activation.value);
|
|
4902
|
+
}
|
|
4903
|
+
_removeOverlay() {
|
|
4904
|
+
var _a;
|
|
4905
|
+
if (this._targetElement) {
|
|
4906
|
+
this._state = undefined;
|
|
4907
|
+
(_a = this._targetElement.parentElement) === null || _a === void 0 ? void 0 : _a.classList.remove('dv-drop-target');
|
|
4908
|
+
this._targetElement.remove();
|
|
4909
|
+
this._targetElement = undefined;
|
|
4910
|
+
this._overlayElement = undefined;
|
|
4911
|
+
}
|
|
4912
|
+
else {
|
|
4913
|
+
this._state = undefined;
|
|
4914
|
+
}
|
|
4915
|
+
}
|
|
4916
|
+
}
|
|
4917
|
+
|
|
4918
|
+
const DEFAULT_THRESHOLD = 5;
|
|
4919
|
+
const DEFAULT_TOUCH_INITIATION_DELAY = 250;
|
|
4920
|
+
const DEFAULT_PRESS_TOLERANCE = 8;
|
|
4921
|
+
/**
|
|
4922
|
+
* Pointer-event drag source. Waits for movement past `threshold` (and
|
|
4923
|
+
* touch-only `touchInitiationDelay`) before promoting to a drag so taps
|
|
4924
|
+
* pass through unaffected.
|
|
4925
|
+
*/
|
|
4926
|
+
class PointerDragSource extends CompositeDisposable {
|
|
4927
|
+
constructor(element, options) {
|
|
4928
|
+
var _a;
|
|
4929
|
+
super();
|
|
4930
|
+
this.element = element;
|
|
4931
|
+
this.options = options;
|
|
4932
|
+
this._disabled = false;
|
|
4933
|
+
this._armed = false;
|
|
4934
|
+
this._startX = 0;
|
|
4935
|
+
this._startY = 0;
|
|
4936
|
+
this._touchOnly = (_a = options.touchOnly) !== null && _a !== void 0 ? _a : true;
|
|
4937
|
+
this.addDisposables(addDisposableListener(this.element, 'pointerdown', (e) => {
|
|
4938
|
+
this._onPointerDown(e);
|
|
4939
|
+
}));
|
|
4940
|
+
}
|
|
4941
|
+
setDisabled(value) {
|
|
4942
|
+
this._disabled = value;
|
|
4943
|
+
if (value) {
|
|
4944
|
+
this._cancelPending();
|
|
4945
|
+
}
|
|
4946
|
+
}
|
|
4947
|
+
/**
|
|
4948
|
+
* `false` lets the pointer source also handle mouse pointers; used when
|
|
4949
|
+
* `dndStrategy: 'pointer'` to drive every input type through this path.
|
|
4950
|
+
*/
|
|
4951
|
+
setTouchOnly(value) {
|
|
4952
|
+
if (this._touchOnly === value) {
|
|
4953
|
+
return;
|
|
4954
|
+
}
|
|
4955
|
+
this._touchOnly = value;
|
|
4956
|
+
// A pending mouse-tracked drag should be abandoned if we re-enable
|
|
4957
|
+
// the touch-only filter mid-flight.
|
|
4958
|
+
if (value) {
|
|
4959
|
+
this._cancelPending();
|
|
4960
|
+
}
|
|
4961
|
+
}
|
|
4962
|
+
_shouldHandle(event) {
|
|
4963
|
+
var _a, _b;
|
|
4964
|
+
if (this._disabled) {
|
|
4965
|
+
return false;
|
|
4966
|
+
}
|
|
4967
|
+
// Pointer-type filter runs before isCancelled — consumer state read
|
|
4968
|
+
// by isCancelled may not be populated for events we'll never handle.
|
|
4969
|
+
if (this._touchOnly &&
|
|
4970
|
+
event.pointerType !== 'touch' &&
|
|
4971
|
+
event.pointerType !== 'pen') {
|
|
4972
|
+
return false;
|
|
4973
|
+
}
|
|
4974
|
+
if ((_b = (_a = this.options).isCancelled) === null || _b === void 0 ? void 0 : _b.call(_a, event)) {
|
|
4975
|
+
return false;
|
|
4976
|
+
}
|
|
4977
|
+
return true;
|
|
4978
|
+
}
|
|
4979
|
+
_onPointerDown(event) {
|
|
4980
|
+
var _a, _b, _c, _d, _e;
|
|
4981
|
+
if (!this._shouldHandle(event)) {
|
|
4982
|
+
return;
|
|
4983
|
+
}
|
|
4984
|
+
// Defensive: a fresh pointerdown supersedes any in-flight tracking.
|
|
4985
|
+
this._cancelPending();
|
|
4986
|
+
this._pendingPointerId = event.pointerId;
|
|
4987
|
+
this._startX = event.clientX;
|
|
4988
|
+
this._startY = event.clientY;
|
|
4989
|
+
this._startEvent = event;
|
|
4990
|
+
const isTouch = event.pointerType === 'touch' || event.pointerType === 'pen';
|
|
4991
|
+
// Touch waits a short window so a still finger can press-and-hold
|
|
4992
|
+
// before drifting; once the timer fires, any motion past `threshold`
|
|
4993
|
+
// begins the drag.
|
|
4994
|
+
const initiationDelayOpt = this.options.touchInitiationDelay;
|
|
4995
|
+
const initiationDelay = (_a = (typeof initiationDelayOpt === 'function'
|
|
4996
|
+
? initiationDelayOpt()
|
|
4997
|
+
: initiationDelayOpt)) !== null && _a !== void 0 ? _a : DEFAULT_TOUCH_INITIATION_DELAY;
|
|
4998
|
+
this._armed = !isTouch || initiationDelay <= 0;
|
|
4999
|
+
if (isTouch && initiationDelay > 0 && isFinite(initiationDelay)) {
|
|
5000
|
+
this._armTimer = setTimeout(() => {
|
|
5001
|
+
this._armTimer = undefined;
|
|
5002
|
+
this._armed = true;
|
|
5003
|
+
}, initiationDelay);
|
|
5004
|
+
}
|
|
5005
|
+
const threshold = (_b = this.options.threshold) !== null && _b !== void 0 ? _b : DEFAULT_THRESHOLD;
|
|
5006
|
+
const pressToleranceOpt = this.options.pressTolerance;
|
|
5007
|
+
const pressTolerance = (_c = (typeof pressToleranceOpt === 'function'
|
|
5008
|
+
? pressToleranceOpt()
|
|
5009
|
+
: pressToleranceOpt)) !== null && _c !== void 0 ? _c : DEFAULT_PRESS_TOLERANCE;
|
|
5010
|
+
// Source's owning window — popout drags fire on their own window.
|
|
5011
|
+
const targetWindow = (_e = (_d = this.element.ownerDocument) === null || _d === void 0 ? void 0 : _d.defaultView) !== null && _e !== void 0 ? _e : window;
|
|
5012
|
+
this._pendingMoveListener = addDisposableListener(targetWindow, 'pointermove', (moveEvent) => {
|
|
5013
|
+
if (moveEvent.pointerId !== this._pendingPointerId) {
|
|
5014
|
+
return;
|
|
5015
|
+
}
|
|
5016
|
+
const dx = moveEvent.clientX - this._startX;
|
|
5017
|
+
const dy = moveEvent.clientY - this._startY;
|
|
5018
|
+
const distance = Math.hypot(dx, dy);
|
|
5019
|
+
if (this._armed) {
|
|
5020
|
+
if (distance >= threshold) {
|
|
5021
|
+
this._beginDrag(moveEvent);
|
|
5022
|
+
}
|
|
5023
|
+
return;
|
|
5024
|
+
}
|
|
5025
|
+
// Pre-arm phase: a flick past `pressTolerance` in any
|
|
5026
|
+
// direction is treated as drag intent. The element opts out
|
|
5027
|
+
// of native scroll via `touch-action: none`; container-level
|
|
5028
|
+
// scrolling lives on the surrounding strip's empty space.
|
|
5029
|
+
if (distance > pressTolerance) {
|
|
5030
|
+
this._beginDrag(moveEvent);
|
|
5031
|
+
}
|
|
5032
|
+
});
|
|
5033
|
+
this._pendingUpListener = addDisposableListener(targetWindow, 'pointerup', (upEvent) => {
|
|
5034
|
+
if (upEvent.pointerId !== this._pendingPointerId) {
|
|
5035
|
+
return;
|
|
5036
|
+
}
|
|
5037
|
+
this._cancelPending();
|
|
5038
|
+
});
|
|
5039
|
+
this._pendingCancelListener = addDisposableListener(targetWindow, 'pointercancel', (cancelEvent) => {
|
|
5040
|
+
if (cancelEvent.pointerId !== this._pendingPointerId) {
|
|
5041
|
+
return;
|
|
5042
|
+
}
|
|
5043
|
+
this._cancelPending();
|
|
5044
|
+
});
|
|
5045
|
+
}
|
|
5046
|
+
/** For sibling gesture detectors (e.g. LongPressDetector) to dismiss a pending drag. */
|
|
5047
|
+
cancelPending() {
|
|
5048
|
+
this._cancelPending();
|
|
5049
|
+
}
|
|
5050
|
+
_cancelPending() {
|
|
5051
|
+
var _a, _b, _c;
|
|
5052
|
+
this._pendingPointerId = undefined;
|
|
5053
|
+
if (this._armTimer !== undefined) {
|
|
5054
|
+
clearTimeout(this._armTimer);
|
|
5055
|
+
this._armTimer = undefined;
|
|
5056
|
+
}
|
|
5057
|
+
this._armed = false;
|
|
5058
|
+
(_a = this._pendingMoveListener) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
5059
|
+
(_b = this._pendingUpListener) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
5060
|
+
(_c = this._pendingCancelListener) === null || _c === void 0 ? void 0 : _c.dispose();
|
|
5061
|
+
this._pendingMoveListener = undefined;
|
|
5062
|
+
this._pendingUpListener = undefined;
|
|
5063
|
+
this._pendingCancelListener = undefined;
|
|
5064
|
+
this._startEvent = undefined;
|
|
5065
|
+
}
|
|
5066
|
+
_beginDrag(triggerEvent) {
|
|
5067
|
+
var _a, _b, _c, _d, _e;
|
|
5068
|
+
const startEvent = (_a = this._startEvent) !== null && _a !== void 0 ? _a : triggerEvent;
|
|
5069
|
+
this._cancelPending();
|
|
5070
|
+
(_c = (_b = this.options).onDragStart) === null || _c === void 0 ? void 0 : _c.call(_b, startEvent);
|
|
5071
|
+
const ghost = (_e = (_d = this.options).createGhost) === null || _e === void 0 ? void 0 : _e.call(_d, startEvent);
|
|
5072
|
+
PointerDragController.getInstance().beginDrag({
|
|
5073
|
+
pointerEvent: triggerEvent,
|
|
5074
|
+
source: this.element,
|
|
5075
|
+
getData: () => this.options.getData(startEvent),
|
|
5076
|
+
ghost,
|
|
5077
|
+
onDragMove: this.options.onDragMove,
|
|
5078
|
+
onDragEnd: this.options.onDragEnd,
|
|
5079
|
+
});
|
|
5080
|
+
}
|
|
5081
|
+
dispose() {
|
|
5082
|
+
this._cancelPending();
|
|
5083
|
+
super.dispose();
|
|
5084
|
+
}
|
|
5085
|
+
}
|
|
5086
|
+
|
|
5087
|
+
/**
|
|
5088
|
+
* Floating clone that follows the pointer; appended to the owning
|
|
5089
|
+
* document's body with `pointer-events: none` so it doesn't intercept
|
|
5090
|
+
* hit-testing.
|
|
5091
|
+
*/
|
|
5092
|
+
class PointerGhost {
|
|
5093
|
+
constructor(opts) {
|
|
5094
|
+
var _a, _b, _c, _d, _e;
|
|
5095
|
+
this._disposed = false;
|
|
5096
|
+
this.element = opts.element;
|
|
5097
|
+
this.offsetX = (_a = opts.offsetX) !== null && _a !== void 0 ? _a : 0;
|
|
5098
|
+
this.offsetY = (_b = opts.offsetY) !== null && _b !== void 0 ? _b : 0;
|
|
5099
|
+
// Animate via transform (see update); position:fixed for scroll-independence.
|
|
5100
|
+
this.element.style.position = 'fixed';
|
|
5101
|
+
this.element.style.left = '0px';
|
|
5102
|
+
this.element.style.top = '0px';
|
|
5103
|
+
this.element.style.pointerEvents = 'none';
|
|
5104
|
+
this.element.style.zIndex = '99999';
|
|
5105
|
+
this.element.style.opacity = String((_c = opts.opacity) !== null && _c !== void 0 ? _c : 0.8);
|
|
5106
|
+
this.element.style.willChange = 'transform';
|
|
5107
|
+
this.element.style.transform = `translate3d(${opts.initialX - this.offsetX}px, ${opts.initialY - this.offsetY}px, 0)`;
|
|
5108
|
+
const ownerDocument = (_e = (_d = opts.owner) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : document;
|
|
5109
|
+
ownerDocument.body.appendChild(this.element);
|
|
5110
|
+
}
|
|
5111
|
+
update(clientX, clientY) {
|
|
5112
|
+
if (this._disposed) {
|
|
5113
|
+
return;
|
|
5114
|
+
}
|
|
5115
|
+
// translate3d composites on the GPU — no layout per pointermove.
|
|
5116
|
+
this.element.style.transform = `translate3d(${clientX - this.offsetX}px, ${clientY - this.offsetY}px, 0)`;
|
|
5117
|
+
}
|
|
5118
|
+
dispose() {
|
|
5119
|
+
if (this._disposed) {
|
|
5120
|
+
return;
|
|
5121
|
+
}
|
|
5122
|
+
this._disposed = true;
|
|
5123
|
+
this.element.remove();
|
|
5124
|
+
}
|
|
5125
|
+
}
|
|
5126
|
+
|
|
5127
|
+
/**
|
|
5128
|
+
* HTML5 drag source. Listens for the native `dragstart` event, calls
|
|
5129
|
+
* `getData` to populate transfer, optionally renders the ghost via
|
|
5130
|
+
* `setDragImage`, fires `onDragStart` / `onDragEnd`, and tears down the
|
|
5131
|
+
* transfer disposer after `dragend`.
|
|
5132
|
+
*/
|
|
5133
|
+
class Html5DragSource extends CompositeDisposable {
|
|
5134
|
+
constructor(el, opts) {
|
|
5135
|
+
super();
|
|
5136
|
+
this.el = el;
|
|
5137
|
+
this.opts = opts;
|
|
5138
|
+
this._dataDisposable = new MutableDisposable();
|
|
5139
|
+
this._pointerEventsDisposable = new MutableDisposable();
|
|
5140
|
+
this._disabled = !!opts.disabled;
|
|
5141
|
+
this.addDisposables(this._dataDisposable, this._pointerEventsDisposable, addDisposableListener(this.el, 'dragstart', (event) => {
|
|
5142
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
5143
|
+
if (event.defaultPrevented ||
|
|
5144
|
+
this._disabled ||
|
|
5145
|
+
((_b = (_a = this.opts).isCancelled) === null || _b === void 0 ? void 0 : _b.call(_a, event))) {
|
|
5146
|
+
event.preventDefault();
|
|
5147
|
+
return;
|
|
5148
|
+
}
|
|
5149
|
+
// Iframes capture pointermove once the cursor enters them,
|
|
5150
|
+
// which freezes drag tracking from the parent window's
|
|
5151
|
+
// POV. Shield the source's owning document so popout-window
|
|
5152
|
+
// drags shield the popout, not the main window.
|
|
5153
|
+
const iframes = disableIframePointEvents((_c = this.el.ownerDocument) !== null && _c !== void 0 ? _c : document);
|
|
5154
|
+
this._pointerEventsDisposable.value = {
|
|
5155
|
+
dispose: () => iframes.release(),
|
|
5156
|
+
};
|
|
5157
|
+
this.el.classList.add('dv-dragged');
|
|
5158
|
+
setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
|
|
5159
|
+
this._dataDisposable.value = this.opts.getData(event);
|
|
5160
|
+
const ghost = (_e = (_d = this.opts).createGhost) === null || _e === void 0 ? void 0 : _e.call(_d, event);
|
|
5161
|
+
if (ghost && event.dataTransfer) {
|
|
5162
|
+
addGhostImage(event.dataTransfer, ghost.element, {
|
|
5163
|
+
x: (_f = ghost.offsetX) !== null && _f !== void 0 ? _f : 0,
|
|
5164
|
+
y: (_g = ghost.offsetY) !== null && _g !== void 0 ? _g : 0,
|
|
5165
|
+
});
|
|
5166
|
+
if (ghost.dispose) {
|
|
5167
|
+
// addGhostImage removes the element from the DOM on
|
|
5168
|
+
// the next tick; dispose the framework renderer on
|
|
5169
|
+
// the same schedule.
|
|
5170
|
+
const disposeGhost = ghost.dispose;
|
|
5171
|
+
setTimeout(() => disposeGhost(), 0);
|
|
5172
|
+
}
|
|
5173
|
+
}
|
|
5174
|
+
if (event.dataTransfer) {
|
|
5175
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
5176
|
+
// Some third-party DnD libs (e.g. react-dnd) cancel the
|
|
5177
|
+
// dragstart when `dataTransfer.types` is empty.
|
|
5178
|
+
if (event.dataTransfer.items.length === 0) {
|
|
5179
|
+
event.dataTransfer.setData('text/plain', '');
|
|
5180
|
+
}
|
|
5181
|
+
}
|
|
5182
|
+
(_j = (_h = this.opts).onDragStart) === null || _j === void 0 ? void 0 : _j.call(_h, event);
|
|
5183
|
+
}), addDisposableListener(this.el, 'dragend', (event) => {
|
|
5184
|
+
var _a, _b;
|
|
5185
|
+
this._pointerEventsDisposable.dispose();
|
|
5186
|
+
// Defer disposal so drop handlers can still read the
|
|
5187
|
+
// transfer payload before it clears.
|
|
5188
|
+
setTimeout(() => this._dataDisposable.dispose(), 0);
|
|
5189
|
+
(_b = (_a = this.opts).onDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, event);
|
|
5190
|
+
}));
|
|
5191
|
+
}
|
|
5192
|
+
setDisabled(value) {
|
|
5193
|
+
this._disabled = value;
|
|
5194
|
+
}
|
|
5195
|
+
setTouchOnly(_) {
|
|
5196
|
+
// No-op — HTML5 path can't filter by pointer type.
|
|
5197
|
+
}
|
|
5198
|
+
cancelPending() {
|
|
5199
|
+
// No-op — HTML5 has no pre-arm phase to cancel.
|
|
5200
|
+
}
|
|
5201
|
+
}
|
|
5202
|
+
class Html5DragBackend {
|
|
5203
|
+
constructor() {
|
|
5204
|
+
this.kind = 'html5';
|
|
5205
|
+
}
|
|
5206
|
+
createDropTarget(element, options) {
|
|
5207
|
+
return new Droptarget(element, options);
|
|
5208
|
+
}
|
|
5209
|
+
createDragSource(element, options) {
|
|
5210
|
+
return new Html5DragSource(element, options);
|
|
5211
|
+
}
|
|
5212
|
+
}
|
|
5213
|
+
class PointerDragBackend {
|
|
5214
|
+
constructor() {
|
|
5215
|
+
this.kind = 'pointer';
|
|
5216
|
+
}
|
|
5217
|
+
createDropTarget(element, options) {
|
|
5218
|
+
return new PointerDropTarget(element, options);
|
|
5219
|
+
}
|
|
5220
|
+
createDragSource(element, options) {
|
|
5221
|
+
const pointerCreateGhost = options.createGhost
|
|
5222
|
+
? (event) => {
|
|
5223
|
+
const spec = options.createGhost(event);
|
|
5224
|
+
if (!spec) {
|
|
5225
|
+
return undefined;
|
|
5226
|
+
}
|
|
5227
|
+
const ghost = new PointerGhost({
|
|
5228
|
+
element: spec.element,
|
|
5229
|
+
initialX: event.clientX,
|
|
5230
|
+
initialY: event.clientY,
|
|
5231
|
+
offsetX: spec.offsetX,
|
|
5232
|
+
offsetY: spec.offsetY,
|
|
5233
|
+
owner: element,
|
|
5234
|
+
});
|
|
5235
|
+
if (spec.dispose) {
|
|
5236
|
+
const baseDispose = ghost.dispose.bind(ghost);
|
|
5237
|
+
const disposeSpec = spec.dispose;
|
|
5238
|
+
ghost.dispose = () => {
|
|
5239
|
+
baseDispose();
|
|
5240
|
+
disposeSpec();
|
|
5241
|
+
};
|
|
5242
|
+
}
|
|
5243
|
+
return ghost;
|
|
5244
|
+
}
|
|
5245
|
+
: undefined;
|
|
5246
|
+
const source = new PointerDragSource(element, {
|
|
5247
|
+
getData: options.getData,
|
|
5248
|
+
isCancelled: options.isCancelled,
|
|
5249
|
+
onDragStart: options.onDragStart,
|
|
5250
|
+
onDragEnd: options.onDragEnd
|
|
5251
|
+
? (event) => options.onDragEnd(event.pointerEvent)
|
|
5252
|
+
: undefined,
|
|
5253
|
+
createGhost: pointerCreateGhost,
|
|
5254
|
+
touchOnly: options.touchOnly,
|
|
5255
|
+
touchInitiationDelay: options.touchInitiationDelay,
|
|
5256
|
+
pressTolerance: options.pressTolerance,
|
|
5257
|
+
threshold: options.threshold,
|
|
5258
|
+
});
|
|
5259
|
+
if (options.disabled) {
|
|
5260
|
+
source.setDisabled(true);
|
|
5261
|
+
}
|
|
5262
|
+
return source;
|
|
5263
|
+
}
|
|
5264
|
+
}
|
|
5265
|
+
const html5Backend = new Html5DragBackend();
|
|
5266
|
+
const pointerBackend = new PointerDragBackend();
|
|
5267
|
+
|
|
5268
|
+
const PROPERTY_KEYS_PANEVIEW = (() => {
|
|
5269
|
+
/**
|
|
5270
|
+
* by readong the keys from an empty value object TypeScript will error
|
|
5271
|
+
* when we add or remove new properties to `DockviewOptions`
|
|
5272
|
+
*/
|
|
5273
|
+
const properties = {
|
|
5274
|
+
disableAutoResizing: undefined,
|
|
5275
|
+
disableDnd: undefined,
|
|
5276
|
+
className: undefined,
|
|
5277
|
+
};
|
|
5278
|
+
return Object.keys(properties);
|
|
5279
|
+
})();
|
|
5280
|
+
class PaneviewUnhandledDragOverEvent extends AcceptableEvent {
|
|
5281
|
+
constructor(nativeEvent, position, getData, panel) {
|
|
5282
|
+
super();
|
|
5283
|
+
this.nativeEvent = nativeEvent;
|
|
5284
|
+
this.position = position;
|
|
5285
|
+
this.getData = getData;
|
|
5286
|
+
this.panel = panel;
|
|
5287
|
+
}
|
|
5288
|
+
}
|
|
5289
|
+
|
|
5290
|
+
class WillFocusEvent extends DockviewEvent {
|
|
5291
|
+
constructor() {
|
|
5292
|
+
super();
|
|
5293
|
+
}
|
|
5294
|
+
}
|
|
5295
|
+
/**
|
|
5296
|
+
* A core api implementation that should be used across all panel-like objects
|
|
5297
|
+
*/
|
|
5298
|
+
class PanelApiImpl extends CompositeDisposable {
|
|
5299
|
+
get isFocused() {
|
|
5300
|
+
return this._isFocused;
|
|
5301
|
+
}
|
|
5302
|
+
get isActive() {
|
|
5303
|
+
return this._isActive;
|
|
5304
|
+
}
|
|
5305
|
+
get isVisible() {
|
|
5306
|
+
return this._isVisible;
|
|
5307
|
+
}
|
|
5308
|
+
get width() {
|
|
5309
|
+
return this._width;
|
|
5310
|
+
}
|
|
5311
|
+
get height() {
|
|
5312
|
+
return this._height;
|
|
5313
|
+
}
|
|
5314
|
+
constructor(id, component) {
|
|
5315
|
+
super();
|
|
5316
|
+
this.id = id;
|
|
5317
|
+
this.component = component;
|
|
5318
|
+
this._isFocused = false;
|
|
5319
|
+
this._isActive = false;
|
|
5320
|
+
this._isVisible = true;
|
|
5321
|
+
this._width = 0;
|
|
5322
|
+
this._height = 0;
|
|
5323
|
+
this._parameters = {};
|
|
5324
|
+
this.panelUpdatesDisposable = new MutableDisposable();
|
|
5325
|
+
this._onDidDimensionChange = new Emitter();
|
|
5326
|
+
this.onDidDimensionsChange = this._onDidDimensionChange.event;
|
|
5327
|
+
this._onDidChangeFocus = new Emitter();
|
|
5328
|
+
this.onDidFocusChange = this._onDidChangeFocus.event;
|
|
5329
|
+
//
|
|
5330
|
+
this._onWillFocus = new Emitter();
|
|
5331
|
+
this.onWillFocus = this._onWillFocus.event;
|
|
5332
|
+
//
|
|
5333
|
+
this._onDidVisibilityChange = new Emitter();
|
|
5334
|
+
this.onDidVisibilityChange = this._onDidVisibilityChange.event;
|
|
5335
|
+
this._onWillVisibilityChange = new Emitter();
|
|
5336
|
+
this.onWillVisibilityChange = this._onWillVisibilityChange.event;
|
|
5337
|
+
this._onDidActiveChange = new Emitter();
|
|
5338
|
+
this.onDidActiveChange = this._onDidActiveChange.event;
|
|
5339
|
+
this._onActiveChange = new Emitter();
|
|
5340
|
+
this.onActiveChange = this._onActiveChange.event;
|
|
5341
|
+
this._onDidParametersChange = new Emitter();
|
|
5342
|
+
this.onDidParametersChange = this._onDidParametersChange.event;
|
|
5343
|
+
this.addDisposables(this.onDidFocusChange((event) => {
|
|
5344
|
+
this._isFocused = event.isFocused;
|
|
5345
|
+
}), this.onDidActiveChange((event) => {
|
|
5346
|
+
this._isActive = event.isActive;
|
|
5347
|
+
}), this.onDidVisibilityChange((event) => {
|
|
5348
|
+
this._isVisible = event.isVisible;
|
|
5349
|
+
}), this.onDidDimensionsChange((event) => {
|
|
5350
|
+
this._width = event.width;
|
|
5351
|
+
this._height = event.height;
|
|
5352
|
+
}), this.panelUpdatesDisposable, this._onDidDimensionChange, this._onDidChangeFocus, this._onDidVisibilityChange, this._onDidActiveChange, this._onWillFocus, this._onActiveChange, this._onWillFocus, this._onWillVisibilityChange, this._onDidParametersChange);
|
|
5353
|
+
}
|
|
5354
|
+
getParameters() {
|
|
5355
|
+
return this._parameters;
|
|
5356
|
+
}
|
|
5357
|
+
initialize(panel) {
|
|
5358
|
+
this.panelUpdatesDisposable.value = this._onDidParametersChange.event((parameters) => {
|
|
5359
|
+
this._parameters = parameters;
|
|
5360
|
+
panel.update({
|
|
5361
|
+
params: parameters,
|
|
5362
|
+
});
|
|
5363
|
+
});
|
|
5364
|
+
}
|
|
5365
|
+
setVisible(isVisible) {
|
|
5366
|
+
this._onWillVisibilityChange.fire({ isVisible });
|
|
5367
|
+
}
|
|
5368
|
+
setActive() {
|
|
5369
|
+
this._onActiveChange.fire();
|
|
5370
|
+
}
|
|
5371
|
+
updateParameters(parameters) {
|
|
5372
|
+
this._onDidParametersChange.fire(parameters);
|
|
5373
|
+
}
|
|
5374
|
+
}
|
|
5375
|
+
|
|
5376
|
+
class SplitviewPanelApiImpl extends PanelApiImpl {
|
|
5377
|
+
//
|
|
5378
|
+
constructor(id, component) {
|
|
5379
|
+
super(id, component);
|
|
5380
|
+
this._onDidConstraintsChangeInternal = new Emitter();
|
|
5381
|
+
this.onDidConstraintsChangeInternal = this._onDidConstraintsChangeInternal.event;
|
|
5382
|
+
//
|
|
5383
|
+
this._onDidConstraintsChange = new Emitter({
|
|
5384
|
+
replay: true,
|
|
5385
|
+
});
|
|
5386
|
+
this.onDidConstraintsChange = this._onDidConstraintsChange.event;
|
|
5387
|
+
//
|
|
5388
|
+
this._onDidSizeChange = new Emitter();
|
|
5389
|
+
this.onDidSizeChange = this._onDidSizeChange.event;
|
|
5390
|
+
this.addDisposables(this._onDidConstraintsChangeInternal, this._onDidConstraintsChange, this._onDidSizeChange);
|
|
4722
5391
|
}
|
|
4723
5392
|
setConstraints(value) {
|
|
4724
5393
|
this._onDidConstraintsChangeInternal.fire(value);
|
|
@@ -5061,35 +5730,42 @@
|
|
|
5061
5730
|
const id = this.id;
|
|
5062
5731
|
const accessorId = this.accessor.id;
|
|
5063
5732
|
this.header.draggable = true;
|
|
5064
|
-
|
|
5065
|
-
getData() {
|
|
5733
|
+
const sharedDragOptions = {
|
|
5734
|
+
getData: () => {
|
|
5066
5735
|
LocalSelectionTransfer.getInstance().setData([new PaneTransfer(accessorId, id)], PaneTransfer.prototype);
|
|
5067
5736
|
return {
|
|
5068
5737
|
dispose: () => {
|
|
5069
5738
|
LocalSelectionTransfer.getInstance().clearData(PaneTransfer.prototype);
|
|
5070
5739
|
},
|
|
5071
5740
|
};
|
|
5741
|
+
},
|
|
5742
|
+
};
|
|
5743
|
+
this.html5DragSource = html5Backend.createDragSource(this.header, sharedDragOptions);
|
|
5744
|
+
this.pointerDragSource = pointerBackend.createDragSource(this.header, sharedDragOptions);
|
|
5745
|
+
const canDisplayOverlay = (event, position) => {
|
|
5746
|
+
const data = getPaneData();
|
|
5747
|
+
if (data) {
|
|
5748
|
+
if (data.paneId !== this.id &&
|
|
5749
|
+
data.viewId === this.accessor.id) {
|
|
5750
|
+
return true;
|
|
5751
|
+
}
|
|
5072
5752
|
}
|
|
5073
|
-
|
|
5074
|
-
|
|
5753
|
+
const firedEvent = new PaneviewUnhandledDragOverEvent(event, position, getPaneData, this);
|
|
5754
|
+
this._onUnhandledDragOverEvent.fire(firedEvent);
|
|
5755
|
+
return firedEvent.isAccepted;
|
|
5756
|
+
};
|
|
5757
|
+
const dropTargetOptions = {
|
|
5075
5758
|
acceptedTargetZones: ['top', 'bottom'],
|
|
5076
5759
|
overlayModel: {
|
|
5077
5760
|
activationSize: { type: 'percentage', value: 50 },
|
|
5078
5761
|
},
|
|
5079
|
-
canDisplayOverlay
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5085
|
-
|
|
5086
|
-
}
|
|
5087
|
-
const firedEvent = new PaneviewUnhandledDragOverEvent(event, position, getPaneData, this);
|
|
5088
|
-
this._onUnhandledDragOverEvent.fire(firedEvent);
|
|
5089
|
-
return firedEvent.isAccepted;
|
|
5090
|
-
},
|
|
5091
|
-
});
|
|
5092
|
-
this.addDisposables(this._onDidDrop, this.handler, this.target, this.target.onDrop((event) => {
|
|
5762
|
+
canDisplayOverlay,
|
|
5763
|
+
};
|
|
5764
|
+
this.target = html5Backend.createDropTarget(this.element, dropTargetOptions);
|
|
5765
|
+
this.pointerTarget = pointerBackend.createDropTarget(this.element, dropTargetOptions);
|
|
5766
|
+
this.addDisposables(this._onDidDrop, this.html5DragSource, this.pointerDragSource, this.target, this.pointerTarget, this.target.onDrop((event) => {
|
|
5767
|
+
this.onDrop(event);
|
|
5768
|
+
}), this.pointerTarget.onDrop((event) => {
|
|
5093
5769
|
this.onDrop(event);
|
|
5094
5770
|
}));
|
|
5095
5771
|
}
|
|
@@ -5144,6 +5820,25 @@
|
|
|
5144
5820
|
this._element.tabIndex = -1;
|
|
5145
5821
|
this.addDisposables(this._onDidFocus, this._onDidBlur);
|
|
5146
5822
|
const target = group.dropTargetContainer;
|
|
5823
|
+
const canDisplayOverlay = (event, position) => {
|
|
5824
|
+
if (this.group.locked === 'no-drop-target' ||
|
|
5825
|
+
(this.group.locked && position === 'center')) {
|
|
5826
|
+
return false;
|
|
5827
|
+
}
|
|
5828
|
+
const data = getPanelData();
|
|
5829
|
+
if (!data &&
|
|
5830
|
+
event.shiftKey &&
|
|
5831
|
+
this.group.location.type !== 'floating') {
|
|
5832
|
+
return false;
|
|
5833
|
+
}
|
|
5834
|
+
if (data && data.viewId === this.accessor.id) {
|
|
5835
|
+
return true;
|
|
5836
|
+
}
|
|
5837
|
+
return this.group.canDisplayOverlay(event, position, 'content');
|
|
5838
|
+
};
|
|
5839
|
+
// `dropTarget` stays the concrete `Droptarget` (not via the backend
|
|
5840
|
+
// factory) because overlayRenderContainer forwards HTML5 drag events
|
|
5841
|
+
// through `dropTarget.dnd` — that field is not part of `IDropTarget`.
|
|
5147
5842
|
this.dropTarget = new Droptarget(this.element, {
|
|
5148
5843
|
getOverlayOutline: () => {
|
|
5149
5844
|
var _a;
|
|
@@ -5153,25 +5848,22 @@
|
|
|
5153
5848
|
},
|
|
5154
5849
|
className: 'dv-drop-target-content',
|
|
5155
5850
|
acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
|
|
5156
|
-
canDisplayOverlay
|
|
5157
|
-
|
|
5158
|
-
|
|
5159
|
-
|
|
5160
|
-
|
|
5161
|
-
|
|
5162
|
-
|
|
5163
|
-
|
|
5164
|
-
|
|
5165
|
-
|
|
5166
|
-
|
|
5167
|
-
if (data && data.viewId === this.accessor.id) {
|
|
5168
|
-
return true;
|
|
5169
|
-
}
|
|
5170
|
-
return this.group.canDisplayOverlay(event, position, 'content');
|
|
5851
|
+
canDisplayOverlay,
|
|
5852
|
+
getOverrideTarget: target ? () => target.model : undefined,
|
|
5853
|
+
});
|
|
5854
|
+
this.pointerDropTarget = pointerBackend.createDropTarget(this.element, {
|
|
5855
|
+
acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
|
|
5856
|
+
canDisplayOverlay,
|
|
5857
|
+
getOverlayOutline: () => {
|
|
5858
|
+
var _a;
|
|
5859
|
+
return ((_a = accessor.options.theme) === null || _a === void 0 ? void 0 : _a.dndPanelOverlay) === 'group'
|
|
5860
|
+
? this.element.parentElement
|
|
5861
|
+
: null;
|
|
5171
5862
|
},
|
|
5863
|
+
className: 'dv-drop-target-content',
|
|
5172
5864
|
getOverrideTarget: target ? () => target.model : undefined,
|
|
5173
5865
|
});
|
|
5174
|
-
this.addDisposables(this.dropTarget);
|
|
5866
|
+
this.addDisposables(this.dropTarget, this.pointerDropTarget);
|
|
5175
5867
|
}
|
|
5176
5868
|
show() {
|
|
5177
5869
|
this.element.style.display = '';
|
|
@@ -5259,37 +5951,169 @@
|
|
|
5259
5951
|
}
|
|
5260
5952
|
}
|
|
5261
5953
|
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
this.
|
|
5282
|
-
|
|
5954
|
+
const DEFAULT_DELAY = 500;
|
|
5955
|
+
const DEFAULT_TOLERANCE = 8;
|
|
5956
|
+
/**
|
|
5957
|
+
* Passive — does not consume the pointer; movement past `tolerance`
|
|
5958
|
+
* cancels silently so a sibling `PointerDragSource` can take over.
|
|
5959
|
+
*/
|
|
5960
|
+
class LongPressDetector extends CompositeDisposable {
|
|
5961
|
+
constructor(element, options) {
|
|
5962
|
+
super();
|
|
5963
|
+
this.element = element;
|
|
5964
|
+
this.options = options;
|
|
5965
|
+
this._startX = 0;
|
|
5966
|
+
this._startY = 0;
|
|
5967
|
+
this.addDisposables(addDisposableListener(this.element, 'pointerdown', (e) => {
|
|
5968
|
+
this._onPointerDown(e);
|
|
5969
|
+
}));
|
|
5970
|
+
}
|
|
5971
|
+
_onPointerDown(event) {
|
|
5972
|
+
var _a, _b, _c, _d, _e;
|
|
5973
|
+
const touchOnly = (_a = this.options.touchOnly) !== null && _a !== void 0 ? _a : true;
|
|
5974
|
+
if (touchOnly &&
|
|
5975
|
+
event.pointerType !== 'touch' &&
|
|
5976
|
+
event.pointerType !== 'pen') {
|
|
5977
|
+
return;
|
|
5978
|
+
}
|
|
5979
|
+
// Defensive — supersede any in-flight press.
|
|
5980
|
+
this._cancelPending();
|
|
5981
|
+
this._pointerId = event.pointerId;
|
|
5982
|
+
this._startX = event.clientX;
|
|
5983
|
+
this._startY = event.clientY;
|
|
5984
|
+
const delay = (_b = this.options.delay) !== null && _b !== void 0 ? _b : DEFAULT_DELAY;
|
|
5985
|
+
const tolerance = (_c = this.options.tolerance) !== null && _c !== void 0 ? _c : DEFAULT_TOLERANCE;
|
|
5986
|
+
// Source's owning window — popout drags fire on their own window.
|
|
5987
|
+
const targetWindow = (_e = (_d = this.element.ownerDocument) === null || _d === void 0 ? void 0 : _d.defaultView) !== null && _e !== void 0 ? _e : window;
|
|
5988
|
+
this._timer = setTimeout(() => {
|
|
5989
|
+
this._timer = undefined;
|
|
5990
|
+
this._cancelPending();
|
|
5991
|
+
// Touch browsers synthesize a compatibility `contextmenu` event
|
|
5992
|
+
// for long-press. preventDefault on the original pointerdown is
|
|
5993
|
+
// too late (already dispatched), so install a one-shot
|
|
5994
|
+
// capture-phase guard for the next contextmenu. Without this,
|
|
5995
|
+
// consumers that don't preventDefault inside their onLongPress
|
|
5996
|
+
// (or that early-return before doing so) leak the browser's
|
|
5997
|
+
// native menu on top of theirs.
|
|
5998
|
+
this._installContextMenuGuard(targetWindow);
|
|
5999
|
+
// Same idea for `click`: when the user releases their finger
|
|
6000
|
+
// after the long-press, touch browsers dispatch a `click` to
|
|
6001
|
+
// the element the touch ended on (the source). Consumers
|
|
6002
|
+
// typically wire click to a primary action (e.g. tab activate,
|
|
6003
|
+
// tab-group chip collapse-toggle). Without this guard, the
|
|
6004
|
+
// long-press immediately fires both the context menu AND the
|
|
6005
|
+
// primary action — and the action's side effects (e.g. a chip
|
|
6006
|
+
// collapse animation) read as a screen wobble while the menu
|
|
6007
|
+
// is supposed to be open. Scoped to the source element so
|
|
6008
|
+
// clicks on menu items elsewhere remain effective.
|
|
6009
|
+
this._installClickGuard(targetWindow);
|
|
6010
|
+
this.options.onLongPress(event);
|
|
6011
|
+
}, delay);
|
|
6012
|
+
this._moveListener = addDisposableListener(targetWindow, 'pointermove', (moveEvent) => {
|
|
6013
|
+
if (moveEvent.pointerId !== this._pointerId) {
|
|
6014
|
+
return;
|
|
6015
|
+
}
|
|
6016
|
+
const dx = moveEvent.clientX - this._startX;
|
|
6017
|
+
const dy = moveEvent.clientY - this._startY;
|
|
6018
|
+
if (Math.hypot(dx, dy) > tolerance) {
|
|
6019
|
+
this._cancelPending();
|
|
6020
|
+
}
|
|
6021
|
+
});
|
|
6022
|
+
this._upListener = addDisposableListener(targetWindow, 'pointerup', (upEvent) => {
|
|
6023
|
+
if (upEvent.pointerId !== this._pointerId) {
|
|
6024
|
+
return;
|
|
6025
|
+
}
|
|
6026
|
+
this._cancelPending();
|
|
6027
|
+
});
|
|
6028
|
+
this._cancelListener = addDisposableListener(targetWindow, 'pointercancel', (cancelEvent) => {
|
|
6029
|
+
if (cancelEvent.pointerId !== this._pointerId) {
|
|
6030
|
+
return;
|
|
6031
|
+
}
|
|
6032
|
+
this._cancelPending();
|
|
6033
|
+
});
|
|
6034
|
+
}
|
|
6035
|
+
_installContextMenuGuard(targetWindow) {
|
|
6036
|
+
let guard;
|
|
6037
|
+
const timeout = setTimeout(() => guard === null || guard === void 0 ? void 0 : guard.dispose(), 500);
|
|
6038
|
+
guard = addDisposableListener(targetWindow, 'contextmenu', (event) => {
|
|
6039
|
+
event.preventDefault();
|
|
6040
|
+
clearTimeout(timeout);
|
|
6041
|
+
guard === null || guard === void 0 ? void 0 : guard.dispose();
|
|
6042
|
+
}, { capture: true });
|
|
6043
|
+
}
|
|
6044
|
+
_installClickGuard(targetWindow) {
|
|
6045
|
+
let guard;
|
|
6046
|
+
const timeout = setTimeout(() => guard === null || guard === void 0 ? void 0 : guard.dispose(), 500);
|
|
6047
|
+
guard = addDisposableListener(targetWindow, 'click', (event) => {
|
|
6048
|
+
// Only suppress clicks targeted at the long-pressed element
|
|
6049
|
+
// or its descendants. A user tap on a context menu item (or
|
|
6050
|
+
// anywhere else) still gets through unchanged.
|
|
6051
|
+
const target = event.target;
|
|
6052
|
+
if (target && this.element.contains(target)) {
|
|
6053
|
+
event.preventDefault();
|
|
6054
|
+
event.stopPropagation();
|
|
6055
|
+
}
|
|
6056
|
+
clearTimeout(timeout);
|
|
6057
|
+
guard === null || guard === void 0 ? void 0 : guard.dispose();
|
|
6058
|
+
}, { capture: true });
|
|
6059
|
+
}
|
|
6060
|
+
_cancelPending() {
|
|
6061
|
+
var _a, _b, _c;
|
|
6062
|
+
if (this._timer !== undefined) {
|
|
6063
|
+
clearTimeout(this._timer);
|
|
6064
|
+
this._timer = undefined;
|
|
6065
|
+
}
|
|
6066
|
+
this._pointerId = undefined;
|
|
6067
|
+
(_a = this._moveListener) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
6068
|
+
(_b = this._upListener) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
6069
|
+
(_c = this._cancelListener) === null || _c === void 0 ? void 0 : _c.dispose();
|
|
6070
|
+
this._moveListener = undefined;
|
|
6071
|
+
this._upListener = undefined;
|
|
6072
|
+
this._cancelListener = undefined;
|
|
6073
|
+
}
|
|
6074
|
+
dispose() {
|
|
6075
|
+
this._cancelPending();
|
|
6076
|
+
super.dispose();
|
|
6077
|
+
}
|
|
6078
|
+
}
|
|
6079
|
+
|
|
6080
|
+
function resolveDndCapabilities(options) {
|
|
6081
|
+
if (options.disableDnd) {
|
|
6082
|
+
return { html5: false, pointer: false, pointerHandlesMouse: false };
|
|
6083
|
+
}
|
|
6084
|
+
switch (options.dndStrategy) {
|
|
6085
|
+
case 'pointer':
|
|
6086
|
+
return { html5: false, pointer: true, pointerHandlesMouse: true };
|
|
6087
|
+
case 'html5':
|
|
6088
|
+
return { html5: true, pointer: false, pointerHandlesMouse: false };
|
|
6089
|
+
case 'auto':
|
|
6090
|
+
case undefined:
|
|
6091
|
+
default:
|
|
6092
|
+
// On touch-primary devices (phones / basic tablets) HTML5 DnD's
|
|
6093
|
+
// native long-press intercepts the gesture before our pointer
|
|
6094
|
+
// backend can react — Android Chrome launches a system drag with
|
|
6095
|
+
// its half-transparent thumbnail, and the long-press context menu
|
|
6096
|
+
// never opens. Disable HTML5 there so the pointer backend owns
|
|
6097
|
+
// every gesture. Hybrid devices (touchscreen laptops, Surface,
|
|
6098
|
+
// iPad with mouse) keep both backends — mouse uses HTML5, touch
|
|
6099
|
+
// falls back to whichever backend the underlying element wired.
|
|
6100
|
+
return isCoarsePrimaryInput$2()
|
|
6101
|
+
? { html5: false, pointer: true, pointerHandlesMouse: true }
|
|
6102
|
+
: { html5: true, pointer: true, pointerHandlesMouse: false };
|
|
5283
6103
|
}
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
this.panelTransfer.clearData(PanelTransfer.prototype);
|
|
5289
|
-
},
|
|
5290
|
-
};
|
|
6104
|
+
}
|
|
6105
|
+
function isCoarsePrimaryInput$2() {
|
|
6106
|
+
if (typeof window === 'undefined' || !window.matchMedia) {
|
|
6107
|
+
return false;
|
|
5291
6108
|
}
|
|
6109
|
+
// Coarse pointer without any fine pointer = phone-class device. A laptop
|
|
6110
|
+
// touchscreen reports both, and we want HTML5 to remain available there
|
|
6111
|
+
// because a real mouse is also plugged in.
|
|
6112
|
+
const coarse = window.matchMedia('(pointer: coarse)').matches;
|
|
6113
|
+
const fine = window.matchMedia('(pointer: fine)').matches;
|
|
6114
|
+
return coarse && !fine;
|
|
5292
6115
|
}
|
|
6116
|
+
|
|
5293
6117
|
class Tab extends CompositeDisposable {
|
|
5294
6118
|
get element() {
|
|
5295
6119
|
return this._element;
|
|
@@ -5300,6 +6124,7 @@
|
|
|
5300
6124
|
this.accessor = accessor;
|
|
5301
6125
|
this.group = group;
|
|
5302
6126
|
this.content = undefined;
|
|
6127
|
+
this.panelTransfer = LocalSelectionTransfer.getInstance();
|
|
5303
6128
|
this._direction = 'horizontal';
|
|
5304
6129
|
this._onPointDown = new Emitter();
|
|
5305
6130
|
this.onPointerDown = this._onPointDown.event;
|
|
@@ -5311,114 +6136,106 @@
|
|
|
5311
6136
|
this.onDragStart = this._onDragStart.event;
|
|
5312
6137
|
this._onDragEnd = new Emitter();
|
|
5313
6138
|
this.onDragEnd = this._onDragEnd.event;
|
|
6139
|
+
const caps = resolveDndCapabilities(this.accessor.options);
|
|
5314
6140
|
this._element = document.createElement('div');
|
|
5315
6141
|
this._element.className = 'dv-tab';
|
|
5316
6142
|
this._element.tabIndex = 0;
|
|
5317
|
-
this._element.draggable =
|
|
6143
|
+
this._element.draggable = caps.html5;
|
|
5318
6144
|
toggleClass(this.element, 'dv-inactive-tab', true);
|
|
5319
|
-
|
|
5320
|
-
|
|
6145
|
+
const canDisplayOverlay = (event, position) => {
|
|
6146
|
+
var _a;
|
|
6147
|
+
if (this.group.locked) {
|
|
6148
|
+
return false;
|
|
6149
|
+
}
|
|
6150
|
+
const data = getPanelData();
|
|
6151
|
+
if (data && this.accessor.id === data.viewId) {
|
|
6152
|
+
// Smooth-reorder takes over the in-flight visual when active,
|
|
6153
|
+
// so individual tab overlays are suppressed for internal drags.
|
|
6154
|
+
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
|
|
6155
|
+
return false;
|
|
6156
|
+
}
|
|
6157
|
+
return true;
|
|
6158
|
+
}
|
|
6159
|
+
return this.group.model.canDisplayOverlay(event, position, 'tab');
|
|
6160
|
+
};
|
|
6161
|
+
this.dropTarget = html5Backend.createDropTarget(this._element, {
|
|
5321
6162
|
acceptedTargetZones: ['left', 'right'],
|
|
5322
6163
|
overlayModel: this._buildOverlayModel(),
|
|
5323
|
-
canDisplayOverlay
|
|
6164
|
+
canDisplayOverlay,
|
|
6165
|
+
getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
|
|
6166
|
+
});
|
|
6167
|
+
this.pointerDropTarget = pointerBackend.createDropTarget(this._element, {
|
|
6168
|
+
acceptedTargetZones: ['left', 'right'],
|
|
6169
|
+
overlayModel: this._buildOverlayModel(),
|
|
6170
|
+
canDisplayOverlay,
|
|
6171
|
+
getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
|
|
6172
|
+
});
|
|
6173
|
+
const sharedDragOptions = {
|
|
6174
|
+
getData: () => {
|
|
6175
|
+
this.panelTransfer.setData([
|
|
6176
|
+
new PanelTransfer(this.accessor.id, this.group.id, this.panel.id),
|
|
6177
|
+
], PanelTransfer.prototype);
|
|
6178
|
+
return {
|
|
6179
|
+
dispose: () => {
|
|
6180
|
+
this.panelTransfer.clearData(PanelTransfer.prototype);
|
|
6181
|
+
},
|
|
6182
|
+
};
|
|
6183
|
+
},
|
|
6184
|
+
// 30/-10 matches the HTML5 setDragImage offset that has been
|
|
6185
|
+
// shipped for years; pointer backend wraps in PointerGhost,
|
|
6186
|
+
// HTML5 backend feeds into setDragImage.
|
|
6187
|
+
createGhost: () => ({
|
|
6188
|
+
element: this._buildGhostElement(),
|
|
6189
|
+
offsetX: 30,
|
|
6190
|
+
offsetY: -10,
|
|
6191
|
+
}),
|
|
6192
|
+
onDragStart: (event) => {
|
|
5324
6193
|
var _a;
|
|
5325
|
-
|
|
5326
|
-
|
|
5327
|
-
|
|
5328
|
-
|
|
5329
|
-
|
|
5330
|
-
|
|
5331
|
-
|
|
5332
|
-
|
|
5333
|
-
// (both same-group and cross-group) via
|
|
5334
|
-
// animation. Suppress the per-tab overlay so
|
|
5335
|
-
// the tab is dropped *beside* rather than *on*.
|
|
5336
|
-
return false;
|
|
5337
|
-
}
|
|
5338
|
-
return true;
|
|
6194
|
+
this._onDragStart.fire(event);
|
|
6195
|
+
if (!(event instanceof PointerEvent) &&
|
|
6196
|
+
((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
|
|
6197
|
+
// Delay collapse to next frame so the browser
|
|
6198
|
+
// captures the full drag image first.
|
|
6199
|
+
requestAnimationFrame(() => {
|
|
6200
|
+
toggleClass(this.element, 'dv-tab--dragging', true);
|
|
6201
|
+
});
|
|
5339
6202
|
}
|
|
5340
|
-
return this.group.model.canDisplayOverlay(event, position, 'tab');
|
|
5341
6203
|
},
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
6204
|
+
onDragEnd: (event) => {
|
|
6205
|
+
this._onDragEnd.fire(event);
|
|
6206
|
+
},
|
|
6207
|
+
};
|
|
6208
|
+
this.html5DragSource = html5Backend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.html5 }));
|
|
6209
|
+
this.pointerDragSource = pointerBackend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.pointer, touchOnly: !caps.pointerHandlesMouse, isCancelled: () => !resolveDndCapabilities(this.accessor.options).pointer }));
|
|
6210
|
+
// Both droptargets feed the same downstream stream; consumers don't
|
|
6211
|
+
// need to know which path produced the overlay.
|
|
6212
|
+
this.onWillShowOverlay = exports.DockviewEvent.any(this.dropTarget.onWillShowOverlay, this.pointerDropTarget.onWillShowOverlay);
|
|
5345
6213
|
this.addDisposables(this._onPointDown, this._onTabClick, this._onDropped, this._onDragStart, this._onDragEnd, this.accessor.onDidOptionsChange(() => {
|
|
5346
|
-
this.
|
|
5347
|
-
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
|
|
5351
|
-
|
|
5352
|
-
const isVertical = this._direction === 'vertical';
|
|
5353
|
-
/**
|
|
5354
|
-
* Properties to skip when copying computed styles for a
|
|
5355
|
-
* vertical tab ghost. `writing-mode` is excluded so we
|
|
5356
|
-
* can force `horizontal-tb`. Size and margin logical
|
|
5357
|
-
* properties are excluded because their physical meaning
|
|
5358
|
-
* flips when writing-mode changes, which would produce
|
|
5359
|
-
* incorrect dimensions.
|
|
5360
|
-
*/
|
|
5361
|
-
const verticalSkip = new Set([
|
|
5362
|
-
'writing-mode',
|
|
5363
|
-
'inline-size',
|
|
5364
|
-
'block-size',
|
|
5365
|
-
'min-inline-size',
|
|
5366
|
-
'min-block-size',
|
|
5367
|
-
'max-inline-size',
|
|
5368
|
-
'max-block-size',
|
|
5369
|
-
'margin-inline',
|
|
5370
|
-
'margin-inline-start',
|
|
5371
|
-
'margin-inline-end',
|
|
5372
|
-
'margin-block',
|
|
5373
|
-
'margin-block-start',
|
|
5374
|
-
'margin-block-end',
|
|
5375
|
-
'padding-inline',
|
|
5376
|
-
'padding-inline-start',
|
|
5377
|
-
'padding-inline-end',
|
|
5378
|
-
'padding-block',
|
|
5379
|
-
'padding-block-start',
|
|
5380
|
-
'padding-block-end',
|
|
5381
|
-
]);
|
|
5382
|
-
Array.from(style).forEach((key) => {
|
|
5383
|
-
if (isVertical && verticalSkip.has(key)) {
|
|
5384
|
-
return;
|
|
5385
|
-
}
|
|
5386
|
-
newNode.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));
|
|
5387
|
-
});
|
|
5388
|
-
if (isVertical) {
|
|
5389
|
-
// Force horizontal text flow and swap the physical
|
|
5390
|
-
// dimensions so the ghost appears as a horizontal tab.
|
|
5391
|
-
newNode.style.setProperty('writing-mode', 'horizontal-tb');
|
|
5392
|
-
newNode.style.setProperty('width', style.height);
|
|
5393
|
-
newNode.style.setProperty('height', style.width);
|
|
5394
|
-
}
|
|
5395
|
-
newNode.style.position = 'absolute';
|
|
5396
|
-
newNode.classList.add('dv-tab-ghost-drag');
|
|
5397
|
-
addGhostImage(event.dataTransfer, newNode, {
|
|
5398
|
-
y: -10,
|
|
5399
|
-
x: 30,
|
|
5400
|
-
});
|
|
5401
|
-
}
|
|
5402
|
-
this._onDragStart.fire(event);
|
|
5403
|
-
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
|
|
5404
|
-
// Delay collapse to next frame so the browser
|
|
5405
|
-
// captures the full drag image first
|
|
5406
|
-
requestAnimationFrame(() => {
|
|
5407
|
-
toggleClass(this.element, 'dv-tab--dragging', true);
|
|
5408
|
-
});
|
|
5409
|
-
}
|
|
5410
|
-
}), addDisposableListener(this._element, 'dragend', (event) => {
|
|
6214
|
+
const model = this._buildOverlayModel();
|
|
6215
|
+
this.dropTarget.setOverlayModel(model);
|
|
6216
|
+
this.pointerDropTarget.setOverlayModel(model);
|
|
6217
|
+
}), addDisposableListener(this._element, 'dragend', () => {
|
|
6218
|
+
// The shared onDragEnd handler already fires _onDragEnd via
|
|
6219
|
+
// the HTML5 backend; just strip the dragging class here.
|
|
5411
6220
|
toggleClass(this.element, 'dv-tab--dragging', false);
|
|
5412
|
-
|
|
5413
|
-
}), this.dragHandler, addDisposableListener(this._element, 'pointerdown', (event) => {
|
|
6221
|
+
}), this.html5DragSource, addDisposableListener(this._element, 'pointerdown', (event) => {
|
|
5414
6222
|
this._onPointDown.fire(event);
|
|
5415
6223
|
}), addDisposableListener(this._element, 'click', (event) => {
|
|
5416
6224
|
this._onTabClick.fire(event);
|
|
5417
6225
|
}), addDisposableListener(this._element, 'contextmenu', (event) => {
|
|
5418
6226
|
this.accessor.contextMenuController.show(this.panel, this.group, event);
|
|
6227
|
+
}), new LongPressDetector(this._element, {
|
|
6228
|
+
onLongPress: (event) => {
|
|
6229
|
+
// Don't let a subsequent finger move arm a drag on top
|
|
6230
|
+
// of the just-opened menu.
|
|
6231
|
+
this.pointerDragSource.cancelPending();
|
|
6232
|
+
this.accessor.contextMenuController.show(this.panel, this.group, event);
|
|
6233
|
+
},
|
|
5419
6234
|
}), this.dropTarget.onDrop((event) => {
|
|
5420
6235
|
this._onDropped.fire(event);
|
|
5421
|
-
}), this.
|
|
6236
|
+
}), this.pointerDropTarget.onDrop((event) => {
|
|
6237
|
+
this._onDropped.fire(event);
|
|
6238
|
+
}), this.dropTarget, this.pointerDropTarget, this.pointerDragSource);
|
|
5422
6239
|
}
|
|
5423
6240
|
setActive(isActive) {
|
|
5424
6241
|
toggleClass(this.element, 'dv-active-tab', isActive);
|
|
@@ -5448,11 +6265,60 @@
|
|
|
5448
6265
|
}
|
|
5449
6266
|
setDirection(direction) {
|
|
5450
6267
|
this._direction = direction;
|
|
5451
|
-
|
|
6268
|
+
const zones = direction === 'vertical' ? ['top', 'bottom'] : ['left', 'right'];
|
|
6269
|
+
this.dropTarget.setTargetZones(zones);
|
|
6270
|
+
this.pointerDropTarget.setTargetZones(zones);
|
|
5452
6271
|
}
|
|
5453
6272
|
updateDragAndDropState() {
|
|
5454
|
-
|
|
5455
|
-
this.
|
|
6273
|
+
const caps = resolveDndCapabilities(this.accessor.options);
|
|
6274
|
+
this._element.draggable = caps.html5;
|
|
6275
|
+
this.html5DragSource.setDisabled(!caps.html5);
|
|
6276
|
+
this.pointerDragSource.setDisabled(!caps.pointer);
|
|
6277
|
+
this.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
|
|
6278
|
+
}
|
|
6279
|
+
/**
|
|
6280
|
+
* Vertical tabs are flipped to horizontal so the ghost stays readable
|
|
6281
|
+
* during the drag rather than appearing sideways-rotated.
|
|
6282
|
+
*/
|
|
6283
|
+
_buildGhostElement() {
|
|
6284
|
+
const style = getComputedStyle(this.element);
|
|
6285
|
+
const newNode = this.element.cloneNode(true);
|
|
6286
|
+
const isVertical = this._direction === 'vertical';
|
|
6287
|
+
const verticalSkip = new Set([
|
|
6288
|
+
'writing-mode',
|
|
6289
|
+
'inline-size',
|
|
6290
|
+
'block-size',
|
|
6291
|
+
'min-inline-size',
|
|
6292
|
+
'min-block-size',
|
|
6293
|
+
'max-inline-size',
|
|
6294
|
+
'max-block-size',
|
|
6295
|
+
'margin-inline',
|
|
6296
|
+
'margin-inline-start',
|
|
6297
|
+
'margin-inline-end',
|
|
6298
|
+
'margin-block',
|
|
6299
|
+
'margin-block-start',
|
|
6300
|
+
'margin-block-end',
|
|
6301
|
+
'padding-inline',
|
|
6302
|
+
'padding-inline-start',
|
|
6303
|
+
'padding-inline-end',
|
|
6304
|
+
'padding-block',
|
|
6305
|
+
'padding-block-start',
|
|
6306
|
+
'padding-block-end',
|
|
6307
|
+
]);
|
|
6308
|
+
Array.from(style).forEach((key) => {
|
|
6309
|
+
if (isVertical && verticalSkip.has(key)) {
|
|
6310
|
+
return;
|
|
6311
|
+
}
|
|
6312
|
+
newNode.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));
|
|
6313
|
+
});
|
|
6314
|
+
if (isVertical) {
|
|
6315
|
+
newNode.style.setProperty('writing-mode', 'horizontal-tb');
|
|
6316
|
+
newNode.style.setProperty('width', style.height);
|
|
6317
|
+
newNode.style.setProperty('height', style.width);
|
|
6318
|
+
}
|
|
6319
|
+
newNode.style.position = 'absolute';
|
|
6320
|
+
newNode.classList.add('dv-tab-ghost-drag');
|
|
6321
|
+
return newNode;
|
|
5456
6322
|
}
|
|
5457
6323
|
}
|
|
5458
6324
|
|
|
@@ -5460,6 +6326,7 @@
|
|
|
5460
6326
|
get kind() {
|
|
5461
6327
|
return this.options.kind;
|
|
5462
6328
|
}
|
|
6329
|
+
/** Narrow with `instanceof DragEvent` before reading `dataTransfer`. */
|
|
5463
6330
|
get nativeEvent() {
|
|
5464
6331
|
return this.event.nativeEvent;
|
|
5465
6332
|
}
|
|
@@ -5490,103 +6357,202 @@
|
|
|
5490
6357
|
}
|
|
5491
6358
|
}
|
|
5492
6359
|
|
|
5493
|
-
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
this.panelTransfer = LocalSelectionTransfer.getInstance();
|
|
5499
|
-
this.addDisposables(addDisposableListener(element, 'pointerdown', (e) => {
|
|
5500
|
-
if (e.shiftKey) {
|
|
5501
|
-
/**
|
|
5502
|
-
* You cannot call e.preventDefault() because that will prevent drag events from firing
|
|
5503
|
-
* but we also need to stop any group overlay drag events from occuring
|
|
5504
|
-
* Use a custom event marker that can be checked by the overlay drag events
|
|
5505
|
-
*/
|
|
5506
|
-
quasiPreventDefault(e);
|
|
5507
|
-
}
|
|
5508
|
-
}, true));
|
|
5509
|
-
}
|
|
5510
|
-
isCancelled(_event) {
|
|
5511
|
-
if (this.group.api.location.type === 'floating' && !_event.shiftKey) {
|
|
5512
|
-
return true;
|
|
5513
|
-
}
|
|
5514
|
-
if (this.group.api.location.type === 'edge' && this.group.size === 0) {
|
|
5515
|
-
return true;
|
|
5516
|
-
}
|
|
5517
|
-
return false;
|
|
5518
|
-
}
|
|
5519
|
-
getData(dragEvent) {
|
|
5520
|
-
const dataTransfer = dragEvent.dataTransfer;
|
|
5521
|
-
this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, null)], PanelTransfer.prototype);
|
|
5522
|
-
const style = window.getComputedStyle(this.el);
|
|
5523
|
-
const bgColor = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-background-color');
|
|
5524
|
-
const color = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-color');
|
|
5525
|
-
if (dataTransfer) {
|
|
5526
|
-
const ghostElement = document.createElement('div');
|
|
5527
|
-
ghostElement.style.backgroundColor = bgColor;
|
|
5528
|
-
ghostElement.style.color = color;
|
|
5529
|
-
ghostElement.style.padding = '2px 8px';
|
|
5530
|
-
ghostElement.style.height = '24px';
|
|
5531
|
-
ghostElement.style.fontSize = '11px';
|
|
5532
|
-
ghostElement.style.lineHeight = '20px';
|
|
5533
|
-
ghostElement.style.borderRadius = '12px';
|
|
5534
|
-
ghostElement.style.position = 'absolute';
|
|
5535
|
-
ghostElement.style.pointerEvents = 'none';
|
|
5536
|
-
ghostElement.style.top = '-9999px';
|
|
5537
|
-
ghostElement.textContent = `Multiple Panels (${this.group.size})`;
|
|
5538
|
-
addGhostImage(dataTransfer, ghostElement, { y: -10, x: 30 });
|
|
5539
|
-
}
|
|
5540
|
-
return {
|
|
5541
|
-
dispose: () => {
|
|
5542
|
-
this.panelTransfer.clearData(PanelTransfer.prototype);
|
|
5543
|
-
},
|
|
5544
|
-
};
|
|
5545
|
-
}
|
|
5546
|
-
}
|
|
5547
|
-
|
|
6360
|
+
// Floating-group redock via touch: require a deliberate long press so the
|
|
6361
|
+
// "move the float around" gesture doesn't double-trigger the redock ghost.
|
|
6362
|
+
// Infinity pressTolerance disables the pre-arm flick override; any motion
|
|
6363
|
+
// during the wait is treated as drag-the-float, not redock intent.
|
|
6364
|
+
const FLOATING_REDOCK_INITIATION_DELAY_MS = 500;
|
|
5548
6365
|
class VoidContainer extends CompositeDisposable {
|
|
5549
6366
|
get element() {
|
|
5550
6367
|
return this._element;
|
|
5551
6368
|
}
|
|
5552
6369
|
constructor(accessor, group) {
|
|
6370
|
+
var _a, _b;
|
|
5553
6371
|
super();
|
|
5554
6372
|
this.accessor = accessor;
|
|
5555
6373
|
this.group = group;
|
|
6374
|
+
this.panelTransfer = LocalSelectionTransfer.getInstance();
|
|
5556
6375
|
this._onDrop = new Emitter();
|
|
5557
6376
|
this.onDrop = this._onDrop.event;
|
|
5558
6377
|
this._onDragStart = new Emitter();
|
|
5559
6378
|
this.onDragStart = this._onDragStart.event;
|
|
6379
|
+
const caps = resolveDndCapabilities(this.accessor.options);
|
|
5560
6380
|
this._element = document.createElement('div');
|
|
5561
6381
|
this._element.className = 'dv-void-container';
|
|
5562
|
-
this._element.draggable =
|
|
5563
|
-
toggleClass(this._element, 'dv-draggable',
|
|
6382
|
+
this._element.draggable = caps.html5;
|
|
6383
|
+
toggleClass(this._element, 'dv-draggable', caps.html5 || caps.pointer);
|
|
5564
6384
|
this.addDisposables(this._onDrop, this._onDragStart, addDisposableListener(this._element, 'pointerdown', () => {
|
|
5565
6385
|
this.accessor.doSetGroupActive(this.group);
|
|
5566
|
-
})
|
|
5567
|
-
|
|
5568
|
-
|
|
6386
|
+
}),
|
|
6387
|
+
// Shift+pointerdown marks the event so the group's overlay
|
|
6388
|
+
// drag (move-by-floating) sees it was consumed and doesn't
|
|
6389
|
+
// fire alongside the HTML5 drag. quasiPreventDefault sets the
|
|
6390
|
+
// marker without calling preventDefault — that would also
|
|
6391
|
+
// block dragstart, which we need to fire.
|
|
6392
|
+
addDisposableListener(this._element, 'pointerdown', (e) => {
|
|
6393
|
+
if (e.shiftKey) {
|
|
6394
|
+
quasiPreventDefault(e);
|
|
6395
|
+
}
|
|
6396
|
+
}, true));
|
|
6397
|
+
const canDisplayOverlay = (event, position) => {
|
|
6398
|
+
if (this.group.api.locked) {
|
|
6399
|
+
// Dropping on the void/header space adds the panel
|
|
6400
|
+
// to this group, which `locked` is meant to prevent
|
|
6401
|
+
// (both `true` and `'no-drop-target'`).
|
|
6402
|
+
return false;
|
|
6403
|
+
}
|
|
6404
|
+
const data = getPanelData();
|
|
6405
|
+
if (data && this.accessor.id === data.viewId) {
|
|
6406
|
+
return true;
|
|
6407
|
+
}
|
|
6408
|
+
return group.model.canDisplayOverlay(event, position, 'header_space');
|
|
6409
|
+
};
|
|
6410
|
+
this.dropTarget = html5Backend.createDropTarget(this._element, {
|
|
5569
6411
|
acceptedTargetZones: ['center'],
|
|
5570
|
-
canDisplayOverlay
|
|
5571
|
-
const data = getPanelData();
|
|
5572
|
-
if (data && this.accessor.id === data.viewId) {
|
|
5573
|
-
return true;
|
|
5574
|
-
}
|
|
5575
|
-
return group.model.canDisplayOverlay(event, position, 'header_space');
|
|
5576
|
-
},
|
|
6412
|
+
canDisplayOverlay,
|
|
5577
6413
|
getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
|
|
5578
6414
|
});
|
|
5579
|
-
this.
|
|
5580
|
-
|
|
5581
|
-
|
|
5582
|
-
|
|
6415
|
+
this.pointerDropTarget = pointerBackend.createDropTarget(this._element, {
|
|
6416
|
+
acceptedTargetZones: ['center'],
|
|
6417
|
+
canDisplayOverlay,
|
|
6418
|
+
getOverrideTarget: () => { var _a; return (_a = group.model.dropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
|
|
6419
|
+
});
|
|
6420
|
+
const buildMultiPanelsGhost = () => {
|
|
6421
|
+
const ghostEl = document.createElement('div');
|
|
6422
|
+
const style = window.getComputedStyle(this._element);
|
|
6423
|
+
const bgColor = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-background-color');
|
|
6424
|
+
const color = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-color');
|
|
6425
|
+
ghostEl.style.backgroundColor = bgColor;
|
|
6426
|
+
ghostEl.style.color = color;
|
|
6427
|
+
ghostEl.style.padding = '2px 8px';
|
|
6428
|
+
ghostEl.style.height = '24px';
|
|
6429
|
+
ghostEl.style.fontSize = '11px';
|
|
6430
|
+
ghostEl.style.lineHeight = '20px';
|
|
6431
|
+
ghostEl.style.borderRadius = '12px';
|
|
6432
|
+
ghostEl.style.whiteSpace = 'nowrap';
|
|
6433
|
+
ghostEl.style.boxSizing = 'border-box';
|
|
6434
|
+
// HTML5 setDragImage snapshots the element as appended to the
|
|
6435
|
+
// document; a default block-level div would stretch to the
|
|
6436
|
+
// body's width and render as a viewport-wide bar.
|
|
6437
|
+
ghostEl.style.display = 'inline-block';
|
|
6438
|
+
ghostEl.textContent = `Multiple Panels (${this.group.size})`;
|
|
6439
|
+
return ghostEl;
|
|
6440
|
+
};
|
|
6441
|
+
const buildGhostSpec = () => {
|
|
6442
|
+
const createGhost = this.accessor.options.createGroupDragGhostComponent;
|
|
6443
|
+
if (createGhost) {
|
|
6444
|
+
const renderer = createGhost(this.group);
|
|
6445
|
+
renderer.init({
|
|
6446
|
+
group: this.group,
|
|
6447
|
+
api: this.accessor.api,
|
|
6448
|
+
});
|
|
6449
|
+
return {
|
|
6450
|
+
element: renderer.element,
|
|
6451
|
+
offsetX: 30,
|
|
6452
|
+
offsetY: -10,
|
|
6453
|
+
dispose: renderer.dispose
|
|
6454
|
+
? () => { var _a; return (_a = renderer.dispose) === null || _a === void 0 ? void 0 : _a.call(renderer); }
|
|
6455
|
+
: undefined,
|
|
6456
|
+
};
|
|
6457
|
+
}
|
|
6458
|
+
return {
|
|
6459
|
+
element: buildMultiPanelsGhost(),
|
|
6460
|
+
offsetX: 30,
|
|
6461
|
+
offsetY: -10,
|
|
6462
|
+
};
|
|
6463
|
+
};
|
|
6464
|
+
const sharedDragOptions = {
|
|
6465
|
+
getData: () => {
|
|
6466
|
+
this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, null)], PanelTransfer.prototype);
|
|
6467
|
+
return {
|
|
6468
|
+
dispose: () => {
|
|
6469
|
+
this.panelTransfer.clearData(PanelTransfer.prototype);
|
|
6470
|
+
},
|
|
6471
|
+
};
|
|
6472
|
+
},
|
|
6473
|
+
createGhost: buildGhostSpec,
|
|
6474
|
+
onDragStart: (event) => {
|
|
6475
|
+
this._onDragStart.fire(event);
|
|
6476
|
+
},
|
|
6477
|
+
};
|
|
6478
|
+
this.html5DragSource = html5Backend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.html5, isCancelled: (event) => {
|
|
6479
|
+
// HTML5: floating groups need shift+drag as the explicit
|
|
6480
|
+
// detach gesture (otherwise click-and-drag conflicts with
|
|
6481
|
+
// moving the floating group itself).
|
|
6482
|
+
if (this.group.api.location.type === 'floating' &&
|
|
6483
|
+
!event.shiftKey) {
|
|
6484
|
+
return true;
|
|
6485
|
+
}
|
|
6486
|
+
if (this.group.api.location.type === 'edge' &&
|
|
6487
|
+
this.group.size === 0) {
|
|
6488
|
+
return true;
|
|
6489
|
+
}
|
|
6490
|
+
return false;
|
|
6491
|
+
} }));
|
|
6492
|
+
const isFloating = () => { var _a, _b, _c; return ((_c = (_b = (_a = this.group) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.location) === null || _c === void 0 ? void 0 : _c.type) === 'floating'; };
|
|
6493
|
+
this.pointerDragSource = pointerBackend.createDragSource(this._element, Object.assign(Object.assign({}, sharedDragOptions), { disabled: !caps.pointer, touchOnly: !caps.pointerHandlesMouse,
|
|
6494
|
+
// Floating groups share this element with the overlay's
|
|
6495
|
+
// move-the-float drag. Without a longer hold + tolerance
|
|
6496
|
+
// override, both gestures commit simultaneously and the
|
|
6497
|
+
// user sees the float follow their finger *and* a ghost.
|
|
6498
|
+
touchInitiationDelay: () => isFloating() ? FLOATING_REDOCK_INITIATION_DELAY_MS : 250, pressTolerance: () => (isFloating() ? Infinity : 8), isCancelled: () => {
|
|
6499
|
+
if (!resolveDndCapabilities(this.accessor.options).pointer) {
|
|
6500
|
+
return true;
|
|
6501
|
+
}
|
|
6502
|
+
// Pointer: long-press IS the deliberate gesture, so
|
|
6503
|
+
// floating groups don't need the shift gate.
|
|
6504
|
+
if (this.group.api.location.type === 'edge' &&
|
|
6505
|
+
this.group.size === 0) {
|
|
6506
|
+
return true;
|
|
6507
|
+
}
|
|
6508
|
+
return false;
|
|
6509
|
+
}, onDragStart: (event) => {
|
|
6510
|
+
var _a;
|
|
6511
|
+
// Redock just committed — abort any in-flight overlay
|
|
6512
|
+
// move so the float stops following the finger while
|
|
6513
|
+
// the ghost takes over.
|
|
6514
|
+
(_a = this.getFloatingOverlay()) === null || _a === void 0 ? void 0 : _a.cancelPendingDrag();
|
|
6515
|
+
this._onDragStart.fire(event);
|
|
6516
|
+
} }));
|
|
6517
|
+
// Mirror direction: once the overlay's move-the-float gesture has
|
|
6518
|
+
// actually moved something, cancel the pending redock arm so the
|
|
6519
|
+
// ghost doesn't appear mid-drag if the user holds past 500ms.
|
|
6520
|
+
const overlayMoveSub = new MutableDisposable();
|
|
6521
|
+
const refreshOverlayMoveSub = () => {
|
|
6522
|
+
const overlay = this.getFloatingOverlay();
|
|
6523
|
+
overlayMoveSub.value = overlay
|
|
6524
|
+
? overlay.onDidStartMoving(() => {
|
|
6525
|
+
this.pointerDragSource.cancelPending();
|
|
6526
|
+
})
|
|
6527
|
+
: exports.DockviewDisposable.NONE;
|
|
6528
|
+
};
|
|
6529
|
+
refreshOverlayMoveSub();
|
|
6530
|
+
this.addDisposables(overlayMoveSub);
|
|
6531
|
+
const locationChange = (_b = (_a = this.group) === null || _a === void 0 ? void 0 : _a.api) === null || _b === void 0 ? void 0 : _b.onDidLocationChange;
|
|
6532
|
+
if (locationChange) {
|
|
6533
|
+
this.addDisposables(locationChange(refreshOverlayMoveSub));
|
|
6534
|
+
}
|
|
6535
|
+
this.onWillShowOverlay = exports.DockviewEvent.any(this.dropTarget.onWillShowOverlay, this.pointerDropTarget.onWillShowOverlay);
|
|
6536
|
+
this.addDisposables(this.html5DragSource, this.dropTarget.onDrop((event) => {
|
|
6537
|
+
this._onDrop.fire(event);
|
|
6538
|
+
}), this.pointerDropTarget.onDrop((event) => {
|
|
5583
6539
|
this._onDrop.fire(event);
|
|
5584
|
-
}), this.dropTarget);
|
|
6540
|
+
}), this.dropTarget, this.pointerDropTarget, this.pointerDragSource);
|
|
5585
6541
|
}
|
|
5586
6542
|
updateDragAndDropState() {
|
|
5587
|
-
|
|
5588
|
-
|
|
5589
|
-
|
|
6543
|
+
const caps = resolveDndCapabilities(this.accessor.options);
|
|
6544
|
+
this._element.draggable = caps.html5;
|
|
6545
|
+
toggleClass(this._element, 'dv-draggable', caps.html5 || caps.pointer);
|
|
6546
|
+
this.html5DragSource.setDisabled(!caps.html5);
|
|
6547
|
+
this.pointerDragSource.setDisabled(!caps.pointer);
|
|
6548
|
+
this.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
|
|
6549
|
+
}
|
|
6550
|
+
getFloatingOverlay() {
|
|
6551
|
+
var _a, _b;
|
|
6552
|
+
if (!this.group) {
|
|
6553
|
+
return undefined;
|
|
6554
|
+
}
|
|
6555
|
+
return (_b = (_a = this.accessor.floatingGroups) === null || _a === void 0 ? void 0 : _a.find((fg) => fg.group === this.group)) === null || _b === void 0 ? void 0 : _b.overlay;
|
|
5590
6556
|
}
|
|
5591
6557
|
}
|
|
5592
6558
|
|
|
@@ -5842,6 +6808,14 @@
|
|
|
5842
6808
|
return (palette !== null && palette !== void 0 ? palette : getFallbackPalette()).resolveValue(color);
|
|
5843
6809
|
}
|
|
5844
6810
|
|
|
6811
|
+
/**
|
|
6812
|
+
* Visual chip for a tab group. Owns the DOM element, label, click /
|
|
6813
|
+
* context-menu interactions, and exposes a long-press gesture as a
|
|
6814
|
+
* second `onContextMenu` source. Drag-and-drop wiring lives in
|
|
6815
|
+
* `TabGroupManager` — the manager constructs the drag sources on this
|
|
6816
|
+
* chip's element so it can include tabs-list context (custom group
|
|
6817
|
+
* drag image, tab-group transfer payload).
|
|
6818
|
+
*/
|
|
5845
6819
|
class TabGroupChip extends CompositeDisposable {
|
|
5846
6820
|
get element() {
|
|
5847
6821
|
return this._element;
|
|
@@ -5852,22 +6826,22 @@
|
|
|
5852
6826
|
this._onClick = new Emitter();
|
|
5853
6827
|
this.onClick = this._onClick.event;
|
|
5854
6828
|
this._onContextMenu = new Emitter();
|
|
6829
|
+
/** Fires on right-click and on touch long-press. */
|
|
5855
6830
|
this.onContextMenu = this._onContextMenu.event;
|
|
5856
|
-
this._onDragStart = new Emitter();
|
|
5857
|
-
this.onDragStart = this._onDragStart.event;
|
|
5858
6831
|
this._element = document.createElement('div');
|
|
5859
6832
|
this._element.className = 'dv-tab-group-chip';
|
|
5860
6833
|
this._element.tabIndex = 0;
|
|
5861
|
-
this._element.draggable = true;
|
|
5862
6834
|
this._label = document.createElement('span');
|
|
5863
6835
|
this._label.className = 'dv-tab-group-chip-label';
|
|
5864
6836
|
this._element.appendChild(this._label);
|
|
5865
|
-
this.addDisposables(this._onClick, this._onContextMenu,
|
|
6837
|
+
this.addDisposables(this._onClick, this._onContextMenu, new LongPressDetector(this._element, {
|
|
6838
|
+
onLongPress: (event) => {
|
|
6839
|
+
this._onContextMenu.fire(event);
|
|
6840
|
+
},
|
|
6841
|
+
}), addDisposableListener(this._element, 'click', (event) => {
|
|
5866
6842
|
this._onClick.fire(event);
|
|
5867
6843
|
}), addDisposableListener(this._element, 'contextmenu', (event) => {
|
|
5868
6844
|
this._onContextMenu.fire(event);
|
|
5869
|
-
}), addDisposableListener(this._element, 'dragstart', (event) => {
|
|
5870
|
-
this._onDragStart.fire(event);
|
|
5871
6845
|
}));
|
|
5872
6846
|
}
|
|
5873
6847
|
init(params) {
|
|
@@ -6149,7 +7123,7 @@
|
|
|
6149
7123
|
let svg = underline.firstElementChild;
|
|
6150
7124
|
let path;
|
|
6151
7125
|
if (!svg || svg.tagName !== 'svg') {
|
|
6152
|
-
underline.
|
|
7126
|
+
underline.replaceChildren();
|
|
6153
7127
|
svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
6154
7128
|
svg.style.display = 'block';
|
|
6155
7129
|
path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
@@ -6247,7 +7221,7 @@
|
|
|
6247
7221
|
underline.style.display = '';
|
|
6248
7222
|
// Clear any SVG content left over from a mode switch
|
|
6249
7223
|
if (underline.firstElementChild) {
|
|
6250
|
-
underline.
|
|
7224
|
+
underline.replaceChildren();
|
|
6251
7225
|
}
|
|
6252
7226
|
underline.style.backgroundColor = color;
|
|
6253
7227
|
if (isVertical) {
|
|
@@ -6331,6 +7305,12 @@
|
|
|
6331
7305
|
this._positionChipForGroup(tabGroup);
|
|
6332
7306
|
}
|
|
6333
7307
|
}
|
|
7308
|
+
updateDirection() {
|
|
7309
|
+
const isVertical = this._ctx.getDirection() === 'vertical';
|
|
7310
|
+
for (const [, entry] of this._chipRenderers) {
|
|
7311
|
+
entry.dropTarget.setTargetZones(isVertical ? ['top'] : ['left']);
|
|
7312
|
+
}
|
|
7313
|
+
}
|
|
6334
7314
|
snapshotChipWidths() {
|
|
6335
7315
|
const widths = new Map();
|
|
6336
7316
|
for (const [groupId, entry] of this._chipRenderers) {
|
|
@@ -6424,6 +7404,45 @@
|
|
|
6424
7404
|
(_a = this._pendingTransitionCleanups.get(panelId)) === null || _a === void 0 ? void 0 : _a();
|
|
6425
7405
|
this._pendingTransitionCleanups.delete(panelId);
|
|
6426
7406
|
}
|
|
7407
|
+
updateDragAndDropState() {
|
|
7408
|
+
const caps = resolveDndCapabilities(this._ctx.accessor.options);
|
|
7409
|
+
for (const entry of this._chipRenderers.values()) {
|
|
7410
|
+
entry.chip.element.draggable = caps.html5;
|
|
7411
|
+
entry.html5DragSource.setDisabled(!caps.html5);
|
|
7412
|
+
entry.pointerDragSource.setDisabled(!caps.pointer);
|
|
7413
|
+
entry.pointerDragSource.setTouchOnly(!caps.pointerHandlesMouse);
|
|
7414
|
+
}
|
|
7415
|
+
}
|
|
7416
|
+
/**
|
|
7417
|
+
* Synchronously dispose the chip drag sources for an in-flight chip
|
|
7418
|
+
* drag. Called from `_commitGroupMove` so the transfer payload +
|
|
7419
|
+
* iframe shield are released BEFORE the cross-group move detaches
|
|
7420
|
+
* the chip (chip dispose is scheduled on a microtask via
|
|
7421
|
+
* `_scheduleTabGroupUpdate`, which is too late for callers that read
|
|
7422
|
+
* `getPanelData()` synchronously after the move). Idempotent — the
|
|
7423
|
+
* subsequent `update()` will also dispose the sources.
|
|
7424
|
+
*/
|
|
7425
|
+
disposeChipDrag(tabGroupId) {
|
|
7426
|
+
var _a, _b;
|
|
7427
|
+
const entry = this._chipRenderers.get(tabGroupId);
|
|
7428
|
+
if (!entry) {
|
|
7429
|
+
return;
|
|
7430
|
+
}
|
|
7431
|
+
// Optional-chained because tests may inject minimal entries
|
|
7432
|
+
// that skip the manager's normal `_ensureChipForGroup` flow.
|
|
7433
|
+
(_a = entry.html5DragSource) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
7434
|
+
(_b = entry.pointerDragSource) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
7435
|
+
}
|
|
7436
|
+
/** Cloned chip rect used as the pointer follow-finger ghost. */
|
|
7437
|
+
_buildChipGhostElement(chipEl) {
|
|
7438
|
+
const style = getComputedStyle(chipEl);
|
|
7439
|
+
const clone = chipEl.cloneNode(true);
|
|
7440
|
+
Array.from(style).forEach((key) => {
|
|
7441
|
+
clone.style.setProperty(key, style.getPropertyValue(key), style.getPropertyPriority(key));
|
|
7442
|
+
});
|
|
7443
|
+
clone.style.position = 'absolute';
|
|
7444
|
+
return clone;
|
|
7445
|
+
}
|
|
6427
7446
|
disposeAll() {
|
|
6428
7447
|
var _a;
|
|
6429
7448
|
(_a = this._indicator) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
@@ -6469,6 +7488,74 @@
|
|
|
6469
7488
|
? createChip(tabGroup)
|
|
6470
7489
|
: new TabGroupChip(this._ctx.accessor.tabGroupColorPalette);
|
|
6471
7490
|
chip.init({ tabGroup, api: this._ctx.accessor.api });
|
|
7491
|
+
const caps = resolveDndCapabilities(this._ctx.accessor.options);
|
|
7492
|
+
chip.element.draggable = caps.html5;
|
|
7493
|
+
const panelTransfer = LocalSelectionTransfer.getInstance();
|
|
7494
|
+
// Shared `getData` for both backends. Sets a group-level
|
|
7495
|
+
// PanelTransfer (panelId=null, tabGroupId identifies the group).
|
|
7496
|
+
// The returned disposer clears it on drag end.
|
|
7497
|
+
const getData = () => {
|
|
7498
|
+
panelTransfer.setData([
|
|
7499
|
+
new PanelTransfer(this._ctx.accessor.id, this._ctx.group.id, null, tabGroup.id),
|
|
7500
|
+
], PanelTransfer.prototype);
|
|
7501
|
+
return {
|
|
7502
|
+
dispose: () => {
|
|
7503
|
+
panelTransfer.clearData(PanelTransfer.prototype);
|
|
7504
|
+
},
|
|
7505
|
+
};
|
|
7506
|
+
};
|
|
7507
|
+
// The chip's HTML5 drag image is the cloned tabs list (chip only),
|
|
7508
|
+
// mounted inside the dockview root for CSS-variable inheritance and
|
|
7509
|
+
// positioned against the chip's in-place rect. Layout-dependent
|
|
7510
|
+
// offset means we set the drag image directly in `onDragStart`
|
|
7511
|
+
// (inside the dragstart handler) rather than via the generic
|
|
7512
|
+
// `createGhost` factory, which only knows about ghost specs that
|
|
7513
|
+
// can be appended to `document.body`.
|
|
7514
|
+
const html5DragSource = html5Backend.createDragSource(chip.element, {
|
|
7515
|
+
getData,
|
|
7516
|
+
disabled: !caps.html5,
|
|
7517
|
+
isCancelled: () => !resolveDndCapabilities(this._ctx.accessor.options).html5,
|
|
7518
|
+
onDragStart: (event) => {
|
|
7519
|
+
// Type guard via `dataTransfer` — `instanceof DragEvent`
|
|
7520
|
+
// would throw in jsdom which doesn't ship a DragEvent
|
|
7521
|
+
// constructor.
|
|
7522
|
+
if ('dataTransfer' in event && event.dataTransfer) {
|
|
7523
|
+
this.setGroupDragImage(event, tabGroup, chip.element);
|
|
7524
|
+
}
|
|
7525
|
+
this._callbacks.onChipDragStart(tabGroup, chip, event);
|
|
7526
|
+
},
|
|
7527
|
+
onDragEnd: (event) => {
|
|
7528
|
+
var _a, _b;
|
|
7529
|
+
(_b = (_a = this._callbacks).onChipDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, tabGroup, chip, event);
|
|
7530
|
+
},
|
|
7531
|
+
});
|
|
7532
|
+
// Synchronous panelTransfer cleanup directly on the chip element.
|
|
7533
|
+
// `Html5DragSource`'s dragend defers data disposal via `setTimeout(0)`
|
|
7534
|
+
// so drop handlers can read the payload — but a chip drag that
|
|
7535
|
+
// ends via `moveGroupOrPanel` (no actual drop event) needs the
|
|
7536
|
+
// singleton cleared immediately, otherwise a synchronous
|
|
7537
|
+
// `getPanelData()` after the move still sees the stale chip
|
|
7538
|
+
// payload. Attached directly (not via `addDisposableListener`) so
|
|
7539
|
+
// the listener survives chip disposal in the detach-then-dragend
|
|
7540
|
+
// cross-group path; `once: true` auto-removes after the single
|
|
7541
|
+
// dragend that we care about. (#1254)
|
|
7542
|
+
chip.element.addEventListener('dragend', () => {
|
|
7543
|
+
panelTransfer.clearData(PanelTransfer.prototype);
|
|
7544
|
+
}, { once: true });
|
|
7545
|
+
const pointerDragSource = pointerBackend.createDragSource(chip.element, {
|
|
7546
|
+
getData,
|
|
7547
|
+
disabled: !caps.pointer,
|
|
7548
|
+
touchOnly: !caps.pointerHandlesMouse,
|
|
7549
|
+
isCancelled: () => !resolveDndCapabilities(this._ctx.accessor.options).pointer,
|
|
7550
|
+
createGhost: () => ({
|
|
7551
|
+
element: this._buildChipGhostElement(chip.element),
|
|
7552
|
+
offsetX: 8,
|
|
7553
|
+
offsetY: 8,
|
|
7554
|
+
}),
|
|
7555
|
+
onDragStart: (event) => {
|
|
7556
|
+
this._callbacks.onChipDragStart(tabGroup, chip, event);
|
|
7557
|
+
},
|
|
7558
|
+
});
|
|
6472
7559
|
const disposables = [
|
|
6473
7560
|
tabGroup.onDidChange(() => {
|
|
6474
7561
|
var _a;
|
|
@@ -6482,24 +7569,70 @@
|
|
|
6482
7569
|
tabGroup.onDidCollapseChange(() => {
|
|
6483
7570
|
this._updateTabGroupClasses();
|
|
6484
7571
|
}),
|
|
7572
|
+
html5DragSource,
|
|
7573
|
+
pointerDragSource,
|
|
6485
7574
|
];
|
|
6486
|
-
//
|
|
7575
|
+
// Context menu: built-in TabGroupChip already aggregates right-click
|
|
7576
|
+
// + touch long-press into `onContextMenu`. Custom chip renderers
|
|
7577
|
+
// don't, so attach a long-press detector and contextmenu listener
|
|
7578
|
+
// directly on their element.
|
|
7579
|
+
const onContextMenu = (event) => {
|
|
7580
|
+
// A long-press on a chip should preempt the in-flight pointer
|
|
7581
|
+
// drag and open the menu instead.
|
|
7582
|
+
pointerDragSource.cancelPending();
|
|
7583
|
+
this._callbacks.onChipContextMenu(tabGroup, event);
|
|
7584
|
+
};
|
|
6487
7585
|
if (chip instanceof TabGroupChip) {
|
|
6488
|
-
disposables.push(chip.onContextMenu(
|
|
6489
|
-
this._callbacks.onChipContextMenu(tabGroup, event);
|
|
6490
|
-
}), chip.onDragStart((event) => {
|
|
6491
|
-
this._callbacks.onChipDragStart(tabGroup, chip, event);
|
|
6492
|
-
}));
|
|
7586
|
+
disposables.push(chip.onContextMenu(onContextMenu));
|
|
6493
7587
|
}
|
|
6494
7588
|
else {
|
|
6495
|
-
disposables.push(
|
|
6496
|
-
|
|
6497
|
-
}), addDisposableListener(chip.element, '
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
7589
|
+
disposables.push(new LongPressDetector(chip.element, {
|
|
7590
|
+
onLongPress: onContextMenu,
|
|
7591
|
+
}), addDisposableListener(chip.element, 'contextmenu', onContextMenu));
|
|
7592
|
+
}
|
|
7593
|
+
// The chip sits before its group's first tab in the DOM, so it
|
|
7594
|
+
// covers the "drop before the group" position. Without a drop
|
|
7595
|
+
// target here, dropping a tab over the chip is a dead zone —
|
|
7596
|
+
// particularly visible when the group is first in the tabs list
|
|
7597
|
+
// and there's no preceding tab whose right zone covers position 0.
|
|
7598
|
+
// The smooth animation path already shifts the chip's margin to
|
|
7599
|
+
// open a gap, so suppress the overlay in that mode.
|
|
7600
|
+
const isVertical = this._ctx.getDirection() === 'vertical';
|
|
7601
|
+
const dropTarget = new Droptarget(chip.element, {
|
|
7602
|
+
acceptedTargetZones: isVertical ? ['top'] : ['left'],
|
|
7603
|
+
overlayModel: {
|
|
7604
|
+
activationSize: { value: 100, type: 'percentage' },
|
|
7605
|
+
},
|
|
7606
|
+
canDisplayOverlay: (event, position) => {
|
|
7607
|
+
var _a;
|
|
7608
|
+
if (this._ctx.group.locked) {
|
|
7609
|
+
return false;
|
|
7610
|
+
}
|
|
7611
|
+
if (this._ctx.accessor.options.disableDnd) {
|
|
7612
|
+
return false;
|
|
7613
|
+
}
|
|
7614
|
+
const data = getPanelData();
|
|
7615
|
+
if (data && this._ctx.accessor.id === data.viewId) {
|
|
7616
|
+
if (((_a = this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) ===
|
|
7617
|
+
'smooth') {
|
|
7618
|
+
return false;
|
|
7619
|
+
}
|
|
7620
|
+
return true;
|
|
7621
|
+
}
|
|
7622
|
+
return this._ctx.group.model.canDisplayOverlay(event, position, 'tab');
|
|
7623
|
+
},
|
|
7624
|
+
});
|
|
7625
|
+
disposables.push(dropTarget, dropTarget.onDrop((event) => {
|
|
7626
|
+
this._callbacks.onChipDrop(tabGroup, event);
|
|
7627
|
+
}));
|
|
6501
7628
|
const disposable = new CompositeDisposable(...disposables);
|
|
6502
|
-
this._chipRenderers.set(tabGroup.id, {
|
|
7629
|
+
this._chipRenderers.set(tabGroup.id, {
|
|
7630
|
+
chip,
|
|
7631
|
+
html5DragSource,
|
|
7632
|
+
pointerDragSource,
|
|
7633
|
+
disposable,
|
|
7634
|
+
dropTarget,
|
|
7635
|
+
});
|
|
6503
7636
|
// Group is born collapsed (cross-group drop, layout restore, etc.):
|
|
6504
7637
|
// its tabs are about to be added without the collapsed class. Skip
|
|
6505
7638
|
// the animation in the upcoming _updateTabGroupClasses call so they
|
|
@@ -6758,6 +7891,7 @@
|
|
|
6758
7891
|
for (const tab of this._tabs) {
|
|
6759
7892
|
tab.value.setDirection(value);
|
|
6760
7893
|
}
|
|
7894
|
+
this._tabGroupManager.updateDirection();
|
|
6761
7895
|
}
|
|
6762
7896
|
constructor(group, accessor, options) {
|
|
6763
7897
|
super();
|
|
@@ -6777,7 +7911,7 @@
|
|
|
6777
7911
|
this._voidContainer = null;
|
|
6778
7912
|
this._voidContainerListeners = null;
|
|
6779
7913
|
this._extendedDropZone = null;
|
|
6780
|
-
this.
|
|
7914
|
+
this._pointerInsideTabsList = false;
|
|
6781
7915
|
this._onTabDragStart = new Emitter();
|
|
6782
7916
|
this.onTabDragStart = this._onTabDragStart.event;
|
|
6783
7917
|
this._onDrop = new Emitter();
|
|
@@ -6812,13 +7946,40 @@
|
|
|
6812
7946
|
onChipDragStart: (tabGroup, chip, event) => {
|
|
6813
7947
|
this._handleChipDragStart(tabGroup, chip, event);
|
|
6814
7948
|
},
|
|
7949
|
+
onChipDragEnd: () => {
|
|
7950
|
+
// HTML5 chip dragend (incl. cancels). The Html5DragSource
|
|
7951
|
+
// owns the listener on the chip element, so this fires
|
|
7952
|
+
// even if the chip was detached cross-group — the
|
|
7953
|
+
// element keeps its listeners until the source is
|
|
7954
|
+
// disposed. resetDragAnimation is a no-op after a
|
|
7955
|
+
// successful drop (anim state already null) thanks to
|
|
7956
|
+
// the gating inside it.
|
|
7957
|
+
this.resetDragAnimation();
|
|
7958
|
+
},
|
|
7959
|
+
onChipDrop: (tabGroup, event) => {
|
|
7960
|
+
this._handleChipDrop(tabGroup, event);
|
|
7961
|
+
},
|
|
6815
7962
|
});
|
|
6816
7963
|
this.addDisposables(this._onOverflowTabsChange, this._observerDisposable, this._onWillShowOverlay, this._onDrop, this._onTabDragStart, {
|
|
6817
7964
|
dispose: () => {
|
|
6818
7965
|
var _a;
|
|
6819
7966
|
(_a = this._flipTransitionCleanup) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
6820
7967
|
},
|
|
6821
|
-
},
|
|
7968
|
+
},
|
|
7969
|
+
// Pointer-side cleanup: when any pointer drag ends, tear
|
|
7970
|
+
// down smooth-reorder anim state the dragover bridge may
|
|
7971
|
+
// have installed. The chip's pointer drag source handles
|
|
7972
|
+
// its own transfer payload + iframe-shield cleanup.
|
|
7973
|
+
PointerDragController.getInstance().onDragEnd(() => {
|
|
7974
|
+
this._pointerInsideTabsList = false;
|
|
7975
|
+
this.resetDragAnimation();
|
|
7976
|
+
}),
|
|
7977
|
+
// Pointer-event mirror of the HTML5 dragover / dragleave handlers
|
|
7978
|
+
// below. Drives smooth-reorder for `dndStrategy: 'pointer'` and
|
|
7979
|
+
// for touch drags in `'auto'`.
|
|
7980
|
+
PointerDragController.getInstance().onDragMove((e) => {
|
|
7981
|
+
this._handlePointerDragMove(e.clientX, e.clientY);
|
|
7982
|
+
}), addDisposableListener(this.element, 'pointerdown', (event) => {
|
|
6822
7983
|
if (event.defaultPrevented) {
|
|
6823
7984
|
return;
|
|
6824
7985
|
}
|
|
@@ -6826,135 +7987,60 @@
|
|
|
6826
7987
|
if (isLeftClick) {
|
|
6827
7988
|
this.accessor.doSetGroupActive(this.group);
|
|
6828
7989
|
}
|
|
6829
|
-
}),
|
|
6830
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
|
|
6835
|
-
|
|
6836
|
-
|
|
6837
|
-
|
|
6838
|
-
|
|
6839
|
-
|
|
6840
|
-
|
|
6841
|
-
|
|
6842
|
-
|
|
6843
|
-
|
|
6844
|
-
|
|
6845
|
-
if (!this._animState) {
|
|
6846
|
-
const data = getPanelData();
|
|
6847
|
-
// In default animation mode, individual tab drops
|
|
6848
|
-
// are handled by per-tab Droptargets. But tab group
|
|
6849
|
-
// chip drags still need tab-list-level handling so
|
|
6850
|
-
// that drops on gaps / void space work.
|
|
6851
|
-
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) ===
|
|
6852
|
-
'default' &&
|
|
6853
|
-
!(data === null || data === void 0 ? void 0 : data.tabGroupId)) {
|
|
6854
|
-
return;
|
|
6855
|
-
}
|
|
6856
|
-
if (data &&
|
|
6857
|
-
(data.panelId || data.tabGroupId) &&
|
|
6858
|
-
data.groupId !== this.group.id) {
|
|
6859
|
-
const avgWidth = this.getAverageTabWidth();
|
|
6860
|
-
if (data.tabGroupId) {
|
|
6861
|
-
// External group drag — look up the
|
|
6862
|
-
// source tab group to size the gap
|
|
6863
|
-
const sourceGroup = this.accessor.getPanel(data.groupId);
|
|
6864
|
-
const sourceTg = sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.getTabGroups().find((tg) => tg.id === data.tabGroupId);
|
|
6865
|
-
const panelCount = (_b = sourceTg === null || sourceTg === void 0 ? void 0 : sourceTg.panelIds.length) !== null && _b !== void 0 ? _b : 1;
|
|
6866
|
-
const groupGapWidth = avgWidth * panelCount + avgWidth;
|
|
6867
|
-
this._animState = {
|
|
6868
|
-
sourceTabId: '',
|
|
6869
|
-
sourceIndex: -1,
|
|
6870
|
-
tabPositions: this.snapshotTabPositions(),
|
|
6871
|
-
chipPositions: this._tabGroupManager.snapshotChipWidths(),
|
|
6872
|
-
currentInsertionIndex: null,
|
|
6873
|
-
targetTabGroupId: null,
|
|
6874
|
-
sourceTabGroupId: data.tabGroupId,
|
|
6875
|
-
sourceGroupPanelIds: sourceTg
|
|
6876
|
-
? new Set(sourceTg.panelIds)
|
|
6877
|
-
: new Set(),
|
|
6878
|
-
sourceChipWidth: avgWidth,
|
|
6879
|
-
cursorOffsetFromDragLeft: groupGapWidth / 2,
|
|
6880
|
-
sourceGapWidth: groupGapWidth,
|
|
6881
|
-
containerLeft: this._tabsList.getBoundingClientRect()
|
|
6882
|
-
.left,
|
|
6883
|
-
};
|
|
6884
|
-
}
|
|
6885
|
-
else {
|
|
6886
|
-
this._animState = {
|
|
6887
|
-
sourceTabId: data.panelId,
|
|
6888
|
-
sourceIndex: -1,
|
|
6889
|
-
tabPositions: this.snapshotTabPositions(),
|
|
6890
|
-
chipPositions: this._tabGroupManager.snapshotChipWidths(),
|
|
6891
|
-
currentInsertionIndex: null,
|
|
6892
|
-
targetTabGroupId: null,
|
|
6893
|
-
sourceTabGroupId: null,
|
|
6894
|
-
sourceGroupPanelIds: null,
|
|
6895
|
-
sourceChipWidth: 0,
|
|
6896
|
-
cursorOffsetFromDragLeft: avgWidth / 2,
|
|
6897
|
-
sourceGapWidth: avgWidth,
|
|
6898
|
-
containerLeft: this._tabsList.getBoundingClientRect()
|
|
6899
|
-
.left,
|
|
6900
|
-
};
|
|
6901
|
-
}
|
|
6902
|
-
}
|
|
6903
|
-
else {
|
|
6904
|
-
return;
|
|
6905
|
-
}
|
|
6906
|
-
}
|
|
6907
|
-
event.preventDefault(); // allow drop to fire on the container
|
|
6908
|
-
// For intra-group drag (sourceIndex >= 0) the gap
|
|
6909
|
-
// animation is the sole visual indicator — clear any
|
|
6910
|
-
// stale anchor overlay that may have been set while the
|
|
6911
|
-
// cursor was over the panel content area or another zone.
|
|
6912
|
-
// External drags (sourceIndex === -1) leave the overlay
|
|
6913
|
-
// to the individual tab Droptargets so cross-group
|
|
6914
|
-
// animation is not disrupted.
|
|
6915
|
-
if (this._animState.sourceIndex !== -1) {
|
|
6916
|
-
(_d = (_c = this.group.model.dropTargetContainer) === null || _c === void 0 ? void 0 : _c.model) === null || _d === void 0 ? void 0 : _d.clear();
|
|
6917
|
-
}
|
|
6918
|
-
this.handleDragOver(event);
|
|
6919
|
-
}, true), addDisposableListener(this._tabsList, 'dragleave', (event) => {
|
|
6920
|
-
var _a, _b, _c;
|
|
6921
|
-
if (!this._animState) {
|
|
7990
|
+
}),
|
|
7991
|
+
// Trackpad / wheel forwarding. The strip scrolls along its own
|
|
7992
|
+
// axis (x for horizontal headers, y for vertical), so deltaY
|
|
7993
|
+
// from a plain mouse wheel maps onto the strip's axis too —
|
|
7994
|
+
// this gives the VS Code-style "scroll over tab bar to page
|
|
7995
|
+
// through tabs" feel. We only consume the event when the strip
|
|
7996
|
+
// is actually overflowing in the direction the user wheeled in,
|
|
7997
|
+
// so a wheel at the edge of a non-overflowing strip still
|
|
7998
|
+
// bubbles up and scrolls the page. `{ passive: false }` is
|
|
7999
|
+
// required because we call preventDefault().
|
|
8000
|
+
addDisposableListener(this._tabsList, 'wheel', (event) => {
|
|
8001
|
+
const isVertical = this._direction === 'vertical';
|
|
8002
|
+
const primary = isVertical
|
|
8003
|
+
? event.deltaY || event.deltaX
|
|
8004
|
+
: event.deltaX || event.deltaY;
|
|
8005
|
+
if (primary === 0) {
|
|
6922
8006
|
return;
|
|
6923
8007
|
}
|
|
6924
|
-
const
|
|
6925
|
-
|
|
6926
|
-
|
|
6927
|
-
|
|
6928
|
-
|
|
6929
|
-
|
|
6930
|
-
// left actions), keep _animState alive so the external
|
|
6931
|
-
// dragover listeners can continue the gap animation.
|
|
6932
|
-
if (related && ((_a = this._extendedDropZone) === null || _a === void 0 ? void 0 : _a.contains(related))) {
|
|
6933
|
-
this.resetTabTransforms();
|
|
6934
|
-
this._animState.currentInsertionIndex = null;
|
|
8008
|
+
const max = isVertical
|
|
8009
|
+
? this._tabsList.scrollHeight -
|
|
8010
|
+
this._tabsList.clientHeight
|
|
8011
|
+
: this._tabsList.scrollWidth -
|
|
8012
|
+
this._tabsList.clientWidth;
|
|
8013
|
+
if (max <= 0) {
|
|
6935
8014
|
return;
|
|
6936
8015
|
}
|
|
6937
|
-
|
|
6938
|
-
|
|
6939
|
-
|
|
6940
|
-
|
|
6941
|
-
|
|
6942
|
-
|
|
6943
|
-
(
|
|
6944
|
-
this._voidContainer.contains(rt));
|
|
6945
|
-
if (isVoid) {
|
|
8016
|
+
const current = isVertical
|
|
8017
|
+
? this._tabsList.scrollTop
|
|
8018
|
+
: this._tabsList.scrollLeft;
|
|
8019
|
+
// At the edge in the wheel direction: let the page
|
|
8020
|
+
// scroll instead of trapping the gesture.
|
|
8021
|
+
if ((primary < 0 && current <= 0) ||
|
|
8022
|
+
(primary > 0 && current >= max)) {
|
|
6946
8023
|
return;
|
|
6947
8024
|
}
|
|
6948
|
-
|
|
6949
|
-
|
|
6950
|
-
|
|
6951
|
-
|
|
6952
|
-
|
|
6953
|
-
|
|
6954
|
-
|
|
6955
|
-
|
|
6956
|
-
|
|
8025
|
+
event.preventDefault();
|
|
8026
|
+
// Custom-scrollbar mode wraps the tabs list and installs
|
|
8027
|
+
// its own wheel listener that rewrites scrollLeft from a
|
|
8028
|
+
// deltaY-only tracker. Without stopPropagation that
|
|
8029
|
+
// handler would clobber our deltaX-aware update.
|
|
8030
|
+
event.stopPropagation();
|
|
8031
|
+
if (isVertical) {
|
|
8032
|
+
this._tabsList.scrollTop = current + primary;
|
|
8033
|
+
}
|
|
8034
|
+
else {
|
|
8035
|
+
this._tabsList.scrollLeft = current + primary;
|
|
8036
|
+
}
|
|
8037
|
+
}, { passive: false }), addDisposableListener(this._tabsList, 'dragover', (event) => {
|
|
8038
|
+
if (this._processDragOver(event.clientX)) {
|
|
8039
|
+
// Allow `drop` to fire on the tabs list container.
|
|
8040
|
+
event.preventDefault();
|
|
6957
8041
|
}
|
|
8042
|
+
}, true), addDisposableListener(this._tabsList, 'dragleave', (event) => {
|
|
8043
|
+
this._processDragLeave(event.relatedTarget);
|
|
6958
8044
|
}, true), addDisposableListener(this._tabsList, 'dragend', () => {
|
|
6959
8045
|
this.resetDragAnimation();
|
|
6960
8046
|
}), addDisposableListener(this._tabsList, 'drop', (event) => {
|
|
@@ -7076,6 +8162,9 @@
|
|
|
7076
8162
|
const disposable = new CompositeDisposable(tab.onDragStart((event) => {
|
|
7077
8163
|
var _a;
|
|
7078
8164
|
this._onTabDragStart.fire({ nativeEvent: event, panel });
|
|
8165
|
+
// Both HTML5 and pointer drags initialize _animState. Cleanup
|
|
8166
|
+
// is wired in both paths: HTML5 via dragend/drop on _tabsList,
|
|
8167
|
+
// pointer via PointerDragController.onDragEnd subscriptions.
|
|
7079
8168
|
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
|
|
7080
8169
|
const tabWidth = tab.element.getBoundingClientRect().width;
|
|
7081
8170
|
const sourceIndex = this._tabs.findIndex((x) => x.value === tab);
|
|
@@ -7335,6 +8424,7 @@
|
|
|
7335
8424
|
for (const tab of this._tabs) {
|
|
7336
8425
|
tab.value.updateDragAndDropState();
|
|
7337
8426
|
}
|
|
8427
|
+
this._tabGroupManager.updateDragAndDropState();
|
|
7338
8428
|
}
|
|
7339
8429
|
/**
|
|
7340
8430
|
* Synchronize chip elements and CSS classes for all tab groups
|
|
@@ -7346,6 +8436,13 @@
|
|
|
7346
8436
|
refreshTabGroupAccent() {
|
|
7347
8437
|
this._tabGroupManager.refreshAccents();
|
|
7348
8438
|
}
|
|
8439
|
+
/**
|
|
8440
|
+
* Tabs-list-specific side effects of a chip drag start. The chip's
|
|
8441
|
+
* drag sources (constructed by `TabGroupManager`) own the transfer
|
|
8442
|
+
* payload, iframe shielding, dataTransfer setup, and the HTML5 drag
|
|
8443
|
+
* image. This method just sets up the smooth-reorder anim state and
|
|
8444
|
+
* collapses the source-group tabs in the tabs list.
|
|
8445
|
+
*/
|
|
7349
8446
|
_handleChipDragStart(tabGroup, chip, event) {
|
|
7350
8447
|
var _a;
|
|
7351
8448
|
const firstPanelId = tabGroup.panelIds[0];
|
|
@@ -7376,89 +8473,79 @@
|
|
|
7376
8473
|
sourceGapWidth: groupGapWidth,
|
|
7377
8474
|
containerLeft: this._tabsList.getBoundingClientRect().left,
|
|
7378
8475
|
};
|
|
7379
|
-
|
|
7380
|
-
|
|
7381
|
-
|
|
7382
|
-
|
|
7383
|
-
|
|
7384
|
-
|
|
7385
|
-
|
|
7386
|
-
|
|
7387
|
-
|
|
7388
|
-
|
|
7389
|
-
|
|
7390
|
-
|
|
7391
|
-
|
|
7392
|
-
|
|
7393
|
-
|
|
7394
|
-
|
|
7395
|
-
|
|
7396
|
-
|
|
7397
|
-
|
|
7398
|
-
|
|
7399
|
-
};
|
|
7400
|
-
chipElement.addEventListener('dragend', onChipDragEnd);
|
|
7401
|
-
this._chipDragCleanup = {
|
|
7402
|
-
dispose: () => {
|
|
7403
|
-
chipElement.removeEventListener('dragend', onChipDragEnd);
|
|
7404
|
-
panelTransfer.clearData(PanelTransfer.prototype);
|
|
7405
|
-
iframes.release();
|
|
7406
|
-
},
|
|
7407
|
-
};
|
|
7408
|
-
if (event.dataTransfer) {
|
|
7409
|
-
event.dataTransfer.effectAllowed = 'move';
|
|
7410
|
-
if (event.dataTransfer.items.length === 0) {
|
|
7411
|
-
event.dataTransfer.setData('text/plain', '');
|
|
7412
|
-
}
|
|
7413
|
-
}
|
|
7414
|
-
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
|
|
7415
|
-
// Collapse group tabs + chip after the browser
|
|
7416
|
-
// captures the drag image, then open the gap at the
|
|
7417
|
-
// source position — all instant (no transitions).
|
|
7418
|
-
const groupPanelIds = new Set(tabGroup.panelIds);
|
|
7419
|
-
this._pendingCollapse = true;
|
|
7420
|
-
requestAnimationFrame(() => {
|
|
7421
|
-
var _a;
|
|
7422
|
-
var _b;
|
|
7423
|
-
this._pendingCollapse = false;
|
|
7424
|
-
if (!this._animState) {
|
|
7425
|
-
return;
|
|
7426
|
-
}
|
|
7427
|
-
// Collapse all group tabs instantly
|
|
7428
|
-
for (const t of this._tabs) {
|
|
7429
|
-
if (groupPanelIds.has(t.value.panel.id)) {
|
|
7430
|
-
t.value.element.style.transition = 'none';
|
|
7431
|
-
toggleClass(t.value.element, 'dv-tab--dragging', true);
|
|
7432
|
-
}
|
|
7433
|
-
}
|
|
7434
|
-
// Collapse the group chip instantly
|
|
7435
|
-
const chipEntry = this._tabGroupManager.chipRenderers.get(tabGroup.id);
|
|
7436
|
-
if (chipEntry) {
|
|
7437
|
-
chipEntry.chip.element.style.transition = 'none';
|
|
7438
|
-
toggleClass(chipEntry.chip.element, 'dv-tab-group-chip--dragging', true);
|
|
7439
|
-
}
|
|
7440
|
-
// Single reflow for the entire batch
|
|
7441
|
-
void this._tabsList.offsetHeight;
|
|
7442
|
-
const underline = this._tabGroupManager.groupUnderlines.get(tabGroup.id);
|
|
7443
|
-
if (underline) {
|
|
7444
|
-
underline.style.display = 'none';
|
|
7445
|
-
}
|
|
7446
|
-
(_a = (_b = this._animState).currentInsertionIndex) !== null && _a !== void 0 ? _a : (_b.currentInsertionIndex = firstIdx);
|
|
7447
|
-
// Apply gap with transitions disabled
|
|
7448
|
-
this.applyDragOverTransforms(true);
|
|
7449
|
-
// Re-enable transitions for subsequent moves
|
|
7450
|
-
for (const t of this._tabs) {
|
|
7451
|
-
if (groupPanelIds.has(t.value.panel.id)) {
|
|
7452
|
-
t.value.element.style.removeProperty('transition');
|
|
7453
|
-
}
|
|
8476
|
+
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) !== 'smooth') {
|
|
8477
|
+
return;
|
|
8478
|
+
}
|
|
8479
|
+
// Collapse group tabs + chip after the browser captures the drag
|
|
8480
|
+
// image, then open the gap at the source position — all instant
|
|
8481
|
+
// (no transitions).
|
|
8482
|
+
const groupPanelIds = new Set(tabGroup.panelIds);
|
|
8483
|
+
this._pendingCollapse = true;
|
|
8484
|
+
requestAnimationFrame(() => {
|
|
8485
|
+
var _a;
|
|
8486
|
+
var _b;
|
|
8487
|
+
this._pendingCollapse = false;
|
|
8488
|
+
if (!this._animState) {
|
|
8489
|
+
return;
|
|
8490
|
+
}
|
|
8491
|
+
// Collapse all group tabs instantly
|
|
8492
|
+
for (const t of this._tabs) {
|
|
8493
|
+
if (groupPanelIds.has(t.value.panel.id)) {
|
|
8494
|
+
t.value.element.style.transition = 'none';
|
|
8495
|
+
toggleClass(t.value.element, 'dv-tab--dragging', true);
|
|
7454
8496
|
}
|
|
7455
|
-
|
|
7456
|
-
|
|
8497
|
+
}
|
|
8498
|
+
// Collapse the group chip instantly
|
|
8499
|
+
const chipEntry = this._tabGroupManager.chipRenderers.get(tabGroup.id);
|
|
8500
|
+
if (chipEntry) {
|
|
8501
|
+
chipEntry.chip.element.style.transition = 'none';
|
|
8502
|
+
toggleClass(chipEntry.chip.element, 'dv-tab-group-chip--dragging', true);
|
|
8503
|
+
}
|
|
8504
|
+
// Single reflow for the entire batch
|
|
8505
|
+
void this._tabsList.offsetHeight;
|
|
8506
|
+
const underline = this._tabGroupManager.groupUnderlines.get(tabGroup.id);
|
|
8507
|
+
if (underline) {
|
|
8508
|
+
underline.style.display = 'none';
|
|
8509
|
+
}
|
|
8510
|
+
(_a = (_b = this._animState).currentInsertionIndex) !== null && _a !== void 0 ? _a : (_b.currentInsertionIndex = firstIdx);
|
|
8511
|
+
this.applyDragOverTransforms(true);
|
|
8512
|
+
for (const t of this._tabs) {
|
|
8513
|
+
if (groupPanelIds.has(t.value.panel.id)) {
|
|
8514
|
+
t.value.element.style.removeProperty('transition');
|
|
7457
8515
|
}
|
|
7458
|
-
}
|
|
8516
|
+
}
|
|
8517
|
+
if (chipEntry) {
|
|
8518
|
+
chipEntry.chip.element.style.removeProperty('transition');
|
|
8519
|
+
}
|
|
8520
|
+
});
|
|
8521
|
+
}
|
|
8522
|
+
/**
|
|
8523
|
+
* A drop on a tab group chip means "insert before this group". Resolve to
|
|
8524
|
+
* the index of the group's first tab, adjusting for same-group removal
|
|
8525
|
+
* (when the source tab is currently to the left of the target slot, its
|
|
8526
|
+
* removal shifts the insertion index down by one). Always clears
|
|
8527
|
+
* `targetTabGroupId` so the dropped tab lands outside the group.
|
|
8528
|
+
*/
|
|
8529
|
+
_handleChipDrop(tabGroup, event) {
|
|
8530
|
+
const firstPanelId = tabGroup.panelIds[0];
|
|
8531
|
+
if (!firstPanelId) {
|
|
8532
|
+
return;
|
|
8533
|
+
}
|
|
8534
|
+
const insertionIndex = this._tabs.findIndex((x) => x.value.panel.id === firstPanelId);
|
|
8535
|
+
if (insertionIndex === -1) {
|
|
8536
|
+
return;
|
|
7459
8537
|
}
|
|
7460
|
-
|
|
7461
|
-
this.
|
|
8538
|
+
const data = getPanelData();
|
|
8539
|
+
const sourceIndex = data && data.groupId === this.group.id && data.panelId
|
|
8540
|
+
? this._tabs.findIndex((x) => x.value.panel.id === data.panelId)
|
|
8541
|
+
: -1;
|
|
8542
|
+
const adjustedIndex = insertionIndex -
|
|
8543
|
+
(sourceIndex !== -1 && sourceIndex < insertionIndex ? 1 : 0);
|
|
8544
|
+
this._onDrop.fire({
|
|
8545
|
+
event: event.nativeEvent,
|
|
8546
|
+
index: adjustedIndex,
|
|
8547
|
+
targetTabGroupId: null,
|
|
8548
|
+
});
|
|
7462
8549
|
}
|
|
7463
8550
|
/**
|
|
7464
8551
|
* Sets the broader container that is part of the same logical drop surface
|
|
@@ -7520,6 +8607,164 @@
|
|
|
7520
8607
|
}
|
|
7521
8608
|
return total / this._tabs.length;
|
|
7522
8609
|
}
|
|
8610
|
+
/**
|
|
8611
|
+
* Pointer-event entry point. The HTML5 path enters via the per-element
|
|
8612
|
+
* `dragover` listener; this one hit-tests the global pointer-drag
|
|
8613
|
+
* position against the tabs list and routes through the same shared
|
|
8614
|
+
* `_processDragOver` / `_processDragLeave` helpers.
|
|
8615
|
+
*/
|
|
8616
|
+
_handlePointerDragMove(clientX, clientY) {
|
|
8617
|
+
var _a;
|
|
8618
|
+
const sourceDoc = (_a = this._tabsList.ownerDocument) !== null && _a !== void 0 ? _a : document;
|
|
8619
|
+
const elAtPoint = sourceDoc.elementFromPoint(clientX, clientY);
|
|
8620
|
+
const inside = !!elAtPoint &&
|
|
8621
|
+
(this._tabsList.contains(elAtPoint) ||
|
|
8622
|
+
(!!this._extendedDropZone &&
|
|
8623
|
+
this._extendedDropZone.contains(elAtPoint)));
|
|
8624
|
+
if (!inside) {
|
|
8625
|
+
if (this._pointerInsideTabsList) {
|
|
8626
|
+
this._pointerInsideTabsList = false;
|
|
8627
|
+
this._processDragLeave(elAtPoint);
|
|
8628
|
+
}
|
|
8629
|
+
return;
|
|
8630
|
+
}
|
|
8631
|
+
this._pointerInsideTabsList = true;
|
|
8632
|
+
this._processDragOver(clientX);
|
|
8633
|
+
}
|
|
8634
|
+
/**
|
|
8635
|
+
* Shared body of the dragover entry point. Refreshes stale anim state
|
|
8636
|
+
* for a changed drag identity, initializes anim state for incoming
|
|
8637
|
+
* cross-group drags, and dispatches to the gap-following math in
|
|
8638
|
+
* `handleDragOver`. Returns true when this tabs list has taken
|
|
8639
|
+
* ownership of the drag — HTML5 callers use this to gate
|
|
8640
|
+
* `event.preventDefault()`.
|
|
8641
|
+
*/
|
|
8642
|
+
_processDragOver(clientX) {
|
|
8643
|
+
var _a, _b, _c, _d;
|
|
8644
|
+
if (this.accessor.options.disableDnd) {
|
|
8645
|
+
return false;
|
|
8646
|
+
}
|
|
8647
|
+
// Stale-state guard: if a previous drag's anim state is still here
|
|
8648
|
+
// but the current drag is a different identity, drop the stale one
|
|
8649
|
+
// so the new drag starts from a clean slate.
|
|
8650
|
+
if (this._animState) {
|
|
8651
|
+
const data = getPanelData();
|
|
8652
|
+
if ((data === null || data === void 0 ? void 0 : data.tabGroupId) &&
|
|
8653
|
+
data.groupId !== this.group.id &&
|
|
8654
|
+
this._animState.sourceTabGroupId !== data.tabGroupId) {
|
|
8655
|
+
this._animState = null;
|
|
8656
|
+
}
|
|
8657
|
+
}
|
|
8658
|
+
if (!this._animState) {
|
|
8659
|
+
const data = getPanelData();
|
|
8660
|
+
// In default animation mode, individual tab drops are handled
|
|
8661
|
+
// by per-tab Droptargets; only chip drags need tabs-list-level
|
|
8662
|
+
// handling so drops on void space still work.
|
|
8663
|
+
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'default' &&
|
|
8664
|
+
!(data === null || data === void 0 ? void 0 : data.tabGroupId)) {
|
|
8665
|
+
return false;
|
|
8666
|
+
}
|
|
8667
|
+
if (data &&
|
|
8668
|
+
(data.panelId || data.tabGroupId) &&
|
|
8669
|
+
data.groupId !== this.group.id) {
|
|
8670
|
+
const avgWidth = this.getAverageTabWidth();
|
|
8671
|
+
if (data.tabGroupId) {
|
|
8672
|
+
// External group drag — look up the source group to
|
|
8673
|
+
// size the gap.
|
|
8674
|
+
const sourceGroup = this.accessor.getPanel(data.groupId);
|
|
8675
|
+
const sourceTg = sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.getTabGroups().find((tg) => tg.id === data.tabGroupId);
|
|
8676
|
+
const panelCount = (_b = sourceTg === null || sourceTg === void 0 ? void 0 : sourceTg.panelIds.length) !== null && _b !== void 0 ? _b : 1;
|
|
8677
|
+
const groupGapWidth = avgWidth * panelCount + avgWidth;
|
|
8678
|
+
this._animState = {
|
|
8679
|
+
sourceTabId: '',
|
|
8680
|
+
sourceIndex: -1,
|
|
8681
|
+
tabPositions: this.snapshotTabPositions(),
|
|
8682
|
+
chipPositions: this._tabGroupManager.snapshotChipWidths(),
|
|
8683
|
+
currentInsertionIndex: null,
|
|
8684
|
+
targetTabGroupId: null,
|
|
8685
|
+
sourceTabGroupId: data.tabGroupId,
|
|
8686
|
+
sourceGroupPanelIds: sourceTg
|
|
8687
|
+
? new Set(sourceTg.panelIds)
|
|
8688
|
+
: new Set(),
|
|
8689
|
+
sourceChipWidth: avgWidth,
|
|
8690
|
+
cursorOffsetFromDragLeft: groupGapWidth / 2,
|
|
8691
|
+
sourceGapWidth: groupGapWidth,
|
|
8692
|
+
containerLeft: this._tabsList.getBoundingClientRect().left,
|
|
8693
|
+
};
|
|
8694
|
+
}
|
|
8695
|
+
else {
|
|
8696
|
+
this._animState = {
|
|
8697
|
+
sourceTabId: data.panelId,
|
|
8698
|
+
sourceIndex: -1,
|
|
8699
|
+
tabPositions: this.snapshotTabPositions(),
|
|
8700
|
+
chipPositions: this._tabGroupManager.snapshotChipWidths(),
|
|
8701
|
+
currentInsertionIndex: null,
|
|
8702
|
+
targetTabGroupId: null,
|
|
8703
|
+
sourceTabGroupId: null,
|
|
8704
|
+
sourceGroupPanelIds: null,
|
|
8705
|
+
sourceChipWidth: 0,
|
|
8706
|
+
cursorOffsetFromDragLeft: avgWidth / 2,
|
|
8707
|
+
sourceGapWidth: avgWidth,
|
|
8708
|
+
containerLeft: this._tabsList.getBoundingClientRect().left,
|
|
8709
|
+
};
|
|
8710
|
+
}
|
|
8711
|
+
}
|
|
8712
|
+
else {
|
|
8713
|
+
return false;
|
|
8714
|
+
}
|
|
8715
|
+
}
|
|
8716
|
+
// For intra-group drag (sourceIndex >= 0) the gap animation is the
|
|
8717
|
+
// sole visual indicator — clear any stale anchor overlay that may
|
|
8718
|
+
// have been set while the cursor was over the panel content area or
|
|
8719
|
+
// another zone. External drags (sourceIndex === -1) leave the
|
|
8720
|
+
// overlay to the individual tab Droptargets so cross-group
|
|
8721
|
+
// animation is not disrupted.
|
|
8722
|
+
if (this._animState.sourceIndex !== -1) {
|
|
8723
|
+
(_d = (_c = this.group.model.dropTargetContainer) === null || _c === void 0 ? void 0 : _c.model) === null || _d === void 0 ? void 0 : _d.clear();
|
|
8724
|
+
}
|
|
8725
|
+
this.handleDragOver({ clientX });
|
|
8726
|
+
return true;
|
|
8727
|
+
}
|
|
8728
|
+
/**
|
|
8729
|
+
* Shared body of the dragleave entry point. Preserves anim state when
|
|
8730
|
+
* the drag moves between tabs-list children, into the extended drop
|
|
8731
|
+
* zone, or into the void container; tears it down otherwise.
|
|
8732
|
+
*/
|
|
8733
|
+
_processDragLeave(related) {
|
|
8734
|
+
var _a, _b, _c;
|
|
8735
|
+
if (!this._animState) {
|
|
8736
|
+
return;
|
|
8737
|
+
}
|
|
8738
|
+
// Moves between children of the tabs list aren't real leaves.
|
|
8739
|
+
if (related && this._tabsList.contains(related)) {
|
|
8740
|
+
return;
|
|
8741
|
+
}
|
|
8742
|
+
// Moving into the broader drop zone (e.g. void container, left
|
|
8743
|
+
// actions) — keep anim state alive so external listeners can
|
|
8744
|
+
// continue the gap animation.
|
|
8745
|
+
if (related && ((_a = this._extendedDropZone) === null || _a === void 0 ? void 0 : _a.contains(related))) {
|
|
8746
|
+
this.resetTabTransforms();
|
|
8747
|
+
this._animState.currentInsertionIndex = null;
|
|
8748
|
+
return;
|
|
8749
|
+
}
|
|
8750
|
+
// Leaving toward the void container (empty header space to the
|
|
8751
|
+
// right): keep anim state so a drop can still land at the end.
|
|
8752
|
+
const isVoid = this._voidContainer &&
|
|
8753
|
+
related &&
|
|
8754
|
+
(related === this._voidContainer ||
|
|
8755
|
+
this._voidContainer.contains(related));
|
|
8756
|
+
if (isVoid) {
|
|
8757
|
+
return;
|
|
8758
|
+
}
|
|
8759
|
+
this.resetTabTransforms();
|
|
8760
|
+
if (this._animState.sourceIndex === -1) {
|
|
8761
|
+
(_c = (_b = this.group.model.dropTargetContainer) === null || _b === void 0 ? void 0 : _b.model) === null || _c === void 0 ? void 0 : _c.clear();
|
|
8762
|
+
this._animState = null;
|
|
8763
|
+
}
|
|
8764
|
+
else {
|
|
8765
|
+
this._animState.currentInsertionIndex = null;
|
|
8766
|
+
}
|
|
8767
|
+
}
|
|
7523
8768
|
handleDragOver(event) {
|
|
7524
8769
|
var _a, _b, _c, _d, _e;
|
|
7525
8770
|
if (!this._animState) {
|
|
@@ -7640,11 +8885,15 @@
|
|
|
7640
8885
|
if (!isInsideRange && !isJustBeforeGroup) {
|
|
7641
8886
|
continue;
|
|
7642
8887
|
}
|
|
7643
|
-
if (isGroupDrag) {
|
|
8888
|
+
if (isGroupDrag && isInsideRange) {
|
|
7644
8889
|
// A group cannot be dropped inside another group.
|
|
7645
8890
|
// Snap the insertion index to just before or just
|
|
7646
8891
|
// after this group based on cursor position relative
|
|
7647
|
-
// to the group's midpoint.
|
|
8892
|
+
// to the group's midpoint. Only applies when the
|
|
8893
|
+
// insertion would land *inside* the group — for
|
|
8894
|
+
// `isJustBeforeGroup`, the index is already outside
|
|
8895
|
+
// (immediately left of the group) and is a valid
|
|
8896
|
+
// drop position, so leave it untouched (issue #1264).
|
|
7648
8897
|
const groupMid = (firstIdx + lastIdx + 1) / 2;
|
|
7649
8898
|
if (insertionIndex < groupMid) {
|
|
7650
8899
|
insertionIndex = firstIdx;
|
|
@@ -7655,6 +8904,12 @@
|
|
|
7655
8904
|
// targetTabGroupId stays null
|
|
7656
8905
|
break;
|
|
7657
8906
|
}
|
|
8907
|
+
if (isGroupDrag && isJustBeforeGroup) {
|
|
8908
|
+
// Cursor is just before the group — accept this
|
|
8909
|
+
// index as-is. Groups can be dropped at the slot
|
|
8910
|
+
// immediately left of another group's first tab.
|
|
8911
|
+
break;
|
|
8912
|
+
}
|
|
7658
8913
|
if (isJustBeforeGroup) {
|
|
7659
8914
|
// Check whether only the source tab (or source group
|
|
7660
8915
|
// tabs) sits between insertionIndex and firstIdx.
|
|
@@ -7919,20 +9174,23 @@
|
|
|
7919
9174
|
* in the model, and run a FLIP animation.
|
|
7920
9175
|
*/
|
|
7921
9176
|
_commitGroupMove(sourceTabGroupId, insertionIndex) {
|
|
7922
|
-
var _a, _b
|
|
7923
|
-
// Read transfer data
|
|
7924
|
-
// _chipDragCleanup clears the global LocalSelectionTransfer
|
|
7925
|
-
// singleton which getPanelData() reads from.
|
|
9177
|
+
var _a, _b;
|
|
9178
|
+
// Read transfer data first.
|
|
7926
9179
|
const data = getPanelData();
|
|
7927
|
-
|
|
7928
|
-
|
|
9180
|
+
// Synchronously dispose the source chip's drag sources, which
|
|
9181
|
+
// clears the panelTransfer payload + iframe shield. Cross-group
|
|
9182
|
+
// moves dissolve the source chip on a microtask, which is too
|
|
9183
|
+
// late: a synchronous `getPanelData()` after this method (or any
|
|
9184
|
+
// sibling dragover handler firing in the same tick) would
|
|
9185
|
+
// otherwise see stale data still referencing the old tabGroupId.
|
|
9186
|
+
this._tabGroupManager.disposeChipDrag(sourceTabGroupId);
|
|
7929
9187
|
// Check if the tab group exists in this group (within-group reorder)
|
|
7930
9188
|
// or in another group (cross-group move).
|
|
7931
9189
|
const isLocal = this.group.model
|
|
7932
9190
|
.getTabGroups()
|
|
7933
9191
|
.some((tg) => tg.id === sourceTabGroupId);
|
|
7934
9192
|
if (isLocal) {
|
|
7935
|
-
if (((
|
|
9193
|
+
if (((_a = this.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabAnimation) === 'smooth') {
|
|
7936
9194
|
this._clearGroupDragClasses(sourceTabGroupId);
|
|
7937
9195
|
const firstPositions = this.snapshotTabPositions();
|
|
7938
9196
|
this.resetTabTransforms();
|
|
@@ -7960,7 +9218,7 @@
|
|
|
7960
9218
|
this.accessor.moveGroupOrPanel({
|
|
7961
9219
|
from: {
|
|
7962
9220
|
groupId: data.groupId,
|
|
7963
|
-
tabGroupId: (
|
|
9221
|
+
tabGroupId: (_b = data.tabGroupId) !== null && _b !== void 0 ? _b : sourceTabGroupId,
|
|
7964
9222
|
},
|
|
7965
9223
|
to: {
|
|
7966
9224
|
group: this.group,
|
|
@@ -7988,22 +9246,27 @@
|
|
|
7988
9246
|
this._tabGroupManager.skipNextCollapseAnimation = true;
|
|
7989
9247
|
}
|
|
7990
9248
|
resetDragAnimation() {
|
|
7991
|
-
var _a, _b;
|
|
7992
9249
|
this._pendingCollapse = false;
|
|
7993
|
-
|
|
7994
|
-
//
|
|
7995
|
-
|
|
7996
|
-
|
|
7997
|
-
|
|
7998
|
-
|
|
7999
|
-
|
|
8000
|
-
|
|
8001
|
-
|
|
8002
|
-
|
|
8003
|
-
|
|
8004
|
-
|
|
8005
|
-
|
|
8006
|
-
|
|
9250
|
+
// After a drop, `tab.onDrop` consumes _animState (sets it to null)
|
|
9251
|
+
// and immediately calls `runFlipAnimation`, which sets transforms
|
|
9252
|
+
// and queues an rAF to trigger the CSS transition. dragend fires
|
|
9253
|
+
// synchronously on the source element BEFORE that rAF runs — if
|
|
9254
|
+
// we cleared transforms here we'd clobber the in-flight FLIP, so
|
|
9255
|
+
// gate the cleanup on _animState still being set (i.e. drag was
|
|
9256
|
+
// cancelled rather than dropped).
|
|
9257
|
+
if (this._animState) {
|
|
9258
|
+
this.resetTabTransforms();
|
|
9259
|
+
if (this._animState.sourceTabGroupId) {
|
|
9260
|
+
this._clearGroupDragClasses(this._animState.sourceTabGroupId);
|
|
9261
|
+
}
|
|
9262
|
+
else {
|
|
9263
|
+
this._removeClassInstantlyBatch(this._tabs.map((t) => t.value.element), 'dv-tab--dragging');
|
|
9264
|
+
}
|
|
9265
|
+
this._animState = null;
|
|
9266
|
+
// Restore any hidden underlines from group drags.
|
|
9267
|
+
for (const [, el] of this._tabGroupManager.groupUnderlines) {
|
|
9268
|
+
el.style.removeProperty('display');
|
|
9269
|
+
}
|
|
8007
9270
|
}
|
|
8008
9271
|
}
|
|
8009
9272
|
runFlipAnimation(firstPositions, sourceTabId, isCrossGroup = false, animRange) {
|
|
@@ -8496,12 +9759,14 @@
|
|
|
8496
9759
|
disableFloatingGroups: undefined,
|
|
8497
9760
|
floatingGroupBounds: undefined,
|
|
8498
9761
|
popoutUrl: undefined,
|
|
9762
|
+
nonce: undefined,
|
|
8499
9763
|
defaultRenderer: undefined,
|
|
8500
9764
|
defaultHeaderPosition: undefined,
|
|
8501
9765
|
debug: undefined,
|
|
8502
9766
|
rootOverlayModel: undefined,
|
|
8503
9767
|
locked: undefined,
|
|
8504
9768
|
disableDnd: undefined,
|
|
9769
|
+
dndStrategy: undefined,
|
|
8505
9770
|
className: undefined,
|
|
8506
9771
|
noPanelsOverlay: undefined,
|
|
8507
9772
|
dndEdges: undefined,
|
|
@@ -8511,6 +9776,7 @@
|
|
|
8511
9776
|
getTabContextMenuItems: undefined,
|
|
8512
9777
|
getTabGroupChipContextMenuItems: undefined,
|
|
8513
9778
|
createTabGroupChipComponent: undefined,
|
|
9779
|
+
createGroupDragGhostComponent: undefined,
|
|
8514
9780
|
tabGroupColors: undefined,
|
|
8515
9781
|
tabGroupAccent: undefined,
|
|
8516
9782
|
};
|
|
@@ -8685,6 +9951,10 @@
|
|
|
8685
9951
|
}
|
|
8686
9952
|
|
|
8687
9953
|
class DockviewDidDropEvent extends DockviewEvent {
|
|
9954
|
+
/**
|
|
9955
|
+
* `PointerEvent` for touch drags has no `dataTransfer`; use
|
|
9956
|
+
* `getData()` for the dockview payload regardless of input method.
|
|
9957
|
+
*/
|
|
8688
9958
|
get nativeEvent() {
|
|
8689
9959
|
return this.options.nativeEvent;
|
|
8690
9960
|
}
|
|
@@ -8789,29 +10059,28 @@
|
|
|
8789
10059
|
toggleClass(this.container, 'dv-groupview-floating', false);
|
|
8790
10060
|
toggleClass(this.container, 'dv-groupview-popout', false);
|
|
8791
10061
|
toggleClass(this.container, 'dv-groupview-edge', false);
|
|
10062
|
+
// Mouse and touch drop targets must agree on accepted zones.
|
|
10063
|
+
const applyZones = (zones) => {
|
|
10064
|
+
this.contentContainer.dropTarget.setTargetZones(zones);
|
|
10065
|
+
this.contentContainer.pointerDropTarget.setTargetZones(zones);
|
|
10066
|
+
};
|
|
8792
10067
|
switch (value.type) {
|
|
8793
10068
|
case 'grid':
|
|
8794
|
-
|
|
8795
|
-
'top',
|
|
8796
|
-
'bottom',
|
|
8797
|
-
'left',
|
|
8798
|
-
'right',
|
|
8799
|
-
'center',
|
|
8800
|
-
]);
|
|
10069
|
+
applyZones(['top', 'bottom', 'left', 'right', 'center']);
|
|
8801
10070
|
break;
|
|
8802
10071
|
case 'floating':
|
|
8803
|
-
|
|
8804
|
-
|
|
10072
|
+
applyZones(['center']);
|
|
10073
|
+
applyZones(value
|
|
8805
10074
|
? ['center']
|
|
8806
10075
|
: ['top', 'bottom', 'left', 'right', 'center']);
|
|
8807
10076
|
toggleClass(this.container, 'dv-groupview-floating', true);
|
|
8808
10077
|
break;
|
|
8809
10078
|
case 'popout':
|
|
8810
|
-
|
|
10079
|
+
applyZones(['center']);
|
|
8811
10080
|
toggleClass(this.container, 'dv-groupview-popout', true);
|
|
8812
10081
|
break;
|
|
8813
10082
|
case 'edge':
|
|
8814
|
-
|
|
10083
|
+
applyZones(['center']);
|
|
8815
10084
|
toggleClass(this.container, 'dv-groupview-edge', true);
|
|
8816
10085
|
break;
|
|
8817
10086
|
}
|
|
@@ -8937,6 +10206,8 @@
|
|
|
8937
10206
|
// noop
|
|
8938
10207
|
}), this.contentContainer.dropTarget.onDrop((event) => {
|
|
8939
10208
|
this.handleDropEvent('content', event.nativeEvent, event.position);
|
|
10209
|
+
}), this.contentContainer.pointerDropTarget.onDrop((event) => {
|
|
10210
|
+
this.handleDropEvent('content', event.nativeEvent, event.position);
|
|
8940
10211
|
}), this.tabsContainer.onWillShowOverlay((event) => {
|
|
8941
10212
|
this._onWillShowOverlay.fire(event);
|
|
8942
10213
|
}), this.contentContainer.dropTarget.onWillShowOverlay((event) => {
|
|
@@ -8947,6 +10218,14 @@
|
|
|
8947
10218
|
group: this.groupPanel,
|
|
8948
10219
|
getData: getPanelData,
|
|
8949
10220
|
}));
|
|
10221
|
+
}), this.contentContainer.pointerDropTarget.onWillShowOverlay((event) => {
|
|
10222
|
+
this._onWillShowOverlay.fire(new DockviewWillShowOverlayLocationEvent(event, {
|
|
10223
|
+
kind: 'content',
|
|
10224
|
+
panel: this.activePanel,
|
|
10225
|
+
api: this._api,
|
|
10226
|
+
group: this.groupPanel,
|
|
10227
|
+
getData: getPanelData,
|
|
10228
|
+
}));
|
|
8950
10229
|
}), this._onMove, this._onDidChange, this._onDidDrop, this._onWillDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange, this._onUnhandledDragOverEvent, this._onDidPanelTitleChange, this._onDidPanelParametersChange, this._onDidCreateTabGroup, this._onDidDestroyTabGroup, this._onDidAddPanelToTabGroup, this._onDidRemovePanelFromTabGroup, this._onDidTabGroupChange, this._onDidTabGroupCollapsedChange, this._onDidCreateTabGroup.event(() => {
|
|
8951
10230
|
this._scheduleTabGroupUpdate();
|
|
8952
10231
|
}), this._onDidDestroyTabGroup.event(() => {
|
|
@@ -9203,6 +10482,15 @@
|
|
|
9203
10482
|
refreshTabGroupAccent() {
|
|
9204
10483
|
this.tabsContainer.refreshTabGroupAccent();
|
|
9205
10484
|
}
|
|
10485
|
+
refreshWatermark() {
|
|
10486
|
+
var _a, _b;
|
|
10487
|
+
if (this.watermark) {
|
|
10488
|
+
this.watermark.element.remove();
|
|
10489
|
+
(_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
10490
|
+
this.watermark = undefined;
|
|
10491
|
+
}
|
|
10492
|
+
this.updateContainer();
|
|
10493
|
+
}
|
|
9206
10494
|
getTabGroupForPanel(panelId) {
|
|
9207
10495
|
return this._findTabGroupForPanel(panelId);
|
|
9208
10496
|
}
|
|
@@ -10033,6 +11321,18 @@
|
|
|
10033
11321
|
}
|
|
10034
11322
|
return this._group.model.location;
|
|
10035
11323
|
}
|
|
11324
|
+
get locked() {
|
|
11325
|
+
if (!this._group) {
|
|
11326
|
+
throw new Error(NOT_INITIALIZED_MESSAGE);
|
|
11327
|
+
}
|
|
11328
|
+
return this._group.locked;
|
|
11329
|
+
}
|
|
11330
|
+
set locked(value) {
|
|
11331
|
+
if (!this._group) {
|
|
11332
|
+
throw new Error(NOT_INITIALIZED_MESSAGE);
|
|
11333
|
+
}
|
|
11334
|
+
this._group.locked = value;
|
|
11335
|
+
}
|
|
10036
11336
|
constructor(id, accessor) {
|
|
10037
11337
|
super(id, '__dockviewgroup__');
|
|
10038
11338
|
this.accessor = accessor;
|
|
@@ -10623,6 +11923,11 @@
|
|
|
10623
11923
|
const didTitleChange = title !== this.title;
|
|
10624
11924
|
if (didTitleChange) {
|
|
10625
11925
|
this._title = title;
|
|
11926
|
+
// keep the view-model's cached init params in sync so that tab
|
|
11927
|
+
// renderers constructed lazily (e.g. the header overflow
|
|
11928
|
+
// dropdown via createTabRenderer) see the updated title
|
|
11929
|
+
// (#914).
|
|
11930
|
+
this.view.setTitle(title);
|
|
10626
11931
|
this.api._onDidTitleChange.fire({ title });
|
|
10627
11932
|
}
|
|
10628
11933
|
}
|
|
@@ -10783,6 +12088,14 @@
|
|
|
10783
12088
|
this.content.init(params);
|
|
10784
12089
|
this.tab.init(Object.assign(Object.assign({}, params), { tabLocation: 'header' }));
|
|
10785
12090
|
}
|
|
12091
|
+
setTitle(title) {
|
|
12092
|
+
// keep the cached init params in sync so that tab renderers created
|
|
12093
|
+
// lazily after the title changes (e.g. for the header overflow
|
|
12094
|
+
// dropdown) see the current title rather than the stale original.
|
|
12095
|
+
if (this._params) {
|
|
12096
|
+
this._params.title = title;
|
|
12097
|
+
}
|
|
12098
|
+
}
|
|
10786
12099
|
layout(width, height) {
|
|
10787
12100
|
var _a, _b;
|
|
10788
12101
|
(_b = (_a = this.content).layout) === null || _b === void 0 ? void 0 : _b.call(_a, width, height);
|
|
@@ -10916,7 +12229,12 @@
|
|
|
10916
12229
|
this.onDidChange = this._onDidChange.event;
|
|
10917
12230
|
this._onDidChangeEnd = new Emitter();
|
|
10918
12231
|
this.onDidChangeEnd = this._onDidChangeEnd.event;
|
|
10919
|
-
this.
|
|
12232
|
+
this._onDidStartMoving = new Emitter();
|
|
12233
|
+
/** Fires once per drag, the first time the float actually moves. */
|
|
12234
|
+
this.onDidStartMoving = this._onDidStartMoving.event;
|
|
12235
|
+
this._dragMove = new MutableDisposable();
|
|
12236
|
+
this._dragCancelled = false;
|
|
12237
|
+
this.addDisposables(this._onDidChange, this._onDidChangeEnd, this._onDidStartMoving, this._dragMove);
|
|
10920
12238
|
this._element.className = 'dv-resize-container';
|
|
10921
12239
|
this._isVisible = true;
|
|
10922
12240
|
this.setupResize('top');
|
|
@@ -11025,16 +12343,60 @@
|
|
|
11025
12343
|
result.height = element.height;
|
|
11026
12344
|
return result;
|
|
11027
12345
|
}
|
|
12346
|
+
/**
|
|
12347
|
+
* Abort an in-flight move-the-float drag. Used by the void container
|
|
12348
|
+
* when a redock long-press fires after the move started, so the ghost
|
|
12349
|
+
* gesture wins without the float continuing to follow the finger.
|
|
12350
|
+
* Does not emit `onDidChangeEnd` because no change is being committed.
|
|
12351
|
+
*/
|
|
12352
|
+
cancelPendingDrag() {
|
|
12353
|
+
if (!this._dragMove.value) {
|
|
12354
|
+
return;
|
|
12355
|
+
}
|
|
12356
|
+
this._dragCancelled = true;
|
|
12357
|
+
toggleClass(this._element, 'dv-resize-container-dragging', false);
|
|
12358
|
+
this._dragMove.value = exports.DockviewDisposable.NONE;
|
|
12359
|
+
}
|
|
11028
12360
|
setupDrag(dragTarget, options = { inDragMode: false }) {
|
|
11029
|
-
const
|
|
11030
|
-
const track = () => {
|
|
12361
|
+
const track = (captureTarget, pointerId) => {
|
|
11031
12362
|
let offset = null;
|
|
12363
|
+
let hasMoved = false;
|
|
12364
|
+
this._dragCancelled = false;
|
|
11032
12365
|
const iframes = disableIframePointEvents();
|
|
11033
|
-
|
|
12366
|
+
if (captureTarget &&
|
|
12367
|
+
typeof pointerId === 'number' &&
|
|
12368
|
+
typeof captureTarget.setPointerCapture === 'function') {
|
|
12369
|
+
try {
|
|
12370
|
+
captureTarget.setPointerCapture(pointerId);
|
|
12371
|
+
}
|
|
12372
|
+
catch (_a) {
|
|
12373
|
+
// ignore – non-fatal if the browser refuses capture
|
|
12374
|
+
}
|
|
12375
|
+
}
|
|
12376
|
+
const end = () => {
|
|
12377
|
+
toggleClass(this._element, 'dv-resize-container-dragging', false);
|
|
12378
|
+
this._dragMove.value = exports.DockviewDisposable.NONE;
|
|
12379
|
+
this._onDidChangeEnd.fire();
|
|
12380
|
+
};
|
|
12381
|
+
this._dragMove.value = new CompositeDisposable({
|
|
11034
12382
|
dispose: () => {
|
|
11035
12383
|
iframes.release();
|
|
12384
|
+
if (captureTarget &&
|
|
12385
|
+
typeof pointerId === 'number' &&
|
|
12386
|
+
typeof captureTarget.releasePointerCapture ===
|
|
12387
|
+
'function') {
|
|
12388
|
+
try {
|
|
12389
|
+
captureTarget.releasePointerCapture(pointerId);
|
|
12390
|
+
}
|
|
12391
|
+
catch (_a) {
|
|
12392
|
+
// ignore – pointer may already be released
|
|
12393
|
+
}
|
|
12394
|
+
}
|
|
11036
12395
|
},
|
|
11037
12396
|
}, addDisposableListener(window, 'pointermove', (e) => {
|
|
12397
|
+
if (this._dragCancelled) {
|
|
12398
|
+
return;
|
|
12399
|
+
}
|
|
11038
12400
|
const containerRect = this.options.container.getBoundingClientRect();
|
|
11039
12401
|
const x = e.clientX - containerRect.left;
|
|
11040
12402
|
const y = e.clientY - containerRect.top;
|
|
@@ -11071,13 +12433,13 @@
|
|
|
11071
12433
|
bounds.right = right;
|
|
11072
12434
|
}
|
|
11073
12435
|
this.setBounds(bounds);
|
|
11074
|
-
|
|
11075
|
-
|
|
11076
|
-
|
|
11077
|
-
|
|
11078
|
-
}));
|
|
12436
|
+
if (!hasMoved) {
|
|
12437
|
+
hasMoved = true;
|
|
12438
|
+
this._onDidStartMoving.fire();
|
|
12439
|
+
}
|
|
12440
|
+
}), addDisposableListener(window, 'pointerup', end), addDisposableListener(window, 'pointercancel', end));
|
|
11079
12441
|
};
|
|
11080
|
-
this.addDisposables(
|
|
12442
|
+
this.addDisposables(addDisposableListener(dragTarget, 'pointerdown', (event) => {
|
|
11081
12443
|
if (event.defaultPrevented) {
|
|
11082
12444
|
event.preventDefault();
|
|
11083
12445
|
return;
|
|
@@ -11087,7 +12449,7 @@
|
|
|
11087
12449
|
if (quasiDefaultPrevented(event)) {
|
|
11088
12450
|
return;
|
|
11089
12451
|
}
|
|
11090
|
-
track();
|
|
12452
|
+
track(dragTarget, event.pointerId);
|
|
11091
12453
|
}), addDisposableListener(this.options.content, 'pointerdown', (event) => {
|
|
11092
12454
|
if (event.defaultPrevented) {
|
|
11093
12455
|
return;
|
|
@@ -11098,7 +12460,7 @@
|
|
|
11098
12460
|
return;
|
|
11099
12461
|
}
|
|
11100
12462
|
if (event.shiftKey) {
|
|
11101
|
-
track();
|
|
12463
|
+
track(this.options.content, event.pointerId);
|
|
11102
12464
|
}
|
|
11103
12465
|
}), addDisposableListener(this.options.content, 'pointerdown', () => {
|
|
11104
12466
|
arialLevelTracker.push(this._element);
|
|
@@ -11116,6 +12478,19 @@
|
|
|
11116
12478
|
e.preventDefault();
|
|
11117
12479
|
let startPosition = null;
|
|
11118
12480
|
const iframes = disableIframePointEvents();
|
|
12481
|
+
const pointerId = e.pointerId;
|
|
12482
|
+
if (typeof resizeHandleElement.setPointerCapture === 'function') {
|
|
12483
|
+
try {
|
|
12484
|
+
resizeHandleElement.setPointerCapture(pointerId);
|
|
12485
|
+
}
|
|
12486
|
+
catch (_a) {
|
|
12487
|
+
// ignore – non-fatal if the browser refuses capture
|
|
12488
|
+
}
|
|
12489
|
+
}
|
|
12490
|
+
const end = () => {
|
|
12491
|
+
move.dispose();
|
|
12492
|
+
this._onDidChangeEnd.fire();
|
|
12493
|
+
};
|
|
11119
12494
|
move.value = new CompositeDisposable(addDisposableListener(window, 'pointermove', (e) => {
|
|
11120
12495
|
const containerRect = this.options.container.getBoundingClientRect();
|
|
11121
12496
|
const overlayRect = this._element.getBoundingClientRect();
|
|
@@ -11250,11 +12625,17 @@
|
|
|
11250
12625
|
}), {
|
|
11251
12626
|
dispose: () => {
|
|
11252
12627
|
iframes.release();
|
|
12628
|
+
if (typeof resizeHandleElement.releasePointerCapture ===
|
|
12629
|
+
'function') {
|
|
12630
|
+
try {
|
|
12631
|
+
resizeHandleElement.releasePointerCapture(pointerId);
|
|
12632
|
+
}
|
|
12633
|
+
catch (_a) {
|
|
12634
|
+
// ignore – pointer may already be released
|
|
12635
|
+
}
|
|
12636
|
+
}
|
|
11253
12637
|
},
|
|
11254
|
-
}, addDisposableListener(window, 'pointerup',
|
|
11255
|
-
move.dispose();
|
|
11256
|
-
this._onDidChangeEnd.fire();
|
|
11257
|
-
}));
|
|
12638
|
+
}, addDisposableListener(window, 'pointerup', end), addDisposableListener(window, 'pointercancel', end));
|
|
11258
12639
|
}));
|
|
11259
12640
|
}
|
|
11260
12641
|
getMinimumWidth(width) {
|
|
@@ -11702,7 +13083,9 @@
|
|
|
11702
13083
|
const externalDocument = externalWindow.document;
|
|
11703
13084
|
externalDocument.title = document.title;
|
|
11704
13085
|
externalDocument.body.appendChild(container);
|
|
11705
|
-
addStyles(externalDocument, window.document.styleSheets
|
|
13086
|
+
addStyles(externalDocument, window.document.styleSheets, {
|
|
13087
|
+
nonce: this.options.nonce,
|
|
13088
|
+
});
|
|
11706
13089
|
/**
|
|
11707
13090
|
* beforeunload must be registered after load for reasons I could not determine
|
|
11708
13091
|
* otherwise the beforeunload event will not fire when the window is closed
|
|
@@ -11777,6 +13160,14 @@
|
|
|
11777
13160
|
}
|
|
11778
13161
|
}
|
|
11779
13162
|
|
|
13163
|
+
function isCoarsePrimaryInput$1(win) {
|
|
13164
|
+
if (!win.matchMedia) {
|
|
13165
|
+
return false;
|
|
13166
|
+
}
|
|
13167
|
+
const coarse = win.matchMedia('(pointer: coarse)').matches;
|
|
13168
|
+
const fine = win.matchMedia('(pointer: fine)').matches;
|
|
13169
|
+
return coarse && !fine;
|
|
13170
|
+
}
|
|
11780
13171
|
class PopupService extends CompositeDisposable {
|
|
11781
13172
|
constructor(root, win = window) {
|
|
11782
13173
|
super();
|
|
@@ -11815,8 +13206,22 @@
|
|
|
11815
13206
|
wrapper.style.left = `${position.x - offsetX}px`;
|
|
11816
13207
|
this._element.appendChild(wrapper);
|
|
11817
13208
|
this._active = wrapper;
|
|
13209
|
+
// Outside-pointerdown dismissal is suppressed for a short grace
|
|
13210
|
+
// window after opening. Touch long-press callers (chip / tab context
|
|
13211
|
+
// menus) open the popover while the user's finger is still pressing
|
|
13212
|
+
// the source element — Android Chrome can dispatch a follow-up
|
|
13213
|
+
// synthetic pointerdown tied to the gesture, and the release-then-
|
|
13214
|
+
// retap motion can land just outside the wrapper. Either would
|
|
13215
|
+
// dismiss the popover before the user can see or interact with it.
|
|
13216
|
+
// The grace window is short enough that intentional outside taps
|
|
13217
|
+
// still feel responsive.
|
|
13218
|
+
const openedAt = Date.now();
|
|
13219
|
+
const POINTERDOWN_GRACE_MS = 200;
|
|
11818
13220
|
this._activeDisposable.value = new CompositeDisposable(addDisposableListener(this._window, 'pointerdown', (event) => {
|
|
11819
13221
|
var _a;
|
|
13222
|
+
if (Date.now() - openedAt < POINTERDOWN_GRACE_MS) {
|
|
13223
|
+
return;
|
|
13224
|
+
}
|
|
11820
13225
|
const target = event.target;
|
|
11821
13226
|
if (!(target instanceof HTMLElement)) {
|
|
11822
13227
|
return;
|
|
@@ -11834,6 +13239,18 @@
|
|
|
11834
13239
|
this.close();
|
|
11835
13240
|
}
|
|
11836
13241
|
}), addDisposableListener(this._window, 'resize', () => {
|
|
13242
|
+
// On touch-primary devices, common interactions resize the
|
|
13243
|
+
// window: on-screen keyboard pop, orientation change, browser
|
|
13244
|
+
// address-bar collapse. None of these mean "the user wants
|
|
13245
|
+
// the popover dismissed". Specifically, focusing the chip
|
|
13246
|
+
// context menu's rename input pops the keyboard, which would
|
|
13247
|
+
// otherwise close the menu the moment the user goes to edit
|
|
13248
|
+
// it. Desktop / hybrid input keeps the existing behaviour —
|
|
13249
|
+
// there a resize genuinely means the user has resized the
|
|
13250
|
+
// window and the popover position is now stale.
|
|
13251
|
+
if (isCoarsePrimaryInput$1(this._window)) {
|
|
13252
|
+
return;
|
|
13253
|
+
}
|
|
11837
13254
|
this.close();
|
|
11838
13255
|
}));
|
|
11839
13256
|
this._window.requestAnimationFrame(() => {
|
|
@@ -11890,6 +13307,14 @@
|
|
|
11890
13307
|
el.setAttribute('role', 'separator');
|
|
11891
13308
|
return el;
|
|
11892
13309
|
}
|
|
13310
|
+
function isCoarsePrimaryInput() {
|
|
13311
|
+
if (typeof window === 'undefined' || !window.matchMedia) {
|
|
13312
|
+
return false;
|
|
13313
|
+
}
|
|
13314
|
+
const coarse = window.matchMedia('(pointer: coarse)').matches;
|
|
13315
|
+
const fine = window.matchMedia('(pointer: fine)').matches;
|
|
13316
|
+
return coarse && !fine;
|
|
13317
|
+
}
|
|
11893
13318
|
function buildRenameInput(tabGroup) {
|
|
11894
13319
|
const wrapper = document.createElement('div');
|
|
11895
13320
|
wrapper.className = 'dv-context-menu-rename';
|
|
@@ -11910,10 +13335,17 @@
|
|
|
11910
13335
|
e.stopPropagation();
|
|
11911
13336
|
});
|
|
11912
13337
|
wrapper.appendChild(input);
|
|
11913
|
-
|
|
11914
|
-
|
|
11915
|
-
|
|
11916
|
-
|
|
13338
|
+
// Skip auto-focus on touch-primary devices: focusing the input pops the
|
|
13339
|
+
// on-screen keyboard, which fires `window resize`, which `PopupService`
|
|
13340
|
+
// listens to and uses to dismiss the popover — so the menu opens, the
|
|
13341
|
+
// keyboard appears, and the menu immediately closes before the user can
|
|
13342
|
+
// type. The user can still tap the input to focus it intentionally.
|
|
13343
|
+
if (!isCoarsePrimaryInput()) {
|
|
13344
|
+
requestAnimationFrame(() => {
|
|
13345
|
+
input.focus();
|
|
13346
|
+
input.select();
|
|
13347
|
+
});
|
|
13348
|
+
}
|
|
11917
13349
|
return wrapper;
|
|
11918
13350
|
}
|
|
11919
13351
|
function buildColorPicker(tabGroup, palette) {
|
|
@@ -12828,7 +14260,7 @@
|
|
|
12828
14260
|
return this._popoutRestorationPromise;
|
|
12829
14261
|
}
|
|
12830
14262
|
constructor(container, options) {
|
|
12831
|
-
var _a, _b, _c, _d, _e, _f;
|
|
14263
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
12832
14264
|
super(container, {
|
|
12833
14265
|
proportionalLayout: true,
|
|
12834
14266
|
orientation: exports.Orientation.HORIZONTAL,
|
|
@@ -12892,6 +14324,7 @@
|
|
|
12892
14324
|
this._floatingGroups = [];
|
|
12893
14325
|
this._popoutGroups = [];
|
|
12894
14326
|
this._popoutRestorationPromise = Promise.resolve();
|
|
14327
|
+
this._popoutRestorationCleanups = new Set();
|
|
12895
14328
|
this._onDidRemoveGroup = new Emitter();
|
|
12896
14329
|
this.onDidRemoveGroup = this._onDidRemoveGroup.event;
|
|
12897
14330
|
this._onDidAddGroup = new Emitter();
|
|
@@ -12926,37 +14359,51 @@
|
|
|
12926
14359
|
this._floatingOverlayHost = document.createElement('div');
|
|
12927
14360
|
this._floatingOverlayHost.className = 'dv-floating-overlay-host';
|
|
12928
14361
|
this._shellManager.element.appendChild(this._floatingOverlayHost);
|
|
12929
|
-
|
|
12930
|
-
|
|
12931
|
-
|
|
12932
|
-
|
|
12933
|
-
if (data) {
|
|
12934
|
-
if (data.viewId !== this.id) {
|
|
12935
|
-
return false;
|
|
12936
|
-
}
|
|
12937
|
-
if (position === 'center') {
|
|
12938
|
-
// center drop target is only allowed if there are no panels in the grid
|
|
12939
|
-
// floating panels are allowed
|
|
12940
|
-
return this.gridview.length === 0;
|
|
12941
|
-
}
|
|
12942
|
-
return true;
|
|
12943
|
-
}
|
|
12944
|
-
if (position === 'center' && this.gridview.length !== 0) {
|
|
12945
|
-
/**
|
|
12946
|
-
* for external events only show the four-corner drag overlays, disable
|
|
12947
|
-
* the center position so that external drag events can fall through to the group
|
|
12948
|
-
* and panel drop target handlers
|
|
12949
|
-
*/
|
|
14362
|
+
const rootCanDisplayOverlay = (event, position) => {
|
|
14363
|
+
const data = getPanelData();
|
|
14364
|
+
if (data) {
|
|
14365
|
+
if (data.viewId !== this.id) {
|
|
12950
14366
|
return false;
|
|
12951
14367
|
}
|
|
12952
|
-
|
|
12953
|
-
|
|
12954
|
-
|
|
12955
|
-
|
|
14368
|
+
if (position === 'center') {
|
|
14369
|
+
// center drop target is only allowed if there are no panels in the grid
|
|
14370
|
+
// floating panels are allowed
|
|
14371
|
+
return this.gridview.length === 0;
|
|
14372
|
+
}
|
|
14373
|
+
return true;
|
|
14374
|
+
}
|
|
14375
|
+
if (position === 'center' && this.gridview.length !== 0) {
|
|
14376
|
+
/**
|
|
14377
|
+
* for external events only show the four-corner drag overlays, disable
|
|
14378
|
+
* the center position so that external drag events can fall through to the group
|
|
14379
|
+
* and panel drop target handlers
|
|
14380
|
+
*/
|
|
14381
|
+
return false;
|
|
14382
|
+
}
|
|
14383
|
+
const firedEvent = new DockviewUnhandledDragOverEvent(event, 'edge', position, getPanelData);
|
|
14384
|
+
this._onUnhandledDragOverEvent.fire(firedEvent);
|
|
14385
|
+
return firedEvent.isAccepted;
|
|
14386
|
+
};
|
|
14387
|
+
this._rootDropTarget = html5Backend.createDropTarget(this.element, {
|
|
14388
|
+
className: 'dv-drop-target-edge',
|
|
14389
|
+
canDisplayOverlay: rootCanDisplayOverlay,
|
|
12956
14390
|
acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
|
|
12957
14391
|
overlayModel: (_f = options.rootOverlayModel) !== null && _f !== void 0 ? _f : DEFAULT_ROOT_OVERLAY_MODEL,
|
|
12958
14392
|
getOverrideTarget: () => { var _a; return (_a = this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
|
|
12959
14393
|
});
|
|
14394
|
+
this._rootPointerDropTarget = pointerBackend.createDropTarget(this.element, {
|
|
14395
|
+
className: 'dv-drop-target-edge',
|
|
14396
|
+
canDisplayOverlay: rootCanDisplayOverlay,
|
|
14397
|
+
acceptedTargetZones: [
|
|
14398
|
+
'top',
|
|
14399
|
+
'bottom',
|
|
14400
|
+
'left',
|
|
14401
|
+
'right',
|
|
14402
|
+
'center',
|
|
14403
|
+
],
|
|
14404
|
+
overlayModel: (_g = options.rootOverlayModel) !== null && _g !== void 0 ? _g : DEFAULT_ROOT_OVERLAY_MODEL,
|
|
14405
|
+
getOverrideTarget: () => { var _a; return (_a = this.rootDropTargetContainer) === null || _a === void 0 ? void 0 : _a.model; },
|
|
14406
|
+
});
|
|
12960
14407
|
this.updateDropTargetModel(options);
|
|
12961
14408
|
toggleClass(this.gridview.element, 'dv-dockview', true);
|
|
12962
14409
|
toggleClass(this.element, 'dv-debug', !!options.debug);
|
|
@@ -12997,6 +14444,14 @@
|
|
|
12997
14444
|
this._bufferOnDidLayoutChange.fire();
|
|
12998
14445
|
}), exports.DockviewDisposable.from(() => {
|
|
12999
14446
|
var _a;
|
|
14447
|
+
// Cancel any pending popout-restoration timers scheduled by
|
|
14448
|
+
// fromJSON so they don't open new browser windows after
|
|
14449
|
+
// dispose, and resolve their promises so callers awaiting
|
|
14450
|
+
// popoutRestorationPromise don't hang. See issue #851.
|
|
14451
|
+
for (const cleanup of [...this._popoutRestorationCleanups]) {
|
|
14452
|
+
cleanup();
|
|
14453
|
+
}
|
|
14454
|
+
this._popoutRestorationCleanups.clear();
|
|
13000
14455
|
// iterate over a copy of the array since .dispose() mutates the original array
|
|
13001
14456
|
for (const group of [...this._floatingGroups]) {
|
|
13002
14457
|
group.dispose();
|
|
@@ -13010,7 +14465,7 @@
|
|
|
13010
14465
|
d.dispose();
|
|
13011
14466
|
}
|
|
13012
14467
|
this._edgeGroupDisposables.clear();
|
|
13013
|
-
}), this._rootDropTarget, this._rootDropTarget.onWillShowOverlay((event) => {
|
|
14468
|
+
}), this._rootDropTarget, this._rootPointerDropTarget, exports.DockviewEvent.any(this._rootDropTarget.onWillShowOverlay, this._rootPointerDropTarget.onWillShowOverlay)((event) => {
|
|
13014
14469
|
if (this.gridview.length > 0 && event.position === 'center') {
|
|
13015
14470
|
// option only available when no panels in primary grid
|
|
13016
14471
|
return;
|
|
@@ -13022,7 +14477,7 @@
|
|
|
13022
14477
|
group: undefined,
|
|
13023
14478
|
getData: getPanelData,
|
|
13024
14479
|
}));
|
|
13025
|
-
}), this._rootDropTarget.onDrop((event) => {
|
|
14480
|
+
}), exports.DockviewEvent.any(this._rootDropTarget.onDrop, this._rootPointerDropTarget.onDrop)((event) => {
|
|
13026
14481
|
var _a;
|
|
13027
14482
|
const willDropEvent = new DockviewWillDropEvent({
|
|
13028
14483
|
nativeEvent: event.nativeEvent,
|
|
@@ -13060,7 +14515,7 @@
|
|
|
13060
14515
|
getData: getPanelData,
|
|
13061
14516
|
}));
|
|
13062
14517
|
}
|
|
13063
|
-
})
|
|
14518
|
+
}));
|
|
13064
14519
|
}
|
|
13065
14520
|
setVisible(panel, visible) {
|
|
13066
14521
|
switch (panel.api.location.type) {
|
|
@@ -13093,7 +14548,7 @@
|
|
|
13093
14548
|
return (_a = this._popoutPopupServices.get(group.id)) !== null && _a !== void 0 ? _a : this.popupService;
|
|
13094
14549
|
}
|
|
13095
14550
|
addPopoutGroup(itemToPopout, options) {
|
|
13096
|
-
var _a, _b, _c, _d, _e;
|
|
14551
|
+
var _a, _b, _c, _d, _e, _f;
|
|
13097
14552
|
if (itemToPopout instanceof DockviewGroupPanel &&
|
|
13098
14553
|
itemToPopout.model.location.type === 'edge') {
|
|
13099
14554
|
// edge groups are permanent structural elements and cannot be popped out
|
|
@@ -13128,6 +14583,7 @@
|
|
|
13128
14583
|
height: box.height,
|
|
13129
14584
|
onDidOpen: options === null || options === void 0 ? void 0 : options.onDidOpen,
|
|
13130
14585
|
onWillClose: options === null || options === void 0 ? void 0 : options.onWillClose,
|
|
14586
|
+
nonce: (_f = this.options) === null || _f === void 0 ? void 0 : _f.nonce,
|
|
13131
14587
|
});
|
|
13132
14588
|
const popoutWindowDisposable = new CompositeDisposable(_window, _window.onDidClose(() => {
|
|
13133
14589
|
popoutWindowDisposable.dispose();
|
|
@@ -13545,7 +15001,7 @@
|
|
|
13545
15001
|
}
|
|
13546
15002
|
}
|
|
13547
15003
|
updateOptions(options) {
|
|
13548
|
-
var _a, _b, _c;
|
|
15004
|
+
var _a, _b, _c, _d, _e;
|
|
13549
15005
|
super.updateOptions(options);
|
|
13550
15006
|
if ('floatingGroupBounds' in options) {
|
|
13551
15007
|
for (const group of this._floatingGroups) {
|
|
@@ -13571,9 +15027,12 @@
|
|
|
13571
15027
|
}
|
|
13572
15028
|
this.updateDropTargetModel(options);
|
|
13573
15029
|
const oldDisableDnd = this.options.disableDnd;
|
|
15030
|
+
const oldDndStrategy = this.options.dndStrategy;
|
|
13574
15031
|
this._options = Object.assign(Object.assign({}, this.options), options);
|
|
13575
15032
|
const newDisableDnd = this.options.disableDnd;
|
|
13576
|
-
|
|
15033
|
+
const newDndStrategy = this.options.dndStrategy;
|
|
15034
|
+
if (oldDisableDnd !== newDisableDnd ||
|
|
15035
|
+
oldDndStrategy !== newDndStrategy) {
|
|
13577
15036
|
this.updateDragAndDropState();
|
|
13578
15037
|
}
|
|
13579
15038
|
if ('theme' in options) {
|
|
@@ -13586,8 +15045,19 @@
|
|
|
13586
15045
|
group.model.updateHeaderActions();
|
|
13587
15046
|
}
|
|
13588
15047
|
}
|
|
15048
|
+
if ('createWatermarkComponent' in options) {
|
|
15049
|
+
if (this._watermark) {
|
|
15050
|
+
this._watermark.element.parentElement.remove();
|
|
15051
|
+
(_d = (_c = this._watermark).dispose) === null || _d === void 0 ? void 0 : _d.call(_c);
|
|
15052
|
+
this._watermark = null;
|
|
15053
|
+
}
|
|
15054
|
+
this.updateWatermark();
|
|
15055
|
+
for (const group of this.groups) {
|
|
15056
|
+
group.model.refreshWatermark();
|
|
15057
|
+
}
|
|
15058
|
+
}
|
|
13589
15059
|
if ('tabGroupColors' in options || 'tabGroupAccent' in options) {
|
|
13590
|
-
this._tabGroupColorPalette.setEntries((
|
|
15060
|
+
this._tabGroupColorPalette.setEntries((_e = this._options.tabGroupColors) !== null && _e !== void 0 ? _e : DEFAULT_TAB_GROUP_COLORS);
|
|
13591
15061
|
this._tabGroupColorPalette.enabled =
|
|
13592
15062
|
this._options.tabGroupAccent !== 'off';
|
|
13593
15063
|
for (const group of this.groups) {
|
|
@@ -14013,7 +15483,23 @@
|
|
|
14013
15483
|
const group = createGroupFromSerializedState(data);
|
|
14014
15484
|
// Add a small delay for each popup after the first to avoid browser popup blocking
|
|
14015
15485
|
const popoutPromise = new Promise((resolve) => {
|
|
14016
|
-
|
|
15486
|
+
const cleanup = () => {
|
|
15487
|
+
this._popoutRestorationCleanups.delete(cleanup);
|
|
15488
|
+
clearTimeout(handle);
|
|
15489
|
+
resolve();
|
|
15490
|
+
};
|
|
15491
|
+
const handle = setTimeout(() => {
|
|
15492
|
+
this._popoutRestorationCleanups.delete(cleanup);
|
|
15493
|
+
// Guard against the component being disposed before
|
|
15494
|
+
// this timer fires. Under React StrictMode the
|
|
15495
|
+
// component is mounted -> disposed -> remounted, and
|
|
15496
|
+
// without this guard the first instance's queued
|
|
15497
|
+
// restoration would open a second popout window.
|
|
15498
|
+
// See issue #851.
|
|
15499
|
+
if (this.isDisposed) {
|
|
15500
|
+
resolve();
|
|
15501
|
+
return;
|
|
15502
|
+
}
|
|
14017
15503
|
this.addPopoutGroup(group, {
|
|
14018
15504
|
position: position !== null && position !== void 0 ? position : undefined,
|
|
14019
15505
|
overridePopoutGroup: gridReferenceGroup
|
|
@@ -14026,6 +15512,7 @@
|
|
|
14026
15512
|
});
|
|
14027
15513
|
resolve();
|
|
14028
15514
|
}, index * DESERIALIZATION_POPOUT_DELAY_MS); // 100ms delay between each popup
|
|
15515
|
+
this._popoutRestorationCleanups.add(cleanup);
|
|
14029
15516
|
});
|
|
14030
15517
|
popoutPromises.push(popoutPromise);
|
|
14031
15518
|
});
|
|
@@ -14556,8 +16043,11 @@
|
|
|
14556
16043
|
* the source group is a popout group with a single panel
|
|
14557
16044
|
*
|
|
14558
16045
|
* 1. remove the panel from the group without triggering any events
|
|
14559
|
-
* 2. remove the popout group
|
|
14560
|
-
*
|
|
16046
|
+
* 2. remove the popout group — this may cascade-remove the empty
|
|
16047
|
+
* reference group it left behind in the main grid (see
|
|
16048
|
+
* doRemoveGroup for popout groups), which can shift grid indices
|
|
16049
|
+
* 3. recompute the target location now that the grid is stable
|
|
16050
|
+
* 4. create a new group at the recomputed location and add that panel
|
|
14561
16051
|
*/
|
|
14562
16052
|
const popoutGroup = this._popoutGroups.find((group) => group.popoutGroup === sourceGroup);
|
|
14563
16053
|
const removedPanel = this.movingLock(() => popoutGroup.popoutGroup.model.removePanel(popoutGroup.popoutGroup.panels[0], {
|
|
@@ -14565,7 +16055,8 @@
|
|
|
14565
16055
|
skipSetActiveGroup: true,
|
|
14566
16056
|
}));
|
|
14567
16057
|
this.doRemoveGroup(sourceGroup, { skipActive: true });
|
|
14568
|
-
const
|
|
16058
|
+
const updatedTargetLocation = getRelativeLocation(this.gridview.orientation, getGridLocation(destinationGroup.element), destinationTarget);
|
|
16059
|
+
const newGroup = this.createGroupAtLocation(updatedTargetLocation);
|
|
14569
16060
|
this.movingLock(() => newGroup.model.openPanel(removedPanel, {
|
|
14570
16061
|
skipSetActive: true,
|
|
14571
16062
|
}));
|
|
@@ -15105,15 +16596,18 @@
|
|
|
15105
16596
|
}
|
|
15106
16597
|
updateDropTargetModel(options) {
|
|
15107
16598
|
if ('dndEdges' in options) {
|
|
15108
|
-
|
|
15109
|
-
|
|
15110
|
-
|
|
16599
|
+
const disabled = typeof options.dndEdges === 'boolean' &&
|
|
16600
|
+
options.dndEdges === false;
|
|
16601
|
+
this._rootDropTarget.disabled = disabled;
|
|
16602
|
+
this._rootPointerDropTarget.disabled = disabled;
|
|
15111
16603
|
if (typeof options.dndEdges === 'object' &&
|
|
15112
16604
|
options.dndEdges !== null) {
|
|
15113
16605
|
this._rootDropTarget.setOverlayModel(options.dndEdges);
|
|
16606
|
+
this._rootPointerDropTarget.setOverlayModel(options.dndEdges);
|
|
15114
16607
|
}
|
|
15115
16608
|
else {
|
|
15116
16609
|
this._rootDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
|
|
16610
|
+
this._rootPointerDropTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
|
|
15117
16611
|
}
|
|
15118
16612
|
}
|
|
15119
16613
|
if ('rootOverlayModel' in options) {
|