/*
 *
 * 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;
    width:295px;
    padding:4px 0px 2px 10px;
  }
  
  #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:block;
  	float:left;
  	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 .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%;
  }
