/*
 * 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.active {
            padding: 20px 10px 0px 10px;
        }
    }
}