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

.form-group.toolbar label {
    float: left;
    width: 130px;
    height: 52px;
    padding-left: 20px;
    text-align: center;
}
.form-group.toolbar span {
    float: left;
    width: 40px;
    height: 52px;
    text-align: center;
}
.form-horizontal label i{
    padding: 0 7px 0 0;
    color: #fb4d59;
    vertical-align: -2px;
}
.form-horizontal :-moz-placeholder { /* Mozilla Firefox 4 to 18 */
    color: #DCDCDC;
    opacity: 1;
}
.form-horizontal ::-moz-placeholder { /* Mozilla Firefox 19+ */
    color: #DCDCDC;
    opacity: 1;
}
.form-horizontal ::-webkit-input-placeholder{
    color: #DCDCDC;
}

.form-horizontal input:-ms-input-placeholder{
    color: #DCDCDC;
    opacity: 1;
}
.form-horizontal input::-webkit-input-placeholder{
    color: #DCDCDC;
    opacity: 1;
}
/* dashboard  css */
.table-line{
    background-color:#00c0ef;
    height:3px;width:100%;
    margin-bottom:0;
}
.chart-right{
    margin-right:-15px;
}
.chart-left{
    margin-left:-6px;
}
.chart-size{
    padding-left:0;
    padding-right:0;
}
.chart-size.row{
    margin:auto 0;
}
.chart-size-solation{
    padding-left:0;
    padding-right:0;
    height:230px;
}
.set-size{
    margin:0 auto;
    width:98%;
    height:220px;
}
.page-height-min{
    min-height:780px;
}
/* app_overview job_overview  css */
.form-group a{
    width:80px;
    font-size:14px; 
    padding: 6px;
    margin-left:23px;
}
.detail-model-size{
    width:160%;
    margin-left:-180px;
}
.update-model-size{
    width:210%;
    margin-left:-290px;
}
.size-font{
    font-size:20px;
}
.center-font{
    text-align:center;
}
.right-navigation-bar{
    margin-left:20px;
    width:190px;
}
.width-appURL{
    margin-left:74px;
}
.app-width-size{
    width:97%;
}
/* index css */
#control-sidebar-theme-demo-options-tab li {
    float:left; 
    width: 33.33333%; 
    padding: 5px;
}
#control-sidebar-theme-demo-options-tab li a {
    display: block; 
    box-shadow: 0 0 3px rgba(0,0,0,0.4);
}
.top-span {
    display:block; 
    width: 100%; 
    float: left; 
    height: 7px; 
}
#span-black{
    background: #fefefe;
}
.down-span-left {
    display:block; 
    width: 20%; 
    float: left; 
    height: 20px; 
    background: #222d32;
}
.down-span-right {
    display:block; 
    width: 80%; 
    float: left; 
    height: 20px; 
    background: #f4f5f7;
}
#modal-dialog-width{
    width: 60%;
}
#execute-result {
    float: top;
    padding-left: 20px;
}
#logo-font-size {
    font-size: 18px;
}
