dockview
Version:
Zero dependency layout manager supporting tabs, grids and splitviews with ReactJS support
537 lines (532 loc) • 17.9 kB
CSS
.dockview-theme-dark {
--dv-paneview-active-outline-color: dodgerblue;
--dv-tabs-and-actions-container-font-size: 13px;
--dv-tabs-and-actions-container-height: 35px;
--dv-tab-close-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>');
--dv-tab-dirty-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></svg>');
--dv-drag-over-background-color: rgba(83, 89, 93, 0.5);
--dv-drag-over-border-color: white;
--dv-tabs-container-scrollbar-color: #888;
--dv-group-view-background-color: #1e1e1e;
--dv-tabs-and-actions-container-background-color: #252526;
--dv-activegroup-visiblepanel-tab-background-color: #1e1e1e;
--dv-activegroup-hiddenpanel-tab-background-color: #2d2d2d;
--dv-inactivegroup-visiblepanel-tab-background-color: #1e1e1e;
--dv-inactivegroup-hiddenpanel-tab-background-color: #2d2d2d;
--dv-tab-divider-color: #1e1e1e;
--dv-activegroup-visiblepanel-tab-color: white;
--dv-activegroup-hiddenpanel-tab-color: #969696;
--dv-inactivegroup-visiblepanel-tab-color: #8f8f8f;
--dv-inactivegroup-hiddenpanel-tab-color: #626262;
--dv-separator-border: rgb(68, 68, 68);
--dv-paneview-header-border-color: rgba(204, 204, 204, 0.2);
}
.dockview-theme-light {
--dv-paneview-active-outline-color: dodgerblue;
--dv-tabs-and-actions-container-font-size: 13px;
--dv-tabs-and-actions-container-height: 35px;
--dv-tab-close-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>');
--dv-tab-dirty-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></svg>');
--dv-drag-over-background-color: rgba(83, 89, 93, 0.5);
--dv-drag-over-border-color: white;
--dv-tabs-container-scrollbar-color: #888;
--dv-group-view-background-color: white;
--dv-tabs-and-actions-container-background-color: #f3f3f3;
--dv-activegroup-visiblepanel-tab-background-color: white;
--dv-activegroup-hiddenpanel-tab-background-color: #ececec;
--dv-inactivegroup-visiblepanel-tab-background-color: white;
--dv-inactivegroup-hiddenpanel-tab-background-color: #ececec;
--dv-tab-divider-color: white;
--dv-activegroup-visiblepanel-tab-color: rgb(51, 51, 51);
--dv-activegroup-hiddenpanel-tab-color: rgba(51, 51, 51, 0.7);
--dv-inactivegroup-visiblepanel-tab-color: rgba(51, 51, 51, 0.7);
--dv-inactivegroup-hiddenpanel-tab-color: rgba(51, 51, 51, 0.35);
--dv-separator-border: rgba(128, 128, 128, 0.35);
--dv-paneview-header-border-color: rgb(51, 51, 51);
}
.dockview-theme-vs {
--dv-paneview-active-outline-color: dodgerblue;
--dv-tabs-and-actions-container-font-size: 13px;
--dv-tabs-and-actions-container-height: 35px;
--dv-tab-close-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>');
--dv-tab-dirty-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></svg>');
--dv-drag-over-background-color: rgba(83, 89, 93, 0.5);
--dv-drag-over-border-color: white;
--dv-tabs-container-scrollbar-color: #888;
--dv-group-view-background-color: #1e1e1e;
--dv-tabs-and-actions-container-background-color: #252526;
--dv-activegroup-visiblepanel-tab-background-color: #1e1e1e;
--dv-activegroup-hiddenpanel-tab-background-color: #2d2d2d;
--dv-inactivegroup-visiblepanel-tab-background-color: #1e1e1e;
--dv-inactivegroup-hiddenpanel-tab-background-color: #2d2d2d;
--dv-tab-divider-color: #1e1e1e;
--dv-activegroup-visiblepanel-tab-color: white;
--dv-activegroup-hiddenpanel-tab-color: #969696;
--dv-inactivegroup-visiblepanel-tab-color: #8f8f8f;
--dv-inactivegroup-hiddenpanel-tab-color: #626262;
--dv-separator-border: rgb(68, 68, 68);
--dv-paneview-header-border-color: rgba(204, 204, 204, 0.2);
--dv-activegroup-visiblepanel-tab-background-color: dodgerblue;
--dv-tabs-and-actions-container-height: 18px;
--dv-tabs-and-actions-container-font-size: 11px;
}
.dockview-theme-vs .groupview.active-group > .tabs-and-actions-container {
border-bottom: 2px solid var(--dv-activegroup-visiblepanel-tab-background-color);
}
.dockview-theme-vs .groupview.inactive-group > .tabs-and-actions-container {
border-bottom: 2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color);
}
.actions-bar {
text-align: right;
width: 28px;
display: flex;
align-items: center;
flex-shrink: 0;
}
.actions-bar .actions-container {
display: flex;
padding: 0px;
margin: 0px;
justify-content: flex-end;
}
.actions-bar .actions-container a:active {
-webkit-mask-size: 100% 100% ;
mask-size: 100% 100% ;
}
.actions-bar .actions-container .close-action {
background-color: white;
height: 16px;
width: 16px;
display: block;
-webkit-mask: var(--dv-tab-close-icon) 50% 50%/90% 90% no-repeat;
mask: var(--dv-tab-close-icon) 50% 50%/90% 90% no-repeat;
margin-right: "0.5em";
cursor: pointer;
}
.drop-target {
position: relative;
}
.drop-target > .drop-target-dropzone {
position: absolute;
left: 0px;
top: 0px;
height: 100%;
width: 100%;
z-index: 10000;
}
.drop-target > .drop-target-dropzone > .drop-target-selection {
position: relative;
pointer-events: none;
box-sizing: border-box;
height: 100%;
width: 100%;
background-color: var(--dv-drag-over-background-color);
transition-duration: 0.15s;
transition-timing-function: ease-out;
}
.drop-target > .drop-target-dropzone > .drop-target-selection.left, .drop-target > .drop-target-dropzone > .drop-target-selection.right {
width: 50%;
}
.drop-target > .drop-target-dropzone > .drop-target-selection.right {
transform: translate(100%, 0%);
}
.drop-target > .drop-target-dropzone > .drop-target-selection.bottom {
transform: translate(0%, 100%);
}
.drop-target > .drop-target-dropzone > .drop-target-selection.top, .drop-target > .drop-target-dropzone > .drop-target-selection.bottom {
height: 50%;
}
.drop-target > .drop-target-dropzone > .drop-target-selection.small-top {
border-top: 1px solid var(--dv-drag-over-border-color);
}
.drop-target > .drop-target-dropzone > .drop-target-selection.small-bottom {
border-bottom: 1px solid var(--dv-drag-over-border-color);
}
.drop-target > .drop-target-dropzone > .drop-target-selection.small-left {
border-left: 1px solid var(--dv-drag-over-border-color);
}
.drop-target > .drop-target-dropzone > .drop-target-selection.small-right {
border-right: 1px solid var(--dv-drag-over-border-color);
}
.custom-dragging {
height: 24px;
line-height: 24px;
font-size: 11px;
width: 100px;
background-color: dodgerblue;
color: ghostwhite;
border-radius: 11px;
position: absolute;
padding-left: 10px;
}
.groupview.active-group > .tabs-and-actions-container > .tabs-container > .tab.active-tab {
background-color: var(--dv-activegroup-visiblepanel-tab-background-color);
color: var(--dv-activegroup-visiblepanel-tab-color);
}
.groupview.active-group > .tabs-and-actions-container > .tabs-container > .tab.active-tab .tab-action {
background-color: var(--dv-activegroup-visiblepanel-tab-color);
}
.groupview.active-group > .tabs-and-actions-container > .tabs-container > .tab.inactive-tab {
background-color: var(--dv-activegroup-hiddenpanel-tab-background-color);
color: var(--dv-activegroup-hiddenpanel-tab-color);
}
.groupview.active-group > .tabs-and-actions-container > .tabs-container > .tab.inactive-tab .tab-action {
background-color: var(--dv-activegroup-hiddenpanel-tab-color);
}
.groupview.inactive-group > .tabs-and-actions-container > .tabs-container > .tab.active-tab {
background-color: var(--dv-inactivegroup-visiblepanel-tab-background-color);
color: var(--dv-inactivegroup-visiblepanel-tab-color);
}
.groupview.inactive-group > .tabs-and-actions-container > .tabs-container > .tab.active-tab .tab-action {
background-color: var(--dv-inactivegroup-visiblepanel-tab-color);
}
.groupview.inactive-group > .tabs-and-actions-container > .tabs-container > .tab.inactive-tab {
background-color: var(--dv-inactivegroup-hiddenpanel-tab-background-color);
color: var(--dv-inactivegroup-hiddenpanel-tab-color);
}
.groupview.inactive-group > .tabs-and-actions-container > .tabs-container > .tab.inactive-tab .tab-action {
background-color: var(--dv-inactivegroup-hiddenpanel-tab-color);
}
/**
* when a tab is dragged we lose the above stylings because they are conditional on parent elements
* therefore we also set some stylings for the dragging event
**/
.tab.dragging {
background-color: var(--dv-activegroup-visiblepanel-tab-background-color);
color: var(--dv-activegroup-visiblepanel-tab-color);
}
.grid-view,
.branch-node {
height: 100%;
width: 100%;
}
.groupview {
display: flex;
flex-direction: column;
height: 100%;
background-color: var(--dv-group-view-background-color);
overflow: hidden;
}
.groupview:focus {
outline: none;
}
.groupview.empty > .tabs-and-actions-container {
display: none;
}
.groupview > .content-container {
flex-grow: 1;
overflow: hidden;
outline: none;
}
.pane-container {
height: 100%;
width: 100%;
}
.pane-container.animated .view {
transition-duration: 0.15s;
transition-timing-function: ease-out;
}
.pane-container .view {
overflow: hidden;
display: flex;
flex-direction: column;
padding: 0px ;
}
.pane-container .view:not(:first-child)::before {
background-color: transparent ;
}
.pane-container .view:not(:first-child) .pane > .pane-header {
border-top: 1px solid var(--dv-paneview-header-border-color);
}
.pane-container .view .default-header {
background-color: var(--dv-group-view-background-color);
color: var(--dv-activegroup-visiblepanel-tab-color);
display: flex;
padding: 0px 8px;
}
.pane-container .view .default-header > span {
flex-grow: 1;
}
.pane-container:first-of-type > .pane > .pane-header {
border-top: none ;
}
.pane-container .pane {
display: flex;
flex-direction: column;
overflow: hidden;
height: 100%;
}
.pane-container .pane .pane-header {
box-sizing: border-box;
user-select: none;
position: relative;
outline: none;
}
.pane-container .pane .pane-header.pane-draggable {
cursor: pointer;
}
.pane-container .pane .pane-header:focus:before, .pane-container .pane .pane-header:focus-within:before {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 5;
content: "";
pointer-events: none;
outline: 1px solid;
outline-width: -1px;
outline-style: solid;
outline-offset: -1px;
outline-color: var(--dv-paneview-active-outline-color);
}
.pane-container .pane .pane-body {
overflow-y: auto;
overflow-x: hidden;
flex-grow: 1;
position: relative;
outline: none;
}
.pane-container .pane .pane-body:focus:before, .pane-container .pane .pane-body:focus-within:before {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 5;
content: "";
pointer-events: none;
outline: 1px solid;
outline-width: -1px;
outline-style: solid;
outline-offset: -1px;
outline-color: var(--dv-paneview-active-outline-color);
}
.tabs-and-actions-container {
display: flex;
background-color: var(--dv-tabs-and-actions-container-background-color);
flex-shrink: 0;
box-sizing: border-box;
height: var(--dv-tabs-and-actions-container-height);
font-size: var(--dv-tabs-and-actions-container-font-size);
}
.tabs-and-actions-container.hidden {
display: none;
}
.tabs-and-actions-container .void-container {
display: flex;
flex-grow: 1;
}
.tabs-and-actions-container .tabs-container {
display: flex;
overflow-x: overlay;
overflow-y: hidden;
scrollbar-width: thin;
/* Track */
/* Handle */
}
.tabs-and-actions-container .tabs-container::-webkit-scrollbar {
height: 3px;
}
.tabs-and-actions-container .tabs-container::-webkit-scrollbar-track {
background: transparent;
}
.tabs-and-actions-container .tabs-container::-webkit-scrollbar-thumb {
background: var(--dv-tabs-container-scrollbar-color);
}
.tabs-and-actions-container .tabs-container .tab {
-webkit-user-drag: element;
outline: none;
min-width: 75px;
cursor: pointer;
position: relative;
box-sizing: border-box;
}
.tabs-and-actions-container .tabs-container .tab:not(:first-child)::before {
content: " ";
position: absolute;
top: 0;
left: 0;
z-index: 5;
pointer-events: none;
background-color: var(--dv-tab-divider-color);
width: 1px;
height: 100%;
}
.split-view-container {
position: relative;
overflow: hidden;
height: 100%;
width: 100%;
}
.split-view-container.animation .view,
.split-view-container.animation .sash {
transition-duration: 0.15s;
transition-timing-function: ease-out;
}
.split-view-container.horizontal {
height: 100%;
}
.split-view-container.horizontal > .sash-container > .sash {
height: 100%;
width: 4px;
}
.split-view-container.horizontal > .sash-container > .sash.enabled {
cursor: ew-resize;
}
.split-view-container.horizontal > .sash-container > .sash.disabled {
cursor: default;
}
.split-view-container.horizontal > .sash-container > .sash.maximum {
cursor: w-resize;
}
.split-view-container.horizontal > .sash-container > .sash.minimum {
cursor: e-resize;
}
.split-view-container.horizontal > .view-container > .view:not(:first-child)::before {
height: 100%;
width: 1px;
}
.split-view-container.vertical {
width: 100%;
}
.split-view-container.vertical > .sash-container > .sash {
width: 100%;
height: 4px;
}
.split-view-container.vertical > .sash-container > .sash.enabled {
cursor: ns-resize;
}
.split-view-container.vertical > .sash-container > .sash.disabled {
cursor: default;
}
.split-view-container.vertical > .sash-container > .sash.maximum {
cursor: n-resize;
}
.split-view-container.vertical > .sash-container > .sash.minimum {
cursor: s-resize;
}
.split-view-container.vertical > .view-container > .view {
width: 100%;
}
.split-view-container.vertical > .view-container > .view:not(:first-child)::before {
height: 1px;
width: 100%;
}
.split-view-container .sash-container {
height: 100%;
width: 100%;
position: absolute;
}
.split-view-container .sash-container .sash {
position: absolute;
z-index: 99;
outline: none;
}
.split-view-container .sash-container .sash:active {
transition: background-color 0.1s ease-in-out;
background-color: var(--dv-active-sash-color, transparent);
}
.split-view-container .sash-container .sash:hover {
background-color: var(--dv-active-sash-color, transparent);
transition: background-color 0.1s ease-in-out;
transition-delay: 0.5s;
}
.split-view-container .view-container {
position: relative;
height: 100%;
width: 100%;
}
.split-view-container .view-container .view {
height: 100%;
box-sizing: border-box;
overflow: auto;
position: absolute;
}
.split-view-container.separator-border .view:not(:first-child)::before {
content: " ";
position: absolute;
top: 0;
left: 0;
z-index: 5;
pointer-events: none;
background-color: var(--dv-separator-border);
}
.dragged {
transform: translate3d(0px, 0px, 0px);
/* forces tab to be drawn on a separate layer (see https://github.com/microsoft/vscode/issues/18733) */
}
.tab {
flex-shrink: 0;
}
.tab.dragging .tab-action {
background-color: var(--dv-activegroup-visiblepanel-tab-color);
}
.tab.active-tab > .default-tab .tab-action {
visibility: visible;
}
.tab.inactive-tab > .default-tab .tab-action:not(.dirty) {
visibility: hidden;
}
.tab.inactive-tab > .default-tab:hover .tab-action {
visibility: visible;
}
.tab .default-tab {
position: relative;
height: 100%;
display: flex;
min-width: 80px;
align-items: center;
padding-left: 10px;
white-space: nowrap;
text-overflow: elipsis;
}
.tab .default-tab .tab-content {
flex-grow: 1;
}
.tab .default-tab .action-container {
text-align: right;
width: 28px;
display: flex;
}
.tab .default-tab .action-container .tab-list {
display: flex;
padding: 0px;
margin: 0px;
justify-content: flex-end;
}
.tab .default-tab .action-container .tab-list a:active:hover {
-webkit-mask-size: 100% 100% ;
mask-size: 100% 100% ;
}
.tab .default-tab .action-container .tab-list .tab-action {
height: 16px;
width: 16px;
display: block;
-webkit-mask: var(--dv-tab-close-icon) 50% 50%/90% 90% no-repeat;
mask: var(--dv-tab-close-icon) 50% 50%/90% 90% no-repeat;
margin-right: "0.5em";
}
.tab .default-tab .action-container .tab-list .tab-action.disable-close {
display: none;
}
.tab .default-tab .action-container .tab-list .tab-action.dirty:not(:hover) {
display: block;
-webkit-mask: var(--dv-tab-dirty-icon) 50% 50%/60% 60% no-repeat;
mask: var(--dv-tab-dirty-icon) 50% 50%/60% 60% no-repeat;
}
.watermark {
display: flex;
width: 100%;
}
.watermark.has-actions .watermark-title .actions-bar {
display: none;
}
.watermark .watermark-title {
height: 35px;
width: 100%;
display: flex;
}
.watermark .watermark-content {
flex-grow: 1;
}