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

page-configure-advanced {
    @import "public/stylesheets/variables.scss";

    $nav-height: 46px;

    display: flex;
    flex-direction: column;

    .pca-form-blocked {
        opacity: 0.5;
        pointer-events: none;
        transition: opacity 0.2s;
    }

    .pca-menu {
        height: $nav-height;
        box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
    }

    .pca-menu > ul {
        margin: 0;
        padding: 0;
        display: flex;
        flex-direction: row;
        height: $nav-height;
        background-color: #f9f9f9;
        list-style: none;
        border-bottom: 1px solid #dddddd !important;
        position: -webkit-sticky;
        position: sticky;

        .pca-menu-link {
            border-radius: 0;
            color: #393939;
            font-weight: normal;
            font-size: 12px;
            padding: 15px 20px 14px;
            line-height: 16px;
            border-right: 1px solid #dddddd;
            text-decoration: none !important;
            transition-duration: 0.2s;
            transition-property: border-bottom, background-color, color, padding-bottom;
            border-bottom: $ignite-brand-primary 0px solid;

            &.active, &:hover {
                background-color: white;
                color: $ignite-brand-primary;
                border-bottom: $ignite-brand-primary 3px solid;
                padding-bottom: 12px;
            }

            &:hover:not(.active) {
                border-bottom-color: lighten($ignite-brand-primary, 25%)
            }
        }
    }

    panel-collapsible {
        margin-bottom: 20px;
    }

    panel-content.pca-form-row {
        display: flex !important;
    }

    .pca-form-row {
        display: flex;
        flex-direction: row;

        .pca-form-column-6 {
            flex: 6;
        }
    }

    // Aligns config section form and preview top
    .pca-form-column-6.pc-form-grid-row {
        margin-top: -10px;
    }
}
