Communitygithub.com

0xAlchemist-cs/personal-ui-system

Construisez des composants et des mises en page UI réactifs et accessibles avec Chakra UI v3, installez ou configurez Chakra UI dans des projets nouveaux ou existants, et concevez des thèmes évolutifs à l'aide de tokens, tokens sémantiques, recettes et slot recipes.

Qu'est-ce que personal-ui-system ?

Ce skill est destiné aux développeurs utilisant Chakra UI v3 pour créer des interfaces utilisateur. Il guide l'utilisateur dans l'installation de Chakra UI, la configuration du Provider, la génération de snippets avec la CLI, la création de composants réutilisables (boutons, formulaires, cartes, tableaux de bord, etc.) et la personnalisation avancée du thème via les tokens, les recettes et les slot recipes. Il prend en charge les frameworks Next.js (App Router et Pages Router), Vite et React. Le skill applique les bonnes pratiques : utilisation de tokens sémantiques pour le thème clair/sombre, styles réactifs mobile-first, accessibilité native (labels, aria-label, hiérarchie des titres), et séparation des composants Server/Client pour Next.js. Il s'appuie sur une documentation de référence pour le theming et les graphiques (charts) avec Recharts.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/0xAlchemist-cs/personal-ui-system/tree/HEAD/.agents/skills/chakra-ui-builder

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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 :

FrameworkChemin de sortie
Next.js (avec src/)src/components/ui/
Next.js (sans src/)components/ui/
Vite / React simplesrc/components/ui/
Remixapp/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 que Provider englobe l'arborescence des composants.
  • Discordance d'hydratation — ajoutez suppressHydrationWarning à <html> dans App Router.
  • next-themes introuvable — installez-le : npm install next-themes (nécessaire uniquement pour la solution de secours manuelle ; la CLI le gère automatiquement).
  • extendTheme non exporté — c'est un pattern v2. Utilisez createSystem en 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 :

BesoinUtilisation
Pile verticale d'élémentsStack (par défaut) ou VStack
Ligne horizontaleHStack ou Flex
Grille CSSGrid + GridItem
Grille à colonnes égalesSimpleGrid columns={N}
Contenu de page centréContainer maxW="container.lg"
Contrôle flexbox completFlex avec props explicites
Section / article sémantiqueBox 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 alt pertinent (ou alt="" pour les images décoratives)
  • Étiquettes de formulaire : utilisez Field.Label ou assurez-vous que htmlFor correspond à l'id de l'entrée
  • Éléments interactifs personnalisés : si vous construisez quelque chose avec onClick sur un Box, utilisez as="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 (onClick avec é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 :

  1. Code complet et exécutable — imports corrects, pas de placeholders comme TODO ou ...reste du composant
  2. Instructions d'importation correctes — regroupez les imports Chakra, puis les imports locaux
  3. Séparation des composants — divisez en plusieurs composants/fichiers si le composant est complexe ou contient des parties clairement séparables
  4. Styles réactifs — au minimum les points de rupture base et md pour la mise en page
  5. 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.

Skills associés