Skip to content

Commit d1c3c30

Browse files
authored
fix(clerk-js): Add aria-label and aria-expanded in menu trigger (#3446)
1 parent 0deaf07 commit d1c3c30

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

.changeset/tall-fans-flow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
---
4+
5+
Add `aria-label` and `aria-expanded` in menu trigger to improve accessibility

packages/clerk-js/src/ui/elements/Menu.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ export const Menu = withFloatingTree((props: MenuProps) => {
4444
);
4545
});
4646

47-
type MenuTriggerProps = React.PropsWithChildren<Record<never, never>>;
47+
type MenuTriggerProps = React.PropsWithChildren<{ arialLabel?: string | ((open: boolean) => string) }>;
4848

4949
export const MenuTrigger = (props: MenuTriggerProps) => {
50-
const { children } = props;
50+
const { children, arialLabel } = props;
5151
const { popoverCtx, elementId } = useMenuState();
52-
const { reference, toggle } = popoverCtx;
52+
const { reference, toggle, isOpen } = popoverCtx;
53+
54+
const normalizedAriaLabel = typeof arialLabel === 'function' ? arialLabel(isOpen) : arialLabel;
5355

5456
if (!isValidElement(children)) {
5557
return null;
@@ -60,6 +62,8 @@ export const MenuTrigger = (props: MenuTriggerProps) => {
6062
ref: reference,
6163
elementDescriptor: children.props.elementDescriptor || descriptors.menuButton,
6264
elementId: children.props.elementId || descriptors.menuButton.setId(elementId),
65+
'aria-label': normalizedAriaLabel,
66+
'aria-expanded': isOpen,
6367
onClick: (e: React.MouseEvent) => {
6468
children.props?.onClick?.(e);
6569
toggle();

packages/clerk-js/src/ui/elements/ThreeDotsMenu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const ThreeDotsMenu = (props: ThreeDotsMenuProps) => {
2121
const { actions, elementId } = props;
2222
return (
2323
<Menu elementId={elementId}>
24-
<MenuTrigger>
24+
<MenuTrigger arialLabel={isOpen => `${isOpen ? 'Close' : 'Open'} menu`}>
2525
<Button
2626
sx={t => ({
2727
padding: t.space.$0x5,

0 commit comments

Comments
 (0)