[Bug] Send recipient field has nested button semantics and unnamed controls
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 5.5k
- Forks
- 5.4k
- PR merge metrics
- No merged PRs in 30d
Description
📱 Interface Affected
- Web (app.uniswap.org)
- Wallet Extension
- Wallet Mobile App
🧩 App Version
- Version (if known): current public production release
- Production build
- Development build
💻 System / Environment Info
- Browser: browser-independent source-level semantics issue
- OS / Platform: web
- Device: desktop/laptop
- Wallet used: not wallet-specific
- Network: not network-specific
🔁 Steps to Reproduce
- Open the Web app's Send flow.
- Navigate to the recipient field using a keyboard and/or screen reader.
- Inspect the recipient control semantics.
- After selecting a recipient, inspect the X control used to clear the recipient.
The current implementation in apps/web/src/pages/Swap/Send/SendRecipientForm.tsx uses RecipientWrapper = styled(TouchableArea, ...) around the editable SendRecipientInput.
On web, TouchableAreaFrame renders as a div with role="button" (packages/ui/src/components/touchable/TouchableArea/TouchableAreaFrame.web.tsx). That means the recipient text input is nested inside an element exposed as a button.
The visible To text is also not programmatically associated with the text input, and the X clear-recipient TouchableArea has no accessible name.
✅ Expected Behavior
- The editable recipient input should not be nested inside a control exposed as
role="button". - The visible
Tolabel should be programmatically associated with the recipient input (or the input should otherwise have an equivalent accessible name). - The clear-recipient X control should expose a concise accessible name such as
Clear recipient.
❌ Actual Behavior
- A
role="button"wrapper contains the editable recipient input, producing nested interactive semantics. - The recipient input has no programmatic accessible name corresponding to the visible
Tolabel. - The icon-only clear-recipient control is unnamed.
These are relevant to WCAG 2.2, particularly 1.3.1 (Info and Relationships), 3.3.2 (Labels or Instructions), and 4.1.2 (Name, Role, Value).
📸 Screenshots or Screen Recording
Not required to identify the source-level semantics issue; the relevant implementation is in the two files noted above.
🧾 Additional Context
I found this while doing a source-level WCAG 2.2 review of the production web interface. I also noticed a few other accessibility issues in shared/web interaction patterns.
I realize this repository is a public production mirror and does not accept PRs. If a broader accessibility pass would be useful, I'm happy to continue the review and share a concise, prioritized set of findings and remediation notes rather than filing unrelated one-off reports.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with apps/web/src/pages/Swap/Send/SendRecipientForm.tsx and inspect how RecipientWrapper, SendRecipientInput, the visible To text, and the clear-recipient TouchableArea are composed. Read packages/ui/src/components/touchable/TouchableArea/TouchableAreaFrame.web.tsx to confirm the web semantics, then verify that the recipient control has an accessible name, the clear control is named, and no button role contains the input.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- accessibility, frontend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100