Alert
Des messages en ligne pour le statut et les retours, avec une surface neutre, une icône colorée et une fermeture qui se replie en douceur.
pnpm dlx shadcn@latest add https://hextaui.com/r/alert.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/alert.tsx components/ui/button.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Variantes
variant colore uniquement l’icône : la surface reste neutre et l’état se lit d’un coup d’œil sans crier.
Soft
appearance="soft" supprime la bordure et teinte toute la surface de la couleur de la variante.
Contenu partiel
Titre seul, description seule et absence d’icône s’alignent sans classes supplémentaires. La grille place chaque partie dans sa propre colonne.
Actions
Placez des boutons dans <AlertAction />. Ils s’alignent sur la première ligne du titre, même lorsqu’il passe à la ligne.
Fermable
Ajoutez <AlertClose /> pour permettre de la fermer. L’alerte se replie en douceur et le contenu en dessous remonte. Fermez-la au clavier et le focus passe au contrôle suivant, ici « Reset ».
Contrôlé
Passez open et onOpenChange pour la piloter depuis votre propre état. L’animation joue à l’ouverture comme à la fermeture.
Annuler une fermeture
Appelez event.preventDefault() dans le onClick du bouton de fermeture pour garder l’alerte ouverte, par exemple pour demander d’abord une confirmation.
Insérée après le chargement
Les alertes montées après le chargement de la page apparaissent en fondu avec un glissement, et les lecteurs d’écran les annoncent. Celles déjà présentes dans le HTML serveur apparaissent sans animation.
Contenu riche
Les icônes et liens en ligne dans la description conservent leur propre style. Utilisez render pour donner un niveau de titre au titre.
De droite à gauche
L’icône, le contenu et le bouton de fermeture s’inversent avec le sens de lecture.
| Touche | Action |
|---|---|
| Tab | Déplace le focus vers les liens, les actions et le bouton de fermeture de l’alerte. |
| EnterSpace | Active le bouton de fermeture ayant le focus. Une fois l’alerte repliée, le focus passe à l’élément focusable suivant, ou au précédent s’il n’y en a pas après. |
- Les alertes
destructiveetwarningreçoiventrole="alert"et sont annoncées immédiatement. Toutes les autres variantes reçoiventrole="status"et attendent une pause. - Le bouton de fermeture est étiqueté « Dismiss ». Passez
aria-labelpour le traduire. - Le focus n’est jamais perdu lorsqu’une alerte qui l’a se ferme.
- Avec la réduction des animations, les alertes apparaissent et disparaissent instantanément.
Chaque partie accepte les attributs de l’élément qu’elle rend. Les variantes sont exportées sous alertVariants pour styliser d’autres éléments de la même façon.
| Prop | Type | Par défaut |
|---|---|---|
variantColore l’icône. destructive et warning sont annoncées de manière assertive. | "default" | "destructive" | "success" | "info" | "warning" | "default" |
appearance | "outline" | "soft" | "outline" |
open | boolean | – |
defaultOpen | boolean | true |
onOpenChangeAppelé lorsque le bouton de fermeture est pressé. | (open: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="alert" | Ciblez l’alerte en CSS. |
data-variant | La variante actuelle. |
data-appearance | L’apparence actuelle. |
data-ending-style | Présent pendant que l’alerte se replie après une fermeture. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="alert-title" | Ciblez les titres en CSS. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="alert-description" | Ciblez les descriptions en CSS. Les liens simples à l’intérieur sont soulignés pour vous. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="alert-action" | Ciblez la zone d’actions en CSS. |
Un <Button /> ghost qui ferme l’alerte la plus proche. Il accepte toutes les props de Button et doit être utilisé dans <Alert />.
| Prop | Type | Par défaut |
|---|---|---|
aria-label | string | "Dismiss" |
children | ReactNode | <IconX /> |
onClickAppelez event.preventDefault() pour garder l’alerte ouverte. | (event: MouseEvent) => void | – |
| Attribut | Description |
|---|---|
data-slot="alert-close" | Ciblez le bouton de fermeture en CSS. |
- ButtonDes boutons dans toutes les variantes et tailles, avec un flux de chargement, de succès et d’erreur intégré qui évite le spinner pour les requêtes rapides.
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- EmptyUn espace réservé pour les écrans sans contenu à afficher, avec une icône, un message et l’action suivante.
- ProgressUne barre ou un anneau qui montre l’avancement d’une tâche, s’adoucit entre les mises à jour et glisse tant que le total est inconnu.
- SkeletonDes placeholders qui attendent 150ms avant de s’afficher, prennent la taille exacte du contenu qu’ils enveloppent et l’affichent en fondu sans rien déplacer.
- SpinnerUn indicateur de chargement avec des graduations façon Apple ou un anneau qui respire, pouvant attendre avant de s’afficher et rester assez longtemps pour ne pas clignoter.
Utilisé dans les blocks
Des blocks qui s’appuient sur Alert.
- BillingForfait et utilisation pour un produit d’IA, dans le style de Cursor, Claude et Vercel. Un compteur d’utilisation réparti par modèle qui projette la fin du cycle et prévient avant la fin des crédits, un graphique quotidien explorable, une limite de dépenses avec des alertes prévisualisables sur le compteur, des changements de forfait avec proratisation exacte, un formulaire de carte avec une vraie validation, et des factures téléchargeables en PDF.
- MarkdownDu Markdown conçu pour les réponses d’IA. Il s’affiche en streaming de façon fluide et ne montre jamais de syntaxe à moitié saisie, avec des titres que l’on peut lier, des tableaux copiables en Markdown ou CSV, des callouts GitHub, des listes de tâches, des notes de bas de page, des images, des citations en ligne et des blocs de code complets.