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

body .sidebar > .panel.navigation.timeline > .timelines-content li.item.cpu,
body .timeline-overview > .graphs-container > .timeline-overview-graph.cpu {
    height: 60px;
}

.timeline-overview-graph.cpu {
    position: relative;
}

.timeline-overview-graph.cpu > .legend {
    position: absolute;
    top: 0;
    z-index: var(--timeline-record-z-index);
    padding: 2px;
    font-size: 8px;
    color: hsl(0, 0%, 50%);
    background-color: var(--timeline-odd-background-color);
    pointer-events: none;

    --cpu-timeline-overview-graph-legend-offset-end: 0;
}

body[dir=ltr] .timeline-overview-graph.cpu > .legend {
    right: var(--cpu-timeline-overview-graph-legend-offset-end);
}

body[dir=rtl] .timeline-overview-graph.cpu > .legend {
    left: var(--cpu-timeline-overview-graph-legend-offset-end);
}

.timeline-overview-graph.cpu:nth-child(even) > .legend {
    background-color: var(--timeline-even-background-color);
}

body[dir=rtl] .timeline-overview-graph.cpu > .stacked-column-chart {
    transform: scaleX(-1);
}

.timeline-overview-graph.cpu > .stacked-column-chart > svg > rect.total-usage {
    fill: var(--cpu-other-thread-fill-color);
    stroke: var(--cpu-other-thread-stroke-color);
}

.timeline-overview-graph.cpu > .stacked-column-chart > svg > rect.main-thread-usage {
    fill: var(--cpu-main-thread-fill-color);
    stroke: var(--cpu-main-thread-stroke-color);
}

.timeline-overview-graph.cpu > .stacked-column-chart > svg > rect.worker-thread-usage {
    fill: var(--cpu-worker-thread-fill-color);
    stroke: var(--cpu-worker-thread-stroke-color);
}

.timeline-overview-graph.cpu > .stacked-column-chart > svg > rect.selected {
    fill: var(--selected-background-color) !important;
    fill-opacity: 0.5;
    stroke: var(--selected-background-color-active) !important;
    stroke-opacity: 0.8;
}
