Skip to content

Commit fcaf3f5

Browse files
authored
Merge pull request #3191 from tespin/tespin-fix/menu-ally
Adds menubar ARIA semantics to editor menu
2 parents 88b97b2 + 6b8ccd5 commit fcaf3f5

File tree

9 files changed

+148
-57
lines changed

9 files changed

+148
-57
lines changed

client/components/Dropdown/DropdownMenu.jsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const DropdownMenu = forwardRef(
3838
};
3939

4040
return (
41-
<div ref={anchorRef} className={className}>
41+
<div ref={anchorRef} className={className} aria-haspopup="menu">
4242
<button
4343
className={classes.button}
4444
aria-label={ariaLabel}
@@ -51,6 +51,7 @@ const DropdownMenu = forwardRef(
5151
</button>
5252
{isOpen && (
5353
<DropdownWrapper
54+
role="menu"
5455
className={classes.list}
5556
align={align}
5657
onMouseUp={() => {

client/components/Dropdown/MenuItem.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function MenuItem({ hideIf, ...rest }) {
1010
}
1111

1212
return (
13-
<li>
13+
<li role="menuitem">
1414
<ButtonOrLink {...rest} />
1515
</li>
1616
);

client/components/Nav/NavBar.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ function NavBar({ children, className }) {
6969
return (
7070
<NavBarContext.Provider value={contextValue}>
7171
<header>
72-
<nav className={className} ref={nodeRef}>
72+
<div className={className} ref={nodeRef}>
7373
<MenuOpenContext.Provider value={dropdownOpen}>
7474
{children}
7575
</MenuOpenContext.Provider>
76-
</nav>
76+
</div>
7777
</header>
7878
</NavBarContext.Provider>
7979
);

client/components/Nav/NavDropdownMenu.jsx

+7-2
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,20 @@ function NavDropdownMenu({ id, title, children }) {
2424

2525
return (
2626
<li className={classNames('nav__item', isOpen && 'nav__item--open')}>
27-
<button {...handlers}>
27+
<button
28+
{...handlers}
29+
role="menuitem"
30+
aria-haspopup="menu"
31+
aria-expanded={isOpen}
32+
>
2833
<span className="nav__item-header">{title}</span>
2934
<TriangleIcon
3035
className="nav__item-header-triangle"
3136
focusable="false"
3237
aria-hidden="true"
3338
/>
3439
</button>
35-
<ul className="nav__dropdown">
40+
<ul className="nav__dropdown" role="menu">
3641
<ParentMenuContext.Provider value={id}>
3742
{children}
3843
</ParentMenuContext.Provider>

client/components/Nav/NavMenuItem.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function NavMenuItem({ hideIf, className, ...rest }) {
1919

2020
return (
2121
<li className={className}>
22-
<ButtonOrLink {...rest} {...handlers} />
22+
<ButtonOrLink {...rest} {...handlers} role="menuitem" />
2323
</li>
2424
);
2525
}

client/index.integration.test.jsx

+6-6
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ describe('index.jsx integration', () => {
7373
});
7474

7575
it('navbar items and the dropdowns in the navbar exist', () => {
76-
const navigation = screen.getByRole('navigation');
76+
const navigation = screen.getByRole('menubar');
7777
expect(navigation).toBeInTheDocument();
7878

79-
const fileButton = within(navigation).getByRole('button', {
79+
const fileButton = within(navigation).getByRole('menuitem', {
8080
name: /^file$/i
8181
});
8282
expect(fileButton).toBeInTheDocument();
8383

84-
const newFileButton = within(navigation).getByRole('button', {
84+
const newFileButton = within(navigation).getByRole('menuitem', {
8585
name: /^new$/i
8686
});
8787
expect(newFileButton).toBeInTheDocument();
@@ -91,17 +91,17 @@ describe('index.jsx integration', () => {
9191
// const exampleFileButton = within(navigation).getByRole('link', {name: /^examples$/i});
9292
// expect(exampleFileButton).toBeInTheDocument();
9393

94-
const editButton = within(navigation).getByRole('button', {
94+
const editButton = within(navigation).getByRole('menuitem', {
9595
name: /^edit$/i
9696
});
9797
expect(editButton).toBeInTheDocument();
9898

99-
const sketchButton = within(navigation).getByRole('button', {
99+
const sketchButton = within(navigation).getByRole('menuitem', {
100100
name: /^sketch$/i
101101
});
102102
expect(sketchButton).toBeInTheDocument();
103103

104-
const helpButton = within(navigation).getByRole('button', {
104+
const helpButton = within(navigation).getByRole('menuitem', {
105105
name: /^help$/i
106106
});
107107
expect(helpButton).toBeInTheDocument();

client/modules/IDE/components/Header/Nav.jsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ const ProjectMenu = () => {
135135
metaKey === 'Ctrl' ? `${metaKeyName}+H` : `${metaKeyName}+⌥+F`;
136136

137137
return (
138-
<ul className="nav__items-left">
138+
<ul className="nav__items-left" role="menubar">
139139
<li className="nav__item-logo">
140140
{user && user.username !== undefined ? (
141141
<Link to={userSketches}>
@@ -272,18 +272,18 @@ const LanguageMenu = () => {
272272
const UnauthenticatedUserMenu = () => {
273273
const { t } = useTranslation();
274274
return (
275-
<ul className="nav__items-right" title="user-menu">
275+
<ul className="nav__items-right" title="user-menu" role="navigation">
276276
{getConfig('TRANSLATIONS_ENABLED') && <LanguageMenu />}
277277
<li className="nav__item">
278-
<Link to="/login" className="nav__auth-button">
278+
<Link to="/login" className="nav__auth-button" role="menuitem">
279279
<span className="nav__item-header" title="Login">
280280
{t('Nav.Login')}
281281
</span>
282282
</Link>
283283
</li>
284284
<li className="nav__item-or">{t('Nav.LoginOr')}</li>
285285
<li className="nav__item">
286-
<Link to="/signup" className="nav__auth-button">
286+
<Link to="/signup" className="nav__auth-button" role="menuitem">
287287
<span className="nav__item-header" title="SignUp">
288288
{t('Nav.SignUp')}
289289
</span>
@@ -300,7 +300,7 @@ const AuthenticatedUserMenu = () => {
300300
const dispatch = useDispatch();
301301

302302
return (
303-
<ul className="nav__items-right" title="user-menu">
303+
<ul className="nav__items-right" title="user-menu" role="navigation">
304304
{getConfig('TRANSLATIONS_ENABLED') && <LanguageMenu />}
305305
<NavDropdownMenu
306306
id="account"

0 commit comments

Comments
 (0)