/*
 * 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.
 */

.waterfall-popover-content .dom-events-breakdown {
    user-select: text;
    max-height: 210px;
    overflow-y: auto;
}

.dom-events-breakdown {
    margin: 5px;
}

.dom-events-breakdown table {
    width: 100%;
    border-collapse: collapse;
}

.dom-events-breakdown tr > :matches(th, td) {
    padding: 4px;
    text-align: start;
}

.dom-events-breakdown tbody > tr {
    /* FIXME: <https://webkit.org/b/94128> */
    border-top: 1px solid lightgrey;
}

.dom-events-breakdown .graph {
    position: relative;
    width: 100%;
    border-right: var(--img-size) solid transparent;
    border-left: var(--img-size) solid transparent;

    --img-size: 14px;
}

.dom-events-breakdown .graph > :matches(img, .area) {
    position: absolute;
}

.dom-events-breakdown .graph > img {
    top: calc(50% - (var(--img-size) / 2));
    width: var(--img-size);
    height: var(--img-size);
}

.dom-events-breakdown .graph > .area {
    top: 0;
    height: 100%;
}

.dom-events-breakdown .graph > .area.fullscreen {
    background-color: hsla(0, 0%, 75%, 0.25);
}

.dom-events-breakdown .graph > .area.power-efficient-playback {
    background-color: hsla(83, 100%, 48%, 0.4);
}

.dom-events-breakdown .time {
    text-align: end;
}

.dom-events-breakdown .inherited > .name,
.dom-events-breakdown .inherited > .graph > img {
    opacity: 0.5;
}

.dom-events-breakdown:not(.has-inherited) .originator {
    display: none;
}
