shadcn/ui
https://ui.shadcn.com/, une bibliothèque d'interface utilisateur pour React.
Notions théoriques
shadcn/ui est une bibliothèque d'interface utilisateur (UI) moderne conçue pour React. Elle repose sur Radix UI comme base de composants et intègre Tailwind CSS pour la personnalisation visuelle. Cette bibliothèque se distingue par son approche modulaire : vous avez un contrôle total sur les composants, qui sont importés directement dans votre codebase.
Contrairement aux bibliothèques traditionnelles, où les composants sont souvent des "boîtes noires", shadcn/ui génère du code que vous pouvez modifier librement. Cela signifie qu’elle est idéale pour les développeurs cherchant un équilibre entre standardisation et flexibilité.
Pourquoi choisir shadcn/ui ?
- Composants accessibles : shadcn/ui utilise Radix UI, garantissant des composants accessibles et conformes aux standards.
- Personnalisation complète : Grâce à Tailwind CSS, chaque composant est entièrement personnalisable.
- Pas de dépendance verrouillée : Les composants sont ajoutés directement à votre projet, vous ne dépendez donc pas de la bibliothèque à long terme.
- Open source : Maintenue par la communauté, elle évolue rapidement avec les besoins des développeurs.
Fonctionnement de shadcn/ui
- Installation guidée : Les composants sont importés individuellement à l’aide d’un CLI.
- Approche modulaire : Seuls les composants nécessaires sont ajoutés, réduisant le poids global de l'application.
- Compatible avec Tailwind CSS : Vous pouvez appliquer vos classes Tailwind préférées ou étendre les styles existants.
Principaux composants disponibles
- Button : Boutons interactifs avec plusieurs variantes (primaire, secondaire, etc.).
- Dialog : Fenêtres modales accessibles.
- Dropdown : Menus déroulants entièrement personnalisables.
- Tabs : Onglets dynamiques et stylisés.
- Toast : Notifications légères et réactives.
Exemple basique : Un bouton
Un bouton simple avec shadcn/ui ressemblerait à ceci :
import { Button } from "@/components/ui/button";
export default function App() {
return <Button variant="primary">Cliquez ici</Button>;
}
Dans cet exemple :
Button
est un composant de shadcn/ui.variant="primary"
applique un style spécifique (défini avec Tailwind CSS).
Exemple pratique
Créer une fenêtre modale avec Dialog
Nous allons implémenter une fenêtre modale interactive.
Code
import { useState } from "react";
import { Dialog, DialogTrigger, DialogContent, DialogTitle, DialogDescription } from "@/components/ui/dialog";
export default function ExempleDialog() {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<Dialog open={isOpen} onOpenChange={setIsOpen}>
<DialogTrigger asChild>
<button className="btn">Ouvrir la fenêtre</button>
</DialogTrigger>
<DialogContent>
<DialogTitle>Bienvenue</DialogTitle>
<DialogDescription>
Ceci est une fenêtre modale simple avec shadcn/ui.
</DialogDescription>
<button className="btn" onClick={() => setIsOpen(false)}>
Fermer
</button>
</DialogContent>
</Dialog>
</div>
);
}
Explications
- Dialog : Le conteneur principal de la fenêtre modale.
- DialogTrigger : L’élément qui déclenche l’ouverture de la fenêtre.
- DialogContent : Le contenu principal de la fenêtre.
- DialogTitle et DialogDescription : Titre et description de la modale.
useState
: Gère l'état de la fenêtre (ouverte ou fermée).
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Construire une barre de navigation avec des onglets dynamiques
Consignes
- Implémentez une barre de navigation avec Tabs pour afficher du contenu dynamique.
- La barre doit contenir trois onglets : Accueil, À propos, et Contact.
- Lorsque l'utilisateur clique sur un onglet, le contenu correspondant s'affiche.
Exemple attendu
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
export default function ExempleTabs() {
return (
<Tabs defaultValue="accueil">
<TabsList>
<TabsTrigger value="accueil">Accueil</TabsTrigger>
<TabsTrigger value="a-propos">À propos</TabsTrigger>
<TabsTrigger value="contact">Contact</TabsTrigger>
</TabsList>
<TabsContent value="accueil">
<p>Bienvenue sur la page d'accueil !</p>
</TabsContent>
<TabsContent value="a-propos">
<p>Voici des informations à propos de nous.</p>
</TabsContent>
<TabsContent value="contact">
<p>Contactez-nous à contact@example.com.</p>
</TabsContent>
</Tabs>
);
}
Une solution
Vous devez être connecté pour voir le contenu.