@@ -14,12 +14,12 @@ import {DOMRefValue} from '@react-types/shared';
14
14
import { FocusScope } from '@react-aria/focus' ;
15
15
import { FocusStrategy , SpectrumMenuTriggerProps } from '@react-types/menu' ;
16
16
import { MenuContext } from './context' ;
17
- import { Overlay , Popover } from '@react-spectrum/overlays' ;
17
+ import { Overlay , Popover , Tray } from '@react-spectrum/overlays' ;
18
18
import { Placement , useOverlayPosition } from '@react-aria/overlays' ;
19
19
import { PressResponder } from '@react-aria/interactions' ;
20
20
import { Provider } from '@react-spectrum/provider' ;
21
21
import React , { Fragment , useRef , useState } from 'react' ;
22
- import { unwrapDOMRef } from '@react-spectrum/utils' ;
22
+ import { unwrapDOMRef , useMediaQuery } from '@react-spectrum/utils' ;
23
23
import { useControlledState } from '@react-stately/utils' ;
24
24
import { useMenuTrigger } from '@react-aria/menu' ;
25
25
@@ -67,14 +67,43 @@ export function MenuTrigger(props: SpectrumMenuTriggerProps) {
67
67
isOpen
68
68
} ) ;
69
69
70
+ let isMobile = useMediaQuery ( '(max-width: 700px)' ) ;
70
71
let menuContext = {
71
72
...menuProps ,
72
73
focusStrategy,
73
74
onClose,
74
75
closeOnSelect,
75
76
autoFocus : true ,
76
- wrapAround : true
77
+ wrapAround : true ,
78
+ UNSAFE_style : {
79
+ width : isMobile ? '100%' : undefined
80
+ }
77
81
} ;
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
+ }
78
107
79
108
return (
80
109
< Fragment >
@@ -85,11 +114,7 @@ export function MenuTrigger(props: SpectrumMenuTriggerProps) {
85
114
</ Provider >
86
115
< MenuContext . Provider value = { menuContext } >
87
116
< 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 }
93
118
</ Overlay >
94
119
</ MenuContext . Provider >
95
120
</ Fragment >
0 commit comments