/*
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 url('../../node_modules/bootstrap/dist/css/bootstrap.css');

* {
  color: white;
}

.navbar-default .navbar-nav > li > a:hover,
.navbar-default .navbar-nav > li > a:focus {
  color: #ffffff;
  background-color: transparent;
}

.navbar-default {
  background-color: #060606;
  border-color: #282828;
}

#toggle {
  background: #060606;
  color: #fff;
}

#toggle:hover {
  color: #fff;
  background-color: #060606;
}

.re:hover {
  cursor: pointer;
}

h3 {
  font-size: 34px;
}

input {
  margin: 12px;
}

.dropdown-menu {
  background-color: #222222;
}

.dropdown-menu > li > a {
  color: #ffffff;
}

.dropdown-menu > li > a:hover {
  text-decoration: none;
  color: #ffffff;
  background-color: #2a9fd6;
}

.navbar-default .navbar-nav > .open > a {
  background-color: #333;
}

.btn-circle {
  font-size: 16px;
  border-radius: 15px 15px 15px 15px;
}

.btn-primary {
  background-color: #2a9fd6;
}

#content {
  background-color: #1A237E;
  background-position: center center;
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-size: cover;
  height: 100vh;
}

hr {
  margin-bottom: 30px;
}

@media (min-width: 992px) {

  #content-row {
    margin-top: 12em;
    margin-bottom: 7em;
  }

  #bark-description {
    display: block;
  }

  #bark-description-2 {
    display: none;
  }
}

@media (max-width: 991px) {

  #content-row {
    margin-top: 0em;
    margin-bottom: 0em;
  }

  #bark-description {
    display: none;
  }

  #bark-description-2 {
    margin-top: 3em;
    display: block;
  }
}

#bark-description p,
#bark-description-2 p {
  margin-left: 100px;
  color: #ffffff;
  font-size: 20px;
}

#content-row {
  padding: 3em 0;
  background-color: rgba(255, 255, 255, 0.2);
}

#loginMsg {
  display: none;
  background-color: #F1D7D7;
  color: #A95252;
  padding: 8px 12px;
  border-radius: 4px;
  text-align: center;
}
