/*

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.

*/

#content #index .bar-desc
{
  color: #c0c0c0;
  font-weight: normal;
  margin-left: 10px;
  white-space: pre;
}

#content #index .bar-holder
{
  box-shadow: 5px 5px 10px #c0c0c0;
  -moz-box-shadow: 5px 5px 10px #c0c0c0;
  -webkit-box-shadow: 5px 5px 10px #c0c0c0;
  height: 35px;
}

#content #index .bar-holder .bar
{
  height: 100%;
  position: relative;
}

#content #index .bar-holder div .val
{
  border-right: 1px solid #f00;
  display: block;
  padding-right: 5px;
  position: absolute;
  right: 0;
  top: 35px;
  white-space: nowrap;
}

#content #index .bar-holder .bar-max.bar
{
  background-color: #f0f0f0;
}

#content #index .bar-holder .bar-max.val
{
  border-color: #f0f0f0;
  color: #d6d6d6;
}

#content #index .bar-holder .bar-total.bar
{
  background-color: #c0c0c0;
}

#content #index .bar-holder .bar-total.val
{
  border-color: #c0c0c0;
  color: #c0c0c0;
}

#content #index .bar-holder .bar-used.bar
{
  background-color: #969696;
}

#content #index .bar-holder .bar-used.val
{
  border-color: #969696;
  color: #969696;
}

#content #index .bar-holder.bar-lvl-2 .bar-max.val { padding-top: 25px; }
#content #index .bar-holder.bar-lvl-2 .bar-total.val { padding-top: 5px; }
#content #index .bar-holder.bar-lvl-2 { margin-bottom: 45px; }

#content #index .bar-holder.bar-lvl-3 .bar-max.val { padding-top: 45px; }
#content #index .bar-holder.bar-lvl-3 .bar-total.val { padding-top: 25px; }
#content #index .bar-holder.bar-lvl-3 .bar-used.val { padding-top: 5px; }
#content #index .bar-holder.bar-lvl-3 { margin-bottom: 65px; }

#content #index .loader
{
  background-position: 0 50%;
  padding-left: 21px;
}

#content #index .index-left
{
  float: left;
  width: 55%;
}

#content #index .index-right
{
  float: right;
  width: 40%;
}

#content #index .data
{
  padding-bottom: 12px;
  overflow: hidden;
}

#content #index .data:hover
{
  overflow-x: auto;
}

#content #index .data li
{
  padding-top: 3px;
  padding-bottom: 3px;
}

#content #index .data li dt
{
  float: left;
  white-space: nowrap;
  width: 20%;
}

#content #index .data li dd
{
  float: right;
  text-overflow: ellipsis;
  white-space: nowrap;
  width: 80%
}

#content #index .data li dd.odd
{
  color: #999;
}

#content #index .data dt span
{
  background-position: 1px 50%;
  display: block;
  padding-left: 22px;
}

#content #index #instance h2 { background-image: url( ../../img/ico/server.png ); }
#content #index #instance .start_time dt span { background-image: url( ../../img/ico/clock-select.png ); }

#content #index #versions h2 { background-image: url( ../../img/ico/property.png ); }
#content #index #versions .solr span { background-image: url( ../../img/solr-ico.png ); }
#content #index #versions .lucene span { background-image: url( ../../img/lucene-ico.png ); }

#content #index #jvm h2 { background-image: url( ../../img/ico/jar.png ); }
#content #index #jvm .jvm_version dt span { background-image: url( ../../img/ico/jar.png ); }
#content #index #jvm .processors dt span { background-image: url( ../../img/ico/processor.png ); }
#content #index #jvm .command_line_args dt span { background-image: url( ../../img/ico/terminal.png ); }

#content #index #system h2 { background-image: url( ../../img/ico/system-monitor.png ); }

#content #index #system
{
  position: relative;
}

#content #index #system .reload
{
  background-image: url( ../../img/ico/arrow-circle.png );
  background-position: 50% 50%;
  display: block;
  height: 30px;
  position: absolute;
  right: 0;
  top: 0;
  width: 30px;
}

#content #index #system .reload.loader
{
  padding-left: 0;
}

#content #index #system .reload span
{
  display: none;
}

#content #index #system .content p
{
  margin-top: 10px;
  margin-bottom: 5px;
}

#content #index #system .content .no-info
{
  color: #c0c0c0;
  display: none;
  font-style: italic;
}

#content #index #jvm-memory h2 { background-image: url( ../../img/ico/memory.png ); }

#content #index #jvm-memory-bar
{
  margin-top: 20px;
}
