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

/* theme.scss */
$sidebar-color: #f4f4f4;
$sidebar-gray-color: #797979;

body {
    font-family: $font_0, $font_1;
    color: $color_ironside_gray_approx;
    overflow-x: hidden;

    .view-container {
        padding-top: 68px;
    }

    #sidebar-wrapper.animate-me,
    #page-wrapper.animate-me {
        transition: width ease 0.3s;
    }

    #page-wrapper {
        height: calc(100vh - 90px);
        overflow: auto;
        padding-top: 15px !important;
        padding-bottom: 10px !important;
    }
}

.back-button {
    display: inline-block;
    float: left;
    position: absolute;
    left: 4px;
    top: 9px;
    font-size: 38px;
    color: #bfbfbf;
    cursor: pointer;

    &:hover {
        color: $gray;
    }
}

.detail-page {
    .back-button {
        top: 15px;
        font-size: 45px;
    }
}

.modal-header {
    .back-button {
        margin-left: 10px;
        top: 9px;
        font-size: 38px;
    }

    .modal-name {
        font-size: 22px;
        margin-top: 5px;
        margin-left: 20px;
    }
}


.atlas-page-header {
    height: 70px;
    background-color: #d3e0eb;
    display: block;
    position: fixed;
    left: 0px;
    right: 0px;
    padding: 10px;

    .atlas-page-header-title {
        display: inline-block;
        margin: 0px 20px;
        line-height: 50px;
        overflow: hidden;
    }

    .atlas-page-header-content {
        display: inline-block;
        overflow: hidden;
    }
}

.atlas-page-content {}

.popover-menu {
    li>a {
        color: $color_ironside_gray_approx;

        &:hover {
            color: $color_jungle_green_approx;
        }

        i {
            padding-right: 3px;
        }
    }

    .listTerm {
        padding: 3px 0px;
    }

    .divider {
        height: 1px;
        margin: 9px 0;
        overflow: hidden;
        background-color: #e5e5e5;
    }
}

header.atlas-header {
    background-color: $white;
    border-bottom: 1px $color_mystic_approx solid;
    position: fixed;
    width: 100%;
    z-index: 4;
    box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.05);

    .navbar-nav {
        display: table;

        li {
            float: none;
            display: table-cell;
            padding: 0px 5px;
        }

        .logo {
            // width: 172px;
            height: 46px;
            padding: 6px 6px 6px 0px;
            margin-left: 10px;
        }
    }

    &>table {
        width: 100%;

        td {
            padding: 3px 2px;
            position: relative;
            transition: width 0.3s !important;

            .admin-icon {
                background-color: $color_ironside_gray_approx;
                width: 24px;
                height: 20px;
                -webkit-mask: url(../img/support.svg) no-repeat center;
                mask: url(../img/support.svg) no-repeat center;
            }

            .search-box {
                width: 50%;
                margin: 0 auto;
            }
        }
    }

    .header-menu {
        .dropdown-menu {
            &.right-align {
                right: 0;
                left: auto;
            }

            &>li>a,
                {
                color: $color_ironside_gray_approx;

                &:hover {
                    color: $color_jungle_green_approx;
                }

                i {
                    padding-right: 3px;
                }
            }
        }

        td {
            >a {
                display: inline-block;
                color: $color_ironside_gray_approx !important;
                padding: 13px 14px;
                border-bottom: 2px solid transparent;
            }

            >a,
            >table {
                padding: 14px 14px;

                &:hover {
                    border-bottom: 2px solid $color_jungle_green_approx;
                    padding: 14px 14px;
                    color: $color_jungle_green_approx !important;

                    .admin-icon {
                        background-color: $color_jungle_green_approx;
                    }

                    a {
                        color: $color_jungle_green_approx;

                        &:hover {
                            border: none;
                        }
                    }
                }

                td {
                    padding: 0px 15px;

                    a {
                        border-bottom: 0px;
                    }
                }

                span {
                    padding: 5px;
                }

                i {
                    font-size: 18px;
                }
            }
        }
    }
}

.main-search {
    .form-control {
        border: none;
        border-left: 1px $color_mystic_approx solid; //Instead of the line below you could use @include border-radius($radius, $vertical-radius)
        border-radius: 0; //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10)
        box-shadow: none;
        height: 60px;
        font-size: 18px;
        font-style: italic;
    }

    .input-group-addon {
        font-size: 20px;
        color: $color_bombay_approx;
        background: none;
        border: none;
    }
}

.close {
    font-size: 2em;
}

.fix-filter {
    position: fixed;
    bottom: 0;

    .header {
        height: 10px;
        background: blue;
    }

    .body {}
}

.page-title {
    padding: 0px 15px 0px 15px;

    .title {
        padding-top: 0;
        margin-top: 0;
    }

    h1 {
        &.title {
            word-break: break-all;
        }

        // margin-top: 50px;
        margin-bottom: 10px;
        font-weight: 600;
        @include ellipsis();
        max-width: 91%;
        display: inline-block;

        small {
            position: relative;
            bottom: 5px;
            margin-left: 15px;
            padding-left: 15px;
            border-left: 1px $color_mystic_approx solid;
            color: $color_bombay_approx;
            font-size: 40%;
            font-weight: 600;
            text-transform: uppercase;
        }
    }

    .sub-title {
        margin-bottom: 40px;
    }
}

.sm-title {
    line-height: 30px;
}

.md-title {
    line-height: 34px;
}

.lg-title {
    line-height: 40px;
}

.group-box {
    margin-bottom: 15px;
}

.ui-resizable-w {
    border-left: 1px solid gray;
}

a {
    color: $color_jungle_green_approx;
    cursor: pointer;

    &:focus {
        color: $color_puerto_rico_approx;
        text-decoration: none;
        outline: none;
        cursor: pointer;
    }

    &:hover {
        color: $color_puerto_rico_approx;
        text-decoration: none;
        cursor: pointer;
    }
}

.cursor-default,
.cursor-default a {
    cursor: default;
}

.blue-link {
    color: $color_havelock_blue_approx;

    &:focus {
        color: $color_havelock_blue_approx;
        text-decoration: none;
        outline: none;
    }

    &:hover {
        color: $color_havelock_blue_approx;
        text-decoration: underline;
    }
}

a[href^="#!/"]:not(.btn, .not-blue-link) {
    @extend .blue-link;
}

th {
    text-transform: capitalize;
}

ul {
    list-style: none;
}

hr[size="10"] {
    margin: 10px 0px;
}

.table {
    margin-bottom: 2px;
    background-color: $white;
    max-width: none;

    .table {
        width: auto;
    }
}

.card {
    background: $white none repeat scroll 0 0; //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10)
    box-shadow: 0 1px 3px $black_30;
    margin-bottom: 30px;
}

// Colors Class
.white-bg {
    background-color: $white;
    padding: 30px 0;
}

.gray-text {
    color: $color_star_dust_approx;
}

.gray-bg {
    background-color: $color_white_lilac_approx;
}

.comment-input {
    background-color: $color_white_lilac_approx;
    padding: 20px;
    font-size: 16px;
    margin-bottom: 20px;
}

.comment-box {
    padding: 25px 0;
    margin-top: 25px;
    border-top: 1px $color_mystic_approx solid;

    .comment {
        margin-bottom: 25px;
    }

    .author {
        color: $color_keppel_approx;
        margin-bottom: 0;
    }

    .date {
        color: $color_star_dust_approx;
    }
}

.col-sm-custom {
    margin: 15px 25px 0px;
    position: relative;
}

.no-padding {
    padding: 0px !important;
}

.no-padding-bottom {
    padding-bottom: 0px !important;
}

.no-padding-top {
    padding-top: 0px !important;
}

.no-padding-left {
    padding-left: 0px !important;
}

.no-padding-right {
    padding-right: 0px !important;
}

.no-margin {
    margin: 0px !important;
}

.no-margin-bottom {
    margin-bottom: 0px !important;
}

.no-margin-top {
    margin-top: 0px !important;
}

.no-margin-left {
    margin-left: 0px !important;
}

.no-margin-right {
    margin-right: 0px !important;
}

.no-border {
    border: none !important;
}

.no-pointer {
    pointer-events: none;
}

.position-relative {
    position: relative;
}

.pagination-box {
    margin-top: 15px;
}

.ellipsis-with-margin {
    @include ellipsis();
    margin-bottom: 10px;
}

.ellipsis {
    @include ellipsis();
}

.readOnlyLink {
    @include ellipsis();

    .deleteBtn {
        padding: 0px 5px;
    }

    a {
        color: $delete_link !important;
    }
}

.add-seperator {
    margin-bottom: 10px;
    border-bottom: 1px solid #eeeaea;
    padding-bottom: 10px;
}

.legend-sm {
    font-size: 17px;
}

.errorClass {
    border: 1px solid red !important;
    box-shadow: none !important;
}

.inline-content {
    >.inline {
        display: inline-block;

        &+.inline {
            margin-left: 5px;
        }
    }
}

.inline-content-fl {
    @extend .inline-content;

    >.inline {
        display: block;
        float: left;
    }
}

.inline-content-fr {
    @extend .inline-content-fl;

    >.inline {
        float: right;

        &+.inline {
            margin-right: 5px;
        }
    }
}

.has-error {

    .select2-selection--single,
    .select2-selection--multiple {
        border-color: $color_apple_blossom_approx;
    }
}

.search-entity-icon-box {
    padding: 10px;
    border-radius: 50%;
    width: 25px;
    height: 25px;

    img {
        width: 25px;
        height: 25px;
        cursor: default;
    }
}

.entity-icon-box {
    display: inline-block;
    background: #cee0fa;
    padding: 10px;
    border-radius: 50%;
    min-width: 76.25px;
    min-height: 70px;

    &.disabled {
        background: #e3e3e3;
    }

    img {
        height: 50px;
    }
}

.ui-menu.ui-widget-content.ui-autocomplete {
    box-shadow: 0px 11px 30px -8px grey;
    max-width: 100%;
    max-height: 70vh;
    overflow-y: auto;
    /* prevent horizontal scrollbar */
    overflow-x: hidden;

    .ui-autocomplete-category {
        padding: 5px 15px;
        color: #acacac;
        text-transform: capitalize;
    }

    li.empty {
        padding: 5px 2px;
        line-height: 45px;

        span.empty-message {
            padding: 10px;
        }
    }

    .ui-menu-item {
        padding: 2px 2px;
        color: $color_ironside_gray_approx;

        &.with-icon {
            img {
                height: 25px;
                width: 30px;
                margin-right: 10px;
                background: none;
            }
        }

        span.searched-term {
            display: inline-block;
            padding: 0;
            font-weight: bold;
            color: $black !important;
        }

        .ui-state-active {
            margin: 0px;
            border: none;
            background: #cee0fa;
            color: $black !important;
        }

        a,
        span {
            padding: 6px 10px;
            display: block;
            color: inherit !important;
        }
    }
}

.tooltip-inner {
    max-width: none;
    color: #2c2c2c;
    background-color: #f9f9f9;
    box-shadow: 0px 0px 3px 0px #8080806b;
}

.tooltip.bottom .tooltip-arrow {
    border-bottom-color: #000;
}

.dropdown-menu.multi-level {
    .dropdown-submenu {
        position: relative;

        &>a:after {
            display: none;
            content: " ";
            width: 0;
            height: 0;
            border-color: transparent;
            border-style: solid;
            border-width: 5px 5px 5px 0px;
            border-right-color: #ccc;
            position: absolute;
            left: 8px;
            top: calc(50% - 5px);
        }

        &>a:hover:after {
            display: block;
        }

        &>.dropdown-menu {
            top: 0;
            left: -100%;
            width: 100%;
            margin-top: -6px;
            margin-left: -1px;
            -webkit-border-radius: 0 6px 6px 6px;
            -moz-border-radius: 0 6px 6px;
            border-radius: 0 6px 6px 6px;
        }

        &:hover>.dropdown-menu {
            display: table;
        }

    }
}

.select2-results__option {
    &.select2-results__option--highlighted {
        .option-title-light {
            color: #eaeaea;
        }
    }

    .option-title-light {
        font-size: 12px;
        color: #a4a4a4;
    }


}

.dropzone {
    border-radius: 10px;
    border: 2px dashed $color_havelock_blue_approx;

    .dz-default.dz-message {
        font-weight: 500;
        font-size: 20px;
    }

    &.single-file-center {
        .dz-file-preview {
            margin-left: calc(50% - 68px);
        }
    }
}

.dropzone-modal {
    .modal-body {
        background: $color_white_lilac_approx;
    }
}

.help-btn {
    cursor: pointer;
    font-size: 20px;
}

.whitespace-normal {
    white-space: normal !important;
}