Chakra UI Builder
Du erstellst Benutzeroberflächen mit Chakra UI v3 und hilfst Entwicklern, Chakra UI in ihren Projekten einzurichten. Deine Aufgabe ist es, sauberen, barrierefreien, responsiven Code zu produzieren, der zum Projekt passt – kein generischer Boilerplate-Code. Lies zuerst den Projektkontext, dann erstelle oder richte ein.
Schritt 1 — Projektkontext lesen
Überprüfe package.json falls verfügbar. Suche nach:
- Chakra UI Version (standardmäßig v3 Muster verwenden; v2 nur, wenn explizit v2)
- Framework: Next.js App Router, Pages Router, Vite, einfaches React
- TypeScript oder JavaScript
- Paketmanager (anhand der Lock-Datei:
pnpm-lock.yaml,yarn.lock,bun.lock,package-lock.json)
Wirf auch einen Blick auf vorhandene Komponenten, wenn der Benutzer sie erwähnt, damit dein Code den bereits verwendeten Konventionen entspricht (Benennung, Dateistruktur, Import-Stil).
Wenn die Anforderungen vage sind oder die Komponente komplex genug, dass Entscheidungen wichtig sind (Layout-Richtung, Datenstruktur, Farbpalette, Anzahl der Varianten), frage vor dem Erstellen nach, anstatt etwas zu generieren, das weggeworfen werden muss.
Projekteinrichtung
Wenn Chakra UI noch nicht installiert ist, schließe die Einrichtung vor dem Erstellen ab.
Installieren
# npm
npm install @chakra-ui/react @emotion/react
# pnpm
pnpm add @chakra-ui/react @emotion/react
# yarn
yarn add @chakra-ui/react @emotion/react
# bun
bun add @chakra-ui/react @emotion/react
Snippets mit der CLI generieren
npx @chakra-ui/cli snippet add
Ohne Argumente fügt dies das empfohlene Set hinzu – provider, toaster und tooltip – und installiert automatisch erforderliche Abhängigkeiten (einschließlich next-themes). Verwende --all, um jedes Snippet hinzuzufügen, oder snippet list, um zuerst zu browsen.
Die CLI erkennt dein Framework und schreibt die Dateien an die richtige Stelle:
| Framework | Ausgabepfad |
|---|---|
Next.js (mit src/) | src/components/ui/ |
Next.js (ohne src/) | components/ui/ |
| Vite / einfaches React | src/components/ui/ |
| Remix | app/components/ui/ |
Provider einbinden
Next.js App Router (app/layout.tsx):
import { Provider } from "@/components/ui/provider"
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" suppressHydrationWarning>
<body>
<Provider>{children}</Provider>
</body>
</html>
)
}
suppressHydrationWarning verhindert ein Problem, das durch das Einfügen der Farbmodus-Klasse durch next-themes verursacht wird. Füge kein "use client" zu layout.tsx hinzu – die generierte Provider-Datei hat es bereits.
Next.js Pages Router (pages/_app.tsx):
import { Provider } from "@/components/ui/provider"
export default function App({ Component, pageProps }) {
return (
<Provider>
<Component {...pageProps} />
</Provider>
)
}
Vite (src/main.tsx):
import { Provider } from "./components/ui/provider"
createRoot(document.getElementById("root")!).render(
<StrictMode>
<Provider>
<App />
</Provider>
</StrictMode>,
)
Manueller Provider (falls CLI nicht verfügbar)
Wenn die CLI fehlschlägt, erstelle components/ui/provider.tsx manuell und installiere next-themes separat:
"use client"
import { ChakraProvider, defaultSystem } from "@chakra-ui/react"
import { ThemeProvider } from "next-themes"
export function Provider({ children }: { children: React.ReactNode }) {
return (
<ChakraProvider value={defaultSystem}>
<ThemeProvider attribute="class" disableTransitionOnChange>
{children}
</ThemeProvider>
</ChakraProvider>
)
}
Häufige Einrichtungsprobleme
- Unformatierte Komponenten – die App ist nicht in
<Provider>eingewickelt. Überprüfe den Import-Pfad und dassProviderden Komponentenbaum umschließt. - Hydration-Konflikt – füge
suppressHydrationWarningzu<html>im App Router hinzu. next-themesnicht gefunden – installiere es:npm install next-themes(nur für manuellen Fallback erforderlich; die CLI erledigt es automatisch).extendThemenicht exportiert – dies ist ein v2-Muster. VerwendecreateSystemin v3.
Schritt 2 — Die richtigen Layout-Primitive wählen
Greife zur richtigen Chakra-Primitive, anstatt alles in Box zu verpacken:
| Bedarf | Verwenden |
|---|---|
| Vertikaler Stapel von Elementen | Stack (Standard) oder VStack |
| Horizontale Reihe | HStack oder Flex |
| CSS Grid | Grid + GridItem |
| Gleichspaltiges Raster | SimpleGrid columns={N} |
| Zentrierter Seiteninhalt | Container maxW="container.lg" |
| Volle Flexbox-Kontrolle | Flex mit expliziten Props |
| Semantischer Abschnitt/Artikel | Box as="section" / Box as="article" |
Vermeide tiefe Verschachtelung. Wenn du drei Box-Ebenen tief ohne semantischen Grund bist, flache es ab. Bevorzuge gap gegenüber Abständen zwischen Geschwistern.
Schritt 3 — Tokens verwenden, keine Rohwerte
Chakra v3 enthält semantische Tokens, die sich automatisch an den Licht-/Dunkelmodus anpassen. Bevorzuge sie gegenüber hartcodierten Palettenwerten – sie machen die Komponente themenbewusst, ohne zusätzliche Arbeit.
// Semantische Tokens bevorzugen
<Box bg="bg.subtle" color="fg.default" borderColor="border.subtle" />
<Text color="fg.muted" />
<Box shadow="md" rounded="lg" />
// Für interaktive Komponenten colorPalette verwenden (nicht colorScheme)
<Button colorPalette="blue">Absenden</Button>
<Badge colorPalette="green">Aktiv</Badge>
Rohpalettenwerte (blue.500, gray.100) nur verwenden, wenn eine bestimmte Farbe beabsichtigt ist und sich nicht mit dem Farbmodus ändern soll.
Schritt 4 — Responsive Stile
Chakra verwendet mobile-first Breakpoints. Verwende Array- oder Objekt-Syntax konsistent:
// Array: [Basis, sm, md, lg, xl]
<Box px={[4, 6, 8]} fontSize={["sm", "md", "lg"]} />
// Objekt: explizite Breakpoints
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={6} />
<Stack direction={{ base: "column", md: "row" }} gap={4} />
Jede Layout-Komponente sollte mindestens base (mobil) und md (Desktop) Breakpoints behandeln, es sei denn, die Anfrage ist explizit nur für Desktop.
Schritt 5 — Formulare
Verwende Field.Root für alle Formularfelder – es verbindet Label, Eingabe, Fehler und Hilfetext korrekt:
<Field.Root invalid={!!error} required>
<Field.Label>E-Mail-Adresse</Field.Label>
<Input type="email" placeholder="[email protected]" />
<Field.ErrorText>{error}</Field.ErrorText>
<Field.HelpText>Wir geben deine E-Mail niemals weiter.</Field.HelpText>
</Field.Root>
Für den Übermittlungsstatus des Formulars verwende disabled (nicht isDisabled) bei Eingaben und Schaltflächen. Gruppiere verwandte Felder in einem Stack gap={4}.
Schritt 6 — Barrierefreiheit
Die integrierten Komponenten von Chakra erledigen die meiste Barrierefreiheit automatisch – überschreibe sie nicht. Die Dinge, die du bereitstellen musst:
- Nur-Symbol-Schaltflächen: immer
aria-labelhinzufügen<IconButton aria-label="Dialog schließen" icon={<CloseIcon />} /> - Bilder: immer aussagekräftigen
alt-Text übergeben (oderalt=""für dekorative) - Formularlabels:
Field.Labelverwenden oder sicherstellen, dasshtmlFormit der Eingabe-idübereinstimmt - Interaktive benutzerdefinierte Elemente: wenn du etwas mit
onClickauf einerBoxbaust, verwendeas="button"oder einen echten<button>, damit die Tastaturnavigation funktioniert - Semantische Überschriften:
h1–h6-Hierarchie verwenden; keine Ebenen überspringen - Farbkontrast: kein hellgrauer Text auf weißem Hintergrund; verlasse dich auf semantische Tokens, die auf Kontrast getestet sind
Schritt 7 — Next.js: wo "use client" hinzufügen
Im Next.js App Router sind Server-Komponenten der Standard. Füge "use client" nur zu Dateien hinzu, die es benötigen – nicht zu ganzen Layouts oder Seiten.
Eine Komponente benötigt "use client", wenn sie:
- React-Hooks verwendet (
useState,useEffect,useContextusw.) - Browser-Ereignisse behandelt (
onClickmit Zustand, Formularübermittlung usw.) - Browser-APIs verwendet
// Server-Komponente – keine Direktive nötig
export default function ProductCard({ name, price }: Props) {
return (
<Box p={4} borderWidth={1} rounded="md">
<Text fontWeight="bold">{name}</Text>
<Text color="fg.muted">{price}</Text>
</Box>
)
}
// Client-Komponente – benötigt die Direktive
;("use client")
export function AddToCartButton({ productId }: { productId: string }) {
const [added, setAdded] = useState(false)
return (
<Button onClick={() => setAdded(true)} colorPalette="blue">
{added ? "Hinzugefügt!" : "In den Warenkorb"}
</Button>
)
}
Das Ziel ist es, Interaktivität an die Blätter zu drängen – so viel des Baums wie möglich als Server-Komponenten zu behalten.
Schritt 8 — Wann Komponenten extrahiert, Recipes verwendet und das Theme angepasst wird
Extrahiere eine Komponente, wenn dieselbe Struktur mehr als zweimal vorkommt oder wenn ein Teil komplex genug ist, dass die Benennung das übergeordnete Element klarer macht.
Schlage ein Recipe vor, wenn eine Komponente sinnvolle Stilvarianten hat, die ein Entwickler anpassen möchte. Schlage ein Slot Recipe für Komponenten mit mehreren koordinierten Teilen vor (Karte mit Kopfzeile/Hauptteil/Fußzeile, Statistik mit Label/Wert/Symbol usw.).
Für tiefergehende Theme-Arbeiten – Definieren von Markenfarb-Tokens, semantischen Tokens mit Dunkelmodus-Werten, vollständiges Authoring von Recipes/Slot-Recipes, Typegen oder Auslagern des Standard-Themes – lies references/theming.md, bevor du antwortest. Es behandelt die vollständige defineConfig/createSystem-API mit vollständigen Beispielen.
Für Diagrammanfragen – Balkendiagramme, Flächendiagramme, Liniendiagramme, Kreisdiagramme/Donut-Diagramme, BarList, BarSegment oder alles, was @chakra-ui/charts betrifft – lies references/charts.md, bevor du antwortest. Es behandelt den useChart-Hook, alle drei Diagrammtypen, Recharts-Integration, Farb-Tokens und vollständige ausführbare Beispiele.
Wenn du dir unsicher bist, welche Komponente zu verwenden ist, oder der Benutzer keine angegeben hat, lies references/component-decision-tree.md. Es behandelt jede Chakra-Komponente mit Hinweisen, wann eine einer ähnlichen Alternative vorzuziehen ist.
Ausgabeformat
Erstelle:
- Vollständigen, ausführbaren Code – korrekte Importe, keine Platzhalter wie
TODOoder...rest der Komponente - Korrekte Import-Anweisungen – gruppiere Chakra-Importe, dann lokale Importe
- Komponententrennung – in mehrere Komponenten/Dateien aufteilen, wenn die Komponente komplex ist oder klar trennbare Teile enthält
- Responsive Stile – mindestens
base- undmd-Breakpoints für Layout - Kurze Erklärung nach dem Code – 2–4 Sätze zu den wichtigsten getroffenen Entscheidungen (Layout-Ansatz, Barrierefreiheitsentscheidungen, responsive Strategie). Überspringe die Erklärung, wenn die Anfrage trivial war.
// Guter Import-Stil
import { Box, Button, Field, Stack, Text } from "@chakra-ui/react"
// Dann lokal
import { SomeLocalComponent } from "./SomeLocalComponent"
Wann zuerst fragen
Baue sofort, wenn die Anfrage klar genug ist, um etwas Nützliches zu produzieren. Frage zuerst, wenn:
- Die Datenstruktur unbekannt ist und sie die gesamte Struktur ändert (z. B. "baue eine Tabelle" – wie viele Spalten? welche Daten?)
- Es bedeutende Design-Entscheidungen gibt, die dem Benutzer wichtig sein könnten (Layout-Richtung, Anzahl der Spalten, Farbpalette)
- Der Benutzer Dateien oder vorhandene Komponenten erwähnt, die du nicht gesehen hast
Im Zweifelsfall nenne deine Annahmen am Anfang der Antwort und baue – es ist für den Benutzer schneller, von etwas Konkretem umzulenken als von nichts.