/*
 * 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.
 */
html {
  font-family: @font-sans-serif;
  font-size: 14px;
  color: @text-color;
  line-height: 1.5;
  font-weight: normal;
  background-color: #fff;
  text-size-adjust: 100%;
  height: 100%;
}

body {
  min-height: 100%;
  margin: 0;
  display: flex; // use display: flex so footer stays anchored to bottom for short pages
  flex-direction: column;
}

a {
  color: @link-color;
  text-decoration: none;
  touch-action: manipulation;

  &:hover {
    color: @link-hover;
  }
}

h1,
h2,
h3,
h4,
h5,
h6 {
  font-family: @font-sans-serif;
  line-height: 1.5;
  font-weight: 500;
  color: @header-color;
  word-break: break-word;
}

h1 {
  font-size: 36px;
}

h2 {
  font-size: 21px;
}

code,
pre {
  font-size: 13px;
  font-family: "Droid Sans Mono", "Courier New", Courier, Monaco, Consolas, monospace;
  -webkit-font-smoothing: antialiased;
}

code {
  padding: 0 2px;
  color: #C5351F;
  word-break: break-word;

  a > & {
    color: @link-color;
  }

  a:hover > & {
    color: @link-hover;
  }
}

pre {
  display: block;
  border: 0;
  padding: 6px 12px;

  margin: 0 0 9px;
  overflow-x: auto;

  word-break: normal;
  white-space: pre;

  @-moz-document url-prefix() {
    white-space: pre-wrap;
    word-break: break-all;
  }
}

img {
  border: 0;
  vertical-align: middle;
}

// forms
fieldset {
  margin: 0;
  padding: 0;
  border: 0;
}

// // Fix ios double tap bug
// // http://blog.yorkxin.org/posts/2013/07/03/universal-hover-triggers-double-tap-bug-in-ios-safari/
input[type=search]::-webkit-search-cancel-button {
  display: none;
}

// tables
table {
  border: 0;
  border-collapse: collapse;
}

td,
th {
  padding: 0;
}
