Skip to content

Commit a3190b8

Browse files
authored
[navigation menu] Fix duplicate aria-orientation (#4309)
1 parent 6aed040 commit a3190b8

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

packages/react/src/navigation-menu/list/NavigationMenuList.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ export const NavigationMenuList = React.forwardRef(function NavigationMenuList(
6666
// but we want to block it in this case.
6767
// When nested, skip this handler so arrow keys can reach the parent CompositeRoot.
6868
const defaultProps: HTMLProps = nested
69-
? {}
69+
? {
70+
'aria-orientation': orientation,
71+
}
7072
: {
7173
onKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {
7274
const shouldStop =

packages/react/src/navigation-menu/root/NavigationMenuRoot.test.tsx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,44 @@ function TestNestedNavigationMenu(props: NavigationMenu.Root.Props = {}) {
9191
);
9292
}
9393

94+
function TestNavigationMenuOrientationAttributes() {
95+
return (
96+
<NavigationMenu.Root data-testid="top-level-root" defaultValue="item-1" orientation="vertical">
97+
<NavigationMenu.List data-testid="top-level-list">
98+
<NavigationMenu.Item value="item-1">
99+
<NavigationMenu.Trigger>Item 1</NavigationMenu.Trigger>
100+
<NavigationMenu.Content>
101+
<NavigationMenu.Root
102+
data-testid="nested-root"
103+
defaultValue="nested-item-1"
104+
orientation="vertical"
105+
>
106+
<NavigationMenu.List data-testid="nested-list">
107+
<NavigationMenu.Item value="nested-item-1">
108+
<NavigationMenu.Trigger>Nested Item 1</NavigationMenu.Trigger>
109+
<NavigationMenu.Content>
110+
<NavigationMenu.Link href="#nested-link-1">Nested Link 1</NavigationMenu.Link>
111+
</NavigationMenu.Content>
112+
</NavigationMenu.Item>
113+
</NavigationMenu.List>
114+
115+
<NavigationMenu.Viewport />
116+
</NavigationMenu.Root>
117+
</NavigationMenu.Content>
118+
</NavigationMenu.Item>
119+
</NavigationMenu.List>
120+
121+
<NavigationMenu.Portal>
122+
<NavigationMenu.Positioner>
123+
<NavigationMenu.Popup>
124+
<NavigationMenu.Viewport />
125+
</NavigationMenu.Popup>
126+
</NavigationMenu.Positioner>
127+
</NavigationMenu.Portal>
128+
</NavigationMenu.Root>
129+
);
130+
}
131+
94132
function TestInlineNestedNavigationMenu(props: { nestedDefaultValue?: string | null } = {}) {
95133
const { nestedDefaultValue = 'nested-item-1' } = props;
96134
const nestedRootProps =
@@ -794,6 +832,20 @@ describe('<NavigationMenu.Root />', () => {
794832
},
795833
}));
796834

835+
it('applies aria-orientation to the top-level list instead of the root element', async () => {
836+
await render(<TestNavigationMenuOrientationAttributes />);
837+
838+
expect(screen.getByTestId('top-level-root')).not.to.have.attribute('aria-orientation');
839+
expect(screen.getByTestId('top-level-list')).to.have.attribute('aria-orientation', 'vertical');
840+
});
841+
842+
it('applies aria-orientation to nested lists instead of nested root elements', async () => {
843+
await render(<TestNavigationMenuOrientationAttributes />);
844+
845+
expect(screen.getByTestId('nested-root')).not.to.have.attribute('aria-orientation');
846+
expect(screen.getByTestId('nested-list')).to.have.attribute('aria-orientation', 'vertical');
847+
});
848+
797849
describe('interactions', () => {
798850
it('opens on hover with mouse input', async () => {
799851
await render(<TestNavigationMenu />);

packages/react/src/navigation-menu/root/NavigationMenuRoot.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ function TreeContext(props: {
293293
const element = useRenderElement(nested ? 'div' : 'nav', props.componentProps, {
294294
state,
295295
ref: [props.forwardedRef, rootRef],
296-
props: [{ 'aria-orientation': orientation }, elementProps],
296+
props: elementProps,
297297
});
298298

299299
return (

0 commit comments

Comments
 (0)