/*
 * 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/TypeIcons.svg#Source-light");
}

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

body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .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-within .item.recording-action.selected > .titles .parameter.swizzled,
body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .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;
    }

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