/*
 * 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 {
	font-family: Tahoma, Geneva, sans-serif;
	font-size: 1.1em;
}

a {
	text-decoration: none;
	color: #3d3d82;
}

h2 {
	color: #3d3d82;
}

a:hover {
	text-decoration: underline;
}

#projectname {
	font-size: 3em;
	font-weight: bold;
}

.summary {
	padding-top: 3px;
	float: right;
}

.title {
	border-top: 1px solid;
	font-size: 2em;
	font-weight: bold;
	padding: 5px 0 0 10px;
}

.groupheader {
	color: #3d3d82;
	font-size: 1.6em;
	font-weight: normal;
	border-bottom: 1px solid;
}

.memberdecls {
	border-collapse: separate;
	border-spacing: 0 0;
}

.memItemLeft,
.mdescLeft {
	padding-left: 15px;
	background-color: #f8f8f8;
}

.memItemRight {
	background-color: #f8f8f8;
}

.memItemRight a {
	font-weight: bold;
}

.mdescRight {
	line-height: 160%;
	background-color: #f8f8f8;
}

.memSeparator {
	font-size: 5px;
	background-color: #f8f8f8;
	border-bottom: 1px solid #ccc;
}

.memitem {
	border: 1px solid #3d3d82;
	border-radius: 5px;
	margin-bottom: 10px;
}

.memproto {
	background-color: #d1d7f6;
	padding: 5px 5px 0 5px;
	border-radius: 5px 5px 0 0;
}

.memdoc {
	padding: 0 5px 5px 5px;
}

td.memname {
	font-weight: bold;
	color: #3d3d82;
}

dt {
	font-weight: bold;
}

.paramname {
	color: #6c2b32;
	font-weight: bold;
}

div.fragment {
	border: 1px solid #b5baff;
	border-radius: 8px;
	padding: 8px;
	background-color: #f8f8f8;
	white-space: pre;
	font-family: "Lucida Console", Monaco, monospace;
}

div.line {
	display: inline;
}

.comment {
	color: blue;
}

.stringliteral {
	color: #95181a;
}

.keywordflow {
	color: #dc821b;
}
