Communitygithub.com

0xAlchemist-cs/personal-ui-system

Chakra UI v3を使用したUIコードのレビュー、変換、改善を行います。このスキルは、ユーザーがChakra UIコードの問題を確認したり、プレーンなHTML/CSS、Tailwind、CSS Modules、styled-componentsをChakra UIに変換したり、乱雑なChakraコンポーネントを整理したり、レイアウト構造やトークンの使用法を修正したりする際に使用します。

personal-ui-system とは?

このスキルは、Chakra UI v3に特化したUIコードのレビュー、リファクタリング、変換エージェントです。主な機能は、既存のChakra UIコードのアクセシビリティ、レスポンシブ対応、API正しさ、トークン使用法などを分析して批評を生成する「レビューモード」と、プレーンHTML/CSS、Tailwind CSS、CSS Modules、styled-componentsからChakra UI v3へのコード変換または既存Chakraコードのクリーンアップを実行する「リファクタリング/変換モード」の2つです。対応プラットフォームはNext.js(App Router / Pages Router)、Vite、プレーンReactなど。v2からv3への移行にも対応し、セマンティックトークンや`asChild`パターン(Next.js Link/Image連携)もサポートします。ユーザーが「レビューして」「変換して」「直して」「Chakra化して」など、カジュアルな表現でもトリガー可能で、コードが共有されていない場合は入力を促します。出力は構造化された批評または完全なリファクタリングコードと変更点のリストで、部分的な変換でも動作することを重視しています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/0xAlchemist-cs/personal-ui-system/tree/HEAD/.agents/skills/chakra-ui-refactor

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Chakra UI リファクタリング & レビュー

あなたはChakra UI v3を使用してUIコードをレビューし、改善します。開発者のニーズに応じて、構造化された批評、書き換えたコード、またはその両方を生成します。出力を生成する前に、コードとプロジェクトのコンテキストを完全に読んでください。


ステップ1 — 方向性を定め、意図を判断する

出力を行う前に、以下を特定します。

  • Chakra UI バージョン — package.jsonを確認。デフォルトではv3を使用。
  • フレームワーク — Next.js App Router、Pages Router、Vite、プレーンReact
  • ソースの種類 — 既存のChakra、プレーンHTML/CSS、Tailwind、CSS Modules、styled-components
  • ユーザーのリクエスト内容:
    • レビューのみ — 「これをチェックして」「これは正しい/慣用的ですか」「何が悪い?」「私のコードをレビューして」→ 対象を絞った修正案を含む批評を生成。完全な書き換えは行わない。
    • リファクタリング / 変換 — 「これをリファクタリングして」「Tailwindから変換して」「これを整理して」→ 書き換えたコードを生成。
    • 両方 — 「レビューして修正して」→ 最初に批評、次に書き換えたコード。

レスポンスの先頭に、あなたの解釈を記載します(例:「既存のChakra v3コードとしてレビューします。Next.js App Routerを想定しています。」)。

コードがまだ共有されていない場合は、コードを要求してください。コードの説明をレビューしないでください。


ステップ2 — コードを分析する

出力モードに関係なく、以下の次元に沿ってコードを精査します。レビューの場合、これらは指摘事項になります。リファクタリングの場合、これらは修正すべきチェックリストになります。

アクセシビリティ

  • すべてのインタラクティブ要素にアクセス可能なラベルがありますか?(アイコンボタンのaria-label、ラベル+入力ペアのhtmlFor/id、画像のalt)
  • キーボードナビゲーションは可能ですか?(フォーカスリングが抑制されていない、インタラクティブ要素が実際にフォーカス可能である)
  • 見出し階層は適切ですか?(レベルを飛ばしていない、スタイルのショートカットとしてh1を使用していない)
  • フォームフィールドはField.Root、Field.Label、Field.ErrorTextでラップされていますか?
  • コンポーネントは、色だけに依存せずに機能しますか?

レスポンシブ対応

  • レイアウトコンポーネントは複数のブレークポイントでの動作を指定していますか?
  • レスポンシブトークンでより適切に表現できる箇所に、ハードコードされたピクセル値が使用されていませんか?
  • モバイルで壊れませんか?(固定幅、小さなビューポートでのoverflow: hidden)

Chakra APIの正しさ

  • v3のプロップ名が使用されていますか?(isDisabledではなくdisabled、colorSchemeではなくcolorPalette、spacingではなくgap、isOpenではなくopen)
  • コンパウンドコンポーネントは正しく使用されていますか?(Field.Root/Field.Label、Dialog.Root/Dialog.Contentなど)
  • Next.js App Routerで"use client"が正しく配置されていますか?
  • v2のパターンがまだ残っていませんか?(extendTheme、ColorModeScript、useColorModeValue、sxプロップ)

トークンとスタイルの使用法

  • セマンティックトークンを使用すべき箇所にハードコードされた色が使われていませんか?(bg="#f9fafb" → bg="bg.subtle")
  • セマンティックトークンではなく、生の16進数やパレット値が使用されていませんか?これらはダークモードを尊重しません。
  • Chakraのスタイルプロップにすべきインラインstyle={{}}プロップがありませんか?

コンポーネント構造

  • 不必要なネストがありますか?(1つで十分なのにBox > Box > Box)
  • Stack gap={4}の方がすっきりする場所で、すべての子要素に手動でスペーシング(mt={4})を使用していませんか?
  • 適切なレイアウトプリミティブが使用されていますか?(Flex vs Stack vs Grid vs SimpleGrid)

保守性

  • 同じビジュアルパターンが3回以上繰り返されていますか?(コンポーネントやレシピの候補)
  • レシピやスロットレシピを示唆する、一回限りのスタイルオーバーライドがありますか?
  • プロップタイプ/TypeScriptタイプが存在し、正確ですか?

ステップ3a — レビュー出力

ユーザーが書き換えではなく批評を求めている場合に使用します。

影響度ごとに指摘事項を分類します。

重大 — 動作を壊したり、ユーザーを排除するバグやアクセシビリティの欠陥

  • アイコンのみのボタンにaria-labelがない
  • ラベルが関連付けられていないフォームフィールド
  • onClickがあるがキーボードアクセスがないインタラクティブなBox
  • 何もせずに黙って失敗する間違ったv3プロップ名(v3ではisDisabledは無効にならない)
  • App Routerでフックを使用するコンポーネントに"use client"がない

改善点 — 緊急ではないが、正確性や品質に関する問題

  • ダークモードを壊すハードコードされた色
  • レスポンシブブレークポイントの欠落
  • 不必要なネストや間違ったレイアウトプリミティブ
  • まだ機能するが更新すべきv2パターン

オプションの提案 — ブロッキングではないアイデア

  • 繰り返されるパターンをコンポーネントに抽出する
  • 一回限りのスタイルをレシピバリアントに置き換える
  • 不足しているTypeScriptタイプを追加する

各重大な問題と重要な改善点には、最小限の修正を示します。

**閉じるボタンにaria-labelがない** (重大)
ダイアログを閉じるためのIconButtonにアクセス可能なラベルがありません。

// Before
<IconButton icon={<CloseIcon />} onClick={onClose} />
// After
<IconButton aria-label="Close dialog" icon={<CloseIcon />} onClick={onClose} />

報告するものがないセクションはスキップします。コードの長さに合わせて調整します。20行のコンポーネントには、網羅的ではなく簡潔なレビューが必要です。


ステップ3b — リファクタリング / 変換出力

ユーザーが書き換えたコードを求めている場合に使用します。

ソース別変換戦略

プレーンHTML / CSSからの変換

HTMLChakra相当品
<div> レイアウトラッパーBox、Flex、Stack、Grid
<section>、<article>Box as="section"、Box as="article"
<nav>Box as="nav"
<ul> / <li>Box as="ul" / Box as="li"、またはStack
<button>Button または IconButton
<a>Link
<img>Image(altを保持)
<input>、<select>Input、NativeSelect(Field.Root内)
CSSChakraスタイルプロップ
display: flexFlex または display="flex"
flex-direction: columnStack または flexDir="column"
gap: 16pxgap={4}(1単位 = 4px)
padding: 16px 24pxpy={4} px={6}
border-radius: 8pxrounded="md"
color: #6b7280color="fg.muted"
background: #f9fafbbg="bg.subtle"

Tailwind CSSからの変換

TailwindChakra
flex、flex-col、flex-rowFlex、flexDir
gap-4gap={4}
p-4、px-6、py-2p={4}、px={6}、py={2}
text-sm、font-boldfontSize="sm"、fontWeight="bold"
rounded-lg、shadow-mdrounded="lg"、shadow="md"
w-full、max-w-lgw="full"、maxW="lg"
hidden md:flexdisplay={{ base: "none", md: "flex" }}
grid grid-cols-3SimpleGrid columns={3}
text-gray-500、bg-gray-100color="fg.muted"、bg="bg.subtle"
hover:bg-gray-100_hover={{ bg: "bg.subtle" }}

Tailwindのレスポンシブプレフィックスは、Chakraのブレークポイントオブジェクト構文に置き換えます。

// Tailwind: text-sm md:base lg:text-lg
<Text fontSize={{ base: "sm", md: "md", lg: "lg" }} />

CSS Modulesからの変換 — Chakraプロップに変換できるものは変換します。プロップとして表現できないスタイル(アニメーション、複雑なセレクタなど)にはclassNameを残します。

// Before
<div className={styles.card}>...</div>
// After — プロップに変換。変換できないスタイルのみclassNameとして保持
<Box p={4} rounded="lg" shadow="sm" className={styles.fadeIn}>...</Box>

すべてのクラス名が排除されたら、インポートを完全に削除します。

styled-components / @emotion/styledからの変換 — 同等のスタイルプロップを持つBoxにマッピングし、インポートを削除し、他で使用されていない場合はアンインストールします。

// Before
const Card = styled.div`padding: 1rem; &:hover { background: #f3f4f6; }`
// After
<Box p={4} _hover={{ bg: "bg.muted" }} />

既存のChakra UIからの変換(クリーンアップ)

  • Box > Box > Boxのネストを平坦化。すべての子要素のmt/mbをStack gap={N}に置き換え
  • sxをcssに置き換え(v3での名称変更)。内部の&:hoverセレクタを更新
  • bg="gray.50" → bg="bg.subtle" および他のセマンティックトークン相当品に置き換え
  • v2プロップ名を更新: isDisabled→disabled、colorScheme→colorPalette、spacing→gap
  • コンパウンドコンポーネントを更新: FormControl→Field.Root、Modal→Dialog、Select→NativeSelect

動作を保持 — 交渉不可

  • すべてのイベントハンドラ、ステート変数、条件付きレンダリングはそのまま保持
  • aria-*属性を保持。明らかに必要な場合は不足しているものを追加
  • セマンティックHTMLの意図を保持(<nav> → Box as="nav"、単なるBoxではない)
  • "use client"が存在する場合は保持。コンポーネントが本当に必要とする場合のみ追加
  • Chakra UIを使用しているという理由だけで"use client"を追加しない
  • 部分的に変換されたコンポーネントでも動作する方が、完全に変換されたが動作しないものより優れている

asChild for Next.js Link and Image

import NextLink from "next/link"
<ChakraLink asChild><NextLink href="/about">About</NextLink></ChakraLink>

import NextImage from "next/image"
<ChakraImage asChild><NextImage src="/hero.png" alt="Hero" width={800} height={400} /></ChakraImage>

リファクタリング出力形式

1. リファクタリングされたコード — 完全で、実行可能で、正しいインポートを含む

2. 変更点 — 明白でない決定に焦点を当てた簡潔なリスト:

- <div className="flex gap-4"> を <Flex gap={4}> に置き換え
- bg="#f9fafb" を bg="bg.subtle" に置き換え(ダークモード互換性のため)
- フォーム送信ハンドラとバリデーションロジックは変更せず保持
- 閉じるアイコンボタンに aria-label を追加(不足していたため)

3. 提案(オプション) — このリファクタリングを超えた意味のある改善: 再利用可能なコンポーネントの抽出、レシピの採用、v2パターンの移行。


いつ質問し、いつ進めるか

コードと意図が明確であれば進めます。以下の場合は質問します:

  • コードがまだ共有されていない
  • コンポーネントが非常に大きく、範囲が不明確
  • レビューを変える可能性のある、見えないコンテキストや状態がある
  • 複数の方法で解釈される可能性のあるあいまいな動作がある

質問せずに進める場合は、レスポンスの先頭で前提を明記します。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

0xAlchemist-cs/personal-ui-system

Use when the user's task involves Ant Design (antd) — writing antd components, debugging antd issues, querying antd APIs/props/tokens/demos, migrating between antd versions, or analyzing antd usage in a project. Triggers on antd-related code, imports from 'antd', or explicit antd questions.

0xAlchemist-cs/personal-ui-system

Build responsive, accessible UI components and layouts using Chakra UI v3, install or configure Chakra UI in new and existing projects, and design scalable themes using tokens, semantic tokens, recipes, and slot recipes. Use this skill whenever a user asks to build, create, or generate any UI component, page, form, dashboard, navbar, card, landing section, pricing table, or layout using Chakra UI; wants to add Chakra UI to a project, set up ChakraProvider, run CLI snippets, configure color mode, or fix provider wrapping; or asks about theming — defining brand colors, design tokens, semantic tokens, dark mode values, component recipes, slot recipes, typegen, or ejecting the default theme. Trigger on any Chakra UI building, setup, or theming or charts request, however casually phrased — "add my brand colors", "make a reusable card style", "build a bar chart", "show me a line chart", "make me a login form", "build a sidebar", "add Chakra to my app".

0xAlchemist-cs/personal-ui-system

Migrate Chakra UI projects from v2 to v3, covering package changes, codemods, provider setup, color mode, prop renaming, compound components, theming, recipes, and Next.js updates. Use this skill whenever a user is upgrading Chakra UI versions, encountering breaking changes after an upgrade, converting old v2 patterns (ColorModeScript, useColorModeValue, styleConfig, extendTheme, isDisabled, colorScheme, @chakra-ui/icons, framer-motion dependency), fixing compound component patterns, or asking about differences between Chakra UI v2 and v3 — even if they don't say "migrate" or "upgrade" explicitly.

0xAlchemist-cs/personal-ui-system

Integrates Material UI with Next.js App and Pages routers using @mui/material-nextjs, Emotion cache providers, next/font, CSS layers with Tailwind/CSS Modules, Link component prop patterns, CSS theme variables SSR notes, and App Router useSearchParams + Suspense. Use when setting up or debugging MUI in a Next.js app.

関連スキル