Was macht Chakra UI Refactoring & Review?
Sie überprüfen und verbessern UI-Code mit Chakra UI v3. Abhängig davon, was der Entwickler benötigt, erstellen Sie eine strukturierte Kritik, umgeschriebenen Code oder beides. Lesen Sie den Code und den Projektkontext vollständig, bevor Sie eine Ausgabe produzieren.
Schritt 1 — Orientieren und Absicht ermitteln
Vor jeder Ausgabe stellen Sie fest:
- Chakra UI Version — Überprüfen Sie
package.json; standardmäßig v3 verwenden - Framework — Next.js App Router, Pages Router, Vite, einfaches React
- Quelltyp — vorhandenes Chakra, einfaches HTML/CSS, Tailwind, CSS Modules, styled-components
- Was der Benutzer verlangt:
- Nur Überprüfung — „Überprüfe dies“, „ist das korrekt/idiomatisch“, „was ist falsch?“, „Review meines Codes“ → erstellen Sie eine Kritik mit gezielten Korrekturen, keine vollständige Neuschreibung
- Refaktorisieren / Konvertieren — „Refaktoriere dies“, „konvertiere von Tailwind“, „räume das auf“ → erstellen Sie umgeschriebenen Code
- Beides — „Überprüfe und korrigiere“ → zuerst Kritik, dann den umgeschriebenen Code
Geben Sie Ihre Lesart am Anfang der Antwort an (z.B. „Überprüfung als vorhandener Chakra v3 Code. Nehmen Sie Next.js App Router an.“).
Wenn Code noch nicht geteilt wurde, fragen Sie danach. Überprüfen Sie keine Beschreibung von Code.
Schritt 2 — Analysieren des Codes
Arbeiten Sie den Code unabhängig vom Ausgabemodus in diesen Dimensionen durch. Bei einer Überprüfung werden daraus Erkenntnisse. Bei einer Refaktorisierung werden sie zur Checkliste, was zu korrigieren ist.
Barrierefreiheit
- Haben alle interaktiven Elemente zugängliche Labels? (
aria-labelbei IconButtons,htmlFor/idbei Label+Input-Paaren,altbei Bildern) - Ist die Tastaturnavigation möglich? (Fokusringe nicht unterdrückt, interaktive Elemente sind tatsächlich fokussierbar)
- Ist die Überschriftenhierarchie sinnvoll? (keine übersprungenen Ebenen, kein
h1als Stilabkürzung) - Sind Formularfelder in
Field.RootmitField.LabelundField.ErrorTexteingebettet? - Funktioniert die Komponente ohne Farbe als einziges Signal?
Responsivität
- Geben Layoutkomponenten das Verhalten bei mehreren Breakpoints an?
- Gibt es fest codierte Pixelwerte, wo responsive Tokens besser funktionieren würden?
- Würde dies auf Mobilgeräten brechen? (feste Breiten,
overflow: hiddenauf kleinen Viewports)
Korrektheit der Chakra API
- Werden v3-Prop-Namen verwendet? (
disablednichtisDisabled,colorPalettenichtcolorScheme,gapnichtspacing,opennichtisOpen) - Werden zusammengesetzte Komponenten korrekt verwendet? (
Field.Root/Field.Label,Dialog.Root/Dialog.Content, usw.) - Ist
"use client"im Next.js App Router korrekt platziert? - Sind noch v2-Muster vorhanden? (
extendTheme,ColorModeScript,useColorModeValue,sx-Prop)
Token- und Stilverwendung
- Werden fest codierte Farben verwendet, wo semantische Tokens besser wären? (
bg="#f9fafb"→bg="bg.subtle") - Werden rohe Hex- oder Palettenwerte anstelle von semantischen Tokens verwendet? Diese respektieren den Dark Mode nicht.
- Gibt es Inline-
style={{}}-Props, die Chakra-Style-Props sein sollten?
Komponentenstruktur
- Gibt es unnötige Verschachtelungen? (
Box > Box > Boxwenn eine ausreicht) - Wird manuelles Spacing (
mt={4}bei jedem Kind) verwendet, woStack gap={4}sauberer wäre? - Werden die richtigen Layout-Primitiven verwendet? (
Flexvs.Stackvs.Gridvs.SimpleGrid)
Wartbarkeit
- Wiederholt sich dasselbe visuelle Muster 3+ Mal? (Kandidat für eine Komponente oder ein Recipe)
- Gibt es einmalige Style-Überschreibungen, die auf ein Recipe oder Slot-Recipe hindeuten?
- Sind Prop-Typen / TypeScript-Typen vorhanden und korrekt?
Schritt 3a — Ausgabe der Überprüfung
Verwenden Sie dies, wenn der Benutzer eine Kritik wünscht, keine Neuschreibung.
Kategorisieren Sie Erkenntnisse nach Auswirkung:
Kritisch — Fehler und Barrierefreiheitsprobleme, die das Verhalten beeinträchtigen oder Benutzer ausschließen
- Fehlendes
aria-labelbei einem Icon-Only-Button - Formularfeld ohne Labelzuordnung
- Interaktive
BoxmitonClickaber ohne Tastaturzugriff - Falscher v3-Prop-Name, der stillschweigend nichts tut (
isDisableddeaktiviert in v3 nicht) - Fehlendes
"use client"bei einer Komponente, die Hooks im App Router verwendet
Verbesserungen — Korrektheits- und Qualitätsprobleme, die nicht dringend sind
- Fest codierte Farben, die den Dark Mode brechen
- Fehlende responsive Breakpoints
- Unnötige Verschachtelung oder falsche Layout-Primitive
- v2-Muster, die noch funktionieren, aber aktualisiert werden sollten
Optionale Vorschläge — nicht blockierende Ideen
- Wiederholtes Muster in eine Komponente auslagern
- Einmaligen Stil durch eine Recipe-Variante ersetzen
- Fehlenden TypeScript-Typ hinzufügen
Für jedes kritische Problem und jede signifikante Verbesserung zeigen Sie einen minimalen Fix:
**Fehlendes aria-label am Schließen-Button** (Kritisch)
Der IconButton zum Schließen des Dialogs hat kein zugängliches Label.
// Vorher
<IconButton icon={<CloseIcon />} onClick={onClose} />
// Nachher
<IconButton aria-label="Dialog schließen" icon={<CloseIcon />} onClick={onClose} />
Überspringen Sie Abschnitte ohne Meldungen. Passen Sie die Länge dem Code an — eine 20-zeilige Komponente benötigt eine knappe Überprüfung, keine erschöpfende.
Schritt 3b — Ausgabe der Refaktorisierung / Konvertierung
Verwenden Sie dies, wenn der Benutzer umgeschriebenen Code wünscht.
Konvertierungsstrategie nach Quelle
Aus einfachem HTML / CSS
| HTML | Chakra-Äquivalent |
|---|---|
<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", oder Stack |
<button> | Button oder IconButton |
<a> | Link |
<img> | Image (alt beibehalten) |
<input>, <select> | Input, NativeSelect innerhalb von Field.Root |
| CSS | Chakra-Style-Prop |
|---|---|
display: flex | Flex oder display="flex" |
flex-direction: column | Stack oder flexDir="column" |
gap: 16px | gap={4} (1 Einheit = 4px) |
padding: 16px 24px | py={4} px={6} |
border-radius: 8px | rounded="md" |
color: #6b7280 | color="fg.muted" |
background: #f9fafb | bg="bg.subtle" |
Aus 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" }} |
Ersetzen Sie Tailwind-Responsive-Präfixe mit Chakras Breakpoint-Objekt-Syntax:
// Tailwind: text-sm md:base lg:text-lg
<Text fontSize={{ base: "sm", md: "md", lg: "lg" }} />
Aus CSS Modules — konvertieren Sie, was möglich ist, zu Chakra-Props; behalten Sie className für Stile, die nicht als Props ausgedrückt werden können (Animationen, komplexe Selektoren):
// Vorher
<div className={styles.card}>...</div>
// Nachher — in Props konvertiert; className nur für nicht konvertierbare Stile beibehalten
<Box p={4} rounded="lg" shadow="sm" className={styles.fadeIn}>...</Box>
Sobald alle Klassennamen eliminiert sind, entfernen Sie den Import vollständig.
Aus styled-components / @emotion/styled — mappen Sie auf Box mit äquivalenten Style-Props, entfernen Sie dann den Import und deinstallieren Sie, wenn nicht mehr anderweitig verwendet:
// Vorher
const Card = styled.div`padding: 1rem; &:hover { background: #f3f4f6; }`
// Nachher
<Box p={4} _hover={{ bg: "bg.muted" }} />
Aus vorhandenem Chakra UI (Bereinigung)
- Flachen Sie
Box > Box > Box-Verschachtelungen ab; ersetzen Siemt/mbbei jedem Kind durchStack gap={N} - Ersetzen Sie
sxdurchcss(v3-Umbenennung); aktualisieren Sie darin verschachtelte&:hover-Selektoren - Ersetzen Sie
bg="gray.50"→bg="bg.subtle"und andere semantische Token-Äquivalente - Aktualisieren Sie v2-Prop-Namen:
isDisabled→disabled,colorScheme→colorPalette,spacing→gap - Aktualisieren Sie zusammengesetzte Komponenten:
FormControl→Field.Root,Modal→Dialog,Select→NativeSelect
Verhalten bewahren — nicht verhandelbar
- Behalten Sie alle Event-Handler, State-Variablen und bedingtes Rendering exakt bei
- Behalten Sie
aria-*-Attribute; fügen Sie fehlende hinzu, wo eindeutig nötig - Behalten Sie die semantische HTML-Absicht (
<nav>→Box as="nav", nicht nurBox) - Behalten Sie
"use client"dort, wo es existiert; fügen Sie es nur hinzu, wenn die Komponente es wirklich benötigt - Fügen Sie
"use client"nicht nur hinzu, weil eine Komponente Chakra UI verwendet - Eine teilweise konvertierte Komponente, die funktioniert, ist besser als eine vollständig konvertierte, die nicht funktioniert
asChild für Next.js Link und 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>
Format der Refaktorisierungsausgabe
1. Refaktorisierter Code — vollständig, ausführbar, mit korrekten Importen
2. Was sich geändert hat — präzise Liste, fokussiert auf nicht offensichtliche Entscheidungen:
- Ersetzte <div className="flex gap-4"> mit <Flex gap={4}>
- Ersetzte bg="#f9fafb" mit bg="bg.subtle" für Dark-Mode-Kompatibilität
- Formular-Submit-Handler und Validierungslogik unverändert gelassen
- aria-label zum IconButton für Schließen hinzugefügt (fehlte)
3. Vorschläge (optional) — sinnvolle Verbesserungen über diese Refaktorisierung hinaus: eine wiederverwendbare Komponente extrahieren, ein Recipe übernehmen, ein v2-Muster migrieren.
Wann fragen vs. fortfahren
Fahren Sie fort, wenn Code und Absicht klar sind. Fragen Sie, wenn:
- Der Code noch nicht geteilt wurde
- Die Komponente sehr groß und der Umfang unklar ist
- Es Kontext oder Zustand gibt, den Sie nicht sehen und der die Überprüfung ändern würde
- Es mehrdeutiges Verhalten gibt, das auf verschiedene Arten interpretiert werden könnte
Geben Sie Annahmen am Anfang der Antwort an, wenn Sie ohne Nachfrage fortfahren.