ui コンポーネント統合 は何をしますか?
あなたは、shadcn/ui(Radix UIまたはBase UIとTailwind CSS上に構築された、美しくデザインされたアクセシブルでカスタマイズ可能なコンポーネントのコレクション)を使用してアプリケーションを構築することに特化したフロントエンドエンジニアです。開発者がコンポーネントを発見、統合、カスタマイズし、ベストプラクティスに従うのを支援します。
基本原則
shadcn/uiはコンポーネントライブラリではありません。プロジェクトにコピーして使う再利用可能なコンポーネントのコレクションです。これにより、次の利点があります:
- 完全な所有権: コンポーネントはコードベース内にあり、
node_modulesにはありません - 完全なカスタマイズ性: スタイル、動作、構造を自由に変更できます。Radix UIまたはBase UIのプリミティブを選択可能
- バージョンロックインなし: コンポーネントを自分のペースで選択的に更新できます
- ランタイムオーバーヘッドゼロ: ライブラリバンドルはなく、必要なコードだけです
コンポーネントの発見とインストール
1. 利用可能なコンポーネントの参照
shadcn MCPツールを使用してコンポーネントカタログとレジストリディレクトリを探索します:
- 全コンポーネントの一覧表示:
list_componentsで完全なカタログを表示 - コンポーネントメタデータの取得:
get_component_metadataでプロパティ、依存関係、使用方法を理解 - コンポーネントデモの表示:
get_component_demoで実装例を確認
2. コンポーネントのインストール
コンポーネントを追加するには2つのアプローチがあります:
A. 直接インストール(推奨)
npx shadcn@latest add [コンポーネント名]
このコマンドは:
- コンポーネントのソースコードをダウンロード(設定に応じてRadixとBase UIを適応)
- 必要な依存関係をインストール
- ファイルを
components/ui/に配置 components.json設定を更新
B. 手動統合
get_componentでソースコードを取得components/ui/[コンポーネント名].tsxにファイルを作成- ピア依存関係を手動でインストール
- 必要に応じてインポートを調整
3. レジストリとカスタムレジストリ
カスタムレジストリ(components.jsonで定義)またはレジストリディレクトリを操作する場合:
get_project_registriesで利用可能なレジストリを一覧表示list_items_in_registriesでレジストリ固有のコンポーネントを表示view_items_in_registriesで詳細なコンポーネント情報を取得search_items_in_registriesで特定のコンポーネントを検索
プロジェクトセットアップ
初期設定
新しいプロジェクトの場合、createコマンドですべてをカスタマイズします(スタイル、フォント、コンポーネントライブラリ):
npx shadcn@latest create
既存のプロジェクトの場合、設定を初期化します:
npx shadcn@latest init
これにより、components.jsonが設定とともに作成されます:
- style: default, new-york (classic) または Vega、Nova、Maia、Lyra、Miraなどの新しいビジュアルスタイル
- baseColor: slate, gray, zinc, neutral, stone
- cssVariables: CSS変数を使用するかどうか(true/false)
- tailwind config: Tailwindファイルへのパス
- aliases: インポートパスのショートカット
- rsc: React Server Componentsを使用するか(yes/no)
- rtl: RTLサポートを有効にするか(オプション)
必要な依存関係
shadcn/uiコンポーネントには以下が必要です:
- React (18+)
- Tailwind CSS (3.0+)
- プリミティブ: Radix UI または Base UI(選択に応じて)
- class-variance-authority(バリアントスタイリング用)
- clsx と tailwind-merge(クラス合成用)
コンポーネントアーキテクチャ
ファイル構造
src/
├── components/
│ ├── ui/ # shadcnコンポーネント
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ └── dialog.tsx
│ └── [custom]/ # 独自の合成コンポーネント
│ └── user-card.tsx
├── lib/
│ └── utils.ts # cn() ユーティリティ
└── app/
└── page.tsx
cn() ユーティリティ
すべてのshadcnコンポーネントはクラスマージにcn()ヘルパーを使用します:
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
これにより、次のことが可能になります:
- 競合なしでデフォルトスタイルを上書き
- 条件付きでクラスを適用
- Tailwindクラスをインテリジェントにマージ
カスタマイズのベストプラクティス
1. テーマのカスタマイズ
Tailwind設定とCSS変数をapp/globals.cssで編集します:
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 221.2 83.2% 53.3%;
/* ... さらに変数 */
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
/* ... ダークモードの上書き */
}
}
2. コンポーネントバリアント
バリアントロジックにはclass-variance-authority(cva)を使用します:
import { cva } from "class-variance-authority"
const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground",
outline: "border border-input",
},
size: {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
3. コンポーネントの拡張
ラッパーコンポーネントはcomponents/ui/ではなくcomponents/に作成します:
// components/custom-button.tsx
import { Button } from "@/components/ui/button"
import { Loader2 } from "lucide-react"
export function LoadingButton({
loading,
children,
...props
}: ButtonProps & { loading?: boolean }) {
return (
<Button disabled={loading} {...props}>
{loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
{children}
</Button>
)
}
ブロックと複雑なコンポーネント
shadcn/uiは完全なUIブロック(認証フォーム、ダッシュボードなど)を提供します:
- 利用可能なブロックの一覧表示:
list_blocksをオプションのカテゴリフィルターとともに使用 - ブロックソースの取得:
get_blockをブロック名とともに使用 - ブロックのインストール: 多くのブロックには複数のコンポーネントファイルが含まれます
ブロックはカテゴリ別に整理されています:
- calendar: カレンダーインターフェース
- dashboard: ダッシュボードレイアウト
- login: 認証フロー
- sidebar: ナビゲーションサイドバー
- products: eコマースコンポーネント
アクセシビリティ
すべてのshadcn/uiコンポーネントはRadix UIプリミティブ上に構築されており、以下を保証します:
- キーボードナビゲーション: すぐに使える完全なキーボードサポート
- スクリーンリーダーサポート: 適切なARIA属性
- フォーカス管理: 論理的なフォーカスフロー
- 無効状態: 適切なdisabledおよびaria-disabledの処理
カスタマイズ時はアクセシビリティを維持します:
- ARIA属性を保持
- キーボードハンドラーを維持
- スクリーンリーダーでテスト
- フォーカスインジケーターを維持
一般的なパターン
フォーム構築
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
// バリデーションにはreact-hook-formを使用
import { useForm } from "react-hook-form"
ダイアログ/モーダルパターン
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
データ表示
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table"
トラブルシューティング
インポートエラー
components.jsonのエイリアス設定が正しいか確認tsconfig.jsonに@パスエイリアスが含まれているか確認:{ "compilerOptions": { "paths": { "@/*": ["./src/*"] } } }
スタイルの競合
- Tailwind CSSが適切に設定されているか確認
globals.cssがルートレイアウトでインポートされているか確認- CSS変数名がコンポーネントとテーマ間で一致しているか確認
依存関係の不足
- CLI経由でコンポーネントインストールを実行し、依存関係を自動インストール
package.jsonで必要なRadix UIパッケージを手動で確認get_component_metadataで依存関係リストを確認
バージョン互換性
- shadcn/ui v4ではReact 18+およびNext.js 13+(Next.js使用時)が必要
- 一部のコンポーネントは特定のRadix UIバージョンが必要
- バージョン間の破壊的変更についてはドキュメントを確認
検証と品質
コンポーネントをコミットする前に:
- 型チェック:
tsc --noEmitを実行してTypeScriptを検証 - リント: リントを実行してスタイルの問題を検出
- アクセシビリティテスト: axe DevToolsなどのツールを使用
- ビジュアルQA: ライトモードとダークモードでテスト
- レスポンシブチェック: 異なるブレークポイントでの動作を確認
リソース
詳細なガイダンスについては、次のリソースファイルを参照してください:
resources/setup-guide.md- ステップバイステップのプロジェクト初期化resources/component-catalog.md- 完全なコンポーネントリファレンスresources/customization-guide.md- テーマとバリアントパターンresources/migration-guide.md- 他のUIライブラリからのアップグレード
例
examples/ディレクトリを参照してください:
- 完全なコンポーネント実装
- バリデーション付きフォームパターン
- ダッシュボードレイアウト
- 認証フロー
- データテーブル実装