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

html
{
    background: black;
}

body
{
    position: absolute;

    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    margin: 0;

    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    border-radius: 5px;

	background: #bbb url(/qmf-ui/images/gradient.png) repeat-x;
	background: -o-linear-gradient(top center, #fff 0%, #bbb 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(1, #bbb));
	background: -webkit-linear-gradient(top center, #fff 0%, #bbb 100%);
	background: -ms-linear-gradient(top center, #fff 0%, #bbb 100%);
	background: -moz-linear-gradient(top center, #fff 0%, #bbb 100%);
}

div.logo
{
    position: absolute;
    top: 5%;
    left: 0;
    right: 0;
    height: 114px;
    margin: 0 35% 0 35%;

    -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
	filter: alpha(opacity=70);
    opacity: 0.7;

	background: transparent url(/qmf-ui/images/qpid-logo.png) center no-repeat;
}

