/*
 * 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.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: scroll;
}

.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: image-set(url(../Images/DocumentGL.png) 1x, url(../Images/DocumentGL@2x.png) 2x);
}

.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/RenderingFrame.svg);
}

.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;
}

.sidebar > .panel.navigation.canvas > .content > .recording-content > .tree-outline:focus .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();
    }
}
