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

/* Inputs */
@mixin fds-input-element-theme($theme) {
    $primaryColor: map-get(map-get($theme, primary), 500);
    $primaryColorHover: map-get(map-get($theme, primary), 100);
    $accentColor: map-get(map-get($theme, accent), 500);
    $accentColorHover: map-get(map-get($theme, accent), 100);

    body[fds] .mat-input-container {
        min-width: 200px;
    }

    body[fds] .mat-input-wrapper {
        margin: 0;
        padding-bottom: 0;
    }

    body[fds] input.mat-input-element,
    body[fds] textarea.mat-input-element {
        border-radius: 2px;
        color: $grey2;
        border: 1px solid $grey8;
        height: 32px;
        padding: 0 10px;
        width: calc(100% - 20px);
        background-color: white;
    }

    body[fds] textarea.mat-input-element {
        padding: 10px 10px;
    }

    body[fds] input.mat-input-element[disabled],
    body[fds] textarea.mat-input-element[disabled] {
        background: $grey9;
        color: $grey10;
        border: 1px solid $grey9;
    }

    body[fds] .mat-input-subscript-wrapper {
        margin-top: 18px;
        width: calc(100% - 23px);
    }

    body[fds] input.mat-input-element:focus,
    body[fds] textarea.mat-input-element:focus {
        border-color: $accentColor;
    }

    body[fds] .mat-input-underline {
        display: none;
    }

    body[fds] .mat-input-placeholder {
        font-size: 14px;
        color: $grey3;
        font-weight: 300;
    }

    body[fds] .mat-form-field-empty.mat-form-field-label {
        top: 26px;
        left: 10px;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        width: calc(100% - 44px);
    }

    body[fds] mat-input-container.mat-focused .mat-input-placeholder {
        transform: translateY(-26px) translateX(-10px) scale(0.75);
    }

    body[fds] .mat-form-field-can-float.mat-form-field-should-float .mat-form-field-placeholder {
        transform: translateY(-26px) translateX(-10px) scale(0.75);
    }

    body[fds] .mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-placeholder-wrapper .mat-form-field-placeholder {
        transform: translateY(-26px) translateX(-10px) scale(0.75);
    }

    body[fds] .input-button {
        top: -3px;
        border-left: none !important;
    }

    body[fds] .input-button.mat-raised-button[disabled] {
        opacity: 1;
    }

    body[fds] .mat-hint {
        color: $grey3;
    }
}
