/*
 * 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-basic {
    display: block;
    padding: 30px 20px;
    $max-row-width: 500px;
    $row-height: 28px;

    .pcb-row-no-margin {
        [class*='grid-col'] {
            margin-top: 0 !important;
        }
    }

    .pcb-inner-padding {
        padding-left: 10px;
        padding-right: 10px;
    }

    .pcb-cache-name-row {
        $margin: 10px;

        display: flex;
        flex-direction: row;
        max-width: 100%;

        .ignite-form-field {
            margin-right: $margin;
            max-width: $max-row-width;
            flex-grow: 10;
        }
    }

    .pcb-section-notification {
        font-size: 14px;
        color: #757575;
        margin-bottom: 1em;
    }

    .pcb-section-header {
        margin-top: 0;
        margin-bottom: 7px;
        font-size: 16px;
        line-height: 19px;
    }

    .pcb-form-main-buttons {
        display: flex;
        flex-direction: row;
        .pcb-form-main-buttons-left {
            margin-right: auto;
        }
        .pcb-form-main-buttons-right {
            margin-left: auto;
        }
    }
    .pc-form-actions-panel {
        margin: 20px -20px -30px;
        box-shadow: 0px -2px 4px -1px rgba(0, 0, 0, 0.2);
    }

    .form-field__checkbox {
        margin-top: auto;
        margin-bottom: 8px;
    }

    .pcb-form-grid-row {
        @media(min-width: 992px) {
            &>.pc-form-grid-col-10 {
                flex: 0 0 calc(100% / 6);
            }

            &>.pc-form-grid-col-20 {
                flex: 0 0 calc(100% / 6);
            }

            &>.pc-form-grid-col-30 {
                flex: 0 0 calc(100% / 4);
            }

            &>.pc-form-grid-col-40 {
                flex: 0 0 calc(100% / 3);
            }

            &>.pc-form-grid-col-60 {
                flex: 0 0 calc(100% / 2);
            }
            &>.pc-form-grid-col-120 {
                flex: 0 0 100%;
            }
            &>.pc-form-grid-col-free {
                flex: 1;
            }
        }
        @media(max-width: 992px) {
            &>.pc-form-grid-col-10 {
                flex: 0 0 calc(100% / 6);
            }

            &>.pc-form-grid-col-20 {
                flex: 0 0 calc(100% / 3);
            }

            &>.pc-form-grid-col-30 {
                flex: 0 0 calc(100% / 2);
            }

            &>.pc-form-grid-col-40 {
                flex: 0 0 calc(100% / 1.5);
            }

            &>.pc-form-grid-col-60,
            &>.pc-form-grid-col-120 {
                flex: 0 0 100%;
            }
            &>.pc-form-grid-col-free {
                flex: 1;
            }
        }
    }
}