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

.details-row,
.settings-row {
    &_small-label {
        @media (min-width: $screen-xs-min) {
            .ignite-form-field__label {
                @include make-xs-column(4);
            }

            .ignite-form-field__control {
                @include make-xs-column(8);
            }
        }

        @media (min-width: $screen-sm-min) {
            .ignite-form-field__label {
                @include make-sm-column(2);
            }

            .ignite-form-field__control {
                @include make-sm-column(10);
            }
        }

        @media (min-width: $screen-md-min) {
            .ignite-form-field__label {
                @include make-md-column(2);
            }

            .ignite-form-field__control {
                @include make-md-column(10);
            }
        }

        @media (min-width: $screen-lg-min) {
            .ignite-form-field__label {
                @include make-lg-column(2);
            }

            .ignite-form-field__control {
                @include make-lg-column(10);
            }
        }
    }

    .ignite-form-field__label,
    .ignite-form-field__control {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: $screen-xs-min) {
    .ignite-form-field__label {
        @include make-xs-column(4);
    }

    .ignite-form-field__control {
        @include make-xs-column(8);
    }
}

@media (min-width: $screen-sm-min) {
    .ignite-form-field__label {
        @include make-sm-column(4);
    }

    .ignite-form-field__control {
        @include make-sm-column(8);
    }
}

@media (min-width: $screen-md-min) {
    .ignite-form-field__label {
        @include make-md-column(4);
    }

    .ignite-form-field__control {
        @include make-md-column(8);
    }
}

@media (min-width: $screen-lg-min) {
    .ignite-form-field__label {
        @include make-lg-column(4);
    }

    .ignite-form-field__control {
        @include make-lg-column(8);
    }
}

.ignite-form-field {
    &__btn {
        overflow: hidden;

        border-top-left-radius: 0;
        border-bottom-left-radius: 0;

        &.btn {
            float: right;
            margin-right: 0;

            line-height: 20px;
        }

        input {
            position: absolute;
            left: 100px;
        }

        input:checked + span {
            color: $brand-info;
        }
    }

    &__btn ~ &__btn {
        border-right: 0;
        border-top-right-radius: 0;
        border-bottom-right-radius: 0;  
    }

    &__btn ~ .input-tip input {
        border-right: 0;
        border-top-right-radius: 0;
        border-bottom-right-radius: 0;  
    }
}
