Skip to content

fix: Ensure that opening a submenu via enter/space moves focus to first item in submenu#9691

Merged
LFDanLu merged 2 commits intomainfrom
fix_9686
Feb 27, 2026
Merged

fix: Ensure that opening a submenu via enter/space moves focus to first item in submenu#9691
LFDanLu merged 2 commits intomainfrom
fix_9686

Conversation

@LFDanLu
Copy link
Member

@LFDanLu LFDanLu commented Feb 24, 2026

Closes #9686

✅ Pull Request Checklist:

  • Included link to corresponding React Spectrum GitHub Issue.
  • Added/updated unit tests and storybook for this change (for new code or code which already has tests).
  • Filled out test instructions.
  • Updated documentation (if it already exists for this component).
  • Looked at the Accessibility Practices for this feature - Aria Practices

📝 Test Instructions:

Go to RAC Submenu story and make sure that Enter/Space opens the submenu and that focus lands on the first item in the submenu. Pressing Enter/Space again should trigger the submenu item

🧢 Your Project:

RSP

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tried writing a test for this but it passes without the change since the timing isn't quite the same as in browser. Will be worth writing one in chromatic using the actions or via the real browser test PR when that goes in

@rspbot
Copy link

rspbot commented Feb 24, 2026

interaction.current = {pointerType: 'keyboard', key: ' '};
(getEventTarget(e) as HTMLElement).click();

// click above sets modality to "virutal", need to set interaction modality back to 'keyboard' so focusSafely calls properly move focus
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// click above sets modality to "virutal", need to set interaction modality back to 'keyboard' so focusSafely calls properly move focus
// click above sets modality to "virtual", need to set interaction modality back to 'keyboard' so focusSafely calls properly move focus

Comment on lines +303 to +304
// click above sets modality to "virutal", need to set interaction modality back to 'keyboard' so focusSafely calls properly move focus
// to the newly opened submenu's first item.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// click above sets modality to "virutal", need to set interaction modality back to 'keyboard' so focusSafely calls properly move focus
// to the newly opened submenu's first item.
// click above sets modality to "virtual", need to set interaction modality back to 'keyboard' so focusSafely calls properly move focus
// to the newly opened submenu's first item.

@rspbot
Copy link

rspbot commented Feb 27, 2026

@rspbot
Copy link

rspbot commented Feb 27, 2026

## API Changes

@react-spectrum/s2

/@react-spectrum/s2:TreeView

 TreeView <T extends {}> {
   UNSAFE_className?: UnsafeClassName
   UNSAFE_style?: CSSProperties
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | (T) => ReactNode
   defaultExpandedKeys?: Iterable<Key>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledBehavior?: DisabledBehavior = 'all'
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   expandedKeys?: Iterable<Key>
   id?: string
   items?: Iterable<T>
   onAction?: (Key) => void
   onExpandedChange?: (Set<Key>) => any
   onSelectionChange?: (Selection) => void
-  renderActionBar?: ('all' | Set<Key>) => ReactElement
   renderEmptyState?: (TreeEmptyStateRenderProps) => ReactNode
   selectedKeys?: 'all' | Iterable<Key>
   selectionMode?: SelectionMode
   shouldSelectOnPressUp?: boolean
   styles?: StylesPropWithHeight
 }

/@react-spectrum/s2:TreeViewProps

 TreeViewProps <T> {
   UNSAFE_className?: UnsafeClassName
   UNSAFE_style?: CSSProperties
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | (T) => ReactNode
   defaultExpandedKeys?: Iterable<Key>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledBehavior?: DisabledBehavior = 'all'
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   expandedKeys?: Iterable<Key>
   id?: string
   items?: Iterable<T>
   onAction?: (Key) => void
   onExpandedChange?: (Set<Key>) => any
   onSelectionChange?: (Selection) => void
-  renderActionBar?: ('all' | Set<Key>) => ReactElement
   renderEmptyState?: (TreeEmptyStateRenderProps) => ReactNode
   selectedKeys?: 'all' | Iterable<Key>
   selectionMode?: SelectionMode
   shouldSelectOnPressUp?: boolean
   styles?: StylesPropWithHeight
 }

@LFDanLu LFDanLu added this pull request to the merge queue Feb 27, 2026
Merged via the queue into main with commit f3f957a Feb 27, 2026
29 checks passed
@LFDanLu LFDanLu deleted the fix_9686 branch February 27, 2026 23:48
pioug pushed a commit to pioug/react-spectrum that referenced this pull request Feb 28, 2026
…aseline-tracker

* origin/main:
  feat(S2): S2 ListView (adobe#8878)
  refactor: Centralize expandedKeys logic in TreeCollection (adobe#9711)
  chore: Warn if user has interactive elements in their custom Picker value (adobe#9710)
  feat: S2 unavailable menu item (adobe#9657)
  fix: Ensure that opening a submenu via enter/space moves focus to first item in submenu (adobe#9691)
  fix: prevent docs crash by making template elements always append children into .content (adobe#9703)
  docs(RAC): Add TreeSection docs (adobe#9699)
  docs(S2): add Typography search view (adobe#9524)
  docs(S2): fix clipping in Picker custom value AvatarGroup example (adobe#9702)
  fix: patch additional methods so React doesnt break with template elements (adobe#9385)
  tentative fix (adobe#9635)
  docs(S2): fix icon import clipboard content to add underscore for icons starting with number (adobe#9698)
  feat(S2): add ActionBar support to TreeView (adobe#9695)
  fix: combobox interactoutside (adobe#9646)
  fix: skip native Date fast path when local timezone is overridden via setLocalTimeZone (adobe#9678)
  chore: update storybook to 9 (adobe#8634)
  docs: improve custom render value S2 Picker example (adobe#9682)

# Conflicts:
#	yarn.lock
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cannot invoke action with "enter" key on first menu item of submenu after opening submenu with "enter" key.

5 participants