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

.item.breakpoint .status {
    position: relative;
}

.item.breakpoint .status > .status-image {
    width: 23px;
    height: 12px;
    margin-top: 2px;

    fill: var(--breakpoint-color);
    stroke: hsla(0, 0%, 10%, 0.3);
    filter: grayscale();
}

.item.breakpoint .status > .status-image.resolved {
    filter: none;
}

body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved {
    stroke: var(--selected-foreground-color);
}

.item.breakpoint .status > .status-image.auto-continue::after {
    position: absolute;
    right: 3px;
    width: 3px;
    height: 12px;
    content: "";
    -webkit-clip-path: polygon(0 20%, 100% 50%, 0 80%);
    background-color: var(--selected-foreground-color);
}

.item.breakpoint .status > .status-image.disabled {
    fill: var(--breakpoint-color-disabled);
}

.item.breakpoint .subtitle.formatted-location {
    font-style: italic;
}

.breakpoint-debugger-statement-icon .icon {
    content: url(../Images/TypeIcons.svg#DebuggerStatement-light);
}

.breakpoint-exception-icon .icon {
    content: url(../Images/TypeIcons.svg#Exception-light);
}

.breakpoint-assertion-icon .icon {
    content: url(../Images/TypeIcons.svg#Assertion-light);
}

.breakpoint-microtask-icon .icon {
    content: url(../Images/TypeIcons.svg#Microtask-light);
}

.breakpoint-paused-icon .icon {
    content: url(../Images/TypeIcons.svg#PausedBreakpoint-light);
}

/* When animating a layer on top of a tree element's icon, move the main
icon to the icon element's background so animations are layered on top. */
.breakpoint-generic-line-icon .icon {
    background-image: url(../Images/TypeIcons.svg#ResultLine-light);
    content: '';
}

.breakpoint-generic-line-icon .icon > span {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;

    border-radius: 50%;
    transform: scale(0);
    transition: none;
    background-color: hsl(216, 30%, 42%);
}

.data-updated.breakpoint-generic-line-icon .icon > span {
    border-radius: 0;
    transform: scale(0.85);
    transition: all .4s ease-out;
    background-color: hsla(216, 30%, 42%, 0.1);
}

@media (prefers-color-scheme: dark) {
    .breakpoint-debugger-statement-icon .icon {
        content: url(../Images/TypeIcons.svg#DebuggerStatement-dark);
    }
    
    .breakpoint-exception-icon .icon {
        content: url(../Images/TypeIcons.svg#Exception-dark);
    }

    .breakpoint-assertion-icon .icon {
        content: url(../Images/TypeIcons.svg#Assertion-dark);
    }

    .breakpoint-microtask-icon .icon {
        content: url(../Images/TypeIcons.svg#Microtask-dark);
    }

    .breakpoint-paused-icon .icon {
        content: url(../Images/TypeIcons.svg#PausedBreakpoint-dark);
    }

    .breakpoint-generic-line-icon .icon {
        background-image: url(../Images/TypeIcons.svg#ResultLine-dark);
    }
    
}