Reviews shadcn/ui components for CVA patterns, composition with asChild, accessibility states, and data-slot usage. Use when reviewing React components using shadcn/ui, Radix primitives, or Tailwind styling.
View on GitHubskills/shadcn-code-review/SKILL.md
February 1, 2026
Select agents to install to:
npx add-skill https://github.com/existential-birds/beagle/blob/main/skills/shadcn-code-review/SKILL.md -a claude-code --skill shadcn-code-reviewInstallation paths:
.claude/skills/shadcn-code-review/# shadcn/ui Code Review ## Quick Reference | Issue Type | Reference | |------------|-----------| | className in CVA, missing VariantProps, compound variants | [references/cva-patterns.md](references/cva-patterns.md) | | asChild without Slot, missing Context, component composition | [references/composition.md](references/composition.md) | | Missing focus-visible, aria-invalid, disabled states | [references/accessibility.md](references/accessibility.md) | | Missing data-slot, incorrect CSS targeting | [references/data-slot.md](references/data-slot.md) | ## Review Checklist - [ ] `cn()` receives className, not CVA variants - [ ] `VariantProps<typeof variants>` exported for consumers - [ ] Compound variants used for complex state combinations - [ ] `asChild` pattern uses `@radix-ui/react-slot` - [ ] Context used for component composition (Card, Accordion, etc.) - [ ] `focus-visible:` states, not just `:focus` - [ ] `aria-invalid`, `aria-disabled` for form states - [ ] `disabled:` variants for all interactive elements - [ ] `sr-only` for screen reader text - [ ] `data-slot` attributes for targetable composition parts - [ ] CSS uses `has()` selectors for state-based styling - [ ] No direct className overrides of variant styles ## Valid Patterns (Do NOT Flag) These are correct patterns that should NOT be flagged as issues: - `max-h-(--var)` - correct Tailwind v4 CSS variable syntax (NOT v3 bracket notation) - `text-[color:var(--x)]` - valid arbitrary value syntax - Copying shadcn component code into project - intended usage pattern - Not documenting copied shadcn components - library internals, not custom code - Using cn() with many arguments - composition is the pattern - Conditional classes in cn() arrays - valid Tailwind pattern - Extending primitive components without additional docs - well-known base ## Context-Sensitive Rules Apply these rules with appropriate context awareness: - Flag accessibility issues ONLY IF not handled by Radix primitives underneath