// 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: 0.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;
    }
}

#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;
        }
    }
}