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

    code {
        font-family: monospace;
    }
}
.footer-content {
    position: fixed;
    right: 0px;
    padding: 10px;
    bottom: 0;
    background: white;
}

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

.custom-table {
    width: 100%;

    .custom-tr {
        margin-left: 15px;
        margin-right: 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{
            text-align: center;
            vertical-align: middle;
            width: 2%;
        }

        .custom-col-1{
            width: 43%;
        }

        .custom-col-2{
            text-align: center;
            width: 10%;
        }
    }
}

.errorMsg {
    color: $red;
}
