/*
 * 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 {
    flex-grow: 1;
    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.style-rules > .content ~ :matches(.options-container, .class-list-container) {
    /* Cover the border-bottom of the last CSS rule. */
    transform: translateY(-1px);
}

.sidebar > .panel.details.css-style > .content ~ .options-container {
    height: var(--navigation-bar-height);
    padding-top: 2px;
}

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