Communitygithub.com

Chakra UI 리팩터 및 검토

Chakra UI v3를 사용하여 UI 코드를 검토, 변환 및 개선합니다. 사용자가 Chakra UI 코드 검토, 일반 HTML/CSS/테일윈드/CSS Modules/styled-components를 Chakra UI로 변환, 지저분한 Chakra 컴포넌트 정리, 레이아웃 구조나 토큰 사용 수정 등을 요청할 때 이 스킬을 사용하세요.

Chakra UI 리팩터 및 검토란 무엇인가요?

이 스킬은 Chakra UI v3 기반 UI 코드를 체계적으로 검토하고 리팩터링하는 AI 어시스턴트입니다. 개발자가 코드 리뷰, 변환, 정리, 또는 '이게 맞나요?', '리팩토링 해주세요'와 같은 자연어 요청을 하면 자동으로 트리거됩니다. Next.js, Vite, 일반 React 등 다양한 프레임워크를 지원하며, HTML/CSS, Tailwind CSS, CSS Modules, styled-components에서 Chakra UI로의 변환 전략을 상세히 제공합니다. 접근성, 반응형, Chakra API 정확성, 토큰 사용, 컴포넌트 구조, 유지보수성 등 6가지 차원으로 코드를 분석하고, 심각도별로 분류된 검토 결과와 함께 최소한의 수정 예시를 제시합니다. 리팩터 모드에서는 변환 매핑 테이블과 함께 완전히 실행 가능한 코드를 제공하며, `asChild` 패턴을 통한 Next.js Link/Image와의 호환성도 보장합니다.

지원 대상~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, label+input 쌍의 htmlFor/id, 이미지의 alt)
  • 키보드 탐색이 가능한가요? (포커스 링이 비활성화되지 않음, 대화형 요소가 실제로 포커스 가능)
  • 제목 계층이 적절한가요? (단계를 건너뛰지 않음, h1을 스타일 단축키로 사용하지 않음)
  • 폼 필드가 Field.Root에 Field.Label 및 Field.ErrorText와 함께 래핑되어 있나요?
  • 컴포넌트가 색상만으로 정보를 전달하지 않나요?

반응형

  • 레이아웃 컴포넌트가 여러 중단점에서 동작을 지정하나요?
  • 반응형 토큰이 더 적합한 곳에 하드코딩된 픽셀 값이 있나요?
  • 모바일에서 깨지나요? (고정 너비, 작은 뷰포트에서 overflow: hidden)

Chakra API 정확성

  • v3 prop 이름이 사용되었나요? (disabled (not isDisabled), colorPalette (not colorScheme), gap (not spacing), open (not isOpen))
  • 복합 컴포넌트가 올바르게 사용되었나요? (Field.Root/Field.Label, Dialog.Root/Dialog.Content 등)
  • Next.js App Router에서 "use client"가 올바르게 배치되었나요?
  • v2 패턴이 아직 남아 있나요? (extendTheme, ColorModeScript, useColorModeValue, sx prop)

토큰 및 스타일 사용

  • 시맨틱 토큰이 더 적합한 곳에 하드코딩된 색상이 사용되었나요? (bg="#f9fafb" → bg="bg.subtle")
  • 시맨틱 토큰 대신 원시 헥스 또는 팔레트 값이 사용되었나요? 이들은 다크 모드를 존중하지 않습니다.
  • Chakra 스타일 prop이어야 할 인라인 style={{}} prop이 있나요?

컴포넌트 구조

  • 불필요한 중첩이 있나요? (하나로 충분할 Box > Box > Box)
  • 모든 자식에 수동 간격(mt={4})이 사용되고 Stack gap={4}가 더 깔끔한 경우가 있나요?
  • 올바른 레이아웃 프리미티브가 사용되었나요? (Flex vs Stack vs Grid vs SimpleGrid)

유지보수성

  • 동일한 시각적 패턴이 3회 이상 반복되나요? (컴포넌트 또는 레시피 후보)
  • 레시피 또는 슬롯 레시피를 제안하는 일회성 스타일 재정의가 있나요?
  • prop 타입 / TypeScript 타입이 존재하고 정확한가요?

3a단계 — 검토 출력

사용자가 재작성이 아닌 비평을 원할 때 사용하세요.

발견 사항을 영향도별로 분류하세요:

심각 — 동작을 망가뜨리거나 사용자를 배제하는 버그 및 접근성 실패

  • 아이콘 전용 버튼에 aria-label 누락
  • 레이블 연결이 없는 폼 필드
  • onClick이 있지만 키보드 접근이 불가능한 대화형 Box
  • 조용히 아무 효과도 없는 잘못된 v3 prop 이름 (v3에서 isDisabled는 비활성화하지 않음)
  • App Router에서 훅을 사용하는 컴포넌트에 "use client" 누락

개선 사항 — 긴급하지 않은 정확성 및 품질 문제

  • 다크 모드를 깨는 하드코딩된 색상
  • 반응형 중단점 누락
  • 불필요한 중첩 또는 잘못된 레이아웃 프리미티브
  • 여전히 작동하지만 업데이트해야 하는 v2 패턴

선택적 제안 — 차단하지 않는 아이디어

  • 반복되는 패턴을 컴포넌트로 추출
  • 일회성 스타일을 레시피 변형으로 대체
  • 누락된 TypeScript 타입 추가

각 심각한 문제 및 중요한 개선 사항에 대해 최소한의 수정 예시를 보여주세요:

**닫기 버튼에 aria-label 누락** (심각)
다이얼로그를 닫는 IconButton에 접근 가능한 레이블이 없습니다.

// 이전
<IconButton icon={<CloseIcon />} onClick={onClose} />
// 이후
<IconButton aria-label="다이얼로그 닫기" 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>Field.Root 내부의 Input, NativeSelect
CSSChakra 스타일 prop
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 prop으로 변환할 수 있는 것은 변환하고, prop으로 표현할 수 없는 스타일(애니메이션, 복잡한 선택자)은 className을 유지하세요:

// 이전
<div className={styles.card}>...</div>
// 이후 — prop으로 변환; className은 변환 불가능한 스타일만 유지
<Box p={4} rounded="lg" shadow="sm" className={styles.fadeIn}>...</Box>

모든 클래스 이름이 제거되면 import를 완전히 삭제하세요.

styled-components / @emotion/styled에서 — 동등한 스타일 prop을 가진 Box로 매핑한 후, 다른 곳에서 사용되지 않으면 import를 제거하고 패키지를 제거하세요:

// 이전
const Card = styled.div`padding: 1rem; &:hover { background: #f3f4f6; }`
// 이후
<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 prop 이름 업데이트: 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"를 추가하지 마세요
  • 부분적으로 변환되어도 작동하는 컴포넌트가 완전히 변환되었지만 작동하지 않는 것보다 낫습니다

Next.js Link 및 Image를 위한 asChild

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

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

리팩터 출력 형식

1. 리팩터된 코드 — 완전하고, 실행 가능하며, 올바른 import 포함

2. 변경 사항 — 명확하지 않은 결정에 초점을 맞춘 간결한 목록:

- <div className="flex gap-4">를 <Flex gap={4}>로 대체
- bg="#f9fafb"를 다크 모드 호환성을 위해 bg="bg.subtle"로 대체
- 폼 제출 핸들러 및 유효성 검사 로직은 변경하지 않음
- 닫기 아이콘 버튼에 aria-label 추가 (누락되었음)

3. 제안 사항 (선택 사항) — 이 리팩터 이후의 의미 있는 개선 사항: 재사용 가능한 컴포넌트 추출, 레시피 채택, v2 패턴 마이그레이션


질문할 때 vs 진행할 때

코드와 의도가 명확하면 진행하세요. 다음 경우에 질문하세요:

  • 코드가 아직 공유되지 않은 경우
  • 컴포넌트가 매우 크고 범위가 명확하지 않은 경우
  • 리뷰를 변경할 수 있는 컨텍스트나 상태가 보이지 않는 경우
  • 여러 방식으로 해석될 수 있는 모호한 동작이 있는 경우

질문 없이 진행할 때는 응답 상단에 가정 사항을 명시하세요.

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.

관련 스킬