@@ -32,9 +32,9 @@ import {centerBaseline} from './CenterBaseline';
32
32
import { centerPadding , getAllowedOverrides , StyleProps } from './style-utils' with { type : 'macro' } ;
33
33
import CheckmarkIcon from '../ui-icons/Checkmark' ;
34
34
import ChevronRightIcon from '../ui-icons/Chevron' ;
35
- import { createContext , forwardRef , JSX , ReactNode , useContext , useRef } from 'react' ;
35
+ import { createContext , forwardRef , JSX , ReactNode , useContext , useRef , useState } from 'react' ;
36
36
import { divider } from './Divider' ;
37
- import { DOMRef , DOMRefValue } from '@react-types/shared' ;
37
+ import { DOMRef , DOMRefValue , PressEvent } from '@react-types/shared' ;
38
38
import { forwardRefType } from './types' ;
39
39
import { HeaderContext , HeadingContext , KeyboardContext , Text , TextContext } from './Content' ;
40
40
import { IconContext } from './Icon' ; // chevron right removed??
@@ -45,6 +45,7 @@ import {Placement, useLocale} from 'react-aria';
45
45
import { PopoverBase } from './Popover' ;
46
46
import { PressResponder } from '@react-aria/interactions' ;
47
47
import { pressScale } from './pressScale' ;
48
+ import { useGlobalListeners } from '@react-aria/utils' ;
48
49
import { useSpectrumContextProps } from './useSpectrumContextProps' ;
49
50
// viewbox on LinkOut is super weird just because i copied the icon from designs...
50
51
// need to strip id's from icons
@@ -520,6 +521,23 @@ export function MenuItem(props: MenuItemProps) {
520
521
* linking the Menu's open state with the trigger's press state.
521
522
*/
522
523
function MenuTrigger ( props : MenuTriggerProps ) {
524
+ // RAC sets isPressed via PressResponder when the menu is open.
525
+ // We don't want press scaling to appear to get "stuck", so override this.
526
+ // For mouse interactions, menus open on press start. When the popover underlay appears
527
+ // it covers the trigger button, causing onPressEnd to fire immediately and no press scaling
528
+ // to occur. We override this by listening for pointerup on the document ourselves.
529
+ let [ isPressed , setPressed ] = useState ( false ) ;
530
+ let { addGlobalListener} = useGlobalListeners ( ) ;
531
+ let onPressStart = ( e : PressEvent ) => {
532
+ if ( e . pointerType !== 'mouse' ) {
533
+ return ;
534
+ }
535
+ setPressed ( true ) ;
536
+ addGlobalListener ( document , 'pointerup' , ( ) => {
537
+ setPressed ( false ) ;
538
+ } , { once : true , capture : true } ) ;
539
+ } ;
540
+
523
541
return (
524
542
< InternalMenuTriggerContext . Provider
525
543
value = { {
@@ -528,9 +546,7 @@ function MenuTrigger(props: MenuTriggerProps) {
528
546
shouldFlip : props . shouldFlip
529
547
} } >
530
548
< AriaMenuTrigger { ...props } >
531
- { /* RAC sets isPressed via PressResponder when the menu is open.
532
- We don't want press scaling to appear to get "stuck", so override this. */ }
533
- < PressResponder isPressed = { false } >
549
+ < PressResponder onPressStart = { onPressStart } isPressed = { isPressed } >
534
550
{ props . children }
535
551
</ PressResponder >
536
552
</ AriaMenuTrigger >
0 commit comments