Skip to content

Commit cd74741

Browse files
authored
Standardize focus styles using focus-ring mixin (#41950)
* Standardize focus styles using focus-ring mixin Replace box-shadow focus styles with consistent focus-ring() mixin across components: - Accordion, nav, pagination now use @include focus-ring(true) - Forms (checkboxes, radios, switches, range, controls) use focus-ring mixin - Update focus-ring-offset default from -1px to 1px - Remove deprecated *-focus-box-shadow variables * Fix some focus styles * Remove unused CSS * Remove more box-shadow on buttons
1 parent b82c8e4 commit cd74741

18 files changed

+48
-171
lines changed

scss/_accordion.scss

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
@use "functions" as *;
44
@use "mixins/border-radius" as *;
55
@use "mixins/transition" as *;
6-
@use "mixins/box-shadow" as *;
6+
@use "mixins/focus-ring" as *;
77
@use "mixins/color-mode" as *;
8+
@use "buttons/button-variables" as *; // mdo-do: remove?
89

910
// scss-docs-start accordion-variables
1011
$accordion-padding-y: 1rem !default;
@@ -27,8 +28,6 @@ $accordion-transition: $btn-transition, border-radius .15s ea
2728
$accordion-button-active-bg: var(--#{$prefix}bg-2) !default;
2829
$accordion-button-active-color: var(--#{$prefix}fg) !default;
2930

30-
$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;
31-
3231
$accordion-icon-width: 1.25rem !default;
3332
$accordion-icon-transition: transform .2s ease-in-out !default;
3433
$accordion-icon-transform: rotate(-180deg) !default;
@@ -53,7 +52,6 @@ $accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w
5352
--#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width};
5453
--#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform};
5554
--#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition};
56-
--#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow};
5755
--#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x};
5856
--#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y};
5957
--#{$prefix}accordion-active-color: #{$accordion-button-active-color};
@@ -103,10 +101,9 @@ $accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w
103101
z-index: 2;
104102
}
105103

106-
&:focus {
104+
&:focus-visible {
107105
z-index: 3;
108-
outline: 0;
109-
box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow);
106+
@include focus-ring(true);
110107
}
111108
}
112109

scss/_nav.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
@use "config" as *;
22
@use "variables" as *;
33
@use "mixins/border-radius" as *;
4-
@use "mixins/gradients" as *;
54
@use "mixins/focus-ring" as *;
5+
@use "mixins/gradients" as *;
66
@use "mixins/transition" as *;
77

88
// scss-docs-start nav-variables

scss/_navbar.scss

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
@use "config" as *;
33
@use "colors" as *;
44
@use "variables" as *;
5+
@use "layout/breakpoints" as *;
56
@use "mixins/border-radius" as *;
67
@use "mixins/box-shadow" as *;
8+
@use "mixins/color-mode" as *;
9+
@use "mixins/focus-ring" as *;
710
@use "mixins/gradients" as *;
811
@use "mixins/transition" as *;
9-
@use "mixins/color-mode" as *;
10-
@use "mixins/deprecate" as *;
11-
@use "layout/breakpoints" as *;
1212

1313
// scss-docs-start navbar-variables
1414
$navbar-padding-y: $spacer * .5 !default;
@@ -29,8 +29,7 @@ $navbar-brand-margin-end: 1rem !default;
2929
$navbar-toggler-padding-y: .25rem !default;
3030
$navbar-toggler-padding-x: .75rem !default;
3131
$navbar-toggler-font-size: $font-size-lg !default;
32-
$navbar-toggler-border-radius: $btn-border-radius !default;
33-
$navbar-toggler-focus-width: $btn-focus-width !default;
32+
$navbar-toggler-border-radius: var(--#{$prefix}border-radius) !default;
3433
$navbar-toggler-transition: box-shadow .15s ease-in-out !default;
3534

3635
$navbar-light-color: var(--#{$prefix}fg-2) !default;
@@ -78,7 +77,6 @@ $navbar-dark-brand-hover-color: $navbar-dark-active-color !default;
7877
--#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};
7978
--#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};
8079
--#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};
81-
--#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};
8280
--#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};
8381
// scss-docs-end navbar-css-vars
8482

@@ -217,10 +215,9 @@ $navbar-dark-brand-hover-color: $navbar-dark-active-color !default;
217215
text-decoration: none;
218216
}
219217

220-
&:focus {
218+
&:focus-visible {
221219
text-decoration: none;
222-
outline: 0;
223-
box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);
220+
@include focus-ring(true);
224221
}
225222
}
226223

@@ -318,10 +315,6 @@ $navbar-dark-brand-hover-color: $navbar-dark-active-color !default;
318315
//
319316
// Styles for switching between navbars with light or dark background.
320317

321-
.navbar-light {
322-
@include deprecate("`.navbar-light`", "v5.2.0", "v6.0.0", true);
323-
}
324-
325318
.navbar-dark,
326319
.navbar[data-bs-theme="dark"] {
327320
// scss-docs-start navbar-dark-css-vars

scss/_pagination.scss

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
@use "variables" as *;
33
@use "mixins/lists" as *;
44
@use "mixins/border-radius" as *;
5-
@use "mixins/transition" as *;
5+
@use "mixins/focus-ring" as *;
66
@use "mixins/gradients" as *;
7+
@use "mixins/transition" as *;
78

89
// scss-docs-start pagination-variables
910
$pagination-padding-y: .375rem !default;
@@ -24,8 +25,6 @@ $pagination-border-color: var(--#{$prefix}border-color) !default;
2425

2526
$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;
2627
$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;
27-
$pagination-focus-box-shadow: $focus-ring-box-shadow !default;
28-
$pagination-focus-outline: 0 !default;
2928

3029
$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;
3130
$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;
@@ -71,7 +70,6 @@ $pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
7170
--#{$prefix}pagination-hover-border-color: #{$pagination-hover-border-color};
7271
--#{$prefix}pagination-focus-color: #{$pagination-focus-color};
7372
--#{$prefix}pagination-focus-bg: #{$pagination-focus-bg};
74-
--#{$prefix}pagination-focus-box-shadow: #{$pagination-focus-box-shadow};
7573
--#{$prefix}pagination-active-color: #{$pagination-active-color};
7674
--#{$prefix}pagination-active-bg: #{$pagination-active-bg};
7775
--#{$prefix}pagination-active-border-color: #{$pagination-active-border-color};
@@ -102,12 +100,11 @@ $pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
102100
border-color: var(--#{$prefix}pagination-hover-border-color);
103101
}
104102

105-
&:focus {
103+
&:focus-visible {
106104
z-index: 3;
107105
color: var(--#{$prefix}pagination-focus-color);
108106
background-color: var(--#{$prefix}pagination-focus-bg);
109-
outline: $pagination-focus-outline;
110-
box-shadow: var(--#{$prefix}pagination-focus-box-shadow);
107+
@include focus-ring(true);
111108
}
112109

113110
&.active,

scss/_root.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@
133133
// Focus styles
134134
// scss-docs-start root-focus-variables
135135
--#{$prefix}focus-ring-width: 3px;
136-
--#{$prefix}focus-ring-offset: -1px;
136+
--#{$prefix}focus-ring-offset: 1px;
137137
--#{$prefix}focus-ring-color: var(--#{$prefix}primary-focus-ring);
138138
--#{$prefix}focus-ring: var(--#{$prefix}focus-ring-width) solid var(--#{$prefix}focus-ring-color);
139139
// scss-docs-end root-focus-variables

scss/_variables.scss

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,6 @@ $input-btn-font-family: null !default;
354354
$input-btn-font-size: $font-size-base !default;
355355
$input-btn-line-height: $line-height-base !default;
356356

357-
$input-btn-focus-width: .25em !default;
358-
$input-btn-focus-color-opacity: $focus-ring-opacity !default;
359-
$input-btn-focus-color: $focus-ring-color !default;
360-
$input-btn-focus-blur: $focus-ring-blur !default;
361-
$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;
362-
363357
$input-btn-padding-y-sm: .25rem !default;
364358
$input-btn-padding-x-sm: .5rem !default;
365359
$input-btn-font-size-sm: $font-size-sm !default;
@@ -372,51 +366,6 @@ $input-btn-border-width: var(--#{$prefix}border-width) !default;
372366
// scss-docs-end input-btn-variables
373367

374368

375-
// Buttons
376-
//
377-
// For each of Bootstrap's buttons, define text, background, and border color.
378-
379-
// scss-docs-start btn-variables
380-
$btn-color: var(--#{$prefix}color-body) !default;
381-
$btn-padding-y: $input-btn-padding-y !default;
382-
$btn-padding-x: $input-btn-padding-x !default;
383-
$btn-font-family: $input-btn-font-family !default;
384-
$btn-font-size: $input-btn-font-size !default;
385-
$btn-line-height: $input-btn-line-height !default;
386-
$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping
387-
388-
$btn-padding-y-sm: $input-btn-padding-y-sm !default;
389-
$btn-padding-x-sm: $input-btn-padding-x-sm !default;
390-
$btn-font-size-sm: $input-btn-font-size-sm !default;
391-
392-
$btn-padding-y-lg: $input-btn-padding-y-lg !default;
393-
$btn-padding-x-lg: $input-btn-padding-x-lg !default;
394-
$btn-font-size-lg: $input-btn-font-size-lg !default;
395-
396-
$btn-border-width: $input-btn-border-width !default;
397-
398-
$btn-font-weight: $font-weight-normal !default;
399-
$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
400-
$btn-focus-width: $input-btn-focus-width !default;
401-
$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
402-
$btn-disabled-opacity: .65 !default;
403-
$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
404-
405-
$btn-link-color: var(--#{$prefix}link-color) !default;
406-
$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;
407-
$btn-link-disabled-color: var(--#{$prefix}gray-600) !default;
408-
// $btn-link-color-contrast: color-contrast($link-color) !default;
409-
// $btn-link-focus-shadow-rgb: to-rgb(color.mix($btn-link-color-contrast, $link-color, 15%)) !default;
410-
411-
// Allows for customizing button radius independently from global border radius
412-
$btn-border-radius: var(--#{$prefix}border-radius) !default;
413-
$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;
414-
$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
415-
416-
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
417-
// scss-docs-end btn-variables
418-
419-
420369
// Z-index master list
421370
//
422371
// Warning: Avoid customizing these values. They're used for a bird's eye view

scss/buttons/_button-group.scss

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,6 @@
9797
padding-inline: $btn-padding-x-lg * .75;
9898
}
9999

100-
101-
// The clickable button for toggling the menu
102-
// Set the same inset shadow as the :active state
103-
.btn-group.show .dropdown-toggle {
104-
@include box-shadow($btn-active-box-shadow);
105-
106-
// Show no shadow for `.btn-link` since it has no other button styles.
107-
&.btn-link {
108-
@include box-shadow(none);
109-
}
110-
}
111-
112-
113100
//
114101
// Vertical button groups
115102
//

scss/buttons/_button-variables.scss

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ $btn-line-height-lg: 1.25rem !default;
3838
$btn-border-width: $input-btn-border-width !default;
3939

4040
$btn-font-weight: $font-weight-normal !default;
41-
$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
4241
$btn-disabled-opacity: .65 !default;
43-
$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
4442

4543
$btn-link-color: var(--#{$prefix}link-color) !default;
4644
$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;

scss/buttons/_button.scss

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,6 @@ $btn-variant-selectors: () !default;
305305
--#{$prefix}btn-active-border-color: transparent;
306306
--#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};
307307
--#{$prefix}btn-disabled-border-color: transparent;
308-
--#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows
309-
// --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb};
310308

311309
text-decoration: var(--#{$prefix}link-decoration);
312310

scss/forms/_check.scss

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
@use "../variables" as *;
44
@use "../functions" as *;
55
@use "../mixins/border-radius" as *;
6-
@use "../mixins/box-shadow" as *;
76
@use "../mixins/color-mode" as *;
87
@use "../mixins/focus-ring" as *;
98
@use "../mixins/transition" as *;
@@ -68,6 +67,10 @@ $check-disabled-opacity: .65 !default;
6867
border-color: var(--#{$prefix}theme-bg, var(--#{$prefix}check-checked-border-color));
6968
}
7069

70+
:where(input:focus-visible) {
71+
@include focus-ring(true);
72+
}
73+
7174
&:has(input:checked) .checked,
7275
&:has(input:indeterminate) .indeterminate {
7376
display: block;
@@ -83,7 +86,6 @@ $check-disabled-opacity: .65 !default;
8386
cursor: default;
8487
}
8588
}
86-
8789
&:has(input:disabled:checked) {
8890
opacity: var(--#{$prefix}check-disabled-opacity);
8991
}

0 commit comments

Comments
 (0)