mcpField
S
shadcn-vue

shadcn-vue

github.com/unovueデザイン・UI10.7k5.8k 回インストール今日更新
リポジトリ

shadcn-vue について

shadcn-vueは、Vueプロジェクト向けのUIコンポーネントとデザインシステムのフレームワークSkillです。CLIを使ったコンポーネントの検索、追加、更新を、プロジェクト設定や構成ルールに沿って案内します。

主な機能

  1. 01レジストリ内のコンポーネント検索
  2. 02コンポーネントのソースコード追加
  3. 03プロジェクト設定と導入済み項目の確認
  4. 04コンポーネントのドキュメントと例の取得
  5. 05安全なコンポーネント更新の案内

活用シーン

  1. 01既存コンポーネントによるVue画面の構築
  2. 02実装前のコンポーネントAPI確認
  3. 03プロジェクトへのプリセット適用
  4. 04更新前の上流変更の確認

インストール

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

$npx skills add https://github.com/unovue/shadcn-vue --skill shadcn-vue

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

同梱ファイル

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

cli.md
customization.md
mcp.md
rules/
composition.md
forms.md
icons.md
styling.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> を使用してください。

原則

  1. まず既存のコンポーネントを使用します。 カスタム UI を作成する前に、npx shadcn-vue@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
  • レイアウトには 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-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
  • プリセットコードは 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 と使用パターンに基づいて作業できます。

ワークフロー

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

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

コメント