Skip to content

Commit 486ed7c

Browse files
devongovettsnowystingerdannify
authored
Make MenuTrigger render menus in a Tray on mobile (#333)
Co-authored-by: Robert Snow <rsnow@adobe.com> Co-authored-by: Danni <drobinson@livefyre.com>
1 parent f079ea1 commit 486ed7c

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

packages/@react-spectrum/menu/src/MenuTrigger.tsx

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ import {DOMRefValue} from '@react-types/shared';
1414
import {FocusScope} from '@react-aria/focus';
1515
import {FocusStrategy, SpectrumMenuTriggerProps} from '@react-types/menu';
1616
import {MenuContext} from './context';
17-
import {Overlay, Popover} from '@react-spectrum/overlays';
17+
import {Overlay, Popover, Tray} from '@react-spectrum/overlays';
1818
import {Placement, useOverlayPosition} from '@react-aria/overlays';
1919
import {PressResponder} from '@react-aria/interactions';
2020
import {Provider} from '@react-spectrum/provider';
2121
import React, {Fragment, useRef, useState} from 'react';
22-
import {unwrapDOMRef} from '@react-spectrum/utils';
22+
import {unwrapDOMRef, useMediaQuery} from '@react-spectrum/utils';
2323
import {useControlledState} from '@react-stately/utils';
2424
import {useMenuTrigger} from '@react-aria/menu';
2525

@@ -67,14 +67,43 @@ export function MenuTrigger(props: SpectrumMenuTriggerProps) {
6767
isOpen
6868
});
6969

70+
let isMobile = useMediaQuery('(max-width: 700px)');
7071
let menuContext = {
7172
...menuProps,
7273
focusStrategy,
7374
onClose,
7475
closeOnSelect,
7576
autoFocus: true,
76-
wrapAround: true
77+
wrapAround: true,
78+
UNSAFE_style: {
79+
width: isMobile ? '100%' : undefined
80+
}
7781
};
82+
83+
// On small screen devices, the menu is rendered in a tray, otherwise a popover.
84+
let overlay;
85+
if (isMobile) {
86+
overlay = (
87+
<Tray isOpen={isOpen} onClose={() => setOpen(false)}>
88+
<FocusScope restoreFocus>
89+
{menu}
90+
</FocusScope>
91+
</Tray>
92+
);
93+
} else {
94+
overlay = (
95+
<Popover
96+
{...overlayProps}
97+
ref={menuPopoverRef}
98+
placement={placement}
99+
hideArrow
100+
onClose={() => setOpen(false)}>
101+
<FocusScope restoreFocus>
102+
{menu}
103+
</FocusScope>
104+
</Popover>
105+
);
106+
}
78107

79108
return (
80109
<Fragment>
@@ -85,11 +114,7 @@ export function MenuTrigger(props: SpectrumMenuTriggerProps) {
85114
</Provider>
86115
<MenuContext.Provider value={menuContext}>
87116
<Overlay isOpen={isOpen} ref={containerRef}>
88-
<Popover {...overlayProps} ref={menuPopoverRef} hideArrow placement={placement} onClose={onClose}>
89-
<FocusScope restoreFocus>
90-
{menu}
91-
</FocusScope>
92-
</Popover>
117+
{overlay}
93118
</Overlay>
94119
</MenuContext.Provider>
95120
</Fragment>

0 commit comments

Comments
 (0)