/**
 * Form elements
 */

// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
// ––––––––––––––––––––

// 1. Change the font styles in all browsers
// 2. Remove the margin in Firefox and Safari
input,
optgroup,
select,
textarea {
  margin: 0; // 2
  font-size: 1rem; // 1
  line-height: var(--line-height); // 1
  font-family: inherit; // 1
  letter-spacing: inherit; // 2
}

// Show the overflow in IE.
input {
  overflow: visible;
}

// Remove the inheritance of text transform in Edge, Firefox, and IE
select {
  text-transform: none;
}

// 1. Correct the text wrapping in Edge and IE
// 2. Correct the color inheritance from `fieldset` elements in IE
// 3. Remove the padding so developers are not caught out when they zero out
// `fieldset` elements in all browsers
legend {
  max-width: 100%; // 1
  padding: 0; // 3
  color: inherit; // 2
  white-space: normal; // 1
}

// 1. Remove the default vertical scrollbar in IE
textarea {
  overflow: auto; // 1
}

// Remove the padding in IE 10
[type="checkbox"],
[type="radio"] {
  padding: 0;
}

// Correct the cursor style of increment and decrement buttons in Safari
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
  height: auto;
}

// 1. Correct the odd appearance in Chrome and Safari
// 2. Correct the outline style in Safari
[type="search"] {
  -webkit-appearance: textfield; // 1
  outline-offset: -2px; // 2
}

// Remove the inner padding in Chrome and Safari on macOS
[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}

// 1. Correct the inability to style clickable types in iOS and Safari
// 2. Change font properties to `inherit` in Safari
::-webkit-file-upload-button {
  -webkit-appearance: button; // 1
  font: inherit; // 2
}

// Remove the inner border and padding of focus outlines in Firefox
::-moz-focus-inner {
  padding: 0;
  border-style: none;
}

//  Remove the focus outline in Firefox
:-moz-focusring {
  outline: none;
}

// Remove the additional :invalid styles in Firefox
:-moz-ui-invalid {
  box-shadow: none;
}

// Change the inconsistent appearance in IE (opinionated)
::-ms-expand {
  display: none;
}

// Remove the border and padding in all browsers (opinionated)
[type="file"],
[type="range"] {
  padding: 0;
  border-width: 0;
}

// Pico
// ––––––––––––––––––––

// Force height for alternatives input types
input:not([type="checkbox"], [type="radio"], [type="range"]) {
  height: calc(
    (1rem * var(--line-height)) + (var(--form-element-spacing-vertical) * 2) +
      (var(--border-width) * 2)
  );
}

// Fieldset
fieldset {
  margin: 0;
  margin-bottom: var(--spacing);
  padding: 0;
  border: 0;
}

// Label & legend
label,
fieldset legend {
  display: block;
  margin-bottom: calc(var(--spacing) * 0.25);
  font-weight: var(--form-label-font-weight, var(--font-weight));
}

// Blocks, 100%
input:not([type="checkbox"], [type="radio"]),
select,
textarea {
  width: 100%;
}

// Reset appearance (Not Checkboxes, Radios, Range and File)
input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]),
select,
textarea {
  appearance: none;
  padding: var(--form-element-spacing-vertical)
    var(--form-element-spacing-horizontal);
}

// Commons styles
input,
select,
textarea {
  --background-color: var(--form-element-background-color);
  --border-color: var(--form-element-border-color);
  --color: var(--form-element-color);
  --box-shadow: none;
  border: var(--border-width) solid var(--border-color);
  border-radius: var(--border-radius);
  outline: none;
  background-color: var(--background-color);
  box-shadow: var(--box-shadow);
  color: var(--color);
  font-weight: var(--font-weight);

  @if $enable-transitions {
    transition: background-color var(--transition),
      border-color var(--transition), color var(--transition),
      box-shadow var(--transition);
  }
}

// Active & Focus
input:not([type="submit"], [type="button"], [type="reset"], [type="checkbox"], [type="radio"], [readonly]),
:where(select, textarea) {
  &:is(:active, :focus) {
    --background-color: var(--form-element-active-background-color);
  }
}

// Active & Focus
input:not([type="submit"], [type="button"], [type="reset"], [role="switch"], [readonly]),
:where(select, textarea) {
  &:is(:active, :focus) {
    --border-color: var(--form-element-active-border-color);
  }
}

// Focus
input:not([type="submit"], [type="button"], [type="reset"], [type="range"], [type="file"], [readonly]),
select,
textarea {
  &:focus {
    --box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);
  }
}

// Disabled
input:not([type="submit"], [type="button"], [type="reset"])[disabled],
select[disabled],
textarea[disabled],
:where(fieldset[disabled]) :is(input:not([type="submit"], [type="button"], [type="reset"]), select, textarea) {
  --background-color: var(--form-element-disabled-background-color);
  --border-color: var(--form-element-disabled-border-color);
  opacity: var(--form-element-disabled-opacity);
  pointer-events: none;
}

// Aria-invalid
:where(input, select, textarea) {
  &:not([type="checkbox"], [type="radio"], [type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
    &[aria-invalid] {
      @if $enable-important {
        padding-right: calc(
          var(--form-element-spacing-horizontal) + 1.5rem
        ) !important;
        padding-left: var(--form-element-spacing-horizontal);
        padding-inline-start: var(--form-element-spacing-horizontal) !important;
        padding-inline-end: calc(
          var(--form-element-spacing-horizontal) + 1.5rem
        ) !important;
      }
      @else {
        padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);
        padding-left: var(--form-element-spacing-horizontal);
        padding-inline-start: var(--form-element-spacing-horizontal);
        padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);
      }
      background-position: center right 0.75rem;
      background-size: 1rem auto;
      background-repeat: no-repeat;
    }

    &[aria-invalid="false"] {
      background-image: var(--icon-valid);
    }

    &[aria-invalid="true"] {
      background-image: var(--icon-invalid);
    }
  }

  &[aria-invalid="false"] {
    --border-color: var(--form-element-valid-border-color);

    &:is(:active, :focus) {
      @if $enable-important {
        --border-color: var(--form-element-valid-active-border-color) !important;
        --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color) !important;
      }
      @else {
        --border-color: var(--form-element-valid-active-border-color);
        --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color);
      }
    }
  }

  &[aria-invalid="true"] {
    --border-color: var(--form-element-invalid-border-color);

    &:is(:active, :focus) {
      @if $enable-important {
        --border-color: var(--form-element-invalid-active-border-color) !important;
        --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color) !important;
      }
      @else {
        --border-color: var(--form-element-invalid-active-border-color);
        --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color);
      }
    }
  }
}

[dir="rtl"] {
  :where(input, select, textarea) {
    &:not([type="checkbox"], [type="radio"]) {
      &:is([aria-invalid], [aria-invalid="true"], [aria-invalid="false"] ){
        background-position: center left 0.75rem;
      }
    }
  }
}

// Placeholder
input::placeholder,
input::-webkit-input-placeholder,
textarea::placeholder,
textarea::-webkit-input-placeholder,
select:invalid {
  color: var(--form-element-placeholder-color);
  opacity: 1;
}

// Margin bottom (Not Checkboxes and Radios)
input:not([type="checkbox"], [type="radio"]),
select,
textarea {
  margin-bottom: var(--spacing);
}

// Select
select {
  // Unstyle the caret on `<select>`s in IE10+.
  &::-ms-expand {
    border: 0;
    background-color: transparent;
  }

  &:not([multiple], [size]) {
    padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);
    padding-left: var(--form-element-spacing-horizontal);
    padding-inline-start: var(--form-element-spacing-horizontal);
    padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);
    background-image: var(--icon-chevron);
    background-position: center right 0.75rem;
    background-size: 1rem auto;
    background-repeat: no-repeat;
  }
}

[dir="rtl"] {
  select {
    &:not([multiple], [size]) {
      background-position: center left 0.75rem;
    }
  }
}

// Helper
$inputs: "input, select, textarea";

@if ($enable-classes and $enable-grid) {
  $inputs: $inputs + ", .grid";
}

:where(#{$inputs}) {
  + small {
    display: block;
    width: 100%;
    margin-top: calc(var(--spacing) * -0.75);
    margin-bottom: var(--spacing);
    color: var(--muted-color);
  }
}

// Styles for Input inside a label
label {
  > :where(input, select, textarea) {
    margin-top: calc(var(--spacing) * 0.25);
  }
}
