Sample report
Accessibility review: checkout page
This is the kind of report Skilled A11y writes in Claude. The shop, code and findings are made up for illustration.
Summary
Nine findings. Two are blockers: the cart button has no accessible name, and the card number field has no label, so screen reader users can't complete checkout. Focus is lost when the promo dialog closes. Fixes for the five confirmed findings are below; four items need a person to test.
Confirmed findings
Blocker Cart button has no accessible name
- WCAG: 4.1.2 Name, Role, Value (A) · Certain
- Where:
CartButton.tsxline 12 - Problem: The button contains only an icon and a count. Screen readers announce "button" or "button 3", so blind users can't find the cart.
- Fix: add
aria-label={`Cart, ${count} items`}to the button andaria-hidden="true"to the icon and count. - Verify: tab to it with VoiceOver or NVDA on and hear "Cart, 3 items, button". axe rule
button-nameshould pass.
Blocker Card number field has no label
- WCAG: 1.3.1 Info and Relationships (A), 3.3.2 Labels or Instructions (A) · Certain
- Where:
PaymentForm.tsxline 48 - Problem: The placeholder "1234 5678 9012 3456" is the only label. It disappears when typing and isn't announced as a name.
- Fix: add
<label htmlFor="card">Card number</label>and keep the placeholder as a hint. - Verify: focus the field and hear "Card number, edit text". axe rule
labelshould pass.
Serious Focus is lost when the promo dialog closes
- WCAG: 2.4.3 Focus Order (A) · Likely
- Where:
PromoDialog.tsxonClose - Problem: After closing, focus goes to the top of the page. Keyboard users have to tab through the whole page again.
- Fix: store the trigger with
useRefand calltriggerRef.current?.focus()inonClose, or use a native<dialog>, which returns focus on close. - Verify: open the dialog with Enter, press Escape, and check focus is back on "Add promo code".
Serious Payment errors aren't announced
- WCAG: 3.3.1 Error Identification (A), 4.1.3 Status Messages (AA) · Certain
- Where:
PaymentForm.tsxerror<div> - Problem: "Card declined" appears in red above the form with no role or link to the field. Screen reader users don't know the payment failed.
- Fix: render the message in a
role="alert"region, and setaria-invalid="true"andaria-describedbyon the card field. - Verify: submit a test card that declines and hear the error read out.
Serious Promo code link text is grey on white at 3.1:1
- WCAG: 1.4.3 Contrast (Minimum) (AA) · Certain
- Where:
.promo-link, colour#8a94a6 - Fix: use
#5b6576(5.9:1) or the brand blue. - Verify: axe rule
color-contrastshould pass.
Likely issues (depend on context)
- The "Express checkout" buttons are images from a third-party script. If they have no names inside the iframe, report it to the provider.
- The order summary collapses on mobile. If it uses a div with a click handler, it needs to be a button with
aria-expanded.
Needs a human test
- Product image alt text matches each photo.
- Checkout reads in a sensible order with a screen reader on a phone.
Quick wins
- Add
autocompletevalues (cc-number,cc-exp,postal-code) to the payment fields. - Make the quantity buttons at least 24 by 24 px.
Suggested next steps
- Fix the two blockers before the next release.
- Run the keyboard and screen reader script on the full checkout once.
- For legal risk questions, ask a qualified lawyer; this review is not a conformance report.
Get reports like this for your own code. Skilled A11y is $5, one time. Get Skilled A11y or try the free Quick Check.