/*
 * 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.
 */

@CHARSET "ISO-8859-1";

	.roundedBox
    {
        border-radius: 20px;
        -moz-border-radius: 20px;
    }
    
    .codeBox
    {
        border-radius: 3px;
        -moz-border-radius: 3px;
        
        border: 1px solid #999; 
        padding: 3px 0px 5px 0px;
        width: 98% !important;
        
         box-shadow: rgba(150, 150, 150, 0.85) -3px 7px 9px;
        -webkit-box-shadow: rgba(150, 150, 150, 0.85) -3px 7px 9px;
        -moz-box-shadow: rgba(150, 150, 150, 0.85) -3px 7px 9px;
    }

    .gradientBox
    {
        background: -webkit-gradient(linear, left top, left bottom, from(#EEEEEE), to(white));
        background: -moz-linear-gradient(-90deg, #EEEEEE, white);
        
        box-shadow: rgba(0, 0, 128, 0.25) -3px 7px 9px;
        -webkit-box-shadow: rgba(0, 0, 128, 0.25) -3px 7px 9px;
        -moz-box-shadow: rgba(0, 0, 128, 0.25) -3px 7px 9px;
    }