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

/* A sample style sheet for displaying the Subversion directory listing
   that is generated by mod_dav_svn and "svnindex.xsl". */

body{
  margin: 0;
  padding: 0;
}

a {
  color: navy;
}

.footer {
  margin-top: 8em;
  padding: 0.5em 1em 0.5em;
  border: 1px solid;
  border-width: 1px 0;
  clear: both;
  border-color: rgb(30%,30%,50%) navy rgb(75%,80%,85%) navy;
  background: rgb(88%,90%,92%);
  font-size: 80%;
}

.svn {
  margin: 3em;
}

.rev {
  margin-right: 3px;
  padding-left: 3px;
  text-align: left;
  font-size: 120%;
}

.dir a {
  text-decoration: none;
  color: black;
}

.file a {
  text-decoration: none;
  color: black;
}

.path {
  margin: 3px;
  padding: 3px;
  background: #FFCC66;
  font-size: 120%;
}

.updir {
  margin: 3px;
  padding: 3px;
  margin-left: 3em;
  background: #FFEEAA;
}

.file {
  margin: 3px;
  padding: 3px;
  margin-left: 3em;
  background: rgb(95%,95%,95%);
}

.file:hover {
  margin: 3px;
  padding: 3px;
  margin-left: 3em;
  background: rgb(100%,100%,90%);
/*  border: 1px black solid; */
}

.dir {
  margin: 3px;
  padding: 3px;
  margin-left: 3em;
  background: rgb(90%,90%,90%);
}

.dir:hover {
  margin: 3px;
  padding: 3px;
  margin-left: 3em;
  background: rgb(100%,100%,80%);
/*  border: 1px black solid; */
}
