/*
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: 10px;
	padding-bottom: 50px;
}

.content {
	padding-top: 10px;
}

.breadcrumb {
	background: #f8f8f8;
}

@media (min-width: 992px) and (max-width: 1200px) {
    #contentcol { float: left; width: 70%; }
    #sidenavcol { float: left; width: 30%; }
}

/*=============================================================================
 Per page TOC
=============================================================================*/

/* Move the side nav a little bit down to align with the main heading */
#markdown-toc {
	font-size: 90%;
	padding-top: 16px;
	padding-bottom: 16px;
}

/* Custom list styling */
#markdown-toc, #markdown-toc ul {
	list-style: none;
	display: block;
	position: relative;
	padding-left: 0;
	margin-bottom: 0;
}

/* All element */
#markdown-toc li > a {
	color: #000;
	display: block;
	padding: 5px 10px;
	border: 1px solid #E5E5E5;
	margin: -1px;
}
#markdown-toc li > a:hover,
#markdown-toc li > a:focus {
  text-decoration: underline;
  background-color: #eee;
}

@media (min-width: 768px) {
	#markdown-toc > li {
		width: 400px;
	}
}

/* 1st-level elements */
#markdown-toc > li > a {
	font-weight: bold;
}

/* 2nd-level element */
#markdown-toc > li li > a {
	padding-left: 20px; /* A little more indentation*/
}

/* >= 3rd-level element */
#markdown-toc > li li li {
	display: none; /* hide */
}

#markdown-toc li:last-child > a {
	border-bottom: 1px solid #E5E5E5;
}

/*=============================================================================
                                    Text
=============================================================================*/

h2 {
	border-bottom: 1px solid #e5e5e5;
}

h2, h3, h4 {
	padding-top: 1em;
}

code {
	color: #000000;
	background: #ffffff;
	padding: 1px;
	font-family: "Menlo", "Lucida Console", monospace;
}

pre {
	background: #f7f7f7;
	border: none;
	font-size: 12px;
	font-family: "Menlo", "Lucida Console", monospace;
}

img.center {
	display: block;
	margin-left: auto;
	margin-right: auto;
}

a.top {
	color: black;
	text-decoration: none
}

.text {
	font-size: 14px;
}

.beta {
	font-weight: normal;
	color: #333;
}

table {
	width: 100%;
}

th {
	text-align: center;
}

td {
	padding: 5px;
}

img.offset {
	display: block;
	margin-left: auto;
	margin-right: auto;
	margin-bottom: 30px;
	margin-top: 30px;
	padding: 10px;
}

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

.anchorjs-link:hover {
    text-decoration: none;
}
*:hover > .anchorjs-link {
    transition: color .25s linear;
}

/*=============================================================================
                                 Gelly Graphs
=============================================================================*/

svg.graph line {
    stroke: rgb(255,0,0);
    stroke-width: 4;
}

svg.graph circle {
    fill: red;
    stroke: black;
    stroke-width: 3;
}

svg.graph text {
    dominant-baseline: central;
    font-size: 32px;
    text-anchor: middle;
}

/*=============================================================================
 Side navigation
=============================================================================*/

#sidenav a i.title {
    min-width: 21px;
}

#sidenav a i.title.appetizer {
    color: #FBB142;
}

#sidenav a i.title.maindish {
    color: #7E4F89;
}

#sidenav a i.title.dessert {
    color: #E6526F;
}

#sidenav hr.section-break {
    margin-bottom: 5px;
    border-top: 0px;
}

#sidenav, #sidenav ul {
	list-style: none;
	display: block;
	position: relative;
	padding: 0;
	margin: 0;
	color: black;
}

ul#sidenav {
	padding: 10px;
	border: 1px solid #ffffff;
	background: #f8f8f8;
	font-size: 15px;
}

#sidenav a {
	display: block;
	color: black;
	text-decoration: none;
}

#sidenav a.active {
	font-weight: bold;
}

#sidenav a:hover, #sidenav a:focus {
	font-weight: bold;
}

/* 1st-level elements */
#sidenav > li {
	padding: 10px 5px 5px 5px;
}

/* 2nd-level element */
#sidenav > li > ul {
		padding-top: 5px;
}

#sidenav > li li {
	padding: 5px 0px 0px 15px;
	font-size: 14px;
}

#sidenav > li li li {
	font-size: 13px;
}

.sidenav-search-box {
	text-align: center;
	padding: 10px;
	background: #ececec;
	border: 1px solid #fff;
}

.sidenav-logo {
	text-align: center;
	padding-top: 10px;
}

.sidenav-logo img {
	width: 125px;
	vertical-align: text-bottom;
	padding-bottom: 2px;
}

.sidenav-logo p {
	font-weight: bold;
	font-size: 13px;
}

.sidenav-versions {
	margin-top: 10px;
	padding: 10px;
}

.sidenav-versions button {
	width: 100%;
}
