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

.sidebar > .panel.details.css-style > .content {
    position: relative;
}

.sidebar > .panel.details.css-style > .content > .pseudo-classes {
    padding: 6px 10px;
    border-bottom: 1px solid var(--border-color);

    display: flex;
    flex-flow: row wrap;
    justify-content: space-around;
}

.sidebar > .panel.details.css-style > .content > .pseudo-classes > .group {
    display: inline-flex;
    flex-flow: row wrap;
    justify-content: space-around;
    flex: 1;
}

.sidebar > .panel.details.css-style > .content > .pseudo-classes > .group > label {
    color: hsl(0, 0%, 37%);

    margin: 0 5px;
    min-width: 55px;

    display: inline-block;
    white-space: nowrap;
}

.sidebar > .panel.details.css-style > .content ~ :matches(.options-container, .class-list-container) {
    display: flex;
    flex-shrink: 0;
    align-items: center;
    /* Make sure options and class containers are above details section headers, but below popovers. */
    z-index: calc(var(--z-index-header) + 1);
    width: 100%;
    border-top: 1px solid var(--border-color);
}

.sidebar > .panel.details.css-style > .content ~ .options-container {
    height: calc(var(--console-prompt-min-height) - 1px);
    padding-top: 1px;
}

.sidebar > .panel.details.css-style > .content:not(.supports-new-rule, .has-filter-bar) ~ :matches(.options-container, .class-list-container) {
    display: none;
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .new-rule {
    width: 15px;
    min-width: 15px;
    height: 15px;
    -webkit-margin-start: 6px;
    content: url(../Images/Plus15.svg);
    opacity: 0.7;

}

.sidebar > .panel.details.css-style > .content ~ .options-container > .filter-bar {
    width: -webkit-fill-available;
    background-color: transparent;
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .toggle-class-toggle {
    position: relative;
    margin: 0 0 1px;
    -webkit-margin-end: 5px;
    padding: 2px 4px 3px;
    color: var(--text-color);
    background: none;
    border: none;
    border-radius: 3px;
    white-space: nowrap;
    -webkit-appearance: none;
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .toggle-class-toggle::before {
    position: absolute;
    content: "";
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    border-radius: 3px;
    opacity: var(--glyph-opacity);
    z-index: -1;
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .toggle-class-toggle:matches(.selected, :hover) {
    color: var(--selected-foreground-color);
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .toggle-class-toggle:matches(.selected, :hover)::before {
    background-color: var(--glyph-color-active);
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .toggle-class-toggle:not(.selected):hover::before {
    opacity: 0.5;
}

.sidebar > .panel.details.css-style > .content ~ .options-container > .toggle-class-toggle.selected:active::before {
    filter: brightness(0.8);
}

.sidebar > .panel.details.css-style > .content:not(.supports-new-rule) ~ .options-container > .new-rule,
.sidebar > .panel.details.css-style > .content:not(.has-filter-bar) ~ .options-container > .filter-bar {
    display: none;
}

.sidebar > .panel.details.css-style > .content ~ .class-list-container {
    flex-wrap: wrap;
    max-height: 75px;
    padding: 3px 2px;
    background-color: var(--panel-background-color);
    overflow-y: scroll;
}

.sidebar > .panel.details.css-style > .content ~ .class-list-container[hidden] {
    display: none;
}

.sidebar > .panel.details.css-style > .content ~ .class-list-container > .new-class {
    display: flex;
    width: 100%;
}

.sidebar > .panel.details.css-style > .content ~ .class-list-container > .new-class > .class-name-input {
    flex-grow: 1;
    height: 18px;
    margin: 0;
}

.sidebar > .panel.details.css-style > .content ~ .class-list-container > *:matches(.new-class, .class-toggle) {
    margin: 1px 3px;
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .filter-matching {
    display: inline;
    background-color: hsla(53, 83%, 53%, 0.5);
    border-bottom: 1px solid hsl(47, 82%, 60%);
    opacity: 1;
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .style-declaration-section {
    margin-bottom: 0;
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .style-declaration-section.last-in-group.filter-section-non-matching + .style-declaration-section.filter-section-has-label {
    margin-top: 0;
    border-top: none;
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .style-declaration-section:not(.filter-section-has-label) {
    margin-top: 0;
    border-top: none;
    border-bottom: 1px solid var(--border-color);
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .style-declaration-section > .header > .selector > .filter-matching {
    color: black;
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .filter-section-non-matching {
    display: none;
}

.sidebar > .panel.details.css-style > .content.filter-in-progress .filter-property-non-matching {
    opacity: 0.5;
}

@media (prefers-color-scheme: dark) {
    .sidebar > .panel.details.css-style > .content > .pseudo-classes > .group > label {
        color: var(--text-color-secondary);
    }

    .sidebar > .panel.details.css-style > .content ~ .options-container > .new-rule {
        filter: var(--filter-invert);
    }
}
