A11y: keyboard focus moves on Tab but has no visible focus indicator (WCAG 2.4.7 fail) #97
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#97
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Tab navigation works — focus DOES move between interactive elements as the user presses Tab — but there is no visible focus indicator on most/all interactive elements. Keyboard-only users cannot see where their focus currently sits, making the app non-navigable by keyboard despite focus actually being routable.
This is a WCAG 2.4.7 (Focus Visible, Level AA) violation.
Repro
282eb62up, Vite on 5173/timecurvein ChromeObserved
document.activeElementpolling in console — different elements gain focus on each Tab keystrokeWhy this matters
Suggested fix
Add
:focus-visiblestyles to interactive elements. Standard pattern:Use
:focus-visible(not:focus) so the outline only shows on keyboard nav, not mouse click. The framework's CSS reset may be stripping default browser focus rings without replacing them — that's the most common cause.Severity
MEDIUM. Not a launch-blocker but is an a11y compliance gap that will fail standard audits and excludes a real user segment. Cheap to fix (one CSS rule).
Scope note
This filing covers the focus-visible portion of F-15 only. Full a11y audit (semantic markup, ARIA labels, screen reader announcements, color contrast, etc.) deferred to post-TGE.
cc @PlasticDigits
mentioned in commit
0a7679503dFix shipped on
,main(commit0a76795)What changed
[data-rk] .iekbcc5 { outline: none }(specificity 0,2,0), which beats our previous globalbutton:focus-visiblerule (0,1,1), so Tab focus was invisible inside wallet chrome and could look broken elsewhere.frontend/src/index.css: added--yo-focus-ringon:root; expanded :focus-visible selectors ([role="button"],summary, focusable[tabindex]:not([tabindex="-1"])); duplicated the same selector list under[data-rk]so RainbowKit cannot strip keyboard focus rings.docs/frontend/design.md,wallet-connection.md,timecurve-views.md,docs/testing/invariants-and-business-logic.md(table + §97),docs/testing/strategy.md; play skillskills/verify-yo-focus-visible-a11y/SKILL.md; contributor guardrails item 30.Checklist for @brouie (please verify — issue stays open until you sign off)
/timecurve: Tab through sub-nav, pay toggles, Buy CHARM, slider — visible gold (or themed) ring on each stop; mouse-click primary CTA does not leave a spurious permanent ring (:focus-visiblesemantics).[data-rk]path).document.activeElementmatches the control showing the ring./referrals) for Tab rings on links/buttons.Refs: invariants — keyboard focus visible · play skill
cc @brouie
Correction on wording above: fix is on main at commit
0a76795(GitLab may have mangled backticks in the previous note).mentioned in issue #38
Verified
0a76795against all 4 SKILL.md acceptance items on the SKIP+KUMBAYA+NO_COOLDOWN stack today (aea2072HEAD with Vite restarted to pick up the new index.css). Closing.Item 1 —
/timecurveTab focus rings: PASSTabbed through
/timecurveafter click-on-page-body to put focus in document. Visible gold (themed--yo-focus-ring) ring appeared at each Tab stop:Mouse-click on BUY CHARM with
:focus-visiblesemantics: confirmed the click does not produce a problematic permanent-ring artifact (the brief ring observation is consistent with:focus-visiblebehavior under MetaMask click → wallet popup focus → return focus, not a CSS regression).Item 2 — Connect Wallet modal: PASS
Opened the wallet pill / Connect Wallet flow. Tabbed through wallet option list inside the RainbowKit
[data-rk]modal. Each focused control showed the same family of visible focus styling as the rest of the app — confirming the duplicated:focus-visibleselectors under[data-rk]correctly defeat RainbowKit'soutline: none(specificity 0,2,0) override.Item 3 — Contrast sanity: PASS
Gold focus ring stays clearly visible across:
No contrast issues observed in either focus state vs adjacent backgrounds.
Item 4 — Spot-check
/referrals: PASSNavigated to
/referralsand Tab-walked through the new sections (Connected wallet, Register a code form input + button, Referrer leaderboard, footer links). Ring visible at every Tab stop. Same gold themed ring as/timecurve, consistent app-wide.Closure recommendation
:focus-visiblerings are now visible across the whole app and inside RainbowKit-scoped wallet UI. WCAG 2.4.7 (Focus Visible, Level AA) satisfied for the surfaces I exercised. The CSS approach (centralized--yo-focus-ringtoken + selector list duplicated under[data-rk]) is robust against future RainbowKit version bumps as long as the[data-rk]scoping convention stays stable.Closing #97.
cc @PlasticDigits
mentioned in issue #100
mentioned in issue #232
mentioned in issue #258
mentioned in merge request !414