Deep expertise on shadcn/ui component library including installation, customization, theming, and accessibility patterns. Use when building UI with shadcn/ui components, integrating Radix UI primitives, configuring Tailwind CSS v4 themes, or implementing dark mode. Covers Next.js App Router, Pages Router, and Vite setups.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Deep expertise on shadcn/ui component library including installation, customization, theming, and accessibility patterns. Use when building UI with shadcn/ui components, integrating Radix UI primitives, configuring Tailwind CSS v4 themes, or implementing dark mode. Covers Next.js App Router, Pages Router, and Vite setups.
Comprehensive guide to building UIs with shadcn/ui -- the copy-paste component library built on Radix UI primitives and Tailwind CSS. Components are not installed as a dependency; they are copied into your project for full ownership and customization.
When to Apply
Use this skill when:
Adding shadcn/ui components to a React or Next.js project
Customizing component styles, variants, or behavior
Setting up Tailwind CSS v4 theming with CSS variables
Implementing dark mode with shadcn/ui
Building accessible forms, dialogs, or data tables
Choosing between shadcn/ui components and custom implementations
Core Concepts
shadcn/ui is NOT a Component Library
shadcn/ui is a collection of reusable components that you copy into your project. Key differences from traditional libraries:
No npm package dependency -- components live in your codebase
Full ownership -- modify any component freely
Radix UI primitives -- accessible, unstyled headless components under the hood
Tailwind CSS -- all styling via utility classes and CSS variables
shadcn/ui components are built on Radix UI, which provides:
Full keyboard navigation (Tab, Arrow keys, Enter, Escape)
ARIA attributes (roles, states, properties)
Focus management (trapping, restoration)
Screen reader announcements
Key Accessibility Features by Component
Component
Keyboard
ARIA
Focus Trap
Button
Enter/Space to activate
role="button"
No
Dialog
Escape to close
role="dialog", aria-modal
Yes
Dropdown Menu
Arrow keys to navigate
role="menu", role="menuitem"
Yes
Select
Arrow keys, type-ahead
role="listbox", role="option"
Yes
Tabs
Arrow keys between tabs
role="tablist", role="tab"
No
Toast
Auto-announce
role="status", aria-live
No
Tooltip
Focus/hover to show
role="tooltip"
No
Custom Accessibility Enhancements
// Always provide labels for interactive elements
<Button aria-label="Close dialog">
<XclassName="h-4 w-4" />
</Button>
// Use sr-only for visual-only content<spanclassName="sr-only">Loading...</span>// Announce dynamic content<divaria-live="polite"aria-atomic="true">
{statusMessage}
</div>
Anti-Patterns
Do NOT install shadcn/ui as an npm package -- use the CLI to copy components
Do NOT modify Radix primitives directly -- extend via the shadcn wrapper component
Do NOT use hardcoded colors -- always use CSS variable theme tokens
Do NOT skip the cn() utility -- it prevents Tailwind class conflicts
Do NOT forget suppressHydrationWarning on <html> when using next-themes
Do NOT nest interactive elements (button inside button, link inside button)
Iron Laws
NEVER install shadcn/ui as a package dependency — components must be copied into the project for full ownership
ALWAYS use the cn() utility for conditional class names to prevent Tailwind class conflicts
NEVER hardcode colors — always use CSS variable theme tokens for theming consistency
ALWAYS use Radix UI primitives through the shadcn/ui abstraction, not directly
NEVER nest interactive elements (button inside button, link inside button) — violates accessibility standards
Anti-Patterns
Anti-Pattern
Why It Fails
Correct Approach
Installing as a package
Component source is locked; no customization possible
Use npx shadcn@latest add to copy components into your project
Hardcoding color values
Theme switching breaks; dark mode fails
Use CSS variable tokens (bg-background, text-foreground, etc.)
Skipping cn() utility
Tailwind class conflicts produce unpredictable styles
Always merge classes with cn() from @/lib/utils
Direct Radix UI primitive use
Missing shadcn styling and accessibility wiring
Use shadcn components that wrap Radix primitives with correct classes
Missing suppressHydrationWarning
Hydration mismatch errors with next-themes dark mode
Add suppressHydrationWarning to <html> when using next-themes
Memory Protocol (MANDATORY)
Before starting:
Read .claude/context/memory/learnings.md
After completing:
New pattern -> .claude/context/memory/learnings.md
Issue found -> .claude/context/memory/issues.md
Decision made -> .claude/context/memory/decisions.md
ASSUME INTERRUPTION: If it's not in memory, it didn't happen.