UNPKG

8.82 kBSCSSView Raw
1// stylelint-disable selector-no-qualifying-type
2
3//
4// Textual form controls
5//
6
7.form-control {
8 display: block;
9 width: 100%;
10 padding: $input-padding-y $input-padding-x;
11 font-size: $font-size-base;
12 line-height: $input-line-height;
13 color: $input-color;
14 background-color: $input-bg;
15 background-clip: padding-box;
16 border: $input-border-width solid $input-border-color;
17
18 // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
19 @if $enable-rounded {
20 // Manually use the if/else instead of the mixin to account for iOS override
21 border-radius: $input-border-radius;
22 } @else {
23 // Otherwise undo the iOS default
24 border-radius: 0;
25 }
26
27 @include box-shadow($input-box-shadow);
28 @include transition($input-transition);
29
30 // Unstyle the caret on `<select>`s in IE10+.
31 &::-ms-expand {
32 background-color: transparent;
33 border: 0;
34 }
35
36 // Customize the `:focus` state to imitate native WebKit styles.
37 @include form-control-focus();
38
39 // Placeholder
40 &::placeholder {
41 color: $input-placeholder-color;
42 // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
43 opacity: 1;
44 }
45
46 // Disabled and read-only inputs
47 //
48 // HTML5 says that controls under a fieldset > legend:first-child won't be
49 // disabled if the fieldset is disabled. Due to implementation difficulty, we
50 // don't honor that edge case; we style them as disabled anyway.
51 &:disabled,
52 &[readonly] {
53 background-color: $input-disabled-bg;
54 // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
55 opacity: 1;
56 }
57}
58
59select.form-control {
60 &:not([size]):not([multiple]) {
61 height: $input-height;
62 }
63
64 &:focus::-ms-value {
65 // Suppress the nested default white text on blue background highlight given to
66 // the selected option text when the (still closed) <select> receives focus
67 // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
68 // match the appearance of the native widget.
69 // See https://github.com/twbs/bootstrap/issues/19398.
70 color: $input-color;
71 background-color: $input-bg;
72 }
73}
74
75// Make file inputs better match text inputs by forcing them to new lines.
76.form-control-file,
77.form-control-range {
78 display: block;
79 width: 100%;
80}
81
82
83//
84// Labels
85//
86
87// For use with horizontal and inline forms, when you need the label (or legend)
88// text to align with the form controls.
89.col-form-label {
90 padding-top: calc(#{$input-padding-y} + #{$input-border-width});
91 padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
92 margin-bottom: 0; // Override the `<label>/<legend>` default
93 font-size: inherit; // Override the `<legend>` default
94 line-height: $input-line-height;
95}
96
97.col-form-label-lg {
98 padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
99 padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
100 font-size: $font-size-lg;
101 line-height: $input-line-height-lg;
102}
103
104.col-form-label-sm {
105 padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
106 padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
107 font-size: $font-size-sm;
108 line-height: $input-line-height-sm;
109}
110
111
112// Readonly controls as plain text
113//
114// Apply class to a readonly input to make it appear like regular plain
115// text (without any border, background color, focus indicator)
116
117.form-control-plaintext {
118 display: block;
119 width: 100%;
120 padding-top: $input-padding-y;
121 padding-bottom: $input-padding-y;
122 margin-bottom: 0; // match inputs if this class comes on inputs with default margins
123 line-height: $input-line-height;
124 color: $input-plaintext-color;
125 background-color: transparent;
126 border: solid transparent;
127 border-width: $input-border-width 0;
128
129 &.form-control-sm,
130 &.form-control-lg {
131 padding-right: 0;
132 padding-left: 0;
133 }
134}
135
136
137// Form control sizing
138//
139// Build on `.form-control` with modifier classes to decrease or increase the
140// height and font-size of form controls.
141//
142// The `.form-group-* form-control` variations are sadly duplicated to avoid the
143// issue documented in https://github.com/twbs/bootstrap/issues/15074.
144
145.form-control-sm {
146 padding: $input-padding-y-sm $input-padding-x-sm;
147 font-size: $font-size-sm;
148 line-height: $input-line-height-sm;
149 @include border-radius($input-border-radius-sm);
150}
151
152select.form-control-sm {
153 &:not([size]):not([multiple]) {
154 height: $input-height-sm;
155 }
156}
157
158.form-control-lg {
159 padding: $input-padding-y-lg $input-padding-x-lg;
160 font-size: $font-size-lg;
161 line-height: $input-line-height-lg;
162 @include border-radius($input-border-radius-lg);
163}
164
165select.form-control-lg {
166 &:not([size]):not([multiple]) {
167 height: $input-height-lg;
168 }
169}
170
171
172// Form groups
173//
174// Designed to help with the organization and spacing of vertical forms. For
175// horizontal forms, use the predefined grid classes.
176
177.form-group {
178 margin-bottom: $form-group-margin-bottom;
179}
180
181.form-text {
182 display: block;
183 margin-top: $form-text-margin-top;
184}
185
186
187// Form grid
188//
189// Special replacement for our grid system's `.row` for tighter form layouts.
190
191.form-row {
192 display: flex;
193 flex-wrap: wrap;
194 margin-right: -5px;
195 margin-left: -5px;
196
197 > .col,
198 > [class*="col-"] {
199 padding-right: 5px;
200 padding-left: 5px;
201 }
202}
203
204
205// Checkboxes and radios
206//
207// Indent the labels to position radios/checkboxes as hanging controls.
208
209.form-check {
210 position: relative;
211 display: block;
212 padding-left: $form-check-input-gutter;
213}
214
215.form-check-input {
216 position: absolute;
217 margin-top: $form-check-input-margin-y;
218 margin-left: -$form-check-input-gutter;
219
220 &:disabled ~ .form-check-label {
221 color: $text-muted;
222 }
223}
224
225.form-check-label {
226 margin-bottom: 0; // Override default `<label>` bottom margin
227}
228
229.form-check-inline {
230 display: inline-flex;
231 align-items: center;
232 padding-left: 0; // Override base .form-check
233 margin-right: $form-check-inline-margin-x;
234
235 // Undo .form-check-input defaults and add some `margin-right`.
236 .form-check-input {
237 position: static;
238 margin-top: 0;
239 margin-right: $form-check-inline-input-margin-x;
240 margin-left: 0;
241 }
242}
243
244
245// Form validation
246//
247// Provide feedback to users when form field values are valid or invalid. Works
248// primarily for client-side validation via scoped `:invalid` and `:valid`
249// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
250// server side validation.
251
252@include form-validation-state("valid", $form-feedback-valid-color);
253@include form-validation-state("invalid", $form-feedback-invalid-color);
254
255// Inline forms
256//
257// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
258// forms begin stacked on extra small (mobile) devices and then go inline when
259// viewports reach <768px.
260//
261// Requires wrapping inputs and labels with `.form-group` for proper display of
262// default HTML form controls and our custom form controls (e.g., input groups).
263
264.form-inline {
265 display: flex;
266 flex-flow: row wrap;
267 align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
268
269 // Because we use flex, the initial sizing of checkboxes is collapsed and
270 // doesn't occupy the full-width (which is what we want for xs grid tier),
271 // so we force that here.
272 .form-check {
273 width: 100%;
274 }
275
276 // Kick in the inline
277 @include media-breakpoint-up(sm) {
278 label {
279 display: flex;
280 align-items: center;
281 justify-content: center;
282 margin-bottom: 0;
283 }
284
285 // Inline-block all the things for "inline"
286 .form-group {
287 display: flex;
288 flex: 0 0 auto;
289 flex-flow: row wrap;
290 align-items: center;
291 margin-bottom: 0;
292 }
293
294 // Allow folks to *not* use `.form-group`
295 .form-control {
296 display: inline-block;
297 width: auto; // Prevent labels from stacking above inputs in `.form-group`
298 vertical-align: middle;
299 }
300
301 // Make static controls behave like regular ones
302 .form-control-plaintext {
303 display: inline-block;
304 }
305
306 .input-group,
307 .custom-select {
308 width: auto;
309 }
310
311 // Remove default margin on radios/checkboxes that were used for stacking, and
312 // then undo the floating of radios and checkboxes to match.
313 .form-check {
314 display: flex;
315 align-items: center;
316 justify-content: center;
317 width: auto;
318 padding-left: 0;
319 }
320 .form-check-input {
321 position: relative;
322 margin-top: 0;
323 margin-right: $form-check-input-margin-x;
324 margin-left: 0;
325 }
326
327 .custom-control {
328 align-items: center;
329 justify-content: center;
330 }
331 .custom-control-label {
332 margin-bottom: 0;
333 }
334 }
335}