Skip to content

fix(CDS-1170): Radiocell duplicate tab targets#326

Merged
maximo-macchi-cb merged 5 commits intocoinbase:masterfrom
samcartersmith:sams/CDS-1170-radiocell-fix
Jan 26, 2026
Merged

fix(CDS-1170): Radiocell duplicate tab targets#326
maximo-macchi-cb merged 5 commits intocoinbase:masterfrom
samcartersmith:sams/CDS-1170-radiocell-fix

Conversation

@samcartersmith
Copy link
Copy Markdown
Contributor

@samcartersmith samcartersmith commented Jan 23, 2026

Fixes CDS-1170

What changed? Why?

Changed to a tabindex="-1" on the pressable to avoid the duplicate tab stop.

Root cause (required for bugfixes)

The Pressable that was wrapping the RadioCell is adding another tabindex="0".

Ticket: https://linear.app/coinbase/issue/CDS-1170/radiocell-duplicate-tab-targets

UI changes

Web Old Web New
Screenshot 2026-01-23 at 11 02 06 AM Screenshot 2026-01-23 at 11 06 46 AM

Testing

How has it been tested?

  • [ X ] Unit tests
  • Interaction tests
  • Pseudo State tests
  • [ X ] Manual - Web
  • Manual - Android (Emulator / Device)
  • Manual - iOS (Emulator / Device)

Testing instructions

  1. Tab to the radioCell
  2. Observe there is one single focus stop
  3. Use arrows to adjust radioCell
  4. Turn on screen reader
  5. Notice that there is one focus stop with a clear announcement

Illustrations/Icons Checklist

Required if this PR changes files under packages/illustrations/** or packages/icons/**

  • verified visreg changes with Terran (include link to visreg run/approval)
  • all illustration/icons names have been reviewed by Dom and/or Terran

Change management

type=routine
risk=low
impact=sev5

automerge=false

…tead of Pressable

The RadioCell component had two focusable elements in the tab order: the outer
Pressable label wrapper and the inner radio input. This created duplicate tab
targets for screen reader and keyboard users.

By switching from Pressable to Interactable, the label wrapper is no longer
added to the tab order (since labels aren't natively tabbable and Interactable
doesn't add tabIndex). The inner radio input remains the sole tab target, and
the existing :focus-within CSS still shows the focus ring on the container.

Fixes CDS-1170
@cb-heimdall
Copy link
Copy Markdown
Collaborator

cb-heimdall commented Jan 23, 2026

✅ Heimdall Review Status

Requirement Status More Info
Reviews 1/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 1
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1
CODEOWNERS ✅ See below

CODEOWNERS

Code Owner Status Calculation
ui-systems-eng-team 1/1
Denominator calculation
Additional CODEOWNERS Requirement
Show calculation
Sum 0
0
From CODEOWNERS 1
Sum 1

…icate tab target

Reverts the Interactable approach in favor of keeping Pressable with tabIndex={-1}.
This removes the outer label wrapper from the tab order while maintaining parity
with mobile and avoiding a breaking change for consumers.

The inner radio input remains the sole tab target, and the existing :focus-within
CSS still shows the focus ring on the container.

Fixes CDS-1170
@maximo-macchi-cb maximo-macchi-cb merged commit cae344f into coinbase:master Jan 26, 2026
24 of 25 checks passed
cb-ekuersch pushed a commit that referenced this pull request Jan 30, 2026
* fix(RadioCell): remove duplicate tab target by using Interactable instead of Pressable

The RadioCell component had two focusable elements in the tab order: the outer
Pressable label wrapper and the inner radio input. This created duplicate tab
targets for screen reader and keyboard users.

By switching from Pressable to Interactable, the label wrapper is no longer
added to the tab order (since labels aren't natively tabbable and Interactable
doesn't add tabIndex). The inner radio input remains the sole tab target, and
the existing :focus-within CSS still shows the focus ring on the container.

Fixes CDS-1170

* chore(web): bump version to 8.38.6

* chore: align all package versions to 8.38.6

* fix(RadioCell): use tabIndex={-1} instead of Interactable to fix duplicate tab target

Reverts the Interactable approach in favor of keeping Pressable with tabIndex={-1}.
This removes the outer label wrapper from the tab order while maintaining parity
with mobile and avoiding a breaking change for consumers.

The inner radio input remains the sole tab target, and the existing :focus-within
CSS still shows the focus ring on the container.

Fixes CDS-1170

* Update CHANGELOG.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

3 participants