/*
  Definitions for forms and input elements.
*/
// Different elements are styled based on the same set of rules.
$input-group-name:           'input-group' !default;  // Class name for input groups.
$_include-fluid-input-group: true !default;           // [Hidden] Should fluid input groups be included? (boolean)
$input-group-fluid-name:     'fluid' !default;        // Class name for fluid input groups.
$input-group-vertical-name:  'vertical' !default;     // Class name for vertical input groups.
$input-group-mobile-breakpoint:   767px !default;     // Breakpoint for fluid input group mobile view.
$button-class-name:           'button' !default;      // Class name for elements styled as buttons.
$input-disabled-opacity:      0.75 !default;          // Opacity for input elements when disabled.
$button-group-name:         'button-group' !default;  // Class name for button groups.
$button-group-mobile-breakpoint: 767px !default;      // Mobile breakpoint for button groups.
$form-back-color:             #f0f0f0 !default;       // Background color for forms.
$form-fore-color:             #111 !default;          // Text color for forms.
$form-border-color:           #ddd !default;          // Border color for forms.
$input-back-color:            #f8f8f8 !default;       // Background color for input elements.
$input-fore-color:            #111 !default;          // Text color for input elements.
$input-border-color:          #ddd !default;          // Border color for input elements.
$input-focus-color:           #0288d1 !default;       // Border color for focused input elements.
$input-invalid-color:         #d32f2f !default;       // Border color for invalid input elements.
$button-back-color:           #e2e2e2 !default;       // Background color for buttons.
$button-hover-back-color:     #dcdcdc !default;       // Background color for buttons (hover).
$button-fore-color:           #212121 !default;       // Text color for buttons.
$button-border-color:         transparent !default;   // Border color for buttons.
$button-hover-border-color:   transparent !default;   // Border color for buttons (hover).
$button-group-border-color:  rgba(124,124,124, 0.54) !default;  // Border color for button groups.
// CSS variable name definitions [exercise caution if modifying these]
$form-back-color-var:         '--form-back-color' !default;
$form-fore-color-var:         '--form-fore-color' !default;
$form-border-color-var:       '--form-border-color' !default;
$input-back-color-var:        '--input-back-color' !default;
$input-fore-color-var:        '--input-fore-color' !default;
$input-border-color-var:      '--input-border-color' !default;
$input-focus-color-var:       '--input-focus-color' !default;
$input-invalid-color-var:     '--input-invalid-color' !default;
$button-back-color-var:       '--button-back-color' !default;
$button-hover-back-color-var: '--button-hover-back-color' !default;
$button-fore-color-var:       '--button-fore-color' !default;
$button-border-color-var:       '--button-border-color' !default;
$button-hover-border-color-var: '--button-hover-border-color' !default;
$button-group-border-color-var: '--button-group-border-color' !default;
// == Uncomment below code if this module is used on its own ==
//
// $base-font-size:          1rem !default;        // Font sizing for all elements
// $universal-margin:        0.5rem !default;      // Universal margin for the most elements
// $universal-padding:       0.5rem !default;      // Universal padding for the most elements
// $universal-border-radius: 0.125rem !default;    // Universal border-radius for most elements
// $universal-box-shadow:    none !default;        // Universal box-shadow for most elements
// $universal-margin-var:          '--universal-margin' !default;
// $universal-padding-var:         '--universal-padding' !default;
// $universal-border-radius-var:   '--universal-border-radius' !default;
// $universal-box-shadow-var:      '--universal-box-shadow' !default;
// :root {
//  #{$universal-margin-var}: $universal-margin;
//  #{$universal-padding-var}: $universal-padding;
//  #{$universal-border-radius-var}: $universal-border-radius;
//  @if $universal-box-shadow != none {
//   #{$universal-box-shadow-var}: $universal-box-shadow;
//  }
// }
//
// ============================================================
// Check the `_input_control_mixins.scss` file to find this module's mixins.
@import 'input_control_mixins';
/* Input_control module CSS variable definitions */
:root {
  #{$form-back-color-var}: $form-back-color;
  #{$form-fore-color-var}: $form-fore-color;
  #{$form-border-color-var}: $form-border-color;
  #{$input-back-color-var}: $input-back-color;
  #{$input-fore-color-var}: $input-fore-color;
  #{$input-border-color-var}: $input-border-color;
  #{$input-focus-color-var}: $input-focus-color;
  #{$input-invalid-color-var}: $input-invalid-color;
  #{$button-back-color-var}: $button-back-color;
  #{$button-hover-back-color-var}: $button-hover-back-color;
  #{$button-fore-color-var}: $button-fore-color;
  #{$button-border-color-var}: $button-border-color;
  #{$button-hover-border-color-var}: $button-hover-border-color;
  #{$button-group-border-color-var}: $button-group-border-color;
}
// Base form styling
form {  // Text color is the default, this can be changed manually.
  background: var(#{$form-back-color-var});
  color: var(#{$form-fore-color-var});
  border: $__1px solid var(#{$form-border-color-var});
  border-radius: var(#{$universal-border-radius-var});
  margin: var(#{$universal-margin-var});
  padding: calc(2 * var(#{$universal-padding-var})) var(#{$universal-padding-var});
  @if $universal-box-shadow != none {
    box-shadow: var(#{$universal-box-shadow-var});
  }
}
// Fieldset styling
fieldset {
  // Apply always to overwrite defaults for all of the below.
  border: $__1px solid var(#{$form-border-color-var});
  border-radius: var(#{$universal-border-radius-var});
  margin: calc(var(#{$universal-margin-var}) / 4);
  padding: var(#{$universal-padding-var});
}
// Legend styling.
legend {
  // Edge fixes.
  box-sizing: border-box;
  display: table;
  max-width: 100%;
  white-space: normal;
  // Actual styling.
  font-weight: $bold-font-weight;
  padding: calc(var(#{$universal-padding-var}) / 2);
}
// Label syling. - Basically just padding, but there might be more in the future.
label {
  padding: calc(var(#{$universal-padding-var}) / 2) var(#{$universal-padding-var});
}
// Input group styling.
.#{$input-group-name} {
  display: inline-block;
  // Fluid input groups
  @if $_include-fluid-input-group {
    &.#{$input-group-fluid-name} {
      display: flex;
      align-items: center;
      justify-content: center;
      & > input {
        max-width: 100%;
        flex-grow: 1;
        flex-basis: 0px;
      }
      // On mobile
      @media screen and (max-width: #{$input-group-mobile-breakpoint}) {
        align-items: stretch;
        flex-direction: column;
      }
    }
    // Vertical input groups
    &.#{$input-group-vertical-name} {
      display: flex;
      align-items: stretch;
      flex-direction: column;
      & > input {
        max-width: 100%;
        flex-grow: 1;
        flex-basis: 0px;
      }
    }
  }
}
// Correct the cursor style of increment and decrement buttons in Chrome.
[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button {
  height: auto;
}
// Correct style in Chrome and Safari.
[type="search"] {
  -webkit-appearance: textfield;
  outline-offset: -2px;
}
// Correct style in Chrome and Safari.
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}
// Common textual input styling. - Avoid using box-shadow with these.
input:not([type]), [type="text"], [type="email"], [type="number"], [type="search"],
[type="password"], [type="url"], [type="tel"], [type="checkbox"], [type="radio"], textarea, select {
  box-sizing: border-box;
  // Background, color and border should not be unassigned, as the browser defaults will apply.
  background: var(#{$input-back-color-var});
  color: var(#{$input-fore-color-var});
  border: $__1px solid var(#{$input-border-color-var});
  border-radius: var(#{$universal-border-radius-var});
  margin: calc(var(#{$universal-margin-var}) / 2);
  padding: var(#{$universal-padding-var}) calc(1.5 * var(#{$universal-padding-var}));
}
// Hover, focus, disabled, readonly, invalid styling for common textual inputs.
input:not([type="button"]):not([type="submit"]):not([type="reset"]), textarea, select {
  &:hover, &:focus {
    border-color: var(#{$input-focus-color-var});
    box-shadow: none;
  }
  &:invalid, &:focus:invalid{
    border-color: var(#{$input-invalid-color-var});
    box-shadow: none;
  }
  &[readonly]{
    background: var(#{$secondary-back-color-var});
  }
}
// Fix for select and option elements overflowing their parent container.
select {
  max-width: 100%;
}
option {
  overflow: hidden;
  text-overflow: ellipsis;
}
// Styling for checkboxes and radio buttons.
[type="checkbox"], [type="radio"] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  position: relative;
  height: calc(#{$base-font-size} + var(#{$universal-padding-var}) / 2);
  width: calc(#{$base-font-size} + var(#{$universal-padding-var}) / 2);
  vertical-align: text-bottom;
  padding: 0; // Remove padding added from previous styles.
  flex-basis: calc(#{$base-font-size} + var(#{$universal-padding-var}) / 2) !important; // Override fluid input-group styling.
  flex-grow: 0 !important;  // Using with fluid input-groups is not recommended.
  &:checked:before {
    position: absolute;
  }
}
[type="checkbox"] {
  &:checked:before {
    content: '\2713';
    font-family: sans-serif;
    font-size: calc(#{$base-font-size} + var(#{$universal-padding-var}) / 2);
    top: calc(0rem - var(#{$universal-padding-var}));
    left: calc(var(#{$universal-padding-var}) / 4);
  }
}
[type="radio"] {
  border-radius: 100%;
  &:checked:before {
    border-radius: 100%;
    content: '';
    top: calc(#{$__1px} + var(#{$universal-padding-var}) / 2);
    left: calc(#{$__1px} + var(#{$universal-padding-var}) / 2);
    background: var(#{$input-fore-color-var});
    width: 0.5rem;
    height: 0.5rem;
  }
}
// Placeholder styling (keep browser-specific definitions separated, they do not play well together).
:placeholder-shown {
  color: var(#{$input-fore-color-var});
}
::-ms-placeholder {
  color: var(#{$input-fore-color-var});
  opacity: 0.54;
}
// Definitions for the button and button-like elements.
// Different elements are styled based on the same set of rules.
// Reset for Firefox focusing on button elements.
button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner {
  border-style: none;
  padding: 0;
}
// Fixes for Android 4, iOS and Safari.
button, html [type="button"], [type="reset"], [type="submit"] {
  -webkit-appearance: button;
}
// Other fixes.
button {
  overflow: visible;      // Show the overflow in IE.
  text-transform: none;    // Remove inheritance of text-transform in Edge, Firefox, and IE.
}
// Default styling
button, [type="button"], [type="submit"], [type="reset"],
a.#{$button-class-name}, label.#{$button-class-name}, .#{$button-class-name},
a[role="button"], label[role="button"], [role="button"] {
  display: inline-block;
  background: var(#{$button-back-color-var});
  color: var(#{$button-fore-color-var});
  border: $__1px solid var(#{$button-border-color-var});
  border-radius: var(#{$universal-border-radius-var});
  padding: var(#{$universal-padding-var}) calc(1.5 * var(#{$universal-padding-var}));
  margin: var(#{$universal-margin-var});
  text-decoration: none;
  cursor: pointer;
  transition: background 0.3s;
  &:hover, &:focus {
    background: var(#{$button-hover-back-color-var});
    border-color: var(#{$button-hover-border-color-var});
  }
}
// Disabled styling for input and button elements.
input, textarea, select, button, .#{$button-class-name}, [role="button"] {
  // .button[disabled] is actually higher specificity than a.button, so no need for more than that
  &:disabled, &[disabled] {
    cursor: not-allowed;
    opacity: $input-disabled-opacity;
  }
}
// Button group styling.
.#{$button-group-name} {
  display: flex;
  border: $__1px solid var(#{$button-group-border-color-var});
  border-radius: var(#{$universal-border-radius-var});
  margin: var(#{$universal-margin-var});
  @if $universal-box-shadow != none {
    box-shadow: var(#{$universal-box-shadow-var});
  }
  & > button, [type="button"], & > [type="submit"], & > [type="reset"],
  & > .#{$button-class-name}, & > [role="button"] {
    margin: 0;
    max-width: 100%;
    flex: 1 1 auto;
    text-align: center;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
  & > :not(:first-child) {
    border-left: $__1px solid var(#{$button-group-border-color-var});
  }
  // Responsiveness for button groups
  @media screen and (max-width: #{$button-group-mobile-breakpoint}) {
    flex-direction: column;
    & > :not(:first-child) {
      border: 0;    // Reapply to remove the left border from elements.
      border-top: $__1px solid var(#{$button-group-border-color-var});
    }
  }
}
