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


/* graph.scss */
.invisible {
    .node circle {
        transition: all 0s;
    }
}

.graph-toolbar {
    background-color: $white;
    margin-bottom: 10px;
    padding: 10px;
}

.legends {
    >i {
        >span {
            font-family: "Source Sans Pro";
        }
    }
}

.lineage-box {
    position: absolute;
    height: 100%;
    width: 100%;
    overflow: hidden;
}

.graph-button-group {
    &>div {
        display: inline-block;
    }

    .zoom-button-group {}
}

.box-panel {
    position: absolute;
    top: 37px;
    border: 1px solid #ccc;
    width: 250px;
    max-height: 99%;
    overflow: auto;
    transition: all 0.3s ease;
    right: -273px;
    background-color: $white;
    z-index: 999;
    box-shadow: 1px 19px 22px -17px;
    border-radius: 10px;
    max-height: 88%;

    &.slide-from-left {
        left: -273px;
        right: 0px;

        &.size-lg {
            left: -373px;
        }
    }

    &.size-lg {
        width: 350px;
    }

    &.show-box-panel {
        right: 0px !important;

        &.slide-from-left {
            left: 0;
        }
    }

    .entity-list {
        overflow: auto;
        list-style-type: decimal;
        list-style-position: outside;
        padding-left: 15px;
    }

    ul>li {
        word-wrap: break-word;
        margin-bottom: 5px;
        text-align: left;

        &.deleted-relation {

            .deleteBtn {
                padding: 2px 8px !important;
                margin: 5px 5px !important;
            }
        }
    }


    .header {
        background: $color_havelock_blue_approx;
        color: white;
        position: relative;
        text-align: center;
        width: 100%;
        position: sticky;
        height: 37px;
        top: 0;
        z-index: 999;

        >h4 {
            padding: 0px 36px 0px 10px;
            word-break: break-all;
        }

        .btn-close {
            position: absolute;
            right: 0px;
            top: 0px;
            font-size: 18px;

            &:hover {
                color: $white;
            }
        }
    }

    .body {
        padding: 10px;
        width: 100%;
        position: relative;
        height: calc(100% - 37px);
        overflow: hidden;
    }
}

.btn-gray {
    border: 1px solid #686868;
    color: $dark_gray;
    background: white;

    &[disabled] {
        opacity: .3;
    }

    &:hover {
        border: 1px solid #686868;
        color: $dark_gray !important;
        background-color: white !important;
    }
}



span#zoom_in {
    border-bottom: 1px solid #625555;
}

.depth-container {

    //display: inline-block;
    //margin-top: 3px;
    .inline {
        display: inline-block;
    }
}

.resizeGraph {
    position: relative;
    width: 100%;
    height: 64vh;
    overflow: hidden !important;

    &.auto-height {
        height: auto !important;
    }
}

.active.fullscreen-mode {
    position: fixed !important;
    height: 100% !important;
    top: 0;
    bottom: 0;
    left: 0;
    width: 100%;
    right: 0;
    padding: 0 !important;
    z-index: 99;
    overflow: hidden !important;
    background: white;

    .systemTypeTree {
        height: 100vh !important;
    }

    .resizeGraph {
        position: fixed;
        height: 100% !important;

        .ui-resizable-handle {
            display: none;
        }
    }

    .lineage-box {
        padding: 10px !important;
    }

    .box-panel {
        margin: 10px !important;
    }
}

.lineage-node-detail {
    .table-quickMenu {
        td:nth-child(1n) {
            width: 150px;
        }

        word-break: break-all;
    }
}

.hidden-svg {
    visibility: hidden;
}

#tab-relationship {

    .entity-status {
        &.active {
            color: $color_jungle_green_approx;
        }

        &.deleted {
            color: $delete_link;
        }

    }

    .entity-list {
        list-style-position: inside;

    }
}

@-webkit-keyframes blink {
    from {
        opacity: 0.2;
    }

    to {
        opacity: 0.5;
    }
}

.mini-map-type-system {
    background: white;
    width: 200px;
    position: absolute;
    bottom: 5px;
    right: 5px;

    &>svg {
        box-shadow: 0px 0px 3px 1px #80808080;
    }

}


.box-panel.fix-box {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    height: 100vh;
    max-height: 100vh;
    z-index: 999;
    bottom: 0;
    width: 400px;
    overflow: auto;
    border-radius: 0px;
    margin: 0 !important;

    &.slide-from-left.size-lg {
        left: -413px;

        &.show-box-panel {
            left: 0;
            margin: 0 !important;
        }
    }

    .body {
        tbody {
            overflow: auto;
            height: calc(100vh - 48px);
            position: absolute;
            padding-bottom: 15px;
        }
    }
}

.profile-bar {
    fill: #38bb9b;
    stroke: #38bb9b;
    fill-opacity: 0.75;
}

.axislabel {
    text-anchor: middle;
    fill: #999;
    font: 400 12px Arial, sans-serif;
}

.grid {

    path,
    line {
        stroke: lightgrey;
        stroke-opacity: 0.7;
        shape-rendering: crispEdges;
    }
}

.d3-tip {
    table td {
        padding: 2px 9px 2px 0;
        vertical-align: middle;

        &.value {
            text-align: right;
            font-weight: 700;
        }

        &.key {
            font-weight: 400;
        }
    }
}