shadcn について
shadcnは、コンポーネントをソースコードとしてプロジェクトに追加し、UIやデザインシステムを構築するためのスキルです。プロジェクト設定とドキュメントに沿ったコンポーネントの検索、構成、利用を案内します。
主な機能
- 01CLIによるコンポーネント検索と追加
- 02プロジェクト設定と導入済み項目の確認
- 03ドキュメントに沿った使い方の確認
- 04フォームとコンポーネント構成の規約
- 05セマンティックなスタイルとアイコン設定
活用シーン
- 01設定ページやダッシュボードの構築
- 02プロジェクトへのUIコンポーネント追加や更新
- 03コンポーネントのアクセシビリティと構造の確認
- 04プロジェクトやアイコン設定への適合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ julianromli/ ai-skills --skill shadcnインストール後、Claude Code で/shadcnを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli.mdcustomization.mdmcp.mdagents/openai.ymlevals/evals.jsonrules/base-vs-radix.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を使用します。 カスタムの空状態マークアップを構築しないでください。 - トーストは
sonner経由で行います。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}とします。
CLI
- プリセットコードを手動でデコードまたは取得しないでください。 それらを直接
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(確認) |
| フィードバック | sonner(トースト)、Alert、Progress、Skeleton、Spinner |
| コマンドパレット | Dialog 内の Command |
| チャート | Chart(Recharts をラップ) |
| レイアウト | Card、Separator、Resizable、ScrollArea、Accordion、Collapsible |
| 空状態 | Empty |
| メニュー | DropdownMenu、ContextMenu、Menubar |
| ツールチップ/情報 | Tooltip、HoverCard、Popover |
主要なフィールド
注入されるプロジェクトコンテキストには、以下の主要なフィールドが含まれています。
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→ コンポーネント、utils、フックなどの正確なファイルシステム上の宛先です。framework→ ルーティングとファイルの規約(例: Next.js App Router 対 Vite SPA)。packageManager→ shadcn 以外の依存関係をインストールする際はこれを使用してください(例:pnpm add date-fns対npm install date-fns)。
完全なフィールドリファレンスについては、cli.md — info コマンドを参照してください。
コンポーネントのドキュメント、例、および使用方法
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/...のようなハードコードされたインポートパスがないか確認してください。これらはプロジェクトの実際のエイリアスと一致しません。正しいuiエイリアス(例:@workspace/ui/components)を取得するには、npx shadcn@latest infoを使用し、それに応じてインポートを書き換えてください。CLI は独自の UI ファイルのインポートを書き換えますが、サードパーティのレジストリーコンポーネントでは、プロジェクトと一致しないデフォルトのパスが使われている場合があります。 - 追加したコンポーネントを確認する — いずれかのレジストリーからコンポーネントやブロックを追加した後は、必ず追加されたファイルを読み、正しいことを確認してください。不足しているサブコンポーネント(例:
SelectGroupがないSelectItem)、インポート漏れ、誤った構成、重要なルールへの違反がないか確認してください。また、アイコンのインポートはすべて、プロジェクトのコンテキストにあるiconLibraryに置き換えてください(例:レジストリー項目でlucide-reactが使われていて、プロジェクトではhugeiconsを使っている場合は、インポートとアイコン名を適宜置き換えてください)。先に進む前に、すべての問題を修正してください。 - レジストリーを明示する — ユーザーがブロックやコンポーネントの追加を依頼した場合、レジストリーを推測してはいけません。レジストリーが指定されていない場合(例:ユーザーが
@shadcn、@tailarkなどを指定せずに「ログインブロックを追加して」と言った場合)は、どのレジストリーを使うか尋ねてください。ユーザーに代わってレジストリーを決めてはいけません。 - プリセットを切り替える — まずユーザーに、再インストール、マージ、スキップのどれにするか尋ねてください。
- 再インストール:
npx shadcn@latest init --preset <code> --force --reinstall。すべてのコンポーネントを上書きします。 - マージ:
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 のみを更新し、コンポーネントはそのままにします。 - 重要:プリセットコマンドは、必ずユーザーのプロジェクトディレクトリ内で実行してください。CLI は
components.jsonから現在のベース(baseとradixのいずれか)を自動的に保持します。スクラッチ/一時ディレクトリ(例:--dry-runによる比較)を使う必要がある場合は、--base <current-base>を明示的に渡してください。プリセットコードにはベースが含まれていません。
- 再インストール:
コンポーネントの更新
ユーザーから、ローカルの変更を維持したまま上流のコンポーネントを更新するよう依頼された場合は、--dry-run と --diff を使って適切にマージします。GitHub から手動で raw ファイルを取得してはいけません。必ず 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=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
名前付きプリセット: base-nova、radix-nova
テンプレート: next、vite、start、react-router、astro(すべて --monorepo をサポート)および laravel(モノレポではサポートされません)
プリセットコード: a で始まる Base62 文字列(例:a2r6bw)。ui.shadcn.com から取得できます。
詳細リファレンス
- rules/forms.md — FieldGroup、Field、InputGroup、ToggleGroup、FieldSet、検証状態
- rules/composition.md — グループ、オーバーレイ、Card、Tabs、Avatar、Alert、Empty、Toast、Separator、Skeleton、Badge、Button のローディング状態
- 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 — コマンド、フラグ、プリセット、テンプレート
- customization.md — テーマ設定、CSS 変数、コンポーネントの拡張