/*
 * 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.
 *
 */

* {
	margin: 0;
	padding: 0;
}

body,
html {
	font-family: 'Heebo', sans-serif;
}

.mt-10 {
	margin-top: 10px;
}

h1,
h2,
h3,
h4,
h5,
h6 {
	font-family: 'Heebo', sans-serif;
	font-weight: 700;
	color: #404551;
	line-height: 1.2;
}

a,
a:hover,
a:focus,
a:active {
	font-weight: 700;
	text-decoration: none;
	-webkit-transition-duration: 400ms;
	transition-duration: 400ms;
}

li {
	list-style: none;
}

p {
	font-family: 'Roboto', sans-serif;
	color: #44444e;
	font-size: 15px;
	font-weight: 500;
	margin-top: 0;
	line-height: 1.9;
}

ul,
ol {
	margin: 0;
	padding: 0;
}

img {
	max-width: 100%;
	height: auto;
}

.section-padding-100 {
	padding-top: 100px;
	padding-bottom: 100px;
}

.section-padding-100-0 {
	padding-top: 100px;
	padding-bottom: 0;
}

.section-padding-50 {
	padding-top: 50px;
	padding-bottom: 50px;
}

.margin-top-50 {
	margin-top: 50px;
}

.margin-top-20 {
	margin-top: 20px;
}

.margin-right-50 {
	margin-right: 15px;
}

.main-section-area {
	background-color: #1b1464;
	position: relative;
	z-index: 1;
}

.main-section-area .section-heading {
	margin-bottom: 60px;
}

.main-section-area .section-heading h2 {
	color: #fff;
}

.support-links-area {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 20%;
	flex: 0 0 20%;
	max-width: 16.5%;
	padding: 100px 20px;
	position: relative;
	z-index: 1;
	-webkit-transition-duration: 750ms;
	transition-duration: 750ms;
}

.support-links-area:hover {
	box-shadow: 0 10px 20px 10px rgba(0, 0, 0, 0.1);
}

.event-list ul {

}

.banner-link {
	color:white;
	text-decoration: underline;
}

.banner-link:hover {
	color:#1b1464;
	text-decoration: underline;
}

.header-banner {
	background: white;
	z-index: 999;
	color:white;
	text-align: center;
	height:40px;
	width:100%;
	position:absolute;
	top:0px;
}

.header-banner-news {
	background:rgb(57,181,74);
	border-radius:0% 100% 6% 94% / 100% 0% 100% 0%;
	width:90%;
	position:absolute;
	top:0px;
	left:0px;
	height:40px;
	justify-content: center;
	display: flex;
	align-items: center;
}

.header-banner.sticky {
	position:fixed;
}

.event-list ul li {
	font-size: 18px;
	margin-left: 10px;
	display:list-item;
	list-style-type: square;
}

.feature-item-margin {
	margin-bottom:25px;
	line-height: 1.4;
	font-size: 1.1rem;
}

.installation-manual-part {
	margin-bottom:30px;
}

.installation-step {
	margin-top:15px;
	margin-bottom:15px;
}

.section-subtitle {
	font-size: 22px;
	color: #abadbe;
	line-height: 1.8;
	font-weight: 500;
	text-align:center;
	margin-bottom:30px;
}

.usecases-applications-item {
	text-align:justify;
	border-left:2px solid rgb(57,181,74);
	padding:10px;
}

.sp-color-green {
	color: rgb(57,181,74);
}

.sp-background-green {
	background: rgb(57,181,74);
}

.margin-top {
	margin-top:40px;
}

.pe-icon-container {
	box-shadow: 0 0 2px #555;
	width: 75px;
	height: 75px;
	display: inline;
	float: left;
	padding: 10px;
	margin-right: 20px;
	margin-top: 10px;
}

.pe-icon-processor {
	border: 2px solid #009688;
}

.pe-icon-sink {
	border: 2px solid #3f51b5;
}

.pe-icon {
	display: inline-block;
	margin-left: auto;
	margin-right: auto;
	max-height: 100%;
	width: 100%;
}

.feature-section-gray {
	background: #e6e6e6;
}

.page-section-title {
	text-align:center;
	margin: 10px 0 80px 0;
}

.page-section-title::after {
	content: '';
	width: 125px;
	border-bottom: #1b1464 8px solid;
	margin: 24px 0;
	display: block;
	transform: translateX(-50%);
	left: 50%;
	position: absolute
}

.header-area {
	padding: 0px;
}

.sp-button-margin {
	margin-bottom:10px;
}

.container-header {
    padding-left:80px;
    padding-right:20px;
    width:100%;
}

.header-apache-text {
	line-height:1.2;
	font-family: 'Heebo', sans-serif;
	font-size:32pt;
	margin-bottom:20px;
}

.feature-highlights-section {
    margin-top: 40px;
    margin-bottom: 60px;
}

.feature-highlights {
	margin-top: 16px;
    margin-bottom: 16px;
	font-size:18pt;
	width:100%;
}

.feature-highlights-icon {
    margin-right:10px;
}

.feature-highlights-text {
    border-bottom: 1px solid rgb(204, 217, 223);
    padding-bottom: 10px;
}

.feature-highlights-bg {
	background: rgb(57,181,74);
	color:white;
	padding:3px;
}

.sp-blue {
	color: #1b1464;
}

.sp-green {
	color: rgb(57,181,74);
}

.apache-teaser {
	position: relative;
	padding-left: 1em;
	border-left: 0.2em solid rgb(57,181,74);
	font-family: 'Roboto', serif;
	font-size: 16pt;
	font-weight: 100;
}

.apache-teaser:before, .apache-teaser:after {
	content: '\201C';
	font-family: 'Sanchez';
	color: rgb(27, 20, 100);
}

.apache-teaser:after {
	content: '\201D';
}

.form-group.position-relative input {
	padding-right: 32px;
}

.form-clear {
	align-items: center;
	background: #cecece;
	border-radius: 50%;
	bottom: 8px;
	color: rgba(0, 0, 0, .54);
	cursor: pointer;
	display: flex;
	height: 24px;
	justify-content: center;
	position: absolute;
	right: 0;
	width: 24px;
	z-index: 10;
}

.form-text+.form-clear {
	bottom: calc(1rem + 18px);
}

.form-clear .material-icons {
	font-size: 16px;
	font-weight: 500;
}






