Accessibility

Same five bugs in every audit: div buttons, missing labels, broken headings

Tab through your product. Can you see focus? Can you open and close a dialog without a mouse?

Semantic HTML before ARIA

<button> has role, keyboard handling, and form-submit built in. A <div role="button" tabIndex={0}> reproduces all of that worse.

ARIA is for tab panels, live regions, custom comboboxes. Reach for it second.

Icon buttons need aria-label

Skip links

Heading hierarchy

Contrast

WCAG: 4.5:1 body text, 3:1 large text and UI elements.

Never rely on colour alone:

:focus-visible

Never apply outline: none without a replacement.

Common mistakes