/*
 * 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.
 */

.sidebar > .panel.navigation.sources > .content {
    top: var(--navigation-bar-height);
}

.sidebar > .panel.navigation.sources > .navigation-bar {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
}

.sidebar > .panel.navigation.sources > .navigation-bar .debugger-breakpoints {
    fill: none;
    stroke: var(--glyph-color);
}

.sidebar > .panel.navigation.sources > .navigation-bar .debugger-breakpoints.activated {
    fill: var(--glyph-color-active);
    stroke: var(--glyph-color-active);
}

.sidebar > .panel.navigation.sources > .navigation-bar .debugger-pause-resume {
    fill: none;
    stroke: var(--glyph-color);
}

.sidebar > .panel.navigation.sources > .navigation-bar .debugger-pause-resume.activated {
    stroke: var(--glyph-color-active);
}

.sidebar > .panel.navigation.sources > .content > .warning-banner {
    padding: 11px 6px;
    font-size: 11px;
    text-align: center;
    background-color: hsl(50, 100%, 94%);
    border-bottom: 1px solid var(--border-color);
}

.sidebar > .panel.navigation.sources > .content > .warning-banner + .warning-banner {
    display: none;
}

.sidebar > .panel.navigation.sources > .content > .details-section {
    padding-bottom: 1px;
    font-size: 11px;
    border-bottom-width: 1px !important;
}

.sidebar > .panel.navigation.sources > .content > .details-section:matches(.paused-reason, .breakpoints).collapsed > .header > .options,
.sidebar > .panel.navigation.sources > .content > .details-section > .content,
.sidebar > .panel.navigation.sources > .content > .details-section > .content > .group {
    display: block;
}

.sidebar > .panel.navigation.sources > .content > .details-section.collapsed > .content {
    display: none;
}

.sidebar > .panel.navigation.sources > .content > .details-section.breakpoints > .header > .options .create-breakpoint {
    width: 15px;
}

.sidebar > .panel.navigation.sources > .content > .details-section:matches(.pause-reason, .call-stack, .breakpoints) > .content,
.sidebar > .panel.navigation.sources > .content > .tree-outline.resources {
    overflow-y: auto;
}

.sidebar > .panel.navigation.sources > .content > .details-section:matches(.call-stack, .breakpoints) > .content {
    /* Same calculation as below, but without var(--item-count) */
    max-height: 110px;
}

.sidebar > .panel.navigation.sources > .content > .details-section:matches(.call-stack, .breakpoints):not(.collapsed) > .content {
    /* 1px from .sidebar > .panel.navigation.sources > .content > .details-section (border-bottom) */
    /* 5.5 to ensure that half of the next item is shown when overflowing */
    min-height: calc(min(var(--item-count), 5.5) * 20px);
}

.sidebar > .panel.navigation.sources > .content > .details-section.call-stack {
    --item-count: var(--call-stack-count);
}

.sidebar > .panel.navigation.sources > .content > .details-section.breakpoints {
    --item-count: var(--breakpoints-count);
}

.sidebar > .panel.navigation.sources > .content > .details-section.breakpoints .create-breakpoint {
    width: 15px;
}

.sidebar > .panel.navigation.sources > .content > .navigation-bar {
    margin-bottom: 1px;
}

.sidebar > .panel.navigation.sources > .content .tree-outline.single-thread {
    -webkit-margin-start: -10px;
}

.sidebar > .panel.navigation.sources > .content .tree-outline.single-thread > .item.thread {
    display: none;
}

@media (min-height: 600px) {
    .sidebar > .panel.navigation.sources > .content {
        display: flex;
        flex-direction: column;
        overflow-y: hidden;
    }

    .sidebar > .panel.navigation.sources > .content > .pause-reason {
        flex-shrink: 0;
    }

    .sidebar > .panel.navigation.sources > .content > .details-section:matches(.call-stack, .breakpoints):not(.collapsed) > .content,
    .sidebar > .panel.navigation.sources > .content > .tree-outline.resources {
        height: 100%;
    }
}

.sidebar > .panel.navigation.sources > .content > .details-section.breakpoints .tree-outline .item.event-target-window .icon {
    content: url(../Images/TypeObject.svg);
}

@media (prefers-dark-interface) {
    .sidebar > .panel.navigation.sources > .content > .warning-banner {
        color: var(--yellow-highlight-text-color);
        background-color: var(--yellow-highlight-background-color);
    }
}
