Skip to content

Commit 134bafc

Browse files
Westbrook JohnsonWestbrook
authored andcommitted
fix: allow sp-dropdown to accept focus visibly from sp-field-label
1 parent 21d7dfe commit 134bafc

File tree

5 files changed

+52
-10
lines changed

5 files changed

+52
-10
lines changed

packages/button/src/spectrum-config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ const config = {
4747
selector: '.spectrum-FieldButton--quiet',
4848
name: 'quiet',
4949
},
50+
{
51+
type: 'boolean',
52+
selector: '.is-focused',
53+
name: 'focused',
54+
},
5055
],
5156
classes: [
5257
{

packages/button/src/spectrum-fieldbutton.css

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
133133
);
134134
}
135135
.button:focus-visible,
136-
.button.is-focused {
136+
:host([focused]) .button {
137137
/* .spectrum-FieldButton.focus-ring,
138138
* .spectrum-FieldButton.is-focused */
139139
background-color: var(
@@ -156,7 +156,7 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
156156
);
157157
}
158158
.button:focus-visible.is-placeholder,
159-
.button.is-focused.is-placeholder {
159+
:host([focused]) .button.is-placeholder {
160160
/* .spectrum-FieldButton.focus-ring.is-placeholder,
161161
* .spectrum-FieldButton.is-focused.is-placeholder */
162162
color: var(
@@ -188,7 +188,7 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
188188
);
189189
}
190190
:host([invalid]) .button:focus-visible,
191-
:host([invalid]) .button.is-focused {
191+
:host([invalid][focused]) .button {
192192
/* .spectrum-FieldButton.is-invalid.focus-ring,
193193
* .spectrum-FieldButton.is-invalid.is-focused */
194194
border-color: var(
@@ -251,7 +251,7 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
251251
);
252252
}
253253
:host([quiet]) .button:focus-visible,
254-
:host([quiet]) .button.is-focused {
254+
:host([quiet][focused]) .button {
255255
/* .spectrum-FieldButton--quiet.focus-ring,
256256
* .spectrum-FieldButton--quiet.is-focused */
257257
background-color: var(
@@ -265,7 +265,7 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
265265
);
266266
}
267267
:host([quiet]) .button:focus-visible.is-placeholder,
268-
:host([quiet]) .button.is-focused.is-placeholder {
268+
:host([quiet][focused]) .button.is-placeholder {
269269
/* .spectrum-FieldButton--quiet.focus-ring.is-placeholder,
270270
* .spectrum-FieldButton--quiet.is-focused.is-placeholder */
271271
color: var(
@@ -287,9 +287,9 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
287287
);
288288
}
289289
:host([quiet]) .button.is-selected:focus-visible,
290-
:host([quiet]) .button.is-selected.is-focused,
290+
:host([quiet][focused]) .button.is-selected,
291291
:host([quiet]) .button:active:focus-visible,
292-
:host([quiet]) .button:active.is-focused {
292+
:host([quiet][focused]) .button:active {
293293
/* .spectrum-FieldButton--quiet.is-selected.focus-ring,
294294
* .spectrum-FieldButton--quiet.is-selected.is-focused,
295295
* .spectrum-FieldButton--quiet:active.focus-ring,
@@ -305,7 +305,7 @@ THIS FILE IS MACHINE GENERATED. DO NOT EDIT */
305305
);
306306
}
307307
:host([quiet][invalid]) .button:focus-visible,
308-
:host([quiet][invalid]) .button.is-focused {
308+
:host([quiet][invalid][focused]) .button {
309309
/* .spectrum-FieldButton--quiet.is-invalid.focus-ring,
310310
* .spectrum-FieldButton--quiet.is-invalid.is-focused */
311311
box-shadow: 0 2px 0 0

packages/dropdown/src/Dropdown.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ export class DropdownBase extends Focusable {
8282
@property({ type: Boolean, reflect: true })
8383
public disabled = false;
8484

85+
@property({ type: Boolean, reflect: true })
86+
public focused = false;
87+
8588
@property({ type: Boolean, reflect: true })
8689
public invalid = false;
8790

@@ -145,11 +148,12 @@ export class DropdownBase extends Focusable {
145148
return this.button;
146149
}
147150

148-
public click(): void {
149-
this.focusElement.click();
151+
public forceFocusVisible(): void {
152+
this.focused = true;
150153
}
151154

152155
public onButtonBlur(): void {
156+
this.focused = false;
153157
(this.target as HTMLButtonElement).removeEventListener(
154158
'keydown',
155159
this.onKeydown

packages/dropdown/src/dropdown.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,25 @@ governing permissions and limitations under the License.
1414
sp-popover {
1515
display: none;
1616
}
17+
18+
/**
19+
* The accessibility team would prefer that it be possible to override the :focus-visible
20+
* heuristics in _some_ cases, like when clicking an `sp-field-label`...
21+
*
22+
* From Picker
23+
**/
24+
:host([focused]:not([quiet])) #button #label.placeholder {
25+
/* .spectrum-Picker-trigger.focus-ring .spectrum-Picker-label.is-placeholder */
26+
color: var(
27+
--spectrum-picker-placeholder-text-color-key-focus,
28+
var(--spectrum-alias-placeholder-text-color-hover)
29+
);
30+
}
31+
32+
:host([focused]:not([quiet])) #button .dropdown {
33+
/* .spectrum-Picker-trigger.focus-ring .spectrum-Picker-icon */
34+
color: var(
35+
--spectrum-picker-icon-color-key-focus,
36+
var(--spectrum-alias-icon-color-focus)
37+
);
38+
}

packages/field-label/src/FieldLabel.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import asterickIconStyles from '@spectrum-web-components/icon/src/spectrum-icon-
2525

2626
import styles from './field-label.css.js';
2727

28+
type AcceptsFocusVisisble = HTMLElement & { forceFocusVisible?(): void };
29+
2830
/**
2931
* @element sp-field-label
3032
*/
@@ -55,6 +57,15 @@ export class FieldLabel extends SpectrumElement {
5557
private handleClick(): void {
5658
if (!this.target || this.disabled) return;
5759
this.target.focus();
60+
const parent = this.getRootNode() as ShadowRoot;
61+
const target = this.target as AcceptsFocusVisisble;
62+
const targetParent = target.getRootNode() as ShadowRoot;
63+
const targetHost = targetParent.host as AcceptsFocusVisisble;
64+
if (targetParent.isSameNode(parent) && target.forceFocusVisible) {
65+
target.forceFocusVisible();
66+
} else if (targetHost && targetHost.forceFocusVisible) {
67+
targetHost.forceFocusVisible();
68+
}
5869
}
5970

6071
private async manageFor(): Promise<void> {

0 commit comments

Comments
 (0)