/*
 * Copyright (C) 2013-2020 Apple Inc. All rights reserved.
 * Copyright (C) 2017 Sony Interactive Entertainment Inc.
 *
 * 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.
 */

.sidebar > .panel.details.layer > .content {
    bottom: var(--console-prompt-min-height);
}

.panel.details.layer .data-grid {
    height: 100%;
}

.panel.details.layer .name-column .icon {
    content: url(../Images/TypeIcons.svg#DOMElement-light);
}

.panel.details.layer tr.reflection .name-column .icon {
    content: url(../Images/TypeIcons.svg#Reflection-light);
}

.panel.details.layer tr.pseudo-element .name-column .icon {
    content: url(../Images/TypeIcons.svg#PseudoElement-light);
}

.panel.details.layer .name-column :matches(.pseudo-element, .reflection) {
    color: var(--text-color-gray-medium);
}

.panel.details.layer tr.selected .name-column :matches(.pseudo-element, .reflection) {
    color: var(--selected-secondary-text-color);
}

.panel.details.layer .bottom-bar {
    position: absolute;
    display: flex;
    justify-content: space-between;
    bottom: 0;
    height: var(--console-prompt-min-height);
    width: 100%;
    border-top: 1px solid var(--border-color);
}

.panel.details.layer .bottom-bar > div {
    display: flex;
    padding: 4px 6px;
    line-height: 20px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.panel.details.layer .layers-memory-label {
    justify-content: flex-end;
}

@media (prefers-color-scheme: dark) {
    .panel.details.layer .name-column .icon {
        content: url(../Images/TypeIcons.svg#DOMElement-dark);
    }

    .panel.details.layer tr.reflection .name-column .icon {
        content: url(../Images/TypeIcons.svg#Reflection-dark);
    }

    .panel.details.layer tr.pseudo-element .name-column .icon {
        content: url(../Images/TypeIcons.svg#PseudoElement-dark);
    }
}