bootstrap 4.6.1 → 5.0.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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/README.md +7 -4
  4. data/assets/javascripts/bootstrap/alert.js +192 -112
  5. data/assets/javascripts/bootstrap/base-component.js +63 -0
  6. data/assets/javascripts/bootstrap/button.js +96 -176
  7. data/assets/javascripts/bootstrap/carousel.js +470 -355
  8. data/assets/javascripts/bootstrap/collapse.js +377 -221
  9. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  10. data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
  11. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  12. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  13. data/assets/javascripts/bootstrap/dropdown.js +470 -351
  14. data/assets/javascripts/bootstrap/modal.js +611 -435
  15. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  16. data/assets/javascripts/bootstrap/popover.js +137 -165
  17. data/assets/javascripts/bootstrap/scrollspy.js +249 -191
  18. data/assets/javascripts/bootstrap/tab.js +241 -141
  19. data/assets/javascripts/bootstrap/toast.js +221 -153
  20. data/assets/javascripts/bootstrap/tooltip.js +649 -483
  21. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  22. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  23. data/assets/javascripts/bootstrap-sprockets.js +14 -7
  24. data/assets/javascripts/bootstrap.js +3272 -2586
  25. data/assets/javascripts/bootstrap.min.js +2 -2
  26. data/assets/stylesheets/_bootstrap-grid.scss +51 -16
  27. data/assets/stylesheets/_bootstrap-reboot.scss +4 -1
  28. data/assets/stylesheets/_bootstrap.scss +16 -8
  29. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  30. data/assets/stylesheets/bootstrap/_alert.scss +15 -10
  31. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  32. data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -17
  33. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  34. data/assets/stylesheets/bootstrap/_buttons.scss +29 -60
  35. data/assets/stylesheets/bootstrap/_card.scss +20 -91
  36. data/assets/stylesheets/bootstrap/_carousel.scss +64 -35
  37. data/assets/stylesheets/bootstrap/_close.scss +30 -30
  38. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  39. data/assets/stylesheets/bootstrap/_dropdown.scss +84 -36
  40. data/assets/stylesheets/bootstrap/_forms.scss +9 -347
  41. data/assets/stylesheets/bootstrap/_functions.scss +84 -69
  42. data/assets/stylesheets/bootstrap/_grid.scss +3 -54
  43. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  44. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  45. data/assets/stylesheets/bootstrap/_list-group.scss +28 -8
  46. data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
  47. data/assets/stylesheets/bootstrap/_modal.scss +45 -57
  48. data/assets/stylesheets/bootstrap/_nav.scss +23 -4
  49. data/assets/stylesheets/bootstrap/_navbar.scss +45 -71
  50. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  51. data/assets/stylesheets/bootstrap/_pagination.scss +10 -20
  52. data/assets/stylesheets/bootstrap/_popover.scss +24 -36
  53. data/assets/stylesheets/bootstrap/_progress.scss +5 -4
  54. data/assets/stylesheets/bootstrap/_reboot.scss +316 -179
  55. data/assets/stylesheets/bootstrap/_root.scss +5 -8
  56. data/assets/stylesheets/bootstrap/_spinners.scss +9 -5
  57. data/assets/stylesheets/bootstrap/_tables.scss +79 -114
  58. data/assets/stylesheets/bootstrap/_toasts.scss +20 -15
  59. data/assets/stylesheets/bootstrap/_tooltip.scss +21 -21
  60. data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
  61. data/assets/stylesheets/bootstrap/_type.scss +38 -59
  62. data/assets/stylesheets/bootstrap/_utilities.scss +594 -18
  63. data/assets/stylesheets/bootstrap/_variables.scss +801 -485
  64. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  65. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  66. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  67. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  70. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  71. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  72. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  73. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  74. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  75. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  76. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  77. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  78. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  79. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  80. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  81. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  82. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
  83. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  84. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  85. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +71 -48
  86. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  87. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  88. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  89. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  90. data/assets/stylesheets/bootstrap/mixins/_forms.scss +39 -97
  91. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  92. data/assets/stylesheets/bootstrap/mixins/_grid.scss +90 -34
  93. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  94. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  95. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  96. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
  97. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  98. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  99. data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
  100. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  101. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  102. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  103. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +214 -130
  104. data/bootstrap.gemspec +1 -3
  105. data/lib/bootstrap/version.rb +2 -2
  106. data/tasks/updater/js.rb +20 -5
  107. data/tasks/updater/network.rb +7 -1
  108. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  109. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  110. data/test/dummy_rails/app/views/pages/root.html +89 -0
  111. data/test/dummy_rails/config/application.rb +0 -3
  112. data/test/gemfiles/rails_6_1.gemfile +7 -0
  113. metadata +45 -73
  114. data/assets/javascripts/bootstrap/util.js +0 -189
  115. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  116. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
  117. data/assets/stylesheets/bootstrap/_input-group.scss +0 -211
  118. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  119. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  120. data/assets/stylesheets/bootstrap/_print.scss +0 -132
  121. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
  122. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  123. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  124. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
  125. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  126. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  127. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  128. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  129. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  130. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  131. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  133. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  134. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  135. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  136. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  137. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  138. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  139. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  140. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
  141. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  142. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  143. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  144. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  145. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  146. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  147. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  148. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  149. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  150. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -3,12 +3,12 @@
3
3
  // 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
4
4
  // even when their scroll action started on a carousel, but for compatibility (with Firefox)
5
5
  // we're preventing all actions instead
6
- // 2. The .carousel-item-left and .carousel-item-right is used to indicate where
6
+ // 2. The .carousel-item-start and .carousel-item-end is used to indicate where
7
7
  // the active slide is heading.
8
8
  // 3. .active.carousel-item is the current slide.
9
- // 4. .active.carousel-item-left and .active.carousel-item-right is the current
9
+ // 4. .active.carousel-item-start and .active.carousel-item-end is the current
10
10
  // slide in its in-transition state. Only one of these occurs at a time.
11
- // 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
11
+ // 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end
12
12
  // is the upcoming slide in transition.
13
13
 
14
14
  .carousel {
@@ -42,16 +42,19 @@
42
42
  display: block;
43
43
  }
44
44
 
45
- .carousel-item-next:not(.carousel-item-left),
46
- .active.carousel-item-right {
45
+ /* rtl:begin:ignore */
46
+ .carousel-item-next:not(.carousel-item-start),
47
+ .active.carousel-item-end {
47
48
  transform: translateX(100%);
48
49
  }
49
50
 
50
- .carousel-item-prev:not(.carousel-item-right),
51
- .active.carousel-item-left {
51
+ .carousel-item-prev:not(.carousel-item-end),
52
+ .active.carousel-item-start {
52
53
  transform: translateX(-100%);
53
54
  }
54
55
 
56
+ /* rtl:end:ignore */
57
+
55
58
 
56
59
  //
57
60
  // Alternate transitions
@@ -65,14 +68,14 @@
65
68
  }
66
69
 
67
70
  .carousel-item.active,
68
- .carousel-item-next.carousel-item-left,
69
- .carousel-item-prev.carousel-item-right {
71
+ .carousel-item-next.carousel-item-start,
72
+ .carousel-item-prev.carousel-item-end {
70
73
  z-index: 1;
71
74
  opacity: 1;
72
75
  }
73
76
 
74
- .active.carousel-item-left,
75
- .active.carousel-item-right {
77
+ .active.carousel-item-start,
78
+ .active.carousel-item-end {
76
79
  z-index: 0;
77
80
  opacity: 0;
78
81
  @include transition(opacity 0s $carousel-transition-duration);
@@ -104,7 +107,8 @@
104
107
  @include transition($carousel-control-transition);
105
108
 
106
109
  // Hover/focus state
107
- @include hover-focus() {
110
+ &:hover,
111
+ &:focus {
108
112
  color: $carousel-control-color;
109
113
  text-decoration: none;
110
114
  outline: 0;
@@ -113,15 +117,11 @@
113
117
  }
114
118
  .carousel-control-prev {
115
119
  left: 0;
116
- @if $enable-gradients {
117
- background-image: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
118
- }
120
+ background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);
119
121
  }
120
122
  .carousel-control-next {
121
123
  right: 0;
122
- @if $enable-gradients {
123
- background-image: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
124
- }
124
+ background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);
125
125
  }
126
126
 
127
127
  // Icons for within
@@ -130,8 +130,19 @@
130
130
  display: inline-block;
131
131
  width: $carousel-control-icon-width;
132
132
  height: $carousel-control-icon-width;
133
- background: 50% / 100% 100% no-repeat;
134
- }
133
+ background-repeat: no-repeat;
134
+ background-position: 50%;
135
+ background-size: 100% 100%;
136
+ }
137
+
138
+ /* rtl:options: {
139
+ "autoRename": true,
140
+ "stringMap":[ {
141
+ "name" : "prev-next",
142
+ "search" : "prev",
143
+ "replace" : "next"
144
+ } ]
145
+ } */
135
146
  .carousel-control-prev-icon {
136
147
  background-image: escape-svg($carousel-control-prev-icon-bg);
137
148
  }
@@ -139,46 +150,48 @@
139
150
  background-image: escape-svg($carousel-control-next-icon-bg);
140
151
  }
141
152
 
142
-
143
- // Optional indicator pips
153
+ // Optional indicator pips/controls
144
154
  //
145
- // Add an ordered list with the following class and add a list item for each
146
- // slide your carousel holds.
155
+ // Add a container (such as a list) with the following class and add an item (ideally a focusable control,
156
+ // like a button) with data-bs-target for each slide your carousel holds.
147
157
 
148
158
  .carousel-indicators {
149
159
  position: absolute;
150
160
  right: 0;
151
161
  bottom: 0;
152
162
  left: 0;
153
- z-index: 15;
163
+ z-index: 2;
154
164
  display: flex;
155
165
  justify-content: center;
156
- padding-left: 0; // override <ol> default
166
+ padding: 0;
157
167
  // Use the .carousel-control's width as margin so we don't overlay those
158
168
  margin-right: $carousel-control-width;
169
+ margin-bottom: 1rem;
159
170
  margin-left: $carousel-control-width;
160
171
  list-style: none;
161
172
 
162
- li {
173
+ [data-bs-target] {
163
174
  box-sizing: content-box;
164
175
  flex: 0 1 auto;
165
176
  width: $carousel-indicator-width;
166
177
  height: $carousel-indicator-height;
178
+ padding: 0;
167
179
  margin-right: $carousel-indicator-spacer;
168
180
  margin-left: $carousel-indicator-spacer;
169
181
  text-indent: -999px;
170
182
  cursor: pointer;
171
183
  background-color: $carousel-indicator-active-bg;
172
184
  background-clip: padding-box;
185
+ border: 0;
173
186
  // Use transparent borders to increase the hit area by 10px on top and bottom.
174
187
  border-top: $carousel-indicator-hit-area-height solid transparent;
175
188
  border-bottom: $carousel-indicator-hit-area-height solid transparent;
176
- opacity: .5;
189
+ opacity: $carousel-indicator-opacity;
177
190
  @include transition($carousel-indicator-transition);
178
191
  }
179
192
 
180
193
  .active {
181
- opacity: 1;
194
+ opacity: $carousel-indicator-active-opacity;
182
195
  }
183
196
  }
184
197
 
@@ -189,12 +202,28 @@
189
202
 
190
203
  .carousel-caption {
191
204
  position: absolute;
192
- right: (100% - $carousel-caption-width) * .5;
193
- bottom: 20px;
194
- left: (100% - $carousel-caption-width) * .5;
195
- z-index: 10;
196
- padding-top: 20px;
197
- padding-bottom: 20px;
205
+ right: (100% - $carousel-caption-width) / 2;
206
+ bottom: $carousel-caption-spacer;
207
+ left: (100% - $carousel-caption-width) / 2;
208
+ padding-top: $carousel-caption-padding-y;
209
+ padding-bottom: $carousel-caption-padding-y;
198
210
  color: $carousel-caption-color;
199
211
  text-align: center;
200
212
  }
213
+
214
+ // Dark mode carousel
215
+
216
+ .carousel-dark {
217
+ .carousel-control-prev-icon,
218
+ .carousel-control-next-icon {
219
+ filter: $carousel-dark-control-icon-filter;
220
+ }
221
+
222
+ .carousel-indicators [data-bs-target] {
223
+ background-color: $carousel-dark-indicator-active-bg;
224
+ }
225
+
226
+ .carousel-caption {
227
+ color: $carousel-dark-caption-color;
228
+ }
229
+ }
@@ -1,40 +1,40 @@
1
- .close {
2
- float: right;
3
- @include font-size($close-font-size);
4
- font-weight: $close-font-weight;
5
- line-height: 1;
6
- color: $close-color;
7
- text-shadow: $close-text-shadow;
8
- opacity: .5;
1
+ // transparent background and border properties included for button version.
2
+ // iOS requires the button element instead of an anchor tag.
3
+ // If you want the anchor version, it requires `href="#"`.
4
+ // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
5
+
6
+ .btn-close {
7
+ box-sizing: content-box;
8
+ width: $btn-close-width;
9
+ height: $btn-close-height;
10
+ padding: $btn-close-padding-y $btn-close-padding-x;
11
+ color: $btn-close-color;
12
+ background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements
13
+ border: 0; // for button elements
14
+ @include border-radius();
15
+ opacity: $btn-close-opacity;
9
16
 
10
17
  // Override <a>'s hover style
11
- @include hover() {
12
- color: $close-color;
18
+ &:hover {
19
+ color: $btn-close-color;
13
20
  text-decoration: none;
21
+ opacity: $btn-close-hover-opacity;
14
22
  }
15
23
 
16
- &:not(:disabled):not(.disabled) {
17
- @include hover-focus() {
18
- opacity: .75;
19
- }
24
+ &:focus {
25
+ outline: 0;
26
+ box-shadow: $btn-close-focus-shadow;
27
+ opacity: $btn-close-focus-opacity;
20
28
  }
21
- }
22
29
 
23
- // Additional properties for button version
24
- // iOS requires the button element instead of an anchor tag.
25
- // If you want the anchor version, it requires `href="#"`.
26
- // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
27
-
28
- // stylelint-disable-next-line selector-no-qualifying-type
29
- button.close {
30
- padding: 0;
31
- background-color: transparent;
32
- border: 0;
30
+ &:disabled,
31
+ &.disabled {
32
+ pointer-events: none;
33
+ user-select: none;
34
+ opacity: $btn-close-disabled-opacity;
35
+ }
33
36
  }
34
37
 
35
- // Future-proof disabling of clicks on `<a>` elements
36
-
37
- // stylelint-disable-next-line selector-no-qualifying-type
38
- a.close.disabled {
39
- pointer-events: none;
38
+ .btn-close-white {
39
+ filter: $btn-close-white-filter;
40
40
  }
@@ -0,0 +1,41 @@
1
+ // Container widths
2
+ //
3
+ // Set the container width, and override it for fixed navbars in media queries.
4
+
5
+ @if $enable-grid-classes {
6
+ // Single container class with breakpoint max-widths
7
+ .container,
8
+ // 100% wide container at all breakpoints
9
+ .container-fluid {
10
+ @include make-container();
11
+ }
12
+
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
+ }
18
+
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
+ }
40
+ }
41
+ }
@@ -1,8 +1,8 @@
1
1
  // The dropdown wrapper (`<div>`)
2
2
  .dropup,
3
- .dropright,
3
+ .dropend,
4
4
  .dropdown,
5
- .dropleft {
5
+ .dropstart {
6
6
  position: relative;
7
7
  }
8
8
 
@@ -16,14 +16,11 @@
16
16
  // The dropdown menu
17
17
  .dropdown-menu {
18
18
  position: absolute;
19
- top: 100%;
20
- left: 0;
21
19
  z-index: $zindex-dropdown;
22
20
  display: none; // none by default, but block on "open" of the menu
23
- float: left;
24
21
  min-width: $dropdown-min-width;
25
22
  padding: $dropdown-padding-y $dropdown-padding-x;
26
- margin: $dropdown-spacer 0 0; // override default ul
23
+ margin: 0; // Override default margin of ul
27
24
  @include font-size($dropdown-font-size);
28
25
  color: $dropdown-color;
29
26
  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
@@ -33,28 +30,47 @@
33
30
  border: $dropdown-border-width solid $dropdown-border-color;
34
31
  @include border-radius($dropdown-border-radius);
35
32
  @include box-shadow($dropdown-box-shadow);
33
+
34
+ &[data-bs-popper] {
35
+ top: 100%;
36
+ left: 0;
37
+ margin-top: $dropdown-spacer;
38
+ }
36
39
  }
37
40
 
41
+ // scss-docs-start responsive-breakpoints
42
+ // We deliberately hardcode the `bs-` prefix because we check
43
+ // this custom property in JS to determine Popper's positioning
44
+
38
45
  @each $breakpoint in map-keys($grid-breakpoints) {
39
46
  @include media-breakpoint-up($breakpoint) {
40
47
  $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
41
48
 
42
- .dropdown-menu#{$infix}-left {
43
- right: auto;
44
- left: 0;
49
+ .dropdown-menu#{$infix}-start {
50
+ --bs-position: start;
51
+
52
+ &[data-bs-popper] {
53
+ right: auto #{"/* rtl:ignore */"};
54
+ left: 0 #{"/* rtl:ignore */"};
55
+ }
45
56
  }
46
57
 
47
- .dropdown-menu#{$infix}-right {
48
- right: 0;
49
- left: auto;
58
+ .dropdown-menu#{$infix}-end {
59
+ --bs-position: end;
60
+
61
+ &[data-bs-popper] {
62
+ right: 0 #{"/* rtl:ignore */"};
63
+ left: auto #{"/* rtl:ignore */"};
64
+ }
50
65
  }
51
66
  }
52
67
  }
68
+ // scss-docs-end responsive-breakpoints
53
69
 
54
70
  // Allow for dropdowns to go bottom up (aka, dropup-menu)
55
71
  // Just add .dropup after the standard .dropdown class and you're set.
56
72
  .dropup {
57
- .dropdown-menu {
73
+ .dropdown-menu[data-bs-popper] {
58
74
  top: auto;
59
75
  bottom: 100%;
60
76
  margin-top: 0;
@@ -66,8 +82,8 @@
66
82
  }
67
83
  }
68
84
 
69
- .dropright {
70
- .dropdown-menu {
85
+ .dropend {
86
+ .dropdown-menu[data-bs-popper] {
71
87
  top: 0;
72
88
  right: auto;
73
89
  left: 100%;
@@ -76,15 +92,15 @@
76
92
  }
77
93
 
78
94
  .dropdown-toggle {
79
- @include caret(right);
95
+ @include caret(end);
80
96
  &::after {
81
97
  vertical-align: 0;
82
98
  }
83
99
  }
84
100
  }
85
101
 
86
- .dropleft {
87
- .dropdown-menu {
102
+ .dropstart {
103
+ .dropdown-menu[data-bs-popper] {
88
104
  top: 0;
89
105
  right: 100%;
90
106
  left: auto;
@@ -93,28 +109,20 @@
93
109
  }
94
110
 
95
111
  .dropdown-toggle {
96
- @include caret(left);
112
+ @include caret(start);
97
113
  &::before {
98
114
  vertical-align: 0;
99
115
  }
100
116
  }
101
117
  }
102
118
 
103
- // When Popper is enabled, reset the basic dropdown position
104
- // stylelint-disable-next-line no-duplicate-selectors
105
- .dropdown-menu {
106
- &[x-placement^="top"],
107
- &[x-placement^="right"],
108
- &[x-placement^="bottom"],
109
- &[x-placement^="left"] {
110
- right: auto;
111
- bottom: auto;
112
- }
113
- }
114
119
 
115
120
  // Dividers (basically an `<hr>`) within the dropdown
116
121
  .dropdown-divider {
117
- @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y, true);
122
+ height: 0;
123
+ margin: $dropdown-divider-margin-y 0;
124
+ overflow: hidden;
125
+ border-top: 1px solid $dropdown-divider-bg;
118
126
  }
119
127
 
120
128
  // Links, buttons, and more within the dropdown menu
@@ -145,9 +153,10 @@
145
153
  }
146
154
  }
147
155
 
148
- @include hover-focus() {
156
+ &:hover,
157
+ &:focus {
149
158
  color: $dropdown-link-hover-color;
150
- text-decoration: none;
159
+ text-decoration: if($link-hover-decoration == underline, none, null);
151
160
  @include gradient-bg($dropdown-link-hover-bg);
152
161
  }
153
162
 
@@ -164,9 +173,7 @@
164
173
  pointer-events: none;
165
174
  background-color: transparent;
166
175
  // Remove CSS gradients if they're enabled
167
- @if $enable-gradients {
168
- background-image: none;
169
- }
176
+ background-image: if($enable-gradients, none, null);
170
177
  }
171
178
  }
172
179
 
@@ -190,3 +197,44 @@
190
197
  padding: $dropdown-item-padding-y $dropdown-item-padding-x;
191
198
  color: $dropdown-link-color;
192
199
  }
200
+
201
+ // Dark dropdowns
202
+ .dropdown-menu-dark {
203
+ color: $dropdown-dark-color;
204
+ background-color: $dropdown-dark-bg;
205
+ border-color: $dropdown-dark-border-color;
206
+ @include box-shadow($dropdown-dark-box-shadow);
207
+
208
+ .dropdown-item {
209
+ color: $dropdown-dark-link-color;
210
+
211
+ &:hover,
212
+ &:focus {
213
+ color: $dropdown-dark-link-hover-color;
214
+ @include gradient-bg($dropdown-dark-link-hover-bg);
215
+ }
216
+
217
+ &.active,
218
+ &:active {
219
+ color: $dropdown-dark-link-active-color;
220
+ @include gradient-bg($dropdown-dark-link-active-bg);
221
+ }
222
+
223
+ &.disabled,
224
+ &:disabled {
225
+ color: $dropdown-dark-link-disabled-color;
226
+ }
227
+ }
228
+
229
+ .dropdown-divider {
230
+ border-color: $dropdown-dark-divider-bg;
231
+ }
232
+
233
+ .dropdown-item-text {
234
+ color: $dropdown-dark-link-color;
235
+ }
236
+
237
+ .dropdown-header {
238
+ color: $dropdown-dark-header-color;
239
+ }
240
+ }