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

.filter-bar {
    display: flex;
    height: var(--navigation-bar-height);
    white-space: nowrap;
    overflow: hidden;
}

.filter-bar > .navigation-bar {
    margin-top: 1px;
}

.filter-bar > .navigation-bar > .item {
    padding: 0 0 2px;
}

.filter-bar > .navigation-bar > .item.button {
    padding-bottom: 3px;
}

.filter-bar > .navigation-bar > .item.scope-bar {
    --scope-bar-margin-override: 0;
}

.filter-bar > input[type="search"] {
    display: flex;
    flex: 1;
    min-width: 0;
    margin: 3px 0 4px;
    -webkit-margin-start: 6px;
}

:matches(.filter-bar, .search-bar) > input[type="search"] {
    height: 22px;
    padding-top: 0;
    color: var(--text-color-active);
    background-color: transparent;
    background-clip: padding-box;
    border: 1px solid var(--border-color);
    border-radius: 3px;
    outline: none;
    -webkit-appearance: none;
}

:matches(.filter-bar, .search-bar) > input[type="search"]:matches(:focus, :not(:placeholder-shown)) {
    background-color: var(--background-color-content);
}

:matches(.filter-bar, .search-bar) > input[type="search"]::-webkit-search-decoration {
    align-self: center;
    width: 13px;
    height: 13px;
    margin: 4px 4px 3px 3px;
    background-image: url(../Images/FilterFieldGlyph.svg);
    -webkit-appearance: none;
}

:matches(.filter-bar, .search-bar) > input[type="search"]::-webkit-search-results-button {
    -webkit-margin-end: 4px;
}

/* FIXME: use a different image for ::-webkit-search-decoration when :not(:placeholder-shown) */

:matches(.filter-bar, .search-bar) > input[type="search"]::placeholder {
    color: var(--text-color-secondary);
}

:matches(.filter-bar, .search-bar) > input[type="search"]:matches(:not(:focus), :placeholder-shown)::-webkit-search-cancel-button {
    display: none;
}

:matches(.filter-bar, .search-bar) > .navigation-bar + input[type="search"] {
    -webkit-margin-start: 0;
}

:matches(.filter-bar, .search-bar) > input[type="search"]:focus {
    -webkit-margin-end: 6px;
}

:matches(.filter-bar, .search-bar) > input[type="search"] + :empty {
    -webkit-margin-start: 6px;
}

:matches(.filter-bar, .search-bar) > input[type="search"]:focus ~ * {
    display: none;
}

:matches(.filter-bar, .search-bar) > input[type="search"] + .navigation-bar > .item.scope-bar:last-child {
    -webkit-margin-end: 4px;
}
