/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
 * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

.icon, .icon-badge {
    margin: -3px -5px -3px -5px;
}

.icon-stack {
    position: relative;
    display: inline-flex;
}

.icon-stack > [is=ui-icon]:not(:first-child) {
    position: absolute;
    left: 0;
    top: 0;
}

.navigator-file-tree-item .icon {
    background: linear-gradient(45deg, hsl(0, 0%, 50%), hsl(0, 0%, 70%));
}

.navigator-fs-tree-item:not(.has-mapped-files):not(.selected) > :not(.selection),
.navigator-fs-folder-tree-item:not(.has-mapped-files):not(.selected) > :not(.selection) {
    filter: grayscale(50%);
    opacity: 0.5;
}

.tree-outline li {
    min-height: 20px;
}

.tree-outline li:hover:not(.selected) .selection {
    display: block;
    background-color: var(--item-hover-color);
}

.navigator-folder-tree-item .icon {
    background-color: #555;
}

.navigator-sm-folder-tree-item .icon,
.navigator-fs-tree-item .icon,
.navigator-fs-folder-tree-item .icon {
    background: linear-gradient(45deg, hsl(28, 75%, 50%), hsl(28, 75%, 70%));
}

.navigator-nw-folder-tree-item .icon {
    background: linear-gradient(45deg, hsl(210, 82%, 65%), hsl(210, 82%, 80%));
}

.navigator-sm-script-tree-item .icon,
.navigator-script-tree-item .icon,
.navigator-snippet-tree-item .icon {
    background: linear-gradient(45deg, hsl(48, 70%, 50%), hsl(48, 70%, 70%));
}

.navigator-sm-stylesheet-tree-item .icon,
.navigator-stylesheet-tree-item .icon {
    background: linear-gradient(45deg, hsl(256, 50%, 50%), hsl(256, 50%, 70%));
}

.navigator-image-tree-item .icon,
.navigator-font-tree-item .icon {
    background: linear-gradient(45deg, hsl(109, 33%, 50%), hsl(109, 33%, 70%));
}

.navigator-sm-folder-tree-item .tree-element-title,
.navigator-sm-script-tree-item .tree-element-title,
.navigator-sm-stylesheet-tree-item .tree-element-title {
    font-style: italic;
}

:host{
    overflow-y: auto;
}
