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

/* Cleanup oddball redback labels (compare to .axial th in tigris.css) */
td.tdLabel {
  width: 12em;
}

.cmd-output {
  width:100%;
  max-height:500px;
  overflow:auto;
  border-style: solid;
  border-width: 1px;
  font-size: normal;
  font-family: monospace;
}

.cmd-window {
  height:500px;
}

.cmd-loading {
  background: url(../images/wait.gif) 5px 479px no-repeat;
  background-size: 16px 16px;
}

.cmd-building {
  background: url(../images/building.gif) 5px 479px no-repeat;
  background-size: 16px 16px;
}

.pre-wrap {
  white-space: pre-wrap;
  white-space: -moz-pre-wrap;
  white-space: -pre-wrap;
  white-space: -o-pre-wrap;
  word-wrap: break-word;
}

table.releasePhases {
  width: 100%;
}
table.releasePhases th {
  text-align: left;
}
table.releasePhases td:nth-child(1) {
  text-align: center;
}
table.releasePhases td:nth-child(2) {
  width: 100%;
}

message, div.errormessage p {
  display: block;
  margin-top: .67em;
  margin-bottom: .67em;
}

div.errormessage p, span.errorMessage {
  background: url(../images/icon_error_sml.gif) no-repeat;
  padding-left: 20px;
  min-height: 15px;
}

page-controls {
  display: block;
  text-align: right;
}

page-controls page {
  font-weight: bold;
}