Pour les développeurs web, la quête de la boîte à outils d'interface utilisateur parfaite est un effort constant. Pendant des années, les développeurs React se sont appuyés sur des bibliothèques de composants traditionnelles comme Material-UI (MUI), Ant Design et Chakra UI. Ces bibliothèques offrent une multitude de composants pré-construits, promettant d'accélérer le développement. Cependant, elles s'accompagnent souvent d'un compromis : un manque de contrôle, des surcharges de style qui ressemblent à un combat, et des tailles de bundle gonflées.
Voici Shadcn UI, une approche révolutionnaire qui a pris d'assaut la communauté React. Ce n'est pas une bibliothèque de composants comme vous en avez l'habitude ; c'est quelque chose de mieux. C'est une collection de composants magnifiquement conçus, accessibles et infiniment réutilisables que vous n'installez pas depuis npm en tant que dépendance – vous les copiez directement dans votre projet.
Ce tutoriel complet de 4000 mots vous servira de guide définitif, vous faisant passer du statut de débutant complet à celui de praticien confiant de Shadcn UI. Nous explorerons sa philosophie fondamentale, parcourrons une configuration détaillée, construirons des interfaces utilisateur complexes, maîtriserons les thèmes avancés et la gestion des formulaires, et discuterons des meilleures pratiques pour les applications à grande échelle. Préparez-vous à repenser ce que vous attendez d'une boîte à outils d'interface utilisateur.
Vous voulez une plateforme intégrée tout-en-un pour que votre équipe de développeurs travaille ensemble avec une productivité maximale ?
Apidog répond à toutes vos demandes et remplace Postman à un prix beaucoup plus abordable !
La Philosophie de Shadcn UI - Une Nouvelle Façon de Construire
Avant d'écrire une seule ligne de code, il est primordial de comprendre pourquoi Shadcn UI existe et quels problèmes il résout. Saisir cette philosophie fondamentale est la clé pour libérer tout son potentiel.
Ce que Shadcn UI N'est Pas
- Ce n'est pas un package npm traditionnel. Vous ne trouverez pas
shadcn-ui
dans la liste des dépendances de votrepackage.json
. C'est la distinction la plus cruciale. - Ce n'est pas une bibliothèque monolithique. Elle ne vous force pas à installer des centaines de composants lorsque vous n'avez besoin que d'un bouton et d'un champ de saisie.
- Ce n'est pas restrictif. Vous n'êtes jamais enfermé dans une esthétique de design spécifique ni limité par les capacités de thèmes fournies par les mainteneurs d'une bibliothèque.
Ce que Shadcn UI Est
- Une Collection de Code Réutilisable : Pensez-y comme un ensemble de recettes savamment sélectionnées. Vous choisissez la recette que vous voulez (par exemple, un composant
Card
), et les instructions (le code) vous sont données pour cuisiner dans votre propre cuisine (votre projet). - Un Engagement envers la Propriété du Code : Une fois que vous ajoutez un composant Shadcn, son code source—un fichier
.tsx
—est placé directement dans votre base de code, typiquement souscomponents/ui/
. C'est maintenant votre composant. Vous pouvez changer sa structure, ses styles, sa logique—tout. Cela élimine l'expérience frustrante de lutter avec des surcharges CSS!important
ou des APIs de props complexes pour obtenir une simple modification visuelle. - Construit sur une Fondation Moderne et Solide : Shadcn UI ne réinvente pas la roue. Il s'appuie sur les épaules de géants :
- Tailwind CSS : Un framework CSS orienté utilitaires qui fournit des blocs de construction de bas niveau pour créer n'importe quel design directement dans votre balisage. Les composants Shadcn sont stylisés exclusivement avec Tailwind, ce qui les rend incroyablement faciles à personnaliser si vous êtes familier avec le framework.
- Radix UI : Une bibliothèque de primitives d'interface utilisateur non stylisées, accessibles et de bas niveau. Radix gère tous les aspects complexes et souvent négligés des composants d'interface utilisateur, tels que la navigation au clavier, la gestion du focus et les attributs ARIA pour l'accessibilité (a11y). Shadcn prend ces primitives puissantes et "headless" et ajoute un beau style avec Tailwind CSS.
L'avantage principal de ce modèle est la fusion de la vitesse et du contrôle. Vous bénéficiez de la vélocité initiale de l'utilisation de composants pré-construits sans sacrifier la flexibilité et la maintenabilité à long terme qui découlent de la possession de votre propre code.
Préparer le Terrain - Configuration et Installation du Projet
Passons de la théorie à la pratique. Nous allons configurer un nouveau projet à partir de zéro. Pour ce guide, nous utiliserons principalement Next.js, car ses composants serveur et son routage basé sur les fichiers s'alignent parfaitement avec l'éthos de Shadcn UI. Nous couvrirons également brièvement la configuration pour Vite.
Étape 1 : Prérequis de l'Environnement
Assurez-vous que votre environnement de développement est prêt. Vous aurez besoin de :
- Node.js : La dernière version de support à long terme (LTS) est recommandée. Vous pouvez la télécharger depuis le site web officiel de Node.js.
- Un Gestionnaire de Packages : Ce tutoriel utilisera
npm
, qui est fourni avec Node.js. Vous pouvez également utiliseryarn
oupnpm
.
Étape 2 : Créer une Nouvelle Application Next.js
Ouvrez votre terminal et exécutez la commande suivante pour initialiser un nouveau projet Next.js.
npx create-next-app@latest my-pro-shadcn-app --typescript --tailwind --eslint\n
Cette commande crée une nouvelle application dans un répertoire nommé my-pro-shadcn-app
. Nous avons inclus quelques drapeaux importants :
--typescript
: Shadcn UI est écrit en TypeScript et fonctionne mieux dans un environnement TypeScript.--tailwind
: Tailwind CSS est une dépendance forte pour le style de Shadcn UI.--eslint
: Toujours une bonne pratique pour maintenir la qualité du code.
L'installateur vous posera quelques questions. Voici les choix recommandés pour une configuration moderne de Next.js 14+ :
✔ Would you like to use `src/` directory? … No / **Yes**\n✔ Would you like to use App Router? (recommended) … No / **Yes**\n✔ Would you like to customize the default import alias? … **No** / Yes\n
L'utilisation de l'App Router est une pratique courante, et le répertoire src/
aide à organiser le code. Une fois terminé, naviguez dans votre nouveau projet :
cd my-pro-shadcn-app\n
Étape 3 : La Commande init
- Donner Vie à Shadcn UI
C'est l'étape la plus importante. Shadcn UI fournit un outil CLI pour configurer votre projet. Exécutez la commande suivante depuis le répertoire racine de votre projet :
npx shadcn-ui@latest init\n
Cela déclenchera un questionnaire interactif pour configurer votre projet. Analysons chaque question et sa signification :
- Voulez-vous utiliser TypeScript (recommandé) ?
Oui
. Nous sommes dans un projet TypeScript. - Quel style souhaitez-vous utiliser ?
Default
vsNew York
. Ce sont deux styles visuels prédéfinis.Default
est un peu plus espacé, tandis queNew York
est plus compact. Vous pouvez voir des exemples sur le site web de Shadcn UI. ChoisissonsDefault
. - Quelle couleur souhaitez-vous utiliser comme couleur de base ? Cela configure la palette de couleurs principale pour votre interface utilisateur. La valeur par défaut est
Slate
. Restons surSlate
pour l'instant ; nous apprendrons à changer cela plus tard. - Où se trouve votre fichier
global.css
? Le CLI le détecte correctement àsrc/app/globals.css
. C'est dans ce fichier que les variables CSS principales pour les thèmes seront injectées. - Voulez-vous utiliser des variables CSS pour les thèmes ?
Oui
. C'est la pierre angulaire du système de thèmes de Shadcn, permettant des changements dynamiques (comme le mode sombre/clair) et une personnalisation facile. - Où se trouve votre
tailwind.config.ts
? Le CLI détectesrc/tailwind.config.ts
. Ce fichier sera modifié pour intégrer les préréglages de thèmes de Shadcn. - Configurer l'alias d'importation pour les composants :
@/components
. C'est une bonne pratique. Cela signifie que peu importe la profondeur d'un fichier, vous pouvez toujours importer un composant avec un chemin propre commeimport { Button } from "@/components/ui/button";
. - Configurer l'alias d'importation pour les utilitaires :
@/lib/utils
. Idem que ci-dessus, pour les fonctions utilitaires. - Utilisez-vous les Composants Serveur React ?
Oui
. Nous avons choisi l'App Router, qui utilise les Composants Serveur par défaut. - Écrire la configuration dans
components.json
?Oui
. Cela crée un fichier crucial qui mémorise tous vos choix, de sorte que vous n'avez pas à répondre à ces questions chaque fois que vous exécuteznpx shadcn-ui@latest add ...
.
Après avoir confirmé, le CLI opère sa magie :
- Installe les Dépendances : Il ajoute les packages nécessaires comme
tailwindcss-animate
etclass-variance-authority
. - Crée
components.json
: Stocke vos choix de configuration. - Met à Jour
tailwind.config.ts
: Injecte le plugin Shadcn UI et la configuration des thèmes. - Met à Jour
globals.css
: Ajoute un grand bloc de variables CSS qui définissent toute votre palette de couleurs, les rayons de bordure, et plus encore. - Crée
lib/utils.ts
: Ce fichier exporte une fonction utilitairecn
, qui est un utilitaire astucieux pour fusionner conditionnellement les classes Tailwind CSS.
Votre projet est maintenant entièrement configuré.
(Alternative : Configuration avec Vite)
Si vous utilisez Vite avec React, le processus est très similaire. Après avoir configuré un projet Vite + React + TS, vous installeriez manuellement Tailwind CSS, puis exécuteriez npx shadcn-ui@latest init. Le CLI est assez intelligent pour détecter une configuration Vite et posera des questions légèrement différentes sur les emplacements des fichiers (par exemple, index.css au lieu de globals.css).
Construire une Interface Utilisateur - Des Composants Simples aux Layouts Complexes
La configuration étant terminée, commençons à construire. Le flux de travail principal est le suivant : identifier un besoin, ajouter le composant, l'utiliser.
Étape 4 : Ajouter et Utiliser Vos Premiers Composants
Nettoyons le code passe-partout par défaut de Next.js et construisons une interface simple.
1. Ajouter un Bouton :
npx shadcn-ui@latest add button\n
Observez ce qui se passe : un nouveau fichier, src/components/ui/button.tsx
, est créé. C'est votre bouton. Il vous appartient.
2. Ajouter une Carte (Card) :
npx shadcn-ui@latest add card\n
Cette commande est plus intéressante. Elle crée src/components/ui/card.tsx
. Si vous inspectez ce fichier, vous verrez qu'il exporte plusieurs composants : Card
, CardHeader
, CardTitle
, CardDescription
, CardContent
, et CardFooter
. C'est un modèle courant pour les composants composés.
3. Construire l'Interface Utilisateur :
Maintenant, ouvrez src/app/page.tsx
et remplacez son contenu par ce qui suit :
import { Button } from "@/components/ui/button";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from "@/components/ui/card";\nimport { Input } from "@/components/ui/input"; // Nous ajouterons ceci ensuite\nimport { Label } from "@/components/ui/label"; // Et ceci\n\nexport default function Home() {\n return (\n <main className="flex min-h-screen items-center justify-center bg-background p-8">\n <Card className="w-full max-w-md">\n <CardHeader>\n <CardTitle className="text-2xl">Create Project</CardTitle>\n <CardDescription>\n Deploy your new project in one-click.\n </CardDescription>\n </CardHeader>\n <CardContent className="grid gap-4">\n <div className="grid gap-2">\n <Label htmlFor="name">Name</Label>\n <Input id="name" placeholder="Name of your project" />\n </div>\n <div className="grid gap-2">\n <Label htmlFor="framework">Framework</Label>\n {/* Nous remplacerons ceci par un composant Select plus tard */}\n <Input id="framework" placeholder="e.g. Next.js" />\n </div>\n </CardContent>\n <CardFooter>\n <Button className="w-full">Deploy</Button>\n </CardFooter>\n </Card>\n </main>\n );\n}\n
Notre code ne fonctionnera pas encore car il nous manque les composants Input
et Label
. Ajoutons-les :
npx shadcn-ui@latest add input\nnpx shadcn-ui@latest add label\n
Maintenant, lancez votre serveur de développement :
npm run dev\n
Naviguez vers http://localhost:3000
. Vous verrez un formulaire propre et professionnel dans une carte. Remarquez comment nous avons utilisé des classes utilitaires comme w-full
, max-w-md
, et grid
directement dans notre JSX pour contrôler le layout. C'est la puissance de la combinaison de Shadcn et Tailwind CSS.
Étape 5 : Introduire des Composants Plus Sophistiqués
Les champs de saisie statiques sont bien, mais les applications réelles nécessitent des éléments interactifs. Améliorons notre formulaire.
1. Ajouter un Composant Select
: Le champ "Framework" devrait être une liste déroulante. Ajoutons le composant Select
. Celui-ci est plus complexe et a des dépendances sur d'autres composants.
npx shadcn-ui@latest add select\n
Le CLI est intelligent. Il verra que Select
nécessite un composant Popover
pour fonctionner et vous demandera la permission de l'installer ainsi que ses dépendances. C'est une fonctionnalité fantastique qui vous évite d'avoir à suivre manuellement les dépendances.
2. Intégrer le Composant Select
: Remplacez le Input
pour "Framework" dans src/app/page.tsx
par le nouveau composant Select
.
// Ajoutez ces imports en haut\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from "@/components/ui/select";\n\n// ... à l'intérieur du CardContent\n<div className="grid gap-2">\n <Label htmlFor="framework">Framework</Label>\n <Select>\n <SelectTrigger id="framework">\n <SelectValue placeholder="Select a framework" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value="nextjs">Next.js</SelectItem>\n <SelectItem value="sveltekit">SvelteKit</SelectItem>\n <SelectItem value="astro">Astro</SelectItem>\n <SelectItem value="nuxt">Nuxt.js</SelectItem>\n </SelectContent>\n </Select>\n</div>\n
Rafraîchissez votre navigateur. Vous avez maintenant une liste déroulante de sélection entièrement fonctionnelle et accessible, complète avec des animations et une navigation au clavier appropriée, tout cela grâce à Radix UI qui travaille en coulisses.
3. Ajouter un Feedback Utilisateur avec Toast
: Que se passe-t-il lorsqu'un utilisateur clique sur "Deploy" ? Nous devrions lui donner un feedback. Le composant Toast
est parfait pour cela.
D'abord, ajoutez-le :
npx shadcn-ui@latest add toast\n
Ensuite, pour utiliser les toasts, vous devez ajouter un composant <Toaster />
à votre layout racine afin qu'il puisse être affiché n'importe où dans l'application. Ouvrez src/app/layout.tsx
et modifiez-le :
import { Toaster } from "@/components/ui/toaster" // Importer le Toaster\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang="en">\n <body>\n {children}\n <Toaster /> {/* L'ajouter ici, juste avant de fermer le body */}\n </body>\n </html>\n )\n}\n
Maintenant, nous avons besoin d'un moyen de déclencher le toast. Nous utiliserons le hook useToast
. Mettons à jour src/app/page.tsx
pour en faire un composant client et gérer le clic sur le bouton.
'use client'; // <-- Ajouter ceci tout en haut du fichier\n\n// ... autres imports\nimport { useToast } from "@/components/ui/use-toast";\n\nexport default function Home() {\n const { toast } = useToast(); // Obtenir la fonction toast depuis le hook\n\n function handleDeploy() {\n toast({\n title: "Deployment Scheduled!",\n description: "Your project 'Name of your project' is being deployed.",\n duration: 5000,\n });\n }\n\n return (\n <main className="flex min-h-screen items-center justify-center bg-background p-8">\n <Card className="w-full max-w-md">\n {/* ... CardHeader et CardContent ... */}\n <CardFooter>\n <Button className="w-full" onClick={handleDeploy}> {/* Ajouter le gestionnaire onClick */}\n Deploy\n </Button>\n </CardFooter>\n </Card>\n </main>\n );\n}\n
Maintenant, lorsque vous cliquez sur le bouton "Deploy", une notification élégante apparaîtra dans le coin de votre écran.
Construire un Formulaire Professionnel avec Validation
La plupart des applications réelles nécessitent une gestion robuste des formulaires, y compris la validation côté client. La manière officielle de gérer cela avec Shadcn UI est de le combiner avec react-hook-form
pour la gestion de l'état et zod
pour la validation du schéma. Construisons-le.
Étape 6 : Installer les Dépendances de Formulaire
Tout d'abord, installons les bibliothèques nécessaires :
npm install react-hook-form zod @hookform/resolvers\n
react-hook-form
: Une bibliothèque de formulaires performante, flexible et extensible.zod
: Une bibliothèque de déclaration et de validation de schéma axée sur TypeScript.@hookform/resolvers
: Une bibliothèque passerelle permettant àreact-hook-form
d'utiliserzod
pour la validation.
Étape 7 : Ajouter le Composant Form
de Shadcn
Shadcn UI fournit un composant spécial Form
qui agit comme un wrapper pour connecter de manière transparente react-hook-form
avec vos composants d'interface utilisateur.
npx shadcn-ui@latest add form\n
Cela ajoutera src/components/ui/form.tsx
. Ce fichier fournit un ensemble de composants sensibles au contexte (Form
, FormField
, FormItem
, FormLabel
, FormControl
, FormDescription
, FormMessage
) qui réduisent considérablement le code passe-partout.
Étape 8 : Créer le Schéma de Validation
Dans votre fichier src/app/page.tsx
, définissons la structure et les règles de nos données de formulaire en utilisant zod
.
// Ajouter ces imports en haut\nimport { z } from "zod";\nimport { zodResolver } from "@hookform/resolvers/zod";\nimport { useForm } from "react-hook-form";\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from "@/components/ui/form";\n
Maintenant, créons le schéma juste au-dessus de notre composant Home
:
const formSchema = z.object({\n projectName: z.string().min(2, {\n message: "Le nom du projet doit contenir au moins 2 caractères.",\n }).max(50, {\n message: "Le nom du projet ne doit pas dépasser 50 caractères.",\n }),\n framework: z.string({\n required_error: "Veuillez sélectionner un framework à afficher.",\n }),\n});\n
Ce schéma définit deux champs : projectName
doit être une chaîne de caractères entre 2 et 50 caractères, et framework
est une chaîne de caractères requise.
Étape 9 : Connecter le Formulaire
Maintenant, refactorisons notre composant Home
pour utiliser tous ces nouveaux outils.
export default function Home() {\n const { toast } = useToast();\n\n // 1. Définir votre formulaire.\n const form = useForm<z.infer<