// Forms // === $base__radio-checkmark: 'data:image/svg+xml;utf8,'; // General Form Elements // --- // // 1. Address Firefox 4+ setting `line-height` on `input` using `!important` in // the UA stylesheet. // 2. Remove padding so people aren’t caught out if they zero out fieldsets. // 3. Remove inner padding and border in Firefox 4+. // 4. Correct color not being inherited. Known issue: affects color of disabled // elements. // 5. Correct font properties not being inherited. // 6. Address margins set differently in Firefox 4+, Safari, and Chrome. // 7. Set font-size to 16px to avoid zooming in on iOS (https://stackoverflow.com/questions/11064237/prevent-iphone-from-zooming-form) fieldset { min-width: 0; margin: 0; padding: 0; border: 0; } input { margin: 0; // 6 color: inherit; // 4 font: inherit; // 5 font-family: $font-family; font-size: $font-size + 2; // 7 line-height: normal; // 1 &::-moz-focus-inner { padding: 0; // 3 border: 0; // 3 } } textarea { margin: 0; // 6 color: inherit; // 4 font: inherit; // 5 } label, textarea { font-family: $font-family; font-size: $font-size; } label { display: inline-block; margin-bottom: $unit / 2; font-weight: $semi-bold-font-weight; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); &:active { color: $active-link-color; } } select, textarea, [type="text"], [type="search"], [type="password"], [type="tel"], [type="url"], [type="number"], [type="email"] { width: 100%; min-height: $tap-size; padding: $input-padding; border: $border; border-radius: 0; background-color: $input-background-color; line-height: $line-height; -webkit-appearance: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); &::-webkit-input-placeholder { color: $neutral-50; } &:active, &:focus { border-color: $focus-color; box-shadow: $input-box-shadow; } } legend { padding: 0; // 2 } // Search input // --- // // These properties must be set with a slightly higher specificity for search // inputs because Normalize's defaults are a bit too specific // // 1. Address `appearance` set to `searchfield` in Safari and Chrome. // 2. Remove inner padding and search cancel button in Safari and Chrome on OS X. // Safari (but not Chrome) clips the cancel button when the search input has // padding (and `textfield` appearance). input[type="search"] { box-sizing: border-box; -webkit-appearance: none; // 1 &::-webkit-search-cancel-button, &::-webkit-search-decoration { -webkit-appearance: none; // 2 } } // Select // --- // // 1. Restore browser default styling. If you’re taking full control of select // styling, remove both these lines. // 2. Simulate the position of the down-arrow as if it were a Icon component in // a button. // 3. Address inconsistent `text-transform` inheritance for `button` and `select`. // All other form control elements do not inherit `text-transform` values. // Correct `button` style inheritance in Firefox and Opera. Correct `select` // style inheritance in Firefox. // 4. Correct color not being inherited. Known issue: affects color of disabled // elements. // 5. Set font-size to 16px to avoid zooming in on iOS (https://stackoverflow.com/questions/11064237/prevent-iphone-from-zooming-form) // 6. Address margins set differently in Firefox 4+, Safari, and Chrome. select { height: $tap-size; // 1 margin: 0; // 6 border-radius: 0; color: $brand-color; font-family: $font-family; font-size: $font-size + 2; // 5 text-transform: none; // 3 &, &[disabled] { background-repeat: no-repeat; background-position: calc(100% - 14px) center; // 2 background-size: 12px 6px; } } optgroup { margin: 0; // 6 color: inherit; // 4 font: inherit; // 5 } // Checkbox and Radios // --- [type="checkbox"], [type="radio"] { position: relative; display: inline-block; width: $unit*3; height: $unit*3; margin-right: $unit; border: $border; background: $neutral-00; vertical-align: middle; -webkit-appearance: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); &:active { background: $neutral-30; } &:checked { border: 0; background: $brand-color; &::after { content: ''; position: absolute; display: block; } } &:disabled { border: 0; background: rgba($neutral-20, 0.5); } } [type="radio"] { border-radius: 50%; &:after { top: $unit; right: $unit; bottom: $unit; left: $unit; border-radius: 50%; background: $neutral-00; } } [type="checkbox"] { &:checked { &:after { content: ''; top: 0; display: block; width: $unit*3; height: $unit*3; background: url($base__radio-checkmark); color: $neutral-00; line-height: 0; pointer-events: none; } } } // Buttons // --- // // 1. Address margins set differently in Firefox 4+, Safari, and Chrome. // 2. Correct color not being inherited. Known issue: affects color of disabled // elements. // 3. Correct font properties not being inherited. // 4. Address inconsistent `text-transform` inheritance for `button` and `select`. // All other form control elements do not inherit `text-transform` values. // Correct `button` style inheritance in Firefox and Opera. Correct `select` // style inheritance in Firefox. // 5. Remove inner padding and border in Firefox 4+. // 6. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` // and `video` controls. // 7. Correct inability to style clickable `input` types in iOS. button, [type="submit"] { display: block; margin: 0; // 1 padding: 0; border: 0; background: $neutral-15; color: inherit; // 2 font: inherit; // 3 line-height: $line-height; text-transform: none; // 4 -webkit-appearance: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); &::-moz-focus-inner { padding: 0; // 5 border: 0; // 5 } &:active { background: $neutral-30; } } html input[type="button"], // 6 input[type="reset"] { -webkit-appearance: button; // 7 } // Disabled // --- // // 1. web-kit default disabled style // 2. Disabled style for button, checkbox, radio, input and select // 3. Checkbox and Radio style [disabled] { opacity: 1; background: $disabled-input-background-color; color: $disabled-input-color; -webkit-text-fill-color: $disabled-input-color; // 1 // 2 &:active, &:checked { border-color: $disabled-input-color; background: $disabled-input-background-color; &::after { color: $disabled-input-color; // 3 } } &[type="radio"]:after { background-color: $disabled-input-color; } }