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


/* tree.scss */

.jstree-container-ul {
    padding-left: 0px;
    position: relative;
    list-style: none;
    .jstree-node {
        white-space: nowrap;
        position: relative;
        cursor: pointer;
        padding: 4px 0;
        margin: 0;
        margin-top: 5px;
        margin-bottom: 5px;
    }
    ul {
        list-style: none;
        padding: 0;
        text-indent: 30px;
    }
    li a {
        // color: $white;
        display: block;
    }
}

.taxonomyTree {
    padding: 0;
    position: relative;
    li {
        position: relative;
        border-radius: 4px;
        margin-top: 5px;
        &.parent {
            width: 100%;
            a {
                max-width: 93%;
            }
        }
        &.parentChild {
            ul {
                padding-left: 9%;
            }
            li {
                &.children {
                    width: 91%;
                }
                a {
                    max-width: 90%;
                }
            }
        }
        &.children {
            &:hover {
                background-color: $color_star_dust_approx;
            }
        }
        &.active {
            background-color: $color_jungle_green_approx !important;
            border: none;
            .tools {
                display: block;
                .fa {
                    cursor: pointer;
                    padding: 0px 3px;
                }
            }
        }
        a {
            display: block;
            color: $concrete;
            white-space: nowrap;
            padding: 5px 25px;
            text-overflow: ellipsis;
            overflow: hidden;
            cursor: pointer;
        }
        .tools {
            background: $color_jungle_green_approx;
            display: none;
            position: absolute;
            right: 2px;
            padding: 5px;
        }
    }
}

.termPopoverList {
    color: #666;
    padding: 0px 5px;
    margin-bottom: 0px;
    a {
        color: #666;
        padding: 5px;
    }
}

.termPopover {
    cursor: pointer;
}

.termMoveDiv {
    width: 550px;
    height: 200px;
    margin: 10px;
}

.tagPopoverList {
    color: #666;
    padding: 0px 5px;
    margin-bottom: 0px;
    a {
        color: #666;
        padding: 5px;
    }
}

.toggleArrow {
    position: absolute;
    left: 0px;
    padding: 8px;
    cursor: pointer;
}

.addTermDiable {
    border-color: #FF0000 !important;
}

.alertTerm {
    color: #FF0000 !important;
}


/**Css changes**/

.modal-body {
    .add-seperator {
        border: none;
    }
    .taxonomyTree li {
        .children {
            text-indent: 20px;
        }
        &.parentChild {
            ul {
                padding-left: 0px;
            }
            li {
                &.children {
                    width: 100%;
                }
                a {
                    max-width: 100%;
                }
            }
        }
        &.active {
            color: $concrete;
            a {
                color: $concrete;
            }
        }
        a {
            color: #6C6C6C;
        }
        &.children:hover {
            a {
                color: $concrete;
            }
            background-color: #ABABAB;
            color: $white;
        }
        .tools {
            text-indent: 0px;
            background: none;
        }
    }
}
