You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Focus is visible (outline/ring on focused elements)
Custom widgets have keyboard support (Enter to activate, Escape to close)
No keyboard traps (user can always Tab away from a component)
Skip-to-content link at top of page - visible (at least) on keyboard focus
Modals trap focus while open, return focus on close
Screen Readers
All images have alt text (or alt="" for decorative images)
All form inputs have associated labels (<label> or aria-label)
Buttons and links have descriptive text (not "Click here")
Icon-only buttons have aria-label
Page has one <h1> and headings don't skip levels
Dynamic content changes announced (aria-live regions)
Tables have <th> headers with scope
Visual
Text contrast ≥ 4.5:1 (normal text) or ≥ 3:1 (large text, 18px+)
UI components contrast ≥ 3:1 against background
Color is not the only way to convey information
Text resizable to 200% without breaking layout
No content that flashes more than 3 times per second
Forms
Every input has a visible label
Required fields indicated (not by color alone)
Error messages specific and associated with the field
Error state visible by more than color (icon, text, border)
Form submission errors summarized and focusable
Known fields use autocomplete (for example type="email" autocomplete="email")
Content
Language declared (<html lang="en">)
Page has a descriptive <title>
Links distinguish from surrounding text (not by color alone)
Touch targets ≥ 44x44px on mobile
Meaningful empty states (not blank screens)
Common HTML Patterns
Buttons vs. Links
<!-- Use <button> for actions --><buttononClick={handleDelete}>Delete Task</button><!-- Use <a> for navigation --><ahref="/tasks/123">View Task</a><!-- NEVER use div/span as buttons --><divonClick={handleDelete}>Delete</div><!-- BAD -->