Que fait shadcn-svelte ?
Un cadre pour construire des interfaces utilisateur, des composants et des systèmes de design pour Svelte. Les composants sont ajoutés sous forme de code source dans le projet de l'utilisateur via la CLI.
IMPORTANT : Exécutez toutes les commandes CLI en utilisant le gestionnaire de paquets du projet :
npx shadcn-svelte@latest,pnpm dlx shadcn-svelte@latest, oubunx --bun shadcn-svelte@latest— selon le gestionnaire de paquets utilisé. Les exemples ci-dessous utilisentnpx shadcn-svelte@latestmais remplacez par la bonne commande pour le projet.
Contexte actuel du projet
Lisez components.json à la racine du projet et, lorsque vous avez besoin de la structure des fichiers en direct, listez le répertoire donné par le chemin aliases.ui (résolu avec les mêmes règles que la CLI).
Imports (Svelte)
Chaque composant réside dans son propre dossier avec un fichier baril index.ts. Suivez la documentation d'installation :
- Composants multi-parties (dialog, select, card, field, tabs, …) :
import * as Dialog from "$lib/components/ui/dialog"puisDialog.Content,Dialog.Title,Card.Root,Card.Header, etc. — selon ce que le baril exporte (noms courts et/ou aliasRoot as …). - Barils à composant unique (un seul composant significatif dans le dossier) : imports nommés —
import { Button } from "$lib/components/ui/button"et<Button>, pasimport * as Button+Button.Root. Même modèle pour{ Input },{ Badge },{ Spinner },{ Checkbox },{ Separator },{ Skeleton }, etc.
import * as Dialog from "$lib/components/ui/dialog";
import { Button } from "$lib/components/ui/button";
import { Separator } from "$lib/components/ui/separator";
Utilisez les vrais alias de components.json (souvent $lib/components/ui/...), pas de chemins codés en dur.
Principes
- Utilisez d'abord les composants existants. Exécutez
npx shadcn-svelte@latest addsans arguments pour parcourir les composants disponibles, ou consultez Composants avant d'écrire une UI personnalisée. - Composez, ne réinventez pas. Page de paramètres = Tabs + Card + contrôles de formulaire. Tableau de bord = Sidebar + Card + Chart + Table.
- Utilisez les variantes intégrées avant les styles personnalisés.
variant="outline",size="sm", etc. - Utilisez des couleurs sémantiques.
bg-primary,text-muted-foreground— jamais de valeurs brutes commebg-blue-500.
Règles critiques
Ces règles sont toujours appliquées. Chacune renvoie à un fichier avec des paires de code Incorrect/Correct.
Style & Tailwind → styling.md
classpour la mise en page, pas pour le style. Ne remplacez jamais les couleurs ou la typographie des composants.- Pas de
space-x-*ouspace-y-*. Utilisezflexavecgap-*. Pour les empilements verticaux,flex flex-col gap-*. - Utilisez
size-*lorsque la largeur et la hauteur sont égales.size-10pasw-10 h-10. - Utilisez le raccourci
truncate. Pasoverflow-hidden text-ellipsis whitespace-nowrap. - Pas d'écrasements manuels de couleurs
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 template literals. - Pas de
z-indexmanuel sur les composants de superposition. Dialog, Sheet, Popover, etc. gèrent leur propre empilement.
Formulaires & Saisies → forms.md
- Les formulaires utilisent
Field.FieldGroup+Field.Field. N'utilisez jamais dedivbrut avecspace-y-*ougrid gap-*pour la mise en page du formulaire. InputGrouputiliseInputGroup.Input/InputGroup.Textarea. Jamais deInput/Textareabrut à l'intérieur deInputGroup.Root.- Les boutons dans les saisies utilisent
InputGroup.Root+InputGroup.Addon. - Les ensembles d'options (2–7 choix) utilisent
ToggleGroup. Ne bouclez pas surButtonavec un état actif manuel. Field.FieldSet+Field.FieldLegendpour regrouper des cases à cocher/boutons radio associés. N'utilisez pas dedivavec un titre.- La validation des champs utilise
data-invalid+aria-invalid.data-invalidsurField,aria-invalidsur le contrôle. Pour désactivé :data-disabledsurField,disabledsur le contrôle.
Structure des composants → composition.md
- Les éléments sont toujours dans leur Groupe.
Select.Item→Select.Group.DropdownMenu.Item→DropdownMenu.Group.Command.Item→Command.Group. - Déclencheurs personnalisés. Enveloppez les contrôles dans
Dialog.Trigger/AlertDialog.Trigger, ou contrôlez l'état ouvert avecbind:opensur la racine — consultez la documentation du composant. - Dialog, Sheet et Drawer ont toujours besoin d'un Titre.
Dialog.Title,Sheet.Title,Drawer.Titlerequis pour l'accessibilité. Utilisezclass="sr-only"si caché visuellement. - Utilisez la composition complète de Card.
Card.Header/Card.Title/Card.Description/Card.Content/Card.Footer. Ne mettez pas tout dansCard.Content. - Button n'a pas de
isPending/isLoading. Composez avecSpinnerà l'intérieur deButton+disabled; utilisezdata-icon="inline-start"/inline-endsurSpinnerpour un espacement correct (import { Button },import { Spinner }). Tabs.Triggerdoit être à l'intérieur deTabs.List. Ne rendez jamais les déclencheurs directement dansTabs.Avatara toujours besoin deAvatar.Fallback. Pour quand l'image ne se charge pas.
Utilisez les composants, pas le balisage personnalisé → composition.md
- Utilisez les composants existants avant le balisage personnalisé. Vérifiez si un composant existe avant d'écrire un
divstylisé. - Les encadrés utilisent
Alert. Ne construisez pas dedivstylisés personnalisés. - Les états vides utilisent
Empty. Ne construisez pas de balisage d'état vide personnalisé. - Toast via
svelte-sonner. Utiliseztoast()desvelte-sonneravec le composant Sonner de votre dossier UI. - Utilisez
Separatorau lieu de<hr>ou d'undivavec des classes de bordure uniquement. - Utilisez
Skeletonpour les espaces réservés de chargement. Pas dedivanimate-pulsepersonnalisé. - Utilisez
Badgeau lieu despanstylisés personnalisés.
Icônes → icons.md
- Les icônes dans
<Button>utilisentdata-icon.data-icon="inline-start"oudata-icon="inline-end"sur l'icône. - Pas de classes de dimensionnement sur les icônes dans les composants. Les composants gèrent la taille des icônes via CSS. Pas de
size-4ouw-4 h-4. - Passez les icônes en tant que composants. Importez depuis la
iconLibraryconfigurée (par ex.@lucide/svelte), pas de clés de chaîne.
CLI
- Préréglages — copiez la chaîne encodée du générateur de système de design sur shadcn-svelte.com et passez-la à
npx shadcn-svelte@latest init --preset <code>.
Modèles clés
Voici les modèles les plus courants qui différencient le code shadcn-svelte correct. Pour les cas particuliers, consultez les fichiers de règles liés ci-dessus.
<script lang="ts">
import * as Field from "$lib/components/ui/field";
import { Input } from "$lib/components/ui/input";
import { Button } from "$lib/components/ui/button";
import SearchIcon from "@lucide/svelte/icons/search";
import { Badge } from "$lib/components/ui/badge";
import * as Avatar from "$lib/components/ui/avatar";
</script>
<!-- Mise en page du formulaire : Field.FieldGroup + Field.Field, pas div + Label. -->
<Field.FieldGroup>
<Field.Field>
<Field.FieldLabel for="email">Email</Field.FieldLabel>
<Input id="email" />
</Field.Field>
</Field.FieldGroup>
<!-- Validation : data-invalid sur Field, aria-invalid sur le contrôle. -->
<Field.Field data-invalid>
<Field.FieldLabel for="email">Email</Field.FieldLabel>
<Input id="email" aria-invalid />
<Field.FieldDescription>Email invalide.</Field.FieldDescription>
</Field.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 class="flex flex-col gap-4"></div>
<!-- Dimensions égales : size-*, pas w-* h-*. -->
<Avatar.Root class="size-10">
<Avatar.Image src="/u.png" alt="Utilisateur" />
<Avatar.Fallback>U</Avatar.Fallback>
</Avatar.Root>
<!-- Couleurs d'état : variantes Badge ou tokens sémantiques, pas de couleurs brutes. -->
<Badge variant="secondary">+20,1%</Badge>
Sélection des composants
| Besoin | Utilisation |
|---|---|
| Bouton/action | Button avec la variante appropriée (import { Button }) |
| Saisies de formulaire | Input, Select, Combobox, Switch, Checkbox, RadioGroup, Textarea, InputOTP, Slider |
| Basculer entre 2–5 options | ToggleGroup.Root + ToggleGroup.Item |
| Affichage de données | Table, Card, Badge, Avatar |
| Navigation | Sidebar, NavigationMenu, Breadcrumb, Tabs, Pagination |
| Superpositions | Dialog (modal), Sheet (panneau latéral), Drawer (feuille inférieure), AlertDialog (confirmation) |
| Feedback | svelte-sonner (toast), Alert, Progress, Skeleton, Spinner |
| Palette de commandes | Command dans Dialog |
| Graphiques | Chart (LayerChart) |
| Mise en page | Card, Separator, Resizable, ScrollArea, Accordion, Collapsible |
| États vides | Empty |
| Menus | DropdownMenu, ContextMenu, Menubar |
| Info-bulles/info | Tooltip, HoverCard, Popover |
Champs clés
Utilisez components.json et le système de fichiers — pas une commande info séparée :
aliases→ utilisez le préfixe d'alias réel de la configuration (par ex.$lib/), ne codez jamais en dur des projets non liés.tailwind.css→ le fichier CSS global où résident les variables de thème. Modifiez ce fichier pour les réglages de thème ; n'ajoutez pas de second fichier global sauf si l'utilisateur en utilise déjà un.style→ le traitement visuel (par ex.nova,vega, …) et le chemin du style du registre.iconLibrary→ détermine les paquets d'icônes (@lucide/svelte,@tabler/icons-svelte, etc.). Ne supposez jamais@lucide/svelte.registry→ où la CLI récupère les composants ; registre officiel par défaut surshadcn-svelte.com.resolvedPaths(conceptuel) → la CLI résoutaliasesen chemins absolus ; listezaliases.uisur le disque pour voir les composants installés.
Voir cli.md pour les commandes et les drapeaux.
Documentation, exemples et utilisation des composants
Ouvrez https://shadcn-svelte.com/docs/components/<name>.md pour la documentation et les exemples. Lors de la création, correction, débogage ou utilisation d'un composant, lisez d'abord la page officielle afin de suivre les API documentées.
Flux de travail
- Obtenez le contexte du projet — lisez
components.jsonet listez le répertoire des composants UI lorsque nécessaire. - Vérifiez d'abord les composants installés — avant d'exécuter
add, listez les fichiers sous le cheminuirésolu. N'importez pas de composants qui n'ont pas été ajoutés, et ne ré-ajoutez pas ceux déjà présents sauf pour une mise à jour. - Découvrez les composants —
npx shadcn-svelte@latest addsans arguments (liste interactive), ou le site de documentation. - Installez ou mettez à jour —
npx shadcn-svelte@latest add <name>ou une URL de registre. Pour rafraîchir les fichiers existants depuis le registre, utiliseznpx shadcn-svelte@latest update(voir cli.md). - Corrigez les imports dans les éléments ajoutés par des tiers/URL — Après avoir ajouté depuis une URL de registre personnalisée, vérifiez les chemins codés en dur qui ne correspondent pas aux
aliasesdu projet. Réécrivez les imports pour utiliser les aliasui/libdu projet depuiscomponents.json. - Passez en revue les composants ajoutés — Après l'ajout, lisez les fichiers ajoutés et vérifiez la composition (groupes, titres, attributs de validation). Alignez les imports d'icônes avec
iconLibrary. - Éléments de registre distant — L'ajout par URL est explicite ; si l'utilisateur souhaite un composant d'une source inconnue, confirmez l'URL du registre ou l'élément avant d'exécuter
add.
Systèmes de design à partir de DESIGN.md
Lorsque l'utilisateur demande un système de design à partir d'un DESIGN.md (ou d'un cahier des charges de marque), avec ou sans préréglage, suivez design-system.md de bout en bout :
- Pour une nouvelle application, créez SvelteKit avec
npx sv create <app>(ou Svelte + Vite si demandé), puis initialisez avecnpx shadcn-svelte@latest init --preset <code>. Sans code, choisissez un style qui correspond au DESIGN.md et passez son nom, par ex.init --preset luma; les codes de préréglage React et les drapeaux de création ne s'appliquent pas. Dans une application existante, préservez les personnalisations locales. - Installez tous les composants avec
add --all --yesdans une nouvelle application ; ajoutez uniquement les composants manquants dans une application existante. - Lisez le frontmatter du DESIGN.md, les À faire et À ne pas faire, et les Lacunes connues avant d'éditer.
- Mappez ses tokens sur les variables dans
tailwind.cssdecomponents.json. Fixez l'échelle de rayon, les ombres, les polices et les utilitairestype-*. - Restylez les variantes installées de
tailwind-variantset le CSS de style associé. Modifiez les hauteurs des contrôles ensemble. - Construisez la page selon design-system-page.md : rôles de couleur vérifiés pour le contraste, spécimens typographiques, matrices d'état épinglées, cas particuliers, paires faire/ne pas faire, recettes. Vérifiez les imports avec
scripts/showcase-coverage.mjs, puis vérifiez que chaque composant s'affiche. - Vérifiez dans un navigateur :
svelte-check, build de production incluant SSR, aucune erreur dans la console, chargement en haut de page, pas de débordement horizontal, mode sombre.
Mise à jour des composants
Utilisez la commande update pour récupérer les dernières versions du registre des composants déjà présents dans le projet. Examinez les modifications avec git diff après update.
- Validez ou mettez de côté le travail local.
- Exécutez
npx shadcn-svelte@latest update [component]ou--all. - Résolvez les conflits de fusion si vous avez personnalisé des fichiers.
- N'utilisez jamais
--overwritesuraddsans l'approbation explicite de l'utilisateur lorsque cela détruirait des modifications intentionnelles.
Référence rapide
# Initialiser shadcn-svelte dans un projet
npx shadcn-svelte@latest init
# Initialiser avec un préréglage
npx shadcn-svelte@latest init --preset <code>
# Ajouter des composants
npx shadcn-svelte@latest add
npx shadcn-svelte@latest add button
npx shadcn-svelte@latest add https://exemple.com/registre/button.json
# Ajouter tous les composants
npx shadcn-svelte@latest add --all
# Mettre à jour les composants
npx shadcn-svelte@latest update
npx shadcn-svelte@latest update button
npx shadcn-svelte@latest update --all