/*
 * 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';

.theme--ignite {
    [ignite-icon='info'], .tipLabel {
        color: $ignite-brand-success;
    }

    .ignite-form-field {
        width: 100%;

        &.radio--ignite {
            width: auto;

        }

        &.ignite-form-field-dropdown {
            .ignite-form-field__control button {
                display: inline-block;
                overflow: hidden !important;
                text-overflow: ellipsis;
            }
        }

        [ignite-icon='info'], .tipLabel {
            margin-left: 4px;
            flex: 0 0 auto;
        }


        label.required {
            content: '*';
            margin-left: 0.25em;
        }

        .ignite-form-field__control {
            width: 100%;

            .input-tip {
                display: flex;
                overflow: visible;

                & > input,
                & > button {
                    overflow: visible;

                    box-sizing: border-box;
                    width: 100%;
                    max-width: initial;
                    height: 36px;
                    padding: 0 10px;
                    margin-right: 0;

                    border: solid 1px #c5c5c5;
                    border-radius: 4px;
                    background-color: #ffffff;
                    box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.2);

                    color: $text-color;
                    line-height: 36px;

                    &.ng-invalid:not(.ng-pristine),
                    &.ng-invalid.ng-touched {
                        border-color: $ignite-brand-primary;
                        box-shadow: inset 0 1px 3px 0 rgba($ignite-brand-primary, .5);
                    }

                    &:focus {
                        border-color: $ignite-brand-success;
                        box-shadow: inset 0 1px 3px 0 rgba($ignite-brand-success, .5);
                    }

                    &:disabled {
                        opacity: .5;
                    }


                    &:focus {
                        border-color: $ignite-brand-success;
                        box-shadow: inset 0 1px 3px 0 rgba($ignite-brand-success, .5);
                    }

                    &:disabled {
                        opacity: .5;
                    }
                }

                & > input[type='number'] {
                    text-align: left;
                }
            }

            .tipField {
                line-height: 36px;
            }
       }
    }
    .ignite-form-field__label {
        float: left;
        width: 100%;
        margin: 0 0 2px;
        padding: 0 10px;
        height: 16px;
        display: inline-flex;
        align-items: center;

        color: $gray-light;
        font-size: 12px;
        line-height: 12px;

        &-disabled {
            opacity: 0.5;   
        }
    }
   .ignite-form-field__errors {
        color: $ignite-brand-primary;
        padding: 5px 10px 0;
        line-height: 14px;
        font-size: 12px;
        clear: both;

        &:empty {
            display: none;
        }

        [ng-message] + [ng-message] {
            margin-top: 10px;
        }
   }
   @keyframes error-pulse {
        from {
            color: $ignite-brand-primary;
        }
        50% {
            color: transparent;
        }
        to {
            color: $ignite-brand-primary;
        }
   }
   .ignite-form-field__error-blink {
        .ignite-form-field__errors {
            animation-name: error-pulse;
            animation-iteration-count: 2;
            animation-duration: 500ms;
        }
   }

   .ignite-form-field.form-field-checkbox {
        input[disabled] ~ * {
            opacity: 0.5;
        }
   }
}

.form-field {
    position: relative;
    width: 100%;

    &__label {
        display: flex;
        margin: 0 0 4px;

        color: #424242;
        font-size: 14px;
        line-height: 1.25;

        .icon-help {
            line-height: 14px;
        }

        &.required:after {
            content: '';
        }

        i {
            font-style: normal;
            color: $gray-light;
        }

        svg {
            flex: 0 0 auto;
            margin-left: 4px;
        }

        [ignite-icon='info'] {
            position: relative;
            top: 1px;

            color: $ignite-brand-success;
        }
    }

    &__control {
        overflow: visible;
        display: flex;
        flex-direction: row;
        width: 100%;

        & > input::placeholder,
        & > button.select-toggle.placeholder {
            color: rgba(66, 66, 66, 0.5);
            text-align: left;
        }

        & > input,
        & > button:not(.btn-ignite) {
            outline: none;
            overflow: visible;

            box-sizing: border-box;
            width: 100%;
            max-width: initial;
            min-width: 0;
            height: 36px;
            padding: 9px 10px;
            margin-right: 0;

            border: solid 1px #c5c5c5;
            border-radius: 4px;
            background-color: #ffffff;
            box-shadow: none;

            color: $text-color;
            font-size: 14px;
            text-align: left;
            line-height: 16px;

            &.ng-invalid:not(.ng-pristine),
            &.ng-invalid.ng-touched {
                border-color: #c5c5c5;
                box-shadow: none;
            }

            &.ng-invalid:focus,
            &:focus {
                border-color: $ignite-brand-success;
                box-shadow: none;
            }
        }

        &--postfix::after {
            content: attr(data-postfix);
            display: inline-flex;
            align-self: center;
            margin-left: 10px;
        }

        // Added right offset to appearance of input for invalid password
        & > input[type='email'].ng-invalid.ng-touched,
        & > input[type='text'].ng-invalid.ng-touched,
        & > input[type='password'].ng-invalid.ng-touched {
            padding-right: 36px;
        }

        // Added right offset to appearance of dropdown for invalid data
        & > button.select-toggle.ng-invalid.ng-touched {
            &:after {
                right: 36px;
            }
        }
    }

    &__control-group {
        input {
            min-width: 0;
            margin-right: -1px;

            border-top-right-radius: 0 !important;
            border-bottom-right-radius: 0 !important;

            &:focus {
                z-index: 1;
            }
        }

        input + * {
            border-top-left-radius: 0 !important;
            border-bottom-left-radius: 0 !important;
            flex: 0 0 auto;
            width: 60px !important;
        }
    }

    &__errors {
        position: absolute;
        right: 0;
        bottom: 0;

        display: flex;

        [ng-message] {
            // TODO: remove after replace all fields to new
            overflow: visible !important;
            animation: none !important;
        }
    }

    &__control--postfix + &__errors::after {
        content: attr(data-postfix);
        margin-left: 10px;
        visibility: hidden;
    }

    &__error {
        z-index: 2;
        position: relative;
        width: 0;
        height: 36px;
        float: right;

        color: $brand-primary;
        line-height: $input-height;
        pointer-events: initial;
        text-align: center;

        &:before {
            position: absolute;
            right: 0;
            width: 38px;
        }

        div:first-child {
            display: none;
        }

        [bs-tooltip] {
            z-index: 1;
            position: absolute;
            top: 0;
            right: 0;
            width: 36px;
            height: 36px;
        }

        [ignite-icon] {
            position: absolute;
            top: 10px;
            right: 0;
            width: 38px;
        }
    }

    [disabled] {
        opacity: .5;
    }
}

.theme--ignite-errors-horizontal {
    .form-field__control {
        // Reset offset to appearance of input for invalid password
        & > input[type='email'].ng-invalid.ng-touched,
        & > input[type='text'].ng-invalid.ng-touched,
        & > input[type='password'].ng-invalid.ng-touched {
            padding-right: 0;
        }
        // Reset offset to appearance of dropdown for invalid data
        & > button.select-toggle.ng-invalid.ng-touched {
            &:after {
                right: 10px;
            }
        }
    }

    .form-field__errors {
        position: relative;
        
        padding: 5px 10px 0px;

        color: $ignite-brand-primary;
        font-size: 12px;
        line-height: 14px;

        &:empty {
            display: none;
        }

        [ng-message] + [ng-message] {
            margin-top: 10px;
        }
    }

    .form-field__error {
        float: none;
        width: auto;
        height: auto;
        position: static;

        text-align: left;
        line-height: 14px;

        div:first-child {
            display: block;
        }

        [bs-tooltip],
        [ignite-icon] {
            display: none;
        }
    }

    .form-field__error + .form-field__error {
        margin-top: 10px;
    }

    .form-field__checkbox {
        flex-wrap: wrap;

        .form-field__errors {
            margin-left: -10px;
            flex-basis: 100%;

            .form-field__error {
                width: auto;

                div {
                    width: auto;
                }
            }
        }
    }
}

.form-field__radio,
.form-field__checkbox {
    $errorSize: 16px;
    display: inline-flex;
    width: auto;

    сursor: pointer;

    .form-field {
        &__label {
            order: 1;
            margin: 0;
            cursor: pointer;
        }

        &__control {
            width: auto;
            margin-right: 10px;
            padding: 3px 0;
            flex: 0 0 auto;

            input {
                width: auto;
                height: auto;
                margin: 0;
                border-radius: 0;
            }
        }

        &__errors {
            position: static;
            right: initial;
            bottom: initial;
            order: 3;
            margin-left: 5px;

            .form-field__error {
                width: $errorSize;
                height: $errorSize;

                div {
                    // Required to correctly position error popover
                    top: -10px;
                    height: 36px;
                    
                    width: $errorSize;                    
                }

                [ignite-icon] {
                    width: $errorSize;
                    top: 0;
                }
            }
        }
    }
}

.form-field__radio {
    .form-field__control {
        padding: 2px 0;
    }

    .form-field__control > input[type='radio'] {
        -webkit-appearance: none;

        width: 13px;
        height: 13px;
        padding: 0;

        background: white;
        border: none;
        border-radius: 50%;
        box-shadow: inset 0 0 0 1px rgb(197, 197, 197);

        &:focus {
            outline: none;
            border: none;
            box-shadow: 0 0 0 2px rgba(0, 103, 185, .3),
                  inset 0 0 0 1px rgb(197, 197, 197);
        }

        &:checked {
            border: none;
            box-shadow: inset 0 0 0 5px rgba(0, 103, 185, 1); 

            &:focus {
                box-shadow: 0 0 0 2px rgba(0, 103, 185, .3),
                      inset 0 0 0 5px rgba(0, 103, 185, 1); 
            }
        }
    }
}

.form-field__checkbox {
    .form-field__control > input[type='checkbox'] {
        border-radius: 2px;

        background-image: url(/images/checkbox.svg);
        width: 12px !important;
        height: 12px !important;
        -webkit-appearance: none;
        -moz-appearance: none;
        appearance: none;
        background-repeat: no-repeat;
        background-size: 100%;
        padding: 0;
        border: none;

        &:checked {
            background-image: url(/images/checkbox-active.svg);
        }

        &:disabled {
            opacity: 0.5;
        }

        &:focus {
            outline: none;
            box-shadow: 0 0 0 2px rgba(0, 103, 185, .3);
        }
    }
}

.form-field--inline {
    display: inline-block;
    width: auto;

    .form-field {
        display: flex;
        align-items: baseline;
    }

    .form-field__label {
        white-space: nowrap;
    }

    form-field-size,
    .form-field__text {
        .form-field__control {
            margin-left: 10px;
        }
    }

    .form-field__dropdown,
    .form-field__datepicker,
    .form-field__timepicker {
        .form-field__control {
            width: auto;

            input,
            button {
                color: transparent;

                text-shadow: 0 0 0 $ignite-brand-success;

                border: none;
                box-shadow: none;

                background: linear-gradient(to right, rgb(0, 103, 185), transparent) 0px 25px / 0px, 
                            linear-gradient(to right, rgb(0, 103, 185) 70%, transparent 0%) 0% 0% / 8px 1px repeat-x,
                            0% 0% / 0px, 0% 0% / 4px;
                background-size: 0, 8px 1px, 0, 0;
                background-position: 1px 25px;

                padding-left: 0px;
                padding-right: 0px;
                margin-left: 10px;
                margin-right: 10px;

                &:hover, &:focus {
                    text-shadow: 0 0 0 change-color($ignite-brand-success, $lightness: 26%);
                }
            }
        }
    }

    .form-field__dropdown {
        button::after {
            display: none;
        }
    }
}

.form-field__password {
    // Validation error notification will overlap with visibility button if it's not moved more to the left
    input[type='password'].ng-invalid.ng-touched,
    input[type='password'].ng-invalid.ng-touched + input {
        padding-right: 62px;
    }

    // Extra space for visibility button
    input {
        padding-right: 36px;
    }

    // Distance between error notification and visibility button
    .form-field__errors {
        right: 26px;
    }

    password-visibility-toggle-button {
        position: absolute;
        right: 0;
        height: 36px;
    }
}

.form-field__dropdown {
    .form-field__control {
        > button:not(.btn-ignite) {
            padding-top: 10px;
        }
    }
}

.form-field__ace {
    .ace_editor {
        width: 100%;
        min-height: 70px;
        margin: 0;

        border: solid 1px #c5c5c5;
        border-radius: 4px;
        background-color: #ffffff;
        box-shadow: none;

        .ace_content {
            padding-left: 2px;
        }

        &.ace_focus {
            border-color: $ignite-brand-success;
            box-shadow: none;
        }
    }
}

.form-field.ignite-form-field label.required {
    margin-left: 0 !important;
}

.form-fieldset {
    padding: 10px;

    border: 1px solid hsla(0, 0%, 77%, .5);
    border-radius: 4px;

    legend {
        width: auto;
        margin: 0 -5px;
        padding: 0 5px;

        border: 0;

        color: #393939;
        font-size: 14px;
        line-height: 1.42857;
    }

    legend + * {
        margin-top: 0 !important;
    }

    & > *:last-child {
        margin-bottom: 0 !important;
    }
}
