shadcn について
shadcn/ui は、UI コンポーネントとデザインシステムを構築するためのフレームワークです。コンポーネントはコマンドライン経由でソースコードとしてプロジェクトに追加されます。React 開発者向けで、Tailwind のスタイルとコンポーネント構成のルールを含みます。
主な機能
- 01CLI によるソースコードとしてのコンポーネント追加
- 02プロジェクトコンテキストの取得とコンポーネントドキュメントの参照
- 03セマンティックカラーに基づくスタイル規約
- 04フォームやダイアログの構成ルール
- 05チャートとチャット UI のコンポーネント
活用シーン
- 01React プロジェクトでのフォームとダッシュボードの構築
- 02コンポーネントの使い方を規約と照合する確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ shadcn/ ui --skill shadcnインストール後、Claude Code で/shadcnを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli.mdcustomization.mdmcp.mdregistry.mdagents/openai.ymlevals/evals.jsonrules/base-vs-radix.mdchat.mdcomposition.mdforms.mdicons.mdstyling.md詳細
shadcn/ui
UI、コンポーネント、デザインシステムを構築するためのフレームワークです。CLI を使って、コンポーネントをソースコードとしてユーザーのプロジェクトに追加します。
IMPORTANT: すべての CLI コマンドは、プロジェクトの
packageManagerに応じて、プロジェクトのパッケージランナーで実行してください。npx shadcn@latest、pnpm dlx shadcn@latest、またはbunx --bun shadcn@latestを使用します。以下の例ではnpx shadcn@latestを使っていますが、プロジェクトに適したランナーに置き換えてください。
現在のプロジェクトコンテキスト
!`npx shadcn@latest info --json`
上記の JSON には、プロジェクトの設定とインストール済みのコンポーネントが含まれています。npx shadcn@latest docs <component> を使用すると、任意のコンポーネントのドキュメントとサンプル URL を取得できます。
原則
- まず既存のコンポーネントを使用してください。 カスタム UI を作成する前に、
npx shadcn@latest searchを使ってレジストリを確認してください。コミュニティのレジストリも確認してください。 - 一から作り直さず、組み合わせてください。 設定ページ=Tabs + Card + フォームコントロール。ダッシュボード=Sidebar + Card + Chart + Table。
- カスタムスタイルより、組み込みのバリアントを優先してください。
variant="outline"、size="sm"などを使用します。 - セマンティックカラーを使用してください。
bg-primary、text-muted-foregroundを使い、bg-blue-500のような値を直接指定しないでください。
重要なルール
以下のルールは常に適用されます。それぞれ、誤ったコードと正しいコードの組み合わせを示したファイルにリンクしています。
スタイリングと Tailwind → styling.md
classNameはスタイルではなく、レイアウトに使用してください。 コンポーネントの色やタイポグラフィを上書きしないでください。space-x-*とspace-y-*は使用しないでください。flexとgap-*を使用します。縦方向に並べる場合は、flex flex-col gap-*を使用してください。- 幅と高さが同じ場合は
size-*を使用してください。w-10 h-10ではなくsize-10を使用します。 - 省略形の
truncateを使用してください。overflow-hidden text-ellipsis whitespace-nowrapは使用しないでください。 dark:による色の手動上書きは禁止です。 セマンティックトークン(bg-background、text-muted-foreground)を使用してください。- 条件付きクラスには
cn()を使用してください。 テンプレートリテラルを使った三項演算子を手動で書かないでください。 - オーバーレイコンポーネントに
z-indexを手動で指定しないでください。 Dialog、Sheet、Popover などが重なり順を処理します。
フォームと入力 → forms.md
- フォームには
FieldGroupとFieldを使用してください。 フォームのレイアウトにspace-y-*やgrid gap-*を指定した生のdivは使用しないでください。 InputGroupではInputGroupInput/InputGroupTextareaを使用してください。InputGroup内で生のInput/Textareaは使用しないでください。- 入力内のボタンには
InputGroupとInputGroupAddonを使用してください。 - 選択肢が2〜7個の場合は
ToggleGroupを使用してください。Buttonをループさせてアクティブ状態を手動で管理しないでください。 - 関連するチェックボックスやラジオボタンをグループ化するには、
FieldSetとFieldLegendを使用してください。 見出し付きのdivは使用しないでください。 - フィールドの検証には
data-invalidとaria-invalidを使用してください。Fieldにdata-invalidを、コントロールにaria-invalidを設定します。無効状態の場合は、Fieldにdata-disabledを、コントロールにdisabledを設定してください。
コンポーネントの構造 → composition.md
- 項目は必ず対応する Group 内に配置してください。
SelectItem→SelectGroup。DropdownMenuItem→DropdownMenuGroup。CommandItem→CommandGroup。 - カスタムトリガーには
asChild(radix)またはrender(base)を使用してください。npx shadcn@latest infoのbaseフィールドを確認してください。→ base-vs-radix.md - Dialog、Sheet、Drawer には必ず Title が必要です。 アクセシビリティのために
DialogTitle、SheetTitle、DrawerTitleが必要です。視覚的に非表示にする場合は、className="sr-only"を使用してください。 - Card の構成要素をすべて使用してください。
CardHeader/CardTitle/CardDescription/CardContent/CardFooterを使用します。すべてをCardContentに詰め込まないでください。 - Button に
isPending/isLoadingはありません。Spinnerとdata-iconを組み合わせ、disabledを設定してください。 TabsTriggerは必ずTabsList内に配置してください。Tabsの直下にトリガーを描画しないでください。Avatarには必ずAvatarFallbackが必要です。 画像の読み込みに失敗した場合に使用します。
カスタムマークアップではなくコンポーネントを使用する → composition.md
- カスタムマークアップを使う前に、既存のコンポーネントを使用してください。 スタイル付きの
divを書く前に、該当するコンポーネントがあるか確認してください。 - コールアウトには
Alertを使用してください。 カスタムスタイルの div を作成しないでください。 - 空の状態には
Emptyを使用してください。 カスタムの空状態マークアップを作成しないでください。 - トーストはプロジェクトのベースに従ってください。 Base UI のプロジェクトでは、
toastコンポーネントのtoastを使用してください。Radix と React Aria のプロジェクトでは、sonnerのtoast()を使用してください。 <hr>や<div className="border-t">の代わりにSeparatorを使用してください。- 読み込み中のプレースホルダーには
Skeletonを使用してください。 カスタムのanimate-pulsediv は使用しないでください。 - カスタムスタイルの span の代わりに
Badgeを使用してください。
アイコン → icons.md
Button内のアイコンにはdata-iconを使用してください。 アイコンにdata-icon="inline-start"またはdata-icon="inline-end"を指定してください。- コンポーネント内のアイコンにサイズ指定クラスを付けないでください。 コンポーネントが CSS でアイコンのサイズを調整します。
size-4やw-4 h-4は使用しないでください。 - アイコンは文字列キーではなく、オブジェクトとして渡してください。 文字列による検索ではなく、
icon={CheckIcon}を使用してください。
チャットとメッセージ → chat.md
- チャット UI はチャットのプリミティブを組み合わせて構成してください。 会話には
MessageScroller、行にはMessage、サーフェスにはBubbleを使用してください。手作業で作成したバブル用のdivや、スクロールコンテナーを直接使わないでください。 - スクロール動作は
MessageScrollerが担います。 ストリーミング時の追従、アンカリング、最新メッセージへのジャンプ(MessageScrollerButton)が組み込まれています。useStickToBottom/ResizeObserverフックは作成しないでください。 - 添付ファイルには
Attachment、システムノートと区切りにはMarkerを使用してください。Itemカードや、ラベル付きのSeparatorは使用しないでください。
CLI
- プリセットコードをデコードしたり、プリセット URL を手動で作成したりしないでください。
npx shadcn@latest preset decode <code>、preset url <code>、またはpreset open <code>を使用してください。プロジェクトを考慮したプリセットの検出には、npx shadcn@latest preset resolveを使用してください。 - CLI でプリセットコードを直接適用してください。 既存のプロジェクトでは
npx shadcn@latest apply <code>を、初期化時にはnpx shadcn@latest init --preset <code>を使用してください。
主なパターン
以下は、正しい shadcn/ui コードを特徴づける最も一般的なパターンです。例外的なケースについては、上記のリンク先のルールファイルを参照してください。
// 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>
<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> // wrong
コンポーネントの選択
| 必要なもの | 使用するもの |
|---|---|
| ボタン/アクション | 適切なバリアントの Button |
| フォーム入力 | Input、Select、Combobox、Switch、Checkbox、RadioGroup、Textarea、InputOTP、Slider |
| 2~5 個のオプションの切り替え | ToggleGroup + ToggleGroupItem |
| データ表示 | Table、Card、Badge、Avatar |
| ナビゲーション | Sidebar、NavigationMenu、Breadcrumb、Tabs、Pagination |
| オーバーレイ | Dialog(モーダル)、Sheet(サイドパネル)、Drawer(ボトムシート)、AlertDialog(確認) |
| フィードバック | toast(Base UI)、sonner(Radix/Aria)、Alert、Progress、Skeleton、Spinner |
| コマンドパレット | Dialog 内の Command |
| チャート | Chart(Recharts をラップ) |
| レイアウト | Card、Separator、Resizable、ScrollArea、Accordion、Collapsible |
| 空の状態 | Empty |
| メニュー | DropdownMenu、ContextMenu、Menubar |
| ツールチップ/情報 | Tooltip、HoverCard、Popover |
| チャット/会話 UI | MessageScroller、Message、Bubble、Attachment、Marker |
主なフィールド
注入されたプロジェクトコンテキストには、次の主なフィールドが含まれています。
aliases→ インポートには実際のエイリアスプレフィックス(例:@/、~/)を使用し、ハードコードしないでください。isRSC→trueの場合、useState、useEffect、イベントハンドラー、またはブラウザー API を使用するコンポーネントでは、ファイルの先頭に"use client"が必要です。このディレクティブについて案内する際は、必ずこのフィールドを参照してください。tailwindVersion→"v4"では@theme inlineブロックを使用し、"v3"ではtailwind.config.jsを使用します。tailwindCssFile→ カスタム CSS 変数が定義されているグローバル CSS ファイルです。必ずこのファイルを編集し、新しいファイルを作成しないでください。style→ コンポーネントのビジュアルスタイル(例:nova、vega)。base→ プリミティブライブラリ(radixまたはbase)。コンポーネント API と利用可能な props に影響します。iconLibrary→ アイコンのインポート先を指定します。lucideにはlucide-react、tablerには@tabler/icons-reactなどを使用してください。lucide-reactと決めつけないでください。resolvedPaths→ コンポーネント、ユーティリティ、フックなどの正確なファイルシステム上の保存先です。framework→ ルーティングとファイルの規則(例:Next.js App Router と Vite SPA)。packageManager→ shadcn 以外の依存関係をインストールする際に使用します(例:pnpm add date-fnsとnpm install date-fns)。preset→ 現在のプロジェクトで解決済みのプリセットコードと値です。プリセット情報だけが必要な場合は、npx shadcn@latest preset resolve --jsonを使用してください。
すべてのフィールドについては、cli.md — info command を参照してください。
コンポーネントのドキュメント、例、使用方法
npx shadcn@latest docs <component> を実行すると、コンポーネントのドキュメント、例、API リファレンスの URL を取得できます。これらの URL を取得して、実際の内容を確認してください。
npx shadcn@latest docs button dialog select
コンポーネントの作成、修正、デバッグ、使用を行う際は、必ず最初に npx shadcn@latest docs を実行し、URL を取得してください。 これにより、推測に頼らず、正しい API と使用パターンに基づいて作業できます。
ワークフロー
- プロジェクトのコンテキストを取得する — すでに上で挿入されています。更新が必要な場合は、
npx shadcn@latest infoを再度実行してください。 - まずインストール済みのコンポーネントを確認する —
addを実行する前に、必ずプロジェクトのコンテキストにあるcomponentsリストを確認するか、resolvedPaths.uiディレクトリの一覧を取得してください。追加されていないコンポーネントをインポートしたり、すでにインストール済みのコンポーネントを再追加したりしないでください。 - コンポーネントを探す —
npx shadcn@latest searchを実行してください。 - ドキュメントと例を取得する —
npx shadcn@latest docs <component>を実行して URL を取得し、その URL を取得してください。インストールしていないレジストリ項目を閲覧するには、npx shadcn@latest viewを使用してください。インストール済みのコンポーネントへの変更をプレビューするには、npx shadcn@latest add --diffを使用してください。 - インストールまたは更新する —
npx shadcn@latest addを実行してください。既存のコンポーネントを更新する場合は、まず--dry-runと--diffを使用して変更をプレビューしてください(下記のコンポーネントの更新を参照)。 - サードパーティ製コンポーネントのインポートを修正する — コミュニティレジストリ(例:
@bundui、@magicui)からコンポーネントを追加した後、追加された UI 以外のファイルに、@/components/ui/...のようなハードコードされたインポートパスがないか確認してください。これらはプロジェクトで実際に使われているエイリアスと一致しません。npx shadcn@latest infoを使って正しいuiエイリアス(例:@workspace/ui/components)を取得し、それに応じてインポートを書き換えてください。CLI は独自の UI ファイルのインポートを書き換えますが、サードパーティのレジストリコンポーネントでは、プロジェクトと一致しないデフォルトのパスが使われている場合があります。 - 追加したコンポーネントを確認する — いずれかのレジストリからコンポーネントまたはブロックを追加した後は、必ず追加したファイルを読み、正しいことを確認してください。不足しているサブコンポーネント(例:
SelectGroupを伴わないSelectItem)、インポート漏れ、誤った構成、重要なルールへの違反がないかを確認してください。また、アイコンのインポートは、プロジェクトのコンテキストにあるiconLibraryに置き換えてください(例:レジストリ項目がlucide-reactを使っていて、プロジェクトがhugeiconsを使っている場合は、インポートとアイコン名を適切に置き換えてください)。先に進む前に、すべての問題を修正してください。 - レジストリを明示する — ユーザーからブロックまたはコンポーネントの追加を依頼された場合、レジストリを推測しないでください。レジストリが指定されていない場合(例:ユーザーが
@shadcn、@tailark、owner/repoなどを指定せずに「ログインブロックを追加して」と依頼した場合)は、どのレジストリを使うか尋ねてください。ユーザーに代わってレジストリを決めないでください。 - プリセットを切り替える — まずユーザーに、上書き、部分適用、マージ、スキップのどれにするか尋ねてください。
- 現在のプリセットを確認する:
npx shadcn@latest preset resolveを実行してください。構造化された値が必要な場合は、--jsonを使用してください。 - 適用するプリセットを確認する:
npx shadcn@latest preset decode <code>を実行してください。preset url <code>またはpreset open <code>を使って、プリセットビルダーを共有または開くこともできます。 - 上書き:
npx shadcn@latest apply <code>を実行します。検出されたコンポーネント、フォント、CSS 変数を上書きします。 - 部分適用:
npx shadcn@latest apply <code> --only theme,fontを実行します。UI コンポーネントを再インストールせず、選択したプリセット部分のみを更新します。指定できる値はthemeとfontです。カンマ区切りで組み合わせることもできます。アイコンの変更にはコンポーネントの完全な再インストールや変換が必要になる場合があるため、iconは意図的にサポートされていません。 - マージ:
npx shadcn@latest init --preset <code> --force --no-reinstallを実行し、続けてnpx shadcn@latest infoを実行してインストール済みコンポーネントを一覧表示します。その後、各インストール済みコンポーネントに対して--dry-runと--diffを使用し、個別にスマートマージしてください。 - スキップ:
npx shadcn@latest init --preset <code> --force --no-reinstallを実行します。設定と CSS のみを更新し、コンポーネントはそのままにします。 - 重要:プリセットのコマンドは必ずユーザーのプロジェクトディレクトリ内で実行してください。
applyが機能するのは、components.jsonファイルがある既存のプロジェクトのみです。CLI はcomponents.jsonの現在のベース(baseまたはradix)を自動的に維持します。スクラッチ用/一時ディレクトリを使う必要がある場合(例:--dry-runでの比較)、--base <current-base>を明示的に指定してください。プリセットコードにはベースが含まれていません。
- 現在のプリセットを確認する:
コンポーネントの更新
ユーザーから、ローカルの変更を維持しながら上流のコンポーネントを更新するよう依頼された場合は、--dry-run と --diff を使って適切にマージしてください。GitHub からファイルを手動で取得することは絶対に避け、必ず CLI を使ってください。
npx shadcn@latest add <component> --dry-runを実行し、影響を受けるすべてのファイルを確認します。- 各ファイルについて、
npx shadcn@latest add <component> --diff <file>を実行し、上流とローカルの間で変更された箇所を確認します。 - 差分をもとにファイルごとに判断します。
- ローカルで変更されていない → 安全に上書きできます。
- ローカルで変更されている → ローカルファイルを読み、差分を分析したうえで、ローカルの変更を維持しながら上流の更新を適用します。
- ユーザーが「すべてそのまま更新して」と言っている →
--overwriteを使いますが、先に確認してください。
- ユーザーから明示的な承認を得ずに
--overwriteを使うことは絶対に避けてください。
クイックリファレンス
# 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=nova (base style implied)
# Apply a preset to an existing project.
npx shadcn@latest apply a2r6bw
npx shadcn@latest apply a2r6bw --only theme
npx shadcn@latest apply a2r6bw --only font
npx shadcn@latest apply a2r6bw --only theme,font
# Inspect preset codes and project preset state.
npx shadcn@latest preset decode a2r6bw
npx shadcn@latest preset url a2r6bw
npx shadcn@latest preset open a2r6bw
npx shadcn@latest preset resolve
npx shadcn@latest preset resolve --json
# Add components.
npx shadcn@latest add button card dialog
npx shadcn@latest add @magicui/shimmer-button
npx shadcn@latest add owner/repo/item
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
npx shadcn@latest add owner/repo/item --dry-run
# Search registries.
npx shadcn@latest search @shadcn -q "sidebar"
npx shadcn@latest search @tailark -q "stats"
npx shadcn@latest search owner/repo -q "login"
npx shadcn@latest search # all configured registries
npx shadcn@latest search @shadcn -q "menu" -t ui # filter by item type
# 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
npx shadcn@latest view owner/repo/item
名前付きプリセット: nova、vega、maia、lyra、mira、luma
テンプレート: next、vite、start、react-router、astro(いずれも --monorepo に対応)、および laravel(モノレポには非対応)
プリセットコード: ui.shadcn.com のバージョン接頭辞付き base62 文字列(例:a2r6bw または b0)。
詳細リファレンス
- rules/forms.md — FieldGroup、Field、InputGroup、ToggleGroup、FieldSet、バリデーション状態
- rules/composition.md — グループ、オーバーレイ、Card、Tabs、Avatar、Alert、Empty、Toast、Separator、Skeleton、Badge、Button の読み込み状態
- rules/chat.md — MessageScroller、Message、Bubble、Attachment、Marker、ストリーミング、アンカリング、最新メッセージへのジャンプ
- rules/icons.md — data-icon、アイコンのサイズ指定、オブジェクトとしてのアイコンの渡し方
- rules/styling.md — セマンティックカラー、バリアント、className、間隔、サイズ、テキストの切り詰め、ダークモード、cn()、z-index
- rules/base-vs-radix.md — asChild と render、Select、ToggleGroup、Slider、Accordion
- cli.md — コマンド、フラグ、プリセット、テンプレート
- registry.md — ソースレジストリの作成、
include、項目定義、依存関係、GitHub レジストリのルール - customization.md — テーマ設定、CSS 変数、コンポーネントの拡張