/*
 * Copyright (C) 2018 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.
 */

.content-view-container > .content-view.audit-test {
    overflow-y: scroll;
}

.content-view-container > .content-view.audit-test > header {
    padding-top: calc(var(--audit-test-vertical-space) / 5 * 8);
    padding-bottom: calc(var(--audit-test-vertical-space) / 5 * 8);
    border-bottom: 1px solid var(--border-color);
}

.content-view-container > .content-view.audit-test > header h1 {
    font-size: 2.8em;
}

.content-view-container > .content-view.audit-test > header p {
    font-size: 1.25em;
    opacity: 0.85;
}

.content-view.audit-test {
    --audit-test-vertical-space: 10px;
    --audit-test-horizontal-space: 20px;
    --audit-test-header-background-color: hsla(0, 0%, 98%, 0.7);
}

.content-view.audit-test h1 {
    margin: 0;
}

.content-view.audit-test > header {
    display: flex;
    align-items: center;
    padding-top: var(--audit-test-vertical-space);
    padding-bottom: var(--audit-test-vertical-space);
    -webkit-padding-start: var(--audit-test-horizontal-space);

    --metadata-width: 60px;
}

.content-view.audit-test > header > .information {
    flex-grow: 1;
}

.content-view.audit-test > header p {
    margin: 4px 0 0;
}

.content-view.audit-test .audit-test.filtered,
.content-view.audit-test .audit-test .message-text-view {
    display: none;
}

.content-view.audit-test > section {
    position: relative;
}

.content-view.audit-test > section > .message-text-view {
    background-color: var(--background-color-content);
}

.content-view.audit-test.showing-placeholder {
    display: flex;
    flex-direction: column;
}

.content-view.audit-test.showing-placeholder > section {
    flex-grow: 1;
}

.content-view.audit-test.showing-placeholder > section > :not(.message-text-view) {
    display: none;
}

@media (prefers-color-scheme: dark) {
    .content-view.audit-test {
        --audit-test-header-background-color: hsla(0, 0%, 23%, 0.7);
    }
}
