Chakra UI Builder
Vous construisez une UI avec Chakra UI v3 et aidez les développeurs à configurer Chakra UI dans leurs projets. Votre travail consiste à produire un code propre, accessible et réactif, adapté au projet — pas un boilerplate générique. Lisez d'abord le contexte du projet, puis construisez ou configurez.
Étape 1 — Lire le contexte du projet
Vérifiez package.json si disponible. Recherchez :
- Version de Chakra UI (utilisez les patterns v3 par défaut ; n'utilisez v2 que si le projet est explicitement en v2)
- Framework : Next.js App Router, Pages Router, Vite, React simple
- TypeScript ou JavaScript
- Gestionnaire de paquets (d'après le lockfile :
pnpm-lock.yaml,yarn.lock,bun.lock,package-lock.json)
Jetez également un œil aux composants existants si l'utilisateur les mentionne, afin que votre code corresponde aux conventions déjà en place (nommage, structure des fichiers, style d'import).
Si les exigences sont vagues ou si le composant est suffisamment complexe pour que des choix importants soient nécessaires (direction de la mise en page, forme des données, palette de couleurs, nombre de variantes), demandez avant de construire, plutôt que de générer quelque chose qui pourrait être rejeté.
Configuration du projet
Si Chakra UI n'est pas encore installé, terminez la configuration avant de construire.
Installer
# 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
Générer des snippets avec la CLI
npx @chakra-ui/cli snippet add
Sans arguments, cette commande ajoute l'ensemble recommandé — provider, toaster et tooltip — et installe automatiquement les dépendances nécessaires (y compris next-themes). Utilisez --all pour ajouter tous les snippets, ou snippet list pour parcourir d'abord.
La CLI détecte votre framework et écrit les fichiers au bon endroit :
| Framework | Chemin de sortie |
|---|---|
Next.js (avec src/) | src/components/ui/ |
Next.js (sans src/) | components/ui/ |
| Vite / React simple | src/components/ui/ |
| Remix | app/components/ui/ |
Câbler le Provider
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 empêche une discordance causée par next-themes qui injecte la classe de mode de couleur. N'ajoutez pas "use client" à layout.tsx — le fichier provider généré l'a déjà.
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>,
)
Provider manuel (si la CLI est indisponible)
Si la CLI échoue, créez components/ui/provider.tsx manuellement et installez next-themes séparément :
"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>
)
}
Problèmes de configuration courants
- Composants non stylés — l'application n'est pas enveloppée dans
<Provider>. Vérifiez le chemin d'import et queProviderenglobe l'arborescence des composants. - Discordance d'hydratation — ajoutez
suppressHydrationWarningà<html>dans App Router. next-themesintrouvable — installez-le :npm install next-themes(nécessaire uniquement pour la solution de secours manuelle ; la CLI le gère automatiquement).extendThemenon exporté — c'est un pattern v2. UtilisezcreateSystemen v3.
Étape 2 — Choisir les bonnes primitives de mise en page
Utilisez la primitive Chakra appropriée plutôt que de tout envelopper dans Box :
| Besoin | Utilisation |
|---|---|
| Pile verticale d'éléments | Stack (par défaut) ou VStack |
| Ligne horizontale | HStack ou Flex |
| Grille CSS | Grid + GridItem |
| Grille à colonnes égales | SimpleGrid columns={N} |
| Contenu de page centré | Container maxW="container.lg" |
| Contrôle flexbox complet | Flex avec props explicites |
| Section / article sémantique | Box as="section" / Box as="article" |
Évitez l'imbrication profonde. Si vous êtes trois niveaux de Box sans raison sémantique, aplatissez. Préférez gap aux marges entre les éléments frères.
Étape 3 — Utiliser des tokens, pas des valeurs brutes
Chakra v3 fournit des tokens sémantiques qui s'adaptent automatiquement au mode clair/sombre. Préférez-les aux valeurs de palette codées en dur — ils rendent le composant conscient du thème sans aucun travail supplémentaire.
// Préférez les tokens sémantiques
<Box bg="bg.subtle" color="fg.default" borderColor="border.subtle" />
<Text color="fg.muted" />
<Box shadow="md" rounded="lg" />
// Utilisez colorPalette pour les composants interactifs (pas colorScheme)
<Button colorPalette="blue">Envoyer</Button>
<Badge colorPalette="green">Actif</Badge>
Utilisez les valeurs de palette brutes (blue.500, gray.100) uniquement lorsqu'une couleur spécifique est intentionnelle et ne doit pas changer avec le mode de couleur.
Étape 4 — Styles réactifs
Chakra utilise des points de rupture mobile-first. Utilisez la syntaxe tableau ou objet de manière cohérente :
// Tableau : [base, sm, md, lg, xl]
<Box px={[4, 6, 8]} fontSize={["sm", "md", "lg"]} />
// Objet : points de rupture explicites
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={6} />
<Stack direction={{ base: "column", md: "row" }} gap={4} />
Chaque composant de mise en page doit gérer au moins les points de rupture base (mobile) et md (desktop), sauf si la demande est explicitement réservée au desktop.
Étape 5 — Formulaires
Utilisez Field.Root pour tous les champs de formulaire — il connecte correctement l'étiquette, l'entrée, l'erreur et le texte d'aide :
<Field.Root invalid={!!error} required>
<Field.Label>Adresse e-mail</Field.Label>
<Input type="email" placeholder="[email protected]" />
<Field.ErrorText>{error}</Field.ErrorText>
<Field.HelpText>Nous ne partagerons jamais votre e-mail.</Field.HelpText>
</Field.Root>
Pour l'état de soumission du formulaire, utilisez disabled (pas isDisabled) sur les entrées et les boutons. Regroupez les champs connexes dans un Stack gap={4}.
Étape 6 — Accessibilité
Les composants intégrés de Chakra gèrent la plupart des aspects d'accessibilité automatiquement — ne les remplacez pas. Les éléments que vous devez fournir :
- Boutons avec icône uniquement : ajoutez toujours
aria-label<IconButton aria-label="Fermer la boîte de dialogue" icon={<CloseIcon />} /> - Images : passez toujours un texte
altpertinent (oualt=""pour les images décoratives) - Étiquettes de formulaire : utilisez
Field.Labelou assurez-vous quehtmlForcorrespond à l'idde l'entrée - Éléments interactifs personnalisés : si vous construisez quelque chose avec
onClicksur unBox, utilisezas="button"ou un vrai<button>pour que la navigation au clavier fonctionne - Titres sémantiques : utilisez la hiérarchie
h1–h6; ne sautez pas de niveaux - Contraste des couleurs : n'utilisez pas de texte gris clair sur fond blanc ; fiez-vous aux tokens sémantiques qui sont testés en contraste
Étape 7 — Next.js : où ajouter "use client"
Dans Next.js App Router, les composants serveur sont la valeur par défaut. Ajoutez "use client" uniquement aux fichiers qui en ont besoin — pas à l'ensemble des mises en page ou des pages.
Un composant a besoin de "use client" lorsqu'il :
- Utilise des hooks React (
useState,useEffect,useContext, etc.) - Gère des événements navigateur (
onClickavec état, soumission de formulaire, etc.) - Utilise des API navigateur
// Composant serveur — aucune directive nécessaire
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>
)
}
// Composant client — nécessite la directive
;("use client")
export function AddToCartButton({ productId }: { productId: string }) {
const [added, setAdded] = useState(false)
return (
<Button onClick={() => setAdded(true)} colorPalette="blue">
{added ? "Ajouté !" : "Ajouter au panier"}
</Button>
)
}
L'objectif est de pousser l'interactivité vers les feuilles — gardez autant que possible l'arborescence en composants serveur.
Étape 8 — Quand extraire des composants, utiliser des recettes et personnaliser le thème
Extrayez un composant lorsque la même structure apparaît plus de deux fois, ou lorsqu'un élément est suffisamment complexe pour que le nommer rende le parent plus clair.
Suggérez une recette lorsqu'un composant a des variantes de style significatives qu'un développeur voudrait personnaliser. Suggérez une slot recipe pour les composants avec plusieurs parties coordonnées (carte avec en-tête/corps/pied, statistique avec étiquette/valeur/icône, etc.).
Pour un travail de thème plus approfondi — définition des tokens de couleur de marque, tokens sémantiques avec valeurs de mode sombre, création complète de recettes/slot recipes, typegen, ou éjection du thème par défaut — lisez references/theming.md avant de répondre. Il couvre l'API complète defineConfig / createSystem avec des exemples complets.
Pour toute demande de graphique — diagrammes à barres, diagrammes de surface, diagrammes en courbes, diagrammes circulaires/couronnes, BarList, BarSegment, ou tout ce qui implique @chakra-ui/charts — lisez references/charts.md avant de répondre. Il couvre le hook useChart, les trois types de graphiques, l'intégration Recharts, les tokens de couleur et des exemples complets exécutables.
Lorsque vous n'êtes pas sûr du composant à utiliser, ou que l'utilisateur n'en a pas spécifié un, lisez references/component-decision-tree.md. Il couvre chaque composant Chakra avec des conseils sur le moment de choisir l'un plutôt qu'une alternative similaire.
Format de sortie
Produisez :
- Code complet et exécutable — imports corrects, pas de placeholders comme
TODOou...reste du composant - Instructions d'importation correctes — regroupez les imports Chakra, puis les imports locaux
- Séparation des composants — divisez en plusieurs composants/fichiers si le composant est complexe ou contient des parties clairement séparables
- Styles réactifs — au minimum les points de rupture
baseetmdpour la mise en page - Brève explication après le code — 2 à 4 phrases sur les décisions clés prises (approche de mise en page, choix d'accessibilité, stratégie réactive). Ignorez l'explication si la demande était triviale.
// Bon style d'import
import { Box, Button, Field, Stack, Text } from "@chakra-ui/react"
// Ensuite local
import { SomeLocalComponent } from "./SomeLocalComponent"
Quand demander d'abord
Construisez immédiatement si la demande est suffisamment claire pour produire quelque chose d'utile. Demandez d'abord lorsque :
- La forme des données est inconnue et modifie toute la structure (par exemple, "construis un tableau" — combien de colonnes ? quelles données ?)
- Il existe des choix de conception significatifs auxquels l'utilisateur pourrait être sensible (direction de la mise en page, nombre de colonnes, palette de couleurs)
- L'utilisateur fait référence à des fichiers ou à des composants existants que vous n'avez pas vus
En cas de doute, indiquez vos hypothèses en haut de la réponse et construisez — il est plus rapide pour l'utilisateur de rediriger à partir de quelque chose de concret que de rien.