/*
 * Copyright (C) 2018-2020 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.canvas > .content {
    display: flex;
    flex-direction: column;
    top: var(--navigation-bar-height);
    overflow-y: hidden;
}

.sidebar > .panel.navigation.canvas > .navigation-bar > .item.record-start-stop.disabled > .glyph {
    filter: grayscale();
    opacity: 0.5;
}

.sidebar > .panel.navigation.canvas > .content > .tree-outline .item.canvas:matches(.canvas-2d, .bitmaprenderer) .icon {
    content: url(../Images/Canvas2D.svg);
}

.sidebar > .panel.navigation.canvas > .content > .tree-outline .item.canvas:matches(.webgl, .webgl2, .webgpu, .webmetal) .icon {
    content: url(../Images/Canvas3D.svg);
}

.sidebar > .panel.navigation.canvas > .content > .navigation-bar {
    border-top: 1px solid var(--border-color);
}

.sidebar > .panel.navigation.canvas.has-recordings > .content > .recording-content {
    flex-grow: 1;
    overflow-y: auto;
}

.sidebar > .panel.navigation.canvas.showing-recording > .content > .tree-outline.canvas {
    flex-shrink: 0;
    height: fit-content;
    max-height: 110px;
    overflow-y: auto;
}

.sidebar > .panel.navigation.canvas:not(.has-recordings) > .filter-bar,
.sidebar > .panel.navigation.canvas:not(.has-recordings) > .content > :matches(.navigation-bar, .recording-content) {
    display: none;
}

.sidebar > .panel.navigation.canvas > .content > .tree-outline .item.shader-program > .icon {
    content: url(../Images/DocumentIcons.svg#gl-light);
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline .item.recording > .icon {
    content: url(../Images/Recording.svg);
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline .item.folder-icon > .icon {
    content: url(../Images/TypeIcons.svg#RenderingFrame-light);
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline .item.folder-icon > .status {
    line-height: 16px;
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline .item.processing .subtitle > progress {
    width: 100%;
    max-width: 100px;
    margin: 0 4px;
    vertical-align: -3px;
}

body:not(.window-inactive, .window-docked-inactive) .sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline:focus-within .item.processing.selected .subtitle > progress {
    filter: brightness(10);
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline .item.processing .subtitle::before {
    content: "";
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .recording-processing-options {
    display: flex;
    flex-direction: column;
    align-items: center;
    margin: 16px 0;
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .recording-processing-options > .indeterminate-progress-spinner {
    margin-bottom: 4px;
}

@media (prefers-color-scheme: dark) {
    .sidebar > .panel.navigation.canvas > .navigation-bar > .item.record-start-stop.disabled > .glyph {
        filter: grayscale() invert();
    }

    .sidebar > .panel.navigation.canvas > .content > .tree-outline .item.canvas .icon {
        filter: invert();
    }

    .sidebar > .panel.navigation.canvas > .content > .tree-outline .item.shader-program > .icon {
        content: url(../Images/DocumentIcons.svg#gl-dark);
    }

    .sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline .item.folder-icon > .icon {
        content: url(../Images/TypeIcons.svg#RenderingFrame-dark);
    }
}