// 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: 6px;
        }
    }

    .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: "\f054"
        }

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

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

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

    .panel-title {
        font-weight: normal;

        a:hover {
            color: $color_jungle_green_approx;
            opacity: 0.7;
        }
    }

    .btn-group {
        margin-top: 4px;
    }
}

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

    button {
        margin-top: -4px;
    }
}

.panel-default.custom-panel>.panel-collapse>.panel-body {
    border-top: none;
}

.panel-default.custom-panel>.panel-heading>.btn-group>button {
    color: $color_jungle_green_approx;
}