/*
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.
*/
/*side-bar start*/
.sidebar-stat-center{
	padding:10px 0;
	display: flex;
	align-items: center
}

.sidebar-stat-center>img{
	max-width:24px;
	margin-right:5px;
}

.sidebar-stat-center>span{
	font-size:18px;
	color:#fff
}

.well .faChevron{
	color: white;
}

.side-bar-scroll{
	padding:0px;
	background:transparent;
	border:0px;
}

.sideBar{
	overflow:scroll;
	height:650px;
	overflow-x: hidden;
}

.sideBar::-webkit-scrollbar-track
{
	-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
	border-radius: 10px;
	background-color: #F5F5F5;
}

.sideBar::-webkit-scrollbar
{
	width: 12px;
	border-radius: 10px;
	background-color: #F5F5F5;
}

.sideBar::-webkit-scrollbar-thumb
{
	border-radius: 10px;
	-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
	background-color: #D62929;
}

.well .side-metrics{
  font-size: 14px;
}
.well .faArrows{
	background:#ff5c33;
	color:black;
}

.well .side-date{
	color: white;
	/*position: absolute;*/
	/*left: 80px;*/
	/*margin-left: 10px;*/
}

.well .side-name{
	color: #999966;
	/*position: absolute;*/
	/*left: 210px;*/
	/*margin-left: 20px;*/
}

a>.side-name:hover{
	color: #b2c831;
	/*position: absolute;*/
	/*left: 210px;*/
	/*margin-left: 20px;*/
}

.well .side-percent{
	color: #40bf80;
	/*position: absolute;*/
	/*left: 390px;*/
}

.well .side-percent-red{
	color: #f00;
}

#gprs{
  position: absolute;
  top:5px;
  clip: rect(0, 50px, 50px, 0);
  top: -8px;
  /* clip: shape(top, right, bottom, left); NB 'rect' is the only available option */
}

.well-next{
	padding:0px;
	background:#262626;
	border:0px;
	position:relative;
}

.vcenter {
    display: inline-block;
    vertical-align: middle;
    float: none;
}

/*side-bar end*/

/* led start */
.led-red {
    /*margin: 20px auto;*/
    margin-top: -26px;
    margin-left: 180px;
    width: 12px;
    height: 12px;
    background-color: #940;
    border-radius: 50%;
    box-shadow: #000 0 -1px 7px 1px, inset #600 0 -1px 9px, #F00 0 2px 12px;
}

.led-yellow {
    /*margin: 20px auto;*/
    /*margin-top: -26px;
    margin-left: 180px;*/
    width: 12px;
    height: 12px;
    background-color: #A90;
    border-radius: 50%;
    box-shadow: #000 0 -1px 7px 1px, inset #660 0 -1px 9px, #DD0 0 2px 12px;
}

.led-green {
    /*margin: 20px auto;*/
    /*margin-top: -26px;
    margin-left: 180px;*/
    width: 12px;
    height: 12px;
    background-color: #690;
    border-radius: 50%;
    box-shadow: #000 0 -1px 7px 1px, inset #460 0 -1px 9px, #7D0 0 2px 12px;
}
/* led end   */

@media (max-width: 1200px) {
	#sidebar-option {
		height: auto;
		display: block;
	}
}

@media (min-width: 1200px) {
	#sidebar-option {
		height: 180px;
		display: flex;
		align-items: center;
	}
}