shadcn-ui/ui

shadcn コンポーネントとプロジェクトの管理 — 追加、検索、修正、デバッグ、スタイリング、チャットインターフェースを含むUIの構成を行います。プロジェクトコンテキスト、コンポーネンドキュメント、使用例を提供します。shadcn/ui、コンポーネントレジストリ、プリセット、--preset コード、components.json ファイルを含むプロジェクトで動作します。また、「shadcn init」、「--preset でアプリを作成」、「--preset に切り替え」、デザインシステムの構築、DESIGN.md やブランド仕様を shadcn/ui に適用する際にもトリガーされます。

ui とは?

このスキルは、shadcn/ui を使用したUIコンポーネント、デザインシステム、チャットインターフェースの構築と管理のための包括的なガイドを提供します。プロジェクトの設定とインストール済みコンポーネントに関する現在のコンテキストを注入し、CLI コマンド (`npx shadcn@latest`) を使用してコンポーネントの追加、検索、ドキュメントの取得、プリセットの適用を行います。スタイリングやフォーム、コンポーネント構成、チャットなどに関する重要なルールを定義し、ベストプラクティス(`gap-*` の使用、`cn()` 関数、セマンティックカラーなど)を強制します。コンポーネントの選択表や、一般的なパターンを示すコード例も提供し、開発者が一貫性のあるアクセシブルな shadcn/ui コードを記述できるようにします。主に Cursor や Claude Code などのAIエージェントと組み合わせて使用することを想定しています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shadcn-ui/ui/tree/HEAD/skills/shadcn

Installed? Explore more 生産性&コラボレーション skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

shadcn/ui

UI、コンポーネント、デザインシステムを構築するためのフレームワークです。コンポーネントはソースコードとしてCLIを介してユーザーのプロジェクトに追加されます。

重要: CLIコマンドはすべて、プロジェクトのパッケージランナーを使用して実行してください: npx shadcn@latest、pnpm dlx shadcn@latest、または bunx --bun shadcn@latest — プロジェクトの packageManager に基づいて選択します。以下の例では npx shadcn@latest を使用していますが、プロジェクトに適したランナーに置き換えてください。

現在のプロジェクトコンテキスト

!`npx shadcn@latest info --json`

上記のJSONにはプロジェクト設定とインストール済みコンポーネントが含まれています。コンポーネントのドキュメントと使用例のURLを取得するには、npx shadcn@latest docs <コンポーネント> を使用します。

原則

  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 を使用する。 フォームレイアウトに生の div と space-y-* や grid gap-* を使用しない。
  • 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

  • アイテムは常にそのグループの内側に配置する。 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 を使用する。 カスタムの空状態マークアップを構築しない。
  • Toast はプロジェクトのベースに従う。 Base UI プロジェクトでは、toast コンポーネントの toast を使用する。Radix および React Aria プロジェクトでは 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} のようにし、文字列でのルックアップはしない。

チャットとメッセージング → chat.md

  • チャットUIはチャットプリミティブを構成する。 会話には MessageScroller、行には Message、表面には Bubble を使用する。手作りされた bubble の div や生のスクロールコンテナは決して使用しない。
  • MessageScroller がスクロール動作を管理する。 ストリーミングフォロー、アンカー、最新へのジャンプ (MessageScrollerButton) は組み込まれている。useStickToBottom/ResizeObserver フックを書かない。
  • 添付ファイルには Attachment を使用し、システムノートと区切りには Marker を使用する。 Item カードや Separator + ラベルは使用しない。

CLI

  • プリセットコードをデコードしたり、プリセットURLを手動で構築したりしない。 npx shadcn@latest preset decode <コード>、preset url <コード>、または preset open <コード> を使用する。プロジェクトを認識したプリセット検出には、npx shadcn@latest preset resolve を使用する。
  • プリセットコードはCLIで直接適用する。 既存のプロジェクトには npx shadcn@latest apply <コード> を使用し、初期化時には npx shadcn@latest init --preset <コード> を使用する。

主要なパターン

これらは、正しい shadcn/ui コードを区別する最も一般的なパターンです。エッジケースについては、上記のリンク先のルールファイルを参照してください。

// フォームレイアウト: FieldGroup + Field、div + Label ではない。
<FieldGroup>
  <Field>
    <FieldLabel htmlFor="email">Email</FieldLabel>
    <Input id="email" />
  </Field>
</FieldGroup>

// バリデーション: Field に data-invalid、コントロールに aria-invalid。
<Field data-invalid>
  <FieldLabel>Email</FieldLabel>
  <Input aria-invalid />
  <FieldDescription>無効なメールアドレスです。</FieldDescription>
</Field>

// ボタン内のアイコン: data-icon、サイズクラスは付けない。
<Button>
  <SearchIcon data-icon="inline-start" />
  検索
</Button>

// スペーシング: space-y-* ではなく gap-*。
<div className="flex flex-col gap-4">  // 正しい
<div className="space-y-4">           // 間違い

// 等しい寸法: w-* h-* ではなく size-*。
<Avatar className="size-10">   // 正しい
<Avatar className="w-10 h-10"> // 間違い

// ステータスカラー: 生の色ではなく Badge バリアントまたはセマンティックトークン。
<Badge variant="secondary">+20.1%</Badge>    // 正しい
<span className="text-emerald-600">+20.1%</span> // 間違い

コンポーネント選択

ニーズ使用するもの
ボタン/アクション適切なバリアントを持つ 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
チャット / 会話 UIMessageScroller、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と利用可能なプロパティに影響する。
  • iconLibrary → アイコンのインポートを決定する。lucide の場合は lucide-react、tabler の場合は @tabler/icons-react などを使用する。lucide-react を想定しない。
  • resolvedPaths → コンポーネント、ユーティリティ、フックなどの正確なファイルシステム上の宛先。
  • framework → ルーティングとファイルの規約(例: Next.js App Router vs Vite SPA)。
  • packageManager → shadcn 以外の依存関係のインストールにこれを使用する(例: pnpm add date-fns と npm install date-fns の違い)。
  • preset → 現在のプロジェクトの解決済みプリセットコードと値。プリセット情報のみが必要な場合は、npx shadcn@latest preset resolve --json を使用する。

完全なフィールドリファレンスについては、cli.md — info コマンド を参照してください。

コンポーネントドキュメント、例、使用方法

コンポーネントのドキュメント、例、APIリファレンスのURLを取得するには、npx shadcn@latest docs <コンポーネント> を実行します。これらの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 <コンポーネント> を実行して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 <コード>。preset url <コード> または preset open <コード> を使用してプリセットビルダーを共有または開きます。
    • 上書き: npx shadcn@latest apply <コード>。検出されたコンポーネント、フォント、CSS変数を上書きします。
    • 部分的: npx shadcn@latest apply <コード> --only theme,font。UIコンポーネントを再インストールせずに、選択したプリセット部分のみを更新します。サポートされる値は theme と font です。カンマ区切りの組み合わせが許可されます。icon は意図的にサポートされていません。アイコンの変更には完全なコンポーネントの再インストールが必要になる場合があるためです。
    • マージ: npx shadcn@latest apply <コード> --merge。既存のコンポーネントを保持しながら新しいコンポーネントを追加します(チェックを実行します)。
    • スキップ: 何もしません。現在のプリセットをそのまま維持します。

コンポーネントの更新

# 変更をプレビューする
npx shadcn@latest add button --dry-run --diff

# 変更を適用する
npx shadcn@latest add button

既存のコンポーネントを更新する際は、常に --dry-run と --diff を最初に使用し、どのように変更されるかを正確に確認してください。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル