| /* |
| * Copyright (C) 2015-2018 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| .tab-bar { |
| position: absolute; |
| top: var(--undocked-title-area-height); |
| left: 0; |
| right: 0; |
| height: var(--tab-bar-height); |
| |
| display: flex; |
| |
| --tab-item-dark-border-color: hsl(0, 0%, 59%); |
| --tab-item-medium-border-color: hsl(0, 0%, 65%); |
| --tab-item-light-border-color: hsl(0, 0%, 85%); |
| --tab-item-extra-light-border-color: hsl(0, 0%, 92%); |
| |
| --tab-item-medium-border-style: 1px solid var(--tab-item-medium-border-color); |
| --tab-item-light-border-style: 1px solid var(--tab-item-light-border-color); |
| } |
| |
| body:not(.docked) .tab-bar { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 78%), hsl(0, 0%, 72%)); |
| background-size: 100% 200%; |
| } |
| |
| body:not(.docked).window-inactive .tab-bar { |
| background-image: none; |
| background-color: var(--tab-item-extra-light-border-color); |
| } |
| |
| body.docked.window-inactive .tab-bar { |
| background-color: var(--background-color-unfocused); |
| } |
| |
| .tab-bar > .border { |
| position: absolute; |
| left: 0; |
| right: 0; |
| z-index: 10; |
| background-color: var(--tab-item-medium-border-color); |
| } |
| |
| .tab-bar > .border.top { |
| top: 0; |
| height: calc(1px / var(--zoom-factor)); |
| } |
| |
| .tab-bar > .border.bottom { |
| bottom: 0; |
| height: 1px; |
| } |
| |
| body.docked.bottom .tab-bar > .border.top { |
| filter: brightness(80%); |
| } |
| |
| body.window-inactive .tab-bar > .border { |
| background-color: var(--tab-item-light-border-color); |
| } |
| |
| .tab-bar > .navigation-bar { |
| height: var(--tab-bar-height); |
| } |
| |
| .tab-bar > .navigation-bar > .item.group > .item { |
| width: auto; |
| margin: 0 4px; |
| padding: 0; |
| } |
| |
| .tab-bar > .navigation-bar > .item.group > .item:nth-child(1 of :not(.hidden)) { |
| -webkit-margin-start: 8px; |
| } |
| |
| .tab-bar > .navigation-bar > .item.group > .item:nth-last-child(1 of :not(.hidden)) { |
| -webkit-margin-end: 8px; |
| } |
| |
| .tab-bar > .navigation-bar .item.divider { |
| margin-top: 1px; |
| background-color: var(--tab-item-medium-border-color); |
| } |
| |
| body.window-inactive .tab-bar > .navigation-bar > .item.divider { |
| background-color: var(--tab-item-light-border-color); |
| } |
| |
| .tab-bar > .tabs { |
| display: flex; |
| flex-wrap: wrap; |
| position: relative; |
| width: 100%; |
| height: 100%; |
| } |
| |
| body.docked .tab-bar .tabs { |
| justify-content: space-around; |
| padding: 0 4px; /* Keep in sync with `WI.TabBar.horizontalPadding` */ |
| } |
| |
| body.docked .tab-bar > .tabs > .flexible-space { |
| flex-grow: 1; |
| } |
| |
| body.docked.bottom .tab-bar > .tabs > .flexible-space { |
| cursor: row-resize; |
| } |
| |
| .tab-bar > .tabs > .item { |
| display: flex; |
| |
| position: relative; |
| |
| z-index: 1; |
| |
| align-items: center; |
| |
| padding: 0 8px; |
| |
| height: var(--tab-bar-item-height); |
| overflow: hidden; |
| |
| line-height: 15px; |
| outline: none; |
| |
| /* FIXME: These cause noticeable transitions when focusing the window. Fix that with JavaScript? */ |
| /* transition-property: background-position, border-color; */ |
| /* transition-duration: 250ms; */ |
| /* transition-delay: 50ms; */ |
| |
| --tab-bar-item-height: 100%; |
| } |
| |
| body:not(.docked) .tab-bar > .tabs > .item { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 78%), hsl(0, 0%, 72%)); |
| background-size: 100% 200%; |
| } |
| |
| body:not(.docked) .tab-bar > .tabs:not(.calculate-width) > .item:not(.pinned) { |
| flex-grow: 1; |
| } |
| |
| body.docked .tab-bar > .tabs > .item { |
| margin: var(--tab-bar-item-vertical-margin) 2px 0; /* Keep in sync with `WI.TabBarItem.horizontalMargin` */ |
| |
| --tab-bar-item-height: calc(var(--tab-bar-height) - (2 * var(--tab-bar-item-vertical-margin))); |
| --tab-bar-item-vertical-margin: 4px; |
| } |
| |
| .tab-bar > .tabs.calculate-width > .item:not(.pinned) { |
| flex: initial; |
| } |
| |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs > .item:nth-child(n + 3 of :not(.hidden)), |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs:not(.hide-border-start) > .item:nth-child(2 of :not(.hidden)), |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs.dragging-tab > .item.selected, |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs:not(.hide-border-end) > .item:nth-last-child(1 of :not(.hidden)) { |
| border-left: var(--tab-item-medium-border-style); |
| } |
| |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs:not(.hide-border-end) > .item:nth-last-child(1 of :not(.hidden)), |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs > .item:nth-child(n + 3 of :not(.hidden)), |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs:not(.hide-border-start) > .item:nth-child(2 of :not(.hidden)), |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs.dragging-tab > .item.selected { |
| border-right: var(--tab-item-medium-border-style); |
| } |
| |
| .tab-bar > .tabs > .item.pinned { |
| flex: none; |
| justify-content: center; |
| width: var(--tab-bar-height); |
| padding: 0; |
| } |
| |
| body.docked .tab-bar > .tabs > .item.pinned { |
| width: var(--tab-bar-item-height); /* Make pinned tabs square */ |
| } |
| |
| body:not(.docked) .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 87%), hsl(0, 0%, 82%)); |
| background-size: 100% 100%; |
| } |
| |
| body.docked .tab-bar > .tabs > .item:not(.disabled):matches(.selected, :hover) { |
| border-radius: var(--tab-bar-item-vertical-margin); |
| } |
| |
| body.docked .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-color: lightgrey; |
| } |
| |
| body:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 67%), hsl(0, 0%, 64%)); |
| } |
| |
| body.docked .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover { |
| background-color: hsl(0, 0%, 95%); |
| } |
| |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover, |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover + .item, |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs:not(.animating) > .item:last-child:not(.selected, .disabled):hover { |
| border-left-color: var(--tab-item-dark-border-color); |
| } |
| |
| body[dir=ltr]:not(.docked) .tab-bar > .tabs:not(.animating) > .item:last-child:not(.selected, .disabled):hover, |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover, |
| body[dir=rtl]:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover + .item { |
| border-right-color: var(--tab-item-dark-border-color); |
| } |
| |
| body:not(.docked).window-inactive .tab-bar > .tabs > .item { |
| border-right-color: var(--tab-item-light-border-color) !important; |
| border-left-color: var(--tab-item-light-border-color) !important; |
| |
| background-image: none; |
| background-color: var(--tab-item-extra-light-border-color); |
| |
| transition: none; |
| } |
| |
| body:not(.docked).window-inactive .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-image: none; |
| background-color: hsl(0, 0%, 96%); |
| } |
| |
| body.docked .tab-bar > .tabs > .item:not(.disabled):matches(.selected, :hover) { |
| box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.15) inset; |
| } |
| |
| body.docked.window-inactive .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-color: hsl(0, 0%, 90%); |
| } |
| |
| .tab-bar > .tabs > .item > .flex-space { |
| display: flex; |
| flex: 1; |
| } |
| |
| .tab-bar > .tabs > .item > .icon { |
| width: 16px; |
| height: 16px; |
| |
| min-width: 16px; |
| min-height: 16px; |
| |
| opacity: 0.55; /* Assumes black glyphs. */ |
| |
| -webkit-user-drag: none; |
| } |
| |
| .tab-bar > .tabs > .item.pinned > .icon { |
| width: 15px; |
| height: 15px; |
| min-width: 15px; |
| min-height: 15px; |
| } |
| |
| .tab-bar > .tabs > .item:not(.selected):hover > .icon { |
| opacity: 0.6; |
| } |
| |
| .tab-bar > .tabs > .item:not(.disabled).selected > .icon { |
| opacity: 0.7; |
| } |
| |
| .tab-bar > .tabs > .item.disabled > .icon { |
| opacity: 0.35; |
| } |
| |
| body.window-inactive .tab-bar > .tabs > .item > .icon { |
| opacity: 0.3; |
| } |
| |
| body.window-inactive .tab-bar > .tabs > .item:not(.disabled).selected > .icon { |
| opacity: 0.4; |
| } |
| |
| .tab-bar > .tabs > .item > .name { |
| color: hsla(0, 0%, var(--foreground-lightness), 0.6); |
| |
| display: flex; |
| |
| min-width: 0; |
| max-width: 400px; |
| -webkit-margin-start: 6px; |
| } |
| |
| body.window-inactive .tab-bar > .tabs > .item > .name { |
| color: hsla(0, 0%, var(--foreground-lightness), 0.4); |
| } |
| |
| .tab-bar > .tabs > .item > .name > .content { |
| min-width: 0; |
| width: 100%; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| white-space: nowrap; |
| } |
| |
| .tab-bar > .tabs > .item:not(.selected):hover > .name { |
| color: hsla(0, 0%, var(--foreground-lightness), 0.7); |
| } |
| |
| .tab-bar > .tabs > .item:not(.disabled).selected > .name { |
| color: hsla(0, 0%, var(--foreground-lightness), 0.8); |
| } |
| |
| body.window-inactive .tab-bar > .tabs > .item:not(.disabled).selected > .name { |
| color: hsla(0, 0%, var(--foreground-lightness), 0.5); |
| } |
| |
| .tab-bar > .tabs.static-layout { |
| position: relative; |
| } |
| |
| .tab-bar > .tabs.static-layout > :matches(.flexible-space, .item) { |
| position: absolute; |
| top: 0; |
| } |
| |
| .tab-bar > .tabs.animating.closing-tab > .item { |
| transition-property: left; |
| transition-duration: 250ms; |
| transition-timing-function: ease-in-out; |
| } |
| |
| .tab-bar > .tabs.animating:matches(.expanding-tabs, .inserting-tab) > .item { |
| transition-property: left, width; |
| transition-duration: 250ms; |
| transition-timing-function: ease-in-out; |
| } |
| |
| .tab-bar > .tabs.animating.inserting-tab > .item.being-inserted { |
| z-index: 2; |
| padding: 0; |
| } |
| |
| body:not(.docked) .tab-bar > .tabs.dragging-tab > .item:not(.disabled).selected, |
| body:not(.docked) .tab-bar > .tabs.static-layout:not(.animating.inserting-tab):not(.dragging-tab) > .item:nth-last-child(1 of :not(.pinned)), |
| body:not(.docked) .tab-bar > .tabs.animating.closing-tab > .item:not(.disabled).selected { |
| border-right: var(--tab-item-medium-border-style); |
| } |
| |
| body:not(.docked).window-inactive .tab-bar > .tabs.dragging-tab > .item:not(.disabled).selected, |
| body:not(.docked).window-inactive .tab-bar > .tabs.static-layout:not(.animating.inserting-tab):not(.dragging-tab) > .item:nth-last-child(1 of :not(.pinned)), |
| body:not(.docked).window-inactive .tab-bar > .tabs.animating.closing-tab > .item:not(.disabled).selected { |
| border-right-color: var(--tab-item-light-border-color); |
| } |
| |
| .tab-bar > .tabs.dragging-tab > .item:not(.disabled).selected { |
| z-index: 2; |
| pointer-events: none; |
| } |
| |
| @media (prefers-color-scheme: dark) { |
| .tab-bar { |
| --tab-item-border-color: hsl(0, 0%, 36%); |
| |
| /* FIXME: <https://webkit.org/b/189769> Dark Mode: use semantic color names */ |
| --tab-item-dark-border-color: var(--tab-item-border-color); |
| --tab-item-medium-border-color: var(--tab-item-border-color); |
| --tab-item-light-border-color: var(--tab-item-border-color); |
| --tab-item-extra-light-border-color: var(--tab-item-border-color); |
| } |
| |
| body:not(.docked) .tab-bar { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 12%), hsl(0, 0%, 10%)); |
| } |
| |
| body.docked .tab-bar { |
| background-color: hsl(0, 0%, 10%); |
| } |
| |
| body.docked.bottom .tab-bar > .border.top { |
| filter: brightness(120%); |
| } |
| |
| body:not(.docked) .tab-bar > .tabs > .item { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 12%), hsl(0, 0%, 10%)); |
| } |
| |
| body:not(.docked) .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 23%), hsl(0, 0%, 21%)); |
| } |
| |
| body:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover { |
| background-image: linear-gradient(to bottom, hsl(0, 0%, 11%), hsl(0, 0%, 9%)); |
| } |
| |
| body.docked .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover { |
| background-color: hsl(0, 0%, 15%); |
| } |
| |
| body.docked .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-color: var(--background-color); |
| } |
| |
| body.docked.window-inactive .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-color: hsl(0, 0%, 20%); |
| } |
| |
| .tab-bar > .tabs > .item > .icon { |
| filter: var(--filter-invert); |
| } |
| |
| body:not(.docked) .tab-bar > .tabs:not(.animating) > .item:not(.selected, .disabled):hover > .icon { |
| opacity: 0.6; |
| } |
| |
| body:not(.docked).window-inactive .tab-bar { |
| --tab-item-border-color: hsl(0, 0%, 34%); |
| |
| background-image: none; |
| background-color: hsl(0, 0%, 13%); |
| } |
| |
| body:not(.docked).window-inactive .tab-bar > .tabs > .item { |
| background-image: none; |
| background-color: hsl(0, 0%, 13%); |
| } |
| |
| body:not(.docked).window-inactive .tab-bar > .tabs > .item:not(.disabled).selected { |
| background-color: hsl(0, 0%, 19%); |
| } |
| } |