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

/* common.scss */
.readOnly {

    span,
    button,
    a {
        i {
            &.fa-trash[data-guid] {
                display: none;
            }

            &.fa-trash[data-id="delete"] {
                display: none;
            }
        }

        &.btn[data-id="addTag"] {
            display: none;
        }

        &.btn[data-id="addTerm"] {
            display: none;
        }

        &.btn[data-id="editButton"] {
            display: none;
        }

        &.editbutton[data-id="editButton"] {
            display: none !important;
        }

        &[data-id="delete"],
        &[data-id="edit"] {
            display: none;
        }

        &.btn[data-id="tagClick"] {
            span {
                display: block;
                padding: 3px 5px 3px 5px;
            }

            i.fa-close[data-id="deleteTag"],
            i.fa-times[data-id="deleteTag"],
            i.fa-times[data-id="delete"] {
                display: none;
            }
        }
    }
}

.details-backbutton {
    display: none !important;
}

.full-screen {
    #sidebar-wrapper {
        left: 0;
    }

    #wrapper {
        padding-left: 0px;
    }
}

.detail-page {
    .details-backbutton {
        display: table-cell !important;
    }

    .searched-term-highlight {
        background-color: #eeee31;
        transition: background-color 4s, font-weight 2s;

        &.bold {
            background-color: transparent;
            font-weight: bold;
        }
    }
}

pre {
    background-color: ghostwhite;
    border: 1px solid silver;
    padding: 10px;
    white-space: -moz-pre-wrap;
    /* Mozilla, supported since 1999 */
    white-space: -pre-wrap;
    /* Opera */
    white-space: -o-pre-wrap;
    /* Opera */
    white-space: pre-wrap;
    /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
    word-wrap: break-word;

    /* IE 5.5+ */
    &.code-block {
        code {
            position: relative;
            max-height: 400px;
            display: block;
            overflow: auto;
            text-align: left;
        }

        position: relative;
        overflow: hidden;

        &.shrink {
            height: 112px;
            white-space: -moz-pre-wrap;
            /* Mozilla, supported since 1999 */
            white-space: -pre-wrap;
            /* Opera */
            white-space: -o-pre-wrap;
            /* Opera */
            white-space: pre-wrap;
            /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
            word-wrap: break-word;

            /* IE 5.5+ */
            code {
                height: 100px;
            }

            &.fixed-height {
                height: 75px;

                code {
                    height: 54px;
                }
            }

            &.medium-height {
                height: 100px;
            }

            .expand-collapse-button {
                i:before {
                    content: "\f107";
                }
            }
        }

        .expand-collapse-button {
            position: absolute;
            right: 3px;
            top: 4px;
            z-index: 1;

            i:before {
                content: "\f106";
            }
        }

        .json-key {
            color: brown;
        }

        .json-value {
            color: navy;
        }

        .json-string {
            color: olive;

            &.cursor {
                cursor: pointer;
                text-decoration: underline;
            }
        }
    }

    code {
        font-family: monospace;
    }
}

.panel-body .memory-details {
    pre {
        &.code-block {
            &.fixed-height {
                max-height: 112px;
                overflow: auto;
            }

            &.shrink {
                height: 144px;

                code {
                    height: 130px;
                }
            }
        }
    }
}

.footer-content {
    position: fixed;
    right: 0px;
    padding: 2px;
    bottom: 0;
    background: white;
}

#accordion {
    .panel-default>.panel-heading {
        cursor: pointer;
        width: 100%;
    }
}

.custom-table {
    width: 100%;
    display: flex;

    tbody {
        display: flex;
        flex-flow: column;
        width: 100%;
    }

    .custom-tr {
        margin-left: 15px;
        display: flex;
        width: calc(100% - 15px);

        .custom-col-0,
        .custom-col-1,
        .custom-col-2 {
            vertical-align: top;
            display: inline-block;

            textarea {
                resize: vertical;
                height: 34px;
                min-height: 34px;
                max-height: 70px;
            }
        }


        .custom-col-0 {
            line-height: 31px;
            width: 9px;
            padding: 0px 2px;
        }

        .custom-col-1 {
            width: calc(50% - 90px);
            flex-grow: 2;

            &:first-child {
                width: 30% !important;
                flex-grow: 1;
            }
        }

        .custom-col-2 {
            text-align: center;
            width: 80px;
            padding-left: 10px;

            &>button {
                padding: 7px 10px;
                margin-bottom: 10px;
            }
        }
    }
}

.errorMsg {
    color: $red;
}

.badge-default {
    background-color: $color_havelock_blue_approx;
    color: $white;
    font-size: 12px;
    font-weight: normal;
    margin-bottom: 5px;
    margin-left: 5px;
    float: left;
}

.errorValidate {
    border-color: red !important;
}

.errorValidate+span .select2-selection {
    border-color: red !important;

}

.button-loader {
    position: relative;
    padding-left: 22px !important;

    &:after {
        content: "\f021";
        position: absolute;
        display: flex;
        justify-content: center;
        align-items: center;
        left: 0px;
        top: 0px;
        font-family: FontAwesome;
        background: transparent;
        height: 100%;
        width: 26px;
        font-size: 11px;
        animation: spin 1000ms infinite linear;
    }
}

.attr-details {
    ul {
        list-style: disc;

        li {
            cursor: pointer;
        }
    }
}

.long-description {
    width: 85%;
    cursor: default !important;
    background-color: transparent !important;
}