WCAG 2.2 AA Accessibility Audit β All Export UI Screens
epic-bufdir-reporting-export-ui-task-012 — Conduct a systematic WCAG 2.2 AA accessibility audit across all five export UI components: trigger screen, period selector, format selector, confirmation dialog, and history list. Verify contrast ratios, touch-target sizes (44Γ44 dp minimum), focus order, semantic labels, live-region announcements, and keyboard/switch-access traversal. Document and fix all failures. Produce a compliance report.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 6 - 158 tasks
Can start after Tier 5 completes
Implementation Notes
Use Flutter DevTools Accessibility inspector and the Accessibility Scanner Android app (Google) for initial automated detection of contrast and touch-target failures. For touch targets smaller than 44Γ44 dp, wrap with a SizedBox(width: 44, height: 44) or use Padding to expand the hit area without changing visual size β do not use GestureDetector with a larger area around a small widget as this creates invisible tap regions. For MergeSemantics on list items: wrap the entire ExportHistoryListItem in MergeSemantics to combine period + format + status + timestamp into one TalkBack/VoiceOver announcement, but mark the Re-download button as a separate Semantics node so it remains independently focusable. For the compliance report: use a Markdown table with columns: WCAG Criterion, Screen, Element, Result (Pass/Fail), Fix Applied.
Prioritise Blindeforbundet's users (VoiceOver critical) given the project context from likeperson.md.
Testing Requirements
Automated accessibility checks: use flutter_test's SemanticsController (tester.getSemantics) to assert Semantics labels on all interactive elements. Write a dedicated accessibility_test.dart file covering each screen. Manual testing checklist: (1) TalkBack on Android emulator β navigate all five screens, verify all announcements, (2) VoiceOver on iOS simulator β same verification, (3) Switch Access on Android β verify all interactive elements are reachable, (4) Full Keyboard Access on iOS β verify same, (5) Increase font size to 200% in system settings β verify no text overflow or clipping on any screen, (6) High contrast mode β verify all contrast ratios still pass. Document each manual test step in the compliance report with pass/fail status.
For large exports that run for 10β30 seconds, a static loading spinner will feel broken to users on slow mobile connections. If the UI cannot display meaningful progress during the export pipeline, coordinators may abandon the flow or trigger duplicate exports by pressing the button multiple times.
Mitigation & Contingency
Mitigation: Implement streaming progress events from the orchestrator BLoC through named pipeline stages (querying, mapping, generating, uploading). Display each stage label with a progress indicator on the trigger screen. Disable the generate button immediately on first tap to prevent duplicates.
Contingency: If streaming pipeline progress is not feasible in the first release, implement a deterministic stage-based progress animation (10% querying, 50% generating, 90% uploading) that gives users feedback without requiring real server events.
Custom date range pickers are among the most common accessibility failures in mobile apps. Blindeforbundet users rely on VoiceOver, and NHF users include people with cognitive impairments. A non-accessible period picker could make the entire export workflow unusable for a significant portion of the intended user base.
Mitigation & Contingency
Mitigation: Build the period picker using Flutter's native date picker semantics as the foundation, with preset shortcuts as primary navigation (reducing the need to interact with the custom range picker at all). Test with VoiceOver on iOS and TalkBack on Android before UI epic sign-off. Engage Blindeforbundet's test contact for accessibility validation.
Contingency: If the custom date range picker cannot be made fully accessible before release, ship only the preset period shortcuts (covering the majority of use cases) and add the custom range picker in a follow-up sprint after dedicated accessibility remediation.