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

@import "../../../../../public/stylesheets/variables.scss";

queries-notebook {
    // TODO: Delete this breadcrumbs styles after template refactoring to new design.
    .notebooks-top {
        display: flex;
        align-items: center;
        margin: 40px 0 30px;
        flex-direction: row;

        h1 {
            margin: 0 !important;
            display: flex;
            align-items: center;
            align-content: center;

            label {
                font-size: 24px;
                margin-right: 10px;
            }
        }

        breadcrumbs {
            padding-left: 0;

            .breadcrumbs__home {
                margin-left: 0 !important;
            }
        }

        cluster-selector {
            margin-left: 30px;
            display: inline-flex;
        }
    }

    .block-information {
        padding: 18px 10px 18px 36px;

        [ng-transclude] {
            display: flex;
        }

        [ignite-icon] {
            top: 18px;
            left: 14px;
            width: 14px;
            color: inherit;
        }

        ul {
            min-width: 300px;
        }

        .example {
            flex-basis: 100%;

            .group {
                background: white;
                border-style: solid;

                .group-legend {
                    label {
                        @import "public/stylesheets/variables.scss";

                        font-size: 12px;
                        color: $gray-light;
                        background: #fcfcfc;
                        padding: 0;
                        vertical-align: 1px;
                    }
                }

                .group-content {
                    height: 66px;
                    border-radius: 5px;

                    margin: 0;
                    padding: 5px 0;

                    overflow: hidden;
                }
            }
        }

        .sql-editor {
            width: 100%;
            margin: 0;
        }
    }

    .empty-caches {
        display: flex;
        padding: 10px;
        align-items: center;
        justify-content: center;
        text-align: center;
    }

    .notebook-top-buttons {
        display: flex;
        align-items: center;
        margin-left: auto;

        button:first-of-type {
            margin-right: 20px;
        }

        a {
            color: rgb(57, 57, 57);
        }
    }

    .btn.btn-default.select-toggle.tipLabel {
        padding-right: 25px;
    }

    .form-field__sensitive {
        input[type='checkbox'] {
            display: none;
        }

        input:checked + span {
            color: #0067b9;
        }
    }

    .queries-notebook-displayed-caches {
        max-height: 210px;
        padding: 0 5px;
        margin-top: 10px;
        margin-left: -5px;
        margin-right: -5px;

        overflow-y: auto;
    }

    .notebook-failed--block {
        text-align: center;
        display: flex;
        min-height: 200px;
        align-items: center;
        justify-content: center;
        margin-bottom: 30px;
        background: white;
        box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
    }
}

.popover.settings.refresh-rate {
    width: 244px;

    [ignite-icon] {
        height: 12px;
    }

    .popover-title {
        padding: 10px;
        font-size: 14px;
    }

    .actions {
        width: 100%;
        text-align: right;

        button {
            margin-top: 20px;
            margin-right: 0;
        }
    }

    .ignite-form-field {
        display: flex;
        padding: 5px;

        input {
            margin-right: 10px;
        }
    }
}
