shadcn-ui

Full Reference: See advanced.md for accessibility patterns, virtualized tables, form integration with react-hook-form, testing patterns, and dark mode setup.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "shadcn-ui" with this command: npx skills add claude-dev-suite/claude-dev-suite/claude-dev-suite-claude-dev-suite-shadcn-ui

shadcn/ui Components

Full Reference: See advanced.md for accessibility patterns, virtualized tables, form integration with react-hook-form, testing patterns, and dark mode setup.

When NOT to Use This Skill

  • Radix UI primitives only - Use radix-ui skill for unstyled components

  • Custom component library - Build from scratch with Radix + Tailwind

  • Different UI framework - Material-UI, Chakra, Ant Design have own patterns

  • No Tailwind project - shadcn/ui requires Tailwind CSS

Installation

Initialize shadcn/ui in your project

npx shadcn@latest init

Add components

npx shadcn@latest add button card dialog dropdown-menu form input table

Button Variants

import { Button } from '@/components/ui/button';

<Button variant="default">Primary</Button> <Button variant="secondary">Secondary</Button> <Button variant="destructive">Delete</Button> <Button variant="outline">Outline</Button> <Button variant="ghost">Ghost</Button>

// With icon <Button> <PlusIcon className="mr-2 h-4 w-4" /> Add Item </Button>

// Loading state <Button disabled={isLoading}> {isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />} Save </Button>

Card Layout

import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';

<Card> <CardHeader> <CardTitle>User Profile</CardTitle> </CardHeader> <CardContent> {/* Content */} </CardContent> </Card>

Dialog (Modal)

import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';

<Dialog open={open} onOpenChange={setOpen}> <DialogTrigger asChild> <Button>Create User</Button> </DialogTrigger> <DialogContent> <DialogHeader> <DialogTitle>Create User</DialogTitle> </DialogHeader> <UserForm onSuccess={() => setOpen(false)} /> </DialogContent> </Dialog>

Data Table

import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';

<Table> <TableHeader> <TableRow> <TableHead>Name</TableHead> <TableHead>Email</TableHead> </TableRow> </TableHeader> <TableBody> {users.map((user) => ( <TableRow key={user.id}> <TableCell>{user.name}</TableCell> <TableCell>{user.email}</TableCell> </TableRow> ))} </TableBody> </Table>

Utils (cn function)

// lib/utils.ts import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge';

export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); }

// Usage <div className={cn("base-class", isActive && "active-class")} />

Anti-Patterns

Anti-Pattern Why It's Bad Correct Approach

Modifying component files directly Lost on re-install Wrap components or use variants

No DialogTitle/DialogDescription Accessibility issue Always include for screen readers

Missing aria labels Not accessible Add aria-label to interactive elements

Not using asChild Extra DOM nodes Use asChild to merge props

Hardcoding theme colors Can't change theme Use CSS variables from globals.css

Quick Troubleshooting

Issue Cause Solution

Components not found Not installed Run npx shadcn@latest add [component]

Styles not applying Globals.css not imported Import in layout/app

Dark mode not working No ThemeProvider Wrap app in ThemeProvider

Type errors Missing types Install @radix-ui/react-* peer deps

Dialog not closing No controlled state Add open and onOpenChange props

Form validation not working Missing zodResolver Add resolver: zodResolver(schema)

Theme Configuration

/* index.css / @layer base { :root { --background: 0 0% 100%; --foreground: 222.2 84% 4.9%; --primary: 222.2 47.4% 11.2%; / ... more variables */ } .dark { --background: 222.2 84% 4.9%; --foreground: 210 40% 98%; } }

Monitoring Metrics

Metric Target

Component bundle size < 50KB per component

First Input Delay < 100ms

Accessibility score 100%

Form submission time < 300ms

Checklist

  • Accessible labels on all form fields

  • DialogTitle and DialogDescription present

  • aria-describedby for error messages

  • Loading states with aria-busy

  • Lazy loading for heavy components

  • Virtual scrolling for large lists

  • Form validation with Zod

  • Dark mode with next-themes

  • Component tests with Testing Library

  • Accessibility tests with jest-axe

Reference Documentation

  • Component Reference

  • Theming

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

shadcn-ui

Expert guidance for integrating and building applications with shadcn/ui components, including component discovery, installation, customization, and best practices.

Repository Source
Coding

shadcn-ui

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

cron-scheduling

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

token-optimization

No summary provided by upstream source.

Repository SourceNeeds Review