shadcn – Design & UI skill for AI agents
Manages shadcn/ui components and projects, providing context, documentation, and usage patterns for building modern design systems.
Install the shadcn skill with one command
Pick the tool you use, copy the command and paste it in your terminal. The skill lands in that tool's skills folder and is ready in your next session.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/shadcn-a30dc.tgz | tar xz -C ~/.claude/skills
Call it in Claude Code: /shadcn – then describe the task you want done.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/shadcn-a30dc.tgz | tar xz -C ~/.codex/skills
Call it in Codex: $shadcn – then describe the task you want done.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/shadcn-a30dc.tgz | tar xz -C ~/.hermes/skills
Call it in Hermes Agent: /shadcn – then describe the task you want done.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/shadcn-a30dc.tgz | tar xz -C ~/.deepcode/skills
Call it in DeepSeek: /shadcn – then describe the task you want done.
SKILL.md content
shadcn/ui
A framework for building ui, components and design systems. Components are added as source code to the user's project via the CLI.
> IMPORTANT: Run all CLI commands using the project's package runner: npx shadcn@latest, pnpm dlx shadcn@latest, or bunx --bun shadcn@latest — based on the project's packageManager. Examples below use npx shadcn@latest but substitute the correct runner for the project.
When to Use
- Use when adding new components from shadcn/ui or community registries.
- Use when styling, composing, or debugging existing shadcn/ui components.
- Use when initializing a new project or switching design system presets.
- Use to retrieve component documentation, examples, and API references.
Current Project Context
Read components.json, the package manifest/lockfile and the installed component source first. If the approved CLI is available, run its info command in the intended project directory and inspect errors directly. Skill Markdown does not inject command output automatically; do not interpret the command text as project JSON or treat any CLI failure as evidence that initialization is needed.
Use the project's existing approved CLI version and package runner when available. The @latest examples download and execute a mutable npm package; establish the intended version and registry before running them.
Principles
1. Use existing components first. Use npx shadcn@latest search to check registries before writing custom UI. Check community registries too.
2. Compose, don't reinvent. Settings page = Tabs + Card + form controls. Dashboard = Sidebar + Card + Chart + Table.
3. Use built-in variants before custom styles. variant="outline", size="sm", etc.
4. Use semantic colors. bg-primary, text-muted-foreground — never raw values like bg-blue-500.
Critical Rules
These are defaults for the documented presets; installed source, accessibility requirements and explicit user design choices take precedence. Each links to a file with Incorrect/Correct code pairs.
Styling & Tailwind → [styling.md](./rules/styling.md)
classNamefor layout, not styling. Never override component colors or typography.- **No
space-x-*orspace-y-*.** Useflexwithgap-*. For vertical stacks,flex flex-col gap-*. - **Use
size-*when width and height are equal.**size-10notw-10 h-10. - Use
truncateshorthand. Notoverflow-hidden text-ellipsis whitespace-nowrap. - No manual
dark:color overrides. Use semantic tokens (bg-background,text-muted-foreground). - Use
cn()for conditional classes. Don't write manual template literal ternaries. - Prefer the component overlay stacking defaults; diagnose portal/stacking contexts before overriding them. Dialog, Sheet, Popover, etc. handle their own stacking.
Forms & Inputs → [forms.md](./rules/forms.md)
- Forms prefer installed
FieldGroup+Field. Never use rawdivwithspace-y-*orgrid gap-*for form layout. InputGroupusesInputGroupInput/InputGroupTextarea. Never rawInput/TextareainsideInputGroup.- Buttons inside inputs use
InputGroup+InputGroupAddon. - Toggle controls can use
ToggleGroup; independent boolean settings use switches or checkboxes. Don't loopButtonwith manual active state. FieldSet+FieldLegendfor grouping related checkboxes/radios. Don't use adivwith a heading.- Field validation uses
data-invalid+aria-invalid.data-invalidonField,aria-invalidon the control. For disabled:data-disabledonField,disabledon the control.
Component Structure → [composition.md](./rules/composition.md)
- Items always inside their Group.
SelectItem→SelectGroup.DropdownMenuItem→DropdownMenuGroup.CommandItem→CommandGroup. - Use
asChild(radix) orrender(base) for custom triggers. Checkbasefield fromnpx shadcn@latest info. → [base-vs-radix.md](./rules/base-vs-radix.md) - Dialog, Sheet, and Drawer always need a Title.
DialogTitle,SheetTitle,DrawerTitlerequired for accessibility. UseclassName="sr-only"if visually hidden. - Use full Card composition.
CardHeader/CardTitle/CardDescription/CardContent/CardFooter. Don't dump everything inCardContent. - Button has no
isPending/isLoading. Compose withSpinner+data-icon+disabled. TabsTriggermust be insideTabsList. Never render triggers directly inTabs.Avataralways needsAvatarFallback. For when the image fails to load.
Use Components, Not Custom Markup → [composition.md](./rules/composition.md)
- Use existing components before custom markup. Check if a component exists before writing a styled
div. - Callouts use
Alert. Don't build custom styled divs. - Empty states use
Empty. Don't build custom empty state markup. - Toast via
sonner. Usetoast()fromsonner. - Use
Separatorinstead of<hr>or<div className="border-t">. - Use
Skeletonfor loading placeholders. No customanimate-pulsedivs. - Use
Badgeinstead of custom styled spans.
Icons → [icons.md](./rules/icons.md)
- Icons in
Buttonusedata-icon.data-icon="inline-start"ordata-icon="inline-end"on the icon. - No sizing classes on icons inside components. Components handle icon sizing via CSS. No
size-4orw-4 h-4. - Pass icons as objects, not string keys.
icon={CheckIcon}, not a string lookup.
CLI
- Never decode or fetch preset codes manually. Pass them directly to
npx shadcn@latest init --preset <code>.
Key Patterns
These are the most common patterns that differentiate correct shadcn/ui code. For edge cases, see the linked rule files above.
// Form layout: FieldGroup + Field, not div + Label.
<FieldGroup>
<Field>
<FieldLabel htmlFor="email">Email</FieldLabel>
<Input id="email" />
</Field>
</FieldGroup>
// Validation: data-invalid on Field, aria-invalid on the control.
<Field data-invalid>
<FieldLabel htmlFor="invalid-email">Email</FieldLabel>
<Input id="invalid-email" aria-invalid aria-describedby="invalid-email-error" />
<FieldDescription id="invalid-email-error">Invalid email.</FieldDescription>
</Field>
// Icons in buttons: data-icon, no sizing classes.
<Button>
<SearchIcon data-icon="inline-start" />
Search
</Button>
// Spacing: gap-*, not space-y-*.
<div className="flex flex-col gap-4"> // correct
<div className="space-y-4"> // wrong
// Equal dimensions: size-*, not w-* h-*.
<Avatar className="size-10"> // correct
<Avatar className="w-10 h-10"> // wrong
// Status colors: Badge variants or semantic tokens, not raw colors.
<Badge variant="secondary">+20.1%</Badge> // correct
<span className="text-emerald-600">+20.1%</span> // wrongComponent Selection
| Need | Use |
| -------------------------- | --------------------------------------------------------------------------------------------------- |
| Button/action | Button with appropriate variant |
| Form inputs | Input, Select, Combobox, Switch, Checkbox, RadioGroup, Textarea, InputOTP, Slider |
| Toggle between 2–5 options | ToggleGroup + ToggleGroupItem |
| Data display | Table, Card, Badge, Avatar |
| Navigation | Sidebar, NavigationMenu, Breadcrumb, Tabs, Pagination |
| Overlays | Dialog (modal), Sheet (side panel), Drawer (bottom sheet), AlertDialog (confirmation) |
| Feedback | sonner (toast), Alert, Progress, Skeleton, Spinner |
| Command palette | Command inside Dialog |
| Charts | Chart (wraps Recharts) |
| Layout | Card, Separator, Resizable, ScrollArea, Accordion, Collapsible |
| Empty states | Empty |
| Menus | DropdownMenu, ContextMenu, Menubar |
| Tooltips/info | Tooltip, HoverCard, Popover |
Key Fields
The observed project context contains these key fields:
aliases
… (full content is in the download package)
Related skills
- skeuomorphism – Web and App implementation guide for Skeuomorphism. Trigger when user wants UI to mimic…
- smartui-skill – Generates SmartUI visual regression test configurations for screenshot comparison on…
- soft-pastel – Web and App implementation guide for Soft Pastel Design. Trigger when user wants gentle…
- spatial-computing-ui – Web and App implementation guide for Spatial Computing UI. Trigger when user wants…
- spatial-design – Web and App implementation guide for Spatial Design. Trigger when user wants…
- spec-driven-loop – Freeze PRD, technical design, and acceptance criteria before medium-to-large Codex work…
- stability-ai – Geracao de imagens via Stability AI (SD3.5, Ultra, Core). Text-to-image, img2img…
- stitch-design-taste – Use when generating Google Stitch DESIGN.md systems for premium typography, color…