ga-arnez/claude-skills

Gère les composants et projets shadcn — ajout, recherche, correction, débogage, stylisme et composition d'IU, y compris les interfaces de discussion. Fournit le contexte du projet, la documentation des composants et des exemples d'utilisation. S'applique lors du travail avec shadcn/ui, les registres de composants, les presets, les codes --preset, ou tout projet contenant un fichier components.json. Se déclenche également pour "shadcn init", "créer une application avec --preset", "passer à --preset", et pour la construction d'un système de design ou l'application d'un DESIGN.md ou d'une spécification de marque à shadcn/ui.

Qu'est-ce que claude-skills ?

Cette compétence pour agents IA fournit une assistance complète pour travailler avec shadcn/ui, un framework pour créer des IU, des composants et des systèmes de design. Elle s'intègre profondément au CLI shadcn pour offrir la gestion de projet, y compris l'ajout, la recherche, la résolution de presets et la mise à jour de composants. Elle supporte les registres officiels et ceux de la communauté. La compétence applique automatiquement le contexte du projet via `npx shadcn@latest info --json` et applique des règles critiques strictes pour la composition des composants, le stylisme, les formulaires, la gestion des icônes et les IU de chat. Elle garantit que l'agent utilise des tokens sémantiques (comme `bg-background`), compose des composants correctement (comme `FieldGroup`/`Field` pour les formulaires, `MessageScroller`/`Message`/`Bubble` pour les discussions) et évite les pièges courants comme le remplacement manuel des styles, l'utilisation de classes d'espacement ou le codage en dur des couleurs. Un accent particulier est mis sur la correction des chemins d'importation dans les composants de registres tiers. De plus, elle aide à la commutation de presets avec des options claires : écraser, partiel, fusionner ou ignorer.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ga-arnez/claude-skills/tree/HEAD/plugins/gabriel-skills/skills/shadcn

Installed? Explore more Productivité et collaboration skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Demander à votre IA préférée

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

Documentation

shadcn/ui

Un framework pour construire des IU, des composants et des systèmes de design. Les composants sont ajoutés sous forme de code source au projet de l'utilisateur via le CLI.

IMPORTANT : Exécutez toutes les commandes CLI en utilisant le lanceur de paquets du projet : npx shadcn@latest, pnpm dlx shadcn@latest, ou bunx --bun shadcn@latest — selon le packageManager du projet. Les exemples ci-dessous utilisent npx shadcn@latest mais substituez le lanceur correct pour le projet.

Contexte actuel du projet

!`npx shadcn@latest info --json`

Le JSON ci-dessus contient la configuration du projet et les composants installés. Utilisez npx shadcn@latest docs <composant> pour obtenir les URL de documentation et d'exemples pour tout composant.

Principes

  1. Utilisez d'abord les composants existants. Utilisez npx shadcn@latest search pour vérifier les registres avant d'écrire de l'IU personnalisée. Vérifiez également les registres communautaires.
  2. Composez, ne réinventez pas. Page de paramètres = Tabs + Card + contrôles de formulaire. Tableau de bord = Sidebar + Card + Chart + Table.
  3. Utilisez les variantes intégrées avant les styles personnalisés. variant="outline", size="sm", etc.
  4. Utilisez les couleurs sémantiques. bg-primary, text-muted-foreground — jamais de valeurs brutes comme bg-blue-500.

Règles critiques

Ces règles sont toujours appliquées. Chacune renvoie à un fichier avec des paires de code Incorrect/Correct.

Stylisme & Tailwind → styling.md

  • className pour la disposition, pas pour le stylisme. Ne remplacez jamais les couleurs ou la typographie des composants.
  • Pas de space-x-* ou space-y-*. Utilisez flex avec gap-*. Pour les piles verticales, flex flex-col gap-*.
  • Utilisez size-* lorsque la largeur et la hauteur sont égales. size-10 pas w-10 h-10.
  • Utilisez le raccourci truncate. Pas overflow-hidden text-ellipsis whitespace-nowrap.
  • Pas de remplacements manuels de couleur dark:. Utilisez des tokens sémantiques (bg-background, text-muted-foreground).
  • Utilisez cn() pour les classes conditionnelles. N'écrivez pas de ternaires manuels avec des littéraux de gabarit.
  • Pas de z-index manuel sur les composants de superposition. Dialog, Sheet, Popover, etc. gèrent leur propre empilement.

Formulaires & Entrées → forms.md

  • Les formulaires utilisent FieldGroup + Field. N'utilisez jamais de div brut avec space-y-* ou grid gap-* pour la disposition des formulaires.
  • InputGroup utilise InputGroupInput/InputGroupTextarea. Jamais de Input/Textarea brut à l'intérieur de InputGroup.
  • Les boutons dans les entrées utilisent InputGroup + InputGroupAddon.
  • Les ensembles d'options (2–7 choix) utilisent ToggleGroup. Ne bouclez pas sur Button avec un état actif manuel.
  • FieldSet + FieldLegend pour regrouper des cases à cocher/boutons radio associés. N'utilisez pas de div avec un titre.
  • La validation de champ utilise data-invalid + aria-invalid. data-invalid sur Field, aria-invalid sur le contrôle. Pour désactivé : data-disabled sur Field, disabled sur le contrôle.

Structure des composants → composition.md

  • Les éléments sont toujours dans leur Groupe. SelectItem → SelectGroup. DropdownMenuItem → DropdownMenuGroup. CommandItem → CommandGroup.
  • Utilisez asChild (radix) ou render (base) pour les déclencheurs personnalisés. Vérifiez le champ base de npx shadcn@latest info. → base-vs-radix.md
  • Dialog, Sheet et Drawer ont toujours besoin d'un Titre. DialogTitle, SheetTitle, DrawerTitle requis pour l'accessibilité. Utilisez className="sr-only" si masqué visuellement.
  • Utilisez la composition complète de Card. CardHeader/CardTitle/CardDescription/CardContent/CardFooter. Ne mettez pas tout dans CardContent.
  • Button n'a pas de isPending/isLoading. Composez avec Spinner + data-icon + disabled.
  • TabsTrigger doit être à l'intérieur de TabsList. Ne rendez jamais les déclencheurs directement dans Tabs.
  • Avatar a toujours besoin de AvatarFallback. Pour quand l'image ne charge pas.

Utilisez des composants, pas du balisage personnalisé → composition.md

  • Utilisez des composants existants avant le balisage personnalisé. Vérifiez si un composant existe avant d'écrire un div stylisé.
  • Les encadrés utilisent Alert. Ne construisez pas de divs stylisés personnalisés.
  • Les états vides utilisent Empty. Ne construisez pas de balisage d'état vide personnalisé.
  • Toast suit la base du projet. Utilisez toast du composant toast pour les projets Base UI. Utilisez toast() de sonner pour les projets Radix et React Aria.
  • Utilisez Separator au lieu de <hr> ou <div className="border-t">.
  • Utilisez Skeleton pour les espaces réservés de chargement. Pas de divs animate-pulse personnalisés.
  • Utilisez Badge au lieu de spans stylisés personnalisés.

Icônes → icons.md

  • Les icônes dans Button utilisent data-icon. data-icon="inline-start" ou data-icon="inline-end" sur l'icône.
  • Pas de classes de dimensionnement sur les icônes dans les composants. Les composants gèrent le dimensionnement des icônes via CSS. Pas de size-4 ou w-4 h-4.
  • Passez les icônes sous forme d'objets, pas de clés de chaîne. icon={CheckIcon}, pas une recherche de chaîne.

Chat & Messagerie → chat.md

  • L'IU de chat compose les primitives de chat. Les conversations utilisent MessageScroller, les lignes utilisent Message, les surfaces utilisent Bubble. Jamais de div de bulle fait main ou de conteneur de défilement brut.
  • MessageScroller possède le comportement de défilement. Le suivi de diffusion, l'ancrage et le saut-vers-la-fin (MessageScrollerButton) sont intégrés. N'écrivez pas de hook useStickToBottom/ResizeObserver.
  • Les pièces jointes utilisent Attachment ; les notes système et les séparateurs utilisent Marker. Pas de cartes Item ou de Separator + une étiquette.

CLI

  • Ne décodez jamais les codes de préréglage et ne construisez pas d'URL de préréglage manuellement. Utilisez npx shadcn@latest preset decode <code>, preset url <code>, ou preset open <code>. Pour la détection de préréglage tenant compte du projet, utilisez npx shadcn@latest preset resolve.
  • Appliquez les codes de préréglage directement avec le CLI. Utilisez npx shadcn@latest apply <code> pour les projets existants, ou npx shadcn@latest init --preset <code> lors de l'initialisation.

Modèles clés

Ce sont les modèles les plus courants qui différencient le code shadcn/ui correct. Pour les cas particuliers, consultez les fichiers de règles liés ci-dessus.

// Disposition de formulaire : FieldGroup + Field, pas div + Label.
<FieldGroup>
  <Field>
    <FieldLabel htmlFor="email">Email</FieldLabel>
    <Input id="email" />
  </Field>
</FieldGroup>

// Validation : data-invalid sur Field, aria-invalid sur le contrôle.
<Field data-invalid>
  <FieldLabel>Email</FieldLabel>
  <Input aria-invalid />
  <FieldDescription>Email invalide.</FieldDescription>
</Field>

// Icônes dans les boutons : data-icon, pas de classes de dimensionnement.
<Button>
  <SearchIcon data-icon="inline-start" />
  Rechercher
</Button>

// Espacement : gap-*, pas space-y-*.
<div className="flex flex-col gap-4">  // correct
<div className="space-y-4">           // faux

// Dimensions égales : size-*, pas w-* h-*.
<Avatar className="size-10">   // correct
<Avatar className="w-10 h-10"> // faux

// Couleurs de statut : variantes Badge ou tokens sémantiques, pas de couleurs brutes.
<Badge variant="secondary">+20.1%</Badge>    // correct
<span className="text-emerald-600">+20.1%</span> // faux

Sélection de composants

BesoinUtiliser
Bouton/actionButton avec la variante appropriée
Entrées de formulaireInput, Select, Combobox, Switch, Checkbox, RadioGroup, Textarea, InputOTP, Slider
Basculer entre 2–5 optionsToggleGroup + ToggleGroupItem
Affichage de donnéesTable, Card, Badge, Avatar
NavigationSidebar, NavigationMenu, Breadcrumb, Tabs, Pagination
SuperpositionsDialog (modal), Sheet (panneau latéral), Drawer (feuille du bas), AlertDialog (confirmation)
Retour d'informationtoast (Base UI), sonner (Radix/Aria), Alert, Progress, Skeleton, Spinner
Palette de commandesCommand à l'intérieur de Dialog
GraphiquesChart (encapsule Recharts)
DispositionCard, Separator, Resizable, ScrollArea, Accordion, Collapsible
États videsEmpty
MenusDropdownMenu, ContextMenu, Menubar
Infobulles/informationsTooltip, HoverCard, Popover
IU de chat / conversationMessageScroller, Message, Bubble, Attachment, Marker

Champs clés

Le contexte de projet injecté contient ces champs clés :

  • aliases → utilisez le préfixe d'alias réel pour les importations (par exemple @/, ~/), ne codez jamais en dur.
  • isRSC → quand true, les composants utilisant useState, useEffect, les gestionnaires d'événements ou les API du navigateur ont besoin de "use client" en haut du fichier. Référencez toujours ce champ lorsque vous conseillez sur la directive.
  • tailwindVersion → "v4" utilise les blocs @theme inline ; "v3" utilise tailwind.config.js.
  • tailwindCssFile → le fichier CSS global où les variables CSS personnalisées sont définies. Modifiez toujours ce fichier, n'en créez jamais un nouveau.
  • style → traitement visuel des composants (par exemple nova, vega).
  • base → bibliothèque primitive (radix ou base). Affecte les API des composants et les props disponibles.
  • iconLibrary → détermine les importations d'icônes. Utilisez lucide-react pour lucide, @tabler/icons-react pour tabler, etc. Ne supposez jamais lucide-react.
  • resolvedPaths → destinations exactes du système de fichiers pour les composants, utilitaires, hooks, etc.
  • framework → conventions de routage et de fichiers (par exemple Next.js App Router vs Vite SPA).
  • packageManager → utilisez-le pour toute installation de dépendances non shadcn (par exemple pnpm add date-fns vs npm install date-fns).
  • preset → code de préréglage et valeurs résolus pour le projet actuel. Utilisez npx shadcn@latest preset resolve --json lorsque vous avez seulement besoin d'informations sur le préréglage.

Consultez cli.md — commande info pour la référence complète des champs.

Documentation, exemples et utilisation des composants

Exécutez npx shadcn@latest docs <composant> pour obtenir les URL de la documentation, des exemples et de la référence API d'un composant. Récupérez ces URL pour obtenir le contenu réel.

npx shadcn@latest docs button dialog select

Lors de la création, de la correction, du débogage ou de l'utilisation d'un composant, exécutez toujours npx shadcn@latest docs et récupérez d'abord les URL. Cela garantit que vous travaillez avec l'API et les modèles d'utilisation corrects plutôt que de deviner.

Flux de travail

  1. Obtenez le contexte du projet — déjà injecté ci-dessus. Exécutez npx shadcn@latest info à nouveau si vous avez besoin d'actualiser.
  2. Vérifiez d'abord les composants installés — avant d'exécuter add, vérifiez toujours la liste components du contexte du projet ou listez le répertoire resolvedPaths.ui. N'importez pas de composants qui n'ont pas été ajoutés et ne ré-ajoutez pas ceux déjà installés.
  3. Trouvez des composants — npx shadcn@latest search.
  4. Obtenez la documentation et les exemples — exécutez npx shadcn@latest docs <composant> pour obtenir les URL, puis récupérez-les. Utilisez npx shadcn@latest view pour parcourir les éléments du registre que vous n'avez pas installés. Pour prévisualiser les modifications des composants installés, utilisez npx shadcn@latest add --diff.
  5. Installez ou mettez à jour — npx shadcn@latest add. Lors de la mise à jour de composants existants, utilisez --dry-run et --diff pour prévisualiser d'abord les modifications (voir Mise à jour des composants ci-dessous).
  6. Corrigez les importations dans les composants tiers — Après avoir ajouté des composants à partir de registres communautaires (par exemple @bundui, @magicui), vérifiez les fichiers non IU ajoutés pour les chemins d'importation codés en dur comme @/components/ui/.... Ceux-ci ne correspondront pas aux alias réels du projet. Utilisez npx shadcn@latest info pour obtenir l'alias ui correct (par exemple @workspace/ui/components) et réécrivez les importations en conséquence. Le CLI réécrit les importations pour ses propres fichiers IU, mais les composants de registre tiers peuvent utiliser des chemins par défaut qui ne correspondent pas au projet.
  7. Examinez les composants ajoutés — Après avoir ajouté un composant ou un bloc à partir de n'importe quel registre, lisez toujours les fichiers ajoutés et vérifiez qu'ils sont corrects. Vérifiez les sous-composants manquants (par exemple SelectItem sans SelectGroup), les importations manquantes, la composition incorrecte ou les violations des Règles critiques. Remplacez également toutes les importations d'icônes par iconLibrary du projet à partir du contexte du projet (par exemple si l'élément du registre utilise lucide-react mais que le projet utilise hugeicons, échangez les importations et les noms d'icônes en conséquence). Corrigez tous les problèmes avant de continuer.
  8. Le registre doit être explicite — Lorsque l'utilisateur demande d'ajouter un bloc ou un composant, ne devinez pas le registre. Si aucun registre n'est spécifié (par exemple l'utilisateur dit "ajouter un bloc de connexion" sans spécifier @shadcn, @tailark, owner/repo, etc.), demandez quel registre utiliser. Ne choisissez jamais de registre par défaut pour l'utilisateur.
  9. Changement de préréglages — Demandez d'abord à l'utilisateur : écraser, partiel, fusionner ou ignorer ?
    • Inspectez le préréglage actuel : npx shadcn@latest preset resolve. Utilisez --json lorsque vous avez besoin de valeurs structurées.
    • Inspectez le préréglage entrant : npx shadcn@latest preset decode <code>. Utilisez preset url <code> ou preset open <code> pour partager ou ouvrir le générateur de préréglages.
    • Écraser : npx shadcn@latest apply <code>. Écrase les composants, polices et variables CSS détectés.
    • Partiel : npx shadcn@latest apply <code> --only theme,font. Met à jour uniquement les parties de préréglage sélectionnées sans réinstaller les composants IU. Les valeurs prises en charge sont theme et font ; les combinaisons séparées par des virgules sont autorisées. icon n'est intentionnellement pas pris en charge, car les modifications d'icônes peuvent nécessiter une réinstallation complète des composants.
    • Fusionner : applique un ensemble de modifications mixtes. Cela peut impliquer la réécriture manuelle de parties de la configuration du projet, des polices, des icônes ou des valeurs CSS. Faites preuve de jugement pour déterminer ce qui relève de la fusion par rapport à l'écrasement ou à l'application partielle. Comme la fusion n'est pas prise en charge nativement par le CLI, soyez explicite sur ce que vous faites changez et pourquoi.
    • Ignorer : ne pas changer le préréglage. Gardez le préréglage et la configuration actuelle du projet. Évaluez les changements de code ultérieurs dans le contexte actuel.

Mise à jour des composants

Avant de mettre à jour un composant, lisez toujours ses fichiers source actuels.

  1. Lisez les fichiers source actuels du composant. Cela vous permet de comparer ce qui va changer.
  2. Exécutez npx shadcn@latest add <composant> --dry-run pour voir quels changements de fichiers sont proposés.
  3. Exécutez npx shadcn@latest add <composant> --dry-run --diff pour voir les changements de différence réels par fichier.
  4. Exécutez npx shadcn@latest add <composant> pour appliquer les mises à jour.
  5. Exécutez npx shadcn@latest info pour mettre à jour le contexte du projet avec les versions de composants mises à jour.
  6. Vérifiez les changements dans les fichiers mis à jour. Assurez-vous qu'ils suivent toujours les Règles critiques ci-dessus. Vérifiez que les composants qui utilisent le composant mis à jour fonctionnent toujours correctement.

Ajout ou mise à jour de blocs depuis un registre

Les blocs sont des sections d'IU plus grandes qui encapsulent plusieurs composants, l'état, les données, etc.

npx shadcn@latest add --registry <registre> <nom-du-bloc>
# Ou, pour un registre initié :
npx shadcn@latest add @shadcn/blocks/login-01

Toujours :

  1. Utilisez --dry-run en premier.
  2. Examinez le nombre de composants et de fichiers ajoutés (rapport npx shadcn@latest add).
  3. Lors de l'ajout de blocs à partir de registres communautaires, lisez toujours TOUS les fichiers ajoutés et vérifiez leur exactitude.

Fichier de composants de registre

Le fichier de composants de registre (npx shadcn@latest docs <composant> → doc field) contient la documentation du registre, les exemples et les liens de référence API. Utilisez ce fichier comme source d'informations pour le stylisme, les variantes d'API, les noms de propriétés et les modèles d'utilisation.

Erreurs courantes

Couleurs brutes

// FAUX :
<div className="bg-blue-500 p-4 text-white">
  Contenu
</div>

// CORRECT :
<div className="bg-primary p-4 text-primary-foreground">
  Contenu
</div>

Styles de formulaire manuels

// FAUX :
<div className="space-y-4">
  <div>
    <Label>Email</Label>
    <Input />
  </div>
</div>

// CORRECT :
<FieldGroup>
  <Field>
    <FieldLabel>Email</FieldLabel>
    <FieldControl>
      <Input />
    </FieldControl>
  </Field>
</FieldGroup>

Composition incorrecte

// FAUX :
<Select>
  <SelectItem value="1">Option 1</SelectItem>
  <SelectItem value="2">Option 2</SelectItem>
</Select>

// CORRECT :
<Select>
  <SelectGroup>
    <SelectLabel>Options</SelectLabel>
    <SelectItem value="1">Option 1</SelectItem>
    <SelectItem value="2">Option 2</SelectItem>
  </SelectGroup>
</Select>

Bibliothèque d'icônes incorrecte

// FAUX (en supposant que lucide-react est utilisé) :
import { Search, Settings } from "lucide-react"

// CORRECT (vérifiez iconLibrary dans le contexte du projet) :
import { Search, Settings } from "@tabler/icons-react"
// ou toute bibliothèque spécifiée par iconLibrary

Chemins d'importation codés en dur dans les composants de registres tiers

Lors de l'ajout de composants à partir de registres communautaires, vérifiez toujours les chemins d'importation. Par exemple, un composant de @bundui pourrait avoir :

// FAUX (chemin codé en dur supposant @/) :
import { Button } from "@/components/ui/button"

// CORRECT (utilisez l'alias ui réel du projet) :
import { Button } from "@workspace/ui/components/button"

Utilisation d'icônes incorrecte dans les boutons

// FAUX :
<Button>
  <SearchIcon className="size-4" />
  Rechercher
</Button>

// CORRECT :
<Button>
  <SearchIcon data-icon="inline-start" />
  Rechercher
</Button>

Dépannage

ProblèmeCauseSolution
Une classe Tailwind ne fonctionne pasTokens sémantiques non disponiblesVérifiez que les variables CSS sont définies dans tailwindCssFile
Les composants ne correspondent pas au thèmePreset manquant ou appliqué de manière incorrecteUtilisez npx shadcn@latest preset resolve pour vérifier l'état actuel
Le composant rend sans styleLe CSS du composant n'a pas été importéVérifiez les importations et que le tailwindCssFile est correctement chargé
Les importations d'un registre tiers échouentChemins d'importation codés en dur dans les fichiers ajoutésRemplacez les chemins par les alias corrects du projet (voir champ aliases)
Le préréglage n'est pas appliquéCode de préréglage invalide ou registre manquantUtilisez npx shadcn@latest preset decode <code> pour vérifier le code et l'URL du registre

Variables d'environnement

Aucune variable d'environnement n'est requise pour l'utilisation de base. Les configurations avancées peuvent utiliser SHADCN_REGISTRY_URL pour les registres personnalisés, bien que cela ne soit pas courant.

Skills associés