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.
Current Project Context
!`npx shadcn@latest info --json`
The JSON above contains the project config and installed components. Use npx shadcn@latest docs <component> to get documentation and example URLs for any component.
Principles
- Use existing components first. Use
npx shadcn@latest search to check registries before writing custom UI. Check community registries too.
- Compose, don't reinvent. Settings page = Tabs + Card + form controls. Dashboard = Sidebar + Card + Chart + Table.
- Use built-in variants before custom styles.
variant="outline", size="sm", etc.
- Use semantic colors.
bg-primary, text-muted-foreground — never raw values like bg-blue-500.
Critical Rules
These rules are always enforced. Each links to a file with Incorrect/Correct code pairs.
Styling & Tailwind → styling.md
className for layout, not styling. Never override component colors or typography.
- No
space-x-* or space-y-*. Use flex with gap-*. For vertical stacks, flex flex-col gap-*.
- Use
size-* when width and height are equal. size-10 not w-10 h-10.
- Use
truncate shorthand. Not overflow-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.
- No manual
z-index on overlay components. Dialog, Sheet, Popover, etc. handle their own stacking.
Forms & Inputs → forms.md
- Forms use
FieldGroup + Field. Never use raw div with space-y-* or grid gap-* for form layout.
InputGroup uses InputGroupInput/InputGroupTextarea. Never raw Input/Textarea inside InputGroup.
- Buttons inside inputs use
InputGroup + InputGroupAddon.
- Option sets (2–7 choices) use
ToggleGroup. Don't loop Button with manual active state.
FieldSet + FieldLegend for grouping related checkboxes/radios. Don't use a div with a heading.
- Field validation uses
data-invalid + aria-invalid. data-invalid on Field, aria-invalid on the control. For disabled: data-disabled on Field, disabled on the control.
- Items always inside their Group.
SelectItem → SelectGroup. DropdownMenuItem → DropdownMenuGroup. CommandItem → CommandGroup.
- Use
asChild (radix) or render (base) for custom triggers. Check base field from npx shadcn@latest info. → base-vs-radix.md
- Dialog, Sheet, and Drawer always need a Title.
DialogTitle, SheetTitle, DrawerTitle required for accessibility. Use className="sr-only" if visually hidden.
- Use full Card composition.
CardHeader/CardTitle/CardDescription/CardContent/CardFooter. Don't dump everything in CardContent.
- Button has no
isPending/isLoading. Compose with Spinner + data-icon + disabled.
TabsTrigger must be inside TabsList. Never render triggers directly in Tabs.
Avatar always needs AvatarFallback. For when the image fails to load.
Use Components, Not Custom Markup → 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. Use toast() from sonner.
- Use
Separator instead of <hr> or <div className="border-t">.
- Use
Skeleton for loading placeholders. No custom animate-pulse divs.
- Use
Badge instead of custom styled spans.
- Icons in
Button use data-icon. data-icon="inline-start" or data-icon="inline-end" on the icon.
- No sizing classes on icons inside components. Components handle icon sizing via CSS. No
size-4 or w-4 h-4.
- Pass icons as objects, not string keys.
icon={IconCheck}, 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>Email</FieldLabel>
<Input aria-invalid />
<FieldDescription>Invalid email.</FieldDescription>
</Field>
// Icons in buttons: data-icon, no sizing classes.
<Button>
<IconSearch stroke={1.5} 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> // wrong
Component 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 injected project context contains these key fields:
aliases → use the actual alias prefix for imports (e.g. @/, ~/), never hardcode.
isRSC → when true, components using useState, useEffect, event handlers, or browser APIs need "use client" at the top of the file. Always reference this field when advising on the directive.
tailwindVersion → "v4" uses @theme inline blocks; "v3" uses tailwind.config.js.
tailwindCssFile → the global CSS file where custom CSS variables are defined. Always edit this file, never create a new one.
style → component visual treatment (e.g. nova, vega).
base → primitive library (radix or base). Affects component APIs and available props.
iconLibrary → use tabler and import icons from @tabler/icons-react, including in documentation examples.
resolvedPaths → exact file-system destinations for components, utils, hooks, etc.
framework → routing and file conventions (e.g. Next.js App Router vs Vite SPA).
packageManager → use this for any non-shadcn dependency installs (e.g. pnpm add date-fns vs npm install date-fns).
See cli.md — info command for the full field reference.
Component Docs, Examples, and Usage
Run npx shadcn@latest docs <component> to get the URLs for a component's documentation, examples, and API reference. Fetch these URLs to get the actual content.
npx shadcn@latest docs button dialog select
When creating, fixing, debugging, or using a component, always run npx shadcn@latest docs and fetch the URLs first. This ensures you're working with the correct API and usage patterns rather than guessing.
Workflow
- Get project context — already injected above. Run
npx shadcn@latest info again if you need to refresh.
- Check installed components first — before running
add, always check the components list from project context or list the resolvedPaths.ui directory. Don't import components that haven't been added, and don't re-add ones already installed.
- Find components —
npx shadcn@latest search.
- Get docs and examples — run
npx shadcn@latest docs <component> to get URLs, then fetch them. Use npx shadcn@latest view to browse registry items you haven't installed. To preview changes to installed components, use npx shadcn@latest add --diff.
- Install or update —
npx shadcn@latest add. When updating existing components, use --dry-run and --diff to preview changes first (see Updating Components below).
- Fix imports in third-party components — After adding components from community registries (e.g.
@bundui, @magicui), check the added non-UI files for hardcoded import paths like @/components/ui/.... These won't match the project's actual aliases. Use npx shadcn@latest info to get the correct ui alias (e.g. @workspace/ui/components) and rewrite the imports accordingly. The CLI rewrites imports for its own UI files, but third-party registry components may use default paths that don't match the project.
- Review added components — After adding a component or block from any registry, always read the added files and verify they are correct. Check for missing sub-components (e.g.
SelectItem without SelectGroup), missing imports, incorrect composition, or violations of the Critical Rules. Convert icons to Tabler in source and documentation examples, using verified exports from @tabler/icons-react. Fix all issues before moving on.
- Registry must be explicit — When the user asks to add a block or component, do not guess the registry. If no registry is specified (e.g. user says "add a login block" without specifying
@shadcn, @tailark, etc.), ask which registry to use. Never default to a registry on behalf of the user.
- Switching presets — Ask the user first: reinstall, merge, or skip?
- Reinstall:
npx shadcn@latest init --preset <code> --force --reinstall. Overwrites all components.
- Merge:
npx shadcn@latest init --preset <code> --force --no-reinstall, then run npx shadcn@latest info to list installed components, then for each installed component use --dry-run and --diff to smart merge it individually.
- Skip:
npx shadcn@latest init --preset <code> --force --no-reinstall. Only updates config and CSS, leaves components as-is.
- Important: Always run preset commands inside the user's project directory. The CLI automatically preserves the current base (
base vs radix) from components.json. If you must use a scratch/temp directory (e.g. for --dry-run comparisons), pass --base <current-base> explicitly — preset codes do not encode the base.
Updating Components
When the user asks to update a component from upstream while keeping their local changes, use --dry-run and --diff to intelligently merge. NEVER fetch raw files from GitHub manually — always use the CLI.
- Run
npx shadcn@latest add <component> --dry-run to see all files that would be affected.
- For each file, run
npx shadcn@latest add <component> --diff <file> to see what changed upstream vs local.
- Decide per file based on the diff:
- No local changes → safe to overwrite.
- Has local changes → read the local file, analyze the diff, and apply upstream updates while preserving local modifications.
- User says "just update everything" → use
--overwrite, but confirm first.
- Never use
--overwrite without the user's explicit approval.
Quick Reference
# Create a new project.
npx shadcn@latest init --name my-app --preset base-nova
npx shadcn@latest init --name my-app --preset a2r6bw --template vite
# Create a monorepo project.
npx shadcn@latest init --name my-app --preset base-nova --monorepo
npx shadcn@latest init --name my-app --preset base-nova --template next --monorepo
# Initialize existing project.
npx shadcn@latest init --preset base-nova
npx shadcn@latest init --defaults # shortcut: --template=next --preset=base-nova
# Add components.
npx shadcn@latest add button card dialog
npx shadcn@latest add @magicui/shimmer-button
npx shadcn@latest add --all
# Preview changes before adding/updating.
npx shadcn@latest add button --dry-run
npx shadcn@latest add button --diff button.tsx
npx shadcn@latest add @acme/form --view button.tsx
# Search registries.
npx shadcn@latest search @shadcn -q "sidebar"
npx shadcn@latest search @tailark -q "stats"
# Get component docs and example URLs.
npx shadcn@latest docs button dialog select
# View registry item details (for items not yet installed).
npx shadcn@latest view @shadcn/button
Named presets: base-nova, radix-nova
Templates: next, vite, start, react-router, astro (all support --monorepo) and laravel (not supported for monorepo)
Preset codes: Base62 strings starting with a (e.g. a2r6bw), from ui.shadcn.com.
Detailed References
- rules/forms.md — FieldGroup, Field, InputGroup, ToggleGroup, FieldSet, validation states
- rules/composition.md — Groups, overlays, Card, Tabs, Avatar, Alert, Empty, Toast, Separator, Skeleton, Badge, Button loading
- rules/icons.md — data-icon, icon sizing, passing icons as objects
- rules/styling.md — Semantic colors, variants, className, spacing, size, truncate, dark mode, cn(), z-index
- rules/base-vs-radix.md — asChild vs render, Select, ToggleGroup, Slider, Accordion
- cli.md — Commands, flags, presets, templates
- customization.md — Theming, CSS variables, extending components
1---2name: shadcn3description: Manages shadcn components and projects — adding, searching, fixing, debugging, styling, and composing UI. Provides project context, component docs, and usage examples. Applies when working with shadcn/ui, component registries, presets, --preset codes, or any project with a components.json file. Also triggers for "shadcn init", "create an app with --preset", or "switch to --preset".4---56# shadcn/ui78A framework for building ui, components and design systems. Components are added as source code to the user's project via the CLI.910> **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.1112## Current Project Context1314```json15!`npx shadcn@latest info --json`16```1718The JSON above contains the project config and installed components. Use `npx shadcn@latest docs <component>` to get documentation and example URLs for any component.1920## Principles21221. **Use existing components first.** Use `npx shadcn@latest search` to check registries before writing custom UI. Check community registries too.232. **Compose, don't reinvent.** Settings page = Tabs + Card + form controls. Dashboard = Sidebar + Card + Chart + Table.243. **Use built-in variants before custom styles.** `variant="outline"`, `size="sm"`, etc.254. **Use semantic colors.** `bg-primary`, `text-muted-foreground` — never raw values like `bg-blue-500`.2627## Critical Rules2829These rules are **always enforced**. Each links to a file with Incorrect/Correct code pairs.3031### Styling & Tailwind → [styling.md](./rules/styling.md)3233- **`className` for layout, not styling.** Never override component colors or typography.34- **No `space-x-*` or `space-y-*`.** Use `flex` with `gap-*`. For vertical stacks, `flex flex-col gap-*`.35- **Use `size-*` when width and height are equal.** `size-10` not `w-10 h-10`.36- **Use `truncate` shorthand.** Not `overflow-hidden text-ellipsis whitespace-nowrap`.37- **No manual `dark:` color overrides.** Use semantic tokens (`bg-background`, `text-muted-foreground`).38- **Use `cn()` for conditional classes.** Don't write manual template literal ternaries.39- **No manual `z-index` on overlay components.** Dialog, Sheet, Popover, etc. handle their own stacking.4041### Forms & Inputs → [forms.md](./rules/forms.md)4243- **Forms use `FieldGroup` + `Field`.** Never use raw `div` with `space-y-*` or `grid gap-*` for form layout.44- **`InputGroup` uses `InputGroupInput`/`InputGroupTextarea`.** Never raw `Input`/`Textarea` inside `InputGroup`.45- **Buttons inside inputs use `InputGroup` + `InputGroupAddon`.**46- **Option sets (2–7 choices) use `ToggleGroup`.** Don't loop `Button` with manual active state.47- **`FieldSet` + `FieldLegend` for grouping related checkboxes/radios.** Don't use a `div` with a heading.48- **Field validation uses `data-invalid` + `aria-invalid`.** `data-invalid` on `Field`, `aria-invalid` on the control. For disabled: `data-disabled` on `Field`, `disabled` on the control.4950### Component Structure → [composition.md](./rules/composition.md)5152- **Items always inside their Group.** `SelectItem` → `SelectGroup`. `DropdownMenuItem` → `DropdownMenuGroup`. `CommandItem` → `CommandGroup`.53- **Use `asChild` (radix) or `render` (base) for custom triggers.** Check `base` field from `npx shadcn@latest info`. → [base-vs-radix.md](./rules/base-vs-radix.md)54- **Dialog, Sheet, and Drawer always need a Title.** `DialogTitle`, `SheetTitle`, `DrawerTitle` required for accessibility. Use `className="sr-only"` if visually hidden.55- **Use full Card composition.** `CardHeader`/`CardTitle`/`CardDescription`/`CardContent`/`CardFooter`. Don't dump everything in `CardContent`.56- **Button has no `isPending`/`isLoading`.** Compose with `Spinner` + `data-icon` + `disabled`.57- **`TabsTrigger` must be inside `TabsList`.** Never render triggers directly in `Tabs`.58- **`Avatar` always needs `AvatarFallback`.** For when the image fails to load.5960### Use Components, Not Custom Markup → [composition.md](./rules/composition.md)6162- **Use existing components before custom markup.** Check if a component exists before writing a styled `div`.63- **Callouts use `Alert`.** Don't build custom styled divs.64- **Empty states use `Empty`.** Don't build custom empty state markup.65- **Toast via `sonner`.** Use `toast()` from `sonner`.66- **Use `Separator`** instead of `<hr>` or `<div className="border-t">`.67- **Use `Skeleton`** for loading placeholders. No custom `animate-pulse` divs.68- **Use `Badge`** instead of custom styled spans.6970### Icons → [icons.md](./rules/icons.md)7172- **Icons in `Button` use `data-icon`.** `data-icon="inline-start"` or `data-icon="inline-end"` on the icon.73- **No sizing classes on icons inside components.** Components handle icon sizing via CSS. No `size-4` or `w-4 h-4`.74- **Pass icons as objects, not string keys.** `icon={IconCheck}`, not a string lookup.7576### CLI7778- **Never decode or fetch preset codes manually.** Pass them directly to `npx shadcn@latest init --preset <code>`.7980## Key Patterns8182These are the most common patterns that differentiate correct shadcn/ui code. For edge cases, see the linked rule files above.8384```tsx85// Form layout: FieldGroup + Field, not div + Label.86<FieldGroup>87 <Field>88 <FieldLabel htmlFor="email">Email</FieldLabel>89 <Input id="email" />90 </Field>91</FieldGroup>9293// Validation: data-invalid on Field, aria-invalid on the control.94<Field data-invalid>95 <FieldLabel>Email</FieldLabel>96 <Input aria-invalid />97 <FieldDescription>Invalid email.</FieldDescription>98</Field>99100// Icons in buttons: data-icon, no sizing classes.101<Button>102 <IconSearch stroke={1.5} data-icon="inline-start" />103 Search104</Button>105106// Spacing: gap-*, not space-y-*.107<div className="flex flex-col gap-4"> // correct108<div className="space-y-4"> // wrong109110// Equal dimensions: size-*, not w-* h-*.111<Avatar className="size-10"> // correct112<Avatar className="w-10 h-10"> // wrong113114// Status colors: Badge variants or semantic tokens, not raw colors.115<Badge variant="secondary">+20.1%</Badge> // correct116<span className="text-emerald-600">+20.1%</span> // wrong117```118119## Component Selection120121| Need | Use |122| -------------------------- | --------------------------------------------------------------------------------------------------- |123| Button/action | `Button` with appropriate variant |124| Form inputs | `Input`, `Select`, `Combobox`, `Switch`, `Checkbox`, `RadioGroup`, `Textarea`, `InputOTP`, `Slider` |125| Toggle between 2–5 options | `ToggleGroup` + `ToggleGroupItem` |126| Data display | `Table`, `Card`, `Badge`, `Avatar` |127| Navigation | `Sidebar`, `NavigationMenu`, `Breadcrumb`, `Tabs`, `Pagination` |128| Overlays | `Dialog` (modal), `Sheet` (side panel), `Drawer` (bottom sheet), `AlertDialog` (confirmation) |129| Feedback | `sonner` (toast), `Alert`, `Progress`, `Skeleton`, `Spinner` |130| Command palette | `Command` inside `Dialog` |131| Charts | `Chart` (wraps Recharts) |132| Layout | `Card`, `Separator`, `Resizable`, `ScrollArea`, `Accordion`, `Collapsible` |133| Empty states | `Empty` |134| Menus | `DropdownMenu`, `ContextMenu`, `Menubar` |135| Tooltips/info | `Tooltip`, `HoverCard`, `Popover` |136137## Key Fields138139The injected project context contains these key fields:140141- **`aliases`** → use the actual alias prefix for imports (e.g. `@/`, `~/`), never hardcode.142- **`isRSC`** → when `true`, components using `useState`, `useEffect`, event handlers, or browser APIs need `"use client"` at the top of the file. Always reference this field when advising on the directive.143- **`tailwindVersion`** → `"v4"` uses `@theme inline` blocks; `"v3"` uses `tailwind.config.js`.144- **`tailwindCssFile`** → the global CSS file where custom CSS variables are defined. Always edit this file, never create a new one.145- **`style`** → component visual treatment (e.g. `nova`, `vega`).146- **`base`** → primitive library (`radix` or `base`). Affects component APIs and available props.147- **`iconLibrary`** → use `tabler` and import icons from `@tabler/icons-react`, including in documentation examples.148- **`resolvedPaths`** → exact file-system destinations for components, utils, hooks, etc.149- **`framework`** → routing and file conventions (e.g. Next.js App Router vs Vite SPA).150- **`packageManager`** → use this for any non-shadcn dependency installs (e.g. `pnpm add date-fns` vs `npm install date-fns`).151152See [cli.md — `info` command](./cli.md) for the full field reference.153154## Component Docs, Examples, and Usage155156Run `npx shadcn@latest docs <component>` to get the URLs for a component's documentation, examples, and API reference. Fetch these URLs to get the actual content.157158```bash159npx shadcn@latest docs button dialog select160```161162**When creating, fixing, debugging, or using a component, always run `npx shadcn@latest docs` and fetch the URLs first.** This ensures you're working with the correct API and usage patterns rather than guessing.163164## Workflow1651661. **Get project context** — already injected above. Run `npx shadcn@latest info` again if you need to refresh.1672. **Check installed components first** — before running `add`, always check the `components` list from project context or list the `resolvedPaths.ui` directory. Don't import components that haven't been added, and don't re-add ones already installed.1683. **Find components** — `npx shadcn@latest search`.1694. **Get docs and examples** — run `npx shadcn@latest docs <component>` to get URLs, then fetch them. Use `npx shadcn@latest view` to browse registry items you haven't installed. To preview changes to installed components, use `npx shadcn@latest add --diff`.1705. **Install or update** — `npx shadcn@latest add`. When updating existing components, use `--dry-run` and `--diff` to preview changes first (see [Updating Components](#updating-components) below).1716. **Fix imports in third-party components** — After adding components from community registries (e.g. `@bundui`, `@magicui`), check the added non-UI files for hardcoded import paths like `@/components/ui/...`. These won't match the project's actual aliases. Use `npx shadcn@latest info` to get the correct `ui` alias (e.g. `@workspace/ui/components`) and rewrite the imports accordingly. The CLI rewrites imports for its own UI files, but third-party registry components may use default paths that don't match the project.1727. **Review added components** — After adding a component or block from any registry, **always read the added files and verify they are correct**. Check for missing sub-components (e.g. `SelectItem` without `SelectGroup`), missing imports, incorrect composition, or violations of the [Critical Rules](#critical-rules). Convert icons to Tabler in source and documentation examples, using verified exports from `@tabler/icons-react`. Fix all issues before moving on.1738. **Registry must be explicit** — When the user asks to add a block or component, **do not guess the registry**. If no registry is specified (e.g. user says "add a login block" without specifying `@shadcn`, `@tailark`, etc.), ask which registry to use. Never default to a registry on behalf of the user.1749. **Switching presets** — Ask the user first: **reinstall**, **merge**, or **skip**?175 - **Reinstall**: `npx shadcn@latest init --preset <code> --force --reinstall`. Overwrites all components.176 - **Merge**: `npx shadcn@latest init --preset <code> --force --no-reinstall`, then run `npx shadcn@latest info` to list installed components, then for each installed component use `--dry-run` and `--diff` to [smart merge](#updating-components) it individually.177 - **Skip**: `npx shadcn@latest init --preset <code> --force --no-reinstall`. Only updates config and CSS, leaves components as-is.178 - **Important**: Always run preset commands inside the user's project directory. The CLI automatically preserves the current base (`base` vs `radix`) from `components.json`. If you must use a scratch/temp directory (e.g. for `--dry-run` comparisons), pass `--base <current-base>` explicitly — preset codes do not encode the base.179180## Updating Components181182When the user asks to update a component from upstream while keeping their local changes, use `--dry-run` and `--diff` to intelligently merge. **NEVER fetch raw files from GitHub manually — always use the CLI.**1831841. Run `npx shadcn@latest add <component> --dry-run` to see all files that would be affected.1852. For each file, run `npx shadcn@latest add <component> --diff <file>` to see what changed upstream vs local.1863. Decide per file based on the diff:187 - No local changes → safe to overwrite.188 - Has local changes → read the local file, analyze the diff, and apply upstream updates while preserving local modifications.189 - User says "just update everything" → use `--overwrite`, but confirm first.1904. **Never use `--overwrite` without the user's explicit approval.**191192## Quick Reference193194```bash195# Create a new project.196npx shadcn@latest init --name my-app --preset base-nova197npx shadcn@latest init --name my-app --preset a2r6bw --template vite198199# Create a monorepo project.200npx shadcn@latest init --name my-app --preset base-nova --monorepo201npx shadcn@latest init --name my-app --preset base-nova --template next --monorepo202203# Initialize existing project.204npx shadcn@latest init --preset base-nova205npx shadcn@latest init --defaults # shortcut: --template=next --preset=base-nova206207# Add components.208npx shadcn@latest add button card dialog209npx shadcn@latest add @magicui/shimmer-button210npx shadcn@latest add --all211212# Preview changes before adding/updating.213npx shadcn@latest add button --dry-run214npx shadcn@latest add button --diff button.tsx215npx shadcn@latest add @acme/form --view button.tsx216217# Search registries.218npx shadcn@latest search @shadcn -q "sidebar"219npx shadcn@latest search @tailark -q "stats"220221# Get component docs and example URLs.222npx shadcn@latest docs button dialog select223224# View registry item details (for items not yet installed).225npx shadcn@latest view @shadcn/button226```227228**Named presets:** `base-nova`, `radix-nova`229**Templates:** `next`, `vite`, `start`, `react-router`, `astro` (all support `--monorepo`) and `laravel` (not supported for monorepo)230**Preset codes:** Base62 strings starting with `a` (e.g. `a2r6bw`), from [ui.shadcn.com](https://ui.shadcn.com).231232## Detailed References233234- [rules/forms.md](./rules/forms.md) — FieldGroup, Field, InputGroup, ToggleGroup, FieldSet, validation states235- [rules/composition.md](./rules/composition.md) — Groups, overlays, Card, Tabs, Avatar, Alert, Empty, Toast, Separator, Skeleton, Badge, Button loading236- [rules/icons.md](./rules/icons.md) — data-icon, icon sizing, passing icons as objects237- [rules/styling.md](./rules/styling.md) — Semantic colors, variants, className, spacing, size, truncate, dark mode, cn(), z-index238- [rules/base-vs-radix.md](./rules/base-vs-radix.md) — asChild vs render, Select, ToggleGroup, Slider, Accordion239- [cli.md](./cli.md) — Commands, flags, presets, templates240- [customization.md](./customization.md) — Theming, CSS variables, extending components