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

div.detail-group.actions {
  margin: 0;
  padding: 0;
}

div.detail-group.actions table {
  padding: 0;
}

div.detail-group.actions tr {
  margin: 0;
}

div.detail-group.actions td {
  vertical-align: middle;
  height: 50px;
}

.details.group-multiple div.detail-group.actions {
  position: relative;
  float: right;
  max-width: 75%;
  height: 23px;
  margin: -15px 0 -5px;
}

.details.group-multiple div.detail-group.actions table {
  background: none;
}

.details.group-multiple div.detail-group.actions td.detail-actions {
  display: block;
  float: right;
  min-width: 120px;
  height: 35px;
  padding: 0;
  background: none;
}

.details.group-multiple div.detail-group.actions .detail-actions .action {
  position: relative;
  float: left;
  /*+placement:shift 11px 7px;*/
  top: 7px;
  left: 11px;
  width: 32px;
}

.details.group-multiple div.detail-group.actions .detail-actions .action a {
  width: 31px;
  background: none;
}

.detail-group table td.detail-actions {
  height: 26px;
}

.detail-group table td.detail-actions.full-length {
  display: block;
  float: left;
  width: 99%;
}

.detail-group table td.detail-actions .action.text {
  display: inline-block;
  float: right;
  margin-right: 8px;
  padding: 0 6px 0 0;
  border: 1px solid #c2c2c2;
  border-radius: 4px;
  /*+border-radius:4px;*/
  background: url('../images/bg-gradients.png') repeat-x 0 -83px;
  cursor: pointer;
  -moz-border-radius: 4px;
  -webkit-border-radius: 4px;
  -khtml-border-radius: 4px;
}

.detail-group table td.detail-actions .action.text .label {
  position: relative;
  /*+placement:shift -1px 8px;*/
  top: 8px;
  left: -1px;
  font-size: 12px;
}

.detail-group table td.detail-actions .action.text:hover {
  /*+box-shadow:inset 0px 1px 3px #171717;*/
  box-shadow: inset 0 1px 3px #171717;
  -moz-box-shadow: inset 0 1px 3px #171717;
  -webkit-box-shadow: inset 0 1px 3px #171717;
  -o-box-shadow: inset 0 1px 3px #171717;
}

.detail-group table td.detail-actions a {
  display: block;
  float: left;
  width: 30px;
  height: 25px;
  margin: 0;
  text-indent: -9999px;
}

.detail-group table td.detail-actions a:hover {
  background-position: -417px -43px;
}

.detail-group table td.detail-actions div.action.first a {
  width: 32px;
  background-position: -385px -11px;
}

.detail-group table td.detail-actions div.action.first a:hover {
  background-position: -385px -43px;
}

.detail-group table td.detail-actions div.action.last a {
  width: 30px;
  background-position: -596px -11px;
}

.detail-group table td.detail-actions div.action.last a:hover {
  background-position: -596px -43px;
}

.detail-group table td.detail-actions div.action.single a {
  width: 31px;
  height: 26px;
  background-position: -414px -625px;
}

.detail-group table td.detail-actions div.action.text a {
  background: none;
}

.detail-group table td.detail-actions div.action.single a:hover {
  background-position: -414px -587px;
}

.detail-group table td.detail-actions a span.icon {
  display: block;
  padding: 10px;
  background-image: url('../images/sprites.png');
}
