Dark-GitLab by vednoc

Imported and mirrored from https://gitlab.com/vednoc/dark-gitlab/raw/master/gitlab.user.styl

Dark-GitLab screenshot
Homepage Install Get Stylus Write a review

Details

Authorvednoc

LicenseMIT

Created

Updated

Categorygitlab.com

Statistics

Learn how we calculate statistics in the FAQ.

Total views

Total installs

Weekly installs

Weekly updates

Description

Dark and light theme for GitLab and self-hosted GitLab instances.

Notes

Userstyle doesn't have notes.

Source code

Source code has over 100k characters, so we truncated it. You can inspect the full source code on install link.
/* ==UserStyle==
@name         Dark-GitLab
@namespace    gitlab.com/vednoc/dark-gitlab
@description  Dark and light theme for GitLab and self-hosted GitLab instances.
@author       vednoc <vednoc@pm.me> (https://gitlab.com/vednoc)
@homepageURL  https://gitlab.com/vednoc/dark-gitlab
@supportURL   https://gitlab.com/vednoc/dark-gitlab/issues
@preprocessor stylus
@version      2.0.0-rc.14
@license      MIT

@var select   cg_theme     'Base color-scheme toggle' {
    'Custom colors          *': 'custom',
    'Dark blue (old)         ': 'old-colors',
    'Dark gray (new)         ': 'new-colors',
    'Breeze Dark             ': 'breeze-dark',
    'GitHub Dark             ': 'github-dark',
    'GitHub Dark Mode        ': 'github-dark-mode',
    'Gruvbox Dark Soft       ': 'gruvbox-dark-soft',
    'Gruvbox Dark Medium     ': 'gruvbox-dark-medium',
    'Gruvbox Dark Hard       ': 'gruvbox-dark-hard',
    'Solarized Dark          ': 'solarized-dark',
    'Dracula                 ': 'dracula',
    'Nord Dark               ': 'nord-dark',
    'Arc Dark                ': 'arc-dark',
    'Moonlight               ': 'moonlight',
    'Monokai                 ': 'monokai',
    'Horizon                 ': 'horizon',
    'Doom One                ': 'doom-one',
    'Deep Dark               ': 'deep-dark',
    'Brave Dark              ': 'brave-dark',
    'Twilight                ': 'twilight',
    'Ubuntu                  ': 'ubuntu',
}

@var color    cg_bg        'Base background color' #292929
@var color    cg_fg        'Base foreground color' #e6e6e6
@var color    cg_ac        'Base accent color    ' #d47d3f
@var range    cg_sat       'Adjust saturation of syntax colors' [0, -50, 40, 0.01]
@var range    cg_lig       'Adjust lightness of syntax colors' [0, -30, 30, 0.01]
@var color    _inverse     'Button inverse color ' #ffffff
@var color    _shadow      'Shadow color         ' #00000040

@var checkbox pcs_enable 'Apply when `(prefers-color-scheme: dark)` is enabled' 0
@var text     ui_font    'Custom UI font' '"font_name"'
@var text     mono_font  'Custom mono font' '"font_name"'
@var text     emoji_font 'Custom emoji font' '"font_name"'
@var text     a_radius   'Avatars: Custom border radius' 25%
@var range    md_img_o   'Markdown: Default image opacity' [1, 0.0, 1, 0.01]
@var checkbox ic_invert  'Chromium: Invert icons in Shadow DOM' 1
@var checkbox img_invert 'Invert illustrations to dark colors' 1
@var checkbox nb_height  'Navbar: Increase height' 1
@var checkbox nb_canary  'Navbar: Show canary badge' 1
@var checkbox c_hl_none  'Code: Use theme colors for "none" syntax hl theme' 1
@var checkbox c_ide      'Code: Enable IDE styles' 1
@var checkbox c_monaco   'Code: Enable Monaco Editor styles' 1
@var checkbox pipelines  'CI/CD: Compact pipelines' 0
@var checkbox dgl_alert  'Profile: Enable Dark-GitLab announcements' 0
@var checkbox sb_enable  'Global: Enable theme scrollbars' 1
==/UserStyle== */

/*!
 * NOTE: Modifying the code will put auto-update feature of Stylus on pause in
 * order to preserve your local changes. That means you need to manually update
 * Dark-GitLab and re-do your modifications in order to stay up-to-date.
 *
 * A way to add domains without modifying the code doesn't exist yet.
 * Relevant issue: https://github.com/openstyles/stylus/issues/307
 *
 * Make sure you have the latest version before submitting bug reports.
 */

// {{{ Helpers.
t       = transparent
i       = !important
vendors = official

// Convert colors to HSLA format.
/// NOTE: This is done just for consistency of generated colors.
to_hsla(input) {
    $h = {}
    $h.hue = unquote(split('deg', '%s' % ceil(hue(input), 2))[0])
    $h.saturation = ceil(saturation(input), 2)
    $h.lightness = ceil(lightness(input), 2)
    s('hsla(%s,%s,%s,1)', $h.hue, $h.saturation, $h.lightness)
}

// SVG-friendly colors mixin.
/// NOTE: Compiler does not like HSLA format, so we convert back to HEX.
to_svg(input) {
    s('\%23%s', unquote(substr(s('%s', convert(input)), 1, 6)))
}

// Color mixin.
/// All colors: `c: fg bg bg`
/// Only border-color: `c: 0 bg`
c(x, y = 0, z = 0, xi = 1, yi = 1, zi = 1) {
    if x != 0 && x != '_' {            color: xi is 0 ? x : x i }
    if y != 0 && y != '_' {     border-color: yi is 0 ? y : y i }
    if z != 0 && z != '_' { background-color: zi is 0 ? z : z i }
}

// SVG mixin.
/// Same usage as `c` mixin.
g(x, y = 0, xi = 1, yi = 1) {
    if x != 0 && x != '_' {   fill: xi is 0 ? x : x i }
    if y != 0 && y != '_' { stroke: yi is 0 ? y : y i }
}

// Border radius mixin.
rad() { border-radius: arguments }

// Box-shadow mixin.
b() { box-shadow: arguments }
// }}}

/{ // {{{ Color generator.
// Color-scheme picker.
ColorSchemes = {
    'custom':                   { BG:   cg_bg, FG:   cg_fg, AC:   cg_ac }
    'old-colors':               { BG: #1f232a, FG: #eeeeee, AC: #7289da }
    'new-colors':               { BG: #292929, FG: #e6e6e6, AC: #d47d3f }
    'breeze-dark':              { BG: #232629, FG: #eff0f1, AC: #3daee9 }
    'github-dark':              { BG: #181818, FG: #e6e6e6, AC: #4f8cc9 }
    'github-dark-mode':         { BG: #0d1117, FG: #c9d1d9, AC: #58a6ff }
    'gruvbox-dark-soft':        { BG: #32302f, FG: #fbf1c7, AC: #d65d0e }
    'gruvbox-dark-medium':      { BG: #282828, FG: #fbf1c7, AC: #d65d0e }
    'gruvbox-dark-hard':        { BG: #1c2021, FG: #fbf1c7, AC: #d65d0e }
    'solarized-dark':           { BG: #03303c, FG: #bcc5c5, AC: #859900 }
    'dracula':                  { BG: #282a36, FG: #f8f8f2, AC: #bd93f9 }
    'nord-dark':                { BG: #2e3440, FG: #eceff4, AC: #5e81ac }
    'arc-dark':                 { BG: #343944, FG: #c1c8d1, AC: #5294e2 }
    'moonlight':                { BG: #1e2030, FG: #c8d3f5, AC: #82aaff }
    'monokai':                  { BG: #272822, FG: #e8e8e3, AC: #fd9720 }
    'horizon':                  { BG: #1c1e26, FG: #d5c1ac, AC: #E95378 }
    'doom-one':                 { BG: #21242b, FG: #bbc2cf, AC: #51afef }
    'deep-dark':                { BG: #111111, FG: #eff0f1, AC: #00adee }
    'brave-dark':               { BG: #222222, FG: #d6d6d6, AC: #f96234 }
    'twilight':                 { BG: #171717, FG: #f7f7f7, AC: #8f9d6a }
    'ubuntu':                   { BG: #2c071a, FG: #f2f1ef, AC: #ef7847 }
}

// Select active color-scheme.
for color-scheme in ColorSchemes {
    if (color-scheme == cg_theme) {
        // main { dbg: s('%s %s', color-scheme, cg_theme) }
        define('BG', ColorSchemes[color-scheme].BG, global)
        define('FG', ColorSchemes[color-scheme].FG, global)
        define('AC', ColorSchemes[color-scheme].AC, global)
        define('ac', var(--ac), global)
    }
}

// Color values and hues.
// NOTE: List with anonymous hashes.
colors = (
    { key: bg, color:   BG } \
    { key: fg, color:   FG } \
    { key: v0, color:   AC } \
    { key: v1, hue:   0deg } \
    { key: v2, hue:  30deg } \
    { key: v3, hue:  60deg } \
    { key: v4, hue:  90deg } \
    { key: v5, hue: 180deg } \
    { key: v6, hue: 210deg } \
    { key: v7, hue: 270deg } \
    { key: v8, hue: 300deg } \
    { key: v9, hue:   0deg } \
)

// Alias colors.
$bg = colors[0]
$fg = colors[1]
// $dbg += '%s; %s; :::' % (($bg) ($fg))

// Generate background colors.
for num in 0..5 {
    $color = $bg.color
    if num == 1 {} // Skip base BG color.
    else if num == 0 { $color = darken($color, 10%) }
    else { $color = lighten($color, (num+2) * num/2%) }
    $color = to_hsla($color)

    $key = s('%s%s', $bg.key, num)
    $val = 'var(--%s-%s)' % (($bg.key) (num))
    define('$' + $key, $color, global)
    define('' + $key, $val, global)
}

// Generate foreground colors.
for num in 0..5 {
    $color = $fg.color
    if num == 1 {} // Skip base FG color.
    else if num == 0 { $color = lighten($color, 10%) }
    else { $color = darken($color, (num + num/1.25) * 5%) }

    $color = desaturate($color, 90%)
    $color = to_hsla($color)
    // $dbg += '--- FG: ' + $color

    $key = s('%s%s', $fg.key, num)
    $val = 'var(--%s-%s)' % (($fg.key) (num))
    define('$' + $key, $color, global)
    define('' + $key, $val, global)
}

// Generate all other colors.
for c, i in colors[2..length(colors)] {
    // $dbg += s('::: c: %s, i: %s; ', c, i )
    // if c.key == v9 { $dbg += s('::: c: %s, i: %s; ', c, i ) }
    $sel  = colors[i+2]
    $dbg += ' ' + $sel

    for num in 0..9 {
        /// Case for accent colors.
        if ($sel.key == v0) {
            $color = darken($sel.color, (80% - ((num + num/3) * 7.5)))
            $color = darken($sel.color, (100% - (num+3) * 7.5))
            $color = lightness($color, lightness($color) + num)
        }

        /// Case for gray colors.
        else if ($sel.key == v9) {
            $color = hsl($sel.hue, 0%, 50% + cg_lig)
            $color = darken($color, (100% - (num+2) * 17))
        }

        /// Case for RGB colors.
        else {
            $hue   = $sel.hue
            $color = hsl($hue, 60% + cg_sat, 60% + cg_lig)
            $color = darken($color, (100% - (num+2) * 7.5))
            $color = lightness($color, lightness($color) + num)
        }

        /// Convert to HSLA format.
        $color = to_hsla($color)

        $key = s('%s%s', $sel.key, num)
        $val = 'var(--%s-%s)' % (($sel.key) (num))
        define('$' + $key, $color, global)
        define('' + $key, $val, global)
    }
}
} /// }}}

@-moz-document domain('custom.domain'),
domain('invent.kde.org'),
domain('git.pleroma.social'),
domain('gitgud.io'),
domain('salsa.debian.org'),
domain('framagit.org'),
domain('repo.getmonero.org'),
domain('0xacab.org'),
domain('dev.gajim.org'),
domain('devel.trisquel.info'),
domain('git.cit.bcit.ca'),
domain('git.coop'),
domain('git.dev.ctu.univ-fcomte.fr'),
domain('git.drk.sc'),
domain('git.empiresmod.com'),
domain('git.fosscommunity.in'),
domain('git.immc.ucl.ac.be'),
domain('git.jami.net'),
domain('git.linux-kernel.at'),
domain('git.nzoss.org.nz'),
domain('git.silence.dev'),
domain('lab.libreho.st'),
domain('opencode.net'),
domain('skylab.vc.h-brs.de'),
domain('vbscan.fisica.unimib.it'),
domain('git.cardiff.ac.uk'),
domain('git.igwn.org'),
domain('git.ligo.org'),
domain('forge.tedomum.net'),
domain('git.callpipe.com'),
domain('git.happy-dev.fr'),
domain('source.ind.ie'),
domain('mau.dev'),
domain('source.puri.sm'),
domain('git.oeru.org'),
domain('git.najer.info'),
domain('gitplac.si'),
domain('git.rockylinux.org'),
regexp('^https?://(www\.)?git\.(gnu|synz)\.io(/.*)?$'),
regexp('^https?://(www\.)?code\.((videolan|briarproject)\.org|foxkit\.us)(/.*)?$'),
regexp('^https?://(www\.)?source\.(small-tech|joinmastodon)\.org(/.*)?$'),
regexp('^https?://(www\.)?git\.(drupalcode|feneas|ouru|pwmt|regardscitoyens)\.org(/.*)?$'),
regexp('^https?://(www\.)?(joonpc\.skku\.edu/gitlab|mpegx\.int-evry\.fr/software)(/.*)?$'),
regexp('^https?://(web.archive.org/web/.*)?((next|www)\.)?(gitlab\.(?!(io|biterg)).*)(/.*)?$') {
    if (pcs_enable) {
        { unquote('@media (prefers-color-scheme: dark) {') }
    }

    // Dark-GitLab variables.
    :root {
        --version   : '🌚 Dark-GitLab v2.0.0-rc.14';
        --bshadow   : 0 4px 8px var(--shadow);
        --shadow    : _shadow
        --inverse   : _inverse
        --avatar    : a_radius
        --ac        : AC

        /// Custom UI font.
        $fs1 = -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Noto Sans'
        $fs2 = 'Noto Sans', Ubuntu, Cantarell, 'Helvetica Neue', sans-serif
        --ui-font: ui_font, $fs1, $fs2, sans-serif, var(--emoji-font)

        /// Custom Monospace font.
        $fm1 = 'Menlo', 'DejaVu Sans Mono', 'Liberation Mono', 'Consolas'
        $fm2 = 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console'
        --mono-font: mono_font, $fm1, $fm2, monospace

        /// Custom Emoji font.
        $fe1 = 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'
        --emoji-font: emoji_font, $fe1, 'Noto Color Emoji'

        /// Generate CSS color variables.
        colors = (bg fg v0 v1 v2 v3 v4 v5 v6 v7 v8 v9)
        for color in colors[0..1] {
            for tone in 0..5 {
                { '--%s-%s' % ((color) (tone)) }: $ + color + tone
            }
        }
        for color in colors[2..length(colors)] {
            for tone in 0..9 {
                { '--%s-%s' % ((color) (tone)) }: $ + color + tone
            }
        }

        /// Colors for CI status icons in Firefox.
        @supports (-moz-user-select: none) {
            --svg-status-bg: var(--bg-1)
        }
        /// Prevents horizontal overflow. @upstream
        overflow-x: hidden;
    }

    // Interop with new variables.
    // TODO: Remove when the refactor is complete.
    bb      = var(--bg-0)
    bg      = var(--bg-1)
    hl      = var(--bg-2)
    bd      = var(--bg-5)
    fg      = var(--fg-1)
    cm      = var(--fg-4)
    sh      = var(--shadow)
    bsh     = var(--bshadow)
    red     = var(--v1-5)
    orange  = var(--v2-5)
    yellow  = var(--v3-5)
    green   = var(--v4-5)
    cyan    = var(--v5-5)
    blue    = var(--v6-5)
    magenta = var(--v7-5)
    violet  = var(--v8-5)
    white   = var(--inverse);
    outer   = 0 0 0 1px bg5;
    inner   = inset outer;

    /// Feat -> Set 'none' syntax preset to use theme colors.
    if (c_hl_none) { c-hl-none = ', .code.none' }

    // Base styles.
    body {
        font-family: var(--ui-font) i;

        /// Default page colors.
        &, &.navless { c: fg1 0 bg0 }

        /// Browser styles.
        a { &, &:hover { color: ac }}
        hr { border-color: bg3 }
        h, .h { &1, &2, &3, &4, &5, &6 { color: fg }}
        time { color: inherit }
        :not(pre) > code {
            c: fg 0 hl 0 0 0;
            box-shadow: inner;
        }
        pre {
            c: fg bd hl 0 0 0;
            /// Commits -> Messages / Details.
            &[class*="description"] {
                border-left-width: 4px;
                font-size: 0.875rem;
                c: fg2 bg5
            }
            /// Global -> Reset raw file content.
            ../ > pre:not([class]) { c: 0 0 t }
        }
        kbd {
            rad: 3px
            c: fg 0 hl;
            box-shadow: inner, inset 0 -3px bg4 i
        }
        /// Misc link colors.
        .gl-link { &, &:hover { color: ac }}
        .author-link, /.branch-commit .commit-sha { color: ac }
        /// Custom monospace font.
        .text-monospace,
        .code.diff-table,
        pre, code, kbd, samp, .monospace, .ref-name,
        .commit-sha, .pipeline-number, .label-branch,
        .git-revision-dropdown .dropdown-content ul li a,
        table.code, [class *= 'git-commit'] {
            font-family: var(--mono-font) i;
        }
        .container { c: 0 bd }
        /// Settings -> Account.
        .danger-title, .gl-field-error, .invalid-feedback { c: v16 }
        [class^='price-'] { c: v67 }
        .warning-title { c: v26 }
        .legend-success, .valid-feedback { c: v46 }
        .account-well { c: fg bd hl }

        /// Settings -> Fix QR code. #108
        [class *= 'two-factor-auth'] svg {
            c: 0 0 white;
            box-shadow: 0 0 0 4px white;
        }
        /// Global -> Progress bar.
        .progress {
            c: 0 0 bg5

            /// Progress bar percentage.
            &-bar.bg-primary { c: 0 0 v09 }

            /// Project -> Languages bar.
            &.repository-languages-bar {
                c: 0 0 bg3

                /// Remove whitespace. #149
                .progress-bar {
                    margin-right: unset
                    /// NOTE: Removing margins leaves out empty space.
                    &:last-child:nth-child(-n+4) { flex-grow: 1 }
                }
            }

            /// OBSOLETE: Override old colors for languages.
            [style*='#375eab'] { c: 0 0 #00ADD8 } /// Go-lang.
            [style*='#776791'] { c: 0 0 #000100 } /// Crystal.
        }
        /// Global color reset.
        .text {
            &-info:not(#z) { c: v66; > svg { g: v66 }}
            &-danger:not(#z) { c: v16; > svg { g: v16 }}
            &-success:not(#z) { c: v46; > svg { g: v46 }}
            &-warning:not(#z) { c: v26; > svg { g: v26 }}
            &-plain, /.light { c: fg1 }
            &-secondary, &-muted, &-gl-muted, &-tertiary,
            /.cgray, /.description-block, /.help-block,
            /.canary-deployment-callout-message, /// (--gray-500) Operations -> Environments.
            /[class *= 'gl-text-gray-'], /.help-text, /.stat-text {  /// 2: snippets -> new
                c: fg4
            }
        }
        /.bg {
            &-light { c: 0 0 bd }
            &-danger { c: 0 0 red }
            &-danger-100 { c: 0 0 v11 }
            &-secondary { c: 0 0 hl }
            &-success { c: 0 0 green }
            &-white, &-gray-light { c: 0 0 bg }
        }
        .border-bottom, .bordered-box { c: 0 bd }
        /// Profile -> Calendar activities.
        .bordered, .unstyled { &-list > li { c: 0 bd }}
        /// Scrollbars.
        if (sb_enable) {
            /html { scrollbar-color: bg4 bg2 }
            /::-webkit-scrollbar {
                width: 12px;
                &-track { background: bg2 }
                &-thumb { background: bg4 }
            }
        }
        /// Placeholders.
        ::placeholder { c: cm }
        ::-webkit-input-placeholder { c: cm }
        /// Login page.
        .page-wrap {
            c: 0 0 t;
            .brand-holder p { c: fg3 }
            /// Footer styles.
            hr.footer-fixed {
                padding-top: 24px;
                margin-bottom: 0;
                c: 0 0 bg1
                + .footer-container { c: 0 0 t }
            }
            /// Login.
            .login-box, .signup-box, .omniauth-container {
                rad: 4px
                c: 0 bg5 bg2
                b: inner i
                /.omniauth-btn {
                    c: 0 0 bg1
                    &:hover { c: 0 0 bg3 }
                }
                /.omniauth-divider { &::before, &::after { c: 0 bg5 }}
                input.form-control { c: 0 0 bg }
            }
            /// Reset page height.
            /.devise-layout-html body.navless { height: calc(100% - 41px) }
        }
        /// Global -> FA icons.
        /.fa {
            c: cm;
            &&-triangle, &.merge-icon { c: orange }
            /// Global -> Menu icon.
            &&-bars:not(#z) { c: fg }
            /// CI/CD -> Charts. OBSOLETE
            /.legend-success &-circle,
            /// Issues -> Export issues.
            &.checkmark { c: green }
            /// MRs -> First contribution.
            &&-certificate { c: ac }
            /// Settings -> CI/CD runners.
            &[class *= 'paused'] { c: red }
            &[class *= 'online'] { c: green }
        }
        /// Feat -> Invert icons in Shadow DOM.
        if (ic_invert) {
            @supports not (-moz-user-select: none) {
                .created-icon, .opened-icon, .ic-upload,
                .gl-icon[data-testid *= 'status_'], // #135
                [class *= 'ci-status'] svg {
                    filter: invert(0.85) hue-rotate(180deg) saturate(100%);
                }
                /// Increase contrast for gray icons.
                :not(#z) .ci-status-icon {
                    &-created svg, &-skipped svg { g: #333 }
                }
            }
        } else {
            /:root { --svg-status-bg : var(--dark) i }
        }
        /// Global -> Callouts.
        .bs-callout {
            rad: 4px
            c: fg1 bg5 bg3

            a:not(.btn) { c: ac }
            strong { color: inherit i }
            &-warning { c: v98 v25 v21 }
            &-success { c: v98 v45 v41 }
            &-danger { c: v98 v15 v11 }
            &-info { c: v98 v65 v61 }
            .btn-default, code:not([class]) { c: 0 0 bg }

            /// Project -> Settings -> CI/CD.
            &.help-callout,
            &.shared-runners-description {
                c: fg bd hl;
                /// Reset background color.
                code, .btn-default { c: 0 0 bg }
            }
            /// Project -> Settings -> MR promotion.
            /.user-callout.promotion-callout {
                c: 0 0 hl;
                .bordered-box { c: 0 0 hl }
                /// Project -> Settings -> Audit events.
                &.center {
                    padding-bottom: 10px;
                    border: 1px solid bd;
                    rad: 4px;
                }
                /// Fix GitLab Gold trial.
                &.js-gold-trial-callout > div { margin: 0 -16px }
            }
            /// Project -> Operations -> K8s.
            &.gcp-signup-offer { c: fg blue }
        }
        /// Project -> Settings -> Pages.
        .border-section { c: 0 bd }
        /// Global -> Mobile resolution.
        .scrolling-tabs-container {
            .fade-right { background: linear-gradient(to left, hl 45%, t) }
            .fade-left { background: linear-gradient(to right, hl 45%, t) }
        }
        .toggle-mobile-nav + .breadcrumbs-links { c: 0 bd }
        /// Project -> Forks.
        /.fork-thumbnail {
            c: 0 0 bg;
            &:hover:not(.disabled), &.forked { c: 0 0 hl }
        }
        /// Notes -> Sticky header.
        .issue-sticky-header {
            top: (nb_height) ? 50px i : 40px i;
            c: 0 bg5 bg1
        }
        /// Settings -> Fix 'preview theme' borders.
        .preview { &.ui-dark, &.gl-dark { c: 0 bd }}
    }

    /// Global -> SVG icons.
    svg {
        &.s16, &.s24, &.icon { g: fg3 }

        /// Activity icons.
        /.deleted, /.closed { &-icon svg { g: v16 }}
        /.created, /.joined, /.opened { &-icon svg { g: v46 }}
        /.commit, /.pushed-new, /.pushed-to { &-icon svg { g: fg4 }}
        /.imported, /.commented-on, /.accepted { &-icon svg { g: v66 }}

        /// CI/CD runners. #170
        &[data-testid="status-active-icon"] { g: v45 }

        /// Misc.
        &.ic-eye-slash { g: v26 } /// Confidential issues.
        &.text-success { g: v46 } /// Green checkmark.
        &.text-danger { g: v16 } /// Due date.

        /// Diff -> Git status icons.
        &.file-addition { &, &-solid { g: v46 }}
        &.file-modified { &, &-solid { g: v66 }}
        &.file-deletion { &, &-solid { g: v16 }}
        &[id*='addition-solid'] { g: v46 }

        /// Notes -> Related isses/MRs/epics.
        &.issue-token-state-icon {
            &-open { g: v46 }
            &-closed { g: v66 }
        }
        &.merge-request-status {
            &.open { c: v46; g: v46 }
            &.closed { c: v16; g: v16 }
        }

        /// Notes -> Merge icon.
        &.merge-icon:not(#z) {
            g: v29
            filter: drop-shadow(0 0 0.5px bg2) \
                    drop-shadow(0 0 1px bg2) \
                    drop-shadow(0 0 2px bg2) i
        }

        /// Pipelines -> Jobs.
        /// NOTE: Icons in this area are slightly problematic, so this fixes them.
        &.s16[data-testid *= 'status_'] { g: currentColor }

        /// CI -> Background for old icons.
        /[id *= 'status_'] [fill = '#FFF'] { g: bg1 }

        /// CI -> Text.
        .ci-status-text {
            max-width: 100%;
            margin-right: 35px;
        }

        /// CI -> Status icons.
        /.ci-status {
            c: fg1 bg5 bg1 1 0

            /// Badges.
            &.ci {
                &-failed { c: v16 v16 }
                &-success { c: v46 v46 }
                &-info, &-running { c: v66 v66 }
                &-created, &-skipped { c: fg3 fg3 }
                &-canceled, &-disabled, &-scheduled, &-manual { c: fg5 fg5 }
                &-pending,
                &-waiting-for-resource,
                &-failed-with-warnings,
                &-success-with-warnings {
                    c: v26 v26
                }
            }

            /// Icons.
            &-icon {
                &-success {
                    &[class *= 'dropdown'], svg { c: 0 v46 }
                    &:not(#z), &[data-toggle] { svg { g: v46 }}
                }
                &-running, &-preparing {
                    &[class *= 'dropdown'], svg { c: 0 v66 }
                    &:not(#z), &[data-toggle] { svg { g: v66 }}
                }
                &-failed {
                    &[class *= 'dropdown'], svg { c: 0 v16 }
                    &:not(#z), &[data-toggle] { svg { g: v16 }}
                }
                &-pending, &-waiting-for-resource,
                &-failed-with-warnings, &-success-with-warnings {
                    &[class *= 'dropdown'], svg { c: 0 v26 }
                    &:not(#z), &[data-toggle] { svg { g: v26 }}
                }
                &-created, &-skipped {
                    &[class *= 'dropdown'], svg { c: 0 fg3 }
                    &:not(#z), &[data-toggle] { svg { g: fg3 }}
                }
                &-manual, &-canceled, &-disabled, &-scheduled, &-not-found {
                    &[class *= 'dropdown'], svg { c: 0 fg5 }
                    &:not(#z), &[data-toggle] { svg { g: fg5 }}
                }
            }

            /// Reset background.
            /button[class *= 'ci-status-icon-'] { c: 0 0 bg1 }
        }
    }

    // Global -> Custom checkbox/radio inputs.
    input {
        r       = unquote
        prefix  = 'data:image/svg+xml;utf8,'
        arrows  = prefix + '<svg xmlns="http://www.w3.org/2000/svg" '
        prefix += '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">'
        arrows += 'width="101" height="101" view-box="0 0 101 101" preserveAspectRatio="none">'

        &[type='radio'],
        &[type='checkbox'] {
            &:hover { box-shadow: none i }
            &, &:focus, &:hover:active {
                -webkit-appearance: none i
                -moz-appearance: none i
                appearance: none i
                cursor: pointer i
                height: 1rem i
                width: 1rem i
                border: 1px solid bg5 i
                background-size: cover i
                c: fg1 0 bg2
            }

            /// Custom checkbox/radiobox. #168
            &.custom-control-input {
                &:checked ~ label::before { c: 0 v08 v04 }
                &:focus ~ label::before { b: 0 0 0 0.2rem v01 }
                ~ label::before { c: 0 bg5 bg2 }
            }
        }

        /// Checkboxes.
        &[type='radio'] {
            border-radius: 100% i
            &:checked {
                z = '<circle cx="256" cy="256" r="128" fill="white"/>'
                background-image: s("url('%s%s</svg>') %s", r(prefix), r(z), i)
                &:checked { c: 0 v08 v04 }
            }
        }

        &[type='checkbox']:checked {
            z ='<path fill="white" d="M99 213l-1 89 104 102 205-201v-91L203 315 99 213z"/>'
            background-image: s("url('%s%s</svg>') %s", r(prefix), r(z), i)
            c: 0 v08 v04
        }
        &[type='checkbox']:indeterminate {
            z = '<rect x="128" y="192" width="256" height="96" fill="white"/>'
            background-image: s("url('%s%s</svg>') %s", r(prefix), r(z), i)
            c: 0 v18 v15
        }

        /// Sort arrows.
        /[aria-sort='ascending'] {
            x = s('<path fill="%s" d="M51 1l25 23 24 22H1l25-22z"/>', to_svg($v09))
            y = '<path fill="gray" opacity=".6" d="M51 101l25-23 24-22H1l25 22z"/>'
            background-image: s("url('%s%s%s</svg>') %s", r(arrows), r(x), r(y), i)
        }
        /[aria-sort='descending'] {
            x = '<path fill="gray" opacity=".6" d="M51 1l25 23 24 22H1l25-22z"/>'
            y = s('<path fill="%s" d="M51 101l25-23 24-22H1l25 22z"/>', to_svg($v09))
            background-image: s("url('%s%s%s</svg>') %s", r(arrows), r(x), r(y), i)
        }

        /// Down chevron.
        /.swagger-ui select,
        /.select2-arrow {
            x  = 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" '
            x += s('viewBox="0 0 48 48" width="34" height="34" stroke="%s" ', to_svg($fg3))
            x += 'stroke-width="3" stroke-linecap="round" stroke-linejoin="round" '
            x += 'fill="none"><polyline points="6 9 12 15 18 9"></polyline></svg>'
            background: s("url('%s') 10px 9px %s", r(x), i)
        }

        /// Checkmarks.
        /#notifications-button + ul li .is-active,
        /.dropdown-menu-selectable > .gl-new-dropdown .is-active,
        /.dropdown-menu-toggle + .dropdown-menu-selectable li .is-active {
            x  = 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" '
            x += 'viewBox="0 0 48 48" width="32" height="32" stroke-width="3" '
            x += 'stroke-linecap="round" stroke-linejoin="round"><polyline '
            x += s('stroke="%s" points="20 6 9 17 4 12"></polyline></svg>', to_svg($v09))
            background-image: s("url('%s') %s", r(x), i)
            background-position: 14px 8px
            background-repeat: no-repeat
        }

        /// Issues -> Import CSV | Projects -> Import manifest.
        &[type='file'][id] {
            filter: invert(0.8) hue-rotate(180deg)
            c: 0 0 t
        }
    }

    // Admin.
    /{
        /// -> Performance bar.
        .with-performance-bar {
            .production {
                c: 0 0 bg;
                box-shadow: inset 0 -1px bd i;
            }
            /// Queries -> Rounded corners.
            .backtrace-row { rad: 4px }
            /// Bar -> Menu.
            select {
                border: 1px solid bd i;
                c: fg 0 hl;
            }
            /// Feat -> Navbar height option.
            if (nb_height) {
                .layout-page, .content-wrapper  { margin-top: 85px i }
            }
        }
    }

    // Global -> Navbar.
    .navbar {
        display: flex
        align-items: center

        /// Wrapper.
        &-gitlab, &&-empty {
            border-bottom: 1px solid bg5 i
            c: 0 0 bg2
        }

        /// Logo.
        .title {
            > a {
                margin: 4px 2px 4px -8px i;
                &[href='/'] {
                    &:hover { c: 0 0 bg3 }
                    &:active, &:focus { c: 0 0 bg4 }
                }
            }
            .logo-text svg { fill: fg i }
        }
        /// Feat -> Show canary badge.
        if (!nb_canary) {
            .canary-badge { display: none i }
        } else {
            .canary-badge > .badge { c: white green green }
        }

        /// Lists.
        ul[class] {
            c: cm;
            > li {
                > button, > a {
                    &, > svg { transition: 0.2s ease }
                    &[data-toggle] { c: fg3 }
                    &:hover:not([aria-expanded='true']) {
                        c: fg2 0 bg3
                        > svg { g: fg2 }
                    }
                }
                /// Active menus.
                &.active, &.active:hover, &.show {
                    > button, > a {
                        c: fg1 0 bg4
                        > svg { g: fg1 }
                    }
                }
                > *:focus { c: fg2 0 bg4; svg { g: currentColor } }
                .caret-down { g: cm }
                .nav-link { c: fg1 }
            }

            /// Added in GitLab v14.0.
            .top-nav-menu-item {
                &:hover, &:focus { c: 0 0 bg3 }
                &.active { c: 0 0 bg4 }
            }

            /// 'Edit status' button.
            .current-user + li + li > .btn-link { c: fg3 }
        }
        /// Help menu.
        .header-help li:first-child {
            /// Divider-like margin.
            > a { margin-top: 0.25rem }
            /// Embed theme version.
            &::before {
                content: var(--version)
                display: block;
                padding: 4px 12px 6px;
                border-bottom: 1px solid bd;
                color: fg;
            }
            /// Added in GitLab v13.8.
            /.notification-dot {
                c: 0 bg2 fg3
                /.show > a & { c: 0 bg4 fg1 }
                /.whats-new-notification-count { c: fg1 0 bg4 }
            }
        }
        /// User menu -> Reset avatar.
        .header-user-avatar {
            border: none i;
            c: cm 0 t;
            rad: var(--avatar);
        }
        /// Sign in / register.
        .btn-sign-in { color: fg2 }
        /// Feat -> Increase navbar height.
        if (nb_height) {
            min-height: 50px;
            /.nav-sidebar { top: 50px }
            /.layout-page, /.content-wrapper  { margin-top: 50px }
            /// Dropdown menu tweaks.
            .show > .dropdown-menu { margin-top: 8px i }
            .search-input-container .dropdown-menu { margin-top: 14px i }
        }
        /// 'Skip to content' button.
        /.gl-accessibility:focus { c: fg 0 bd }
        /// Mobile -> Toggle colors.
        &-toggler {
            border-left-color: bd i;
            svg { g: cm }
        }
        /// Dark mode tweaks.
        .search-form {
            > form { b: none i }
            &:focus-within > form { b: 0 0 0 0.2rem v63 i }
            &.search-active > form { c: 0 v65 }
        }
        &-gitlab { box-shadow: none i }
        /// Fix 'down-arrow' size. @upstream
        svg.s16[data-testid='angle-down-icon'] { width: 11px }

        /// Navbar -> Fix whitespace on GitLab 10.4. OBSOLETE
        > div {
            margin: 0 auto i
            padding: 0 i
            width: 100% i
            display: flex i
            align-items: center i
            justify-content: center i
            > .header-content { width: 100% }
        }
    }

    // Global -> Tables.
    table {
        /// Base styles.
        &:not(.code) {
            c: fg1
            th { c: fg1 0 bg2 }
            th, td { c: 0 bg5 }

            /// Reset colors.
            thead { c: 0 bg5 }
            tbody { c: 0 0 t }
        }

        /// Reset stacked tables. !41
        &[class*='table-stacked'] {
            thead[role='rowgroup'] th { border-top: 1px solid bg5 }
            @media (max-width: 991.98px) {
                tr[role='row'] > td[aria-colindex='1'] { c: 0 0 bg2 }
            }
        }

        /// Admin -> SQL queries.
        > tr {
            td { c: 0 bd }
            &:first-child > td { border-top: none }
        }

        /// AsciiDoc resets.
        &.grid-all {
            > caption { padding: 10px 16px; c: fg3 0 bg2 }
            > tbody > tr {
                /// Reset cells.
                > th:first-child {
                    border-top: none i
                    border-bottom: 1px solid bg5 i
                }
            }
        }

        /// Settings -> Striped tables.
        &.table-striped, &.active-tokens, &.pipeline-project-metrics {
            border: 1px solid bd;
            thead > tr > th { border-top: none }
            tbody tr {
                &:nth-of-type(2n+1) > td { c: 0 0 bg0 }
                /// Analytics -> Issues.
                &:not(:first-child) > td.issues-analytics-td {
                    &, ~ td { border-top: none i }
                }
            }
        }

        /// Markdown areas.
        /// NOTE: Authorized apps, AsciiDoc, Markdown.
        // &.table-bordered,
        &.table-striped,
        &.grid-all,
        &[dir] {
            overflow: hidden
            border-spacing: 0
            border-collapse: collapse
            max-width: max-content
            position: relative
            c: fg1 t bg1
            rad: 4px i

            /// HACK: Add rounded corners.
            &::before {
                o = 0px
                content: ''
                position: absolute
                top: o; right: o; bottom: 0; left: 0
                pointer-events: none i
                border: 1px solid bg5
                rad: 4px
            }

            /// Resets.
            thead th {
                border-bottom-width: 1px i
                c: 0 bg5 bg2
             }
             tbody {
                c: 0 0 t
                tr > td { c: 0 bg5 bg1 }
                // tr:nth-child(2n) > td { c: 0 0 bg2 }
             }
         }

        /// Project -> Files.
        &.tree-table {
            border-spacing: 0
            border-collapse: unset
            border: 1px solid bg5 i
            rad: 4px i
            c: 0 0 bg1

            /// Items.
            thead tr {
                > th { border-top: none i }
                > th:first-child { border-top-left-radius: 4px i }
                > th:last-child { border-top-right-radius: 4px i }
            }
            tbody {
                tr {
                    > td {
                        border-top: 1px solid bd i
                        border-bottom: none i
                    }
                    &:hover > td { c: 0 0 bg2 }
                    &:last-of-type {
                        > td:first-child { border-bottom-left-radius: 4px i }
                        > td:last-child { border-bottom-right-radius: 4px i }
                    }

                    /// Fix selected row. #161
                    &.selected td { c: 0 0 bg3 }
                    ../../.files-slider tr:first-child td { border-top: none i }
                }
            }

            /// Text colors.
            /.tree {
                &-item-file-name { &, a, i { c: fg1 }}
                &-commit { &, &-link { c: fg3 }}
                &-time-ago { c: fg3 }
            }
        }

        /// Project -> Security.
        /.vulnerability-list thead th { box-shadow: 0 1px bd i }

        /// Project -> Settings -> Badges.
        /.gl-responsive-table-row {
            c: fg3
            &:not(:last-child) { c: 0 bg3 }
            &-clickable:hover { c: 0 0 hl }
            /// Settings -> Usage quotas -> Storage.
            &.bg-gray-light { c: 0 0 bg 0 }
            &-clickable:hover { c: 0 0 bg2 }
        }

        /// Project -> Pipelines.
        /.ci-table {
            margin-top: 10px;
            border: 1px solid bd;
            c: fg1 0 bg1
            rad: 4px;
            [class *= 'header'] {
                padding: 12px 16px;
                font-size: 14px
                c: fg1 bg5 bg3
                rad: 3px 3px 0 0;
            }
            [class $= 'table-row'] {
                padding: 8px 16px;
                c: fg bd bg;
                &:last-child {
                    border-bottom: none i;
                    rad: 0 0 3px 3px;
                }
                &:hover { c: 0 0 bg2 }
            }
            .pipeline-actions { padding-right: 16px }
            /.js-run-mr-pipeline { margin-right: 16px }
            /// Project -> Jobs -> Fix icons and table cells. #98
            .sprite { g: cm }
            > tbody > .build {
                + tr + tr > th { b: inset 0 1px bg5 i }
                > td { border-top: 1px solid bd i }
                &:hover { c: 0 0 bg2 }
            }
            /// Text colors.
            .commit-sha, .gfm-commit { c: ac }
            .ref-name,
            .pipeline-id, .table-mobile-header,
            .build-link, .build-name a {
                c: fg;
            }
            /.duration,
            /.finished-at {
                c: cm;
                svg path { g: cm }
            }
            /// Jobs -> Pipelines.
            &.pipeline tbody {
                > tr > th { c: fg bd bb }
                > tr > td { border-top: 1px solid bd i }
            }
            /// Icons -> Fix background.
            path[fill = '#FFF'] { g: hl }
            /// Pipelines -> Jobs. #125
            .build.retried { c: 0 0 bb }
            /// Schedules -> Links. #163
            .pipeline-schedule-table-row {
                .next-run-cell { c: fg3 }
                a { c: fg1 }
            }
        }

        /// Project -> CI/CD -> Variables.
        /.ci-variable-table table {
            colgroup col:nth-child(7) { width: 50px i }
            tr th, tr td { &:first-child { padding-left: 16px }}
        }

        /// Project -> Import.
        &.import-table {
            border: 1px solid bd i;
            thead th { border: none i; c: 0 0 hl }
            tbody {
                tr:hover td { c: 0 0 bb }
                td { border-top: 1px solid bd i }
            }
            /.import-slash-divider { c: 0 bd bb }
            /// Project -> Import in progress.
            /.save-project-loader { c: cm }
        }

        /// Reset misc tables.
        &.integration-list { border: none }
        &.shortcut-mappings th { c: 0 0 t }

        /// Who cares about semantic HTML anyways? #88 @upstream
        td.d-sm-block { display: table-cell i }
    }

    // Global -> Dropdowns.
    [class*='dropdown-menu'] {
        $t = color, border, background
        c: fg1 bg5 bg2 0 0 0

        /// Toggle button.
        &[type] {
            c: fg1 bg5 bg2 0 0 0
            transition: $t 0.2s ease

            /// States.
            &:hover { c: 0 0 bg3 0 0 0 }
            &:focus { c: 0 bg5 bg4 0 0 0 }
            &[aria-expanded='true'] {
                c: 0 bg5 bg4 0 0 0
                b: 0 0 0 1px bg1, 0 0 0 0.25rem v64 i
            }

            /// New SVG icons.
            ../[data-testid*='chevron'] { c: 0 0 t }

            /// OBSOLETE: Old toggle buttons in nav blocks.
            /.dropdown > button.dropdown-toggle {
                &:not(.gl-button) {
                    c: fg1 bg5 bg1
                    &:hover { c: 0 0 bg3 }
                    &:focus { c: 0 bg5 bg4 }
                }

                /// Issues -> Three dots menu.
                &-no-caret { c: 0 0 t }
            }
        }

        /// Menu.
        &.show {
            rad: 4px
            c: 0 bg5 bg2 0 0 0
            b: var(--bshadow)
        }

        /// Active styles.
        /.show.dropdown {
            > .btn { c: 0 bg5 bg4 0 0 0 }
            /// Exclude colored buttons.
            > button[class*='dropdown-']:not([class*=' btn-']) { c: 0 bg5 bg3 }
        }

        /// Shared styles.
        .dropdown {
            &-loading { c: 0 0 hl; opacity: 0.9 }
            &-title, &-header { c: fg0 bg5 }
            &-info-note { c: fg3 }
            &-footer { c: 0 bg5 }

            /// NOTE: New issue 'type' menu. @upstream
            &-toggle-text.is-default { c: fg1 }

            /// Boards -> Add list.
            &-tab {
                &s-list { b: none i }
                &-item {
                    padding: 0 i
                    c: 0 bg5

                    /// Reset items.
                    a {
                        border-width: 1px i
                        c: 0 bg5 bg1
                        &.active { c: fg1 t bg2 }
                    }
                }
            }

            /// Inputs.
            &-input-field {
                rad: 4px
                c: fg1 bg5 bg1
                &:focus { c: 0 v65; b: 0 0 0 0.2rem v63 }
            }
        }

        /// Overrides for items.
        & {
            [class*='separator'] { c: 0 0 bg5 }
            [class*='divider'] { c: 0 bg5 bg5 }
            [class*='-content'] { c: fg3 0 t }
            [class*='-title'] { c: fg0 0 t }
            .search-item-avatar { c: 0 bg5 }
            strong, .bold, .text { c: fg1 }
            .btn-helptext { c: fg5 }

            li {
                /// Remove 1px padding on the sides.
                padding-left: 0
                padding-right: 0

                /// Items.
                /// 3: Navbar -> User -> Edit status.
                > a, button, .menu-item {
                    color: fg3
                    &.is-active { c: fg1 }

                    /// Hover state.
                    /// TODO: Tweak these things.
                    &:focus,
                    &:active,
                    &:not(.disable-hover):not(.active):hover {
                        c: fg1 0 bg3 //0 0 0
                    }

                    /// NOTE: Might cause conflicts somewhere.
                    &.is-focused {
                        &, &:hover:not(#z) { c: fg1 0 bg4 }
                    }
                    &.is-active:not(#z) { c: v09 }
                }

                /// Remove focus ring.
                button:focus { b: none i }

                /// New GitLab dropdowns.
                p { c: fg3 }
            }
        }

        /// Navbar -> Projects/groups.
        /.frequent-items-dropdown {
            &-sidebar { c: 0 bg5 }
            &-container {
                li { padding: 0 1px }
                [class*='-item-title'] { c: fg1 }
                [class*='-namespace'] { c: fg4 }

                /// Fix text for header and no results.
                .section { &-header, &-empty { c: fg4 }}
            }
        }

        /// Navbar -> To-do list menus.
        /.dropdown-menu-user {
            &-link:not(:hover) { strong, span { c: fg3 }}
            &-name, &-full-name, &-username { c: 0 0 t }
        }

        /// Navbar -> User menu.
        li.current-user {
            c: fg1
            .bold, .user-status { c: fg1 }
        }

        /// Buttons -> Reset hover styles.
        &.more-actions-dropdown button:not([disabled]) {
            c: fg3
            &:hover, &:active { c: fg1 0 bg3 }
            &:focus { c: fg1 0 bg4 }
        }

        /// Pipelines -> Grouped pipeline menu counter/caret.
        [class*='counter-badge'] { font-weight: normal; c: fg3 }
        &[class*='mini-pipe'], &[class*='big-pipe'] {
            &::before, &::after { c: 0 t }
        }

        /// Select2 component.
        /.select2 {
            &-choice { &, &s { c: fg1 bg5 bg2 }}

            /// Down chevron.
            &-chosen {
                margin-right: 25px i
                padding-right: 10px
            }
            &-arrow {
                padding: 0 16px
                width: unset
                c: 0 bg5 t
            }

            &-container {
                /// Focused state.
                &&-active:not([class*='dropdown-open']) > .select2-choice {
                    b: 0 0 0 0.2rem v63 i
                    c: 0 v66 bg3
                }

                /// Active states.
                .select2-choice:hover { c: 0 0 bg3 }
                &.select2-dropdown-open > .select2-choice {
                    c: 0 0 bg3
                    .select2-arrow { border-left: 1px solid bg5 i }
                }

                /// Disabled state.
                &-disabled {
                    .select2-arrow { opacity: 0.6 }
                    > a { c: fg5 bg3 bg1 }
                }
            }

            /// Results.
            &-drop {
                c: fg1 bg5 bg2
                b: var(--bshadow)

                /// Header/items/highlight.
                ../-results div { c: fg0 }
                ../-result-sub div { c: fg3 }
                ../-highlighted {
                    c: fg1
                    div { c: fg1 0 bg3 }
                }
            }

            /// NOTE: Ported and untested.
            &-arrow::after { c: fg4 }
            &-match { c: v09 }
            &-input {
                font-family: var(--ui-font) i
                c: fg1 bg5 t
            }

            /// Fix flash of browser-default select elements.
            /select {
                border: 1px solid bg5
                c: fg 0 bg2
            }
        }

        /// OBSOLETE: Old 'download' menu, and likely others.
        /.dropdown .btn[data-toggle='dropdown'] {
            .fa, svg { color: fg4 }
            ../ .border-top { c: 0 bg5 }
        }

        /// Reset height overflow. @upstream
        /[data-page^='search:'],
        /[data-page^='projects:'],
        /[data-page^='dashboard:'] {
            .dropdown-menu[class*='select'] { max-height: 420px i }
        }
    }

    // Global -> Buttons.
    .btn {
        $f = 0 0 0 1px bg1, 0 0 0 0.25rem

        /// Consistent button styles.
        &.gl-button {
            b: none i
            border: 1px solid t
            c: fg1 bg5 bg2 0 0 0
        }

        /// Default styles.
        & {
            c: fg1 bg5 bg2 0 0 0
            &:hover { c: fg1 bg5 bg3 0 0 0 }
            &:focus { c: fg1 bg5; b: $f v64 i }
            &:active { c: fg1 bg5 bg4 0 0 0 }
            &[href].gl-link { color: fg1 }
        }

        /// Active buttons.
        &.active,
        &.selected,
        &.is-active {
            c: fg1 bg5 bg4
        }

        /// Highlighted buttons.
        &-default,
        &-cancel {
            c: fg1 bg5 bg2
            &:hover { c: 0 0 bg3 }
            &:focus { b: $f v64 i }
        }

        /// Background-color buttons.
        &-comment-and-close:not(#z),
        &-secondary {
            c: fg1 bg5 bg1
            &:hover { c: 0 0 bg3 }
            &:focus { c: 0 0 bg4; b: $f v64 i }
        }

        /// Red.
        &-remove,
        &-danger {
            c: v98 v15 v13
            &:hover { c: v99 v16 v14 }
            &:focus { c: v99 v17 v15; b: $f v12 i }
            > .fa, > svg { c: currentColor; g: currentColor }
        }

        /// Green.
        &-register,
        &-success {
            c: v98 v45 v43
            &:hover { c: v99 v46 v44 }
            &:focus { c: v99 v47 v45; b: $f v42 i }
            > .fa, > svg { c: currentColor; g: currentColor }
        }

        /// Blue.
        &-info,
        &-confirm,
        &-primary {
            c: v98 v65 v63
            &:hover { c: v99 v66 v64 }
            &:focus { c: v99 v67 v65; b: $f v63 i }
            > .fa, > svg { c: currentColor; g: currentColor }
        }

        /// Orange.
        &-close,
        &-close-color,
        &-warning {
            c: v98 v25 v23
            &:hover { c: v99 v26 v24 }
            &:focus { c: v99 v27 v25; b: $f v23 i }
            > .fa, > svg { c: currentColor; g: currentColor }
        }

        /// Red outline.
        &-danger-secondary {
            c: v16 v15 bg1
            &:hover { c: v16 0 v11 }
            &:focus { c: v18 v15 bg1; b: $f v12 i }
        }

        /// Green outline.
        &-success&-inverted,
        &-success-secondary {
            c: v46 v45 bg1
            &:hover { c: v48 0 v41 }
            &:focus { c: v48 v45 bg1; b: $f v42 i }
        }

        /// Blue outline.
        /// 1: Project -> Milestones.
        /// 2: Account -> Billing page.
        /// 3: TODO: Figure out where this was used. XD
        /// 4: MR -> Mark as draft.
        &-info-secondary,
        &-inverted-secondary,
        &-primary&-inverted,
        &-confirm-secondary {
            c: v66 v65 bg1
            &:hover { c: v68 0 v61 }
            &:focus { c: v68 v65 bg1; b: $f v63 i }
        }

        /// Orange outline.
        &-warning-secondary {
            c: v26 v25 bg1
            &:hover { c: v28 0 v21 }
            &:focus { c: v28 v25 bg1; b: $f v22 i }
        }

        /// Accent.
        &#clone-dropdown {
            c: v98 v05 v03
            &:hover { c: v99 v06 v04 }
            &:focus { c: v99 v07 v05; b: $f v02 i }
            > svg { g: v98 }

            /// Reset menu input styles.
            + ul input {
                font-family: var(--mono-font)
                c: 0 0 bg1
            }
        }

        /// Disabled icons.
        /// TODO: Add more 'disabled' selectors.
        &.disabled,
        &[disabled] {
            c: fg5 bg3 bg1
            svg { fill: currentColor i }
            &:focus { b: none i }
        }

        /// Link buttons.
        /// TODO: Update outline with v2 accent color.
        &-link,
        &.gl-link:not([href]) {
            color: v09
            &:hover, &:active, &:focus { color: v07 }
            &:focus { c: 0 0 t; b: none i }

            /// Remove default border/background colors.
            &[href] { c: 0 t t 0 0 0 }

            /// Notes -> 'Compare with previous version.'
            &.gl-button { c: v09 }
        }

        /// Transparent buttons.
        &&-clipboard,
        &&-transparent,
        &&-default-tertiary {
            c: 0 t t
            &:hover > svg { g: fg1 }

            /// MR -> Reset clipboard button.
            /button[data-clipboard-text]:not(#z) { c: 0 t t }
        }

        /// Close buttons.
        /button.close:not(#z) {
            transition: 0.2s ease
            c: 0 0 t

            &:hover { border: 1px solid }
        }

        /// Inherit colors for dropdown icons.
        &.btn-icon[data-toggle=dropdown] svg {
            color: inherit
        }

        /// Button groups.
        /.input-group {
            &-append, &-prepend {
                c: 0 0 t

                > [class*='-text'] { c: fg1 bg5 }

                /// Button states.
                .btn:focus { c: fg1 bg5 bg2; b: $f v64 i }
                .btn:active { c: fg1 bg5 bg4 0 0 0 }
            }
        }

        /// Project -> Repository buttons.
        &.count-badge-button {
            /.project-repo-buttons {
                .count { c: 0 0 bg3 }

                /// Reset button styles.
                .btn {
                    padding: 6px 10px i

                    /// Button size.
                    &-sm, &-xs, &-xs + span {
                        height: 32px i
                        font-size: 14px i
                    }

                    /// Notifications menu.
                    svg {
                        g: fg3
                        &.s12 { width: 16px; height: @width }
                    }

                    /// Project -> Notifications menu.
                    &.dropdown-toggle:not(#z) {
                        c: 0 0 bg2
                        &:hover { c: 0 0 bg3 }
                    }

                    /// Implemented in GitLab 13.8. @upstream
                    ../ .has-tooltip + .fork-count { height: 32px i }

                    /// OBSOLETE: Buttons/clone bar in GitLab 10.4.
                    ../ input { height: 34px i }
                }

                /// Button colors.
                .count {
                    c: fg1
                    &-badge-count { c: 0 bg5 bg3 }
                    &-badge:last-of-type { margin-right: 0 }

                    /// OBSOLETE: Arrow-buttons on GitLab 10.4.
                    &-with-arrow {
                        .arrow::before { border-right-color: bg5 }
                        .arrow::after { border-right-color: bg2 }
                        .count { c: 0 bg5 bg2 }
                    }
                }
            }
        }

        /// Project -> Toggle commit message.
        /.text-expander {
            padding: 3px 5px
            c: fg4 bg5 bg2
            &:hover { c: 0 0 bg3 }
            &.open { c: fg1 0 bg4; b: none }
        }

        /// Project -> Reset border for clipboard/sha groups.
        /.clipboard,
        /.commit-sha {
            /// Remove focus from commit SHA buttons.
            ../-label { &:hover, &:focus { c: 0 0 t; b: none i }}
        }

        /// Project -> Download dropdown.
        &-xs[download] {
            padding: 8px 10px
            background-color: bg0
            &:hover { background-color: bg3 }
        }

        /// Snippets -> Add another file.
        /// Project -> Add missing files.
        &-dashed,
        &-missing {
            c: fg3 bg5 bg2
            outline-color: t i
            border-style: dashed i
            &:hover { c: 0 0 bg3 }
            &:focus { c: 0 0 bg4 }
            &.disabled { c: 0 0 bg1 }
        }

        /// Project -> Signed commits.
        &.gpg-status-box {
            &:focus { b: none i }
            &.valid {
                c: v46 v46 bg1
                &:hover { c: 0 0 v41 }
            }
            &.invalid {
                c: fg4 bg3 bg1
            }
        }

        /// OBSOLETE: Notes -> Calendar icon.
        &[href*='.ics'] path { g: fg4 }

        /// Notes -> Reactions.
        &.selected[data-testid='award-button'],
        &.award-control {
            &.active {
                c: ac v05 v02
                &:hover { c: 0 0 v03 }
                &:focus { b: $f v01 i }
            }

            /// Added in GitLab v13.8.
            /.awards > .gl-button.selected {
                c: ac v05 v02
                &:hover { c: 0 0 v03 }
                &:focus { b: $f v01 i }
            }

            /// Remove disabled state. OBSOLETE
            &.disabled:hover { c: fg5 bg3 bg1 }
        }

        /// Notes -> Reply to a discussion.
        &&-text-field {
            c: fg3 bg5 bg3
            &:hover { c: 0 0 bg1 }
        }

        /// Settings -> Connected accounts.
        /.provider-btn {
            line-height: unset
            rad: 0 4px 4px 0
            c: fg1 0 bg2
            &-group {
                rad: 4px
                c: 0 bg5 bg2
            }
            &-image {
                rad: 4px 0 0 4px
                c: 0 bg5 bg3
            }
        }

        /// Project -> Merge Request analytics.
        /// NOTE: Bring borders back to the dropdown menu.
        &[id*='_toggle_'] { border-style: solid i }

        /// Remove `mix-blend-mode` for tertiary buttons. #152
        &-info-tertiary,
        &-success-tertiary,
        &-danger-tertiary,
        &-warning-tertiary,
        &-dashed-tertiary,
        &-default-tertiary {
            mix-blend-mode: unset i
        }
    }

    // Global -> Labels.
    .label {
        &&-monospace, /.btn-label.gl-font-monospace { c: fg1 bg5 bg3 }
        /// Issues/MRs/Epics -> Scoped labels.
        &.scoped-label .fa-question-circle {
            c: 0 0 t;
            &[style *= '#FFFFFF'] { c: white }
            &[style *= '#333333'] { c: black }
        }
        /// Remove badge underline.
        &-link { &, .badge { text-decoration: none i }}
        /// Project -> Lables.
        &-badge {
            c: fg;
            &-blue { c: white 0 blue }
            &-gray { c: cm 0 hl }
        }
        &-links a { c: ac }
        &-action svg { g: cm }
        /// Project labels -> Subscribe buttons. @upstream
        &-subscribe-button { font-weight: 400 }
        /// Project -> File -> LFS file badge.
        &-lfs { c: fg bd bg }
    }

    // Global -> Badges.
    .badge {
        &.issues-count { c: v99 0 v45 }
        &.merge-requests-count { c: v99 0 v25 }
        &.todos-count { c: v99 0 v65 }
        &-pill {
            c: fg3 0 bg3

            /// Navbar -> Merge requests menu.
            &.merge-request-badge { c: fg2 0 bg4 }

            /// Navigation items counter.
            /// NOTE: Exclude navbar counters.
            /.active:not(.user-counter) & { c: fg1 0 bg5 }

            /// Project -> Tags.
            &.badge-secondary {
                c: fg3 0 bg2
                &:hover { c: fg1 }
            }
        }
        /// Project -> Pages -> Domains.
        &&-gray { c: fg1 0 bg3 }
        /// Notes -> Related issues/MRs.
        /.issue, /.mr { &-count-badge { c: fg1 0 t }}
        /// HACK: Reset colored labels.
        &.color-label {
            box-shadow: inset 0 0 0 1rem #33333370;
            &:hover { box-shadow: none i }
            &[style *= 'color: #333333'] {
                c: black;
                box-shadow: inset 0 0 0 1rem #33333325;
            }
        }

        /// Colored badges.
        &-primary, &-info, &-active { c: v99 0 v63 }
        &-secondary, &-inactive { c: fg4 0 bg2 }
        &-warning { c: v99 0 v24 }
        &-success { c: v99 0 v44 }
        &-danger { c: v99 0 v14 }
        &-light { c: fg3 0 bg3 }
        &-dark { c: fg1 0 bg4 }

        /// Settings -> Un/verified badges.
        &.unverified {
            c: fg5 fg5 bg1
            &:hover { c: bg3 fg5 fg5 }
        }
        &.verified {
            c: v45 v45 bg1
            &:hover { c: v99 v43 v43 }
        }

        /// Notes -> Issue status.
        /.status-box {
            c: v99
            &-issue-closed, &-mr-merged { c: 0 0 v65 }
            &-closed, &-mr-closed { c: 0 0 v15 }
            &-upcoming { c: fg1 0 bg5 }
            &-expired { c: 0 0 v25 }
            &-open { c: 0 0 v45 }
            > svg.s16 { g: v99 }
        }
    }

    // Global -> Forms.
    .form-control, .search form {
        c: fg bd hl;
        border: 1px solid bd i;
        &:focus, &.focus {
            c: 0 blue;
            b: 0 0 0 0.2rem v63 i
        }
        &[disabled = 'disabled']:not(#z) { opacity: 0.5 }
        /// Overwrites for navbar and top nav.
        /.navbar & { c: 0 0 bg3 }
        /.top-area & { height: 35px }
        /// Navbar -> Fix 'search' dropdown. @upstream
        #search {
            c: fg 0 t;
            box-shadow: none i;
            ~ [class *= 'dropdown-menu'] .is-active { c: fg }
            /// Search -> Gradient. NOTE: Type 's' to see it.
            /.dropdown-content-faded-mask::after {
                background: linear-gradient(to top, hl, t) i;
            }

            /// OBSOLETE: Navbar -> Search on GitLab 10.4.
            /.search.has-location-badge {
                margin-top: 3px

                /// Reset form.
                > form {
                    height: 34px
                    b: none i
                }

                /// Reset badge.
                .location-badge {
                    height: 32px
                    c: fg4 0 bg3
                    b: 1px 0 bg5 i
                }
            }
        }
        /// Fix icon color.
        .search-icon { g: cm }
        /// Snippets -> New.
        /.form-actions { c: 0 bd t }
        /// Settings -> Reset background.
        &.select-control { c: 0 0 hl }
        /// Search -> Dropdown height. @upstream
        /.form-group button[class*='dropdown'] { height: 34px i }
    }

    // Global -> Auto-complete menu.
    .atwho-view {
        c: cm bd bg;
        box-shadow: bsh;
        .atwho-view-ul li {
            c: fg;
            /// Matching text.
            strong { c: ac }
            /// Light text.
            small, .params { c: cm }
            /// Selected.
            &:hover, &.cur { c: fg 0 hl }
        }
    }

    // Global -> Lists.
    ul.content-list {
        li {
            c: fg1 bg3
            a { c: fg }
            /// Metadata.
            .commit-sha { c: ac }
            /.item-meta * { c: cm }
            /// Dashboard -> Todos -> Fix links.
            .todo { &-label, &-project { a { c: ac }}}
            /// Groups -> Hover animation.
            .group-row-contents {
                &:hover { c: 0 0 hl }
                .metadata { span, div { c: cm }}
                /.has-no-search-results { c: cm }
            }
            /// Profile -> Groups.
            &.group-row {
                .description p, .stats { c: fg3 }
            }
            /// Hover animation.
            &.issue, &.merge-request, &[id *= 'epic'] {
                &:hover { c: 0 0 hl }
            }
            /// Project -> Compare -> List items.
            ../:not(.event_commits) > li.commit:hover { c: 0 0 bg2 }
        }
        /// Project -> Branches.
        &.all-branches {
            .graph { &-side .bar, &-separator { c: 0 0 bd }}
            .branch-item:hover { c: 0 0 bg2 }
            .commit-sha { c: ac }
            .cgray { c: cm }
        }

        /// Project -> Issues / Merge Requests.
        &.issuable-list {
            .today {
                c: 0 0 v40
                &:hover { c: 0 0 v41 }
            }
            .closed, .merged { c: 0 0 bg2 }
            .issuable {
                ../ .fa:not(.fa-question-circle), ../ .task-status { c: fg3 }
                &-milestone, &-info, &-updated-at { c: fg3 }
                /// Email a new issue/MR to this project.
                /^[-1..-1]-email-modal-btn { c: ac }
            }
            /// Unmerged MR icon color. @upstream
            /.icon-merge-request-unmerged { filter: invert(0.7) }
            /// Manual ordering. #136
            &.manual-ordering {
                c: 0 0 hl
                > .issue { c: 0 bd bg }
            }
        }
        /// Project -> Requirements -> Remove hover bg.
        &.requirements-list > li:not([class*='gl-bg']):hover { c: 0 0 t }
        /// Project -> Members.
        &.members-list {
            li {
                c: 0 0 bb;
                &:hover { c: 0 0 hl }
            }
            /// Fix search icon. #80
            /input.form-control + button { border-color: bg5 }
        }
        /// Dashboard -> Snippets.
        .snippet { &-filename, &-info { c: cm }}
    }

    // Global -> Left sidebar.
    .nav-sidebar {
        border-right: 1px solid bg5
        c: 0 0 bg2
        b: none i


        /// Added in Gitlab v14.0.
        &[data-track-action]:not(#z) {
            /// Fix top offset.
            if (nb_height) { top: 50px i }

            ul {
                li > a {
                    margin-right: 6px i
                    b: none i
                    &:hover { c: 0 0 bg3 }
                }

                /// Fix active tree.
                li.active > a {
                    &.has-sub-items { c: ac }
                    &:not(.has-sub-items) { c: 0 0 bg4 }
                }

                /// Remove box shadow.
                li.active { b: none i }

                /// Remove odd white space. @upstream
                .has-sub-items + ul { margin-top: 0rem i }
            }

            /// Reset fly-out menu header.
            .fly-out-top-item-container {
                c: fg1 0 bg3
                &::before { border-right-color: bg4 i }
            }

            /// Add missing border to collapse button.
            .toggle-sidebar-button { b: inset -1px 0 bg5 i }
        }

        /// Header.
        .context-header {
            a { c: fg1 }
            &:hover:not([data-track-label]) { c: 0 0 bg3 }
            .identicon.s40 { line-height: 36px i }
            [class*="avatar"] { b: none i }

            /// New sidebar.
            .sidebar-context-title { c: fg1 }
            &.active {
                c: 0 0 t
                > a { c: 0 0 bg3 }
            }
        }

        /// Items.
        li {
            a {
                margin-right: 0px i
                c: fg3
            }
            svg { g: currentColor }
            .divider { c: 0 bg5 }
            .badge { c: 0 0 bg4 }
            &.active {
                b: inset 4px 0 0 v08 i
                > a { c: ac }
            }
        }

        /// First level.
        .sidebar-top-level-items > li {
            &:not(.active) > a:hover { c: fg1 }
            &.active:not([data-track-label]) {
                c: 0 0 bg3
                > a:hover { c: 0 0 bg4 }
                .badge { c: fg1 0 bg5 }
            }
            &.is-over {
                > a { c: fg1 0 bg3 }
                &.active > a { c: 0 0 bg3 }
            }

            /// Second level.
            &:not(.is-showing-fly-out) > ul > li {
                &:not(.active) > a {
                    &:hover, &:focus {
                        c: fg1 0 bg4
                        b: inset 4px 0 0 v08 i
                    }
                }
                &.active a {
                    c: 0 0 bg4
                    b: inset 4px 0 0 v08 i
                }
            }
        }

        /// Fly-out menu.
        .is-showing-fly-out {
            > ul {
                c: 0 bg5 bg2
                li {
                    b: none i
                    &:not(.active) {
                        > a { c: fg3 }
                        &:first-child > a { c: fg1 }
                    }
                    a { &:hover, &:focus { c: fg1 0 bg3 }}
                }
            }
        }

        /// Collapse buttons.
        .toggle-sidebar-button,
        .close-nav-button {
            c: 0 bg5 bg2
            span, svg { c: fg3 }
            &:hover {
                c: 0 0 bg3
                > span, > svg { c: fg1 }
            }
        }

        /// Fix for a glitch introduced in !47.
        /// NOTE: Sometimes, the JS calculation is not made in time and the very
        /// first column of jobs ends up hidden behind left sidebar. This simple
        /// workaround prevents that, so will always add some padding. You will
        /// be able to tell that this occurred if all the jobs are on the far
        /// left side of the available area, and not centered like usually.
        if (pipelines) {
        &:not(.js-sidebar-collapsed) + .content-wrapper {
            .pipeline-visualization > div[style*='padding-left: 0px'] {
                padding-left: 0px i
                padding-left: 240px i
                // border-left: 300px solid ac i
                // transform: translateX(27.9vw) i
            }
        }
        &.js-sidebar-collapsed + .content-wrapper {
            .pipeline-visualization > div[style*='padding-left: 0px'] {
                padding-left: 0px i
                padding-left: 70px i
            }
        }
        }
    }

    // Global -> Right sidebar.
    .right-sidebar {
        c: 0 bd hl;
        .title { c: fg }
        .block { c: 0 bg4 }
        a:not(.btn):hover { color: v08 }
        .edit-link, .lock-edit, .no-value, a[href = '#'] { c: fg3 }
        button[data-testid='edit-button']:not(#z) { c: fg3 }

        /// Reset buttons and links.
        .btn {
            &-link:not([disabled]) {
                c: v09
                > svg { g: currentColor }
                &.edit-link { &, * { c: fg4 0 t }}
                &.dropdown-menu-close { c: fg3 } // Health status.
            }

            /// 'Move issue' button.
            &.btn-block { border: 1px solid bg5 }

            /// Health status for closed issues.
            &-link[disabled] { c: fg5 t t }
        }

        /// Improve contrast for inputs.
        input.form-control,
        .labels-select-dropdown-button:not(:hover) {
            c: 0 0 bg1
        }
        /// Fix top offset.
        if (nb_height) { top: 50px i }
        /// Pajamas -> Drawer.
        /.gl-drawer {
            c: fg bd bg;
            box-shadow: -1px 0 bd, bsh;
            &-header, &-body > * { c: 0 bd }

            /// Increase top offset when nb_height is enabled.
            if (nb_height) { top: 50px i }

            /// Added in GitLab v13.8.
            &.whats-new-drawer {
                if (nb_height) { top: 10px i }
                .img-thumbnail { c: 0 bg4 bg2 }
                .badge-pill { c: fg2 0 bg3 }

                /// Feat -> Add interop with custom image opacity.
                if (md_img_o < 1) {
                    .gl-link[rel]:not(.whats-new-item-title-link) {
                        opacity: md_img_o
                        transition: opacity 0.5s ease
                        > div { border-radius: 4px }
                        &:hover { opacity: 1 }
                    }
                }
            }
        }
        /// Issues -> Sidebar.
        .issuable-sidebar {
            overflow-y: auto i;
            &-header { c: 0 bg4 } // #172
            &-header, .dropdown {
                .btn-default:not(.gutter-toggle),
                [data-toggle='dropdown'] {
                    c: 0 0 bg1
                    &:hover { c: 0 0 bg3 }
                }
            }
        }
        /// Time tracking. #49
        .time_tracker, .time-tracker {
            .compare-label { c: fg4 }
            .compare-value { c: fg2 }
            .over_estimate { .time-remaining, .spent { c: v17 }}
            .time-tracking-help-state { c: 0 bg5 bg1 }
        }
        /// Jobs -> Builds container. #22
        &.build-sidebar {
            .builds-container {
                c: fg bd bg;
                .build-job {
                    &.retried { c: 0 0 t }
                    &:hover {
                        c: 0 0 bb;
                        a { c: fg }
                    }
                }
            }
            /// Reset colors.
            .blocks-container { a, .btn-link { &:not(.btn) { c: ac }}}
            .btn, [data-toggle = 'dropdown'] {
                c: 0 0 bg1
                &:hover { c: 0 0 bg3 }
                &:focus { c: 0 0 bg4 }
            }
            .btn-default-tertiary { c: 0 0 t }
        }
        /// Epics -> Start/due date.
        .is-option-selected > span { c: cm }
        /// Epics -> Ancestors.
        .vertical-timeline {
            &::before { c: 0 cm }
            &-icon {
                c: 0 0 hl;
                &.opened svg { g: green }
                &.closed svg { g: blue }
            }
            /// Fix link hover event.
            &-content a:hover { c: ac }
        }

        /// Epics -> Labels. #123, #159
        /.labels-select {
            &-wrapper {
                li.is-focused .label-item { c: 0 0 bg4 } // #160
                .label-item { &.is-focused, &:hover { c: fg1 0 bg4 }}
                .gl, .btn { &-link:not(.gl-label-link) { c: fg3 }}
            }
            &-dropdown-contents {
                border: 1px solid bd i;
                c: 0 bd hl;
                box-shadow: bsh i;
                .dropdown { &-title, &-footer { c: 0 bd }}
            }
        }

        /// Issues -> Health status menu.
        .btn-group {
            li .dropdown-item {
                &:hover { c: 0 0 bd }
                &, button.btn { c: 0 0 t }
            }
            /// NOTE: Might break some things.
            /.dropdown-title-button { float: right }
        }

        /// Jobs -> Trigger build variables. #146
        .trigger-build { &-variable, &-value { c: fg3 }}

        /// Expanded state.
        &-expanded .gutter-toggle { c: 0 bg5 }

        /// Collapsed state.
        &&-collapsed {
            /// Reset toggle.
            .gutter-toggle {
                border-bottom-color: bg5 i
                rad: 0
            }

            /// Icons.
            .sidebar-collapsed-icon {
                c: fg;
                svg { g: cm }
            }

            /// Fix 'add a to-do' button.
            .sidebar-collapsed-container:not(:hover) { c: 0 0 t }

            /// Fix on-hover background colors.
            .gutter-toggle,
            .block > .sub-block,
            .block:not(.with-sub-blocks) {
                &:hover { c: 0 0 bg3 }
            }

            // Fix 'copy email' button.
            .copy-email-button {
                transition: none
                rad: 0
                &:hover { c: 0 0 bg3 }
            }
        }
    }

    // Global -> Navigation.
    .top-area {
        c: 0 bg3
        /// Global -> Nav links.
        /.nav-links {
            &:not(.quick-links) { c: 0 bg3 }
            li {
                a, button {
                    c: fg3
                    &:focus { c: 0 bd }
                    ../:hover { a, button { c: fg bd }}
                    ../.active { &, a, button { c: fg1 v08 }}
                    /// Active items and project header stats.
                    &.active, strong { c: fg ac }
                }

                /// OBSOLETE: Badges on old instances.
                [class$='badge'], [data-state] > .badge { c: fg3 0 bg3 }
                &.active {
                    [class$='badge'], [data-state] > .badge { c: fg1 0 bg5 }
                }

                /// Milestones -> Navigation.
                /.nav-tabs .nav-link.active { c: 0 ac t }
            }
        }
        /// Global -> Search.
        .form-control { c: 0 0 hl }
        /// Groups -> Navigation.
        /.content-block {
            c: 0 bg3 t
            p:not(.status-box) { c: fg }
            &.landing {
                c: 0 0 hl;
                h4 { c: fg }
            }
            /// Issues -> Show activity / Create MR menu.
            .new-branch-col {
                .btn {
                    padding: 6px 10px i;
                    line-height: 20px i;
                    font-size: 0.875rem;

                    /// Unset height for dropdown menu.
                    &.gl-h-7 { height: unset }
                }
                /// Notes -> Tweak large buttons to fit in emoji block.
                /.emoji-block .col-lg-6 {
                    flex: unset;
                    width: unset;
                    max-width: unset;
                    &:first-child { max-width: 50% }
                    &:last-child { flex: 1 1 auto i }
                }
            }
        }
        /// Misc.
        /.nav-block { c: 0 bg3 }
        /.row-content-block {
            c: fg bd hl;

            /// Project -> New MR.
            &.middle-block {
                .btn-cancel:not(:hover):not(:focus) { c: 0 0 bg1 }

                /// Fix inline diff. @upstream
                /#diff-notes-app .diffs.tab-pane { margin: 0 i }
            }

            /// Project -> New issue.
            &.footer-block { c: 0 bg3 t }

            /// Boards -> Reset various buttons on toolbar.
            :not([class*='group']) {
                > .js-focus-mode-btn,
                > [class*='btn btn-default'],
                > [class*='btn btn-inverted'] {
                    &:not([disabled]) {
                        c: 0 0 bg1
                        &:hover { c: 0 0 bg3 }
                    }
                }
            }

            /// Reset buttons in button groups.
            [class*='group'] > .btn {
                &-default:not(#z) {
                    c: 0 0 bg1
                    &:hover { c: 0 0 bg3 }
                    &:focus { c: 0 0 bg4 }
                }
            }

            /// Reset elements in navigation box.
            .filtered-search-box,
            .gl-datepicker-input {
                c: 0 0 bg1
            }
            button[class*='dropdown-']:not(#z) {
                b: none i
                &:hover, &:focus { c: 0 0 bg3 }
            }

            /// Remove borders from dropdown menu.
            .filtered-search-box > .dropdown .gl-button {
                c: 0 t
                border-right-color: bg5 i
            }

            /// Dashboard -> 'You pushed to...' alert.
            &.top-block {
                padding: 16px 0;
                c: 0 bg3 t
                .event-last-push {
                    time { c: fg }
                    &-text { font-size: 14px }
                }
                .btn-sm {
                    padding: 6px 10px i;
                    line-height: 1.5 i;
                    font-size: 14px i;
                }
            }
            /// Dashboard -> Todos.
            &.issues-details-filters [class*='menu-toggle']:not(svg) { c: 0 0 bg }
            /// Search -> Results header.
            span > code, form > div > button { c: 0 0 bg }
            /// Issues -> Board scope.
            .block {
                c: 0 bd;
                .title { c: fg }
                /// Reset dropdown colors.
                button.dropdown {
                    &-toggle[id]:not(#z), &-menu-toggle { c: 0 0 hl }
                }
            }
        }
        /// Project -> Compare Revisions.
        /.sub-header-block {
            c: 0 bg3 t
            + .card.bg-light { c: 0 0 t }
        }
        /// Project -> Packages.
        /.gl-tab {
            &s-nav { c: 0 bg3 }
            &-nav-item {
                c: cm;
                &-active { c: fg }
                &:hover { box-shadow: inset 0 -0.125rem bd }
                &.active { box-shadow: inset 0 -0.125rem ac }
            }
            /// Reset text colors.
            &-content {
                c: fg;
                .text-dark { &, &:hover { c: fg }}
                .text-secondary { &, &:hover { c: cm }}
            }
            /// Settings -> Usage quotas.
            /.pipeline-quota {
                c: 0 bd
                /// Workaround for removing extra whitespace.
                + .ci-table > div:first-child { margin-top: -1px i }
            }
        }
        /// Project -> Container Registry
        /.registry-placeholder {
            & .gl-text-black-normal {
                c: fg;
            }
            & a.gl-text-black-normal {
                &:hover {c: ac}
            }
        }
    }

    // Global -> Tabbed navigation.
    .gitlab-tabs {
        rad: 4px 4px 0 0;
        c: 0 bd t;
        &.nav.nav-tabs.nav-links {
            rad: 4px 4px 0 0;
            border-bottom: 1px solid;
            c: 0 bg5
            b: none
            > .nav-item { margin: 0 }
        }
        li[class ^= 'nav-'] {
            c: 0 bd bd;
            &:first-child { margin: 0 }
            a {
                rad: 0;
                ../:first-child a { rad: 3px 0 0 0 }
                ../:last-child a { rad: 0 3px 0 0 }
                ../:hover a.nav-link { c: fg t }
                &:not(.active) { c: 0 0 bg }
                &.active.nav-link {
                    margin-bottom: -1px;
                    c: fg hl hl;
                }
            }
        }
        /// Tab content.
        + .gitlab-tab-content {
            rad: 0 0 4px 4px;
            c: 0 bd hl;
            /// Inputs.
            .form-control, .info-well { c: 0 0 bg }
            .select2-choice { &, &s { c: 0 0 bg }}
            /// Exclude 'create from template' input bar.
            [class *= 'input-group']:not(.template-input-group) {
                rad: 3px 0 0 3px;
                c: fg1 bg5 bg3
            }
            /// Visibility level.
            /.option {
                &-title { c: fg }
                &-description, &-disabled-reason { c: cm }
            }
            /// 'Create from template' area.
            /.template-option { c: 0 bg5 }
            .card-slim { c: 0 0 bg }

            /// OBSOLETE: Login/register tabs until GitLab 12.5 or earlier.
            /.new-session-tabs {
                border: 1px solid bg5 i
                border-bottom: none i
                c: 0 0 bg1
                b: none i
                li {
                    &:not(.active) { &, &:hover a:not(.active) { c: 0 bg5 t }}
                    a.active {
                        rad: 0
                        c: 0 t bg2
                        b: 0 1px bg2
                    }
                }
                + .tab-content > div { rad: 0 0 4px 4px i }
            }

            /// Fix icon for Gitea.
            /[class*='gitea'],
            /[data-page='import:gitea:new'] {
                svg[version] {
                    path { g: fg3 }
                    rect { g: bg1 }
                }
            }
        }
    }

    // Global -> Welcome page. #144
    .blank-state {
        /// Cards.
        &-row &-link,
        /.new-namespace-panel {
            c: fg3 bg5 bg1
            &:hover { c: 0 0 bg2 }
            h3 {
                c: v09
                + p { c: fg2 }
            }
        }
    }

    // Global -> Projects list.
    .projects-list {
        > li {
            c: 0 bg4
            .description { c: fg3 }
            /.user-access-role { c: fg3 bg5 bg3 }
        }
        /// Profile -> Personal projects.
        &.compact {
            .user-access-role { line-height: 18px }
            .avatar { line-height: 36px i }
        }
        /// Loading icon.
        /.loading { c: cm }
        /// NOTE: Experimental list styles.
        /// Global -> Projects/Snippets | Profile -> Groups.
        &:not(.compact),
        /.snippets-list-holder > ul,
        /#groups > ul {
            margin-top: 10px;
            padding: 12px;
            c: 0 0 hl;
            rad: 4px;
            > li {
                padding: 12px 0 i;
                &:first-child { padding-top: 0 i }
                &:last-child { padding-bottom: 0 i }
            }
        }
        /// Profile -> Contributions list.
        /// The `d-sm-block` overrides `d-none`. @upstream
        /.user-calendar-activities {
            margin: 0 15px
            c: 0 0 hl;
            rad: 4px;
            h4 {
                margin: 10px 12px 0;
                padding: 10px 0;
                border-bottom: 1px solid bd;
            }
            ul li, > p {
                margin: 0 12px i;
                padding: 10px 0 i;
            }
        }
    }

    // Global -> Event lists.
    .event {
        &-item {
            c: fg3 bg4
            .commit { &, &s-stat { c: fg }}
            [href], [href *= '/compare/'] { c: ac }
        }
        &-user-info a[href] { c: fg }
        /// Dashboard -> Activities.
        /div.content_list {
            margin-top: 10px;
            padding: 10px;
            c: 0 0 hl;
            rad: 4px;
            > .event-item {
                padding-top: 10px;
                padding-bottom: 10px;
            }
        }
        /// Does not work with native syntax highlighting themes. @upstream
        &-note pre.code {
            border: 1px solid bd i;
            c: fg 0 bg;
        }
    }

    // Global -> Cards.
    .card {
        c: 0 bd bg;
        .user-info .user { c: fg }
        /// Default styles.
        &-header {
            c: 0 bg5 bg3
            /// Project -> Settings -> Pages.
            &.bg-info { c: c98 v65 v62 }
            &.bg-danger { c: c98 v15 v12 }
            + ul > .list-group-item { c: 0 bd t }
            /// Project -> Settings -> Card borders.
            ../.border {
                &-info { c: 0 blue }
                &-danger { c: 0 red }
            }
            /// Settings -> Active Sessions.
            /.list-group { & > &-item { c: 0 bd bg }}
            /// Reset background colors.
            input, [class *= 'dropdown-menu'] { c: 0 0 bg }
            /// Linked issues.
            .card-title { c: fg }
            /// Reset badges.
            > .badge-pill { c: fg1 0 bg5 }
        }
        &-body {
            > .form-actions {
                c: 0 bd bg;
                ../, & { rad: 0 0 3px 3px i }
            }
        }
        &-footer {
            c: 0 bd hl;
            /// Project -> Settings -> Pages.
            &.alert-primary { c: blue 0 hl }
            /// Project -> Settings -> CI -> Pipeline triggers.
            pre, code { rad: 4px; c: 0 0 bg }
        }
        /// Dashboard -> Operations.
        &.border-0 {
            border: 1px solid bd i;
            .card-header a { c: fg }
            /// Dashboard -> Environments.
            /.environments-dashboard .dashboard-card {
                box-shadow: none i
                border: none i
                c: 0 0 t
            }
        }
        /// Notes -> Related issues.
        /.related-issues-block .card {
            &-header {
                c: 0 bd hl;
                rad: 3px 3px 0 0;
                &.panel-empty-heading { box-shadow: inset 0 -1px bd }
            }
            /// Linked issues.
            .linked-issues-card-body {
                min-height: 16px;
                rad: 0 0 3px 3px;
                c: 0 0 bb;
                > .card-body { rad: 3px i }
            }
            /// Related issues.
            ul > li {
                /// Input area.
                &, &[class *= 'input'] > input { c: fg 0 hl }
                /// Issue tokens. #112
                /.issue-token {
                    &-reference { c: fg 0 bd }
                    &-remove-button { c: red 0 bd }
                    /// MR -> New MR dependencies. #112
                    /.add-issuable-form-input { c: fg 0 hl }
                }
                /// Rounded corners. @upstream
                &:first-child { rad: 3px 3px 0 0 }
                &:last-child {
                    border-bottom-left-radius: 3px;
                    border-bottom-right-radius: 3px;
                }
            }
        }
        /// Epics -> Epics and issues.
        /.related-items {
            &-tree {
                .item-title a { c: fg }
                .item-meta { c: cm bd }
            }
            &-list {
                .item-body {
                    &.item-closed {
                        c: 0 0 bb;
                        rad: 3px i;
                    }
                }
            }
        }
        /// Notes -> Related merge requests.
        /#merge-requests {
            &:not(.card) { c: 0 0 bg0 } // OBSOLETE
            .card-header {
                c: 0 bd hl;
                rad: 3px 3px 0 0;
            }
            ul li { c: 0 0 t }
        }
        /// Related issues/MRs -> Assignees.
        /.item-assignees:not(#z) .avatar {
            c: 0 hl;
            &-counter {
                c: fg 0 bd;
                rad: var(--avatar);
            }
        }
        /// Dashboard -> Issues/MRs/Todos.
        /[class *= '-filters'] {
            + div[class]:not([class *= 'boards']) {
                &, .card { c: 0 0 t }
                li {
                    border-top: none;
                    c: fg;
                    &:hover { c: 0 0 hl }
                }
            }
            /// Dashboard -> Done todos. #110
            /.done-reversible {
                border-top: none i;
                opacity: 0.6;
                c: 0 0 t;
            }
            /// Epics -> Reset dropdowns.
            &.epics-filters [class *= '-toggle'] { c: 0 0 bg }
        }
        /// Project -> Releases.
        &.linked-card, &.release-block {
            &::after { c: 0 hl }
            > .card-header { c: 0 0 hl }
            > .card-body { c: 0 0 bg }
        }
        /// Help -> Quick help links.
        &.links-card a { c: ac }
        /// Issues/MRs/Epics -> Sortable list.
        /.sortable {
            /// Wrapper.
            &-container {
                c: 0 0 hl;
                &[class *= 'body'] { rad: 0 0 4px 4px }
            }
            /// Items.
            &-row &-link { c: ac }
        }
        /// Epics -> Separator.
        /.epic-discussion-separator { c: 0 bd }
        /// Account -> Billing.
        /.flex-grid {
            .grid { &-row, &-cell { c: 0 bd }}
            .property-label { c: fg3 }
            .property-value { c: fg1 }
        }
    }

    // Global -> Skeleton.
    .animation-container {
        sk_gradient = linear-gradient(90deg, bg3 0%, bg4 50%, bg3)
        /// File table.
        [class *= 'skeleton-line-'] {
            c: 0 0 bg2
            &::after { background-image: sk_gradient }
        }
        /// Dashboard -> Operations.
        /[class *= 'card-skeleton-']::after { background-image: sk_gradient }
        /// Spinners.
        /.gl-spinner {
            &&-dark {
                c: 0 bd; border-top-color: ac i
            }
            /// Issues -> Labels.
            &-container.labels-fetch-loading { c: 0 0 t }
        }
        /// MRs -> Widgets.
        /svg.gl-skeleton-loader {
            .primary-stop { stop-color: bg3 }
            .secondary-stop { stop-color: bg4 }
        }
    }

    // Global -> Calendar.
    .pika-single {
        margin-top: 10px;
        c: fg bd hl;
        rad: 4px;

        /// Old styles.
        .pika {
            /// Header.
            &-label { c: fg 0 t }
            /// Custom prev/next buttons.
            &-prev, &-next {
                c: fg;
                text-indent: 0;
                background: none;
                &::before {
                    display: inline-block;
                    width: 20px;
                }
            }
            &-prev::before { content: '←' }
            &-next::before { content: '→' }

            /// Table.
            ../:not(.gl-datepicker-theme) .pika-table {
                border: 1px solid bd;
                /// Cells.
                th:not(#z) {
                    border-top: none i;
                    c: fg t bg;
                }
                td {
                    c: 0 bd;
                    .pika-day {
                        c: fg 0 bb;
                        &:hover, ../[class ^= 'is-'] .pika-day { c: ac 0 hl }
                    }
                    &.is-disabled .pika-day { c: cm 0 t }
                }
                /// Remove border on the bottom.
                tr:last-child > td { border-bottom: none i }
            }
        }

        /// Shadow.
        &.is-bound { box-shadow: bsh }

        /// Global -> Pajamas wrapper.
        /.gl-datepicker-theme {
            font-family: var(--ui-font) i;

            /// Reset styles.
            .pika-lendar:not(#z) {
                rad: 4px
                b: inner
                tr th { c: fg3 }
                .pika-table { c: 0 t t }
            }

            /// Days.
            .pika-button {
                c: fg4
                &:hover { c: fg1 0 bg3 }
                ../ .is-selected .pika-button { c: v99 0 v08 }
            }
        }
    }

    // Global -> Avatars.
    .avatar {
        &, &-circle, &-container, /.gl-avatar-s32 {
            text-shadow: 1px 1px 1px sh
            rad: var(--avatar) i
            c: fg t t

            /// Remove borders in operations dashboard.
            /.rect-avatar.border { border: none i }
        }

        /// Overrides.
        /[class*='identicon'] {
            border: 1px solid t i

            /// Resize avatars.
            &[class*='s20'] { line-height: 16px i } // Usage quotas.
            &[class*='s24'] { line-height: 22px i } // Operations.
            &[class*='s32'] { line-height: 28px i } // Search menus.
            &[class*='s40'] { line-height: 28px i } // Group projects.
            &[class*='s48'] { line-height: 44px i } // Dashboard projects.
            &[class*='s64'] { line-height: 60px i } // Group avatar.
            &[class*='s90'] { line-height: 86px i } // Project avatar in settings.

            /// Default colors.
            &[class*='bg0'] { c: v19 v13 v11 }
            &[class*='bg1'] { c: v49 v43 v41 }
            &[class*='bg2'] { c: v59 v53 v51 }
            &[class*='bg3'] { c: v39 v33 v31 }
            &[class*='bg4'] { c: v79 v73 v71 }
            &[class*='bg5'] { c: v69 v63 v61 }
            &[class*='bg6'] { c: v89 v83 v81 }
            &[class*='bg7'] { c: v29 v23 v21 }
        }

        /// Fallback identicon; Found on 'usage quotas' page.
        &.bgNaN { c: 0 bg5 bg3 }
    }

    // Global -> Page title.
    .page-title {
        c: fg;
        &-holder { c: 0 bg3 }
        /// Commits -> Details.
        /.commit-box {
            c: 0 bg3
            .commit-title, time { c: fg }
        }
    }

    // Global -> Breadcrumbs.
    .breadcrumb {
        &-item > a {
            c: cm;
            /// Project -> File location / Active path.
            strong, &.router-link-exact-active:not(#z) {
                font-weight: bold
                c: fg1
            }
        }
        &s {
            &-list a { c: cm }
            &-list-angle { g: cm }
            &-container { c: 0 bg3 }
            &-sub-title a { c: fg }
            &-links img { c: 0 hl hl }
            /// Epics -> Roadmap.
            &.group-epics-roadmap { c: 0 bg3 }
            /// Boards -> Fix border color.
            &.issue-boards-content > &-container { c: 0 bg5 }
        }

        /// Project.
        &.repo-breadcrumb {
            /// Dividers/items.
            > li + li::before,
            a:not([class*='dropdown']) {
                c: fg3
            }
        }
    }

    // Global -> Pagination.
    .pagination {
        .page-link {
            c: fg1 bg5 bg3
            &:not(.active):hover { c: 0 0 bg4; b: none }
            ../ .disabled .page-link { c: fg5 0 bg2 }
            ../ .active .page-link, &.active { c: v99 v07 v03 }
        }
    }

    // Global -> Markdown area.
    .md {
        c: fg;
        h1, h2 { c: fg1 bg3 }
        hr { c: 0 bg4 }
        a, p { > code { padding: 2px 4px }}
        a, a > code { c: ac }
        p, p > code { c: fg1 }
        kbd {
            c: 0 bd;
            box-shadow: inset 0 -1px 0 bd i;
            > kbd { c: 0 0 bb }
        }
        blockquote, .blockquote {
            border-left-width: 4px
            c: fg3 bg5
            p { c: fg3 }
        }
        img.lazy { c: 0 0 hl }
        img:not(.emoji) {
            c: 0 bd;
            /// Feat -> Default image opacity.
            if (md_img_o < 1) {
                opacity: md_img_o;
                transition: opacity 0.5s ease;
                &:hover {
                    transition-delay: 0.5s;
                    opacity: 1;
                }
            }
            /// Shields.io badges.
            /[src *= 'style=for-the-badge'],
            &[data-canonical-src *= 'style=for-the-badge'] {
                rad: 4px;
            }
        }
        pre {
            rad: 4px i;
            &.code.white {
                border: 1px solid bd;
                c: fg 0 hl;
                &.highlight { c: 0 0 hl }
            }
            /// Feat -> Set 'none' syntax colors to use theme colors.
            if (c_hl_none) {
                &.code.none {
                    c: fg 0 hl;
                    .line span { c: fg }
                }
            }
        }
        code { font-family: var(--mono-font) i }
        /// Emojis.
        gl-emoji {
            font-size: 1em;
            font-family: var(--emoji-font);
        }
        /// Notes -> Suggested change.
        &-suggestion {
            &-header { c: 0 bd hl }
            &-diff {
                font-family: var(--mono-font) i;
                rad: 0 0 4px 4px i;
                c: 0 bd;
            }
            /// Fix rounded corners.
            tr:last-child > td {
                &:first-child::after { rad: 0 0 0 3px }
                &:last-child::after { rad: 0 0 3px 0 }
            }
        }
        /// Heading anchors.
        .anchor::after {
            content: '#' i
            c: fg;
        }
        /// Fix task lists. #111
        /.task-list { c: fg }
    }

    // Global -> Swagger UI. #101, #157
    .swagger-ui {
        c: fg1

        /// Text colors.
        a {
            c: ac
            &:not([href]) { c: inherit }
            ../.info a:hover { opacity: 0.8 }
        }
        p, li, table, h3, h4, h5, label { c: fg1 }
        :not(pre) > code { c: ac 0 bg2 }
        pre.microlight {
            c: fg1 bg5 bg2
            span:not([style]) { c: fg1 }
            span[style^='color: rgb(162'] { c: v47 }
            span[style^='color: rgb(211'] { c: v27 }
        }

        /// Base overrides.
        input, textarea {
            c: fg1 bg5 bg1
            &[disabled] { &, &::placeholder { c: fg5 }}
            &:focus { c: 0 v65; b: 0 0 0 0.2rem v63 }
        }
        .btn {
            c: fg3 bg5
            &-done { c: fg1 bg5 }
            &.execute { c: v99 v07 v05 }
            &.cancel { c: v99 v17 v14 }
            &.authorize {
                c: v47 v43
                &:hover { c: 0 0 v41 }
            }
            &:hover { opacity: 0.9; b: var(--bshadow) }
        }

        /// Adjust down chevron icon.
        select {
            background-size: auto i
            background-position-x: right -10px i
            background-position-y: top 5px i
            background-repeat: no-repeat i
            &.content-type { c: fg1 v46 }
            &[disabled] { c: fg5 }
        }

        /// Fix custom UI font.
        *:not(code):not(pre) { font-family: var(--ui-font) i }

        /// Icons.
        svg.arrow { g: fg3 }
        .unlocked > svg { g: v99 }
        .authorize > svg { g: v47 }
        .close-modal > svg { g: fg3 }

        /// Title.
        .title {
            c: fg1
            small { c: fg1 0 bg5 }
            .version-stamp { c: white 0 v07 }
        }

        /// Auth modal.
        .dialog-ux {
            .backdrop-ux { c: 0 0 bg0; opacity: 0.85 }
            .modal-ux {
                c: 0 bg5 bg1
                &-header { c: 0 bg5 }
            }
        }

        /// Operations.
        .opblock {
            &-tag {
                c: fg1 bg5
                &:hover { c: 0 0 bg2 }
            }
            &-section-header {
                c: 0 0 bg2
                b: 0 1px bg5, inset 0 1px bg5 i
       ...

Reviews

No reviews yet.