shadcn について
shadcn/ui のコンポーネントで UI を構築するためのスキルです。コンポーネントはコマンドライン経由でソースコードとしてプロジェクトに追加します。選定と構成、プロジェクト設定に沿った実装、アクセシビリティやスタイル規約の確認を案内します。
主な機能
- 01CLI でコンポーネントを検索・追加
- 02プロジェクト設定に沿ったインポート
- 03既存 UI コンポーネントの構成
- 04スタイルとフォームの規約遵守
- 05追加後のコンポーネント確認
活用シーン
- 01既存コンポーネントでフォームを構築
- 02レジストリからコンポーネントを追加
- 03構成とアクセシビリティの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fradser/ dotclaude --skill shadcnインストール後、Claude Code で/shadcnを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli.mdcustomization.mdmcp.mdregistry.mdevals/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
- プリセットコードを手動でデコードしたり、プリセット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(確認) |
| フィードバック | 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、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>を明示的に指定してください。プリセットコードにはベースが含まれていません。
- 現在のプリセットを確認する:
コンポーネントの更新
ユーザーから、ローカルの変更を維持しながら上流のコンポーネントを更新するよう依頼された場合は、--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/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 変数、コンポーネントの拡張