@charset "UTF-8";
/*
 - 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.
*/


#top-bar {
	background:url(../images/topbar.jpg);
	height:6px;
	width:100%;
}

.tagline {
	white-space: nowrap;
}


/** =======================================================  */
/** Github Ribbon */
/** ======================================================= **/

.github-fork-ribbon.right-top:before {
	background-color: #3254a0;
}


/** =======================================================  */
/** Yellow smiles! */
/** ======================================================= **/


/* Yellow smiles! */
.fa-smile-o {
	position: relative;
}
.fa-smile-o:before {
	content: "\f111";
	color: #f1c40f;
}
.fa-smile-o:after {
	left: 0;
	position: absolute;
	content: "\f118";
}


/** =======================================================  */
/** Footer Styling*/
/** ======================================================= **/

.wrapper {
	position:relative;
	width:960px;
	margin:auto;
	padding:0 10px 0 10px;
}

html {
	position: relative;
	min-height: 100%;
}
body {
	/* Margin bottom by footer height + image */
	margin-bottom: 160px;
}

.footer-padding {
	height: 160px;
}

.custom-footer {
	position: absolute;
	bottom: 0;
	width: 100%;
	/* Set the fixed height of the footer here */
	min-height: 60px;
	background: #e8e8e8;
	padding-top: 10px;
}

.editThisPage {
	font-size:16px;
}

.copyright-footer {
	margin-left: 50px;
}

@media screen and (min-width: 1024px) {
	.footer-shield {
		position: absolute;
		width: 103px;
		height: 113px;
		right: -80px;
		top: -80px;
		background:url(../images/footer-shield.png) no-repeat;
	}
}


/** =======================================================  */
/** Main page tiles */
/** ======================================================= **/

.authentication {
	background:url(../images/authentication.png) no-repeat #f2f2f2 right 10px top 5px;
}
.authorization {
	background:url(../images/authorization.png) no-repeat #f2f2f2 right 10px top 5px;
}
.cryptography {
	background:url(../images/crypt.png) no-repeat #f2f2f2 right 10px top 5px;
}
.session-management {
	background:url(../images/session.png) no-repeat #f2f2f2 right 10px top 5px;
}
.web-integration {
	background:url(../images/web-integration.png) no-repeat #f2f2f2 right 10px top 5px;
}
.integrations {
	background:url(../images/integration.png) no-repeat #f2f2f2 right 10px top 5px;
}


/** =======================================================  */
/** News posts */
/** ======================================================= **/
.blog-post-listing {
	margin: 1.8em 0 0 0;
	padding: 0 0 0.8em 0;
	border-bottom: 1px solid #d2d2d2;
}
.blog-post-listing .logoBlock {
	display: none;
}

.blog-post-listing span.blogHeading .page-metadata {
	font-size: 0.8em;
}

.blog-post-listing .endsection {
	display: none;
}

.blog-post-listing a.blogHeading {
	font-size: 2em;
	font-weight: bold;
}

.news-content {
	padding-top: 1em;
}