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

body {
    font-family: 'Source Sans Pro', sans-serif;
    background-color: #f6f7fb;
    color: #686868;
}

a {
    color: #359f89;
}

button:focus {
    outline: none !important;
}


/* Bootstrap Extended */

.form-control:focus {
    box-shadow: none;
}

.errorBox {
    position: absolute;
    right: 36px;
    display: none;
    top: 26px;
    width: 251px;
}

.errorBox .alert {
    box-shadow: 4px 3px 8px -2px gray;
}

.close {
    padding: 6px;
    font-size: 15px;
}


/* Login Page */

.login-pane {
    /*margin-top: 50px;*/
    background: #323544;
    color: #eee;
    padding: 15px;
    border-radius: 5px;
}

.login-pane h2 {
    margin-bottom: 40px;
}

.login-pane .input-group {
    margin: 20px 0px;
}

.login-pane .form-control,
.login-pane .input-group-addon {
    background-color: transparent;
    border-radius: 0px;
}

.login-pane .form-control {
    border-left: none;
    color: #eee;
}

.login-pane .form-control:focus {
    border-color: #CCC;
}

.login-pane .input-group-addon {
    border-right: none;
    color: #ccc;
}

.login-pane .form-control:focus + .input-group-addon {
    border-color: #66afe9;
}

.login-pane .btn-atlas {
    background-color: #37bb9b;
    color: #fff;
}


/* Login Page */

.login-pane {
    top: 25%;
    width: 40%;
    left: 30%;
    position: fixed;
    background: #323544;
    color: #eee;
    padding: 15px;
    border-radius: 5px;
}

.login-pane h2 {
    margin-bottom: 40px;
}

.login-pane .input-group {
    margin: 20px 0px;
}

.login-pane .form-control,
.login-pane .input-group-addon {
    background-color: transparent;
    border-radius: 0px;
}

.login-pane .form-control {
    border-left: none;
    color: #eee;
}

.login-pane .form-control:focus {
    border-color: #CCC;
}

.login-pane .input-group-addon {
    border-right: none;
    color: #ccc;
}

.login-pane .form-control:focus + .input-group-addon {
    border-color: #66afe9;
}

.login-pane .btn-atlas {
    padding: 10px 20px;
    background-color: #37bb9b;
    color: #fff;
    border: 1px #37bb9b solid;
    border-radius: 4px;
    -webkit-transition: all .3s ease;
    -moz-transition: all .3s ease;
    transition: all .3s ease;
}
