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

.item.recording-action > .icon {
    content: url("../Images/Source.svg");
}

.item.recording-action:not(.initial-state)::before {
    position: relative;
    top: 3px;
    -webkit-margin-end: var(--tree-outline-icon-margin-end);
    -webkit-margin-start: 0;
    content: attr(data-index);
    font-family: -webkit-system-font, sans-serif;
    font-size: 9px;
    color: var(--text-color-gray-medium);
    font-variant-numeric: tabular-nums;
    text-align: end;

    --data-indent: calc(var(--tree-outline-icon-margin-start) - var(--tree-outline-icon-margin-end));
}

body[dir=ltr] .item.recording-action::before {
    float: left;
}

body[dir=rtl] .item.recording-action::before {
    float: right;
}

.tree-outline:focus .item.recording-action.selected:not(.invalid, .initial-state, .has-context-replacer, .name-unknown) > .icon {
    filter: invert();
    opacity: 1;
}

.item.recording-action > .titles .parameter.swizzled {
    color: var(--text-color-gray-medium);
}

.item.recording-action > .titles .parameter.constant {
    font-size: calc(100% - 1px);
    font-family: Menlo, monospace;
    font-style: italic;
}

body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus .item.recording-action.selected > .titles .parameter.swizzled,
body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus .item.recording-action.selected::before {
    color: var(--selected-secondary-text-color);
}

.tree-outline[data-indent="1"] .item.recording-action::before,
.tree-outline[data-indent="2"] .item.recording-action::before {
    min-width: var(--data-indent);
}

.tree-outline[data-indent="3"] .item.recording-action::before {
    min-width: calc(var(--data-indent) * 1.5);
}

.tree-outline[data-indent="4"] .item.recording-action::before {
    min-width: calc(var(--data-indent) * 2);
}

.tree-outline[data-indent="5"] .item.recording-action::before {
    min-width: calc(var(--data-indent) * 2.5);
}

.tree-outline[data-indent="6"] .item.recording-action::before {
    min-width: calc(var(--data-indent) * 3);
}

.tree-outline[data-indent="7"] .item.recording-action::before {
    min-width: calc(var(--data-indent) * 3.5);
}

.tree-outline:not(.hide-disclosure-buttons) .item.recording-action:not(.initial-state, .parent) > .icon {
    -webkit-margin-start: 0;
}

.item.recording-action.visual:not(.selected, .invalid) {
    background-color: var(--value-changed-highlight);
}

.item.recording-action > .titles .context-replacer::after {
    content: ".";
}

.item.recording-action.attribute > .titles .parameters::before {
    content: " = ";
}

.item.recording-action:not(.attribute) > .titles .parameters::before {
    content: "(";
}

.item.recording-action:not(.attribute) > .titles .parameters::after {
    content: ")";
}

.item.recording-action > .titles .parameter:not(:last-child)::after {
    content: ", ";
}

.item.recording-action:not(.selected) > .titles .parameter.swizzled {
    color: var(--text-color-gray-medium);
}

.item.recording-action > .titles .parameters > .inline-swatch {
    vertical-align: -1px;
}

.item.recording-action.composite > .icon {
    content: url(../Images/Composite.svg);
}

.item.recording-action.fill > .icon {
    content: url(../Images/Fill.svg);
}

.item.recording-action.image > .icon {
    content: url(../Images/Pixels.svg);
}

.item.recording-action.line-style > .icon {
    content: url(../Images/LineStyle.svg);
}

.item.recording-action.shadow > .icon {
    content: url(../Images/Shadow.svg);
}

.item.recording-action.stroke > .icon {
    content: url(../Images/Stroke.svg);
}

.item.recording-action.style > .icon {
    content: url(../Images/Palette.svg);
}

.item.recording-action.text > .icon {
    content: url(../Images/Text.svg);
}

.item.recording-action.transform > .icon {
    content: url(../Images/Transform.svg);
}

.item.recording-action.arc > .icon {
    content: url(../Images/PathArc.svg);
}

.item.recording-action.clip > .icon {
    content: url(../Images/Clip.svg);
}

.item.recording-action.curve > .icon {
    content: url(../Images/PathCurve.svg);
}

.item.recording-action.ellipse > .icon {
    content: url(../Images/PathEllipse.svg);
}

.item.recording-action.line-to > .icon {
    content: url(../Images/PathLineTo.svg);
}

.item.recording-action.move-to > .icon {
    content: url(../Images/PathMoveTo.svg);
}

.item.recording-action.point-in-path > .icon {
    content: url(../Images/PointInPath.svg);
}

.item.recording-action.point-in-stroke > .icon {
    content: url(../Images/PointInStroke.svg);
}

.item.recording-action.rect > .icon {
    content: url(../Images/PathRect.svg);
}

.item.recording-action.restore > .icon {
    content: url(../Images/StepOut.svg);
}

.item.recording-action.save > .icon {
    content: url(../Images/StepInto.svg);
}

.item.recording-action.invalid > .icon {
    top: 2px;
    width: 16px;
    height: 12px;
    content: url(../Images/Error.svg);
}

.item.recording-action.warning:not(.invalid) > .status > .warning {
    width: 12px;
    height: 12px;
    margin-top: 2px;
}

@media (prefers-color-scheme: dark) {
    .tree-outline .item.recording-action.visual:not(.selected, .invalid) {
        color: var(--green-highlight-text-color);
    }

    .item.recording-action:not(.invalid, .initial-state, .has-context-replacer, .name-unknown) > .icon {
        filter: invert();
        opacity: 0.8;
    }
}
