[Feature Request]: Implement full accessibility and VoiceOver support across all screens
- Dominant language
- Swift
- Stars
- 0
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description
### Description:
The app currently has **zero accessibility support** -- no accessibility labels, hints, traits, or VoiceOver considerations anywhere in the codebase. This excludes visually impaired users and violates Apple's Human Interface Guidelines. For a competitive programming app, this is especially impactful since many users rely on assistive technologies.
### Current Behavior:
- No `.accessibilityLabel()` modifiers on any interactive elements.
- No `.accessibilityHint()` modifiers to explain what actions will do.
- Custom components like `StatCard`, `SubmissionCard`, `ContestCard`, `ProblemRow` announce their child elements individually instead of as a single meaningful unit.
- Gradient icons and decorative elements are not hidden from VoiceOver.
- The rating chart (`Chart`) has no accessibility representation.
- The `SearchBar` component doesn't announce its purpose or current state.
- Tab navigation doesn't announce context changes.
### Feature Requirements:
#### 1. Problem List Screen
- Each `ProblemRow` should be announced as a single element: "Problem [title], Rating [rating], Tags: [tags]"
- Tag filter chips should announce their selection state: "Tag: implementation, selected / not selected"
- Search bar should announce: "Search problems, [N] results found"
- The loading and error states should announce themselves when they appear
#### 2. Contest List Screen
- Each contest card should read: "[Contest Name], starts [date] at [time], duration [duration], [rated/unrated]"
- The "Register" button should include a hint: "Opens registration page on Codeforces"
- Countdown timers should be accessible with meaningful labels
#### 3. Profile Screen
- The `StatCard` group should be an accessible container: "Statistics: [N] problems solved, [N] contributions, Rating [N]"
- Rating progress bar should announce: "Rating [current] out of [max], [percentage]%"
- The rating chart should have an accessibility representation (summary text or accessible elements per data point)
- The logout button should have a clear label and destructive trait
#### 4. Problem Detail Screen
- The segmented picker should announce tab changes
- The `SubmissionCard` should read: "Submission: [verdict], Language: [lang], [time ago], passed [N] tests"
- The "Open Submissions Page" link should have a hint about leaving the app
#### 5. Login Screen
- Text field should announce its purpose: "Codeforces username"
- Error messages should be announced automatically when they appear (`.accessibilityAddTraits(.isStaticText)` or live regions)
- "Sign Up" link should announce that it opens Safari
#### 6. General
- All decorative elements (gradient backgrounds, dividers, decorative icons) should be hidden: `.accessibilityHidden(true)`
- Use `.accessibilityElement(children: .combine)` for composite cards
- Support Dynamic Type for all custom-sized text
- Ensure minimum touch target sizes of 44×44pt for all interactive elements
### Key Files:
| Action | File |
|--------|------|
| **MODIFY** | `CForge/Views/Problem/ProblemListView.swift` |
| **MODIFY** | `CForge/Views/Problem/ProblemSubmissionsView.swift` |
| **MODIFY** | `CForge/Views/Problem/SubmitLauncherView.swift` |
| **MODIFY** | `CForge/Views/Contest/ContestListView.swift` |
| **MODIFY** | `CForge/Views/Profile/ProfileView.swift` |
| **MODIFY** | `CForge/CForgeApp.swift` (LoginView) |
| **MODIFY** | All custom card/row components |
### Expected Outcome:
- A VoiceOver user can fully navigate, search, filter, view problems, and manage their profile.
- All interactive elements have meaningful labels and hints.
- Composite views (cards, stat groups) are announced as single logical units.
- Decorative elements are hidden from the accessibility tree.
- Dynamic Type is supported — text scales with system font size settings.
- No accessibility audit warnings in Xcode's Accessibility Inspector.
Contributor guide
Research direction
Start by reading the listed views, CForgeApp.swift, and the custom card and row components, then use Xcode’s Accessibility Inspector to audit the current screens. Implement the specified labels, hints, grouping, Dynamic Type, touch targets, and decorative-element handling across the app; done means VoiceOver can navigate the required flows and the audit has no warnings.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- accessibility, mobile-dev
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100