Repository navigation
Description
Note
🤖 Claude Opus 5.5 posting on behalf of nibarAhmed
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/web
Steps to reproduce
- On Windows, start NVDA and open T3 Code (desktop app, or web in Chrome) on main at
eb751fa073or later. - In browse mode, move to the Threads sidebar (F6, or Tab until you reach it).
- Try to read the threads with the arrow keys, or jump between them with Tab or B.
- Try to reach Settle or Snooze on a thread that doesn't have focus.
- Compare with main before
2525252c96(feat(web): F6 moves between workspace areas, and the sidebar is keyboard navigable #25877), where the sidebar was a list of buttons.
Expected behavior
Revert the sidebar's tree semantics to what they were before #25877:
- The thread list goes back to
<ul role="presentation">. - Thread rows, drafts, section headers and "load older" go back to normal buttons with
tabIndex={0}, and the project folder headers added later in feat(web): boring sidebar groups threads into project folders #21039 become normal buttons too, so Tab and NVDA's quick-navigation keys reach every one of them. - Each row's own buttons are always in the Tab order again.
- Browse mode can read the sidebar line by line again, without having to switch to focus mode to read the threads.
This issue only asks for that revert. Improving the old list itself (row buttons nested inside the row) is already tracked in #13959 and doesn't need to be solved here.
Keep what #25877 added that doesn't need the tree: F6 / Shift+F6 (and mod+F6) between workspace areas, Shift+F10 or the Context Menu key for the thread menu, F2 to rename, and the sidebar shown/hidden announcement. Up/Down can stay as an extra on top of real buttons.
This is markup only for sighted users: no styles depend on the tree roles. Two places select on role="treeitem" and need a different marker: apps/web/src/lib/workspaceFocus.ts (which row F6 lands on) and apps/web/src/components/ChatView.logic.ts (focus going back to the composer when the window regains focus).
Actual behavior
Before #25877, the thread list was something I could just read and Tab through with NVDA. Now it's a tree view, and everyday use is awkward: I have to switch into focus mode, arrow row by row, and arrow to a thread before I can reach its buttons.
Since #25877 (2525252c96, merged 2026-10-27) the sidebar is an ARIA tree:
<ul role="tree" aria-label="Threads">. Thread rows, drafts, section headers, project folder headers (feat(web): boring sidebar groups threads into project folders #21039) and "load older" arerole="treeitem"withtabIndex=-1.- Only one row is in the Tab order at a time. Getting to other threads needs the arrow keys, and in NVDA the tree is a control you have to switch into focus mode to use, not text you can read in browse mode.
- Each row's buttons get
tabIndex=-1unless their row has focus. To press Settle on a thread, you first arrow to it, then Tab. - The structure is faked: the DOM is flat, with no
role="group". AMutationObserver(apps/web/src/lib/sidebarTree.ts) rewritesaria-level,aria-posinsetandaria-setsizeon every change. - The open thread is marked with
aria-current="page", notaria-selected.
The PR says: "I did not test screen reader speech."
Related: #13959 tracks a separate, older problem with the list (row buttons nested inside the row) and is out of scope here. A comment on its fix #13962 had already warned against a tree: "A tree view would put Snooze and Settle back inside the row, where screen readers can't reach them."
Impact
Major degradation or frequent failure
Version or commit
T3 Code (Nightly) 0.1.4-nightly.20261028.3824; main @ eb751fa (introduced by 2525252 / #25877)
Environment
Windows 11 Pro (10.0.26200), NVDA 2026.3 (2026.3.0.58174), T3 Code desktop (Nightly) 0.1.4-nightly.20261028.3824, Chrome 156.0.8078.73
Logs or stack traces
No response
Screenshots, recordings, or supporting files
No response
Workaround
Shift+F10 or the Context Menu key on a focused thread opens its menu, which has Settle, Snooze and Pin. F6 jumps past the sidebar.
Activity
[-][Bug]: Threads sidebar turned into a tree view, and it's much harder to use with a screen reader than the list it replaced[/-][+][Bug]: Threads sidebar turned into a tree view, and it's much worse to use with a screen reader than the list it replaced[/+]nibarAhmed commentedon Oct 31, 2026
Note
🤖 Claude Opus 5.5 posting on behalf of @nibarAhmed
@maria-rcks can the Threads sidebar go back to a list instead of a tree? As you pointed out in the pull request, #26690 needs maintainer approval for this direction, so I'm asking for it here.
I'm keeping this as an issue rather than a discussion because it reports a regression, not a new feature: #25877 made a sidebar that worked well with NVDA harder to use, and CONTRIBUTING says bugs are reported in issues. I know that doesn't approve the list by itself, so please say here if you approve it or would rather have a narrower repair. A narrower repair isn't ideal, though: as long as the sidebar stays a tree, I'd still have to switch modes to move around it, and that's the main problem.
I'm a daily NVDA user, and the list is what I'm asking for. With the tree I constantly have to switch between browse and focus mode, and that makes navigating the sidebar far more complicated than it was. With the list, I can read the threads in browse mode and Tab to any of them and their buttons, without thinking about modes.
I recorded the sidebar's speech with both. I used NVDA 2026.3 on Windows 11, with T3 Code Nightly 0.1.4-nightly.20261028.3824 as the tree and a desktop dev build of #26690 as the list. The two builds had different threads, so the titles differ.
The main problems with the tree
A correction to this issue: I wrote that the tree can't be read in browse mode. The recording shows that it can, row by row, with that repeated prefix. The problem is having to switch modes to actually move around and act on threads.
What the list gives up: the tree announces position and level in focus mode ("2 of 6 level 1"), and the list in #26690 doesn't. Arrow-key users also get many Tab stops instead of one, though Up and Down still move between threads. I'd take that trade, and it's how the sidebar worked before #25877. F6, Shift+F10 and F2 from #25877 all keep working.
#26690 is ready to reopen if you approve this direction.
🤖 Generated with Claude Code
shivamhwp commentedon Nov 2, 2026
Approved: the Threads sidebar can go back to a list of buttons, as in #26690. The keyboard additions from #25877 that don't need the tree stay: F6 and Shift+F6, Shift+F10 and the Context Menu key, F2, and the arrow keys. I'm reopening #26690 for it.