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


/* main.scss */

//common color 
$white: #fff;
$action_gray:#999999;
$color_keppel_approx: #37bb9b;
$color_gallery_approx: #eee;
$gray: #808080;
$color_tuna_approx: #323544;
$color_celeste_approx: #ccc;
$color_cornflower_blue_approx: #66afe9;
$color_mystic_approx: #e8e9ee;
$color_jungle_green_approx: #38BB9B;
$color_froly_approx: #ee6e73;
$color_manatee_approx: #9398a0;
$black: #000;
$color_havelock_blue_approx: #4a90e2;
$color_ironside_gray_approx: #686868;
$color_mercury_approx: #e6e6e6;
$color_whisper_approx: #f6f7fa;
$color_bombay_approx: #b5b9bc;
$red: red;
//theme color
//colors
$color_white_lilac_approx: #f6f7fb;
$color_puerto_rico_approx: #3dd4af;
$color_star_dust_approx: #9a9a9a;
$color_mirage_approx: #1c1e2a;
$concrete: #f2f2f2;
$lightGrey:#e1e2e4; //fonts
$font_0: Source Sans Pro;
$font_1: sans-serif;
$font_2: FontAwesome;
//fonts

/* $font_0: PT Sans;
$font_1: sans-serif;
$font_2: Helvetica Neue; */

$font_3: Helvetica;
$font_4: Arial;
$font_5: sans-serf;
//old - style color
$color_bali_hai_approx: #8fa5b1;
$transparent:transparent;
$black_7_5: rgba(0, 0, 0, .075);
$color_hoki_approx: #698797;
$color_curious_blue_approx: #1ba9e2;
$color_blue_bayoux_approx: #44697d;
$color_pickled_bluewood_approx: #334f5e;
$color_picton_blue_approx: #3cb5e6;
$color_yellow_sea_approx: #f5a700;
$color_gamboge_approx: #de9800;
$color_trinidad_approx: #e14f00;
$color_grenadier_approx: #c74600;
$color_athens_gray_approx: #e9ecf2;
$color_green_house_approx: #26530c;
$color_dark_grey_approx:#333;
$black_10: rgba(0, 0, 0, 0.1);
$color_cararra_approx: #ececec;
$black_30: rgba(0, 0, 0, 0.3);
$color_pizazz_approx: #ff8e00;
$black_25: rgba(0, 0, 0, 0.25);
$color_cape_cod_approx: #414141;
$color_apple_blossom_approx: #a94442;
$color_mine_shaft_approx: #333;
$white_80: rgba(255, 255, 255, 0.8);
$color_alto_approx: #dadada;
$color_fuscous_gray_approx: #545454;
$black_65: rgba(0, 0, 0, 0.65);
$white_25: rgba(255, 255, 255, 0.25);
$color_fern_approx: #65bd63;
$color_opal_approx: #a7cec6;
$white_50: rgba(255, 255, 255, 0.5);
$black_20: rgba(0, 0, 0, 0.2);
$color_pelorous_approx: #3aa2d0;
$color_laser_approx: #c4bb61;
$color_zombie_approx: #e0dd94;
$steel_blue: steelblue;
$black_80: rgba(0, 0, 0, 0.8);
$color_bright_turquoise_approx: #00ffd0;
$color_mountain_mist_approx: #999;
$color_suva_gray_approx: #868686;
// $tag_color:#9599a0;
$tag_color:#4A90E2;
$delete_link:#BB5838;
//urls
$url_0: url(../img/loading.gif);
.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;
}

body {
    font-family: $font_0, $font_1;
    color: $color_ironside_gray_approx;
}

.gray-bg {
    background-color: #f6f7fb;
    padding-bottom: 4%;
}

header {
    background-color: $white;
    border-bottom: 1px $color_mystic_approx solid;
}

a {
    color: $color_jungle_green_approx;
    &:focus {
        color: $color_puerto_rico_approx;
        text-decoration: none;
        outline: none;
    }
    &:hover {
        color: $color_puerto_rico_approx;
        text-decoration: none;
    }
}

th {
    text-transform: capitalize;
}

ul {
    list-style: none;
}

.table {
    background-color: $white;
    .table {
        width: auto;
    }
}

.close {
    font-size: 2em;
}

#sideNav-wrapper {
    color: $white;
    font-size: 16px !important;
}

.contentLoading {
    position: absolute;
    background: rgba(247, 247, 247, 0.24);
    top: 0;
    right: 0;
    left: 0;
    z-index: 99;
    bottom: 0;
    display: none;
}

.auditDetailBtn {
    padding: 5px 10px;
    font-size: 14px;
    line-height: 1;
    color: $color_jungle_green_approx;
    text-align: center;
    white-space: nowrap;
    vertical-align: baseline;
    border-radius: 4px;
    font-weight: 100;
    background-color: $transparent;
    border: 1px solid $color_jungle_green_approx;
    cursor: pointer;
}

.add-seperator {
    margin-bottom: 10px;
    border-bottom: 1px solid $color_mirage_approx
}

.termTableBreadcrumb {
    min-width: 200px;
    /*   width: 200px; */
    /*  display: inline-block; */
    i {
        cursor: pointer;
    }
    >div {
        display: inline-block;
        // padding: 10px 0px;
        width: 100%;
    }
    .hide {
        opacity: 0;
        overflow: hidden;
        height: 0px;
        display: block !important;
    }
    .show {
        opacity: 1;
        overflow: visible;
        height: auto;
    }
    .liContent {
        /*  width: 150px; */
        float: left;
        line-height: 21px !important;
        padding: 0px 10px 0px 0px !important;
    }
}

.table-quickMenu > tbody > tr > td {
    &.searchTerm {
        overflow: visible;
    }
    &.searchTag {}
}

.tab-content >.tab-pane {
    display: block;
    opacity: 0;
    height: 0;
    padding: 0px;
    overflow: hidden;
    &.active {
        padding: 25px;
        opacity: 1;
        height: auto;
        overflow: auto;
    }
}

.ellipsis {
    text-overflow: ellipsis;
    max-width: 98%;
    overflow: hidden;
}

.modal-body {
    .table {
        table-layout: fixed;
        word-wrap: break-word;
    }
}

.readOnlyLink {
    display: inline-block;
    .deleteBtn {
        padding: 0px 5px;
    }
    a {
        color: $delete_link;
    }
}

.readOnly {
    .addTag-dropdown {
        display: none;
    }
    span {
        &.inputTag[data-id="tagClick"] {
            i.fa-close[data-id="deleteTag"] {
                display: none;
            }
        }
    }
    a {
        &.inputTag[data-id="addTag"] {
            display: none;
        }
        &.inputTag[data-id="tagClick"] {
            i.fa-times[data-id="delete"] {
                display: none;
            }
        }
        i {
            &.fa-trash[data-guid] {
                display: none;
            }
            &.fa-trash[data-id="delete"] {
                display: none;
            }
        }
        &.inputAssignTag[data-id="addTerm"] {
            display: none;
        }
    }
}

@media (min-width: 768px) {
    .col-sm-offset-1 {
        margin: 4% 4% 0;
    }
    .col-sm-10 {
        width: 92%;
    }
}
