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

/* .navbar-inverse {
    background: #4a95da;
    background: rgb(44, 95, 163);
    background: -moz-linear-gradient(top, rgba(44, 95, 163, 1) 0%, rgba(64, 150, 238, 1) 100%);
    background: -webkit-linear-gradient(top, rgba(44, 95, 163, 1) 0%, rgba(64, 150, 238, 1) 100%);
    background: linear-gradient(to bottom, rgba(44, 95, 163, 1) 0%, rgba(64, 150, 238, 1) 100%);
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2c5fa3', endColorstr='#4096ee', GradientType=0);
    border-color:white;
  }
  .navbar-inverse .navbar-nav>li>a, .navbar-inverse .navbar-text {
    color: #fff;
  }
  .navbar-inverse .navbar-nav>.active>a {
      background-color: #1764AA;
  }
  .navbar-inverse .navbar-nav>.active>a:focus, .navbar-inverse .navbar-nav>.active>a:hover {
      background-color: #1764AA;
  } */

.btn-primary:hover {
  background-color: #1764aa;
}
button,
a {
  color: #1764aa;
  /* #0095eb */
}
button:hover,
button:focus,
a:hover,
a:focus {
  color: #143653;
  text-decoration: none;
}
nav.navbar {
  background-color: white;
}
.navbar-brand {
  height: 80px;
}
.navbar-header .navbar-brand img {
  width: 300px;
  height: 55px;
  margin: 10px 10px 10px 0px;
}
.navbar-toggle .icon-bar {
  margin-top: 2px;
  background-color: #0095eb;
}
.navbar-toggle {
  border-color: #0095eb;
}
header ul.navbar-nav {
  /* font-size:1.2em; */
  float: right;
  font-weight: 600;
}
@media screen and (min-width: 768px) {
  header ul.navbar-nav {
    padding-right: 100px;
  }	
}

.sidefilter {
  top: 120px;
}

.sidetoc {
  top: 180px;
  background-color: rgb(247, 247, 247);
}

body .toc {
  background-color: rgb(247, 247, 247);
}

.sidefilter {
  background-color: rgb(247, 247, 247);
}

/* FORK ME ON GITHUB */
#forkongithub a {
  background: #1764aa;
  color: #fff;
  text-decoration: none;
  font-family: arial, sans-serif;
  text-align: center;
  font-weight: bold;
  padding: 5px 40px;
  font-size: 1rem;
  line-height: 2rem;
  position: relative;
  transition: 0.5s;
}
#forkongithub a:hover {
  background: black;
  color: #fff;
}
#forkongithub a::before,
#forkongithub a::after {
  content: "";
  width: 100%;
  display: block;
  position: absolute;
  top: 1px;
  left: 0;
  height: 1px;
  background: #fff;
}
#forkongithub a::after {
  bottom: 1px;
  top: auto;
}
@media screen and (min-width: 768px) {
  #forkongithub {
    position: fixed;
    display: block;
    top: 0;
    right: 0;
    width: 200px;
    overflow: hidden;
    height: 200px;
    z-index: 9999;
  }
  #forkongithub a {
    width: 200px;
    position: absolute;
    top: 40px;
    right: -40px;
    transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
  }
}
