Repository navigation
fix(web): screen readers no longer say "Message" twice entering the composer - #26692
nibarAhmed wants to merge 2 commits into
Conversation
…omposer The composer's F6 area was a region named "Message input", so screen readers read it before the textbox's own "Message <thread>" label. The label is now optional, and areas without one are not regions. Fixes pingdotgg#26675 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — Removes the redundant composer region announcement while preserving workspace focus navigation and other regions’ labels. Reported NVDA testing confirms the improvement; the limited trade-off is that the composer no longer appears as a separate landmark. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Optional workspace label apps/web/src/lib/workspaceFocus.ts, apps/web/src/components/ChatView.tsx |
workspaceAreaProps makes label optional and adds aria-label and role="region" only when the label is truthy. The composer calls the helper without a label. |
Estimated code review effort: 2 (Simple) | ~5 minutes
Change: Bug fix · Severity of issue fixed: Low
Possibly related PRs
- pingdotgg/t3code#25877 introduced the workspace-area registration that this change adjusts.
- pingdotgg/t3code#19669 introduced workspace-area and F6 navigation behavior retained by this change.
Suggested labels: bugfix
Suggested reviewers: t3dotgg
Merge Risk: 
Minimal · up to 4ce27
-
No concrete accessibility or keyboard-navigation regression is established; the change is mergeable.
Pre-merge checks: 
4
-
Full details: Title check
-
Explanation
The title names the main change: the composer no longer makes screen readers announce "Message" twice. It matches the diff, which makes the label optional in workspaceAreaProps and removes the composer's label. It is a conventional commit title in plain language, as the template asks.
Full details: Description check
-
Explanation
The description follows the template's sections: Problem, Change, Scope and approval, and Verification. The Problem section gives the regression, the NVDA output, and the linked issue
#26675. The Change section explains the optional label, the composer label removal, and the F6 behavior, plus a trade-off. Scope and approval cites a very small, focused fix and links the regression and its cause in#26675. The author links the issue, but the template asks for a triaged issue or maintainer approval, and the issue link alone does not show that approval. Verification gives before and after NVDA output on Windows 11, F6 checks, and the check command. It states what was not checked. The description does not include a screenshot or recording, though the template asks for before and after screenshots for UI changes. The NVDA before and after text is a textual substitute, not a visual. The template also asks for the model and harness, and the description includes this line. The description is mostly complete, so the check passes. The gaps are the missing screenshot or recording, and the scope note that rests on the linked issue rather than on explicit maintainer approval.
Full details: Linked Issues check
-
Explanation
The change meets the coding requirements in [
#26675].ChatView.tsxomits the composer label.workspaceFocus.tskeeps the workspace data attributes andtabIndex, and addsrole="region"andaria-labelonly when a label is supplied. The conversation area still supplies its label. The linked issue does not require a separate automated test.
Full details: Out of Scope Changes check
-
Explanation
The whole-PR diff changes only the composer call site and the optional-label behavior in
workspaceFocus.ts. Both changes directly address [#26675]. The diff contains no demonstrated unrelated product behavior.
-
Finishing Touches
-
🧪 Generate unit tests (beta)
-
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
|
Note Written by kept the original two-file fix unchanged and merged current main (d92c437) into the contributor branch. the diff remains 3 additions and 4 deletions; simplifying it further would obscure the distinction between f6 registration and optional region naming. verification at
matching composer crops show the unchanged layout. the recording demonstrates f6 navigation, not screen-reader speech. |
|
Note Written by Verified in a real dev environmentverified the web accessibility change at ran the live chrome accessibility tree reproduced the redundant naming on main and confirmed its removal on the pr: the other named regions, including conversation, thread details, workspace and version control, remain present. the screenshot pair shows the same real conversation and draft; the accessibility tree above is the evidence for the naming change. the recording shows the follow-up submission and response, without a speech track.
Not verifiedactual spoken announcements with windows nvda or macos voiceover: this is a linux vm. the live chrome accessibility tree and keyboard/client/provider behavior were exercised, but they do not prove the exact words those screen readers speak. native electron, ios/android, hosted web and relay/tunnel connections were not exercised. mobile does not use the changed web composer code. |





Problem
Since #25877, screen readers announce the composer twice when focus enters it. NVDA says "Message input, Message , edit, has auto complete, multi line, opens list". The F6 workspace area around the composer became a region named "Message input", and the editor inside it is already labelled
Message <thread title>, so both names are read.Fixes #26675
Change
workspaceAreaPropsnow takes an optional label. It only addsrole="region"andaria-labelwhen a label is given. F6 navigation keeps working because it only usesdata-workspace-area,data-workspace-orderandtabIndex. The composer area no longer passes a label, so the editor's own name is the only one read. The other workspace areas keep their labels, since F6 can land on those wrappers directly (for example Conversation).Trade-off: the composer is no longer an NVDA landmark (D key). If F6 goes back to a button that was last focused in the composer, such as Send, NVDA reads only that button without saying it's in the composer. That matches how the composer was announced before #25877.
I considered keeping the region and renaming it (for example "Composer") instead. As a daily NVDA user, I find any second name read on every entry into the composer noisy, and the editor's
Message <thread title>label already says where you are. Removing the region is the version that actually removes the noise.Scope and approval
This is a very small, focused fix for an obvious regression from #25877. It changes one string and makes one argument optional across two files. It doesn't change F6 behavior, and the other workspace areas are untouched. The regression and its cause are written up in #26675.
Verification
Desktop dev build on Windows 11 with NVDA, moving focus into the composer:
F6 into and out of the composer still works.
vp run check:changedpasses (format, lint, knip, typecheck, nearby tests).Not checked: VoiceOver on macOS, and the hosted web app (it uses the same web code as desktop). Mobile doesn't use this code.
Made with Claude Opus 5.5 in Claude Code, running in T3 Code.
🤖 Generated with Claude Code