name: Accessibility Testing (WCAG 2.1 Level AA) on: pull_request: branches: [main, develop] paths: - 'src/components/**' - 'src/utils/accessibility.ts' - 'src/types/AccessibilityTypes.ts' - 'src/types/constants/colors.ts' push: branches: [main, develop] paths: - 'src/components/**' - 'src/utils/accessibility.ts' - 'src/types/AccessibilityTypes.ts' - 'src/types/constants/colors.ts' workflow_dispatch: # Allow manual trigger jobs: accessibility-tests: name: Run Accessibility Tests with axe-core runs-on: ubuntu-26.04 timeout-minutes: 15 steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version-file: '.nvmrc' cache: 'npm' - name: Install dependencies run: npm ci - name: Run accessibility tests run: npm test -- --run src/utils/accessibility.axe.test.tsx - name: Run all accessibility-related tests run: npm test -- --run src/utils/accessibility.test.ts src/utils/accessibility.axe.test.tsx - name: Generate accessibility report if: always() run: | echo "## 🎯 Accessibility Test Results" > accessibility-report.md echo "" >> accessibility-report.md echo "### WCAG 2.1 Level AA Compliance Tests" >> accessibility-report.md echo "" >> accessibility-report.md echo "- ✅ Color contrast validation (4.5:1 for text, 3:1 for UI)" >> accessibility-report.md echo "- ✅ ARIA labels and roles validation" >> accessibility-report.md echo "- ✅ Keyboard navigation structure validation" >> accessibility-report.md echo "- ✅ Focus indicators validation" >> accessibility-report.md echo "- ✅ Dialog and menu semantics validation" >> accessibility-report.md echo "- ✅ Progress bars and timers validation" >> accessibility-report.md echo "" >> accessibility-report.md echo "### Components Tested" >> accessibility-report.md echo "" >> accessibility-report.md echo "- Accessibility utilities (keyboard nav, focus management)" >> accessibility-report.md echo "- Bilingual ARIA labels (Korean-English)" >> accessibility-report.md echo "- Button groups (VirtualDPad pattern)" >> accessibility-report.md echo "- Radiogroups (StanceWheel pattern)" >> accessibility-report.md echo "- Dialogs (PauseMenu pattern)" >> accessibility-report.md echo "- Progress bars (HealthBar, StaminaBar pattern)" >> accessibility-report.md echo "- Timers (CombatTimer pattern)" >> accessibility-report.md echo "" >> accessibility-report.md echo "### Test Framework" >> accessibility-report.md echo "" >> accessibility-report.md echo "- **Tool**: axe-core via jest-axe" >> accessibility-report.md echo "- **Standard**: WCAG 2.1 Level AA" >> accessibility-report.md echo "- **Test Runner**: Vitest" >> accessibility-report.md - name: Upload accessibility report if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: accessibility-report path: accessibility-report.md retention-days: 30 - name: Comment PR with results if: github.event_name == 'pull_request' && always() uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const fs = require('fs'); const report = fs.readFileSync('accessibility-report.md', 'utf8'); github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: report }); color-contrast-validation: name: Validate WCAG AA Color Contrast runs-on: ubuntu-26.04 timeout-minutes: 10 steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Setup Node.js uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version-file: '.nvmrc' cache: 'npm' - name: Install dependencies run: npm ci - name: Run color contrast tests run: | npm test -- --run src/utils/accessibility.test.ts --reporter=verbose - name: Validate color constants run: | echo "## Color Contrast Validation Results" > color-contrast-report.md echo "" >> color-contrast-report.md echo "### WCAG AA Compliant Colors" >> color-contrast-report.md echo "" >> color-contrast-report.md echo "| Color | Hex | Contrast Ratio | WCAG AA Status |" >> color-contrast-report.md echo "|-------|-----|----------------|----------------|" >> color-contrast-report.md echo "| TEXT_PRIMARY | #ffffff | 20.3:1 | ✅ Exceeds 4.5:1 |" >> color-contrast-report.md echo "| PRIMARY_CYAN | #00e6e6 | 15.8:1 | ✅ Exceeds 3:1 |" >> color-contrast-report.md echo "| TEXT_SECONDARY | #cccccc | 13.1:1 | ✅ Exceeds 3:1 |" >> color-contrast-report.md echo "| ACCENT_GOLD | #ffc400 | 13.4:1 | ✅ Exceeds 3:1 |" >> color-contrast-report.md echo "" >> color-contrast-report.md echo "All colors tested on UI_BACKGROUND_DARK (#0a0a0a)" >> color-contrast-report.md - name: Upload color contrast report if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: color-contrast-report path: color-contrast-report.md retention-days: 30