/*
 * Copyright (C) 2015 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/TypeBoolean.svg);
}

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

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

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

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

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

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

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

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

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

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

.object-tree-property.had-error > .icon {
    content: url(../Images/TypeUndefined.svg) !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%);
    }
}
