bootstrap 4.4.1 → 4.6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -1
  3. data/CHANGELOG.md +4 -0
  4. data/README.md +7 -1
  5. data/Rakefile +16 -4
  6. data/assets/javascripts/bootstrap/alert.js +42 -53
  7. data/assets/javascripts/bootstrap/button.js +76 -81
  8. data/assets/javascripts/bootstrap/carousel.js +161 -199
  9. data/assets/javascripts/bootstrap/collapse.js +97 -142
  10. data/assets/javascripts/bootstrap/dropdown.js +130 -186
  11. data/assets/javascripts/bootstrap/modal.js +191 -213
  12. data/assets/javascripts/bootstrap/popover.js +62 -92
  13. data/assets/javascripts/bootstrap/scrollspy.js +81 -132
  14. data/assets/javascripts/bootstrap/tab.js +78 -83
  15. data/assets/javascripts/bootstrap/toast.js +83 -118
  16. data/assets/javascripts/bootstrap/tooltip.js +158 -198
  17. data/assets/javascripts/bootstrap/util.js +27 -26
  18. data/assets/javascripts/bootstrap-sprockets.js +7 -7
  19. data/assets/javascripts/bootstrap.js +1037 -1202
  20. data/assets/javascripts/bootstrap.min.js +4 -4
  21. data/assets/stylesheets/_bootstrap-grid.scss +5 -4
  22. data/assets/stylesheets/_bootstrap-reboot.scss +4 -4
  23. data/assets/stylesheets/_bootstrap.scss +4 -4
  24. data/assets/stylesheets/bootstrap/_alert.scss +1 -0
  25. data/assets/stylesheets/bootstrap/_breadcrumb.scss +1 -1
  26. data/assets/stylesheets/bootstrap/_buttons.scss +10 -7
  27. data/assets/stylesheets/bootstrap/_card.scss +30 -22
  28. data/assets/stylesheets/bootstrap/_carousel.scss +6 -3
  29. data/assets/stylesheets/bootstrap/_close.scss +0 -1
  30. data/assets/stylesheets/bootstrap/_custom-forms.scss +23 -18
  31. data/assets/stylesheets/bootstrap/_dropdown.scss +4 -3
  32. data/assets/stylesheets/bootstrap/_forms.scss +19 -10
  33. data/assets/stylesheets/bootstrap/_functions.scss +62 -6
  34. data/assets/stylesheets/bootstrap/_grid.scss +10 -6
  35. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  36. data/assets/stylesheets/bootstrap/_input-group.scss +24 -4
  37. data/assets/stylesheets/bootstrap/_jumbotron.scss +1 -1
  38. data/assets/stylesheets/bootstrap/_list-group.scss +10 -14
  39. data/assets/stylesheets/bootstrap/_modal.scss +4 -3
  40. data/assets/stylesheets/bootstrap/_nav.scss +9 -4
  41. data/assets/stylesheets/bootstrap/_navbar.scss +10 -2
  42. data/assets/stylesheets/bootstrap/_pagination.scss +3 -2
  43. data/assets/stylesheets/bootstrap/_popover.scss +9 -9
  44. data/assets/stylesheets/bootstrap/_print.scss +0 -9
  45. data/assets/stylesheets/bootstrap/_progress.scss +2 -1
  46. data/assets/stylesheets/bootstrap/_reboot.scss +27 -25
  47. data/assets/stylesheets/bootstrap/_root.scss +0 -1
  48. data/assets/stylesheets/bootstrap/_spinners.scss +18 -8
  49. data/assets/stylesheets/bootstrap/_toasts.scss +4 -2
  50. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -4
  51. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  52. data/assets/stylesheets/bootstrap/_type.scss +1 -1
  53. data/assets/stylesheets/bootstrap/_utilities.scss +2 -1
  54. data/assets/stylesheets/bootstrap/_variables.scss +34 -28
  55. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +2 -1
  56. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +27 -14
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +6 -6
  58. data/assets/stylesheets/bootstrap/mixins/_forms.scss +23 -5
  59. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +26 -17
  60. data/assets/stylesheets/bootstrap/mixins/_grid.scss +17 -17
  61. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -1
  62. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  63. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +2 -2
  64. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  65. data/assets/stylesheets/bootstrap/utilities/_background.scss +1 -1
  66. data/assets/stylesheets/bootstrap/utilities/_borders.scss +1 -1
  67. data/assets/stylesheets/bootstrap/utilities/_embed.scss +1 -1
  68. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +5 -0
  69. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +1 -1
  70. data/assets/stylesheets/bootstrap/utilities/_text.scss +2 -2
  71. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +126 -102
  72. data/bootstrap.gemspec +1 -3
  73. data/lib/bootstrap/engine.rb +17 -1
  74. data/lib/bootstrap/version.rb +2 -2
  75. data/tasks/updater/js.rb +18 -6
  76. data/tasks/updater/network.rb +8 -2
  77. data/test/gemfiles/rails_6_0.gemfile +7 -0
  78. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  79. data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
  80. metadata +12 -19
@@ -9,9 +9,11 @@
9
9
 
10
10
  .custom-control {
11
11
  position: relative;
12
+ z-index: 1;
12
13
  display: block;
13
14
  min-height: $font-size-base * $line-height-base;
14
15
  padding-left: $custom-control-gutter + $custom-control-indicator-size;
16
+ print-color-adjust: exact; // Keep themed appearance for print
15
17
  }
16
18
 
17
19
  .custom-control-inline {
@@ -24,7 +26,7 @@
24
26
  left: 0;
25
27
  z-index: -1; // Put the input behind the label so it doesn't overlay text
26
28
  width: $custom-control-indicator-size;
27
- height: ($font-size-base * $line-height-base + $custom-control-indicator-size) / 2;
29
+ height: ($font-size-base * $line-height-base + $custom-control-indicator-size) * .5;
28
30
  opacity: 0;
29
31
 
30
32
  &:checked ~ .custom-control-label::before {
@@ -37,7 +39,7 @@
37
39
  &:focus ~ .custom-control-label::before {
38
40
  // the mixin is not used here to make sure there is feedback
39
41
  @if $enable-shadows {
40
- box-shadow: $input-box-shadow, $input-focus-box-shadow;
42
+ box-shadow: $input-box-shadow, $custom-control-indicator-focus-box-shadow;
41
43
  } @else {
42
44
  box-shadow: $custom-control-indicator-focus-box-shadow;
43
45
  }
@@ -81,7 +83,7 @@
81
83
  // Background-color and (when enabled) gradient
82
84
  &::before {
83
85
  position: absolute;
84
- top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
86
+ top: ($font-size-base * $line-height-base - $custom-control-indicator-size) * .5;
85
87
  left: -($custom-control-gutter + $custom-control-indicator-size);
86
88
  display: block;
87
89
  width: $custom-control-indicator-size;
@@ -89,20 +91,20 @@
89
91
  pointer-events: none;
90
92
  content: "";
91
93
  background-color: $custom-control-indicator-bg;
92
- border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
94
+ border: $custom-control-indicator-border-width solid $custom-control-indicator-border-color;
93
95
  @include box-shadow($custom-control-indicator-box-shadow);
94
96
  }
95
97
 
96
98
  // Foreground (icon)
97
99
  &::after {
98
100
  position: absolute;
99
- top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
101
+ top: ($font-size-base * $line-height-base - $custom-control-indicator-size) * .5;
100
102
  left: -($custom-control-gutter + $custom-control-indicator-size);
101
103
  display: block;
102
104
  width: $custom-control-indicator-size;
103
105
  height: $custom-control-indicator-size;
104
106
  content: "";
105
- background: no-repeat 50% / #{$custom-control-indicator-bg-size};
107
+ background: 50% / #{$custom-control-indicator-bg-size} no-repeat;
106
108
  }
107
109
  }
108
110
 
@@ -135,10 +137,10 @@
135
137
 
136
138
  .custom-control-input:disabled {
137
139
  &:checked ~ .custom-control-label::before {
138
- background-color: $custom-control-indicator-checked-disabled-bg;
140
+ @include gradient-bg($custom-control-indicator-checked-disabled-bg);
139
141
  }
140
142
  &:indeterminate ~ .custom-control-label::before {
141
- background-color: $custom-control-indicator-checked-disabled-bg;
143
+ @include gradient-bg($custom-control-indicator-checked-disabled-bg);
142
144
  }
143
145
  }
144
146
  }
@@ -149,7 +151,7 @@
149
151
 
150
152
  .custom-radio {
151
153
  .custom-control-label::before {
152
- // stylelint-disable-next-line property-blacklist
154
+ // stylelint-disable-next-line property-disallowed-list
153
155
  border-radius: $custom-radio-indicator-border-radius;
154
156
  }
155
157
 
@@ -161,7 +163,7 @@
161
163
 
162
164
  .custom-control-input:disabled {
163
165
  &:checked ~ .custom-control-label::before {
164
- background-color: $custom-control-indicator-checked-disabled-bg;
166
+ @include gradient-bg($custom-control-indicator-checked-disabled-bg);
165
167
  }
166
168
  }
167
169
  }
@@ -179,17 +181,17 @@
179
181
  left: -($custom-switch-width + $custom-control-gutter);
180
182
  width: $custom-switch-width;
181
183
  pointer-events: all;
182
- // stylelint-disable-next-line property-blacklist
184
+ // stylelint-disable-next-line property-disallowed-list
183
185
  border-radius: $custom-switch-indicator-border-radius;
184
186
  }
185
187
 
186
188
  &::after {
187
- top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2, $custom-control-indicator-border-width * 2);
189
+ top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) * .5, $custom-control-indicator-border-width * 2);
188
190
  left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2);
189
191
  width: $custom-switch-indicator-size;
190
192
  height: $custom-switch-indicator-size;
191
193
  background-color: $custom-control-indicator-border-color;
192
- // stylelint-disable-next-line property-blacklist
194
+ // stylelint-disable-next-line property-disallowed-list
193
195
  border-radius: $custom-switch-indicator-border-radius;
194
196
  @include transition(transform .15s ease-in-out, $custom-forms-transition);
195
197
  }
@@ -204,7 +206,7 @@
204
206
 
205
207
  .custom-control-input:disabled {
206
208
  &:checked ~ .custom-control-label::before {
207
- background-color: $custom-control-indicator-checked-disabled-bg;
209
+ @include gradient-bg($custom-control-indicator-checked-disabled-bg);
208
210
  }
209
211
  }
210
212
  }
@@ -237,8 +239,9 @@
237
239
  border-color: $custom-select-focus-border-color;
238
240
  outline: 0;
239
241
  @if $enable-shadows {
240
- box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;
242
+ @include box-shadow($custom-select-box-shadow, $custom-select-focus-box-shadow);
241
243
  } @else {
244
+ // Avoid using mixin so we can pass custom focus shadow properly
242
245
  box-shadow: $custom-select-focus-box-shadow;
243
246
  }
244
247
 
@@ -312,6 +315,7 @@
312
315
  width: 100%;
313
316
  height: $custom-file-height;
314
317
  margin: 0;
318
+ overflow: hidden;
315
319
  opacity: 0;
316
320
 
317
321
  &:focus ~ .custom-file-label {
@@ -344,6 +348,7 @@
344
348
  z-index: 1;
345
349
  height: $custom-file-height;
346
350
  padding: $custom-file-padding-y $custom-file-padding-x;
351
+ overflow: hidden;
347
352
  font-family: $custom-file-font-family;
348
353
  font-weight: $custom-file-font-weight;
349
354
  line-height: $custom-file-line-height;
@@ -385,7 +390,7 @@
385
390
  appearance: none;
386
391
 
387
392
  &:focus {
388
- outline: none;
393
+ outline: 0;
389
394
 
390
395
  // Pseudo-elements must be split across multiple rulesets to have an effect.
391
396
  // No box-shadow() mixin for focus accessibility.
@@ -401,7 +406,7 @@
401
406
  &::-webkit-slider-thumb {
402
407
  width: $custom-range-thumb-width;
403
408
  height: $custom-range-thumb-height;
404
- margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific
409
+ margin-top: ($custom-range-track-height - $custom-range-thumb-height) * .5; // Webkit specific
405
410
  @include gradient-bg($custom-range-thumb-bg);
406
411
  border: $custom-range-thumb-border;
407
412
  @include border-radius($custom-range-thumb-border-radius);
@@ -476,7 +481,7 @@
476
481
  cursor: $custom-range-track-cursor;
477
482
  background-color: transparent;
478
483
  border-color: transparent;
479
- border-width: $custom-range-thumb-height / 2;
484
+ border-width: $custom-range-thumb-height * .5;
480
485
  @include box-shadow($custom-range-track-box-shadow);
481
486
  }
482
487
 
@@ -22,7 +22,7 @@
22
22
  display: none; // none by default, but block on "open" of the menu
23
23
  float: left;
24
24
  min-width: $dropdown-min-width;
25
- padding: $dropdown-padding-y 0;
25
+ padding: $dropdown-padding-y $dropdown-padding-x;
26
26
  margin: $dropdown-spacer 0 0; // override default ul
27
27
  @include font-size($dropdown-font-size);
28
28
  color: $dropdown-color;
@@ -100,7 +100,7 @@
100
100
  }
101
101
  }
102
102
 
103
- // When enabled Popper.js, reset basic dropdown position
103
+ // When Popper is enabled, reset the basic dropdown position
104
104
  // stylelint-disable-next-line no-duplicate-selectors
105
105
  .dropdown-menu {
106
106
  &[x-placement^="top"],
@@ -128,6 +128,7 @@
128
128
  font-weight: $font-weight-normal;
129
129
  color: $dropdown-link-color;
130
130
  text-align: inherit; // For `<button>`s
131
+ text-decoration: if($link-decoration == none, null, none);
131
132
  white-space: nowrap; // prevent links from randomly breaking onto new lines
132
133
  background-color: transparent; // For `<button>`s
133
134
  border: 0; // For `<button>`s
@@ -176,7 +177,7 @@
176
177
  // Dropdown section headers
177
178
  .dropdown-header {
178
179
  display: block;
179
- padding: $dropdown-padding-y $dropdown-item-padding-x;
180
+ padding: $dropdown-header-padding;
180
181
  margin-bottom: 0; // for use with heading elements
181
182
  @include font-size($font-size-sm);
182
183
  color: $dropdown-header-color;
@@ -30,12 +30,6 @@
30
30
  border: 0;
31
31
  }
32
32
 
33
- // Remove select outline from select box in FF
34
- &:-moz-focusring {
35
- color: transparent;
36
- text-shadow: 0 0 0 $input-color;
37
- }
38
-
39
33
  // Customize the `:focus` state to imitate native WebKit styles.
40
34
  @include form-control-focus($ignore-warning: true);
41
35
 
@@ -59,7 +53,22 @@
59
53
  }
60
54
  }
61
55
 
56
+ input[type="date"],
57
+ input[type="time"],
58
+ input[type="datetime-local"],
59
+ input[type="month"] {
60
+ &.form-control {
61
+ appearance: none; // Fix appearance for date inputs in Safari
62
+ }
63
+ }
64
+
62
65
  select.form-control {
66
+ // Remove select outline from select box in FF
67
+ &:-moz-focusring {
68
+ color: transparent;
69
+ text-shadow: 0 0 0 $input-color;
70
+ }
71
+
63
72
  &:focus::-ms-value {
64
73
  // Suppress the nested default white text on blue background highlight given to
65
74
  // the selected option text when the (still closed) <select> receives focus
@@ -190,13 +199,13 @@ textarea.form-control {
190
199
  .form-row {
191
200
  display: flex;
192
201
  flex-wrap: wrap;
193
- margin-right: -$form-grid-gutter-width / 2;
194
- margin-left: -$form-grid-gutter-width / 2;
202
+ margin-right: -$form-grid-gutter-width * .5;
203
+ margin-left: -$form-grid-gutter-width * .5;
195
204
 
196
205
  > .col,
197
206
  > [class*="col-"] {
198
- padding-right: $form-grid-gutter-width / 2;
199
- padding-left: $form-grid-gutter-width / 2;
207
+ padding-right: $form-grid-gutter-width * .5;
208
+ padding-left: $form-grid-gutter-width * .5;
200
209
  }
201
210
  }
202
211
 
@@ -23,10 +23,12 @@
23
23
  // Starts at zero
24
24
  // Used to ensure the min-width of the lowest breakpoint starts at 0.
25
25
  @mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
26
- $values: map-values($map);
27
- $first-value: nth($values, 1);
28
- @if $first-value != 0 {
29
- @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
26
+ @if length($map) > 0 {
27
+ $values: map-values($map);
28
+ $first-value: nth($values, 1);
29
+ @if $first-value != 0 {
30
+ @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
31
+ }
30
32
  }
31
33
  }
32
34
 
@@ -49,10 +51,18 @@
49
51
  }
50
52
 
51
53
  // See https://codepen.io/kevinweber/pen/dXWoRw
54
+ //
55
+ // Requires the use of quotes around data URIs.
56
+
52
57
  @function escape-svg($string) {
53
58
  @if str-index($string, "data:image/svg+xml") {
54
59
  @each $char, $encoded in $escaped-characters {
55
- $string: str-replace($string, $char, $encoded);
60
+ // Do not escape the url brackets
61
+ @if str-index($string, "url(") == 1 {
62
+ $string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}");
63
+ } @else {
64
+ $string: str-replace($string, $char, $encoded);
65
+ }
56
66
  }
57
67
  }
58
68
 
@@ -65,7 +75,7 @@
65
75
  $g: green($color);
66
76
  $b: blue($color);
67
77
 
68
- $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
78
+ $yiq: (($r * 299) + ($g * 587) + ($b * 114)) * .001;
69
79
 
70
80
  @if ($yiq >= $yiq-contrasted-threshold) {
71
81
  @return $dark;
@@ -130,5 +140,51 @@
130
140
  @return $value1 - $value2;
131
141
  }
132
142
 
143
+ @if type-of($value2) != number {
144
+ $value2: unquote("(") + $value2 + unquote(")");
145
+ }
146
+
133
147
  @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
134
148
  }
149
+
150
+ @function divide($dividend, $divisor, $precision: 10) {
151
+ $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);
152
+ $dividend: abs($dividend);
153
+ $divisor: abs($divisor);
154
+ @if $dividend == 0 {
155
+ @return 0;
156
+ }
157
+ @if $divisor == 0 {
158
+ @error "Cannot divide by 0";
159
+ }
160
+ $remainder: $dividend;
161
+ $result: 0;
162
+ $factor: 10;
163
+ @while ($remainder > 0 and $precision >= 0) {
164
+ $quotient: 0;
165
+ @while ($remainder >= $divisor) {
166
+ $remainder: $remainder - $divisor;
167
+ $quotient: $quotient + 1;
168
+ }
169
+ $result: $result * 10 + $quotient;
170
+ $factor: $factor * .1;
171
+ $remainder: $remainder * 10;
172
+ $precision: $precision - 1;
173
+ @if ($precision < 0 and $remainder >= $divisor * 5) {
174
+ $result: $result + 1;
175
+ }
176
+ }
177
+ $result: $result * $factor * $sign;
178
+ $dividend-unit: unit($dividend);
179
+ $divisor-unit: unit($divisor);
180
+ $unit-map: (
181
+ "px": 1px,
182
+ "rem": 1rem,
183
+ "em": 1em,
184
+ "%": 1%
185
+ );
186
+ @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {
187
+ $result: $result * map-get($unit-map, $dividend-unit);
188
+ }
189
+ @return $result;
190
+ }
@@ -4,11 +4,7 @@
4
4
 
5
5
  @if $enable-grid-classes {
6
6
  // Single container class with breakpoint max-widths
7
- .container {
8
- @include make-container();
9
- @include make-container-max-widths();
10
- }
11
-
7
+ .container,
12
8
  // 100% wide container at all breakpoints
13
9
  .container-fluid {
14
10
  @include make-container();
@@ -25,11 +21,19 @@
25
21
  max-width: $container-max-width;
26
22
  }
27
23
 
24
+ // Extend each breakpoint which is smaller or equal to the current breakpoint
25
+ $extend-breakpoint: true;
26
+
28
27
  @each $name, $width in $grid-breakpoints {
29
- @if ($container-max-width > $width or $breakpoint == $name) {
28
+ @if ($extend-breakpoint) {
30
29
  .container#{breakpoint-infix($name, $grid-breakpoints)} {
31
30
  @extend %responsive-container-#{$breakpoint};
32
31
  }
32
+
33
+ // Once the current breakpoint is reached, stop extending
34
+ @if ($breakpoint == $name) {
35
+ $extend-breakpoint: false;
36
+ }
33
37
  }
34
38
  }
35
39
  }
@@ -32,7 +32,7 @@
32
32
  }
33
33
 
34
34
  .figure-img {
35
- margin-bottom: $spacer / 2;
35
+ margin-bottom: $spacer * .5;
36
36
  line-height: 1;
37
37
  }
38
38
 
@@ -16,7 +16,8 @@
16
16
  > .custom-select,
17
17
  > .custom-file {
18
18
  position: relative; // For focus state's z-index
19
- flex: 1 1 0%;
19
+ flex: 1 1 auto;
20
+ width: 1%;
20
21
  min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
21
22
  margin-bottom: 0;
22
23
 
@@ -41,7 +42,6 @@
41
42
 
42
43
  > .form-control,
43
44
  > .custom-select {
44
- &:not(:last-child) { @include border-right-radius(0); }
45
45
  &:not(:first-child) { @include border-left-radius(0); }
46
46
  }
47
47
 
@@ -55,6 +55,24 @@
55
55
  &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
56
56
  &:not(:first-child) .custom-file-label { @include border-left-radius(0); }
57
57
  }
58
+
59
+ &:not(.has-validation) {
60
+ > .form-control:not(:last-child),
61
+ > .custom-select:not(:last-child),
62
+ > .custom-file:not(:last-child) .custom-file-label,
63
+ > .custom-file:not(:last-child) .custom-file-label::after {
64
+ @include border-right-radius(0);
65
+ }
66
+ }
67
+
68
+ &.has-validation {
69
+ > .form-control:nth-last-child(n + 3),
70
+ > .custom-select:nth-last-child(n + 3),
71
+ > .custom-file:nth-last-child(n + 3) .custom-file-label,
72
+ > .custom-file:nth-last-child(n + 3) .custom-file-label::after {
73
+ @include border-right-radius(0);
74
+ }
75
+ }
58
76
  }
59
77
 
60
78
 
@@ -174,8 +192,10 @@
174
192
 
175
193
  .input-group > .input-group-prepend > .btn,
176
194
  .input-group > .input-group-prepend > .input-group-text,
177
- .input-group > .input-group-append:not(:last-child) > .btn,
178
- .input-group > .input-group-append:not(:last-child) > .input-group-text,
195
+ .input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,
196
+ .input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,
197
+ .input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn,
198
+ .input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text,
179
199
  .input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
180
200
  .input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
181
201
  @include border-right-radius(0);
@@ -1,5 +1,5 @@
1
1
  .jumbotron {
2
- padding: $jumbotron-padding ($jumbotron-padding / 2);
2
+ padding: $jumbotron-padding ($jumbotron-padding * .5);
3
3
  margin-bottom: $jumbotron-padding;
4
4
  color: $jumbotron-color;
5
5
  background-color: $jumbotron-bg;
@@ -9,6 +9,7 @@
9
9
  // No need to set list-style: none; since .list-group-item is block level
10
10
  padding-left: 0; // reset padding because ul and ol
11
11
  margin-bottom: 0;
12
+ @include border-radius($list-group-border-radius);
12
13
  }
13
14
 
14
15
 
@@ -46,15 +47,16 @@
46
47
  display: block;
47
48
  padding: $list-group-item-padding-y $list-group-item-padding-x;
48
49
  color: $list-group-color;
50
+ text-decoration: if($link-decoration == none, null, none);
49
51
  background-color: $list-group-bg;
50
52
  border: $list-group-border-width solid $list-group-border-color;
51
53
 
52
54
  &:first-child {
53
- @include border-top-radius($list-group-border-radius);
55
+ @include border-top-radius(inherit);
54
56
  }
55
57
 
56
58
  &:last-child {
57
- @include border-bottom-radius($list-group-border-radius);
59
+ @include border-bottom-radius(inherit);
58
60
  }
59
61
 
60
62
  &.disabled,
@@ -94,7 +96,7 @@
94
96
  .list-group-horizontal#{$infix} {
95
97
  flex-direction: row;
96
98
 
97
- .list-group-item {
99
+ > .list-group-item {
98
100
  &:first-child {
99
101
  @include border-bottom-left-radius($list-group-border-radius);
100
102
  @include border-top-right-radius(0);
@@ -109,7 +111,7 @@
109
111
  margin-top: 0;
110
112
  }
111
113
 
112
- & + .list-group-item {
114
+ + .list-group-item {
113
115
  border-top-width: $list-group-border-width;
114
116
  border-left-width: 0;
115
117
 
@@ -130,18 +132,12 @@
130
132
  // useful within other components (e.g., cards).
131
133
 
132
134
  .list-group-flush {
133
- .list-group-item {
134
- border-right-width: 0;
135
- border-left-width: 0;
136
- @include border-radius(0);
135
+ @include border-radius(0);
137
136
 
138
- &:first-child {
139
- border-top-width: 0;
140
- }
141
- }
137
+ > .list-group-item {
138
+ border-width: 0 0 $list-group-border-width;
142
139
 
143
- &:last-child {
144
- .list-group-item:last-child {
140
+ &:last-child {
145
141
  border-bottom-width: 0;
146
142
  }
147
143
  }
@@ -83,6 +83,7 @@
83
83
  &::before {
84
84
  display: block; // IE10
85
85
  height: subtract(100vh, $modal-dialog-margin * 2);
86
+ height: min-content; // Reset height to 0 except on IE
86
87
  content: "";
87
88
  }
88
89
 
@@ -174,16 +175,15 @@
174
175
  flex-wrap: wrap;
175
176
  align-items: center; // vertically center
176
177
  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
177
- padding: $modal-inner-padding - $modal-footer-margin-between / 2;
178
+ padding: $modal-inner-padding - $modal-footer-margin-between * .5;
178
179
  border-top: $modal-footer-border-width solid $modal-footer-border-color;
179
180
  @include border-bottom-radius($modal-content-inner-border-radius);
180
181
 
181
182
  // Place margin between footer elements
182
183
  // This solution is far from ideal because of the universal selector usage,
183
184
  // but is needed to fix https://github.com/twbs/bootstrap/issues/24800
184
- // stylelint-disable-next-line selector-max-universal
185
185
  > * {
186
- margin: $modal-footer-margin-between / 2;
186
+ margin: $modal-footer-margin-between * .5;
187
187
  }
188
188
  }
189
189
 
@@ -217,6 +217,7 @@
217
217
 
218
218
  &::before {
219
219
  height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
220
+ height: min-content;
220
221
  }
221
222
  }
222
223
 
@@ -14,6 +14,7 @@
14
14
  .nav-link {
15
15
  display: block;
16
16
  padding: $nav-link-padding-y $nav-link-padding-x;
17
+ text-decoration: if($link-decoration == none, null, none);
17
18
 
18
19
  @include hover-focus() {
19
20
  text-decoration: none;
@@ -34,15 +35,15 @@
34
35
  .nav-tabs {
35
36
  border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
36
37
 
37
- .nav-item {
38
- margin-bottom: -$nav-tabs-border-width;
39
- }
40
-
41
38
  .nav-link {
39
+ margin-bottom: -$nav-tabs-border-width;
40
+ background-color: transparent;
42
41
  border: $nav-tabs-border-width solid transparent;
43
42
  @include border-top-radius($nav-tabs-border-radius);
44
43
 
45
44
  @include hover-focus() {
45
+ // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link
46
+ isolation: isolate;
46
47
  border-color: $nav-tabs-link-hover-border-color;
47
48
  }
48
49
 
@@ -75,6 +76,8 @@
75
76
 
76
77
  .nav-pills {
77
78
  .nav-link {
79
+ background: none;
80
+ border: 0;
78
81
  @include border-radius($nav-pills-border-radius);
79
82
  }
80
83
 
@@ -91,6 +94,7 @@
91
94
  //
92
95
 
93
96
  .nav-fill {
97
+ > .nav-link,
94
98
  .nav-item {
95
99
  flex: 1 1 auto;
96
100
  text-align: center;
@@ -98,6 +102,7 @@
98
102
  }
99
103
 
100
104
  .nav-justified {
105
+ > .nav-link,
101
106
  .nav-item {
102
107
  flex-basis: 0;
103
108
  flex-grow: 1;
@@ -136,8 +136,12 @@
136
136
  height: 1.5em;
137
137
  vertical-align: middle;
138
138
  content: "";
139
- background: no-repeat center center;
140
- background-size: 100% 100%;
139
+ background: 50% / 100% 100% no-repeat;
140
+ }
141
+
142
+ .navbar-nav-scroll {
143
+ max-height: $navbar-nav-scroll-max-height;
144
+ overflow-y: auto;
141
145
  }
142
146
 
143
147
  // Generate series of `.navbar-expand-*` responsive classes for configuring
@@ -199,6 +203,10 @@
199
203
  }
200
204
  }
201
205
 
206
+ .navbar-nav-scroll {
207
+ overflow: visible;
208
+ }
209
+
202
210
  .navbar-collapse {
203
211
  display: flex !important; // stylelint-disable-line declaration-no-important
204
212
 
@@ -11,6 +11,7 @@
11
11
  margin-left: -$pagination-border-width;
12
12
  line-height: $pagination-line-height;
13
13
  color: $pagination-color;
14
+ text-decoration: if($link-decoration == none, null, none);
14
15
  background-color: $pagination-bg;
15
16
  border: $pagination-border-width solid $pagination-border-color;
16
17
 
@@ -65,9 +66,9 @@
65
66
  //
66
67
 
67
68
  .pagination-lg {
68
- @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
69
+ @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $pagination-border-radius-lg);
69
70
  }
70
71
 
71
72
  .pagination-sm {
72
- @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
73
+ @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $pagination-border-radius-sm);
73
74
  }