// 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;
  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;
}

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;
}
