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

#page-title {
  background: #fff;
  position: absolute;
  top: 15px;
  left: 90px;
  height: 35px;
  border-radius: 5px 5px 0 0;
}

.reset {
  position: absolute;
  top: 1em;
  left: 1em;
  z-index: 100;
}

.all-topo-view.no-colors .reset {
  display: none;
}

.not-showing-stats .only-when-showing-stats {
  display: none;
}

#page-title p {
  font-size: 14px;
  color: black;
  margin: 8px;
  padding: 5px;
}

.axis path {
  fill: none;
}

.x.axis line {
  stroke: #ddd;
}
.x.axis path {
  stroke: none;
}

.row h5 {
  color: grey;
  margin: 20px 20px 0px 20px;
  padding: 5px;
  text-align: left;
}

.axis path, .axis line {
  fill: none;
  stroke: black;
  shape-rendering: crispEdges;
}

.popover {
  font-weight: normal;
  line-height: 1.3;
}

.d3-tip {
  line-height: 1.2;
  padding: 10px;
  background: rgba(0, 0, 0, 0.8);
  font-family: Arial, sans-serif;
  color: #eee;
  border-radius: 2px;
  pointer-events: none;
  font-size: 12px;
  text-align: left;
  z-index: 99;
  word-break: break-all;
}

.d3-tip strong {
  color: #fff;
}

.d3-tip.text-center {
  text-align: center;
}

a:hover {
  text-decoration: underline;
}
a:active, a:focus {
  text-decoration: none;
}

/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
  box-sizing: border-box;
  text-align: left;
  display: inline;
  font-size: 15px;
  width: 100%;
  line-height: 1;
  color: rgba(0, 0, 0, 0.8);
  position: absolute;
  pointer-events: none;
}

/* Northward tooltips */
.d3-tip.n:after {
  content: "\25BC";
  margin: -3px 0 0 0;
  font-size: 14px;
  top: 100%;
  left: 0;
  text-align: center;
}

.d3-tip.s:after {
  content: "\25B2";
  margin: 0 0 1px 0;
  top: -12px;
  left: 0;
  text-align: center;
}

.d3-tip {
  max-width: 400px;
  transition-delay: 0.25s;
}

path.regular, rect.regular {
  opacity: 1;
}

path.fade, rect.fade {
  opacity: 0.2;
}

circle.regular {
  opacity: 1;
}

circle.fade {
  opacity: 0.3;
}

text.regular {
  display: block;
}

text.fade {
  display: none;
}

text.fade.fade-half {
  display: block;
  opacity: 0.5;
}

circle.background {
  opacity: 1;
}

.container {
  stroke: #888;
  stroke-width: 1px;
  fill: #f0f5fa;
}

.instance {
  stroke: #888;
  stroke-width: 1px;
  fill: #f0f5fa;
}

#color-key path {
  stroke: none;
}

#color-key {
  height: 70px;
}

.space-above {
  margin-top: 3em;
}

.stat-rollup-table {
  margin: 0 auto;
}

.stat-rollup-table td {
  padding-left: 1em;
  height: 30px;
}

.stat-rollup-table a {
  text-decoration: none;
}

.status-circle {
  padding: 2px 3px;
  color: #f0f5fa;
  fill: currentColor;
  stroke-width: 0.5px;
  stroke: #aaa;
  margin: 0;
  padding: 0;
  vertical-align: text-bottom;
}

a:hover .status-circle {
  stroke: #000;
}

.toplevel-stat {
  fill: #f0f5fa;
  stroke: #888;
  stroke-width: 1px;
}

.topotable {
display: inline-table;
}

tr.highlighted {
  background-color: red;
}

.topotable>thead>tr>th, .topotable>tbody>tr>th, .topotable>tfoot>tr>th, .topotable>thead>tr>td, .topotable>tbody>tr>td, .topotable>tfoot>tr>td {
  font-size: 14px;
  padding: 8px;
  line-height: 1.42857143;
  vertical-align: top;
  border-top: 1px solid #dddddd;
}

.break-all {
  word-break: break-all;
}

.no-break {
  white-space: nowrap
}

.strong {
  font-weight: bold;
}

.topotable .topobutton {
  padding: 2px;
}

.topotable .topobutton a {
  margin-left: 8px;
  visibility: hidden;
}

.topotable tr:hover .topobutton a {
  visibility: visible;
}
.vcenter {
    display: inline-block;
    vertical-align: middle;
    float: none;
}

.action-button-group {
  position: absolute;
  right: 10px;
  top: 2px;
}

.sort.asc {
  background-color: lightgrey;
}

.sort.desc {
  background-color: lightgrey;
}

/* Sort arrows */
.sort:after {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;
  content:"";
  position: relative;
  top:-10px;
  right:-5px;
}

.sort.asc:after {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid transparent;
  border-top: 5px solid black;
  content:"";
  position: relative;
  top:10px;
  right:-5px;
}

.sort.desc:after {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid black;
  border-top: 5px solid transparent;
  content:"";
  position: relative;
  top:-10px;
  right:-5px;
}

.search-result {
  color: grey;
  font-size: 14px;
  line-height: 30px;
}

/* When the topology is dead */
.dead {
  color: red;
}

/* When the topology is weird state */
.weird {
  color: orange;
}

/* When the topology is starting */
.starting {
  color: green;
}
