25
25
@use ' @material/feature-targeting/feature-targeting' ;
26
26
@use ' @material/rtl/rtl' ;
27
27
@use ' @material/dom/dom' ;
28
+ @use ' @material/shape/shape' ;
29
+ @use ' @material/theme/gss' ;
28
30
29
31
$ring-radius-default : 8px !default ;
30
32
$inner-ring-width-default : 2px !default ;
@@ -36,7 +38,7 @@ $container-outer-padding-default: 2px !default;
36
38
/// Styles applied to the component's inner focus ring element.
37
39
///
38
40
/// @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.
40
42
/// @param $inner-ring-width [$inner-ring-width-default] - Inner focus ring width.
41
43
/// @param $inner-ring-color [$inner-ring-color-default] - Inner focus ring color.
42
44
/// @param $outer-ring-width [$outer-ring-width-default] - Outer focus ring width.
@@ -45,6 +47,7 @@ $container-outer-padding-default: 2px !default;
45
47
/// / - The vertical distance between the focus ring and the container.
46
48
/// @param $container-outer-padding-horizontal [$container-outer-padding-default]
47
49
/// / - The horizontal distance between the focus ring and the container.
50
+ /// @param $rtl-reflexive [false] - Whether to flip ring radius corners in RTL.
48
51
@mixin focus-ring (
49
52
$query : feature-targeting .all (),
50
53
$ring-radius : $ring-radius-default ,
@@ -53,7 +56,8 @@ $container-outer-padding-default: 2px !default;
53
56
$outer-ring-width : $outer-ring-width-default ,
54
57
$outer-ring-color : $outer-ring-color-default ,
55
58
$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
57
61
) {
58
62
$feat-structure : feature-targeting .create-target ($query , structure );
59
63
@@ -65,7 +69,10 @@ $container-outer-padding-default: 2px !default;
65
69
@include feature-targeting .targets ($feat-structure ) {
66
70
pointer-events : none ;
67
71
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
+ );
69
76
box-sizing : content-box ;
70
77
position : absolute ;
71
78
top : 50% ;
@@ -81,7 +88,7 @@ $container-outer-padding-default: 2px !default;
81
88
& ::after {
82
89
content : ' ' ;
83
90
border : $outer-ring-width solid $outer-ring-color ;
84
- border -radius: $ring-radius ;
91
+ @include _border -radius( $ring-radius , $rtl-reflexive : $rtl-reflexive ) ;
85
92
display : block ;
86
93
position : absolute ;
87
94
top : 50% ;
@@ -163,20 +170,52 @@ $container-outer-padding-default: 2px !default;
163
170
/// Customizes the border radius of the button focus ring.
164
171
///
165
172
/// @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.
167
174
/// @param {Number} $outer-ring-width [$outer-ring-width] - Width of the outer
168
175
/// ring, required to compute the radius for the inner ring.
176
+ /// @param $rtl-reflexive [false] - Whether to flip ring radius corners in RTL.
169
177
@mixin focus-ring-radius (
170
178
$ring-radius ,
171
179
$outer-ring-width : $outer-ring-width-default ,
172
- $query : feature-targeting .all ()
180
+ $query : feature-targeting .all (),
181
+ $rtl-reflexive : false
173
182
) {
174
183
$feat-structure : feature-targeting .create-target ($query , structure );
175
184
176
185
@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
+ );
178
190
& ::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 );
180
219
}
181
220
}
182
221
}
@@ -190,7 +229,7 @@ $container-outer-padding-default: 2px !default;
190
229
/// @return {Number|List} the inner focus ring's border radius.
191
230
@function _inner-ring-radius ($ring-radius , $outer-ring-width ) {
192
231
$inner-ring-radius : null;
193
- @if ( meta .type-of ($ring-radius ) == ' list' ) {
232
+ @if meta .type-of ($ring-radius ) == ' list' {
194
233
$inner-ring-radius : ();
195
234
@each $radius in $ring-radius {
196
235
$inner-radius : math .max ($radius - $outer-ring-width , 0 );
0 commit comments