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

  body {
    background:#222 none repeat scroll 0 0;
    color:#666;
    font-family:Helvetica;
    font-size:72%;
    line-height:1.5em;
    margin:0;
    border-top:1px solid #393939;
  }

  #info{
    background:#ffa;
    border: 1px solid #ffd324;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    clear:both;
    margin:15px 6px 0;
    min-width:295px;
    max-width:97%;
    padding:4px 0px 2px 10px;
    word-wrap:break-word;
    margin-bottom:10px;
    display:inline-block;
    min-height: 160px;
    max-height: 300px;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
  }
  
  #info > h4{
    font-size:.95em;
    margin:5px 0;
  }
 	
  #stage.theme{
    padding-top:3px;
  }

  /* Definition List */
  #stage.theme > dl{
  	padding-top:10px;
  	clear:both;
  	margin:0;
  	list-style-type:none;
  	padding-left:10px;
  	overflow:auto;
  }

  #stage.theme > dl > dt{
  	font-weight:bold;
  	float:left;
  	margin-left:5px;
  }

  #stage.theme > dl > dd{
  	width:45px;
  	float:left;
  	color:#a87;
  	font-weight:bold;
  }

  /* Content Styling */
  #stage.theme > h1, #stage.theme > h2, #stage.theme > p{
    margin:1em 0 .5em 13px;
  }

  #stage.theme > h1{
    color:#eee;
    font-size:1.6em;
    text-align:center;
    margin:0;
    margin-top:15px;
    padding:0;
  }

  #stage.theme > h2{
  	clear:both;
    margin:0;
    padding:3px;
    font-size:1em;
    text-align:center;
  }

  /* Stage Buttons */
  #stage.theme .btn{
  	border: 1px solid #555;
  	-webkit-border-radius: 5px;
  	border-radius: 5px;
  	text-align:center;
  	display:inline-block;
  	background:#444;
  	width:150px;
  	color:#9ab;
  	font-size:1.1em;
  	text-decoration:none;
  	padding:1.2em 0;
  	margin:3px 0px 3px 5px;
  }
  
  #stage.theme .large{
  	width:308px;
  	padding:1.2em 0;
  }
  
  #stage.theme .wide{
    width:100%;
    padding:1.2em 0;
  }
  
  #stage.theme .backBtn{
   border: 1px solid #555;
   -webkit-border-radius: 5px;
   border-radius: 5px;
   text-align:center;
   display:block;
   float:right;
   background:#666;
   width:75px;
   color:#9ab;
   font-size:1.1em;
   text-decoration:none;
   padding:1.2em 0;
   margin:3px 5px 3px 5px;
  }
  
  #stage.theme .input{
   border: 1px solid #555;
   -webkit-border-radius: 5px;
   border-radius: 5px;
   text-align:center;
   display:block;
   float:light;
   background:#888;
   color:#9cd;
   font-size:1.1em;
   text-decoration:none;
   padding:1.2em 0;
   margin:3px 0px 3px 5px;    
 }
  
  #stage.theme .numeric{
   width:100%;
  }
