diff --git a/packages/@react-aria/listbox/src/useOption.ts b/packages/@react-aria/listbox/src/useOption.ts index 8ad4c296322..a963a1089c4 100644 --- a/packages/@react-aria/listbox/src/useOption.ts +++ b/packages/@react-aria/listbox/src/useOption.ts @@ -11,10 +11,10 @@ */ import {HTMLAttributes, Key, RefObject} from 'react'; +import {isFocusVisible, useHover, usePress} from '@react-aria/interactions'; import {ListState} from '@react-stately/list'; -import {useHover, usePress} from '@react-aria/interactions'; +import {mergeProps, useSlotId} from '@react-aria/utils'; import {useSelectableItem} from '@react-aria/selection'; -import {useSlotId} from '@react-aria/utils'; interface OptionAria { /** Props for the option element. */ @@ -92,19 +92,21 @@ export function useOption(props: AriaOptionProps, state: ListState, ref: R }); let {pressProps} = usePress({...itemProps, isDisabled}); + let {hoverProps} = useHover({ isDisabled: isDisabled || !shouldFocusOnHover, onHoverStart() { - state.selectionManager.setFocused(true); - state.selectionManager.setFocusedKey(key); + if (!isFocusVisible()) { + state.selectionManager.setFocused(true); + state.selectionManager.setFocusedKey(key); + } } }); return { optionProps: { ...optionProps, - ...pressProps, - ...hoverProps + ...mergeProps(pressProps, hoverProps) }, labelProps: { id: labelId diff --git a/packages/@react-aria/menu/src/useMenuItem.ts b/packages/@react-aria/menu/src/useMenuItem.ts index 017fd8b3691..2677c824150 100644 --- a/packages/@react-aria/menu/src/useMenuItem.ts +++ b/packages/@react-aria/menu/src/useMenuItem.ts @@ -11,10 +11,10 @@ */ import {HTMLAttributes, Key, RefObject} from 'react'; +import {isFocusVisible, useHover, usePress} from '@react-aria/interactions'; import {mergeProps, useSlotId} from '@react-aria/utils'; import {PressEvent} from '@react-types/shared'; import {TreeState} from '@react-stately/tree'; -import {useHover, usePress} from '@react-aria/interactions'; import {useSelectableItem} from '@react-aria/selection'; interface MenuItemAria { @@ -149,16 +149,17 @@ export function useMenuItem(props: AriaMenuItemProps, state: TreeState, re let {hoverProps} = useHover({ isDisabled, onHoverStart() { - state.selectionManager.setFocused(true); - state.selectionManager.setFocusedKey(key); + if (!isFocusVisible()) { + state.selectionManager.setFocused(true); + state.selectionManager.setFocusedKey(key); + } } }); return { menuItemProps: { ...ariaProps, - ...pressProps, - ...hoverProps + ...mergeProps(pressProps, hoverProps) }, labelProps: { id: labelId