_sass/bootstrap/_forms.scss in apx-docs-theme-0.1.7 vs _sass/bootstrap/_forms.scss in apx-docs-theme-0.1.15

- old
+ new

@@ -1,617 +1,334 @@ -// -// Forms -// -------------------------------------------------- +// stylelint-disable selector-no-qualifying-type - -// Normalize non-controls // -// Restyle and baseline non-control form elements. - -fieldset { - padding: 0; - margin: 0; - border: 0; - // Chrome and Firefox set a `min-width: min-content;` on fieldsets, - // so we reset that to ensure it behaves more like a standard block element. - // See https://github.com/twbs/bootstrap/issues/12359. - min-width: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: $line-height-computed; - font-size: ($font-size-base * 1.5); - line-height: inherit; - color: $legend-color; - border: 0; - border-bottom: 1px solid $legend-border-color; -} - -label { - display: inline-block; - max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) - margin-bottom: 5px; - font-weight: bold; -} - - -// Normalize form controls +// Textual form controls // -// While most of our form styles require extra classes, some basic normalization -// is required to ensure optimum display with or without those classes to better -// address browser inconsistencies. -// Override content-box in Normalize (* isn't specific enough) -input[type="search"] { - @include box-sizing(border-box); -} - -// Position radios and checkboxes better -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; // IE8-9 - line-height: normal; -} - -input[type="file"] { - display: block; -} - -// Make range inputs behave like textual form controls -input[type="range"] { - display: block; - width: 100%; -} - -// Make multiple select elements height not fixed -select[multiple], -select[size] { - height: auto; -} - -// Focus for file, radio, and checkbox -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - @include tab-focus; -} - -// Adjust output element -output { - display: block; - padding-top: ($padding-base-vertical + 1); - font-size: $font-size-base; - line-height: $line-height-base; - color: $input-color; -} - - -// Common form controls -// -// Shared size and type resets for form controls. Apply `.form-control` to any -// of the following form controls: -// -// select -// textarea -// input[type="text"] -// input[type="password"] -// input[type="datetime"] -// input[type="datetime-local"] -// input[type="date"] -// input[type="month"] -// input[type="time"] -// input[type="week"] -// input[type="number"] -// input[type="email"] -// input[type="url"] -// input[type="search"] -// input[type="tel"] -// input[type="color"] - .form-control { display: block; width: 100%; - height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) - padding: $padding-base-vertical $padding-base-horizontal; - font-size: $font-size-base; - line-height: $line-height-base; + height: $input-height; + padding: $input-padding-y $input-padding-x; + font-size: $input-font-size; + font-weight: $input-font-weight; + line-height: $input-line-height; color: $input-color; background-color: $input-bg; - background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 - border: 1px solid $input-border; - border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS. - @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); - @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s); + background-clip: padding-box; + border: $input-border-width solid $input-border-color; - // Customize the `:focus` state to imitate native WebKit styles. - @include form-control-focus; + // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS. + @if $enable-rounded { + // Manually use the if/else instead of the mixin to account for iOS override + border-radius: $input-border-radius; + } @else { + // Otherwise undo the iOS default + border-radius: 0; + } - // Placeholder - @include placeholder; + @include box-shadow($input-box-shadow); + @include transition($input-transition); // Unstyle the caret on `<select>`s in IE10+. &::-ms-expand { - border: 0; background-color: transparent; + border: 0; } + // Customize the `:focus` state to imitate native WebKit styles. + @include form-control-focus(); + + // Placeholder + &::placeholder { + color: $input-placeholder-color; + // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526. + opacity: 1; + } + // Disabled and read-only inputs // // HTML5 says that controls under a fieldset > legend:first-child won't be // disabled if the fieldset is disabled. Due to implementation difficulty, we // don't honor that edge case; we style them as disabled anyway. - &[disabled], - &[readonly], - fieldset[disabled] & { - background-color: $input-bg-disabled; - opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655 + &:disabled, + &[readonly] { + background-color: $input-disabled-bg; + // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655. + opacity: 1; } +} - &[disabled], - fieldset[disabled] & { - cursor: $cursor-disabled; +select.form-control { + &:focus::-ms-value { + // Suppress the nested default white text on blue background highlight given to + // the selected option text when the (still closed) <select> receives focus + // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to + // match the appearance of the native widget. + // See https://github.com/twbs/bootstrap/issues/19398. + color: $input-color; + background-color: $input-bg; } - - // [converter] extracted textarea& to textarea.form-control } -// Reset height for `textarea`s -textarea.form-control { - height: auto; +// Make file inputs better match text inputs by forcing them to new lines. +.form-control-file, +.form-control-range { + display: block; + width: 100%; } -// Search inputs in iOS // -// This overrides the extra rounded corners on search inputs in iOS so that our -// `.form-control` class can properly style them. Note that this cannot simply -// be added to `.form-control` as it's not specific enough. For details, see -// https://github.com/twbs/bootstrap/issues/11586. +// Labels +// -input[type="search"] { - -webkit-appearance: none; +// For use with horizontal and inline forms, when you need the label (or legend) +// text to align with the form controls. +.col-form-label { + padding-top: calc(#{$input-padding-y} + #{$input-border-width}); + padding-bottom: calc(#{$input-padding-y} + #{$input-border-width}); + margin-bottom: 0; // Override the `<label>/<legend>` default + font-size: inherit; // Override the `<legend>` default + line-height: $input-line-height; } - -// Special styles for iOS temporal inputs -// -// In Mobile Safari, setting `display: block` on temporal inputs causes the -// text within the input to become vertically misaligned. As a workaround, we -// set a pixel line-height that matches the given height of the input, but only -// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848 -// -// Note that as of 9.3, iOS doesn't support `week`. - -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"], - input[type="time"], - input[type="datetime-local"], - input[type="month"] { - &.form-control { - line-height: $input-height-base; - } - - &.input-sm, - .input-group-sm & { - line-height: $input-height-small; - } - - &.input-lg, - .input-group-lg & { - line-height: $input-height-large; - } - } +.col-form-label-lg { + padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width}); + padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width}); + font-size: $input-font-size-lg; + line-height: $input-line-height-lg; } - -// Form groups -// -// Designed to help with the organization and spacing of vertical forms. For -// horizontal forms, use the predefined grid classes. - -.form-group { - margin-bottom: $form-group-margin-bottom; +.col-form-label-sm { + padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width}); + padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width}); + font-size: $input-font-size-sm; + line-height: $input-line-height-sm; } -// Checkboxes and radios +// Readonly controls as plain text // -// Indent the labels to position radios/checkboxes as hanging controls. +// Apply class to a readonly input to make it appear like regular plain +// text (without any border, background color, focus indicator) -.radio, -.checkbox { - position: relative; +.form-control-plaintext { display: block; - margin-top: 10px; - margin-bottom: 10px; + width: 100%; + padding-top: $input-padding-y; + padding-bottom: $input-padding-y; + margin-bottom: 0; // match inputs if this class comes on inputs with default margins + line-height: $input-line-height; + color: $input-plaintext-color; + background-color: transparent; + border: solid transparent; + border-width: $input-border-width 0; - label { - min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; + &.form-control-sm, + &.form-control-lg { + padding-right: 0; + padding-left: 0; } } -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing + +// Form control sizing +// +// Build on `.form-control` with modifier classes to decrease or increase the +// height and font-size of form controls. +// +// Repeated in `_input_group.scss` to avoid Sass extend issues. + +.form-control-sm { + height: $input-height-sm; + padding: $input-padding-y-sm $input-padding-x-sm; + font-size: $input-font-size-sm; + line-height: $input-line-height-sm; + @include border-radius($input-border-radius-sm); } -// Radios and checkboxes on same line -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; +.form-control-lg { + height: $input-height-lg; + padding: $input-padding-y-lg $input-padding-x-lg; + font-size: $input-font-size-lg; + line-height: $input-line-height-lg; + @include border-radius($input-border-radius-lg); } -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; // space out consecutive inline controls -} -// Apply same disabled cursor tweak as for inputs -// Some special care is needed because <label>s don't inherit their parent's `cursor`. -// -// Note: Neither radios nor checkboxes can be readonly. -input[type="radio"], -input[type="checkbox"] { - &[disabled], - &.disabled, - fieldset[disabled] & { - cursor: $cursor-disabled; +// stylelint-disable-next-line no-duplicate-selectors +select.form-control { + &[size], + &[multiple] { + height: auto; } } -// These classes are used directly on <label>s -.radio-inline, -.checkbox-inline { - &.disabled, - fieldset[disabled] & { - cursor: $cursor-disabled; - } + +// stylelint-disable-next-line no-duplicate-selectors +textarea.form-control { + height: auto; } -// These classes are used on elements with <label> descendants -.radio, -.checkbox { - &.disabled, - fieldset[disabled] & { - label { - cursor: $cursor-disabled; - } - } -} - -// Static form control text +// Form groups // -// Apply class to a `p` element to make any string of text align with labels in -// a horizontal form layout. +// Designed to help with the organization and spacing of vertical forms. For +// horizontal forms, use the predefined grid classes. -.form-control-static { - // Size it appropriately next to real form controls - padding-top: ($padding-base-vertical + 1); - padding-bottom: ($padding-base-vertical + 1); - // Remove default margin from `p` - margin-bottom: 0; - min-height: ($line-height-computed + $font-size-base); +.form-group { + margin-bottom: $form-group-margin-bottom; +} - &.input-lg, - &.input-sm { - padding-left: 0; - padding-right: 0; - } +.form-text { + display: block; + margin-top: $form-text-margin-top; } -// Form control sizing +// Form grid // -// Build on `.form-control` with modifier classes to decrease or increase the -// height and font-size of form controls. -// -// The `.form-group-* form-control` variations are sadly duplicated to avoid the -// issue documented in https://github.com/twbs/bootstrap/issues/15074. +// Special replacement for our grid system's `.row` for tighter form layouts. -@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small); -.form-group-sm { - .form-control { - height: $input-height-small; - padding: $padding-small-vertical $padding-small-horizontal; - font-size: $font-size-small; - line-height: $line-height-small; - border-radius: $input-border-radius-small; - } - select.form-control { - height: $input-height-small; - line-height: $input-height-small; - } - textarea.form-control, - select[multiple].form-control { - height: auto; - } - .form-control-static { - height: $input-height-small; - min-height: ($line-height-computed + $font-size-small); - padding: ($padding-small-vertical + 1) $padding-small-horizontal; - font-size: $font-size-small; - line-height: $line-height-small; - } -} +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -$form-grid-gutter-width / 2; + margin-left: -$form-grid-gutter-width / 2; -@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large); -.form-group-lg { - .form-control { - height: $input-height-large; - padding: $padding-large-vertical $padding-large-horizontal; - font-size: $font-size-large; - line-height: $line-height-large; - border-radius: $input-border-radius-large; + > .col, + > [class*="col-"] { + padding-right: $form-grid-gutter-width / 2; + padding-left: $form-grid-gutter-width / 2; } - select.form-control { - height: $input-height-large; - line-height: $input-height-large; - } - textarea.form-control, - select[multiple].form-control { - height: auto; - } - .form-control-static { - height: $input-height-large; - min-height: ($line-height-computed + $font-size-large); - padding: ($padding-large-vertical + 1) $padding-large-horizontal; - font-size: $font-size-large; - line-height: $line-height-large; - } } -// Form control feedback states +// Checkboxes and radios // -// Apply contextual and semantic states to individual form controls. +// Indent the labels to position radios/checkboxes as hanging controls. -.has-feedback { - // Enable absolute positioning +.form-check { position: relative; + display: block; + padding-left: $form-check-input-gutter; +} - // Ensure icons don't overlap text - .form-control { - padding-right: ($input-height-base * 1.25); +.form-check-input { + position: absolute; + margin-top: $form-check-input-margin-y; + margin-left: -$form-check-input-gutter; + + &:disabled ~ .form-check-label { + color: $text-muted; } } -// Feedback icon (requires .glyphicon classes) -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; // Ensure icon is above input groups - display: block; - width: $input-height-base; - height: $input-height-base; - line-height: $input-height-base; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: $input-height-large; - height: $input-height-large; - line-height: $input-height-large; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: $input-height-small; - height: $input-height-small; - line-height: $input-height-small; -} -// Feedback states -.has-success { - @include form-control-validation($state-success-text, $state-success-text, $state-success-bg); +.form-check-label { + margin-bottom: 0; // Override default `<label>` bottom margin } -.has-warning { - @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg); -} -.has-error { - @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg); -} -// Reposition feedback icon if input has visible label above -.has-feedback label { +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; // Override base .form-check + margin-right: $form-check-inline-margin-x; - & ~ .form-control-feedback { - top: ($line-height-computed + 5); // Height of the `label` and its margin + // Undo .form-check-input defaults and add some `margin-right`. + .form-check-input { + position: static; + margin-top: 0; + margin-right: $form-check-inline-input-margin-x; + margin-left: 0; } - &.sr-only ~ .form-control-feedback { - top: 0; - } } -// Help text +// Form validation // -// Apply to any element you wish to create light text for placement immediately -// below a form control. Use for general help, formatting, or instructional text. +// Provide feedback to users when form field values are valid or invalid. Works +// primarily for client-side validation via scoped `:invalid` and `:valid` +// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for +// server side validation. -.help-block { - display: block; // account for any element using help-block - margin-top: 5px; - margin-bottom: 10px; - color: lighten($text-color, 25%); // lighten the text some for contrast -} +@include form-validation-state("valid", $form-feedback-valid-color); +@include form-validation-state("invalid", $form-feedback-invalid-color); - // Inline forms // // Make forms appear inline(-block) by adding the `.form-inline` class. Inline // forms begin stacked on extra small (mobile) devices and then go inline when // viewports reach <768px. // // Requires wrapping inputs and labels with `.form-group` for proper display of // default HTML form controls and our custom form controls (e.g., input groups). -// -// Heads up! This is mixin-ed into `.navbar-form` in navbars.less. -// [converter] extracted from `.form-inline` for libsass compatibility -@mixin form-inline { +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height) + // Because we use flex, the initial sizing of checkboxes is collapsed and + // doesn't occupy the full-width (which is what we want for xs grid tier), + // so we force that here. + .form-check { + width: 100%; + } + // Kick in the inline - @media (min-width: $screen-sm-min) { + @include media-breakpoint-up(sm) { + label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + // Inline-block all the things for "inline" .form-group { - display: inline-block; + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; margin-bottom: 0; - vertical-align: middle; } - // In navbar-form, allow folks to *not* use `.form-group` + // Allow folks to *not* use `.form-group` .form-control { display: inline-block; width: auto; // Prevent labels from stacking above inputs in `.form-group` vertical-align: middle; } // Make static controls behave like regular ones - .form-control-static { + .form-control-plaintext { display: inline-block; } - .input-group { - display: inline-table; - vertical-align: middle; - - .input-group-addon, - .input-group-btn, - .form-control { - width: auto; - } + .input-group, + .custom-select { + width: auto; } - // Input groups need that 100% width though - .input-group > .form-control { - width: 100%; - } - - .control-label { - margin-bottom: 0; - vertical-align: middle; - } - // Remove default margin on radios/checkboxes that were used for stacking, and // then undo the floating of radios and checkboxes to match. - .radio, - .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - - label { - padding-left: 0; - } + .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; } - .radio input[type="radio"], - .checkbox input[type="checkbox"] { + .form-check-input { position: relative; + margin-top: 0; + margin-right: $form-check-input-margin-x; margin-left: 0; } - // Re-override the feedback icon. - .has-feedback .form-control-feedback { - top: 0; + .custom-control { + align-items: center; + justify-content: center; } - } -} -// [converter] extracted as `@mixin form-inline` for libsass compatibility -.form-inline { - @include form-inline; -} - - - -// Horizontal forms -// -// Horizontal forms are built on grid classes and allow you to create forms with -// labels on the left and inputs on the right. - -.form-horizontal { - - // Consistent vertical alignment of radios and checkboxes - // - // Labels also get some reset styles, but that is scoped to a media query below. - .radio, - .checkbox, - .radio-inline, - .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: ($padding-base-vertical + 1); // Default padding plus a border - } - // Account for padding we're adding to ensure the alignment and of help text - // and other content below items - .radio, - .checkbox { - min-height: ($line-height-computed + ($padding-base-vertical + 1)); - } - - // Make form groups behave like rows - .form-group { - @include make-row; - } - - // Reset spacing and right align labels, but scope to media queries so that - // labels on narrow viewports stack the same as a default form example. - @media (min-width: $screen-sm-min) { - .control-label { - text-align: right; + .custom-control-label { margin-bottom: 0; - padding-top: ($padding-base-vertical + 1); // Default padding plus a border - } - } - - // Validation states - // - // Reposition the icon because it's now within a grid column and columns have - // `position: relative;` on them. Also accounts for the grid gutter padding. - .has-feedback .form-control-feedback { - right: floor(($grid-gutter-width / 2)); - } - - // Form group sizes - // - // Quick utility class for applying `.input-lg` and `.input-sm` styles to the - // inputs and labels within a `.form-group`. - .form-group-lg { - @media (min-width: $screen-sm-min) { - .control-label { - padding-top: ($padding-large-vertical + 1); - font-size: $font-size-large; - } - } - } - .form-group-sm { - @media (min-width: $screen-sm-min) { - .control-label { - padding-top: ($padding-small-vertical + 1); - font-size: $font-size-small; - } } } }