shadcn/ui Community Best Practices
Comprehensive best practices guide for shadcn/ui applications, maintained by the shadcn/ui community. Contains 58 rules across 10 categories, prioritized by impact to guide automated refactoring and code generation.
When to Apply
Reference these guidelines when:
-
Installing and configuring shadcn/ui in a project
-
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
- CLI & Project Setup (CRITICAL)
-
setup-components-json
-
Configure components.json before adding components
-
setup-path-aliases
-
Configure TypeScript path aliases to match components.json
-
setup-cn-utility
-
Create the cn utility before using components
-
setup-use-cli-not-copy
-
Use CLI to add components instead of copy-paste
-
setup-css-variables-theme
-
Enable CSS variables for consistent theming
-
setup-rsc-configuration
-
Set RSC flag based on framework support
- Component Architecture (CRITICAL)
-
arch-use-asChild-for-custom-triggers
-
Use asChild prop for custom trigger elements
-
arch-preserve-radix-primitive-structure
-
Maintain Radix compound component hierarchy
-
arch-extend-variants-with-cva
-
Use Class Variance Authority for type-safe variants
-
arch-use-cn-for-class-merging
-
Use cn() utility for safe Tailwind class merging
-
arch-forward-refs-for-composable-components
-
Forward refs for form and focus integration
-
arch-isolate-component-variants
-
Separate base styles from variant-specific styles
- Accessibility Preservation (CRITICAL)
-
ally-preserve-aria-attributes
-
Keep Radix ARIA attributes intact
-
ally-provide-sr-only-labels
-
Add screen reader labels for icon buttons
-
ally-maintain-focus-management
-
Preserve focus trapping in modals
-
ally-preserve-keyboard-navigation
-
Keep WAI-ARIA keyboard patterns
-
ally-ensure-color-contrast
-
Maintain WCAG color contrast ratios
-
ally-dialog-title-required
-
Always include DialogTitle for screen readers
-
ally-form-field-labels
-
Associate labels with form controls
-
ally-aria-invalid-errors
-
Use aria-invalid for form error states
-
ally-checkbox-label-association
-
Wrap Checkbox with Label for click target
-
ally-focus-visible-styles
-
Preserve focus visible styles for keyboard navigation
- Styling & Theming (HIGH)
-
style-use-css-variables-for-theming
-
Use CSS variables for theme colors
-
style-avoid-important-overrides
-
Never use !important for style overrides
-
style-use-tailwind-theme-extend
-
Extend Tailwind theme for design tokens
-
style-consistent-spacing-scale
-
Use consistent Tailwind spacing scale
-
style-responsive-design-patterns
-
Apply mobile-first responsive design
-
style-dark-mode-support
-
Support dark mode with CSS variables
- Form Patterns (HIGH)
-
form-use-react-hook-form-integration
-
Integrate with React Hook Form
-
form-use-zod-for-schema-validation
-
Use Zod for type-safe validation
-
form-show-validation-errors-correctly
-
Show errors at appropriate times
-
form-handle-async-validation
-
Debounce async validation calls
-
form-reset-form-state-correctly
-
Reset form state after submission
- Data Display (MEDIUM-HIGH)
-
data-use-tanstack-table-for-complex-tables
-
Use TanStack Table for sorting/filtering
-
data-virtualize-large-lists
-
Virtualize lists with 100+ items
-
data-use-skeleton-loading-states
-
Use Skeleton for loading states
-
data-paginate-server-side
-
Paginate large datasets server-side
-
data-empty-states-with-guidance
-
Provide actionable empty states
- Layout & Navigation (MEDIUM)
-
layout-sidebar-provider
-
Wrap layout with SidebarProvider
-
layout-sidebar-collapsible
-
Configure sidebar collapsible behavior
-
layout-sidebar-groups
-
Organize sidebar navigation with groups
-
layout-sheet-mobile-nav
-
Use Sheet for mobile navigation overlay
-
layout-breadcrumb-navigation
-
Implement breadcrumbs for deep navigation
- Component Composition (MEDIUM)
-
comp-compose-with-compound-components
-
Use compound component patterns
-
comp-use-drawer-for-mobile-modals
-
Use Drawer on mobile devices
-
comp-combine-command-with-popover
-
Create searchable selects with Command
-
comp-nest-dialogs-correctly
-
Manage nested dialog focus correctly
-
comp-create-reusable-form-fields
-
Extract reusable form field components
-
comp-use-slot-pattern-for-flexibility
-
Use slot pattern for flexible content
- Performance Optimization (MEDIUM)
-
perf-lazy-load-heavy-components
-
Lazy load components over 50KB
-
perf-memoize-expensive-renders
-
Memoize list items and expensive components
-
perf-optimize-icon-imports
-
Use direct imports for Lucide icons
-
perf-avoid-unnecessary-rerenders-in-forms
-
Isolate form field watching
-
perf-debounce-search-inputs
-
Debounce search and filter inputs
- State Management (LOW-MEDIUM)
-
state-prefer-uncontrolled-for-simple-inputs
-
Use uncontrolled for simple forms
-
state-lift-state-to-appropriate-level
-
Lift state to lowest common ancestor
-
state-use-controlled-dialog-state
-
Control dialogs for programmatic access
-
state-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
Full Compiled Document
For a single-file reference containing all rules, see AGENTS.md.
Reference Files
File Description
AGENTS.md Complete compiled guide with all rules
references/_sections.md Category definitions and ordering
assets/templates/_template.md Template for new rules
metadata.json Version and reference information