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

//colors
$color_celeste_approx: #1D1F2B;
$switchTransition: .4s ease-out;
@mixin transition($transition...) {
    -webkit-transition: $transition;
    -moz-transition: $transition;
    -o-transition: $transition;
    transition: $transition;
}

@mixin transition-property($properties...) {
    -webkit-transition-property: $properties;
    -moz-transition-property: $properties;
    -o-transition-property: $properties;
    transition-property: $properties;
}

.switch {
    position: relative;
    width: 50px;
    height: 22px;
    margin-left: 8px;
    padding: 3px;
    vertical-align: top;
    background-color: $color_celeste_approx;
    border-radius: 18px;
    cursor: pointer;
}

.switch-input {
    position: absolute;
    top: 0;
    left: 0;
    opacity: 0;
}

.switch-slider {
    position: absolute;
    top: 1px;
    left: 3px;
    width: 16px;
    height: 16px;
    border-radius: 10px;
    box-shadow: 1px 1px 5px rgba(black, .2);
    @include transition(left #{$switchTransition});
    &:before {
        content: '';
        position: absolute;
        top: 50%;
        left: 50%;
        margin: -6px 0 0 -8px;
        width: 16px;
        height: 16px;
        background-color: $color_jungle_green_approx;
        border-radius: 10px;
        box-shadow: inset 0 1px rgba(black, .02);
        @include transition(inherit)
    }
    .switch-input:checked ~ & {
        left: 30px;
        box-shadow: -1px 1px 5px rgba(black, .2);
    }
}

.advanceSearchBtn {
    float: right;
}

.advanceSearchTagInput {
    margin-bottom: 20px;
}

.advanceSearchTermInput {
    margin-bottom: 20px;
}

.clearAdvanceSearch {
    display: inline-block;
    float: left;
    margin-top: 10px;
    cursor: pointer
}

.labelShowRecord {
    line-height: 40px;
}

.btnAssign {
    margin-bottom: 15px;
}

.srchType {
    margin: 5px 0px;
    .srchTitle {
        font-size: 14px;
        color: $gray
    }
}

.filterQuery {
    word-break: break-all;
    span {
        font-size: 15px;
        font-weight: bold;
    }
    .key {
        color: $color_jungle_green_approx;
    }
    .operator {
        color: $action_gray;
    }
    .value {
        color: $tag_color;
    }
}
