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

/*
 Force vertical scrollbar to avoid a jumping site when changing to a page longer then the browser window
 from a full visible page or vice versa
*/
html 
{
    overflow-y:scroll;
}

/*
 Button
 From http://davidwalsh.name/github-css and adapted to maven site.
*/
.minibutton {
  display:inline-block;
  height:23px;
  padding:0 0 0 3px;
  font-size:11px;
  font-weight:bold;
  color:#333;
  text-shadow:1px 1px 0 #fff;
  background:url(../images/minibutton_matrix.png) 0 0 no-repeat;
  white-space:nowrap;
  border:none;
  overflow:visible;
  cursor:pointer;
  text-decoration:none;
}

/* Avoid additional icon from standard maven skin on buttons */
.minibutton a.externalLink {
  background:none !important;
  padding-right: 0px !important;
}

.minibutton>a>span {
  display:block;
  height:23px;
  padding:0 10px 0 8px;
  line-height:23px;
  background:url(../images/minibutton_matrix.png) 100% 0 no-repeat;
}

.minibutton:hover, .minibutton:focus {
  color:#fff;
  text-decoration:none;
  text-shadow:-1px -1px 0 rgba(0,0,0,0.3);
  background-position:0 -30px;
}

.minibutton:hover>a>span, .minibutton:focus>a>span {background-position:100% -30px;}
.minibutton.mousedown {background-position:0 -60px; }
.minibutton.mousedown>a>span {background-position:100% -60px; }

.btn-download .icon {
  float:left;
  margin-left:-4px;
  width:18px;
  height:22px;
  background:url(../images/minibutton_icons.png) 0 0 no-repeat;
}
.btn-download .icon {background-position:-40px 0;}
.btn-download:hover .icon, .btn-download:focus .icon {background-position:-40px -25px;}
