/*
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[angular-treeviewcheck] {
  /* prevent user selection */
  -moz-user-select: -moz-none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;

  /* default */
  /*font-family: Tahoma;
  font-size:13px;
  color: #555;*/
  font-size:14px;
  text-decoration: none;
}

div[tree-model-check] ul {
  margin: 0;
  padding: 0;
  list-style: none;
  border: none;
  overflow: hidden;
}

div[tree-model-check] li {
  position: relative;
  padding: 0 0 0 20px;
  color:#ffffff
  line-height: 20px;
}

div[tree-model-check] li>span:hover {
  color:#ffffff;
}

div[tree-model-check] li .expanded {
  padding: 1px 8px;
 /*background-image: url("http://cfile23.uf.tistory.com/image/205B973A50C13F4B19D9BD");*/
  background-repeat: no-repeat;
}


div[tree-model-check] li .collapsed {
  padding: 1px 10px;
  /*background-image: url("../img/folder-closed.png");*/
 /*background-image: url("http://cfile23.uf.tistory.com/image/1459193A50C13F4B1B05FB");*/
  background-repeat: no-repeat;
}

div[tree-model-check] li .normal {
  padding: 1px 10px;
  /*background-image: url("../img/file.png");*/
  /*background-image: url("http://cfile23.uf.tistory.com/image/165B663A50C13F4B196CCA");*/
  background-repeat: no-repeat;
}

div[tree-model-check] li i, div[tree-model-check] li span {
  cursor: pointer;
}

div[tree-model-check] li .selected {
  background-color: #aaddff;
  font-weight: bold;
  /*background-color: #D9F40E;*/
  color:#000000;
  padding: 1px 5px;
}
