mcpField
S
shadcn

shadcn

github.com/fradserデザイン・UI59680 回インストール5 週間前に更新
リポジトリ

shadcn について

shadcn/ui のコンポーネントで UI を構築するためのスキルです。コンポーネントはコマンドライン経由でソースコードとしてプロジェクトに追加します。選定と構成、プロジェクト設定に沿った実装、アクセシビリティやスタイル規約の確認を案内します。

主な機能

  1. 01CLI でコンポーネントを検索・追加
  2. 02プロジェクト設定に沿ったインポート
  3. 03既存 UI コンポーネントの構成
  4. 04スタイルとフォームの規約遵守
  5. 05追加後のコンポーネント確認

活用シーン

  1. 01既存コンポーネントでフォームを構築
  2. 02レジストリからコンポーネントを追加
  3. 03構成とアクセシビリティの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fradser/dotclaude --skill shadcn

インストール後、Claude Code で/shadcnを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

cli.md
customization.md
mcp.md
registry.md
evals/
evals.json
rules/
base-vs-radix.md
composition.md
forms.md
icons.md
styling.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 を取得できます。

原則

  1. まず既存のコンポーネントを使用してください。 カスタム UI を作成する前に、npx shadcn@latest search を使ってレジストリを確認してください。コミュニティのレジストリも確認してください。
  2. 一から作り直さず、組み合わせてください。 設定ページ=Tabs + Card + フォームコントロール。ダッシュボード=Sidebar + Card + Chart + Table。
  3. カスタムスタイルより、組み込みのバリアントを優先してください。 variant="outline"、size="sm" などを使用します。
  4. セマンティックカラーを使用してください。 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-pulse divは使わないでください。
  • 独自にスタイルを設定した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 と使用パターンに基づいて作業できます。

ワークフロー

  1. プロジェクトのコンテキストを取得する — すでに上で挿入されています。更新が必要な場合は、npx shadcn@latest info を再度実行してください。
  2. まずインストール済みのコンポーネントを確認する — add を実行する前に、必ずプロジェクトのコンテキストにある components リストを確認するか、resolvedPaths.ui ディレクトリの一覧を取得してください。追加されていないコンポーネントをインポートしたり、すでにインストール済みのコンポーネントを再追加したりしないでください。
  3. コンポーネントを探す — npx shadcn@latest search を実行してください。
  4. ドキュメントと例を取得する — npx shadcn@latest docs <component> を実行して URL を取得し、その URL を取得してください。インストールしていないレジストリ項目を閲覧するには、npx shadcn@latest view を使用してください。インストール済みのコンポーネントへの変更をプレビューするには、npx shadcn@latest add --diff を使用してください。
  5. インストールまたは更新する — npx shadcn@latest add を実行してください。既存のコンポーネントを更新する場合は、まず --dry-run と --diff を使用して変更をプレビューしてください(下記のコンポーネントの更新を参照)。
  6. サードパーティ製コンポーネントのインポートを修正する — コミュニティレジストリ(例:@bundui、@magicui)からコンポーネントを追加した後、追加された UI 以外のファイルに、@/components/ui/... のようなハードコードされたインポートパスがないか確認してください。これらはプロジェクトで実際に使われているエイリアスと一致しません。npx shadcn@latest info を使って正しい ui エイリアス(例:@workspace/ui/components)を取得し、それに応じてインポートを書き換えてください。CLI は独自の UI ファイルのインポートを書き換えますが、サードパーティのレジストリコンポーネントでは、プロジェクトと一致しないデフォルトのパスが使われている場合があります。
  7. 追加したコンポーネントを確認する — いずれかのレジストリからコンポーネントまたはブロックを追加した後は、必ず追加したファイルを読み、正しいことを確認してください。不足しているサブコンポーネント(例:SelectGroup を伴わない SelectItem)、インポート漏れ、誤った構成、重要なルールへの違反がないかを確認してください。また、アイコンのインポートは、プロジェクトのコンテキストにある iconLibrary に置き換えてください(例:レジストリ項目が lucide-react を使っていて、プロジェクトが hugeicons を使っている場合は、インポートとアイコン名を適切に置き換えてください)。先に進む前に、すべての問題を修正してください。
  8. レジストリを明示する — ユーザーからブロックまたはコンポーネントの追加を依頼された場合、レジストリを推測しないでください。レジストリが指定されていない場合(例:ユーザーが @shadcn、@tailark、owner/repo などを指定せずに「ログインブロックを追加して」と依頼した場合)は、どのレジストリを使うか尋ねてください。ユーザーに代わってレジストリを決めないでください。
  9. プリセットを切り替える — まずユーザーに、上書き、部分適用、マージ、スキップのどれにするか尋ねてください。
    • 現在のプリセットを確認する: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 を使用してください。

  1. npx shadcn@latest add <component> --dry-run を実行し、影響を受けるファイルをすべて確認します。
  2. 各ファイルについて、npx shadcn@latest add <component> --diff <file> を実行し、上流とローカルでの変更内容を確認します。
  3. 差分に基づいて、ファイルごとに判断します。
    • ローカルの変更がない → 上書きしても安全です。
    • ローカルの変更がある → ローカルファイルを読み、差分を分析して、ローカルの変更を維持しながら上流の更新を適用します。
    • ユーザーが「すべてそのまま更新して」と言った場合 → --overwrite を使用します。ただし、先に確認してください。
  4. ユーザーの明示的な承認なしに、--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 変数、コンポーネントの拡張

コメント