bootstrap 4.3.1 → 5.3.0

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 (179) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +55 -0
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +28 -5
  5. data/assets/javascripts/bootstrap/alert.js +54 -163
  6. data/assets/javascripts/bootstrap/base-component.js +83 -0
  7. data/assets/javascripts/bootstrap/button.js +44 -152
  8. data/assets/javascripts/bootstrap/carousel.js +289 -569
  9. data/assets/javascripts/bootstrap/collapse.js +170 -349
  10. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  12. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  13. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  14. data/assets/javascripts/bootstrap/dropdown.js +303 -496
  15. data/assets/javascripts/bootstrap/modal.js +229 -559
  16. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  17. data/assets/javascripts/bootstrap/popover.js +61 -226
  18. data/assets/javascripts/bootstrap/scrollspy.js +217 -317
  19. data/assets/javascripts/bootstrap/tab.js +220 -212
  20. data/assets/javascripts/bootstrap/toast.js +145 -229
  21. data/assets/javascripts/bootstrap/tooltip.js +421 -782
  22. data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
  23. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  24. data/assets/javascripts/bootstrap/util/config.js +67 -0
  25. data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
  26. data/assets/javascripts/bootstrap/util/index.js +281 -0
  27. data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
  28. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  29. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  30. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  31. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  32. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  33. data/assets/javascripts/bootstrap-sprockets.js +23 -7
  34. data/assets/javascripts/bootstrap.js +3690 -3639
  35. data/assets/javascripts/bootstrap.min.js +4 -4
  36. data/assets/stylesheets/_bootstrap-grid.scss +53 -20
  37. data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
  38. data/assets/stylesheets/_bootstrap.scss +21 -13
  39. data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
  40. data/assets/stylesheets/bootstrap/_alert.scss +32 -15
  41. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  42. data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -24
  43. data/assets/stylesheets/bootstrap/_button-group.scss +27 -48
  44. data/assets/stylesheets/bootstrap/_buttons.scss +139 -69
  45. data/assets/stylesheets/bootstrap/_card.scss +91 -141
  46. data/assets/stylesheets/bootstrap/_carousel.scss +86 -39
  47. data/assets/stylesheets/bootstrap/_close.scss +51 -29
  48. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  49. data/assets/stylesheets/bootstrap/_dropdown.scss +131 -72
  50. data/assets/stylesheets/bootstrap/_forms.scss +9 -330
  51. data/assets/stylesheets/bootstrap/_functions.scss +244 -28
  52. data/assets/stylesheets/bootstrap/_grid.scss +18 -31
  53. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  54. data/assets/stylesheets/bootstrap/_images.scss +3 -3
  55. data/assets/stylesheets/bootstrap/_list-group.scss +101 -53
  56. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  57. data/assets/stylesheets/bootstrap/_mixins.scss +13 -18
  58. data/assets/stylesheets/bootstrap/_modal.scss +120 -112
  59. data/assets/stylesheets/bootstrap/_nav.scss +113 -24
  60. data/assets/stylesheets/bootstrap/_navbar.scss +145 -150
  61. data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
  62. data/assets/stylesheets/bootstrap/_pagination.scss +74 -38
  63. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  64. data/assets/stylesheets/bootstrap/_popover.scss +99 -74
  65. data/assets/stylesheets/bootstrap/_progress.scss +40 -15
  66. data/assets/stylesheets/bootstrap/_reboot.scss +342 -215
  67. data/assets/stylesheets/bootstrap/_root.scss +174 -9
  68. data/assets/stylesheets/bootstrap/_spinners.scss +52 -22
  69. data/assets/stylesheets/bootstrap/_tables.scss +101 -115
  70. data/assets/stylesheets/bootstrap/_toasts.scss +54 -25
  71. data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
  72. data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
  73. data/assets/stylesheets/bootstrap/_type.scss +42 -61
  74. data/assets/stylesheets/bootstrap/_utilities.scss +806 -17
  75. data/assets/stylesheets/bootstrap/_variables-dark.scss +85 -0
  76. data/assets/stylesheets/bootstrap/_variables.scss +1235 -615
  77. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +19 -0
  78. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +94 -0
  79. data/assets/stylesheets/bootstrap/forms/_form-check.scss +188 -0
  80. data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
  81. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  82. data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
  83. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  84. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  85. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  86. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  87. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +8 -0
  88. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
  89. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  90. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  91. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  92. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  93. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  94. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  95. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  96. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  97. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  98. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
  99. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  100. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  101. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  102. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  103. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
  104. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -97
  105. data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
  106. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  107. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  108. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  109. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  110. data/assets/stylesheets/bootstrap/mixins/_forms.scss +77 -116
  111. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  112. data/assets/stylesheets/bootstrap/mixins/_grid.scss +133 -33
  113. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  114. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
  115. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
  116. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  117. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  118. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  119. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  120. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
  121. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  122. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +276 -132
  123. data/bootstrap.gemspec +4 -6
  124. data/lib/bootstrap/version.rb +2 -2
  125. data/tasks/updater/js.rb +31 -7
  126. data/tasks/updater/network.rb +10 -4
  127. data/tasks/updater/scss.rb +1 -1
  128. data/tasks/updater.rb +2 -2
  129. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  130. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  131. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  132. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  133. data/test/dummy_rails/app/views/pages/root.html +89 -0
  134. data/test/dummy_rails/config/application.rb +0 -3
  135. data/test/gemfiles/rails_5_2.gemfile +8 -0
  136. data/test/gemfiles/rails_6_0.gemfile +7 -0
  137. data/test/gemfiles/rails_6_1.gemfile +7 -0
  138. data/test/gemfiles/rails_7_0.gemfile +7 -0
  139. data/test/support/dummy_rails_integration.rb +3 -1
  140. data/test/test_helper.rb +18 -12
  141. metadata +86 -84
  142. data/.travis.yml +0 -17
  143. data/assets/javascripts/bootstrap/util.js +0 -171
  144. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  145. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -507
  146. data/assets/stylesheets/bootstrap/_input-group.scss +0 -193
  147. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  148. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  149. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  150. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  151. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  152. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  153. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -66
  154. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  155. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  156. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  157. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  158. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  159. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -16
  160. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  161. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  162. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  163. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  164. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  165. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  166. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  167. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  168. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  169. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  170. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  171. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  172. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  173. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  174. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  175. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  176. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  177. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  178. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  179. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,54 +1,116 @@
1
- // stylelint-disable selector-no-qualifying-type
2
-
3
1
  //
4
2
  // Base styles
5
3
  //
6
4
 
7
5
  .btn {
6
+ // scss-docs-start btn-css-vars
7
+ --#{$prefix}btn-padding-x: #{$btn-padding-x};
8
+ --#{$prefix}btn-padding-y: #{$btn-padding-y};
9
+ --#{$prefix}btn-font-family: #{$btn-font-family};
10
+ @include rfs($btn-font-size, --#{$prefix}btn-font-size);
11
+ --#{$prefix}btn-font-weight: #{$btn-font-weight};
12
+ --#{$prefix}btn-line-height: #{$btn-line-height};
13
+ --#{$prefix}btn-color: #{$btn-color};
14
+ --#{$prefix}btn-bg: transparent;
15
+ --#{$prefix}btn-border-width: #{$btn-border-width};
16
+ --#{$prefix}btn-border-color: transparent;
17
+ --#{$prefix}btn-border-radius: #{$btn-border-radius};
18
+ --#{$prefix}btn-hover-border-color: transparent;
19
+ --#{$prefix}btn-box-shadow: #{$btn-box-shadow};
20
+ --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};
21
+ --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);
22
+ // scss-docs-end btn-css-vars
23
+
8
24
  display: inline-block;
9
- font-family: $btn-font-family;
10
- font-weight: $btn-font-weight;
11
- color: $body-color;
25
+ padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x);
26
+ font-family: var(--#{$prefix}btn-font-family);
27
+ @include font-size(var(--#{$prefix}btn-font-size));
28
+ font-weight: var(--#{$prefix}btn-font-weight);
29
+ line-height: var(--#{$prefix}btn-line-height);
30
+ color: var(--#{$prefix}btn-color);
12
31
  text-align: center;
32
+ text-decoration: if($link-decoration == none, null, none);
33
+ white-space: $btn-white-space;
13
34
  vertical-align: middle;
35
+ cursor: if($enable-button-pointers, pointer, null);
14
36
  user-select: none;
15
- background-color: transparent;
16
- border: $btn-border-width solid transparent;
17
- @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
37
+ border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color);
38
+ @include border-radius(var(--#{$prefix}btn-border-radius));
39
+ @include gradient-bg(var(--#{$prefix}btn-bg));
40
+ @include box-shadow(var(--#{$prefix}btn-box-shadow));
18
41
  @include transition($btn-transition);
19
42
 
20
- @include hover {
21
- color: $body-color;
22
- text-decoration: none;
43
+ &:hover {
44
+ color: var(--#{$prefix}btn-hover-color);
45
+ text-decoration: if($link-hover-decoration == underline, none, null);
46
+ background-color: var(--#{$prefix}btn-hover-bg);
47
+ border-color: var(--#{$prefix}btn-hover-border-color);
23
48
  }
24
49
 
25
- &:focus,
26
- &.focus {
27
- outline: 0;
28
- box-shadow: $btn-focus-box-shadow;
50
+ .btn-check + &:hover {
51
+ // override for the checkbox/radio buttons
52
+ color: var(--#{$prefix}btn-color);
53
+ background-color: var(--#{$prefix}btn-bg);
54
+ border-color: var(--#{$prefix}btn-border-color);
29
55
  }
30
56
 
31
- // Disabled comes first so active can properly restyle
32
- &.disabled,
33
- &:disabled {
34
- opacity: $btn-disabled-opacity;
35
- @include box-shadow(none);
57
+ &:focus-visible {
58
+ color: var(--#{$prefix}btn-hover-color);
59
+ @include gradient-bg(var(--#{$prefix}btn-hover-bg));
60
+ border-color: var(--#{$prefix}btn-hover-border-color);
61
+ outline: 0;
62
+ // Avoid using mixin so we can pass custom focus shadow properly
63
+ @if $enable-shadows {
64
+ box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);
65
+ } @else {
66
+ box-shadow: var(--#{$prefix}btn-focus-box-shadow);
67
+ }
36
68
  }
37
69
 
38
- &:not(:disabled):not(.disabled):active,
39
- &:not(:disabled):not(.disabled).active {
40
- @include box-shadow($btn-active-box-shadow);
70
+ .btn-check:focus-visible + & {
71
+ border-color: var(--#{$prefix}btn-hover-border-color);
72
+ outline: 0;
73
+ // Avoid using mixin so we can pass custom focus shadow properly
74
+ @if $enable-shadows {
75
+ box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);
76
+ } @else {
77
+ box-shadow: var(--#{$prefix}btn-focus-box-shadow);
78
+ }
79
+ }
41
80
 
42
- &:focus {
43
- @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
81
+ .btn-check:checked + &,
82
+ :not(.btn-check) + &:active,
83
+ &:first-child:active,
84
+ &.active,
85
+ &.show {
86
+ color: var(--#{$prefix}btn-active-color);
87
+ background-color: var(--#{$prefix}btn-active-bg);
88
+ // Remove CSS gradients if they're enabled
89
+ background-image: if($enable-gradients, none, null);
90
+ border-color: var(--#{$prefix}btn-active-border-color);
91
+ @include box-shadow(var(--#{$prefix}btn-active-shadow));
92
+
93
+ &:focus-visible {
94
+ // Avoid using mixin so we can pass custom focus shadow properly
95
+ @if $enable-shadows {
96
+ box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);
97
+ } @else {
98
+ box-shadow: var(--#{$prefix}btn-focus-box-shadow);
99
+ }
44
100
  }
45
101
  }
46
- }
47
102
 
48
- // Future-proof disabling of clicks on `<a>` elements
49
- a.btn.disabled,
50
- fieldset:disabled a.btn {
51
- pointer-events: none;
103
+ &:disabled,
104
+ &.disabled,
105
+ fieldset:disabled & {
106
+ color: var(--#{$prefix}btn-disabled-color);
107
+ pointer-events: none;
108
+ background-color: var(--#{$prefix}btn-disabled-bg);
109
+ background-image: if($enable-gradients, none, null);
110
+ border-color: var(--#{$prefix}btn-disabled-border-color);
111
+ opacity: var(--#{$prefix}btn-disabled-opacity);
112
+ @include box-shadow(none);
113
+ }
52
114
  }
53
115
 
54
116
 
@@ -56,9 +118,30 @@ fieldset:disabled a.btn {
56
118
  // Alternate buttons
57
119
  //
58
120
 
121
+ // scss-docs-start btn-variant-loops
59
122
  @each $color, $value in $theme-colors {
60
123
  .btn-#{$color} {
61
- @include button-variant($value, $value);
124
+ @if $color == "light" {
125
+ @include button-variant(
126
+ $value,
127
+ $value,
128
+ $hover-background: shade-color($value, $btn-hover-bg-shade-amount),
129
+ $hover-border: shade-color($value, $btn-hover-border-shade-amount),
130
+ $active-background: shade-color($value, $btn-active-bg-shade-amount),
131
+ $active-border: shade-color($value, $btn-active-border-shade-amount)
132
+ );
133
+ } @else if $color == "dark" {
134
+ @include button-variant(
135
+ $value,
136
+ $value,
137
+ $hover-background: tint-color($value, $btn-hover-bg-tint-amount),
138
+ $hover-border: tint-color($value, $btn-hover-border-tint-amount),
139
+ $active-background: tint-color($value, $btn-active-bg-tint-amount),
140
+ $active-border: tint-color($value, $btn-active-border-tint-amount)
141
+ );
142
+ } @else {
143
+ @include button-variant($value, $value);
144
+ }
62
145
  }
63
146
  }
64
147
 
@@ -67,6 +150,7 @@ fieldset:disabled a.btn {
67
150
  @include button-outline-variant($value);
68
151
  }
69
152
  }
153
+ // scss-docs-end btn-variant-loops
70
154
 
71
155
 
72
156
  //
@@ -75,25 +159,35 @@ fieldset:disabled a.btn {
75
159
 
76
160
  // Make a button look and behave like a link
77
161
  .btn-link {
78
- font-weight: $font-weight-normal;
79
- color: $link-color;
162
+ --#{$prefix}btn-font-weight: #{$font-weight-normal};
163
+ --#{$prefix}btn-color: #{$btn-link-color};
164
+ --#{$prefix}btn-bg: transparent;
165
+ --#{$prefix}btn-border-color: transparent;
166
+ --#{$prefix}btn-hover-color: #{$btn-link-hover-color};
167
+ --#{$prefix}btn-hover-border-color: transparent;
168
+ --#{$prefix}btn-active-color: #{$btn-link-hover-color};
169
+ --#{$prefix}btn-active-border-color: transparent;
170
+ --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};
171
+ --#{$prefix}btn-disabled-border-color: transparent;
172
+ --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows
173
+ --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix(color-contrast($link-color), $link-color, 15%))};
174
+
80
175
  text-decoration: $link-decoration;
176
+ @if $enable-gradients {
177
+ background-image: none;
178
+ }
81
179
 
82
- @include hover {
83
- color: $link-hover-color;
180
+ &:hover,
181
+ &:focus-visible {
84
182
  text-decoration: $link-hover-decoration;
85
183
  }
86
184
 
87
- &:focus,
88
- &.focus {
89
- text-decoration: $link-hover-decoration;
90
- box-shadow: none;
185
+ &:focus-visible {
186
+ color: var(--#{$prefix}btn-color);
91
187
  }
92
188
 
93
- &:disabled,
94
- &.disabled {
95
- color: $btn-link-disabled-color;
96
- pointer-events: none;
189
+ &:hover {
190
+ color: var(--#{$prefix}btn-hover-color);
97
191
  }
98
192
 
99
193
  // No need for an active state here
@@ -105,33 +199,9 @@ fieldset:disabled a.btn {
105
199
  //
106
200
 
107
201
  .btn-lg {
108
- @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
202
+ @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);
109
203
  }
110
204
 
111
205
  .btn-sm {
112
- @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
113
- }
114
-
115
-
116
- //
117
- // Block button
118
- //
119
-
120
- .btn-block {
121
- display: block;
122
- width: 100%;
123
-
124
- // Vertically space out multiple block buttons
125
- + .btn-block {
126
- margin-top: $btn-block-spacing-y;
127
- }
128
- }
129
-
130
- // Specificity overrides
131
- input[type="submit"],
132
- input[type="reset"],
133
- input[type="button"] {
134
- &.btn-block {
135
- width: 100%;
136
- }
206
+ @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);
137
207
  }
@@ -3,49 +3,86 @@
3
3
  //
4
4
 
5
5
  .card {
6
+ // scss-docs-start card-css-vars
7
+ --#{$prefix}card-spacer-y: #{$card-spacer-y};
8
+ --#{$prefix}card-spacer-x: #{$card-spacer-x};
9
+ --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y};
10
+ --#{$prefix}card-title-color: #{$card-title-color};
11
+ --#{$prefix}card-subtitle-color: #{$card-subtitle-color};
12
+ --#{$prefix}card-border-width: #{$card-border-width};
13
+ --#{$prefix}card-border-color: #{$card-border-color};
14
+ --#{$prefix}card-border-radius: #{$card-border-radius};
15
+ --#{$prefix}card-box-shadow: #{$card-box-shadow};
16
+ --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius};
17
+ --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y};
18
+ --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x};
19
+ --#{$prefix}card-cap-bg: #{$card-cap-bg};
20
+ --#{$prefix}card-cap-color: #{$card-cap-color};
21
+ --#{$prefix}card-height: #{$card-height};
22
+ --#{$prefix}card-color: #{$card-color};
23
+ --#{$prefix}card-bg: #{$card-bg};
24
+ --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding};
25
+ --#{$prefix}card-group-margin: #{$card-group-margin};
26
+ // scss-docs-end card-css-vars
27
+
6
28
  position: relative;
7
29
  display: flex;
8
30
  flex-direction: column;
9
31
  min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
32
+ height: var(--#{$prefix}card-height);
33
+ color: var(--#{$prefix}body-color);
10
34
  word-wrap: break-word;
11
- background-color: $card-bg;
35
+ background-color: var(--#{$prefix}card-bg);
12
36
  background-clip: border-box;
13
- border: $card-border-width solid $card-border-color;
14
- @include border-radius($card-border-radius);
37
+ border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);
38
+ @include border-radius(var(--#{$prefix}card-border-radius));
39
+ @include box-shadow(var(--#{$prefix}card-box-shadow));
15
40
 
16
41
  > hr {
17
42
  margin-right: 0;
18
43
  margin-left: 0;
19
44
  }
20
45
 
21
- > .list-group:first-child {
22
- .list-group-item:first-child {
23
- @include border-top-radius($card-border-radius);
46
+ > .list-group {
47
+ border-top: inherit;
48
+ border-bottom: inherit;
49
+
50
+ &:first-child {
51
+ border-top-width: 0;
52
+ @include border-top-radius(var(--#{$prefix}card-inner-border-radius));
24
53
  }
25
- }
26
54
 
27
- > .list-group:last-child {
28
- .list-group-item:last-child {
29
- @include border-bottom-radius($card-border-radius);
55
+ &:last-child {
56
+ border-bottom-width: 0;
57
+ @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius));
30
58
  }
31
59
  }
60
+
61
+ // Due to specificity of the above selector (`.card > .list-group`), we must
62
+ // use a child selector here to prevent double borders.
63
+ > .card-header + .list-group,
64
+ > .list-group + .card-footer {
65
+ border-top: 0;
66
+ }
32
67
  }
33
68
 
34
69
  .card-body {
35
70
  // Enable `flex-grow: 1` for decks and groups so that card blocks take up
36
71
  // as much space as possible, ensuring footers are aligned to the bottom.
37
72
  flex: 1 1 auto;
38
- padding: $card-spacer-x;
39
- color: $card-color;
73
+ padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x);
74
+ color: var(--#{$prefix}card-color);
40
75
  }
41
76
 
42
77
  .card-title {
43
- margin-bottom: $card-spacer-y;
78
+ margin-bottom: var(--#{$prefix}card-title-spacer-y);
79
+ color: var(--#{$prefix}card-title-color);
44
80
  }
45
81
 
46
82
  .card-subtitle {
47
- margin-top: -$card-spacer-y / 2;
83
+ margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list
48
84
  margin-bottom: 0;
85
+ color: var(--#{$prefix}card-subtitle-color);
49
86
  }
50
87
 
51
88
  .card-text:last-child {
@@ -53,12 +90,12 @@
53
90
  }
54
91
 
55
92
  .card-link {
56
- @include hover {
57
- text-decoration: none;
93
+ &:hover {
94
+ text-decoration: if($link-hover-decoration == underline, none, null);
58
95
  }
59
96
 
60
97
  + .card-link {
61
- margin-left: $card-spacer-x;
98
+ margin-left: var(--#{$prefix}card-spacer-x);
62
99
  }
63
100
  }
64
101
 
@@ -67,30 +104,25 @@
67
104
  //
68
105
 
69
106
  .card-header {
70
- padding: $card-spacer-y $card-spacer-x;
107
+ padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x);
71
108
  margin-bottom: 0; // Removes the default margin-bottom of <hN>
72
- color: $card-cap-color;
73
- background-color: $card-cap-bg;
74
- border-bottom: $card-border-width solid $card-border-color;
109
+ color: var(--#{$prefix}card-cap-color);
110
+ background-color: var(--#{$prefix}card-cap-bg);
111
+ border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);
75
112
 
76
113
  &:first-child {
77
- @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
78
- }
79
-
80
- + .list-group {
81
- .list-group-item:first-child {
82
- border-top: 0;
83
- }
114
+ @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0);
84
115
  }
85
116
  }
86
117
 
87
118
  .card-footer {
88
- padding: $card-spacer-y $card-spacer-x;
89
- background-color: $card-cap-bg;
90
- border-top: $card-border-width solid $card-border-color;
119
+ padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x);
120
+ color: var(--#{$prefix}card-cap-color);
121
+ background-color: var(--#{$prefix}card-cap-bg);
122
+ border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);
91
123
 
92
124
  &:last-child {
93
- @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
125
+ @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius));
94
126
  }
95
127
  }
96
128
 
@@ -100,15 +132,20 @@
100
132
  //
101
133
 
102
134
  .card-header-tabs {
103
- margin-right: -$card-spacer-x / 2;
104
- margin-bottom: -$card-spacer-y;
105
- margin-left: -$card-spacer-x / 2;
135
+ margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list
136
+ margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list
137
+ margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list
106
138
  border-bottom: 0;
139
+
140
+ .nav-link.active {
141
+ background-color: var(--#{$prefix}card-bg);
142
+ border-bottom-color: var(--#{$prefix}card-bg);
143
+ }
107
144
  }
108
145
 
109
146
  .card-header-pills {
110
- margin-right: -$card-spacer-x / 2;
111
- margin-left: -$card-spacer-x / 2;
147
+ margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list
148
+ margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list
112
149
  }
113
150
 
114
151
  // Card image
@@ -118,51 +155,24 @@
118
155
  right: 0;
119
156
  bottom: 0;
120
157
  left: 0;
121
- padding: $card-img-overlay-padding;
158
+ padding: var(--#{$prefix}card-img-overlay-padding);
159
+ @include border-radius(var(--#{$prefix}card-inner-border-radius));
122
160
  }
123
161
 
124
- .card-img {
162
+ .card-img,
163
+ .card-img-top,
164
+ .card-img-bottom {
125
165
  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
126
- @include border-radius($card-inner-border-radius);
127
166
  }
128
167
 
129
- // Card image caps
168
+ .card-img,
130
169
  .card-img-top {
131
- width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
132
- @include border-top-radius($card-inner-border-radius);
170
+ @include border-top-radius(var(--#{$prefix}card-inner-border-radius));
133
171
  }
134
172
 
173
+ .card-img,
135
174
  .card-img-bottom {
136
- width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
137
- @include border-bottom-radius($card-inner-border-radius);
138
- }
139
-
140
-
141
- // Card deck
142
-
143
- .card-deck {
144
- display: flex;
145
- flex-direction: column;
146
-
147
- .card {
148
- margin-bottom: $card-deck-margin;
149
- }
150
-
151
- @include media-breakpoint-up(sm) {
152
- flex-flow: row wrap;
153
- margin-right: -$card-deck-margin;
154
- margin-left: -$card-deck-margin;
155
-
156
- .card {
157
- display: flex;
158
- // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
159
- flex: 1 0 0%;
160
- flex-direction: column;
161
- margin-right: $card-deck-margin;
162
- margin-bottom: 0; // Override the default
163
- margin-left: $card-deck-margin;
164
- }
165
- }
175
+ @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius));
166
176
  }
167
177
 
168
178
 
@@ -171,16 +181,14 @@
171
181
  //
172
182
 
173
183
  .card-group {
174
- display: flex;
175
- flex-direction: column;
176
-
177
184
  // The child selector allows nested `.card` within `.card-group`
178
185
  // to display properly.
179
186
  > .card {
180
- margin-bottom: $card-group-margin;
187
+ margin-bottom: var(--#{$prefix}card-group-margin);
181
188
  }
182
189
 
183
190
  @include media-breakpoint-up(sm) {
191
+ display: flex;
184
192
  flex-flow: row wrap;
185
193
  // The child selector allows nested `.card` within `.card-group`
186
194
  // to display properly.
@@ -197,31 +205,31 @@
197
205
  // Handle rounded corners
198
206
  @if $enable-rounded {
199
207
  &:not(:last-child) {
200
- @include border-right-radius(0);
208
+ @include border-end-radius(0);
201
209
 
202
210
  .card-img-top,
203
211
  .card-header {
204
- // stylelint-disable-next-line property-blacklist
212
+ // stylelint-disable-next-line property-disallowed-list
205
213
  border-top-right-radius: 0;
206
214
  }
207
215
  .card-img-bottom,
208
216
  .card-footer {
209
- // stylelint-disable-next-line property-blacklist
217
+ // stylelint-disable-next-line property-disallowed-list
210
218
  border-bottom-right-radius: 0;
211
219
  }
212
220
  }
213
221
 
214
222
  &:not(:first-child) {
215
- @include border-left-radius(0);
223
+ @include border-start-radius(0);
216
224
 
217
225
  .card-img-top,
218
226
  .card-header {
219
- // stylelint-disable-next-line property-blacklist
227
+ // stylelint-disable-next-line property-disallowed-list
220
228
  border-top-left-radius: 0;
221
229
  }
222
230
  .card-img-bottom,
223
231
  .card-footer {
224
- // stylelint-disable-next-line property-blacklist
232
+ // stylelint-disable-next-line property-disallowed-list
225
233
  border-bottom-left-radius: 0;
226
234
  }
227
235
  }
@@ -229,61 +237,3 @@
229
237
  }
230
238
  }
231
239
  }
232
-
233
-
234
- //
235
- // Columns
236
- //
237
-
238
- .card-columns {
239
- .card {
240
- margin-bottom: $card-columns-margin;
241
- }
242
-
243
- @include media-breakpoint-up(sm) {
244
- column-count: $card-columns-count;
245
- column-gap: $card-columns-gap;
246
- orphans: 1;
247
- widows: 1;
248
-
249
- .card {
250
- display: inline-block; // Don't let them vertically span multiple columns
251
- width: 100%; // Don't let their width change
252
- }
253
- }
254
- }
255
-
256
-
257
- //
258
- // Accordion
259
- //
260
-
261
- .accordion {
262
- > .card {
263
- overflow: hidden;
264
-
265
- &:not(:first-of-type) {
266
- .card-header:first-child {
267
- @include border-radius(0);
268
- }
269
-
270
- &:not(:last-of-type) {
271
- border-bottom: 0;
272
- @include border-radius(0);
273
- }
274
- }
275
-
276
- &:first-of-type {
277
- border-bottom: 0;
278
- @include border-bottom-radius(0);
279
- }
280
-
281
- &:last-of-type {
282
- @include border-top-radius(0);
283
- }
284
-
285
- .card-header {
286
- margin-bottom: -$card-border-width;
287
- }
288
- }
289
- }