Join the discussion on Telegram
Why this matters
Several interactive controls across the app are icon-only or custom toggle elements with no accessible name, so screen-reader and keyboard users cannot tell what they do. Concrete examples already in the codebase:
- The browser-notifications toggle in
frontend/src/app/settings/page.tsx is a bare <button> containing only a styled <span> — no text, aria-label, or aria-pressed, so it announces as an unlabeled button with no state.
- The copy-address / copy-contract buttons in the same file are icon-only (
<Copy />) with no aria-label.
- Only ~15 of ~40 component files under
frontend/src/components use any aria-*/role attributes at all.
For a finance app this is both an inclusivity and a quality issue.
Acceptance criteria
Files to touch
frontend/src/app/settings/page.tsx
frontend/src/components/NotificationDropdown.tsx
frontend/src/components/streams/IncomingStreamCard.tsx
- other icon-only controls surfaced during the audit
Out of scope
- A full WCAG audit / color-contrast overhaul.
Join the discussion on Telegram
Why this matters
Several interactive controls across the app are icon-only or custom toggle elements with no accessible name, so screen-reader and keyboard users cannot tell what they do. Concrete examples already in the codebase:
frontend/src/app/settings/page.tsxis a bare<button>containing only a styled<span>— no text,aria-label, oraria-pressed, so it announces as an unlabeled button with no state.<Copy />) with noaria-label.frontend/src/componentsuse anyaria-*/roleattributes at all.For a finance app this is both an inclusivity and a quality issue.
Acceptance criteria
aria-label(andaria-pressedfor toggles) to the icon-only / custom-toggle controls infrontend/src/app/settings/page.tsx.eslint-plugin-jsx-a11y) — optional but encouraged.Files to touch
frontend/src/app/settings/page.tsxfrontend/src/components/NotificationDropdown.tsxfrontend/src/components/streams/IncomingStreamCard.tsxOut of scope