About shadcn
A best-practice skill for teams building and refactoring shadcn/ui projects. Its prioritized rules cover setup, component composition, accessibility, styling, forms, data display, and performance.
Key features
- 0158 prioritized rules in 10 categories
- 02Setup and migration guidance
- 03Component and primitive composition patterns
- 04Accessibility and keyboard-use checks
- 05Form, table, and theme practices
- 06Performance and state guidance
Use cases
- 01Setting up or migrating shadcn/ui
- 02Reviewing component accessibility
- 03Implementing forms with validation
- 04Building tables for large datasets
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ shipshitdev/ skills --skill shadcnAfter installing, type/shadcnin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
AGENTS.mdplugin.jsonREADME.mdassets/templates/_template.mdreferences/_sections.md_setup-mode.mdally-aria-invalid-errors.mdally-checkbox-label-association.mdally-dialog-title-required.mdally-ensure-color-contrast.mdally-focus-visible-styles.mdally-form-field-labels.mdally-maintain-focus-management.mdally-preserve-aria-attributes.mdally-preserve-keyboard-navigation.mdally-provide-sr-only-labels.mdarch-extend-variants-with-cva.mdarch-forward-refs-for-composable-components.mdarch-isolate-component-variants.mdarch-preserve-radix-primitive-structure.mdarch-use-asChild-for-custom-triggers.mdarch-use-cn-for-class-merging.mdcomp-combine-command-with-popover.mdcomp-compose-with-compound-components.mdcomp-create-reusable-form-fields.mdcomp-nest-dialogs-correctly.mdcomp-use-drawer-for-mobile-modals.mdcomp-use-slot-pattern-for-flexibility.mddata-empty-states-with-guidance.mddata-paginate-server-side.mdDetails
From the project READMEshadcn/ui Community Best Practices
58 rules across 10 categories for shadcn/ui, prioritized by impact to guide automated refactoring and code generation.
Stack baseline
Rules target current shadcn/ui: Tailwind CSS v4 (CSS-first, no tailwind.config.*, tokens in @theme inline), React 19 (ref as a prop, data-slot attributes), the unified radix-ui package, OKLCH color tokens, tw-animate-css, Field + React Hook Form Controller forms, and Bun (bunx --bun shadcn@latest ...). Examples use the Radix base (--base radix); the CLI also supports a Base UI base (--base base), where triggers take a render prop instead of asChild. For a Tailwind v3 project, keep the existing config and follow the shadcn upgrade guide first.
Setup mode
Use when installing, repairing or migrating shadcn/ui (new project, existing project, Tailwind v3 to v4). Follow references/_setup-mode.md: pick the bunx --bun shadcn@latest init path, then wire Tailwind v4 CSS-first (@theme inline, @custom-variant dark), components.json with an empty tailwind.config, the cn() helper, and the validation checklist. Do only the requested setup and confirm before overwriting existing styles, config or components. After setup, the rules below apply.
When to Apply
- Installing and configuring shadcn/ui in a project (see Setup mode)
- Writing new shadcn/ui components or composing primitives
- Implementing forms with React Hook Form and Zod validation
- Building data tables or handling large dataset displays
- Customizing themes or adding dark mode support
- Reviewing code for accessibility compliance
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | CLI & Project Setup | CRITICAL | setup- |
| 2 | Component Architecture | CRITICAL | arch- |
| 3 | Accessibility Preservation | CRITICAL | ally- |
| 4 | Styling & Theming | HIGH | style- |
| 5 | Form Patterns | HIGH | form- |
| 6 | Data Display | MEDIUM-HIGH | data- |
| 7 | Layout & Navigation | MEDIUM | layout- |
| 8 | Component Composition | MEDIUM | comp- |
| 9 | Performance Optimization | MEDIUM | perf- |
| 10 | State Management | LOW-MEDIUM | state- |
Quick Reference
1. CLI & Project Setup (CRITICAL)
setup-components-json- Configure components.json (empty tailwind.config for v4) before adding componentssetup-path-aliases- Configure TypeScript path aliases to match components.jsonsetup-cn-utility- Create the cn utility (re-export fromcn) before using componentssetup-use-cli-not-copy- Use CLI to add components instead of copy-pastesetup-css-variables-theme- Enable CSS variables for consistent themingsetup-rsc-configuration- Set RSC flag based on framework support
2. Component Architecture (CRITICAL)
arch-use-asChild-for-custom-triggers- Use asChild prop for custom trigger elementsarch-preserve-radix-primitive-structure- Maintain Radix compound component hierarchyarch-extend-variants-with-cva- Use Class Variance Authority for type-safe variantsarch-use-cn-for-class-merging- Use cn() utility for safe Tailwind class mergingarch-forward-refs-for-composable-components- Pass refs through to the underlying element (React 19 ref prop)arch-isolate-component-variants- Separate base styles from variant-specific styles
3. Accessibility Preservation (CRITICAL)
ally-preserve-aria-attributes- Keep Radix ARIA attributes intactally-provide-sr-only-labels- Add screen reader labels for icon buttonsally-maintain-focus-management- Preserve focus trapping in modalsally-preserve-keyboard-navigation- Keep WAI-ARIA keyboard patternsally-ensure-color-contrast- Maintain WCAG color contrast ratiosally-dialog-title-required- Always include DialogTitle for screen readersally-form-field-labels- Associate labels with form controlsally-aria-invalid-errors- Use aria-invalid for form error statesally-checkbox-label-association- Wrap Checkbox with Label for click targetally-focus-visible-styles- Preserve focus visible styles for keyboard navigation
4. Styling & Theming (HIGH)
style-use-css-variables-for-theming- Use CSS variables for theme colorsstyle-avoid-important-overrides- Never use !important for style overridesstyle-use-tailwind-theme-extend- Define design tokens in CSS with @theme inlinestyle-consistent-spacing-scale- Use consistent Tailwind spacing scalestyle-responsive-design-patterns- Apply mobile-first responsive designstyle-dark-mode-support- Support dark mode with CSS variables
5. Form Patterns (HIGH)
form-use-react-hook-form-integration- Integrate React Hook Form with Field and Controllerform-use-zod-for-schema-validation- Use Zod for type-safe validationform-show-validation-errors-correctly- Show errors at appropriate timesform-handle-async-validation- Debounce async validation callsform-reset-form-state-correctly- Reset form state after submission
6. Data Display (MEDIUM-HIGH)
data-use-tanstack-table-for-complex-tables- Use TanStack Table for sorting/filteringdata-virtualize-large-lists- Virtualize lists with 100+ itemsdata-use-skeleton-loading-states- Use Skeleton for loading statesdata-paginate-server-side- Paginate large datasets server-sidedata-empty-states-with-guidance- Provide actionable empty states
7. Layout & Navigation (MEDIUM)
layout-sidebar-provider- Wrap layout with SidebarProviderlayout-sidebar-collapsible- Configure sidebar collapsible behaviorlayout-sidebar-groups- Organize sidebar navigation with groupslayout-sheet-mobile-nav- Use Sheet for mobile navigation overlaylayout-breadcrumb-navigation- Implement breadcrumbs for deep navigation
8. Component Composition (MEDIUM)
comp-compose-with-compound-components- Use compound component patternscomp-use-drawer-for-mobile-modals- Use Drawer on mobile devicescomp-combine-command-with-popover- Create searchable selects with Commandcomp-nest-dialogs-correctly- Manage nested dialog focus correctlycomp-create-reusable-form-fields- Extract reusable form field componentscomp-use-slot-pattern-for-flexibility- Use slot pattern for flexible content
9. Performance Optimization (MEDIUM)
perf-lazy-load-heavy-components- Lazy load components over 50KBperf-memoize-expensive-renders- Memoize list items and expensive componentsperf-optimize-icon-imports- Use direct imports for Lucide iconsperf-avoid-unnecessary-rerenders-in-forms- Isolate form field watchingperf-debounce-search-inputs- Debounce search and filter inputs
10. State Management (LOW-MEDIUM)
state-prefer-uncontrolled-for-simple-inputs- Use uncontrolled for simple formsstate-lift-state-to-appropriate-level- Lift state to lowest common ancestorstate-use-controlled-dialog-state- Control dialogs for programmatic accessstate-colocate-state-with-components- Keep state close to where it's used
How to Use
Read individual reference files for detailed explanations and code examples:
- Section definitions - Category structure and impact levels
- Rule template - Template for adding new rules
Reference Files
| File | Description |
|---|---|
| references/_sections.md | Category definitions and ordering |
| assets/templates/_template.md | Template for new rules |