/*
 * 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;
	overflow-x: hidden;
}

.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: 20px 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-left: 5px;
	margin-right: 5px;
}

.container-header {
	margin: 4rem;
	border-radius: 15px;
}

.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 {
	font-size:18pt;
	width:100%;
	//background: rgba(255, 255, 255, 0.85);
	box-shadow: rgba(0, 0, 0, 0.02) 0px 1px 3px 0px, rgba(27, 31, 35, 0.15) 0px 0px 0px 1px;
	height: 250px;
	border-radius: 10px;
	text-align: center;
	padding: 15px;
}

.feature-highlights-icon {
    margin-right:10px;
	color: var(--color-accent);
	font-size: 3rem;
}

.feature-highlights-title {
    font-weight: 800;
	color: var(--color-accent);
	font-size: 1.5rem;
}

.feature-highlights-subtitle {
	color:var(--color-primary);
	padding:3px;
	font-weight: 500;
	font-size: 1rem;
}

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

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

.apache-teaser {
	text-align: left;
	font-family: 'Roboto', serif;
	font-size: 15pt;
	font-weight: 500;
	max-width: 80%;
	margin-left: auto;
	margin-right: auto;
	text-align: center;
}

.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;
}

.h-100 {
	height: 100%;
}

.teaser-image {
	background-image:url('/img/bg-img/sp.png');
	//background:linear-gradient(0deg, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.5)), url('/img/bg-img/bg-index-color.png');
	background-size:cover;
	border-radius: 20px;
	margin: 30px auto;
	height: calc(100vh - 72px);
}

.teaser-text-area {
	background:rgba(255, 255, 255, 0.95);
	margin-top:50px;
	margin-bottom:50px;
	padding:35px;
	border-radius:15px;
	display:inline-block;
	max-width:750px;
}

.ml-0 {
	margin-left: 0;
}

.mb-20 {
	margin-bottom: 20px;
}

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

.mr-0 {
	margin-right: 0;
}

.event-image {
	position:absolute;
	bottom:50px;
	float:right;
	margin-left:20px;
	margin-right:-10px;
	margin-top:50px;
}

.top-claim-area {
	margin-top: 3rem;
	text-align: center;
}

.top-claim-area-subtitle {

}

.top-claim-area-subtitle-text {
	text-transform: uppercase;
	color: var(--color-accent);
	font-weight: 800;
	font-size: 1.75rem;
	padding: 10px;
}

.top-claim-area-main-title {
	font-weight: 800;
	font-size: 5.25rem;
	color: var(--color-primary);
}

.top-claim-area-main-title:after {
	content: '';
	width: 125px;
	border-bottom: var(--color-accent) 8px solid;
	display: block;
	margin: 12px auto;
	left: 50%;
}

.after-apache-teaser:before {
	content: '';
	width: 125px;
	border-bottom: var(--color-accent) 8px solid;
	display: block;
	margin: 12px auto;
	left: 50%;
}

.teaser-actions {
	margin-top: 2rem;
}

.left-claim-section {
	padding-left: 3rem;
	margin-top: -20px;
}

.feature-hz-title {
	font-family: 'Heebo', sans-serif;
	font-weight: 800;
	color: var(--color-accent);
	line-height: 1.2;
	font-size: 1.5rem;
}

.feature-hz-number {
	font-family: 'Heebo', sans-serif;
	font-weight: 700;
	line-height: 1.2;
	color: var(--color-accent);
	font-size: 2rem;
}






