1+ type MouseNavigationEvent = Pick <
2+ MouseEvent ,
3+ 'altKey' | 'ctrlKey' | 'shiftKey' | 'metaKey' | 'button' | 'currentTarget' | 'defaultPrevented' | 'target'
4+ >
5+
6+ type KeyboardNavigationEvent = Pick < KeyboardEvent , 'currentTarget' | 'defaultPrevented' | 'key' | 'target' >
7+
8+ function isContentEditableOrPrevented ( event : KeyboardNavigationEvent | MouseNavigationEvent ) : boolean {
9+ return ( event . target instanceof HTMLElement && event . target . isContentEditable ) || event . defaultPrevented
10+ }
11+
112/**
213 * Determine if this mouse event should be intercepted for navigation purposes.
314 * Links with modifier keys or non-left clicks should not be intercepted.
415 * Content editable elements and prevented events are ignored.
516 */
6- export function shouldIntercept (
7- event : Pick <
8- MouseEvent ,
9- 'altKey' | 'ctrlKey' | 'defaultPrevented' | 'target' | 'currentTarget' | 'metaKey' | 'shiftKey' | 'button'
10- > ,
11- ) : boolean {
17+ export function shouldIntercept ( event : MouseNavigationEvent ) : boolean {
1218 const isLink = ( event . currentTarget as HTMLElement ) . tagName . toLowerCase ( ) === 'a'
1319
1420 return ! (
15- ( event . target && ( event ?. target as HTMLElement ) . isContentEditable ) ||
16- event . defaultPrevented ||
21+ isContentEditableOrPrevented ( event ) ||
1722 ( isLink && event . altKey ) ||
1823 ( isLink && event . ctrlKey ) ||
1924 ( isLink && event . metaKey ) ||
@@ -27,8 +32,8 @@ export function shouldIntercept(
2732 * Enter triggers navigation for both links and buttons currently.
2833 * Space only triggers navigation for buttons specifically.
2934 */
30- export function shouldNavigate ( event : Pick < KeyboardEvent , 'key' | 'currentTarget' > ) : boolean {
35+ export function shouldNavigate ( event : KeyboardNavigationEvent ) : boolean {
3136 const isButton = ( event . currentTarget as HTMLElement ) . tagName . toLowerCase ( ) === 'button'
3237
33- return event . key === 'Enter' || ( isButton && event . key === ' ' )
38+ return ! isContentEditableOrPrevented ( event ) && ( event . key === 'Enter' || ( isButton && event . key === ' ' ) )
3439}
0 commit comments