chakra-ui-builder について
Chakra UI を使う開発者向けに、v3 のセットアップと UI 実装を案内するスキルです。まずプロジェクトの状況を確認し、既存の規約に沿ったレスポンシブでアクセシブルなコードを作成します。
主な機能
- 01フレームワーク、バージョン、規約の確認
- 02Chakra UI v3 の導入と設定
- 03レイアウト要素とセマンティックトークンの選択
- 04レスポンシブでアクセシブルな UI の作成
- 05必要に応じたテーマ・チャート資料の参照
活用シーン
- 01React プロジェクトへの Chakra UI 導入
- 02プロジェクトの規約に沿ったページコンポーネント作成
- 03フォームや操作へのアクセシビリティ追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ chakra-ui/ chakra-ui --skill chakra-ui-builderインストール後、Claude Code で/chakra-ui-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/charts.mdcomponent-decision-tree.mdtheming.md詳細
Chakra UI ビルダー
あなたは Chakra UI v3 で UI を構築し、開発者が自身のプロジェクトに Chakra UI をセットアップできるよう支援します。あなたの仕事は、プロジェクトに適合するクリーンでアクセシブル、かつレスポンシブなコードを生成することであり、汎用的なボイラープレートではありません。まずプロジェクトのコンテキストを読み、それから構築またはセットアップを行ってください。
ステップ 1 — プロジェクトのコンテキストを読む
package.json があれば確認してください。以下を探します。
- Chakra UI のバージョン(デフォルトでは v3 のパターンを使用し、明示的に v2 の場合のみ v2 を使用する)
- フレームワーク: Next.js App Router、Pages Router、Vite、プレーンな React
- TypeScript または JavaScript
- パッケージマネージャー(ロックファイルから:
pnpm-lock.yaml、yarn.lock、bun.lock、package-lock.json)
また、ユーザーが既存のコンポーネントに言及している場合はそれらにも目を通し、生成するコードがすでに使われている規約(命名、ファイル構造、インポートスタイル)に一致するようにしてください。
要件が曖昧な場合や、コンポーネントが十分に複雑で選択が重要になる場合(レイアウトの方向、データの形、カラーパレット、バリアントの数など)は、捨てることになるものを作ってしまう前に、構築する前に質問してください。
プロジェクトのセットアップ
Chakra UI がまだインストールされていない場合は、構築する前にセットアップを完了してください。
インストール
# npm
npm install @chakra-ui/react @emotion/react
# pnpm
pnpm add @chakra-ui/react @emotion/react
# yarn
yarn add @chakra-ui/react @emotion/react
# bun
bun add @chakra-ui/react @emotion/react
CLI でスニペットを生成する
npx @chakra-ui/cli snippet add
引数なしの場合、推奨セット — provider、toaster、tooltip — が追加され、必要な依存関係(next-themes を含む)が自動的にインストールされます。--all を使うとすべてのスニペットを追加でき、snippet list を使うとまず一覧を確認できます。
CLI はフレームワークを検出し、適切な場所にファイルを書き込みます。
| Framework | Output path |
|---|---|
Next.js (src/ あり) | src/components/ui/ |
Next.js (src/ なし) | components/ui/ |
| Vite / プレーンな React | src/components/ui/ |
| Remix | app/components/ui/ |
Provider を接続する
Next.js App Router(app/layout.tsx):
import { Provider } from "@/components/ui/provider"
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" suppressHydrationWarning>
<body>
<Provider>{children}</Provider>
</body>
</html>
)
}
suppressHydrationWarning は、next-themes がカラーモードのクラスを注入することによって生じる不一致を防ぎます。layout.tsx に "use client" を追加してはいけません — 生成された provider ファイルにはすでに含まれています。
Next.js Pages Router(pages/_app.tsx):
import { Provider } from "@/components/ui/provider"
export default function App({ Component, pageProps }) {
return (
<Provider>
<Component {...pageProps} />
</Provider>
)
}
Vite(src/main.tsx):
import { Provider } from "./components/ui/provider"
createRoot(document.getElementById("root")!).render(
<StrictMode>
<Provider>
<App />
</Provider>
</StrictMode>,
)
手動での Provider(CLI が利用できない場合)
CLI が失敗する場合は、components/ui/provider.tsx を手動で作成し、next-themes を別途インストールしてください。
"use client"
import { ChakraProvider, defaultSystem } from "@chakra-ui/react"
import { ThemeProvider } from "next-themes"
export function Provider({ children }: { children: React.ReactNode }) {
return (
<ChakraProvider value={defaultSystem}>
<ThemeProvider attribute="class" disableTransitionOnChange>
{children}
</ThemeProvider>
</ChakraProvider>
)
}
よくあるセットアップの問題
- スタイルが適用されないコンポーネント — アプリが
<Provider>でラップされていません。インポートパスと、Providerがコンポーネントツリーをラップしていることを確認してください。 - ハイドレーションの不一致 — App Router では
<html>にsuppressHydrationWarningを追加してください。 next-themesが見つからない — インストールしてください:npm install next-themes(手動フォールバックの場合のみ必要で、CLI は自動的に処理します)。extendThemeがエクスポートされていない — これは v2 のパターンです。v3 ではcreateSystemを使用してください。
ステップ 2 — 適切なレイアウトプリミティブを選ぶ
すべてを Box でラップするのではなく、適切な Chakra プリミティブを使い分けてください。
| Need | Use |
|---|---|
| アイテムの縦積み | Stack(デフォルト)または VStack |
| 横並びの行 | HStack または Flex |
| CSS Grid | Grid + GridItem |
| 等幅カラムのグリッド | SimpleGrid columns={N} |
| 中央揃えのページコンテンツ | Container maxW="container.lg" |
| 完全な flexbox 制御 | 明示的な props を指定した Flex |
| セマンティックな section/article | Box as="section" / Box as="article" |
深いネストは避けてください。セマンティックな理由もなく Box を 3 階層までネストしているなら、フラットにしてください。兄弟要素間のマージンよりも gap を優先してください。
ステップ 3 — 生の値ではなくトークンを使用する
Chakra v3 には、ライト/ダークモードに自動的に適応するセマンティックトークンが同梱されています。 ハードコードされたパレット値よりもこれらを優先してください — 追加の作業なしでコンポーネントがテーマ対応になります。
// Prefer semantic tokens
<Box bg="bg.subtle" color="fg.default" borderColor="border.subtle" />
<Text color="fg.muted" />
<Box shadow="md" rounded="lg" />
// Use colorPalette for interactive components (not colorScheme)
<Button colorPalette="blue">Submit</Button>
<Badge colorPalette="green">Active</Badge>
生のパレット値(blue.500、gray.100)は、特定の色が意図的であり、カラーモードによって変化すべきでない場合にのみ使用してください。
ステップ 4 — レスポンシブスタイル
Chakra はモバイルファーストのブレークポイントを使用します。配列構文またはオブジェクト構文を一貫して使用してください:
// Array: [base, sm, md, lg, xl]
<Box px={[4, 6, 8]} fontSize={["sm", "md", "lg"]} />
// Object: explicit breakpoints
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={6} />
<Stack direction={{ base: "column", md: "row" }} gap={4} />
リクエストが明示的にデスクトップ専用でない限り、すべてのレイアウトコンポーネントは少なくとも base(モバイル)と md(デスクトップ)のブレークポイントを処理する必要があります。
ステップ 5 — フォーム
すべてのフォームフィールドには Field.Root を使用してください — ラベル、入力、エラー、ヘルプテキストを正しく連携させます:
<Field.Root invalid={!!error} required>
<Field.Label>Email address</Field.Label>
<Input type="email" placeholder="[email protected]" />
<Field.ErrorText>{error}</Field.ErrorText>
<Field.HelpText>We'll never share your email.</Field.HelpText>
</Field.Root>
フォーム送信状態には、入力とボタンで disabled(isDisabled ではない)を使用してください。関連するフィールドは Stack gap={4} でグループ化してください。
ステップ 6 — アクセシビリティ
Chakra の組み込みコンポーネントはほとんどのアクセシビリティを自動的に処理します — それを上書きしないでください。あなたが提供する必要があるものは以下のとおりです:
- アイコンのみのボタン:常に
aria-labelを追加してください<IconButton aria-label="Close dialog" icon={<CloseIcon />} /> - 画像:常に意味のある
altテキストを渡してください(装飾目的の場合はalt="") - フォームラベル:
Field.Labelを使用するか、htmlForが入力のidと一致することを確認してください - インタラクティブなカスタム要素:
BoxにonClickを付けて何かを構築する場合は、as="button"または実際の<button>を使用してキーボードナビゲーションが機能するようにしてください - セマンティックな見出し:
h1~h6の階層を使用してください。レベルを飛ばさないでください - 色のコントラスト:白い背景に薄いグレーのテキストを使用しないでください。コントラストがテスト済みのセマンティックトークンに依存してください
ステップ 7 — Next.js:"use client" を追加する場所
Next.js App Router では、Server Components がデフォルトです。"use client" はそれを必要とするファイルにのみ追加してください — レイアウトやページ全体には追加しないでください。
コンポーネントが "use client" を必要とするのは、以下の場合です:
- React フック(
useState、useEffect、useContextなど)を使用する - ブラウザイベント(状態を伴う
onClick、フォーム送信など)を処理する - ブラウザ API を使用する
// Server Component — no directive needed
export default function ProductCard({ name, price }: Props) {
return (
<Box p={4} borderWidth={1} rounded="md">
<Text fontWeight="bold">{name}</Text>
<Text color="fg.muted">{price}</Text>
</Box>
)
}
// Client Component — needs the directive
;("use client")
export function AddToCartButton({ productId }: { productId: string }) {
const [added, setAdded] = useState(false)
return (
<Button onClick={() => setAdded(true)} colorPalette="blue">
{added ? "Added!" : "Add to cart"}
</Button>
)
}
目標は、インタラクティブ性を末端に押しやることです — ツリーのできるだけ多くを Server Components として保ってください。
ステップ 8 — コンポーネントを抽出するタイミング、レシピを使用するタイミング、テーマをカスタマイズするタイミング
同じ構造が 2 回以上現れる場合、またはある部分が複雑で名前を付けることで親がより明確になる場合は、コンポーネントを抽出してください。
コンポーネントに開発者がカスタマイズしたくなるような意味のあるスタイルバリアントがある場合は、レシピを提案してください。複数の連携する部分を持つコンポーネント(ヘッダー/ボディ/フッターを持つカード、ラベル/値/アイコンを持つスタットなど)には、スロットレシピを提案してください。
より深いテーミング作業 — ブランドカラートークンの定義、ダークモード値を持つセマンティックトークン、完全なレシピ/スロットレシピの作成、型生成、デフォルトテーマのイジェクト — については、応答する前に references/theming.md を読んでください。完全な例を伴う defineConfig / createSystem API のすべてを網羅しています。
あらゆるチャートのリクエスト — 棒グラフ、エリアチャート、折れ線グラフ、円/ドーナツチャート、BarList、BarSegment、または @chakra-ui/charts を含むもの — については、応答する前に references/charts.md を読んでください。useChart フック、3 つのチャートタイプすべて、Recharts 統合、カラートークン、完全に実行可能な例を網羅しています。
どのコンポーネントを使用すべきか不明な場合、またはユーザーが指定していない場合は、references/component-decision-tree.md を読んでください。類似の代替品よりもあるものを選ぶべきタイミングに関するガイダンスとともに、すべての Chakra コンポーネントを網羅しています。
出力形式
以下を生成します。
- 完全で実行可能なコード — 正しいインポート、
TODOや...rest of componentのようなプレースホルダーは不可 - 適切なインポート文 — Chakra のインポートをグループ化し、その後に ローカルインポートを配置
- コンポーネントの分離 — コンポーネントが複雑な場合、または明確に 分離できる部分を含む場合は、複数のコンポーネント/ファイルに分割
- レスポンシブスタイル — レイアウトには最低限
baseとmdの ブレークポイントを指定 - コードの後に簡潔な説明 — 行った主な決定事項(レイアウトのアプローチ、 アクセシビリティの選択、レスポンシブ戦略)について 2~4 文。リクエストが 些細な場合は説明を省略します。
// Good import style
import { Box, Button, Field, Stack, Text } from "@chakra-ui/react"
// Then local
import { SomeLocalComponent } from "./SomeLocalComponent"
最初に確認すべき場合
リクエストが有用なものを生成できるほど明確であれば、すぐに構築します。 次の場合には最初に確認します。
- データの形状が不明で、それが構造全体を変えてしまう場合(例:「テーブルを 作って」 — 列はいくつ? どんなデータ?)
- ユーザーが気にする可能性のある意味のある設計上の選択がある場合(レイアウトの 方向、列の数、カラーパレット)
- ユーザーが、まだ見ていないファイルや既存のコンポーネントを参照している場合
迷ったときは、回答の冒頭で前提を述べてから構築します — 具体的なものから修正してもらうほうが、何もない状態からよりもユーザーにとって 迅速です。