QC Master Test Plan
Accessibility checks
Accessibility checks — documentation pending.
Accessibility QC verifies that every public surface meets WCAG 2.2 AA. This is non-negotiable — the platform serves a region where assistive technology adoption is growing and where official accessibility procurement requirements (especially Saudi Arabia + UAE) require AA compliance for any platform with government / education partnerships. AA is the floor, not the ceiling.
A11y checklist per surface
- Color contrast: body text ≥4.5:1 against background. Large text (≥24px or ≥19px bold) ≥3:1. Non-text UI components ≥3:1 against adjacent colors.
- Keyboard navigation: every interactive element reachable by Tab in a logical order. Focus indicators visible with ≥3:1 contrast against background.
- Skip-to-content link as the first focusable element on every page. Hidden until focused, visible on focus.
- Semantic HTML: <button> for buttons (not <div onclick>), <a> for links (not <span onclick>), <nav> for navigation, proper heading hierarchy (no skipped levels).
- ARIA labels on icon-only buttons. ARIA-live regions for toast notifications. ARIA-expanded on disclosure widgets.
- Form fields have associated <label> elements. Errors associated via aria-describedby. Required fields marked with aria-required.
- Images have alt text — decorative SVGs use alt="" (empty, not missing). Cover images describe the subject, not "Cover image".
- No keyboard traps. Modals can be closed with Escape. Drawers return focus to the trigger element on close.
- Page language is declared at <html lang="en"> or <html lang="ar"> matching the route locale.
- Reduced motion: animations honor prefers-reduced-motion. The accent pulse on "live" event badges is muted when the user has reduced-motion set.
Screen-reader testing
Automated a11y tools (axe-core / Lighthouse a11y / pa11y) catch 30-40% of WCAG issues. The rest require manual testing with a real screen reader — NVDA on Windows, VoiceOver on macOS / iOS, TalkBack on Android. Every release runs a manual screen-reader pass on the home page, every listing page type, every details page type, and the founder-account dashboard. Listening to the page is the only way to catch reading-order defects + missing ARIA + incorrect alt text in context.
