/*

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 #cores
{
  position: relative;
}

#content #cores #ui-block
{
  background-color: #fff;
  height: 200px;
  position: absolute;
  left: -5px;
  top: 35px;
  width: 500px;
}

#content #cores #frame
{
  float: right;
  width: 86%;
}

#content #cores #navigation
{
  padding-top: 50px;
  width: 12%;
}

#content #cores #navigation a
{
  padding-left: 5px;
}

#content #cores #frame .actions
{
  margin-bottom: 20px;
  min-height: 30px;
}

#content #cores .actions div.action
{
  width: 320px;
}

#content #cores .actions div.action .cloud
{
}

#content #cores .actions form .directory-note
{
  background-image: url( ../../img/ico/information-white.png );
  background-position: 22% 1px;
  color: #c0c0c0;
}

#content #cores .actions form .error
{
  background-image: url( ../../img/ico/cross-button.png );
  background-position: 22% 1px;
  color: #c00;
  font-weight: bold;
}

#content #cores .actions form p
{
  padding-bottom: 8px;
}

#content #cores .actions form label
{
  float: left;
  padding-top: 3px;
  padding-bottom: 3px;
  text-align: right;
  width: 25%;
}

#content #cores .actions form input,
#content #cores .actions form select,
#content #cores .actions form .buttons,
#content #cores .actions form .note span
{
  float: right;
  width: 71%;
}

#content #cores .actions form .note span
{
  padding-left: 3px;
  padding-right: 3px;
}

#content #cores .actions form .buttons
{
  padding-top: 10px;
}

#content #cores .actions form button.submit
{
  margin-right: 20px;
}

#content #cores .actions form button.submit span
{
  background-image: url( ../../img/ico/tick.png );
}

#content #cores .actions form button.reset span
{
  background-image: url( ../../img/ico/cross.png );
}

#content #cores .actions #add
{
  left: 0;
  position: absolute;
}

#content #cores .actions #add span
{
  background-image: url( ../../img/ico/plus-button.png );
}

#content #cores .actions #unload
{
  margin-right: 20px;
}

#content #cores .actions #unload span
{
  background-image: url( ../../img/ico/cross.png );
}

#content #cores .actions #reload span
{
  background-image: url( ../../img/ico/arrow-circle.png );
}

#content #cores .actions #rename span
{
  background-image: url( ../../img/ico/ui-text-field-select.png );
}

#content #cores .actions #swap span
{
  background-image: url( ../../img/ico/arrow-switch.png );
}

#content #cores .actions #optimize
{
}

#content #cores .actions #optimize span
{
  background-image: url( ../../img/ico/hammer-screwdriver.png );
}

#content #cores .actions div.action
{
  background-color: #fff;
  border: 1px solid #f0f0f0;
  box-shadow: 5px 5px 10px #c0c0c0;
  -moz-box-shadow: 5px 5px 10px #c0c0c0;
  -webkit-box-shadow: 5px 5px 10px #c0c0c0;
  position: absolute;
  left: -50px;
  top: 40px;
  padding: 10px;
}

#content #cores #data #core-data h2 { background-image: url( ../../img/ico/box.png ); }
#content #cores #data #index-data h2 { background-image: url( ../../img/ico/chart.png ); }

#content #cores #data #index-data
{
  margin-top: 10px;
}

#content #cores #data li
{
  padding-bottom: 3px;
  padding-top: 3px;
}

#content #cores #data li.odd
{
  background-color: #f8f8f8;
}

#content #cores #data li dt
{
  float: left;
  width: 17%;
}

#content #cores #data li dd
{
  float: right;
  width: 82%;
}

#content #cores #data li dd.ico
{
  background-image: url( ../../img/ico/slash.png );
  height: 20px;
}

#content #cores #data li dd.ico.ico-1
{
  background-image: url( ../../img/ico/tick.png );
}

#content #cores #data li dd.ico span
{
}
