shadcn-vue について
shadcn-vue の UI 開発向けコーディングスキルです。コンポーネント選定、CLI の利用、構成方法、プロジェクト固有の規約を案内します。
主な機能
- 01CLI によるコンポーネント検索と追加
- 02プロジェクト情報に基づく実装
- 03構成とアクセシビリティの規則
- 04スタイル、フォーム、アイコンの規約
- 05プリセットとコンポーネントの更新手順
活用シーン
- 01Vue プロジェクトへのコンポーネント追加
- 02フォームやダッシュボードの一貫した構築
- 03ローカル変更を保ったコンポーネント更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ noartem/ skills --skill shadcn-vueインストール後、Claude Code で/shadcn-vueを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/components.jsonnuxt.config.tstailwind.csstsconfig.jsonvite.config.tscomponents/accordion.mdalert-dialog.mdalert.mdaspect-ratio.mdattachment.mdavatar.mdbadge.mdbreadcrumb.mdbubble.mdbutton-group.mdbutton.mdcalendar.mdcard.mdcarousel.mdchart.mdcheckbox.mdcode-block.mdcollapsible.mdcombobox.mdcommand.mdcontext-menu.mddata-table.mddate-picker.mddialog.mddrawer.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 → rules/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 などは、それぞれ独自に重なり順を処理します。
フォームと入力 → rules/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を設定します。
コンポーネントの構造 → rules/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が必要です。 画像の読み込みに失敗した場合に表示されます。
カスタムマークアップではなくコンポーネントを使う → rules/composition.md
- カスタムマークアップを書く前に、既存のコンポーネントを使ってください。 スタイル付きの
divを書く前に、該当するコンポーネントがあるか確認してください。 - コールアウトには
Alertを使ってください。 独自のスタイルを適用した div を作成しないでください。 - 空の状態には
Emptyを使ってください。 独自の空状態用マークアップを作成しないでください。 - トーストには
vue-sonnerを使ってください。vue-sonnerのtoast()を使ってください。 <hr>や<div class="border-t">の代わりにSeparatorを使ってください。- 読み込み中のプレースホルダーには
Skeletonを使ってください。独自のanimate-pulsediv は使わないでください。 - 独自のスタイルを適用した span の代わりに
Badgeを使ってください。
アイコン → rules/icons.md
Button内のアイコンにはdata-iconを使ってください。 アイコンにdata-icon="inline-start"またはdata-icon="inline-end"を指定します。- コンポーネント内のアイコンにはサイズ指定のクラスを使わないでください。 アイコンのサイズはコンポーネントが CSS で調整します。
size-4やw-4 h-4は使わないでください。 - アイコンは文字列キーではなく、オブジェクトとして渡してください。 文字列で検索するのではなく、
:icon="CheckIcon"と指定します。 - インポートにはプロジェクトの
iconLibraryを使ってください。 プロジェクトのコンテキストからiconLibraryを確認してください。@lucide/vueが使えると決めつけないでください。
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 と使用パターンに基づいて作業できます。
コンポーネントごとのドキュメントについては、このスキルの components/<component>.md を参照してください(公式リポジトリから自動生成された 70 個のコンポーネント)。
ワークフロー
- プロジェクトのコンテキストを取得する — すでに上に挿入されています。更新が必要な場合は、
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 から raw ファイルを手動で取得してはいけません。必ず 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
# Get project info.
npx shadcn-vue@latest info
npx shadcn-vue@latest info --json
名前付きプリセット: nova、vega、maia、lyra、mira、luma
テンプレート: nuxt、vite、astro、laravel
プリセットコード: バージョン接頭辞付きの base62 文字列(例:a2r6bw)。shadcn-vue.com から取得します。
クイックスタート(3 分)
Vue プロジェクト(Vite)の場合
1. shadcn-vue を初期化する
npx shadcn-vue@latest init
初期化中:
- スタイル:
New YorkまたはDefault(後から変更できません!) - ベースカラー:
Slate(推奨) - CSS 変数:
Yes(ダークモードに必須)
2. TypeScript のパスエイリアスを設定する
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}
3. Vite を設定する
// vite.config.ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import tailwindcss from "@tailwindcss/vite"; // Tailwind v4
import path from "path";
export default defineConfig({
plugins: [vue(), tailwindcss()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
});
4. 最初のコンポーネントを追加する
npx shadcn-vue@latest add button
同梱リソース
テンプレート(templates/):
quick-setup.ts- Vue/Nuxt の完全なセットアップガイドと例(190 行)
リファレンス(references/):
cli.md- CLI コマンド、フラグ、プリセット、テンプレート、スマートマージtheming.md- テーマ設定とcssVariableserror-catalog.md- 解決策とともに記載された、ドキュメント化済みの問題 7 件すべて(267 行)component-examples.md- 50 件以上のコンポーネント例とコードdark-mode-setup.md- ダークモードの完全な実装ガイドdata-tables.md- TanStack Table を使用したデータテーブル
ルール(references/rules/):
styling.md- セマンティックカラー、バリアント、class、間隔、サイズ、省略表示、ダークモード、cn()、z-indexforms.md- FieldGroup、Field、InputGroup、ToggleGroup、FieldSet、検証状態composition.md- グループ、オーバーレイ、Card、Tabs、Avatar、Alert、Empty、Toast、Separator、Skeleton、Badge、Button の読み込み状態icons.md- data-icon、アイコンのサイズ設定、オブジェクトとしてのアイコンの受け渡し、iconLibrary
コンポーネントのドキュメント(components/):
references/components.md- shadcn-vue の全コンポーネント(70 件)の一覧components/<component>.md- インストール、使用方法、例を記載した各コンポーネントのドキュメント
公式ドキュメント:
- shadcn-vue Docs:https://shadcn-vue.com
- Reka UI Docs:https://reka-ui.com
- GitHub:https://github.com/unovue/shadcn-vue
参照資料を読み込むタイミング
タスクに応じて、次の参照資料を読み込んでください。
-
次の場合は
references/rules/styling.mdを読み込みます。- Tailwind クラスを使ったコンポーネントのマークアップを作成またはレビューする場合
- スタイリングの問題や、見た目の一貫性のなさについてユーザーから相談された場合
- セマンティックトークン、間隔、サイズの正しい使い方を確認する必要がある場合
- トリガーフレーズ:「スタイル」「色」「間隔」「ギャップ」「ダークモード」「クラス」
-
次の場合は
references/rules/forms.mdを読み込みます。- フォームを作成する場合、またはフォームコントロールを扱う場合
- アクセシブルなフォームフィールドのパターンが必要な場合
- InputGroup、ToggleGroup、FieldSet、またはバリデーション状態を扱う場合
- トリガーフレーズ:「フォーム」「入力」「フィールド」「バリデーション」「トグルグループ」
-
次の場合は
references/rules/composition.mdを読み込みます。- 複数のコンポーネントを組み合わせる場合
- ダイアログ、カード、メニュー、タブ、またはオーバーレイコンポーネントを作成する場合
- 特定の UI パターンにどのコンポーネントを使うべきか、ユーザーから尋ねられた場合
- トリガーフレーズ:「ダイアログ」「カード」「タブ」「メニュー」「オーバーレイ」「空の状態」「アラート」
-
次の場合は
references/rules/icons.mdを読み込みます。- ボタンやその他のコンポーネントにアイコンを追加する場合
- アイコンのサイズや配置の問題をトラブルシューティングする場合
- 正しいアイコンのインポートパッケージを確認する必要がある場合
- トリガーフレーズ:「アイコン」「lucide」「tabler」「data-icon」
-
次の場合は
references/error-catalog.mdを読み込みます。- ユーザーから「コンポーネントが見つからない」というエラーやインポートエラーについて相談された場合
- セットアップコマンドが失敗した場合、または設定の問題が発生した場合
- Tailwind CSS 変数や TypeScript のパスが機能しない場合
- トリガーフレーズ:「動作しない」「エラー」「失敗する」「壊れている」
-
次の場合は
references/components.mdを読み込みます。- どのコンポーネントが利用可能か(名前、カテゴリ、ステータス)をユーザーから尋ねられた場合
- コンポーネントの追加や使用にあたり、正しいインストール先やインポートパスが必要な場合
- カスタム実装を勧める前に、そのコンポーネントが存在するか確認する必要がある場合
-
次の場合は
references/component-examples.mdを読み込みます。- ユーザーから「[コンポーネント]をどう実装すればよいですか?」と尋ねられた場合
- 特定のコンポーネントのコピーして使える例が必要な場合
- フォーム、テーブル、ナビゲーション、またはデータ表示を作成する場合
- トリガーフレーズ:「例」「使い方」「実装」「コードサンプル」
-
次の場合は
references/cli.mdを読み込みます。- CLI(
init、add、update、search、view、docs、info、apply)の実行方法や、プロンプトの意味をユーザーから尋ねられた場合 - 1 つ以上のコンポーネントをインストールするための正確なコマンドやフラグが必要な場合
- プリセットやテンプレートを扱う場合、またはプリセットを切り替える場合
- CLI 関連の問題(レジストリ、パス、上書き)をトラブルシューティングする場合
- CLI(
-
次の場合は
references/dark-mode-setup.mdを読み込みます。- ダークモードやテーマの切り替えを実装する場合
- Vue 3 + Vite、Nuxt、または Astro のセットアップについてユーザーから言及された場合
- テーマ管理のコンポーザブルパターンが必要な場合
- トリガーフレーズ:「ダークモード」「テーマ」「ライト/ダーク」「カラースキーム」
-
次の場合は
references/theming.mdを読み込みます。- ユーザーが CSS 変数(
cssVariables、:root、.dark)を使ってテーマトークンをカスタマイズしたい場合 - Tailwind を CSS 変数ベースの色や角丸に接続する必要がある場合
- shadcn-vue のデザイントークン(色、角丸、タイポグラフィ)を設定または調整する場合
- ユーザーが CSS 変数(
-
次の場合は
references/data-tables.mdを読み込みます。- 並べ替え、フィルタリング、ページネーションに対応したテーブルを作成する場合
- ユーザーから TanStack Table または
DataTableについて言及された場合 - トリガーフレーズ:「データテーブル」「テーブル」「tanstack」「並べ替え」「ページネーション」
重要なセットアップルール
必ず行うこと
✅ コンポーネントを追加する前に init を実行します
- 必要な設定とユーティリティを作成します
- パスエイリアスを設定します
✅ テーマ設定には CSS 変数を使用します(cssVariables: true)
- ダークモードに対応できます
- テーマを柔軟にカスタマイズできます
✅ TypeScript のパスエイリアスを設定します
- コンポーネントのインポートに必要です
components.jsonのエイリアスと一致させる必要があります
✅ components.json をバージョン管理に含めます
- チームメンバー間で同じ設定を使うために必要です
- プロジェクトのセットアップを記録できます
してはいけないこと
❌ 初期化後に style を変更しないでください
- 完全な再インストールが必要です
- 代わりに、新しいディレクトリで再初期化してください
❌ Radix Vue と Reka UI v2 を混在させないでください
- コンポーネントの API に互換性がありません
- どちらか一方を使用してください
❌ TypeScript の設定を省略しないでください
- コンポーネントのインポートに失敗します
- IDE の自動補完が機能しません
❌ Tailwind CSS なしで使用しないでください
- コンポーネントは Tailwind でスタイル設定されています
- 正しくレンダリングされません
よくある間違い
initの前にaddを実行し、components.jsonがない状態になる。tailwind.cssVariables: trueを設定せずに CSS 変数クラスを使用する。- プロジェクトのコンテキストから
aliasesを読み取らず、@/インポートをハードコードする。 - CLI を使わずに GitHub からコンポーネントファイルを手動で取得する。
- ユーザーの確認なしに
--overwriteを使用する。 - ユーザーに確認せず、レジストリ名を推測する。
設定
shadcn-vue は components.json を使って、以下を設定します。
- コンポーネントのパス(
@/components/ui) - Utils の場所(
@/lib/utils) - Tailwind の設定ファイルのパス
- TypeScript のパス
- アイコンライブラリ
- カスタムレジストリ
完全な例: templates/components.json を参照するか、npx shadcn-vue@latest init で生成してください。
Utils ライブラリ
@/lib/utils.ts ファイルは、Tailwind クラスをマージするための cn() ヘルパーを提供します。
- 複数の className 文字列を結合します
clsxとtailwind-mergeを使って競合を解決します
shadcn-vue init によって自動生成されます。手動で設定する必要はありません。