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

@media (min-width: 992px) and (max-width: 1199px) {
    .menu-area #nav .nav-link {
        padding: 0 10px;
    }
    .header-banner {
        height:80px;
    }
}

@media (min-width: 768px) and (max-width: 991px) {
    .navbar-toggler {
        border: 2px solid #fff;
        background-color: #f2f4f6;
        margin: 32px 0;
    }
    .sticky .navbar-toggler {
        margin: 11px 0;
    }
    .navbar-toggler-icon {
        background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
    }
    #sp-navbar {
        padding: 30px;
        border-radius: 5px;
        background-color: #ffffff;
        text-align: left;
    }
    .header-area.sticky .navbar {
        height: 70px;
    }
    .menu-area #nav .nav-link {
        font-size: 14px;
        padding: 6px 0;
    }

    .support-links-area {
        -webkit-box-flex: 0;
            -ms-flex: 0 0 50%;
                flex: 0 0 50%;
        max-width: 50%;
    }

}

@media (min-width: 320px) and (max-width: 767px) {
    .header-area {
        padding: 0;
        height: 140px;
    }

    .header-area.sticky {
        height:80px;
        top:60px;
    }

    .header-banner.sticky {
        height:140px;
    }

    .header-banner {
        height:160px;
    }

    .footer-section {
        height:100%;
    }

    .navbar-collapse {
        background:white;
    }

    .header-banner-news {
        width:100%;
        height:60px;
        border-radius:0;
    }

    .navbar-toggler {
        border: 2px solid #fff;
        background-color: #f2f4f6;
        margin: 11px 0;
    }
    .sticky .navbar-toggler {
        margin: 11px 0;
    }
    .navbar-toggler-icon {
        background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
    }

    .header-area.sticky .navbar {
        height: 70px;
    }
    .menu-area #nav .nav-link {
        font-size: 14px;
        padding: 6px 0;
    }

    .section-heading > h2 {
        font-size: 24px;
    }

    .support-links-area {
        -webkit-box-flex: 0;
            -ms-flex: 0 0 100%;
                flex: 0 0 100%;
        max-width: 100%;
    }

    .footer-bottom-area {
        height: 100px;
        text-align: center;
        padding: 25px 0;
    }
}

@media (min-width: 480px) and (max-width: 767px) {
}

@media (min-width: 576px) and (max-width: 767px) {
    .support-links-area {
        -webkit-box-flex: 0;
            -ms-flex: 0 0 50%;
                flex: 0 0 50%;
        max-width: 50%;
    }
    .header-banner {
        height:80px;
    }
}