Agent Skills › langwatch/langwatch › chakra-ui-refactor

chakra-ui-refactor

GitHub

针对 packages/design-system 内的 Chakra UI v3 代码进行审查或重构。检查无障碍、响应式及 API 规范性,提供批判性反馈或重写代码。

.claude/skills/chakra-ui-refactor/SKILL.md langwatch/langwatch

Trigger Scenarios

审查 Chakra UI 组件代码 将其他样式转换为 Chakra UI v3 优化设计系统内部 UI 实现

Install

npx skills add langwatch/langwatch --skill chakra-ui-refactor -g -y
More Options

Non-standard path

npx skills add https://github.com/langwatch/langwatch/tree/main/.claude/skills/chakra-ui-refactor -g -y

Use without installing

npx skills use langwatch/langwatch@chakra-ui-refactor

指定 Agent (Claude Code)

npx skills add langwatch/langwatch --skill chakra-ui-refactor -a claude-code -g -y

安装 repo 全部 skill

npx skills add langwatch/langwatch --all -g -y

预览 repo 内 skill

npx skills add langwatch/langwatch --list

SKILL.md

Frontmatter
{
    "name": "chakra-ui-refactor",
    "description": "Review or refactor Chakra UI v3 code INSIDE packages\/design-system only. Use only when editing files under packages\/design-system. Feature code in modules\/*\/browser or apps\/ui never imports Chakra: use the design-system skill instead."
}

Chakra UI Refactor & Review

Scope: files inside packages/design-system only. In this repository the product is a Vite SPA (not Next.js) and the public Drawer, Dialog and Card are callable prop-driven shapes with closed props (packages/design-system/adrs/002-overlay-and-card-shapes.md; the design-system skill's references/component-apis.md). A review here checks that the public component is the shape, not raw Dialog.Root/Drawer.Root/Card.Root composition at a consumer, and does not wait for a third copy before extracting across modules. Raw parts are legitimate only inside an implementation. Navigation goes through @langwatch/browser-host/link or an onNavigate prop. Next.js notes below are upstream generic advice, not this repository's procedure.

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 — Vite SPA here; the Next.js lines in this file are upstream notes
  • 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 inside the design system.").

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-label on icon buttons, htmlFor/id on label+input pairs, alt on images)
  • Is keyboard navigation possible? (focus rings not suppressed, interactive elements are actually focusable)
  • Does the heading hierarchy make sense? (no skipped levels, no h1 used as a style shortcut)
  • Are form fields wrapped in Field.Root with Field.Label and Field.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: hidden on small viewports)

Chakra API correctness

  • Are v3 prop names used? (disabled not isDisabled, colorPalette not colorScheme, gap not spacing, open not isOpen)
  • Are compound components used correctly? (Field.Root/Field.Label and so on.) Overlays and cards are the exception: a consumer uses the callable shape, not the parts.
  • Are there v2 patterns still present? (extendTheme, ColorModeScript, sx prop.) useColorModeValue is Chakra v2, but the design system exports its own (@langwatch/design-system/color-mode): check the import source, and prefer a semantic token where it removes the conditional colour logic.

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 > Box when one would do)
  • Is manual spacing (mt={4} on every child) used where Stack gap={4} would be cleaner?
  • Are the right layout primitives used? (Flex vs Stack vs Grid vs SimpleGrid)

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-label on an icon-only button
  • Form field with no label association
  • Interactive Box with onClick but no keyboard access
  • Wrong v3 prop name that silently does nothing (isDisabled doesn't disable in v3)

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 onClick={onClose}><CloseIcon /></IconButton>
// After (v3 has no `icon` prop: the icon is the child)
<IconButton aria-label="Close dialog" onClick={onClose}><CloseIcon /></IconButton>

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 the matching radius token in the active system (md is 0.375rem), not a guess
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 > Box nesting; replace mt/mb on every child with Stack gap={N}
  • Replace sx with css (v3 rename); update nested &:hover selectors 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 just Box)
  • A partially-converted component that works is better than a fully-converted one that doesn't

asChild for Next.js Link and Image (upstream note, not used in this repository)

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.

Version History

  • c0c14dc Current 2026-10-19 19:32

Same Skill Collection

.claude/skills/analyticssim/SKILL.md
.claude/skills/browser-pair/SKILL.md
.claude/skills/browser-test/SKILL.md
.claude/skills/chakra-ui-builder/SKILL.md
.claude/skills/code-review/SKILL.md
.claude/skills/code-search/SKILL.md
.claude/skills/feature-map/SKILL.md
.claude/skills/githubsim/SKILL.md
.claude/skills/haven-auth/SKILL.md
.claude/skills/haven-db/SKILL.md
.claude/skills/haven-orb/SKILL.md
.claude/skills/haven-play/SKILL.md
.claude/skills/haven-seed/SKILL.md
.claude/skills/haven-setup/SKILL.md
.claude/skills/idpsim/SKILL.md
.claude/skills/lambdasim/SKILL.md
.claude/skills/langwatch-kanban/SKILL.md
.claude/skills/llmsim/SKILL.md
.claude/skills/mailsim/SKILL.md
.claude/skills/module/SKILL.md
.claude/skills/outboundsim/SKILL.md
.claude/skills/ownership/SKILL.md
.claude/skills/repo-tree/SKILL.md
.claude/skills/storagesim/SKILL.md
.claude/skills/voicesim/SKILL.md
plugins/langwatch/skills/langwatch/SKILL.md
services/langy-agent/skills/github/SKILL.md
skills/_compiled/native/agent-best-practices/SKILL.md
skills/_compiled/native/agent-performance/SKILL.md
skills/_compiled/native/automations/SKILL.md
skills/_compiled/native/code-changes/SKILL.md
skills/_compiled/native/context-sweet-spot/SKILL.md
skills/_compiled/native/daily-insights/SKILL.md
skills/_compiled/native/dashboard-widgets/SKILL.md
skills/_compiled/native/datasets/SKILL.md
skills/_compiled/native/debug-instrumentation/SKILL.md
skills/_compiled/native/debug-with-langwatch/SKILL.md
skills/_compiled/native/drive-the-ui/SKILL.md
skills/_compiled/native/eval-triage/SKILL.md
skills/_compiled/native/evaluate-multimodal/SKILL.md
skills/_compiled/native/evaluations/SKILL.md
skills/_compiled/native/experiments/SKILL.md
skills/_compiled/native/find-traces/SKILL.md
skills/_compiled/native/generate-rag-dataset/SKILL.md
skills/_compiled/native/github/SKILL.md
skills/_compiled/native/guided-onboarding/SKILL.md
skills/_compiled/native/level-up/SKILL.md
skills/_compiled/native/lwql-charts/SKILL.md
skills/_compiled/native/online-evaluations/SKILL.md

Metadata

Files
0
Version
c0c14dc
Hash
2d57536d
Indexed
2026-10-19 19:32

Home - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-10-19 23:15
浙ICP备14020137号-1