Tier: M (2-4 days) | Type: a11y
Context. Wave 7 fixed page-level a11y basics but the complex overlays shipped this wave (QR scanner camera view, batch withdraw modal, batch send progress) were audited only at a surface level. Keyboard-only users cannot cancel the scanner, screen readers do not announce per-row progress, and focus escapes the modals on Escape.
Scope.
- Trap focus inside every dialog; return focus to the trigger on close.
- Announce per-row progress in the batch withdraw and batch send flows via
aria-live=polite.
- Keyboard shortcuts for the scanner: Escape closes, Space toggles camera, U triggers upload-fallback.
- Screen-reader labels on the camera preview and the QR canvas.
- Add Playwright a11y tests for each of the three modals under
tests/a11y/modals.spec.ts.
- Add
test:a11y script to package.json that runs the a11y-tagged Playwright specs (no such script exists today; tests/a11y/send.spec.ts currently rides on the general test:e2e runner).
Acceptance.
Files. src/components/QRCodeModal.tsx, src/components/StellarBatchWithdrawModal.tsx, src/pages/StellarSplit.tsx, tests/a11y/modals.spec.ts (new).
Tier: M (2-4 days) | Type: a11y
Context. Wave 7 fixed page-level a11y basics but the complex overlays shipped this wave (QR scanner camera view, batch withdraw modal, batch send progress) were audited only at a surface level. Keyboard-only users cannot cancel the scanner, screen readers do not announce per-row progress, and focus escapes the modals on Escape.
Scope.
aria-live=polite.tests/a11y/modals.spec.ts.test:a11yscript topackage.jsonthat runs the a11y-tagged Playwright specs (no such script exists today;tests/a11y/send.spec.tscurrently rides on the generaltest:e2erunner).Acceptance.
pnpm test:a11yscript exists inpackage.jsonand coversStellarBatchWithdrawModal,QRCodeModal, and the batch-send progress dialog with zero critical or serious violationsFiles.
src/components/QRCodeModal.tsx,src/components/StellarBatchWithdrawModal.tsx,src/pages/StellarSplit.tsx,tests/a11y/modals.spec.ts(new).