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


/* nav.scss */

.navbar-atlas {
    background-color: $color_tuna_approx;
    //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: inset 0 0 0 $black_10, 0 1px 10px $black_10;
    .navbar-brand {
        color: $white;
    }
    .nav > li > a {
        color: $white;
        padding-top: 18px;
        padding-bottom: 18px;
        font-size: 100%;
        &:focus {
            background-color: transparent;
        }
        &:hover {
            background-color: transparent;
        }
    }
}

.navbar-toggle .icon-bar {
    background-color: $white;
}

.navbar-fixed-top + .wrapper {
    margin-top: 90px;
    padding-bottom: 90px;
}

.navbar-brand {
    font-size: 30px;
    height: auto;
}

.navbar-form {
    width: 30%;
    padding: 0;
    .form-control {
        width: 100%;
        padding: 6px 0;
        background-color: transparent;
        color: $white;
        border: 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: 0 2px $white;
    }
}
