/*
 * 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 {
    padding-top: 51px !important;
    -moz-osx-font-smoothing: grayscale;
    -webkit-font-smoothing: antialiased;
    font-size: 16px;
    background-color: #f9f9fb;
}

body #content {
    line-height: 1.6;
    /* Inspired by Github's wiki style */
}

pre {
    font-family: "Menlo", "Lucida Console", monospace;
}

code {
    font-family: "Menlo", "Lucida Console", monospace;
    border: none;
    padding: 0;
    color: #444444;
    background-color: #f9f9fb;
    font-size: 85%;
}

a code {
    color: #FF7032;
}

a:hover code {
    color: #d74108;
    text-decoration: none;
}

.navbar .projecttitle>a:hover,
.navbar .projecttitle>a:focus {
    color: #FFF
}

.container {
    max-width: 914px;
}

#content {
    margin-top: 30px;
    margin-bottom: 50px;
    color: #363f3f;
}

h1,h2,h3,h4,h5,h6{
    line-height: 1.3em;
    font-weight: 700;
    margin-bottom: 0.5em;
}

h1{
    font-size: 2em;
}

h2{
    font-size: 1.7em;
}

h3{
    font-size: 1.5em;
}

h4{
    font-size: 1.3em;
}

h5{
    font-size: 1.2em;
}

h6 {
    font-size: 1.1em;
}


pre {
    background-color: #FFF
}


/* Branding */

.brand {
    font-weight: normal !important;
    padding-top: 0px;
    padding-bottom: 0px;
    max-width: 75%;
}

img.logo {
    height: 31px;
    width: 32px;
    margin-right: 10px;
    display: none;
    margin-top: 10px;
    margin-left: 10px;
}


/* Navigation Bar */

.navbar {
    background-color: rgba(0, 0, 0, 0.9);
    /*height: 68px;*/
}

.navbar-brand {
    font-size: 20px;
}

.navbar-brand.brand.projecttitle {
    padding-top: 7px;
}

.navbar-right {
    height: 100%;
}

.navbar-collapse {
    /*height: 67px !important;*/
    background: rgba(0, 0, 0, 0);
}

.navbar-collapse.collapse {
    background: rgba(0, 0, 0, 0);
    border-top: 0px;
}

.navbar-collapse.collapsing {
    background: rgba(0, 0, 0, 0);
    border-top: 0px;
}

.navbar-toggle {
    border-radius: 1px;
}

.navbar-header {
    padding-top: 0px;
    padding-bottom: 10px;
}

.navbar .container {
    background-image: none;
}

.navbar .divider-vertical {
    border-right-color: lightgray;
}

.navbar-text .version-text {
    color: #555555;
}

.navbar .version {
    color: #fff;
    font-size: 12px;
    font-weight: bold;
    line-height: 20px;
    margin: 0;
    padding: 0 0 0 2px;
    vertical-align: bottom;
}

.navbar .projecttitle {
    margin-top: 7px;
    height: 40px;
    white-space: nowrap;
}

.navbar .projectlogo {
    width: 75px;
}


/* Dropdown menu */

.dropdown-menu {
    /* Remove the default 2px top margin which causes a small
      gap between the hover trigger area and the popup menu */
    margin-top: 0;
    /* Avoid too much whitespace at the right for shorter menu items */
    min-width: 50px;
}


/**
   * Made the active tab caption blue. Otherwise the active tab is black, and inactive tab is blue.
   * That looks weird. Changed the colors to active - blue, inactive - black, and
   * no color change on hover.
   */

.nav-tabs>.active>a,
.nav-tabs>.active>a:hover {
    color: #08c;
}

.nav-tabs>li>a,
.nav-tabs>li>a:hover {
    color: #333;
}


/**
   * Search bar
   */

input#s-bar {
    margin-left: 10px;
}


/**
   * MathJax (embedded latex formulas)
   */

.MathJax .mo {
    color: inherit
}

.MathJax .mi {
    color: inherit
}

.MathJax .mf {
    color: inherit
}

.MathJax .mh {
    color: inherit
}


/**
   * AnchorJS (anchor links when hovering over headers)
   */

a.anchorjs-link:hover {
    text-decoration: none;
}

table td,
table th {
    border: 1px solid #333;
    padding: 0 .5em;
}

table th {
    background: #CCC;
    padding: 0 .5em;
}

table {
    margin-bottom: 20px;
}

.grayboldcell {
    background: #CCC;
    font-weight: bold;
}

.centerboldcell {
    text-align: center;
    font-weight: bold;
}

.boldcell {
    font-weight: bold;
}

.lightgreen {
    background: #bfffba;
}

.lightred {
    background: #ff7b7b;
}

.navbar a,
.navbar .nav>li>a {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-style: normal;
    text-shadow: none;
    color: #FFF;
    height: 100% !important;
    padding-top: 25px;
}

.navbar a:hover {
    text-decoration: none;
}

.navbar .nav>li>a:focus,
.navbar .nav>li>a:hover {
    background-color: #ff5003;
    color: #FFF;
}

.navbar .nav>li {
    height: 100%;
}

.dropdown-menu a {
    color: #FFF !important;
}

.dropdown-menu b {
    color: #FFF !important;
    margin-left: 0.5em;
}

.dropdown-menu li>a:focus,
.dropdown-menu li>a:hover {
    background-color: #ff5003;
    background-image: none;
    font-color: red;
}

a {
    color: #FF7032;
}

a:focus,
a:hover {
    color: #d74108;
    text-decoration: none;
}

#trademark {
    font-size: 0.5em;
    font-weight: 300;
    vertical-align: middle;
}


/* Media queries */

@media only screen and (max-device-width: 768px) and (orientation: landscape) {
    /* landscape mobile */
    img.logo {
        display: inline;
    }
}

@media only screen and (min-device-width: 768px) {
    /* >= tablet */
    img.logo {
        display: inline;
    }
    .brand {
        max-width: initial;
    }
    .dropdown-menu a {
        color: #333 !important;
    }
    .dropdown-menu a:hover {
        color: #FFF !important;
        transition: all 0.2s ease-in-out 0s;
    }
    .dropdown-menu b {
        color: #333 !important;
    }
}

@media only screen and (min-device-width: 1024px) {
    /* Desktop */
    /**
     * Make dropdown menus in nav bars show on hover instead of click
     * using solution at http://stackoverflow.com/questions/8878033/how-
     * to-make-twitter-bootstrap-menu-dropdown-on-hover-rather-than-click
     **/
    ul.nav li.dropdown:hover ul.dropdown-menu {
        display: block;
    }
    a.menu:after,
    .dropdown-toggle:after {
        content: none;
    }
    /** Make the submenus open on hover on the parent menu item */
    ul.nav li.dropdown ul.dropdown-menu li.dropdown-submenu:hover ul.dropdown-menu {
        display: block;
    }
    /** Make the submenus be invisible until the parent menu item is hovered upon */
    ul.nav li.dropdown ul.dropdown-menu li.dropdown-submenu ul.dropdown-menu {
        display: none;
    }
    /**
     * Made the navigation bar buttons not grey out when clicked.
     * Essentially making nav bar buttons not react to clicks, only hover events.
     */
    .navbar .nav li.dropdown.open>.dropdown-toggle {
        background-color: transparent;
    }
}