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


/* business-catlog.scss */

.main-search {
    .form-control {
        border: none;
        border-left: 1px $color_mystic_approx solid;
        //Instead of the line below you could use @include border-radius($radius, $vertical-radius)
        border-radius: 0;
        //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10)
        box-shadow: none;
        height: 60px;
        font-size: 18px;
        font-style: italic;
    }
    .input-group-addon {
        font-size: 20px;
        color: $color_bombay_approx;
        background: none;
        border: none;
    }
}

.arrowPosition {
    left: -75px;
}

.sidebar-item.active i {
    display: block !important;
}

.dropdown-menu > li > a {
    color: $color_jungle_green_approx;
    padding: 6px 20px;
    text-overflow: ellipsis;
    max-width: 276px;
    overflow: hidden;
}

.branchListParent {
    .parentActive {
        background: none;
    }
    .fa {
        line-height: 40px;
    }
}

ul[data-id=branchList] {
    .fa {
        line-height: 40px;
    }
    li {
        padding-left: 50px;
    }
}

.branchChildDiv {
    padding-left: 15px;
}

.branchListParentInput {
    padding-bottom: 18px;
    display: list-item;
    .form-control {
        border-right: none;
        //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10)
        box-shadow: none;
        //Instead of the line below you could use @include border-radius($radius, $vertical-radius)
        border-radius: 4px;
    }
    .input-group-addon {
        background-color: $white;
    }
}

.listTerm {
    padding-bottom: 5px;
}

.lineageLabel {
    padding-bottom: 10px;
}

.detailLabel {
    padding-bottom: 10px;
}

.termNote {
    padding-top: 10px;
}
