Accessibility: claude.ai web - NVDA Focus Mode issue on Firefox, unlabeled buttons, blank elements (WCAG 4.1.2, 2.1.1)
Summary
The claude.ai web interface has several accessibility issues when used with NVDA screen reader on Firefox. These affect core interactions: opening menus, identifying buttons, and encountering blank elements that cause confusion.
Environment
- URL: https://claude.ai
- Browser: Firefox (latest)
- Screen reader: NVDA 2025.3.3
- OS: Windows 11 Pro (10.0.26200)
---
Issue 1: Settings menu button requires Insert+Space to open in Firefox (NVDA Focus Mode)
The user profile/settings menu button (announced as button collapsed subMenu Hasan, Settings) cannot be opened by pressing Enter or Space as expected. NVDA stays in Browse Mode and the menu does not open.
The user must press Insert+Space to manually toggle NVDA into Focus Mode before the button responds to Enter/Space. This is non-standard behavior for a button element.
Current behavior: Pressing Enter or Space on the "Hasan, Settings" button does nothing in Firefox with NVDA. The user must press Insert+Space first, then Enter.
Expected behavior: Pressing Enter or Space should open the menu immediately, as is standard for <button> elements. NVDA should automatically switch to Focus Mode when interacting with this button.
Likely Cause (Firefox-specific)
This is likely caused by the button using a custom click handler or a Radix UI popover/dropdown trigger that intercepts keyboard events in a way Firefox does not propagate correctly in NVDA Browse Mode. Possible fixes:
- Ensure the button uses a native
<button>element (not a<div role="button">) - Add explicit
onKeyDownhandling for Enter and Space keys - If using Radix UI
DropdownMenu.Trigger, ensure it is rendered as a native button and not a custom element - Test with
role="menu"andaria-haspopup="menu"on the trigger to help NVDA identify it as a menu button
---
Issue 2: Unlabeled button after the model selector
After the model selector button (announced as button collapsed subMenu Opus 4.6 Extended), there is an icon-only button with no accessible name. NVDA announces it as just "button" with no indication of what it does.
This is likely the attach files or upload button in the message input toolbar.
Expected: aria-label="Attach files" or similar descriptive label.
---
Issue 3: Unlabeled button after the "From Drive" tab
In the prompt categories tab bar, after the last tab ("From Drive"), there is another unlabeled button. NVDA announces it as just "button".
Expected: An appropriate aria-label describing the button's action.
---
Issue 4: Two blank elements announced at the end of the page
After the last unlabeled button, NVDA announces two blank/empty elements before reaching the end of the page. These are likely empty <div> or <span> elements that are focusable or have an implicit ARIA role, causing NVDA to announce them as blank content.
Expected: Non-interactive empty elements should either be hidden from the accessibility tree with aria-hidden="true" or removed from the tab order with tabindex="-1".
---
How to Reproduce
- Open https://claude.ai in Firefox (latest)
- Log in to your account
- Start NVDA 2025.3.3
- Navigate to the bottom-left of the sidebar where your name and "Settings" appear
- Press Enter or Space on the "Hasan, Settings" button. Observe that it does not open. You must press Insert+Space first to switch to Focus Mode
- Navigate to the message input area, Tab past the "Opus 4.6 Extended" model selector. The next button is announced as just "button"
- Tab past the "From Drive" prompt category tab. The next button is announced as just "button"
- Continue tabbing. Two blank elements are announced before reaching the page end
Related Issues
- #35257 - Accessibility issues in the Claude Desktop app (unlabeled buttons + NVDA Focus Mode on message input)
- #15509 - Requesting --no-ansi flag for screen reader accessibility (CLI)
- #25785 - NVDA does not announce backspace/deleted characters (CLI)
- #11002 - Requesting a --screen-reader mode for NVDA and JAWS (CLI)
References
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗