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

@import '../../../public/stylesheets/variables';

ul.tabs {
    $width: auto;
    $height: 40px;
    $offset-vertical: 11px;
    $offset-horizontal: 25px;
    $font-size: 14px;
    $border-width: 5px;

    list-style: none;

    padding-left: 0;
    margin-bottom: 0;

    border-bottom: 1px solid $nav-tabs-border-color;

    li {
        position: relative;
        top: 1px;
        height: $height + $border-width;

        display: inline-block;

        border-bottom: 0px solid transparent;
        transition-property: border-bottom;
        transition-duration: 0.2s;

        a {
            display: inline-block;
            width: $width;
            height: $height;

            padding: $offset-vertical $offset-horizontal;

            color: $text-color;
            font-size: $font-size;
            text-align: center;
            line-height: $height - 2*$offset-vertical;

            &:hover, &:focus {
              text-decoration: none;
            }

            .badge {
              margin-left: $offset-vertical;
            }
        }

        &.active, &:hover {
            border-bottom-width: $border-width;
        }

        &.active {
            border-color: $brand-primary;
        }

        &:not(.active):hover {
            border-color: lighten($brand-primary, 25%);
        }

        & + li {
            margin-left: 45px;
        }
    }
}

ul.tabs.tabs--blue {
    li {
        &.active {
            border-color: #0067b9;
        }

        &:not(.active):hover {
            border-color: #94bbdd;
        }
    }
}