UNPKG

15.7 kBSCSSView Raw
1// Embedded icons from Open Iconic.
2// Released under MIT and copyright 2014 Waybury.
3// https://useiconic.com/open
4
5
6// Checkboxes and radios
7//
8// Base class takes care of all the key behavioral aspects.
9
10.custom-control {
11 position: relative;
12 z-index: 1;
13 display: block;
14 min-height: $font-size-base * $line-height-base;
15 padding-left: $custom-control-gutter + $custom-control-indicator-size;
16 color-adjust: exact; // Keep themed appearance for print
17}
18
19.custom-control-inline {
20 display: inline-flex;
21 margin-right: $custom-control-spacer-x;
22}
23
24.custom-control-input {
25 position: absolute;
26 left: 0;
27 z-index: -1; // Put the input behind the label so it doesn't overlay text
28 width: $custom-control-indicator-size;
29 height: ($font-size-base * $line-height-base + $custom-control-indicator-size) * .5;
30 opacity: 0;
31
32 &:checked ~ .custom-control-label::before {
33 color: $custom-control-indicator-checked-color;
34 border-color: $custom-control-indicator-checked-border-color;
35 @include gradient-bg($custom-control-indicator-checked-bg);
36 @include box-shadow($custom-control-indicator-checked-box-shadow);
37 }
38
39 &:focus ~ .custom-control-label::before {
40 // the mixin is not used here to make sure there is feedback
41 @if $enable-shadows {
42 box-shadow: $input-box-shadow, $custom-control-indicator-focus-box-shadow;
43 } @else {
44 box-shadow: $custom-control-indicator-focus-box-shadow;
45 }
46 }
47
48 &:focus:not(:checked) ~ .custom-control-label::before {
49 border-color: $custom-control-indicator-focus-border-color;
50 }
51
52 &:not(:disabled):active ~ .custom-control-label::before {
53 color: $custom-control-indicator-active-color;
54 background-color: $custom-control-indicator-active-bg;
55 border-color: $custom-control-indicator-active-border-color;
56 @include box-shadow($custom-control-indicator-active-box-shadow);
57 }
58
59 // Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
60 &[disabled],
61 &:disabled {
62 ~ .custom-control-label {
63 color: $custom-control-label-disabled-color;
64
65 &::before {
66 background-color: $custom-control-indicator-disabled-bg;
67 }
68 }
69 }
70}
71
72// Custom control indicators
73//
74// Build the custom controls out of pseudo-elements.
75
76.custom-control-label {
77 position: relative;
78 margin-bottom: 0;
79 color: $custom-control-label-color;
80 vertical-align: top;
81 cursor: $custom-control-cursor;
82
83 // Background-color and (when enabled) gradient
84 &::before {
85 position: absolute;
86 top: ($font-size-base * $line-height-base - $custom-control-indicator-size) * .5;
87 left: -($custom-control-gutter + $custom-control-indicator-size);
88 display: block;
89 width: $custom-control-indicator-size;
90 height: $custom-control-indicator-size;
91 pointer-events: none;
92 content: "";
93 background-color: $custom-control-indicator-bg;
94 border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
95 @include box-shadow($custom-control-indicator-box-shadow);
96 }
97
98 // Foreground (icon)
99 &::after {
100 position: absolute;
101 top: ($font-size-base * $line-height-base - $custom-control-indicator-size) * .5;
102 left: -($custom-control-gutter + $custom-control-indicator-size);
103 display: block;
104 width: $custom-control-indicator-size;
105 height: $custom-control-indicator-size;
106 content: "";
107 background: 50% / #{$custom-control-indicator-bg-size} no-repeat;
108 }
109}
110
111
112// Checkboxes
113//
114// Tweak just a few things for checkboxes.
115
116.custom-checkbox {
117 .custom-control-label::before {
118 @include border-radius($custom-checkbox-indicator-border-radius);
119 }
120
121 .custom-control-input:checked ~ .custom-control-label {
122 &::after {
123 background-image: escape-svg($custom-checkbox-indicator-icon-checked);
124 }
125 }
126
127 .custom-control-input:indeterminate ~ .custom-control-label {
128 &::before {
129 border-color: $custom-checkbox-indicator-indeterminate-border-color;
130 @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
131 @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
132 }
133 &::after {
134 background-image: escape-svg($custom-checkbox-indicator-icon-indeterminate);
135 }
136 }
137
138 .custom-control-input:disabled {
139 &:checked ~ .custom-control-label::before {
140 @include gradient-bg($custom-control-indicator-checked-disabled-bg);
141 }
142 &:indeterminate ~ .custom-control-label::before {
143 @include gradient-bg($custom-control-indicator-checked-disabled-bg);
144 }
145 }
146}
147
148// Radios
149//
150// Tweak just a few things for radios.
151
152.custom-radio {
153 .custom-control-label::before {
154 // stylelint-disable-next-line property-disallowed-list
155 border-radius: $custom-radio-indicator-border-radius;
156 }
157
158 .custom-control-input:checked ~ .custom-control-label {
159 &::after {
160 background-image: escape-svg($custom-radio-indicator-icon-checked);
161 }
162 }
163
164 .custom-control-input:disabled {
165 &:checked ~ .custom-control-label::before {
166 @include gradient-bg($custom-control-indicator-checked-disabled-bg);
167 }
168 }
169}
170
171
172// switches
173//
174// Tweak a few things for switches
175
176.custom-switch {
177 padding-left: $custom-switch-width + $custom-control-gutter;
178
179 .custom-control-label {
180 &::before {
181 left: -($custom-switch-width + $custom-control-gutter);
182 width: $custom-switch-width;
183 pointer-events: all;
184 // stylelint-disable-next-line property-disallowed-list
185 border-radius: $custom-switch-indicator-border-radius;
186 }
187
188 &::after {
189 top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) * .5, $custom-control-indicator-border-width * 2);
190 left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2);
191 width: $custom-switch-indicator-size;
192 height: $custom-switch-indicator-size;
193 background-color: $custom-control-indicator-border-color;
194 // stylelint-disable-next-line property-disallowed-list
195 border-radius: $custom-switch-indicator-border-radius;
196 @include transition(transform .15s ease-in-out, $custom-forms-transition);
197 }
198 }
199
200 .custom-control-input:checked ~ .custom-control-label {
201 &::after {
202 background-color: $custom-control-indicator-bg;
203 transform: translateX($custom-switch-width - $custom-control-indicator-size);
204 }
205 }
206
207 .custom-control-input:disabled {
208 &:checked ~ .custom-control-label::before {
209 @include gradient-bg($custom-control-indicator-checked-disabled-bg);
210 }
211 }
212}
213
214
215// Select
216//
217// Replaces the browser default select with a custom one, mostly pulled from
218// https://primer.github.io/.
219//
220
221.custom-select {
222 display: inline-block;
223 width: 100%;
224 height: $custom-select-height;
225 padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
226 font-family: $custom-select-font-family;
227 @include font-size($custom-select-font-size);
228 font-weight: $custom-select-font-weight;
229 line-height: $custom-select-line-height;
230 color: $custom-select-color;
231 vertical-align: middle;
232 background: $custom-select-bg $custom-select-background;
233 border: $custom-select-border-width solid $custom-select-border-color;
234 @include border-radius($custom-select-border-radius, 0);
235 @include box-shadow($custom-select-box-shadow);
236 appearance: none;
237
238 &:focus {
239 border-color: $custom-select-focus-border-color;
240 outline: 0;
241 @if $enable-shadows {
242 @include box-shadow($custom-select-box-shadow, $custom-select-focus-box-shadow);
243 } @else {
244 // Avoid using mixin so we can pass custom focus shadow properly
245 box-shadow: $custom-select-focus-box-shadow;
246 }
247
248 &::-ms-value {
249 // For visual consistency with other platforms/browsers,
250 // suppress the default white text on blue background highlight given to
251 // the selected option text when the (still closed) <select> receives focus
252 // in IE and (under certain conditions) Edge.
253 // See https://github.com/twbs/bootstrap/issues/19398.
254 color: $input-color;
255 background-color: $input-bg;
256 }
257 }
258
259 &[multiple],
260 &[size]:not([size="1"]) {
261 height: auto;
262 padding-right: $custom-select-padding-x;
263 background-image: none;
264 }
265
266 &:disabled {
267 color: $custom-select-disabled-color;
268 background-color: $custom-select-disabled-bg;
269 }
270
271 // Hides the default caret in IE11
272 &::-ms-expand {
273 display: none;
274 }
275
276 // Remove outline from select box in FF
277 &:-moz-focusring {
278 color: transparent;
279 text-shadow: 0 0 0 $custom-select-color;
280 }
281}
282
283.custom-select-sm {
284 height: $custom-select-height-sm;
285 padding-top: $custom-select-padding-y-sm;
286 padding-bottom: $custom-select-padding-y-sm;
287 padding-left: $custom-select-padding-x-sm;
288 @include font-size($custom-select-font-size-sm);
289}
290
291.custom-select-lg {
292 height: $custom-select-height-lg;
293 padding-top: $custom-select-padding-y-lg;
294 padding-bottom: $custom-select-padding-y-lg;
295 padding-left: $custom-select-padding-x-lg;
296 @include font-size($custom-select-font-size-lg);
297}
298
299
300// File
301//
302// Custom file input.
303
304.custom-file {
305 position: relative;
306 display: inline-block;
307 width: 100%;
308 height: $custom-file-height;
309 margin-bottom: 0;
310}
311
312.custom-file-input {
313 position: relative;
314 z-index: 2;
315 width: 100%;
316 height: $custom-file-height;
317 margin: 0;
318 overflow: hidden;
319 opacity: 0;
320
321 &:focus ~ .custom-file-label {
322 border-color: $custom-file-focus-border-color;
323 box-shadow: $custom-file-focus-box-shadow;
324 }
325
326 // Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
327 &[disabled] ~ .custom-file-label,
328 &:disabled ~ .custom-file-label {
329 background-color: $custom-file-disabled-bg;
330 }
331
332 @each $lang, $value in $custom-file-text {
333 &:lang(#{$lang}) ~ .custom-file-label::after {
334 content: $value;
335 }
336 }
337
338 ~ .custom-file-label[data-browse]::after {
339 content: attr(data-browse);
340 }
341}
342
343.custom-file-label {
344 position: absolute;
345 top: 0;
346 right: 0;
347 left: 0;
348 z-index: 1;
349 height: $custom-file-height;
350 padding: $custom-file-padding-y $custom-file-padding-x;
351 overflow: hidden;
352 font-family: $custom-file-font-family;
353 font-weight: $custom-file-font-weight;
354 line-height: $custom-file-line-height;
355 color: $custom-file-color;
356 background-color: $custom-file-bg;
357 border: $custom-file-border-width solid $custom-file-border-color;
358 @include border-radius($custom-file-border-radius);
359 @include box-shadow($custom-file-box-shadow);
360
361 &::after {
362 position: absolute;
363 top: 0;
364 right: 0;
365 bottom: 0;
366 z-index: 3;
367 display: block;
368 height: $custom-file-height-inner;
369 padding: $custom-file-padding-y $custom-file-padding-x;
370 line-height: $custom-file-line-height;
371 color: $custom-file-button-color;
372 content: "Browse";
373 @include gradient-bg($custom-file-button-bg);
374 border-left: inherit;
375 @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
376 }
377}
378
379// Range
380//
381// Style range inputs the same across browsers. Vendor-specific rules for pseudo
382// elements cannot be mixed. As such, there are no shared styles for focus or
383// active states on prefixed selectors.
384
385.custom-range {
386 width: 100%;
387 height: add($custom-range-thumb-height, $custom-range-thumb-focus-box-shadow-width * 2);
388 padding: 0; // Need to reset padding
389 background-color: transparent;
390 appearance: none;
391
392 &:focus {
393 outline: 0;
394
395 // Pseudo-elements must be split across multiple rulesets to have an effect.
396 // No box-shadow() mixin for focus accessibility.
397 &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
398 &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
399 &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
400 }
401
402 &::-moz-focus-outer {
403 border: 0;
404 }
405
406 &::-webkit-slider-thumb {
407 width: $custom-range-thumb-width;
408 height: $custom-range-thumb-height;
409 margin-top: ($custom-range-track-height - $custom-range-thumb-height) * .5; // Webkit specific
410 @include gradient-bg($custom-range-thumb-bg);
411 border: $custom-range-thumb-border;
412 @include border-radius($custom-range-thumb-border-radius);
413 @include box-shadow($custom-range-thumb-box-shadow);
414 @include transition($custom-forms-transition);
415 appearance: none;
416
417 &:active {
418 @include gradient-bg($custom-range-thumb-active-bg);
419 }
420 }
421
422 &::-webkit-slider-runnable-track {
423 width: $custom-range-track-width;
424 height: $custom-range-track-height;
425 color: transparent; // Why?
426 cursor: $custom-range-track-cursor;
427 background-color: $custom-range-track-bg;
428 border-color: transparent;
429 @include border-radius($custom-range-track-border-radius);
430 @include box-shadow($custom-range-track-box-shadow);
431 }
432
433 &::-moz-range-thumb {
434 width: $custom-range-thumb-width;
435 height: $custom-range-thumb-height;
436 @include gradient-bg($custom-range-thumb-bg);
437 border: $custom-range-thumb-border;
438 @include border-radius($custom-range-thumb-border-radius);
439 @include box-shadow($custom-range-thumb-box-shadow);
440 @include transition($custom-forms-transition);
441 appearance: none;
442
443 &:active {
444 @include gradient-bg($custom-range-thumb-active-bg);
445 }
446 }
447
448 &::-moz-range-track {
449 width: $custom-range-track-width;
450 height: $custom-range-track-height;
451 color: transparent;
452 cursor: $custom-range-track-cursor;
453 background-color: $custom-range-track-bg;
454 border-color: transparent; // Firefox specific?
455 @include border-radius($custom-range-track-border-radius);
456 @include box-shadow($custom-range-track-box-shadow);
457 }
458
459 &::-ms-thumb {
460 width: $custom-range-thumb-width;
461 height: $custom-range-thumb-height;
462 margin-top: 0; // Edge specific
463 margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
464 margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
465 @include gradient-bg($custom-range-thumb-bg);
466 border: $custom-range-thumb-border;
467 @include border-radius($custom-range-thumb-border-radius);
468 @include box-shadow($custom-range-thumb-box-shadow);
469 @include transition($custom-forms-transition);
470 appearance: none;
471
472 &:active {
473 @include gradient-bg($custom-range-thumb-active-bg);
474 }
475 }
476
477 &::-ms-track {
478 width: $custom-range-track-width;
479 height: $custom-range-track-height;
480 color: transparent;
481 cursor: $custom-range-track-cursor;
482 background-color: transparent;
483 border-color: transparent;
484 border-width: $custom-range-thumb-height * .5;
485 @include box-shadow($custom-range-track-box-shadow);
486 }
487
488 &::-ms-fill-lower {
489 background-color: $custom-range-track-bg;
490 @include border-radius($custom-range-track-border-radius);
491 }
492
493 &::-ms-fill-upper {
494 margin-right: 15px; // arbitrary?
495 background-color: $custom-range-track-bg;
496 @include border-radius($custom-range-track-border-radius);
497 }
498
499 &:disabled {
500 &::-webkit-slider-thumb {
501 background-color: $custom-range-thumb-disabled-bg;
502 }
503
504 &::-webkit-slider-runnable-track {
505 cursor: default;
506 }
507
508 &::-moz-range-thumb {
509 background-color: $custom-range-thumb-disabled-bg;
510 }
511
512 &::-moz-range-track {
513 cursor: default;
514 }
515
516 &::-ms-thumb {
517 background-color: $custom-range-thumb-disabled-bg;
518 }
519 }
520}
521
522.custom-control-label::before,
523.custom-file-label,
524.custom-select {
525 @include transition($custom-forms-transition);
526}