UNPKG

dockview

Version:

Zero dependency layout manager supporting tabs, grids and splitviews with ReactJS support

537 lines (532 loc) 17.9 kB
.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% !important; mask-size: 100% 100% !important; } .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 !important; } .pane-container .view:not(:first-child)::before { background-color: transparent !important; } .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 !important; } .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% !important; mask-size: 100% 100% !important; } .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; }