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


/* panel.scss */

.panel-default {
    >.panel-heading {
        color: $color_jungle_green_approx;
        background: $white;
        border-color: $color_jungle_green_approx;

        button {
            color: $color_jungle_green_approx;
            background: $white;
            border: none;
        }

        .panel-title {
            font-weight: bold;
            padding-top: 8px;
        }
    }

    .nav-tabs {
        >li {
            &.active {
                >a {
                    color: $color_jungle_green_approx;
                }
            }

            >a {
                color: $black;
            }
        }
    }
}

.panel-fullscreen {
    .panel-body {
        //overflow: hidden;
        height: calc(100% - 46px) !important;
    }

    .ui-resizable-handle {
        display: none !important;
    }
}

.nav-tabs {
    >li {
        &:first-child {
            margin-left: 25px;
        }
    }
}

.with-nav-tabs {
    .tab-content {
        >.tab-pane {
            &>div {
                position: relative;
            }

            &.active {
                padding: 20px 10px 0px 10px;
                min-height: 50px;
            }
        }
    }
}

.panel-fullscreen {
    position: fixed;
    height: 100%;
    top: 0px;
    bottom: 0;
    left: 0;
    width: 100%;
    right: 0;
    z-index: 999;
}

.panel.expand_collapse_panel-icon {
    .panel-heading {
        .panel-title {
            display: inline-block;
        }

        i.ec-icon:before {
            content: "\f078"
        }

        &.collapsed,
        &[aria-expanded="false"] {
            i.ec-icon:before {
                content: "\f078"
            }
        }

        &[aria-expanded="true"] {
            i.ec-icon:before {
                content: "\f077"
            }
        }
    }
}

.panel-default.custom-panel>.panel-heading {
    color: $black;
    cursor: pointer;
    border-bottom: none;
    display: inline-block;

    .panel-title {
        font-weight: normal;
        a:hover {
            color: $black;
            opacity: 0.7;
        }
    }
    .btn-group {
        margin-top: 3px;
    }
}

.panel-default.custom-panel>.panel-actions {
    float: right;
    margin-top: 15px;
    button {
        margin-right: 10px;
        margin-top: -4px;
    }
}

.panel-default.custom-panel>.panel-collapse>.panel-body {
    border-top: none;
}
.panel-default.custom-panel>.panel-heading > .btn-group > button {
    color: $black;
}
