bootstrap 4.3.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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +15 -1
  3. data/CHANGELOG.md +4 -12
  4. data/README.md +7 -1
  5. data/Rakefile +16 -4
  6. data/assets/javascripts/bootstrap/alert.js +43 -55
  7. data/assets/javascripts/bootstrap/button.js +112 -70
  8. data/assets/javascripts/bootstrap/carousel.js +164 -189
  9. data/assets/javascripts/bootstrap/collapse.js +98 -129
  10. data/assets/javascripts/bootstrap/dropdown.js +165 -200
  11. data/assets/javascripts/bootstrap/modal.js +218 -205
  12. data/assets/javascripts/bootstrap/popover.js +63 -79
  13. data/assets/javascripts/bootstrap/scrollspy.js +82 -119
  14. data/assets/javascripts/bootstrap/tab.js +79 -85
  15. data/assets/javascripts/bootstrap/toast.js +100 -115
  16. data/assets/javascripts/bootstrap/tooltip.js +207 -225
  17. data/assets/javascripts/bootstrap/util.js +41 -23
  18. data/assets/javascripts/bootstrap.js +1235 -1314
  19. data/assets/javascripts/bootstrap.min.js +4 -4
  20. data/assets/stylesheets/_bootstrap-grid.scss +5 -4
  21. data/assets/stylesheets/_bootstrap-reboot.scss +4 -4
  22. data/assets/stylesheets/_bootstrap.scss +4 -4
  23. data/assets/stylesheets/bootstrap/_alert.scss +1 -0
  24. data/assets/stylesheets/bootstrap/_badge.scss +1 -1
  25. data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -2
  26. data/assets/stylesheets/bootstrap/_button-group.scss +1 -1
  27. data/assets/stylesheets/bootstrap/_buttons.scss +13 -8
  28. data/assets/stylesheets/bootstrap/_card.scss +47 -50
  29. data/assets/stylesheets/bootstrap/_carousel.scss +12 -9
  30. data/assets/stylesheets/bootstrap/_close.scss +2 -3
  31. data/assets/stylesheets/bootstrap/_code.scss +1 -1
  32. data/assets/stylesheets/bootstrap/_custom-forms.scss +43 -24
  33. data/assets/stylesheets/bootstrap/_dropdown.scss +7 -6
  34. data/assets/stylesheets/bootstrap/_forms.scss +30 -13
  35. data/assets/stylesheets/bootstrap/_functions.scss +110 -6
  36. data/assets/stylesheets/bootstrap/_grid.scss +32 -11
  37. data/assets/stylesheets/bootstrap/_images.scss +3 -3
  38. data/assets/stylesheets/bootstrap/_input-group.scss +23 -5
  39. data/assets/stylesheets/bootstrap/_jumbotron.scss +1 -1
  40. data/assets/stylesheets/bootstrap/_list-group.scss +36 -31
  41. data/assets/stylesheets/bootstrap/_mixins.scss +3 -3
  42. data/assets/stylesheets/bootstrap/_modal.scss +26 -15
  43. data/assets/stylesheets/bootstrap/_nav.scss +12 -7
  44. data/assets/stylesheets/bootstrap/_navbar.scss +55 -17
  45. data/assets/stylesheets/bootstrap/_pagination.scss +5 -4
  46. data/assets/stylesheets/bootstrap/_popover.scss +17 -18
  47. data/assets/stylesheets/bootstrap/_print.scss +1 -10
  48. data/assets/stylesheets/bootstrap/_progress.scss +7 -3
  49. data/assets/stylesheets/bootstrap/_reboot.scss +39 -38
  50. data/assets/stylesheets/bootstrap/_spinners.scss +18 -8
  51. data/assets/stylesheets/bootstrap/_tables.scss +3 -3
  52. data/assets/stylesheets/bootstrap/_toasts.scss +4 -2
  53. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -4
  54. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  55. data/assets/stylesheets/bootstrap/_type.scss +3 -3
  56. data/assets/stylesheets/bootstrap/_utilities.scss +2 -1
  57. data/assets/stylesheets/bootstrap/_variables.scss +71 -45
  58. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +5 -3
  59. data/assets/stylesheets/bootstrap/mixins/_badge.scss +1 -1
  60. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +27 -14
  61. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +11 -8
  62. data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -8
  63. data/assets/stylesheets/bootstrap/mixins/_float.scss +3 -3
  64. data/assets/stylesheets/bootstrap/mixins/_forms.scss +52 -49
  65. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +31 -17
  66. data/assets/stylesheets/bootstrap/mixins/_grid.scss +32 -14
  67. data/assets/stylesheets/bootstrap/mixins/_hover.scss +4 -4
  68. data/assets/stylesheets/bootstrap/mixins/_image.scss +2 -2
  69. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +1 -1
  70. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  71. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +2 -1
  72. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  73. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +5 -4
  74. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +1 -1
  75. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +3 -2
  76. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  77. data/assets/stylesheets/bootstrap/utilities/_background.scss +2 -2
  78. data/assets/stylesheets/bootstrap/utilities/_borders.scss +1 -1
  79. data/assets/stylesheets/bootstrap/utilities/_embed.scss +1 -1
  80. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +5 -0
  81. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +1 -1
  82. data/assets/stylesheets/bootstrap/utilities/_text.scss +4 -4
  83. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +126 -102
  84. data/bootstrap.gemspec +2 -4
  85. data/lib/bootstrap/engine.rb +17 -1
  86. data/lib/bootstrap/version.rb +2 -2
  87. data/tasks/updater/js.rb +18 -6
  88. data/tasks/updater/network.rb +8 -2
  89. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  90. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  91. data/test/gemfiles/rails_6_0.gemfile +7 -0
  92. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  93. data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
  94. data/test/support/dummy_rails_integration.rb +3 -1
  95. data/test/test_helper.rb +18 -13
  96. metadata +17 -21
@@ -31,7 +31,7 @@
31
31
  }
32
32
 
33
33
  // Customize the `:focus` state to imitate native WebKit styles.
34
- @include form-control-focus();
34
+ @include form-control-focus($ignore-warning: true);
35
35
 
36
36
  // Placeholder
37
37
  &::placeholder {
@@ -53,7 +53,22 @@
53
53
  }
54
54
  }
55
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
+
56
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
+
57
72
  &:focus::-ms-value {
58
73
  // Suppress the nested default white text on blue background highlight given to
59
74
  // the selected option text when the (still closed) <select> receives focus
@@ -80,23 +95,23 @@ select.form-control {
80
95
  // For use with horizontal and inline forms, when you need the label (or legend)
81
96
  // text to align with the form controls.
82
97
  .col-form-label {
83
- padding-top: calc(#{$input-padding-y} + #{$input-border-width});
84
- padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
98
+ padding-top: add($input-padding-y, $input-border-width);
99
+ padding-bottom: add($input-padding-y, $input-border-width);
85
100
  margin-bottom: 0; // Override the `<label>/<legend>` default
86
101
  @include font-size(inherit); // Override the `<legend>` default
87
102
  line-height: $input-line-height;
88
103
  }
89
104
 
90
105
  .col-form-label-lg {
91
- padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
92
- padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
106
+ padding-top: add($input-padding-y-lg, $input-border-width);
107
+ padding-bottom: add($input-padding-y-lg, $input-border-width);
93
108
  @include font-size($input-font-size-lg);
94
109
  line-height: $input-line-height-lg;
95
110
  }
96
111
 
97
112
  .col-form-label-sm {
98
- padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
99
- padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
113
+ padding-top: add($input-padding-y-sm, $input-border-width);
114
+ padding-bottom: add($input-padding-y-sm, $input-border-width);
100
115
  @include font-size($input-font-size-sm);
101
116
  line-height: $input-line-height-sm;
102
117
  }
@@ -110,9 +125,9 @@ select.form-control {
110
125
  .form-control-plaintext {
111
126
  display: block;
112
127
  width: 100%;
113
- padding-top: $input-padding-y;
114
- padding-bottom: $input-padding-y;
128
+ padding: $input-padding-y 0;
115
129
  margin-bottom: 0; // match inputs if this class comes on inputs with default margins
130
+ @include font-size($input-font-size);
116
131
  line-height: $input-line-height;
117
132
  color: $input-plaintext-color;
118
133
  background-color: transparent;
@@ -184,13 +199,13 @@ textarea.form-control {
184
199
  .form-row {
185
200
  display: flex;
186
201
  flex-wrap: wrap;
187
- margin-right: -$form-grid-gutter-width / 2;
188
- margin-left: -$form-grid-gutter-width / 2;
202
+ margin-right: -$form-grid-gutter-width * .5;
203
+ margin-left: -$form-grid-gutter-width * .5;
189
204
 
190
205
  > .col,
191
206
  > [class*="col-"] {
192
- padding-right: $form-grid-gutter-width / 2;
193
- padding-left: $form-grid-gutter-width / 2;
207
+ padding-right: $form-grid-gutter-width * .5;
208
+ padding-left: $form-grid-gutter-width * .5;
194
209
  }
195
210
  }
196
211
 
@@ -210,6 +225,8 @@ textarea.form-control {
210
225
  margin-top: $form-check-input-margin-y;
211
226
  margin-left: -$form-check-input-gutter;
212
227
 
228
+ // Use [disabled] and :disabled for workaround https://github.com/twbs/bootstrap/issues/28247
229
+ &[disabled] ~ .form-check-label,
213
230
  &:disabled ~ .form-check-label {
214
231
  color: $text-muted;
215
232
  }
@@ -8,7 +8,7 @@
8
8
  $prev-key: null;
9
9
  $prev-num: null;
10
10
  @each $key, $num in $map {
11
- @if $prev-num == null or unit($num) == "%" {
11
+ @if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
12
12
  // Do nothing
13
13
  } @else if not comparable($prev-num, $num) {
14
14
  @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
@@ -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
 
@@ -48,13 +50,32 @@
48
50
  @return $string;
49
51
  }
50
52
 
53
+ // See https://codepen.io/kevinweber/pen/dXWoRw
54
+ //
55
+ // Requires the use of quotes around data URIs.
56
+
57
+ @function escape-svg($string) {
58
+ @if str-index($string, "data:image/svg+xml") {
59
+ @each $char, $encoded in $escaped-characters {
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
+ }
66
+ }
67
+ }
68
+
69
+ @return $string;
70
+ }
71
+
51
72
  // Color contrast
52
73
  @function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
53
74
  $r: red($color);
54
75
  $g: green($color);
55
76
  $b: blue($color);
56
77
 
57
- $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
78
+ $yiq: (($r * 299) + ($g * 587) + ($b * 114)) * .001;
58
79
 
59
80
  @if ($yiq >= $yiq-contrasted-threshold) {
60
81
  @return $dark;
@@ -84,3 +105,86 @@
84
105
 
85
106
  @return mix($color-base, $color, $level * $theme-color-interval);
86
107
  }
108
+
109
+ // Return valid calc
110
+ @function add($value1, $value2, $return-calc: true) {
111
+ @if $value1 == null {
112
+ @return $value2;
113
+ }
114
+
115
+ @if $value2 == null {
116
+ @return $value1;
117
+ }
118
+
119
+ @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
120
+ @return $value1 + $value2;
121
+ }
122
+
123
+ @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2);
124
+ }
125
+
126
+ @function subtract($value1, $value2, $return-calc: true) {
127
+ @if $value1 == null and $value2 == null {
128
+ @return null;
129
+ }
130
+
131
+ @if $value1 == null {
132
+ @return -$value2;
133
+ }
134
+
135
+ @if $value2 == null {
136
+ @return $value1;
137
+ }
138
+
139
+ @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
140
+ @return $value1 - $value2;
141
+ }
142
+
143
+ @if type-of($value2) != number {
144
+ $value2: unquote("(") + $value2 + unquote(")");
145
+ }
146
+
147
+ @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
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
+ }
@@ -3,26 +3,47 @@
3
3
  // Set the container width, and override it for fixed navbars in media queries.
4
4
 
5
5
  @if $enable-grid-classes {
6
- .container {
6
+ // Single container class with breakpoint max-widths
7
+ .container,
8
+ // 100% wide container at all breakpoints
9
+ .container-fluid {
7
10
  @include make-container();
8
- @include make-container-max-widths();
9
11
  }
10
- }
11
12
 
12
- // Fluid container
13
- //
14
- // Utilizes the mixin meant for fixed width containers, but with 100% width for
15
- // fluid, full width layouts.
13
+ // Responsive containers that are 100% wide until a breakpoint
14
+ @each $breakpoint, $container-max-width in $container-max-widths {
15
+ .container-#{$breakpoint} {
16
+ @extend .container-fluid;
17
+ }
16
18
 
17
- @if $enable-grid-classes {
18
- .container-fluid {
19
- @include make-container();
19
+ @include media-breakpoint-up($breakpoint, $grid-breakpoints) {
20
+ %responsive-container-#{$breakpoint} {
21
+ max-width: $container-max-width;
22
+ }
23
+
24
+ // Extend each breakpoint which is smaller or equal to the current breakpoint
25
+ $extend-breakpoint: true;
26
+
27
+ @each $name, $width in $grid-breakpoints {
28
+ @if ($extend-breakpoint) {
29
+ .container#{breakpoint-infix($name, $grid-breakpoints)} {
30
+ @extend %responsive-container-#{$breakpoint};
31
+ }
32
+
33
+ // Once the current breakpoint is reached, stop extending
34
+ @if ($breakpoint == $name) {
35
+ $extend-breakpoint: false;
36
+ }
37
+ }
38
+ }
39
+ }
20
40
  }
21
41
  }
22
42
 
43
+
23
44
  // Row
24
45
  //
25
- // Rows contain and clear the floats of your columns.
46
+ // Rows contain your columns.
26
47
 
27
48
  @if $enable-grid-classes {
28
49
  .row {
@@ -6,7 +6,7 @@
6
6
  // which weren't expecting the images within themselves to be involuntarily resized.
7
7
  // See also https://github.com/twbs/bootstrap/issues/18178
8
8
  .img-fluid {
9
- @include img-fluid;
9
+ @include img-fluid();
10
10
  }
11
11
 
12
12
 
@@ -19,7 +19,7 @@
19
19
  @include box-shadow($thumbnail-box-shadow);
20
20
 
21
21
  // Keep them at most 100% wide
22
- @include img-fluid;
22
+ @include img-fluid();
23
23
  }
24
24
 
25
25
  //
@@ -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
 
@@ -17,9 +17,8 @@
17
17
  > .custom-file {
18
18
  position: relative; // For focus state's z-index
19
19
  flex: 1 1 auto;
20
- // Add width 1% and flex-basis auto to ensure that button will not wrap out
21
- // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.
22
20
  width: 1%;
21
+ min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
23
22
  margin-bottom: 0;
24
23
 
25
24
  + .form-control,
@@ -43,7 +42,6 @@
43
42
 
44
43
  > .form-control,
45
44
  > .custom-select {
46
- &:not(:last-child) { @include border-right-radius(0); }
47
45
  &:not(:first-child) { @include border-left-radius(0); }
48
46
  }
49
47
 
@@ -57,6 +55,24 @@
57
55
  &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
58
56
  &:not(:first-child) .custom-file-label { @include border-left-radius(0); }
59
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
+ }
60
76
  }
61
77
 
62
78
 
@@ -176,8 +192,10 @@
176
192
 
177
193
  .input-group > .input-group-prepend > .btn,
178
194
  .input-group > .input-group-prepend > .input-group-text,
179
- .input-group > .input-group-append:not(:last-child) > .btn,
180
- .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,
181
199
  .input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
182
200
  .input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
183
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
 
@@ -23,7 +24,7 @@
23
24
  text-align: inherit; // For `<button>`s (anchors inherit)
24
25
 
25
26
  // Hover state
26
- @include hover-focus {
27
+ @include hover-focus() {
27
28
  z-index: 1; // Place hover/focus items above their siblings for proper border styling
28
29
  color: $list-group-action-hover-color;
29
30
  text-decoration: none;
@@ -45,19 +46,17 @@
45
46
  position: relative;
46
47
  display: block;
47
48
  padding: $list-group-item-padding-y $list-group-item-padding-x;
48
- // Place the border on the list items and negative margin up for better styling
49
- margin-bottom: -$list-group-border-width;
50
49
  color: $list-group-color;
50
+ text-decoration: if($link-decoration == none, null, none);
51
51
  background-color: $list-group-bg;
52
52
  border: $list-group-border-width solid $list-group-border-color;
53
53
 
54
54
  &:first-child {
55
- @include border-top-radius($list-group-border-radius);
55
+ @include border-top-radius(inherit);
56
56
  }
57
57
 
58
58
  &:last-child {
59
- margin-bottom: 0;
60
- @include border-bottom-radius($list-group-border-radius);
59
+ @include border-bottom-radius(inherit);
61
60
  }
62
61
 
63
62
  &.disabled,
@@ -74,6 +73,15 @@
74
73
  background-color: $list-group-active-bg;
75
74
  border-color: $list-group-active-border-color;
76
75
  }
76
+
77
+ & + & {
78
+ border-top-width: 0;
79
+
80
+ &.active {
81
+ margin-top: -$list-group-border-width;
82
+ border-top-width: $list-group-border-width;
83
+ }
84
+ }
77
85
  }
78
86
 
79
87
 
@@ -88,20 +96,30 @@
88
96
  .list-group-horizontal#{$infix} {
89
97
  flex-direction: row;
90
98
 
91
- .list-group-item {
92
- margin-right: -$list-group-border-width;
93
- margin-bottom: 0;
94
-
99
+ > .list-group-item {
95
100
  &:first-child {
96
- @include border-left-radius($list-group-border-radius);
101
+ @include border-bottom-left-radius($list-group-border-radius);
97
102
  @include border-top-right-radius(0);
98
103
  }
99
104
 
100
105
  &:last-child {
101
- margin-right: 0;
102
- @include border-right-radius($list-group-border-radius);
106
+ @include border-top-right-radius($list-group-border-radius);
103
107
  @include border-bottom-left-radius(0);
104
108
  }
109
+
110
+ &.active {
111
+ margin-top: 0;
112
+ }
113
+
114
+ + .list-group-item {
115
+ border-top-width: $list-group-border-width;
116
+ border-left-width: 0;
117
+
118
+ &.active {
119
+ margin-left: -$list-group-border-width;
120
+ border-left-width: $list-group-border-width;
121
+ }
122
+ }
105
123
  }
106
124
  }
107
125
  }
@@ -114,26 +132,13 @@
114
132
  // useful within other components (e.g., cards).
115
133
 
116
134
  .list-group-flush {
117
- .list-group-item {
118
- border-right: 0;
119
- border-left: 0;
120
- @include border-radius(0);
135
+ @include border-radius(0);
121
136
 
122
- &:last-child {
123
- margin-bottom: -$list-group-border-width;
124
- }
125
- }
137
+ > .list-group-item {
138
+ border-width: 0 0 $list-group-border-width;
126
139
 
127
- &:first-child {
128
- .list-group-item:first-child {
129
- border-top: 0;
130
- }
131
- }
132
-
133
- &:last-child {
134
- .list-group-item:last-child {
135
- margin-bottom: 0;
136
- border-bottom: 0;
140
+ &:last-child {
141
+ border-bottom-width: 0;
137
142
  }
138
143
  }
139
144
  }
@@ -22,7 +22,7 @@
22
22
  @import "mixins/text-truncate";
23
23
  @import "mixins/visibility";
24
24
 
25
- // // Components
25
+ // Components
26
26
  @import "mixins/alert";
27
27
  @import "mixins/buttons";
28
28
  @import "mixins/caret";
@@ -33,14 +33,14 @@
33
33
  @import "mixins/forms";
34
34
  @import "mixins/table-row";
35
35
 
36
- // // Skins
36
+ // Skins
37
37
  @import "mixins/background-variant";
38
38
  @import "mixins/border-radius";
39
39
  @import "mixins/box-shadow";
40
40
  @import "mixins/gradients";
41
41
  @import "mixins/transition";
42
42
 
43
- // // Layout
43
+ // Layout
44
44
  @import "mixins/clearfix";
45
45
  @import "mixins/grid-framework";
46
46
  @import "mixins/grid";
@@ -48,14 +48,19 @@
48
48
  .modal.show & {
49
49
  transform: $modal-show-transform;
50
50
  }
51
+
52
+ // When trying to close, animate focus to scale
53
+ .modal.modal-static & {
54
+ transform: $modal-scale-transform;
55
+ }
51
56
  }
52
57
 
53
58
  .modal-dialog-scrollable {
54
59
  display: flex; // IE10/11
55
- max-height: calc(100% - #{$modal-dialog-margin * 2});
60
+ max-height: subtract(100%, $modal-dialog-margin * 2);
56
61
 
57
62
  .modal-content {
58
- max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11
63
+ max-height: subtract(100vh, $modal-dialog-margin * 2); // IE10/11
59
64
  overflow: hidden;
60
65
  }
61
66
 
@@ -72,12 +77,13 @@
72
77
  .modal-dialog-centered {
73
78
  display: flex;
74
79
  align-items: center;
75
- min-height: calc(100% - #{$modal-dialog-margin * 2});
80
+ min-height: subtract(100%, $modal-dialog-margin * 2);
76
81
 
77
82
  // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)
78
83
  &::before {
79
84
  display: block; // IE10
80
- height: calc(100vh - #{$modal-dialog-margin * 2});
85
+ height: subtract(100vh, $modal-dialog-margin * 2);
86
+ height: min-content; // Reset height to 0 except on IE
81
87
  content: "";
82
88
  }
83
89
 
@@ -138,7 +144,7 @@
138
144
  justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
139
145
  padding: $modal-header-padding;
140
146
  border-bottom: $modal-header-border-width solid $modal-header-border-color;
141
- @include border-top-radius($modal-content-border-radius);
147
+ @include border-top-radius($modal-content-inner-border-radius);
142
148
 
143
149
  .close {
144
150
  padding: $modal-header-padding;
@@ -158,7 +164,7 @@
158
164
  .modal-body {
159
165
  position: relative;
160
166
  // Enable `flex-grow: 1` so that the body take up as much space as possible
161
- // when should there be a fixed height on `.modal-dialog`.
167
+ // when there should be a fixed height on `.modal-dialog`.
162
168
  flex: 1 1 auto;
163
169
  padding: $modal-inner-padding;
164
170
  }
@@ -166,15 +172,19 @@
166
172
  // Footer (for actions)
167
173
  .modal-footer {
168
174
  display: flex;
175
+ flex-wrap: wrap;
169
176
  align-items: center; // vertically center
170
177
  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
171
- padding: $modal-inner-padding;
178
+ padding: $modal-inner-padding - $modal-footer-margin-between * .5;
172
179
  border-top: $modal-footer-border-width solid $modal-footer-border-color;
173
- @include border-bottom-radius($modal-content-border-radius);
180
+ @include border-bottom-radius($modal-content-inner-border-radius);
174
181
 
175
- // Easily place margin between footer elements
176
- > :not(:first-child) { margin-left: .25rem; }
177
- > :not(:last-child) { margin-right: .25rem; }
182
+ // Place margin between footer elements
183
+ // This solution is far from ideal because of the universal selector usage,
184
+ // but is needed to fix https://github.com/twbs/bootstrap/issues/24800
185
+ > * {
186
+ margin: $modal-footer-margin-between * .5;
187
+ }
178
188
  }
179
189
 
180
190
  // Measure scrollbar width for padding body during modal show/hide
@@ -195,18 +205,19 @@
195
205
  }
196
206
 
197
207
  .modal-dialog-scrollable {
198
- max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});
208
+ max-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
199
209
 
200
210
  .modal-content {
201
- max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});
211
+ max-height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
202
212
  }
203
213
  }
204
214
 
205
215
  .modal-dialog-centered {
206
- min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});
216
+ min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
207
217
 
208
218
  &::before {
209
- height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});
219
+ height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);
220
+ height: min-content;
210
221
  }
211
222
  }
212
223