/*
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.
*/
@import url('../../../../node_modules/angular2-toaster/toaster.css');
@import url('../measure.component.css');

div.tree div.tree-children::before,
div.tree::before {
  content: "";
  position: absolute;
  border-left: 1px dotted #23527c;
  height: 100%;
  top: -14px;
  left: 12px
}

div.tree {
  padding-left: 0;
  margin-left: -5px
}

div.tree div.tree-children {
  position: relative;
  padding-left: 0;
  margin-left: 16px
}

div.tree div.tree-children::before {
  left: 5px
}

div.tree treenode > div > .node-wrapper {
  margin-left: 24px
}

div.tree treenode > div > .node-wrapper > .node-content-wrapper {
  margin-left: 4px
}

div.tree treenode > div.tree-node-leaf > .node-wrapper {
  margin-left: 0
}

div.tree treenode > div::before {
  content: "";
  position: absolute;
  border-bottom: 1px dotted #23527c;
  width: 7px;
  margin-top: 12px;
  left: 7px
}

div.tree treenode > div .toggle-children-wrapper {
  width: 13px;
  height: 13px;
  border: 1px solid #23527c;
  position: absolute;
  left: 15px;
  margin-top: 5px;
  margin-left: 0;
  display: inline-block;
  background-color: #fff;
  z-index: 1
}

div.tree treenode > div .toggle-children-wrapper::before {
  content: "";
  display: inline-block;
  width: 7px;
  border-top: 1px solid #23527c;
  position: absolute;
  top: 5px;
  left: 2px
}

div.tree treenode > div .toggle-children-wrapper.toggle-children-wrapper-collapsed::after {
  content: "";
  display: inline-block;
  height: 7px;
  border-left: 1px solid #23527c;
  position: absolute;
  top: 2px;
  left: 5px
}

div.tree treenode > div .toggle-children-wrapper .toggle-children {
  display: none
}

div.tree treenode > div .node-content-wrapper {
  margin-left: 4px
}

div.tree > treenode > div::before {
  left: 14px
}

div.tree > treenode > div > .node-wrapper > treenodeexpander > .toggle-children-wrapper {
  left: 22px
}

.panel {
  background-color: #222222;
}

.panel-footer {
  background-color: #3c3c3c;
}


a.adisabled {
  cursor: not-allowed;
  opacity: .65;
}

a.adisabled:hover { text-decoration: none; }
a.adisabled:focus { text-decoration: none; }
a.adisabled:active { text-decoration: none; }
