
Chakra UI Refactor
FreeEnhance and convert your Chakra UI code effortlessly.
Free · Opens the source repo
What Chakra UI Refactor does
Chakra UI Refactor is a specialized skill designed for developers working with Chakra UI v3. This skill assists in reviewing, converting, and improving UI code, making it ideal for those who want to ensure their Chakra components are optimized for accessibility, responsiveness, and maintainability. When a user submits Chakra UI code for review or requests a conversion from other frameworks like Tailwind or styled-components, this skill provides structured critiques or rewritten code based on the user's needs.
The skill operates through a systematic approach, beginning with an assessment of the Chakra UI version and the framework in use. It identifies the type of source code provided, whether it's existing Chakra code, plain HTML/CSS, or another format. Depending on the user's request—be it a simple review, a full refactor, or both—the skill delivers tailored feedback. It evaluates code across critical dimensions such as accessibility, responsiveness, and adherence to Chakra's API standards, ensuring that the output is both functional and compliant with best practices.
By focusing on key aspects like proper token usage, component structure, and maintainability, Chakra UI Refactor helps developers clean up messy code and adopt best practices. The skill also identifies potential issues, categorizing them by impact to guide users on what needs immediate attention versus what can be improved over time. This makes it a valuable tool for both novice and experienced developers looking to enhance their Chakra UI applications.
In summary, Chakra UI Refactor streamlines the process of refining UI code, making it an essential skill for anyone working with Chakra UI who seeks to improve their code quality and user experience.
When to use it
Use this skill when you need to review, convert, or improve Chakra UI code, especially when transitioning from other frameworks.
When not to use it
This skill may not be suitable for non-Chakra UI projects or when you require features beyond code review and refactoring.
What you can build with it
Reviewing a Chakra UI Component
You have a Chakra UI component and want to ensure it follows best practices for accessibility and responsiveness.
Converting from Tailwind to Chakra UI
You have a set of Tailwind components that you want to convert to Chakra UI for consistency in your project.
Cleaning Up Messy Chakra Code
You have a complex Chakra UI component that has become difficult to maintain and need help simplifying it.
How to install Chakra UI Refactor
View source1. Install with the skills CLI
npx skills add chakra-ui/chakra-ui/chakra-ui-refactor --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by chakra-uiChakra UI Refactor & Review
You are reviewing and improving UI code using Chakra UI v3. Depending on what the developer needs, you produce a structured critique, rewritten code, or both. Read the code and project context fully before producing any output.
Step 1 — Orient and determine intent
Before any output, establish:
- Chakra UI version — check
package.json; use v3 by default - Framework — Next.js App Router, Pages Router, Vite, plain React
- Source type — existing Chakra, plain HTML/CSS, Tailwind, CSS Modules, styled-components
- What the user is asking:
- Review only — "check this", "is this correct/idiomatic", "what's wrong", "review my code" → produce a critique with targeted fixes, no full rewrite
- Refactor / convert — "refactor this", "convert from Tailwind", "clean this up" → produce rewritten code
- Both — "review and fix" → critique first, then the rewritten code
State your reading at the top of the response (e.g. "Reviewing as existing Chakra v3 code. Assuming Next.js App Router.").
If code isn't shared yet, ask for it. Don't review a description of code.
Step 2 — Analyze the code
Work through the code across these dimensions regardless of output mode. For review, they become findings. For refactor, they become the checklist of what to fix.
Accessibility
- Do all interactive elements have accessible labels? (
aria-labelon icon buttons,htmlFor/idon label+input pairs,alton images) - Is keyboard navigation possible? (focus rings not suppressed, interactive elements are actually focusable)
- Does the heading hierarchy make sense? (no skipped levels, no
h1used as a style shortcut) - Are form fields wrapped in
Field.RootwithField.LabelandField.ErrorText? - Does the component work without color as the only signal?
Responsiveness
- Do layout components specify behavior at multiple breakpoints?
- Are there hardcoded pixel values where responsive tokens would work better?
- Would this break on mobile? (fixed widths,
overflow: hiddenon small viewports)
Chakra API correctness
- Are v3 prop names used? (
disablednotisDisabled,colorPalettenotcolorScheme,gapnotspacing,opennotisOpen) - Are compound components used correctly? (
Field.Root/Field.Label,Dialog.Root/Dialog.Content, etc.) - Is
"use client"placed correctly in Next.js App Router? - Are there v2 patterns still present? (
extendTheme,ColorModeScript,useColorModeValue,sxprop)
Token and style usage
- Are hardcoded colors used where semantic tokens would work? (
bg="#f9fafb"→bg="bg.subtle") - Are raw hex or palette values used instead of semantic tokens? These won't respect dark mode.
- Are there inline
style={{}}props that should be Chakra style props?
Component structure
- Is there unnecessary nesting? (
Box > Box > Boxwhen one would do) - Is manual spacing (
mt={4}on every child) used whereStack gap={4}would be cleaner? - Are the right layout primitives used? (
FlexvsStackvsGridvsSimpleGrid)
Maintainability
- Does the same visual pattern repeat 3+ times? (candidate for a component or recipe)
- Are there one-off style overrides that suggest a recipe or slot recipe?
- Are prop types / TypeScript types present and accurate?
Step 3a — Review output
Use this when the user wants a critique, not a rewrite.
Categorize findings by impact:
Critical — bugs and accessibility failures that break behavior or exclude users
- Missing
aria-labelon an icon-only button - Form field with no label association
- Interactive
BoxwithonClickbut no keyboard access - Wrong v3 prop name that silently does nothing (
isDisableddoesn't disable in v3) "use client"missing on a component that uses hooks in App Router
Improvements — correctness and quality issues that aren't urgent
- Hardcoded colors that break dark mode
- Missing responsive breakpoints
- Unnecessary nesting or wrong layout primitive
- v2 patterns that still work but should be updated
Optional suggestions — non-blocking ideas
- Extract a repeated pattern into a component
- Replace a one-off style with a recipe variant
- Add a missing TypeScript type
For each critical issue and significant improvement, show a minimal fix:
**Missing aria-label on close button** (Critical)
The IconButton for closing the dialog has no accessible label.
// Before
<IconButton icon={<CloseIcon />} onClick={onClose} />
// After
<IconButton aria-label="Close dialog" icon={<CloseIcon />} onClick={onClose} />
Skip sections with nothing to report. Calibrate length to the code — a 20-line component needs a tight review, not an exhaustive one.
Step 3b — Refactor / convert output
Use this when the user wants rewritten code.
Conversion strategy by source
From plain HTML / CSS
| HTML | Chakra equivalent |
|---|---|
<div> layout wrapper | Box, Flex, Stack, Grid |
<section>, <article> | Box as="section", Box as="article" |
<nav> | Box as="nav" |
<ul> / <li> | Box as="ul" / Box as="li", or Stack |
<button> | Button or IconButton |
<a> | Link |
<img> | Image (preserve alt) |
<input>, <select> | Input, NativeSelect inside Field.Root |
| CSS | Chakra style prop |
|---|---|
display: flex | Flex or display="flex" |
flex-direction: column | Stack or flexDir="column" |
gap: 16px | gap={4} (1 unit = 4px) |
padding: 16px 24px | py={4} px={6} |
border-radius: 8px | rounded="md" |
color: #6b7280 | color="fg.muted" |
background: #f9fafb | bg="bg.subtle" |
From Tailwind CSS
| Tailwind | Chakra |
|---|---|
flex, flex-col, flex-row | Flex, flexDir |
gap-4 | gap={4} |
p-4, px-6, py-2 | p={4}, px={6}, py={2} |
text-sm, font-bold | fontSize="sm", fontWeight="bold" |
rounded-lg, shadow-md | rounded="lg", shadow="md" |
w-full, max-w-lg | w="full", maxW="lg" |
hidden md:flex | display={{ base: "none", md: "flex" }} |
grid grid-cols-3 | SimpleGrid columns={3} |
text-gray-500, bg-gray-100 | color="fg.muted", bg="bg.subtle" |
hover:bg-gray-100 | _hover={{ bg: "bg.subtle" }} |
Replace Tailwind responsive prefixes with Chakra's breakpoint object syntax:
// Tailwind: text-sm md:base lg:text-lg
<Text fontSize={{ base: "sm", md: "md", lg: "lg" }} />
From CSS Modules — convert what you can to Chakra props; keep className
for styles that can't be expressed as props (animations, complex selectors):
// Before
<div className={styles.card}>...</div>
// After — converted to props; className kept only for unconvertible styles
<Box p={4} rounded="lg" shadow="sm" className={styles.fadeIn}>...</Box>
Once all class names are eliminated, remove the import entirely.
From styled-components / @emotion/styled — map to Box with equivalent
style props, then remove the import and uninstall if no longer used elsewhere:
// Before
const Card = styled.div`padding: 1rem; &:hover { background: #f3f4f6; }`
// After
<Box p={4} _hover={{ bg: "bg.muted" }} />
From existing Chakra UI (cleanup)
- Flatten
Box > Box > Boxnesting; replacemt/mbon every child withStack gap={N} - Replace
sxwithcss(v3 rename); update nested&:hoverselectors inside it - Replace
bg="gray.50"→bg="bg.subtle"and other semantic token equivalents - Update v2 prop names:
isDisabled→disabled,colorScheme→colorPalette,spacing→gap - Update compound components:
FormControl→Field.Root,Modal→Dialog,Select→NativeSelect
Preserve behavior — non-negotiable
- Keep all event handlers, state variables, and conditional rendering exactly as-is
- Keep
aria-*attributes; add missing ones where clearly needed - Keep semantic HTML intent (
<nav>→Box as="nav", not justBox) - Keep
"use client"where it exists; add it only when the component genuinely needs it - Don't add
"use client"just because a component uses Chakra UI - A partially-converted component that works is better than a fully-converted one that doesn't
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>
Refactor output format
1. Refactored code — complete, runnable, with correct imports
2. What changed — concise list focused on non-obvious decisions:
- Replaced <div className="flex gap-4"> with <Flex gap={4}>
- Replaced bg="#f9fafb" with bg="bg.subtle" for dark mode compatibility
- Kept form submit handler and validation logic unchanged
- Added aria-label to close icon button (was missing)
3. Suggestions (optional) — meaningful improvements beyond this refactor: extracting a reusable component, adopting a recipe, migrating a v2 pattern.
When to ask vs proceed
Proceed if the code and intent are clear. Ask when:
- The code isn't shared yet
- The component is very large and scope is unclear
- There's context or state you can't see that would change the review
- There's ambiguous behavior that could be interpreted multiple ways
State assumptions at the top of the response when you proceed without asking.
Frequently asked questions about Chakra UI Refactor
Similar skills
React Composition Patterns
Streamline your React component architecture with proven patterns.
Pester Should Migration
Easily convert Pester v5 assertions to v6 syntax.
Radix to Base UI Migration
Seamlessly migrate React components from Radix UI to Base UI.
Migrate Next.js to Vinext
Seamlessly transition your Next.js projects to Vinext.
WinUI 3 Migration Guide
Streamline your UWP to WinUI 3 migration process.
Refactor
Enhance code maintainability without altering behavior.
