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

svg {
  background-color: transparent;
  cursor: default;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  -o-user-select: none;
  user-select: none;
}

svg:not(.active):not(.ctrl) {
  cursor: crosshair;
}
#end-arrow-selected, #start-arrow-selected {
	stroke: #33F;
	fill: #33F;
}
path.link.selected {
  stroke-dasharray: 10,2;
  stroke: #33F  !important;
}

path.link {
  fill: #000;
  stroke: #000;
  stroke-width: 4px;
  cursor: default;
}

svg:not(.active):not(.ctrl) path.link {
  cursor: pointer;
}

path.link.temp {
  opacity: 0.3;
}
path.link.temp.over {
  opacity: 0.8;
  stroke-dasharray: 10,2;
}
path.link.small {
  stroke-width: 2.5;
  stroke: darkgray;
}
path.link.highlighted {
    stroke: #6F6 !important;
}
marker#start-arrow-highlighted,
marker#end-arrow-highlighted {
    fill: #6F6;
}
marker#start-arrow-small,
marker#end-arrow-small {
    fill: darkgray;
}

path.link.dragline {
  pointer-events: none;
}

path.link.hidden {
  stroke-width: 0;
}

circle.node {
  stroke-width: 1.5px;
  cursor: pointer;
  stroke: darkgray;
}

circle.node.reflexive {
  stroke: #F00 !important;
  stroke-width: 2.5px;
}
circle.node.selected {
  stroke: #6F6 !important;
  stroke-width: 2px;
  fill: #e0e0ff !important;
}
circle.node.highlighted {
  stroke: #6F6;
}
circle.node.inter-router {
    fill: #EAEAEA;
}
circle.node.normal.in {
    fill: #F0F000;
}
circle.node.normal.out {
    fill: #C0F0C0;
}
circle.node.on-demand {
    fill: #C0FFC0;
}
circle.node.on-demand.artemis {
	fill: #FCC;
	/*opacity: 0.2; */
}

circle.node.fixed {
    stroke-dasharray: 10,2;
}
circle.node.temp {
    stroke: #f80;
    fill: #f0f0ff;
}

text {
  font: 12px sans-serif;
  pointer-events: none;
  /*font-family: monospace;*/

}

.tooltipsy
{
    padding: 10px;
/*    max-width: 320px;*/
    color: #303030;
    background-color: #fcfcfe;
    border: 1px solid #deca7e;
    border-radius: 5px;
}

.tiptable {

}
.tiptable tr {
	border-bottom: 1px solid #ccc;
}

.tiptable tr:last-child {
	border-bottom: 0px;
}

.tiptable tr:nth-child(even) {
	background: #fcfcfe;
}
.tiptable tr:nth-child(odd) {
	background: #FFF
}

text.id {
  text-anchor: middle;
  font-weight: bold;
}

text.label {
  text-anchor: start;
  font-weight: bold;
}

.row-fluid.tertiary {
  position: relative;
  left: 20px;
}

.row-fluid.tertiary.left {
  float: left;
}

.row-fluid.tertiary.panel {
  width: 410px;
  /*height: 100%; */
}

div#topologyForm .ngViewport, div#topologyForm .gridStyle {
  height: auto !important;
  min-height: initial !important;
  overflow: initial;
}

div#multiple_details, div#link_details {
	height: 300px;
	width: 700px;
	display: none;
	padding: 0.5em;
    border: 1px solid;
	position: absolute;
	background-color: white;
	max-height: 330px !important;
    overflow: hidden;
}
div#multiple_details div.ngRow.selected {
	background-color: #c9dde1 !important;
}

div.grid-values {
	text-align: right;
}

div.grid-values.ngCellText span {
	padding-right: 4px;
}

.panel-adjacent {
  margin-left: 430px;
}

#topologyForm.selected {
  border: 1px solid blue;
}
#topologyForm {
  border-right: 1px solid lightgray;
  border-bottom: 1px solid lightgray;
    /*border: 1px solid white;*/
    padding: 2px;
    /* position: relative; */
    /* top: -8px; */
}
div.qdr-topology.pane.left .ngViewport {
    /* border: 1px solid lightgray; */
}

#topologyForm > div {
  width:396px;
}

/* globe */
.land {
  fill: #999;
  stroke-opacity: 1;
}

.graticule {
  fill: none;
  stroke: black;
  stroke-width:.5;
  opacity:.1;
}

.labels {
    font: 18px sans-serif;
    fill: black;
    opacity: .85;
	text-anchor: middle;
}

.noclicks { pointer-events:none; }

.point {  opacity:.6; }

.arcs {
  opacity:.7;
  stroke: darkgreen;
  stroke-width: 3;
}
.flyers {
  stroke-width:1;
  opacity: 0;
  stroke: darkred;
}
.arc, .flyer {
  stroke-linejoin: round;
  fill:none;
}
.arc { }
.arc:hover {
  stroke: darkred;
}
.flyer { }
.flyer:hover {
  stroke: darkgreen;
}
.arc.inter-router {
  stroke: darkblue;
}

#addNodeForm {
  padding: 1em;
}


li.currentStep {
  font-weight: bold;
}

.qdrTopology div.panel {
  position: absolute;
}
/*
.ui-dialog-titlebar {
    border: 0;
    background: transparent;
}
*/

/*
.ui-tabs.ui-tabs-vertical {
    padding: 0;
    width: 48em;
}
.ui-tabs.ui-tabs-vertical .ui-widget-header {
    border: none;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-nav {
    float: left;
    width: 10em;
    background: #CCC;
    border-radius: 4px 0 0 4px;
    border-right: 1px solid gray;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-nav li {
    clear: left;
    width: 100%;
    margin: 0.1em 0;
    border: 1px solid gray;
    border-width: 1px 0 1px 1px;
    border-radius: 4px 0 0 4px;
    overflow: hidden;
    position: relative;
    right: -2px;
    z-index: 2;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a {
    display: block;
    width: 100%;
    padding: 0.1em 1em;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a:hover {
    cursor: pointer;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active {
    margin-bottom: 0.2em;
    padding-bottom: 0;
    border-right: 1px solid white;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-nav li:last-child {
    margin-bottom: 10px;
}
.ui-tabs.ui-tabs-vertical .ui-tabs-panel {
    float: left;
    width: 34em;
    border-left: 1px solid gray;
    border-radius: 0;
    position: relative;
    left: -1px;
}

.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
    right: -3px !important;
}

.ui-tabs li i.ui-icon {
    display: inline-block;
}
*/
.ui-tabs .ui-tabs-panel {
    /* padding-top: 0 !important; */
}

.ui-widget-content fieldset {
  float: left;
  padding: 0 1em 0 0;
}

.entity-description {
  color: #960;
  font-size: 90%;
}

.attr-description {
  padding-top: 1.5em;
  float: right;
  width: 17em;
}
.attr-annotations {
    padding-top: 2.5em;
    clear: both;
}
.attr-annotations > span {
    padding-top: 0.5em;
    border-top: 1px dashed darkgray;
    display: block;
}

.attr-type {
    color: #990;
    font-size: 85%;
}
.attr-required {
    color: red;
    font-size: 85%;
}
.attr-unique {
    color: green;
    font-size: 85%;
}

#tabs.nodeEntities {
  border: 0;
}

#tabs ul.nodeTabs {
  background: #fff;
}

#tabs #Container {
  border-left: 1px solid #aaa;
}

#tabs.ui-tabs .ui-tabs-nav li {
  border-bottom: 1px solid #aaa !important;
}

.entity-fields {
  /* height: 400px; */
  overflow-y: scroll;
  overflow-x: hidden;
}

div.boolean label:first-child {
    float: left;
    margin-right: 1em;
}
div.boolean {
    padding-bottom: 1em;
}

.entity-fields label {
    font-weight: 600;
    margin-top: 0.5em;
	display: inline;
}

.aggregate {
	text-align: right;
}

.aggregate i {
	float: right;
    margin: 3px 3px 3px 8px;
}

.aggregate .hastip {
	padding: 5px;
}

.subTip .tipsy-inner {
	background-color: white;
	color: black;
	font-size: 1.3em;
	border: 1px solid black;
}

.subTip .tipsy-arrow-n { border-bottom-color: black; }
.subTip .tipsy-arrow-s { border-top-color: black; }
.subTip .tipsy-arrow-e { border-left-color: black; }
.subTip .tipsy-arrow-w { border-right-color: black; }


.contextMenu {
    display:none;
	position:absolute;
	left:30px;
	top:-30px;
	z-index:999;
	/* width:300px; */
}
.contextMenu ul {
	width:300px;
	margin:0;
	padding-left:0;
	list-style:none;
	background:#fff;
	color:#333;
    font-weight: 600;
	/* -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; */
	-moz-box-shadow:5px 5px 5px #ddd; -webkit-box-shadow:5px 5px 5px #999; box-shadow:5px 5px 5px #ddd;
	border: 1px solid #aaa;
}
.contextMenu ul li {
	padding:5px 10px;
	/* border-bottom: solid 1px #ccc; */
}
.contextMenu ul li:hover {
	background:#4a90d9; color:#fff;
}
.contextMenu ul li:last-child {
    border:none;
}

.na {
    display: none;
}
.contextMenu ul li.new {
    display: block;
}
.contextMenu ul li.adding, .contextMenu ul li.adding + li {
    display: block;
}
.contextMenu ul li.force-display {
    display: block;
}
.contextMenu ul li.context-separator {
    background-color: lightgray;
    height: 1px;
    padding: 0;
}

.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.separated {
    margin-top: 1em;
}

#crosssection {
    display: none;
    position: absolute;
    top: 200px;
    left: 600px;
}

.node circle {
/*  fill: rgb(31, 119, 180);
  fill-opacity: .25; */
  fill: #cfe2f3;
  fill-opacity: .98;
  stroke: black;
  stroke-width: 3px;
}

circle.subcircle {
    stroke-width: 1px;
    /* stroke-dasharray: 2; */
    fill-opacity: 0;
    stroke: darkgray;
}

.leaf circle {
  fill: #6fa8dc;
  fill-opacity: 0.95;
  stroke-width: 3px;
}

.leaf circle[title] {
    font-family: monospace;

}

#svg_legend {
    position: absolute;
    top: 110px;
    right: 0;
    border: 1px solid #ccc;
    border-radius: 5px;
    background-color: #fcfcfc;
    margin-right: 1.3em;
	padding: 1em;
}

#svg_legend svg {
    height: 235px;
    width: 180px;
}

#multiple_details div.gridStyle {
/*	height: 50em; */
	min-height: 70px !important;
	height: auto !important;
}

#multiple_details .ngViewport {
    height: auto !important;
}

#multiple_details .gridCellButton button, #link_details .gridCellButton button {
    margin: .25em .4em;
    font-size: 12px;
    height: 2em;
	padding-top: .1em;
}

#linkFilter {
	display: none;
	padding: 0.5em;
	border: 1px solid grey;
	background-color: #F0F0F0;
	position: absolute;
	z-index: 100;
	right: 1em;
}
div.formLine label, div.formLine input {
	display: inline-block;
	padding: 0 8px;
}

span.filter-icon {
	padding-left: 1em;
}

button.filter-close {
    width: 15px;
    height: 20px;
    padding: 0;
    position: absolute;
    right: 4px;
    top: 4px;
}

div.filter-title h6 {
	margin: 0 0 0.5em 0;
}

.links button.btn-filter {
	padding: 0 1em 0 0;
    margin-left: 1em;
    font-size: 1em;
}

button.btn-filter {
	float: right;
}
span.dynatree-expanded button.btn-filter,
a.dynatree-title:hover button.btn-filter {
 	visibility: visible;
}

div.hdash-button a {
	color: white;
}

.linkDirIn {
	color: red;
	background-color: #f3f3f3;
}

.linkDirOut {
	color: blue;
	background-color: white;
}

div.topoGrid .ui-grid-viewport {
	overflow: hidden !important;
}

@-moz-document url-prefix() {
    .btn {padding: 2px 12px 8px !important;}
    #overview-controller .btn {padding: 4px 12px !important;}
    #overview-controller .btn.filter-close {padding: 0 !important;}
}

.ui-fancytree.fancytree-container {
	font-size: 14px;
}

.grid-title {
    background-color: #FAFAFA;
    background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
    background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
    background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
    background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
    background-repeat: repeat-x;
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F2F2F2', GradientType=0);
    border-bottom: 1px solid #d4d4d4;
    text-shadow: 0 1px 0 #FFFFFF;
    border-top-left-radius: 5px;
    border-top-right-radius: 5px;
	margin: 0 0 10px 0;
    padding-bottom: 4px;
}

.expand-collapse {
	float: right;
	margin-right: 0.5em;
}

.pane-viewport {
	top: 24px !important;
}
.dynatree-node.loading {
  position: initial;
}

.hideLeft {
  position: absolute;
  right: 0.5em;
  top: 1em;
  border: 0;
}

.showLeft {
  position: absolute;
  top: 1em;
  left: 0.5em;
  border: 0;
}

.newChart {
  float: right;
}

select.unique, input.unique {
  border: 2px solid blue;
}
select.required, input.required {
  border: 2px solid black;
}

.required-indicator {
  padding-left: 0.5em;
  font-size: 0.85em;
  vertical-align: super;
}

.required-indicator::before {
  content: '(required)'
}

.unique-indicator {
  padding-left: 0.5em;
  font-size: 0.85em;
  vertical-align: super;
}

.unique-indicator::before {
  content: '(must be unique if supplied)'
}

.unique-indicator