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

html, body {
  height: 100%;
}

h1 {
  font-size: 24px;
}

h2 {
  font-size: 20px;
}

h3 {
  font-size: 18px;
}

h4 {
  font-size: 16px;
}

@media (min-width: 1200px) {
  .container {
    width: 1270px;
  }
}

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

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

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

div.value {
    max-height: 200px;
    overflow-y: scroll;
}

.menu {
  padding-top: 15px;

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

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