@import "ui-variables";

@component-size: @component-icon-size; // use for text-less controls like radio, checkboxes etc.
@component-margin-side: .3em;
@text-component-height: 2em;
@component-background-color: mix(@text-color, @base-background-color, 20%);


//
// Overrides
// -------------------------

input.input-radio,
input.input-checkbox,
input.input-toggle {
  margin-top: 0; // Override Bootstrap's 4px
}
.input-label {
  margin-bottom: 0;
}

//
// Mixins
// -------------------------

.input-field-mixin() {
  padding: .25em .4em;
  line-height: 1.5; // line-height + padding = @text-component-height
  border-radius: @component-border-radius;
  border: 1px solid @input-border-color;
  background-color: @input-background-color;
  &::-webkit-input-placeholder {
    color: @text-color-subtle;
  }
  &:invalid {
    color: @text-color-error;
    border-color: @background-color-error;
  }
}

.input-block-mixin() {
  display: block;
  width: 100%;
}


//
// Checkbox
// -------------------------

.input-checkbox {
  vertical-align: middle;

  & when (@use-custom-controls) {
    -webkit-appearance: none;
    display: inline-block;
    position: relative;
    width: @component-size;
    height: @component-size;
    font-size: inherit;
    border-radius: @component-border-radius;
    background-color: @component-background-color;
    transition: background-color .16s cubic-bezier(0.5, 0.15, 0.2, 1);

    &&:focus {
      outline: 0; // TODO: Add it back
    }
    &:active {
      background-color: @background-color-info;
    }

    &:before,
    &:after {
      content: "";
      position: absolute;
      top: @component-size * .75;
      left: @component-size * .4;
      height: 2px;
      border-radius: 1px;
      background-color: @base-background-color;
      transform-origin: 0 0;
      opacity: 0;
      transition: transform .1s cubic-bezier(0.5, 0.15, 0.2, 1), opacity .1s cubic-bezier(0.5, 0.15, 0.2, 1);
    }
    &:before {
      width: @component-size * .33;
      transform: translate3d(0,0,0) rotate(225deg) scale(0);
    }
    &:after {
      width: @component-size * .66;
      margin: -1px;
      transform: translate3d(0,0,0) rotate(-45deg) scale(0);
      transition-delay: .05s;
    }

    &:checked {
      background-color: @background-color-info;
      &:active {
        background-color: @component-background-color;
      }
      &:before {
        opacity: 1;
        transform: translate3d(0,0,0) rotate(225deg) scale(1);
        transition-delay: .05s;
      }
      &:after {
        opacity: 1;
        transform: translate3d(0, 0, 0) rotate(-45deg) scale(1);
        transition-delay: 0;
      }
    }

    &:indeterminate {
      background-color: @background-color-info;
      &:active {
        background-color: @component-background-color;
      }
      &:after {
        opacity: 1;
        transform: translate3d(@component-size * -.14, @component-size * -.25, 0) rotate(0deg) scale(1);
        transition-delay: 0;
      }
    }
  }
}


//
// Color
// -------------------------


.input-color {
  vertical-align: middle;

  & when (@use-custom-controls) {
    -webkit-appearance: none;
    padding: 0;
    width: @component-size * 2.5;
    height: @component-size * 2.5;
    border-radius: 50%;
    border: 2px solid @input-border-color;
    background-color: @input-background-color;
    &::-webkit-color-swatch-wrapper { padding: 0; }
    &::-webkit-color-swatch {
      border: 1px solid hsla(0,0%,0%,.1);
      border-radius: 50%;
      transition: transform .16s cubic-bezier(0.5, 0.15, 0.2, 1);
      &:active {
        transition-duration: 0s;
        transform: scale(.9);
      }
    }
  }
}



//
// Label
// -------------------------

.input-label {
  .input-radio,
  .input-checkbox,
  .input-toggle {
    margin-top: -.25em; // Vertical center (visually) - since most labels are upper case.
    margin-right: @component-margin-side;
  }
}


//
// Number
// -------------------------

.input-number {
  vertical-align: middle;

  & when (@use-custom-controls) {
    .input-field-mixin();
    position: relative;
    width: auto;
    .platform-darwin & {
      padding-right: 1.2em; // space for the spin button
      &::-webkit-inner-spin-button {
        -webkit-appearance: menulist-button;
        position: absolute;
        top: 1px;
        bottom: 1px;
        right: 1px;
        width: calc(.6em ~'+' 9px); // magic numbers, OMG!
        outline: 1px solid @input-background-color;
        outline-offset: -1px; // reduces border radius (that can't be changed)
        border-right: .2em solid @background-color-highlight; // a bit more padding
        background-color: @background-color-highlight;
        transition: transform .16s cubic-bezier(0.5, 0.15, 0.2, 1);
        &:active {
          transform: scale(.9);
          transition-duration: 0s;
        }
      }
    }
  }
}


//
// Radio
// -------------------------

.input-radio {
  vertical-align: middle;

  & when (@use-custom-controls) {
    -webkit-appearance: none;
    display: inline-block;
    position: relative;
    width: @component-size;
    height: @component-size;
    font-size: inherit;
    border-radius: 50%;
    background-color: @component-background-color;
    transition: background-color .16s cubic-bezier(0.5, 0.15, 0.2, 1);

    &:before {
      content: "";
      position: absolute;
      width: inherit;
      height: inherit;
      border-radius: inherit;
      border: @component-size/3 solid transparent;
      background-clip: content-box;
      background-color: @base-background-color;
      transform: scale(0);
      transition: transform .1s cubic-bezier(0.5, 0.15, 0.2, 1);
    }
    &&:focus {
      outline: none;
    }
    &:active {
      background-color: @background-color-info;
    }
    &:checked {
      background-color: @background-color-info;
      &:before {
        transform: scale(1);
      }
    }
  }
}


//
// Range (Slider)
// -------------------------

.input-range {
  & when (@use-custom-controls) {
    -webkit-appearance: none;
    margin: @component-padding 0;
    height: 4px;
    border-radius: @component-border-radius;
    background-color: @component-background-color;
    &::-webkit-slider-thumb {
      -webkit-appearance: none;
      width: @component-size;
      height: @component-size;
      border-radius: 50%;
      background-color: @background-color-info;
      transition: transform .16s;
      &:active {
        transition-duration: 0s;
        transform: scale(.9);
      }
    }
  }
}


//
// Search
// -------------------------

.input-search {
  .input-block-mixin();
  &&::-webkit-search-cancel-button {
    -webkit-appearance: searchfield-cancel-button;
  }

  & when (@use-custom-controls) {
    .input-field-mixin();
  }
}


//
// Select
// -------------------------

.input-select {
  vertical-align: middle;

  & when (@use-custom-controls) {
    height: calc(@text-component-height ~'+' 2px); // + 2px? Magic!
    border-radius: @component-border-radius;
    border: 1px solid @button-border-color;
    background-color: @button-background-color;
  }
}


//
// Text
// -------------------------

.input-text {
  .input-block-mixin();

  & when (@use-custom-controls) {
    .input-field-mixin();
  }
}


//
// Text Area
// -------------------------

.input-textarea {
  .input-block-mixin();

  & when (@use-custom-controls) {
    .input-field-mixin();
  }
}


//
// Toggle
// -------------------------

.input-toggle {
  & when (@use-custom-controls) {
    -webkit-appearance: none;
    display: inline-block;
    position: relative;
    font-size: inherit;
    width: @component-size * 2;
    height: @component-size;
    vertical-align: middle;
    border-radius: 2em;
    background-color: @component-background-color;
    transition: background-color .2s cubic-bezier(0.5, 0.15, 0.2, 1);

    &&:focus {
      outline: 0;
    }
    &:checked {
      background-color: @background-color-info;
    }

    // Thumb
    &:before {
      content: "";
      position: absolute;
      width: @component-size;
      height: @component-size;
      border-radius: inherit;
      border: @component-size/4 solid transparent;
      background-clip: content-box;
      background-color: @base-background-color;
      transition: transform .2s cubic-bezier(0.5, 0.15, 0.2, 1);
    }
    &:active:before {
      opacity: .5;
    }
    &:checked:before {
      transform: translate3d(100%, 0, 0);
    }
  }
}
