/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

.bs-select-menu {
    @import '../../../public/stylesheets/variables.scss';

    $item-height: 30px;
    $max-visible-items: 11;

    z-index: 2000;
    padding: 0;
    margin: 0;
    list-style: none;
    position: absolute;
    outline: none !important;
    overflow-y: auto;
    overflow-x: hidden;
    max-height: $max-visible-items * $item-height;
    box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.3);
    border-radius: $ignite-button-border-radius;
    border: 1px solid #c5c5c5;
    background: white;
    color: initial; // Fixes color inheritance inside some containers

    .bssm-active-indicator {
        font-size: 14px;
        width: 12px;
        color: #afafaf;

        &.bssm-active-indicator__active {
            color: $ignite-brand-success;
        }
    }

    .bssm-item-text {
        overflow: visible;
        white-space: nowrap;
    }

    &>li {
        width: 100%;

        &>.bssm-item-button {
            width: 100%;
            justify-content: flex-start;
            border-bottom: 1px solid #dedede;
            padding-bottom: 9px;
            background-color: transparent;
            border-radius: 0;
            padding-right: 30px;

            &:hover {
                background-color: #eeeeee;
            }
        }

        &:last-of-type > .bssm-item-button {
            border-bottom: none;
            padding-bottom: 10px;
        }
    }

    [class*='bssm-multiple'] {
        .bssm-active-indicator {
            display: initial;
        }
    }

    &:not([class*='bssm-multiple']) {
        .bssm-active-indicator {
            display: none;
        }

        & > li > .bssm-item-button__active {
            background-color: #e5f2f9;
        }
    }
}

.bssm-click-overlay {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1999;
}
