shadcn-vue について
shadcn-vueは、Vueプロジェクト向けのUIコンポーネントとデザインシステムのフレームワークSkillです。CLIを使ったコンポーネントの検索、追加、更新を、プロジェクト設定や構成ルールに沿って案内します。
主な機能
- 01レジストリ内のコンポーネント検索
- 02コンポーネントのソースコード追加
- 03プロジェクト設定と導入済み項目の確認
- 04コンポーネントのドキュメントと例の取得
- 05安全なコンポーネント更新の案内
活用シーン
- 01既存コンポーネントによるVue画面の構築
- 02実装前のコンポーネントAPI確認
- 03プロジェクトへのプリセット適用
- 04更新前の上流変更の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ unovue/ shadcn-vue --skill shadcn-vueインストール後、Claude Code で/shadcn-vueを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli.mdcustomization.mdmcp.mdrules/composition.mdforms.mdicons.mdstyling.md詳細
shadcn-vue
UI、コンポーネント、デザインシステムを構築するためのフレームワークです。コンポーネントは、CLI を介してソースコードとしてユーザーのプロジェクトに追加されます。
IMPORTANT: すべての CLI コマンドは、プロジェクトの
packageManagerに応じて、プロジェクトのパッケージランナー(npx shadcn-vue@latest、pnpm dlx shadcn-vue@latest、またはbunx --bun shadcn-vue@latest)を使用して実行してください。以下の例ではnpx shadcn-vue@latestを使用していますが、プロジェクトに適したランナーに置き換えてください。
現在のプロジェクトコンテキスト
!`npx shadcn-vue@latest info --json`
上記の JSON には、プロジェクトの設定とインストール済みコンポーネントが含まれています。任意のコンポーネントのドキュメントとサンプル URL を取得するには、npx shadcn-vue@latest docs <component> を使用してください。
原則
- まず既存のコンポーネントを使用します。 カスタム UI を作成する前に、
npx shadcn-vue@latest searchを使用してレジストリを確認してください。コミュニティのレジストリも確認してください。 - 作り直すのではなく、組み合わせます。 設定ページ=Tabs + Card + フォームコントロール。ダッシュボード=Sidebar + Card + Chart + Table。
- カスタムスタイルより、組み込みのバリアントを優先します。
variant="outline"、size="sm"など。 - セマンティックカラーを使用します。
bg-primary、text-muted-foregroundを使用し、bg-blue-500のような生の値は使用しないでください。
重要なルール
これらのルールは常に適用されます。各ルールには、不適切なコードと適切なコードの組み合わせを記載したファイルへのリンクがあります。
スタイリングと Tailwind → styling.md
- レイアウトには
classを使用し、スタイリングには使用しないでください。 コンポーネントの色やタイポグラフィを上書きしないでください。 space-x-*またはspace-y-*は使用しないでください。gap-*を指定したflexを使用してください。縦方向に並べる場合は、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を使用してください。data-invalidはFieldに、aria-invalidはコントロールに設定します。無効化する場合は、data-disabledをFieldに、disabledをコントロールに設定してください。
コンポーネント構造 → composition.md
- アイテムは必ず対応する Group の内側に配置してください。
SelectItem→SelectGroup。DropdownMenuItem→DropdownMenuGroup。CommandItem→CommandGroup。 - Dialog、Sheet、Drawer には必ず Title が必要です。 アクセシビリティのため、
DialogTitle、SheetTitle、DrawerTitleが必須です。視覚的に非表示にする場合はclass="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を使用します。 カスタムの空状態マークアップを構築しないでください。 - トーストは
vue-sonner経由で行います。vue-sonnerのtoast()を使用してください。 <hr>や<div class="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
- プリセットコードは CLI で直接適用します。 既存のプロジェクトには
npx shadcn-vue@latest apply <code>を、初期化時にはnpx shadcn-vue@latest init --preset <code>を使用します。
主要なパターン
これらは、正しい shadcn-vue コードを区別する最も一般的なパターンです。エッジケースについては、上記のリンクされたルールファイルを参照してください。
<FieldGroup>
<Field>
<FieldLabel for="email">Email</FieldLabel>
<Input id="email" />
</Field>
</FieldGroup>
<Field data-invalid>
<FieldLabel>Email</FieldLabel>
<Input aria-invalid />
<FieldDescription>Invalid email.</FieldDescription>
</Field>
<Button>
<SearchIcon data-icon="inline-start" />
Search
</Button>
<div class="flex flex-col gap-4">
<div class="space-y-4">
<Avatar class="size-10">
<Avatar class="w-10 h-10">
<Badge variant="secondary">+20.1%</Badge>
<span class="text-emerald-600">+20.1%</span>
コンポーネントの選択
| 目的 | 使用するもの |
|---|---|
| ボタン/アクション | 適切なバリアントを指定した Button |
| フォーム入力 | Input、Select、Combobox、Switch、Checkbox、RadioGroup、Textarea、InputOTP、Slider |
| 2〜7 個のオプションの切り替え | ToggleGroup + ToggleGroupItem |
| データ表示 | Table、Card、Badge、Avatar |
| ナビゲーション | Sidebar、NavigationMenu、Breadcrumb、Tabs、Pagination |
| オーバーレイ | Dialog(モーダル)、Sheet(サイドパネル)、Drawer(ボトムシート)、AlertDialog(確認) |
| フィードバック | vue-sonner(トースト)、Alert、Progress、Skeleton、Spinner |
| コマンドパレット | Dialog 内の Command |
| チャート | Chart(Unovis をラップ) |
| レイアウト | Card、Separator、Resizable、ScrollArea、Accordion、Collapsible |
| 空の状態 | Empty |
| メニュー | DropdownMenu、ContextMenu、Menubar |
| ツールチップ/情報 | Tooltip、HoverCard、Popover |
主要なフィールド
注入されるプロジェクトコンテキストには、次の主要なフィールドが含まれます。
aliases→ インポートには実際のエイリアスプレフィックス(例:@/、~/)を使用し、ハードコードしないでください。tailwindVersion→"v4"では@theme inlineブロックを使用し、"v3"ではtailwind.config.jsを使用します。tailwindCssFile→ カスタム CSS 変数を定義するグローバル CSS ファイルです。必ずこのファイルを編集し、新しいファイルは作成しないでください。style→ コンポーネントのビジュアル処理(例:nova、vega)です。base→ プリミティブライブラリ(reka)です。コンポーネントの API と利用可能なプロパティに影響します。iconLibrary→ アイコンのインポート先を決定します。lucideには@lucide/vue、tablerには@tabler/icons-vueなどを使用してください。@lucide/vueと決めつけないでください。resolvedPaths→ コンポーネント、ユーティリティ、フックなどの正確なファイルシステム上の保存先です。framework→ ルーティングとファイルの規約(例:Nuxt と Vite SPA)です。packageManager→ shadcn-vue 以外の依存関係をインストールする際に使用します(例:pnpm add date-fnsとnpm install date-fns)。
すべてのフィールドについては、cli.md — info コマンドを参照してください。
コンポーネントのドキュメント、例、使用方法
npx shadcn-vue@latest docs <component> を実行すると、コンポーネントのドキュメント、例、API リファレンスの URL を取得できます。実際の内容を確認するには、これらの URL を取得してください。
npx shadcn-vue@latest docs button dialog select
コンポーネントの作成、修正、デバッグ、使用時には、必ず npx shadcn-vue@latest docs を実行し、先に URL の内容を取得してください。 これにより、推測に頼らず、正しい API と使用パターンに基づいて作業できます。
ワークフロー
- プロジェクトのコンテキストを取得する — すでに上に挿入されています。更新が必要な場合は、
npx shadcn-vue@latest infoを再度実行してください。 - まずインストール済みのコンポーネントを確認する —
addを実行する前に、必ずプロジェクトのコンテキストにあるcomponentsリストを確認するか、resolvedPaths.uiディレクトリを一覧表示してください。追加されていないコンポーネントをインポートしたり、すでにインストールされているコンポーネントを再追加したりしないでください。 - コンポーネントを検索する —
npx shadcn-vue@latest searchを実行します。 - ドキュメントとサンプルを取得する —
npx shadcn-vue@latest docs <component>を実行して URL を取得し、その URL にアクセスします。インストールしていないレジストリアイテムを閲覧するには、npx shadcn-vue@latest viewを使用します。インストール済みコンポーネントへの変更をプレビューするには、npx shadcn-vue@latest add --diffを使用します。 - インストールまたは更新する —
npx shadcn-vue@latest addを実行します。既存のコンポーネントを更新する場合は、まず--dry-runと--diffを使って変更をプレビューしてください(下記のコンポーネントの更新を参照)。 - サードパーティ製コンポーネントのインポートを修正する — コミュニティレジストリからコンポーネントを追加した後、追加された非 UI ファイルに
@/components/ui/...のようなハードコードされたインポートパスがないか確認してください。これらはプロジェクトの実際のエイリアスと一致しません。npx shadcn-vue@latest infoを使って正しいuiエイリアス(例:@workspace/ui/components)を確認し、それに合わせてインポートを書き換えてください。CLI は自身の UI ファイルのインポートを書き換えますが、サードパーティのレジストリコンポーネントでは、プロジェクトと一致しないデフォルトのパスが使われている場合があります。 - 追加したコンポーネントを確認する — いずれかのレジストリからコンポーネントやブロックを追加した後は、必ず追加されたファイルを読み、正しいことを確認してください。サブコンポーネントの不足(例:
SelectGroupなしのSelectItem)、インポートの不足、構成の誤り、重要なルールへの違反がないか確認します。また、アイコンのインポートはすべて、プロジェクトのコンテキストにあるiconLibraryに置き換えてください(例:レジストリアイテムで@lucide/vueが使われていても、プロジェクトでhugeiconsを使っている場合は、それに応じてインポートとアイコン名を置き換えます)。次に進む前に、すべての問題を修正してください。 - レジストリを明示する — ユーザーがブロックやコンポーネントの追加を依頼したときに、レジストリを推測してはいけません。レジストリが指定されていない場合(例:「ログインブロックを追加して」とだけ言われ、
@shadcnなどが指定されていない場合)は、どのレジストリを使うか確認してください。ユーザーに代わってレジストリを決めてはいけません。 - プリセットを切り替える — まずユーザーに、上書き、マージ、スキップのどれにするか確認してください。
- 上書き:
npx shadcn-vue@latest apply <code>。検出されたコンポーネント、フォント、CSS 変数を上書きします。 - マージ:
npx shadcn-vue@latest init --preset <code> --force --no-reinstallを実行し、次にnpx shadcn-vue@latest infoでインストール済みコンポーネントを一覧表示してから、各インストール済みコンポーネントに対して--dry-runと--diffを使用し、個別にスマートマージします。 - スキップ:
npx shadcn-vue@latest init --preset <code> --force --no-reinstall。コンポーネントはそのままにし、設定と CSS のみを更新します。 - 重要:プリセットのコマンドは、必ずユーザーのプロジェクトディレクトリ内で実行してください。
applyはcomponents.jsonファイルがある既存のプロジェクトでのみ動作します。CLI はcomponents.jsonにある現在のベース(reka)を自動的に保持します。--dry-runの比較などでスクラッチ/一時ディレクトリを使う必要がある場合は、--base <current-base>を明示的に指定してください。プリセットコードにはベースが含まれていません。
- 上書き:
コンポーネントの更新
ユーザーから、ローカルの変更を維持したまま上流のコンポーネントを更新するよう求められた場合は、--dry-run と --diff を使って適切にマージします。GitHub から生のファイルを手動で取得してはいけません。必ず CLI を使用してください。
npx shadcn-vue@latest add <component> --dry-runを実行し、影響を受けるファイルをすべて確認します。- 各ファイルについて、
npx shadcn-vue@latest add <component> --diff <file>を実行し、上流とローカルの変更点を確認します。 - 差分に基づいてファイルごとに判断します。
- ローカルでの変更なし → 安全に上書きできます。
- ローカルでの変更あり → ローカルファイルを読み込み、差分を分析して、ローカルの変更を維持しながら上流の更新を適用します。
- ユーザーが「すべてそのまま更新して」と言った場合 →
--overwriteを使用しますが、先に確認してください。
- ユーザーから明示的な承認を得ずに
--overwriteを使用してはいけません。
クイックリファレンス
# Create a new project.
npx shadcn-vue@latest init --name my-app --preset nova
npx shadcn-vue@latest init --name my-app --preset a2r6bw --template vite
# Initialize existing project.
npx shadcn-vue@latest init --preset nova
npx shadcn-vue@latest init --defaults # shortcut: --template=nuxt --preset=nova (base style implied)
# Apply a preset to an existing project.
npx shadcn-vue@latest apply a2r6bw
# Add components.
npx shadcn-vue@latest add button card dialog
npx shadcn-vue@latest add --all
# Search registries.
npx shadcn-vue@latest search @shadcn -q "sidebar"
# Get component docs and example URLs.
npx shadcn-vue@latest docs button dialog select
# View registry item details (for items not yet installed).
npx shadcn-vue@latest view @shadcn/button
名前付きプリセット: nova、vega、maia、lyra、mira、luma
テンプレート: nuxt、vite、astro、laravel
プリセットコード: バージョンを示す接頭辞付きの base62 文字列(例:a2r6bw)。shadcn-vue.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 — セマンティックカラー、バリアント、クラス、間隔、サイズ、省略表示、ダークモード、cn()、z-index
- cli.md — コマンド、フラグ、プリセット、テンプレート
- customization.md — テーマ設定、CSS 変数、コンポーネントの拡張