Follow-up to #13491 and #13910.
What happened
In NVDA browse mode, the sidebar thread list is not announced as a list, and the Snooze and Settle buttons on each row cannot be reached. Before #13491, NVDA reached them.
Diagnosis
Each thread row is a <div role="button"> with real buttons nested inside it: Snooze, Settle, Un-settle, Wake, Unpin, Dismiss Woke, and the PR badge. Draft rows nest Discard.
Whether VoiceOver makes users interact with a list depends on their web navigation setting. Lists require interaction under "Grouping items" but not under "DOM order" (Apple).
Steps to reproduce
- On Windows, run NVDA and open T3 Code (desktop, or web in Chrome or Firefox).
- In browse mode, press L to move to the thread list.
- Arrow through an active thread row.
Environment
main @ de251fc, Windows 11, latest stable NVDA and Chrome.
Workaround
The row's context menu (Applications key) includes Settle, Snooze, and Pin.
Proposed fix
Give each row one native button that opens the thread, named by its title. Put the row actions in the same <li> as siblings of that button, not inside it, and keep role="list". The button fills the row behind its content, so nothing changes visually: layout, colors, and the focus ring match main in Chromium.
In Sarah Higley's secondary actions study, buttons placed next to a tab worked in JAWS, NVDA, and VoiceOver. The same buttons nested inside the tab failed.
Branch: akj:fix/sidebar-row-sibling-actions (diff). It is verified with NVDA. Before a PR, it needs VoiceOver checks on macOS in Safari and Chrome, under both DOM order and Grouping items navigation.
Follow-up to #13491 and #13910.
What happened
In NVDA browse mode, the sidebar thread list is not announced as a list, and the Snooze and Settle buttons on each row cannot be reached. Before #13491, NVDA reached them.
Diagnosis
Each thread row is a
<div role="button">with real buttons nested inside it: Snooze, Settle, Un-settle, Wake, Unpin, Dismiss Woke, and the PR badge. Draft rows nest Discard.role="presentation"on the thread<ul>, which removes list semantics and NVDA's L and I navigation. It also added anaria-labelto each row. NVDA's browse mode does not render the children of a button that has an author-supplied name (NVDA source), so the nested buttons disappear.role="button"out of the accessibility tree, focusable or not (WebKit source). VoiceOver in Safari likely cannot reach them with or without the label. This comes from the source, not a VoiceOver test.nested-interactive.Whether VoiceOver makes users interact with a list depends on their web navigation setting. Lists require interaction under "Grouping items" but not under "DOM order" (Apple).
Steps to reproduce
Environment
main @ de251fc, Windows 11, latest stable NVDA and Chrome.
Workaround
The row's context menu (Applications key) includes Settle, Snooze, and Pin.
Proposed fix
Give each row one native button that opens the thread, named by its title. Put the row actions in the same
<li>as siblings of that button, not inside it, and keeprole="list". The button fills the row behind its content, so nothing changes visually: layout, colors, and the focus ring match main in Chromium.In Sarah Higley's secondary actions study, buttons placed next to a tab worked in JAWS, NVDA, and VoiceOver. The same buttons nested inside the tab failed.
Branch: akj:fix/sidebar-row-sibling-actions (diff). It is verified with NVDA. Before a PR, it needs VoiceOver checks on macOS in Safari and Chrome, under both DOM order and Grouping items navigation.