Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit 65c10a6

Browse files
feat(focus-ring): Add RTL support to focus ring mixin.
PiperOrigin-RevId: 628142655
1 parent 311f29a commit 65c10a6

File tree

2 files changed

+51
-10
lines changed

2 files changed

+51
-10
lines changed

packages/mdc-focus-ring/_focus-ring.scss

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
@use '@material/feature-targeting/feature-targeting';
2626
@use '@material/rtl/rtl';
2727
@use '@material/dom/dom';
28+
@use '@material/shape/shape';
29+
@use '@material/theme/gss';
2830

2931
$ring-radius-default: 8px !default;
3032
$inner-ring-width-default: 2px !default;
@@ -36,7 +38,7 @@ $container-outer-padding-default: 2px !default;
3638
/// Styles applied to the component's inner focus ring element.
3739
///
3840
/// @param $ring-radius [$ring-radius-default] - Focus ring radius, either a
39-
/// single value or a list of radius values to apply.
41+
//// single value or a list of radius values to apply.
4042
/// @param $inner-ring-width [$inner-ring-width-default] - Inner focus ring width.
4143
/// @param $inner-ring-color [$inner-ring-color-default] - Inner focus ring color.
4244
/// @param $outer-ring-width [$outer-ring-width-default] - Outer focus ring width.
@@ -45,6 +47,7 @@ $container-outer-padding-default: 2px !default;
4547
//// - The vertical distance between the focus ring and the container.
4648
/// @param $container-outer-padding-horizontal [$container-outer-padding-default]
4749
//// - The horizontal distance between the focus ring and the container.
50+
/// @param $rtl-reflexive [false] - Whether to flip ring radius corners in RTL.
4851
@mixin focus-ring(
4952
$query: feature-targeting.all(),
5053
$ring-radius: $ring-radius-default,
@@ -53,7 +56,8 @@ $container-outer-padding-default: 2px !default;
5356
$outer-ring-width: $outer-ring-width-default,
5457
$outer-ring-color: $outer-ring-color-default,
5558
$container-outer-padding-vertical: $container-outer-padding-default,
56-
$container-outer-padding-horizontal: $container-outer-padding-default
59+
$container-outer-padding-horizontal: $container-outer-padding-default,
60+
$rtl-reflexive: false
5761
) {
5862
$feat-structure: feature-targeting.create-target($query, structure);
5963

@@ -65,7 +69,10 @@ $container-outer-padding-default: 2px !default;
6569
@include feature-targeting.targets($feat-structure) {
6670
pointer-events: none;
6771
border: $inner-ring-width solid $inner-ring-color;
68-
border-radius: _inner-ring-radius($ring-radius, $outer-ring-width);
72+
@include _border-radius(
73+
_inner-ring-radius($ring-radius, $outer-ring-width),
74+
$rtl-reflexive: $rtl-reflexive
75+
);
6976
box-sizing: content-box;
7077
position: absolute;
7178
top: 50%;
@@ -81,7 +88,7 @@ $container-outer-padding-default: 2px !default;
8188
&::after {
8289
content: '';
8390
border: $outer-ring-width solid $outer-ring-color;
84-
border-radius: $ring-radius;
91+
@include _border-radius($ring-radius, $rtl-reflexive: $rtl-reflexive);
8592
display: block;
8693
position: absolute;
8794
top: 50%;
@@ -163,20 +170,52 @@ $container-outer-padding-default: 2px !default;
163170
/// Customizes the border radius of the button focus ring.
164171
///
165172
/// @param {Number|List} $ring-radius - The border radius of the focus ring,
166-
///. either a single value or a list of radius values to apply.
173+
/// either a single value or a list of radius values to apply.
167174
/// @param {Number} $outer-ring-width [$outer-ring-width] - Width of the outer
168175
/// ring, required to compute the radius for the inner ring.
176+
/// @param $rtl-reflexive [false] - Whether to flip ring radius corners in RTL.
169177
@mixin focus-ring-radius(
170178
$ring-radius,
171179
$outer-ring-width: $outer-ring-width-default,
172-
$query: feature-targeting.all()
180+
$query: feature-targeting.all(),
181+
$rtl-reflexive: false
173182
) {
174183
$feat-structure: feature-targeting.create-target($query, structure);
175184

176185
@include feature-targeting.targets($feat-structure) {
177-
border-radius: _inner-ring-radius($ring-radius, $outer-ring-width);
186+
@include _border-radius(
187+
_inner-ring-radius($ring-radius, $outer-ring-width),
188+
$rtl-reflexive: $rtl-reflexive
189+
);
178190
&::after {
179-
border-radius: $ring-radius;
191+
@include _border-radius($ring-radius, $rtl-reflexive: $rtl-reflexive);
192+
}
193+
}
194+
}
195+
196+
/// Generates a border radius property.
197+
/// @param $radius - The border radius
198+
/// @param $rtl-reflexive - Whether to generate an RTL border radius if needed.
199+
@mixin _border-radius($radius, $rtl-reflexive) {
200+
$has-multiple-corners: meta.type-of($radius) == 'list' and
201+
list.length($radius) > 1;
202+
// Even if $rtl-reflexive is true, only emit RTL styles if we can't easily
203+
// tell that the given radius is symmetrical
204+
$needs-flip: $rtl-reflexive and $has-multiple-corners;
205+
@include gss.annotate(
206+
(
207+
noflip: $needs-flip,
208+
)
209+
);
210+
border-radius: $radius;
211+
@if $needs-flip {
212+
@include rtl.rtl {
213+
@include gss.annotate(
214+
(
215+
noflip: true,
216+
)
217+
);
218+
border-radius: shape.flip-radius($radius);
180219
}
181220
}
182221
}
@@ -190,7 +229,7 @@ $container-outer-padding-default: 2px !default;
190229
/// @return {Number|List} the inner focus ring's border radius.
191230
@function _inner-ring-radius($ring-radius, $outer-ring-width) {
192231
$inner-ring-radius: null;
193-
@if (meta.type-of($ring-radius) == 'list') {
232+
@if meta.type-of($ring-radius) == 'list' {
194233
$inner-ring-radius: ();
195234
@each $radius in $ring-radius {
196235
$inner-radius: math.max($radius - $outer-ring-width, 0);

packages/mdc-focus-ring/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
"dependencies": {
2222
"@material/dom": "^14.0.0",
2323
"@material/feature-targeting": "^14.0.0",
24-
"@material/rtl": "^14.0.0"
24+
"@material/rtl": "^14.0.0",
25+
"@material/shape": "^14.0.0",
26+
"@material/theme": "^14.0.0"
2527
}
2628
}

0 commit comments

Comments
 (0)