/*
 * 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.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/Eye.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%);
    }
}
