/*
 * 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 "variables.less";
@import "non-responsive.less";

html, body {
  height: 100%;
}

h1 {
  font-size: 24px;
}

h2 {
  font-size: 20px;
}

h3 {
  font-size: 18px;
}

h4 {
  font-size: 16px;
}

.page-header {
  margin-bottom: 5px !important;
  margin-top: 10px !important;
  h1 {
    margin-bottom: 0px;
  }
}

.wrapper {
  min-height: 100%;

  .wrapper-content {
    overflow: auto;
    padding-bottom: 120px;
  }
}

.masthead {
	background-color: @masthead-background-color;

  .masthead-logo {
    display: inline-block;
    background-color: @masthead-logo-color;
    font-family: 'Ropa Sans', sans-serif;
    font-size: 3em;
    color: #fff;
    width: 220px;
    float: left;
    padding-left: 20px;

    a {
      color: #fff;
      &:hover {
        text-decoration: none;
      }
    }
  }

  .masthead-icons {
    font-size: 3em;

    .masthead-icon {
      margin-left: .2em;
      color: @masthead-icon-color;
    }
  }
}

pre {
  border: 0px !important;
  border-radius: 0px !important;
  overflow-x: auto;
  background-color: #f7f7f7;
  font-size: 12px;
  code {
    overflow-wrap: normal;
    white-space: pre;
  }
}

th.header {
  cursor: pointer;
  background-image: url(../img/bg.gif);
  background-repeat: no-repeat;
  background-position: center right;
  padding-right: 15px !important;
}

th.headerSortUp {
  background-color: #f5f5f5;
  background-image: url(../img/desc.gif);
}

th.headerSortDown {
  background-color: #f5f5f5;
  background-image: url(../img/asc.gif);
}

td.key {
  width: 25%;
  font-weight: bold;
}

.menu {
  padding: 15px;
  float: left;
  width: 220px;

  .nav {
    margin-left: -15px;
    margin-right: -15px;
  }

  .nav-pills > li > a {
    border-radius: 0px;
  }

  .nav-pills > li.active > a,
  .nav-pills > li.active > a:hover,
  .nav-pills > li.active > a:focus {
    //background-color: #f0f0f0;
  }

  h1 {
    font-size: 16px;
    margin: 10px 0px;
  }

  ul {
    list-style: none;
    padding: 0;

    li {
      line-height: 150%;
    }
  }
}

.content {
  margin-left: 240px;
}

.committer-icon {
  font-size: 16px;
}

img.diagram-large {
  width: 100%;
}

ul.documentation-list {
  list-style: none;
  padding-left: 20px;
}

.footer {
  clear: both;
  position: relative;
	background-color: @masthead-background-color;
  z-index: 10;
  height: 100px;
  margin-top: -100px;
}
