shadcn について
shadcnは、shadcn/uiのコンポーネントを使ったUI構築を支援するエージェントスキルです。プロジェクト設定に応じた選定やCLI操作に加え、スタイル、フォーム、構成、アイコン、チャットUIの実装規則を案内します。
主な機能
- 01プロジェクト設定と導入済みコンポーネントの確認
- 02コンポーネントのドキュメントと例の検索
- 03CLIによるコンポーネントとプリセット操作の案内
- 04スタイルとフォームの実装ルール
- 05構成、アイコン、チャットUIの規則
活用シーン
- 01新しいUIに使うコンポーネントの選定
- 02既存プロジェクトへのshadcn/ui導入
- 03プロジェクト規約に沿ったフォームやチャットUIの実装
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ marcioaltoe/ skills --skill shadcnインストール後、Claude Code で/shadcnを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli.mdcustomization.mddesign-system-page.mddesign-system.mdmcp.mdregistry.mdagents/openai.ymlassets/showcase/color-pair.tsxpreview-states.cssstate-matrix.tsxevals/evals.jsonrules/base-vs-radix.mdchat.mdcomposition.mdforms.mdicons.mdstyling.mdscripts/showcase-coverage.mjs詳細
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は使わないでください。 - アシスタントのアクティビティには
Traceを使ってください。 推論、ツール呼び出し、ソース、ステップはTrace内のTraceLineとし、メッセージパーツの一連の処理ごとにTraceを1つ使ってください。動作は、行をTraceCollapsible、シートのトリガー、またはリンクでラップしてください。手作りのCollapsibleやMarkerは使わないでください。
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、Trace |
主要フィールド
注入されたプロジェクトコンテキストには、次の主要フィールドが含まれています。
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、hooks などの正確なファイルシステム上の配置先です。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>を明示的に指定してください。プリセットコードにはベースが含まれていません。
- 現在のプリセットを確認する:
DESIGN.md からのデザインシステム
ユーザーがプリセットの有無にかかわらず、DESIGN.md(またはブランド仕様)に基づくデザインシステムを求めた場合は、design-system.md の手順に最初から最後まで従います。
init --preset <code> --template <vite|next> --name <app> --no-monorepo -yを実行します。プリセットコードがない場合は、最も近いスタイルを選び、--base base --preset <style>を指定します。その後、add --all -yを実行します。- 編集する前に、DESIGN.md のフロントマター、「Do's and Don'ts」、「Known Gaps」を読みます。
- そのトークンを
tailwindCssFileの shadcn 変数に対応付けます。角丸のスケール、シャドウ、フォント、type-*ユーティリティを固定します。 cvaのバリアントを編集して、コンポーネントのスタイルを変更します。コントロールの高さはまとめて変更します。- design-system-page.md に従ってデザインシステムのページを作成します。コントラストを確認した色の役割、書体見本、固定した状態マトリクス、エッジケース、避けるべき例と推奨例、レシピを含めます。
scripts/showcase-coverage.mjsで網羅状況を確認します。 - ブラウザーで検証します。型チェックを行い、コンソールエラーがないこと、ページが最上部から読み込まれること、水平方向のオーバーフローがないこと、ダークモードが機能することを確認します。
コンポーネントの更新
ユーザーがローカルの変更を維持しながら、上流のコンポーネントに更新するよう求めた場合は、--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 design system app (then follow design-system.md).
npx shadcn@latest init --name my-ds --preset b0 --template vite --no-monorepo -y
npx shadcn@latest init --name my-ds --base base --preset maia --template vite --no-monorepo -y
npx shadcn@latest add --all -y
# 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、Trace、ストリーミング、アンカー、最新メッセージへのジャンプ、アシスタントのアクティビティ行
- 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 変数、コンポーネントの拡張
- design-system.md:DESIGN.md(プリセットの有無を問わず)からテーマ付きアプリを作成する方法:スタイルの選択、トークンの対応付け、角丸、フォント、文字サイズのスケール、コントロールの高さ、ショーケースの落とし穴、検証
- design-system-page.md:デザインシステムのページに含める内容と作成方法:基礎、コンポーネントの階層、固定した状態マトリクス、コントラストの組み合わせ、エッジケース、避けるべき例と推奨例、レシピ