/*
 * Copyright (C) 2015-2020 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

.tree-outline .item.object-tree-property {
    margin-top: 0;
    border-top: 0;
}

.object-tree-property.boolean > .icon {
    content: url(../Images/TypeIcons.svg#TypeBoolean-light);
}

.object-tree-property.function > .icon {
    content: url(../Images/TypeIcons.svg#Function-light);
}

.object-tree-property.number > .icon {
    content: url(../Images/TypeIcons.svg#TypeNumber-light);
}

.object-tree-property.bigint > .icon {
    content: url(../Images/TypeIcons.svg#TypeBigInt-light);
}

.object-tree-property.object > .icon {
    content: url(../Images/TypeIcons.svg#TypeObject-light);
}

.object-tree-property.object.null > .icon {
    content: url(../Images/TypeIcons.svg#TypeNull-light);
}

.object-tree-property.object.node > .icon {
    content: url(../Images/TypeIcons.svg#DOMElement-light);
}

.object-tree-property.regex > .icon {
    content: url(../Images/TypeIcons.svg#TypeRegex-light);
}

.object-tree-property.string > .icon {
    content: url(../Images/TypeIcons.svg#TypeString-light);
}

.object-tree-property.symbol > .icon {
    content: url(../Images/TypeIcons.svg#TypeSymbol-light);
}

.object-tree-property.accessor > .icon,
.object-tree-property.undefined > .icon {
    content: url(../Images/TypeIcons.svg#TypeUndefined-light);
}

.object-tree-property.had-error > .icon {
    content: url(../Images/TypeIcons.svg#TypeUndefined-light) !important;
}

.object-tree-property .property-name,
.object-tree-property .function-parameters,
.object-tree-property .prototype-name {
    font-family: -webkit-system-font, sans-serif;
    font-size: 12px;
}

.object-tree-property .property-name.not-enumerable {
    opacity: 0.6;
}

.item.object-tree-property.prototype-property {
    display: inline-block;

    border: 1px solid hsla(0, 0%, 0%, 0.06);
    background-color: hsla(0, 0%, 0%, 0.03);
    border-radius: 3px;

    padding: 0 10px 1px 0;
    margin: 3px 0 2px 0;
}

.object-tree-property.prototype-property:hover, .object-tree-property.prototype-property:focus {
    border-color: hsla(0, 0%, 0%, 0.1);
}

.object-tree-property.prototype-property > .icon {
    display: none;
}

.item.object-tree-property.prototype-property + ol {
    -webkit-padding-start: 0px;
}

.object-tree-property :matches(.getter, .setter) {
    position: relative;
    opacity: 0.6;
    vertical-align: top;
}

.object-tree-property .spacer {
    margin-left: 4px;
}

.object-tree-property .getter {
    top: 1px;

    content: url(../Images/Show.svg);

    width: 16px;
    height: 11px;
}

.object-tree-property .setter {
    top: -1px;

    content: url(../Images/Pencil.svg);

    width: 13px;
    height: 13px;
}

.object-tree-property .getter + .setter {
    margin-left: 1px;
}

.object-tree-property :matches(.getter, .setter).disabled {
    opacity: 0.35;
}

.object-tree-property .getter:not(.disabled):hover {
    opacity: 1;
}

.object-tree-property .value.error {
    color: red;
}

@media (prefers-color-scheme: dark) {
    .object-tree-property .getter,
    .object-tree-property .setter {
        filter: invert();
    }

    .item.object-tree-property.prototype-property {
        border-color: hsla(0, 0%, var(--foreground-lightness), 0.06);
        background-color: hsla(0, 0%, var(--foreground-lightness), 0.03);
    }

    .object-tree-property.prototype-property:hover,
    .object-tree-property.prototype-property:focus {
        border-color: hsla(0, 0%, var(--foreground-lightness), 0.1);
    }

    .object-tree-property .value.error {
        color: hsl(0, 100%, 60%);
    }

    .object-tree-property.boolean > .icon {
        content: url(../Images/TypeIcons.svg#TypeBoolean-dark);
    }

    .object-tree-property.function > .icon {
        content: url(../Images/TypeIcons.svg#Function-dark);
    }

    .object-tree-property.number > .icon {
        content: url(../Images/TypeIcons.svg#TypeNumber-dark);
    }

    .object-tree-property.bigint > .icon {
        content: url(../Images/TypeIcons.svg#TypeBigInt-dark);
    }

    .object-tree-property.object > .icon {
        content: url(../Images/TypeIcons.svg#TypeObject-dark);
    }

    .object-tree-property.object.null > .icon {
        content: url(../Images/TypeIcons.svg#TypeNull-dark);
    }

    .object-tree-property.object.node > .icon {
        content: url(../Images/TypeIcons.svg#DOMElement-dark);
    }

    .object-tree-property.regex > .icon {
        content: url(../Images/TypeIcons.svg#TypeRegex-dark);
    }

    .object-tree-property.string > .icon {
        content: url(../Images/TypeIcons.svg#TypeString-dark);
    }

    .object-tree-property.symbol > .icon {
        content: url(../Images/TypeIcons.svg#TypeSymbol-dark);
    }

    .object-tree-property.accessor > .icon,
    .object-tree-property.undefined > .icon {
        content: url(../Images/TypeIcons.svg#TypeUndefined-dark);
    }

    .object-tree-property.had-error > .icon {
        content: url(../Images/TypeIcons.svg#TypeUndefined-dark) !important;
    }
}