Loading...
Loading...
Accessibility review checklist for React/Next.js components built on Radix UI / shadcn/ui. Covers component library misuse, form accessibility, accessible names, keyboard interaction, focus management, and dynamic content. Loaded by pr-review-frontend.
npx skill4agent add inkeep/agents accessibility-checklistDialogSheetDialogTitleSheetTitleDialogTitlearia-labelDialogContent<DialogContent><DialogTitle>aria-label<VisuallyHidden><DialogTitle>...</DialogTitle></VisuallyHidden>AlertDialogContentAlertDialogDescriptionaria-describedby={undefined}Selectaria-labelgeneric-select.tsxgeneric-combo-box.tsx<Select>htmlForaria-label<DropdownMenuItem><TrashIcon /> Delete</DropdownMenuItem><DropdownMenuItem><TrashIcon /></DropdownMenuItem>aria-label<Tooltip><TooltipTrigger><Button><Icon /></Button></TooltipTrigger><TooltipContent>Delete</TooltipContent></Tooltip>aria-label="Delete"onKeyDowne.preventDefault()e.stopPropagation()FormFormItem<FormLabel><label htmlFor={id}>aria-labelaria-labelledby<FormField><FormItem><Input placeholder="Enter name" /><FormMessage>aria-describedby<FormItem><FormMessage>aria-describedbyaria-required="true"requiredForm<RadioGroup><fieldset><legend>aria-labelaria-label<Button variant="ghost" size="icon"><TrashIcon /></Button>aria-labelDialog<span className="sr-only">Close</span><a><Link>aria-labelsr-onlyaria-label<Button><TrashIcon /><span className="sr-only">Delete item</span></Button>aria-hidden="true"<Button><PlusIcon aria-hidden="true" /> Add item</Button>aria-hidden<div onClick><button><a><Link><div><span><p>onClick<div onClick><span onClick><table><thead><tbody><th><td><div><th>scope="col"scope="row"user-scalable=nomaximum-scale=1outline-noneoutline: nonefocus-visible:ring-*focus-visible:ring-*outline-noneoutline-nonetabIndex={0}tabIndex={-1}tabIndex={1}role="status"aria-live="polite"role="alert"role="status"aria-busy="true"<span className="sr-only">Loading...</span>aria-live="polite"Spinneraria-label@inkeep/agents-uiaria-describedby<FormMessage>aria-live="polite"<FormMessage>aria-label| Finding | Severity | Rationale |
|---|---|---|
| CRITICAL | Completely blocks keyboard/screen reader users |
| Keyboard trap (user cannot Tab out of a component) | CRITICAL | Completely blocks keyboard users |
| Custom modal without focus management (not using Radix Dialog) | MAJOR | Major disorientation for keyboard/screen reader users |
| Form input without accessible name (no label, no aria-label) | MAJOR | Screen reader users cannot identify the input |
Icon-only button without | MAJOR | Screen reader users cannot identify the action |
| Dialog without DialogTitle and no aria-label | MAJOR | Screen reader users don't know what the dialog is for |
| MAJOR | Creates ghost focus for screen reader users |
| Error message not associated with input (outside FormMessage) | MAJOR | Screen reader users don't know about validation errors |
| MAJOR | Keyboard users lose their place |
| Radix keyboard handling overridden via stopPropagation | MAJOR | Breaks built-in a11y of the component library |
| Missing alt text on informational image | MINOR | Information not conveyed, but usually not blocking |
Decorative icon missing | MINOR | Redundant announcement — annoying, not blocking |
| Custom notification/toast without live region | MINOR | Status not announced, but visually evident |
| Redundant ARIA on native elements | MINOR | Noise, not breakage — indicates misunderstanding |
Missing | INFO | Navigation degraded in complex tables, not blocking |