Card
Une surface pour regrouper du contenu, avec trois variantes, médias bord à bord, rayons concentriques et liens sur toute la carte.
pnpm dlx shadcn@latest add https://hextaui.com/r/card.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 class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/card.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Variantes
default repose sur un anneau très fin avec une ombre douce, outline supprime le fond et l’ombre, et muted utilise une surface pleine pour les sections plus discrètes.
Tailles
size="sm" resserre ensemble l’espacement, le rayon et la taille du titre : une carte compacte fait toujours partie de la même famille. size="flush" supprime l’espacement intérieur pour les mises en page personnalisées, comme les listes et les lignes repliables qui apportent leur propre remplissage.
Média
Une image, une vidéo, une illustration ou un aspect ratio placé en premier ou en dernier va d’un bord à l’autre. La carte supprime le remplissage de ce côté et rogne le média selon ses coins.
Carte cliquable
Placez un <CardLink /> dans le titre pour faire de toute la carte un seul lien. Les boutons et autres contrôles à l’intérieur restent cliquables et gardent leur propre focus, comme l’étoile ici.
Variantes cliquables
Chaque variante reçoit son propre retour au survol dès qu’elle contient un lien, et l’anneau de focus entoure toute la carte lorsque le lien a le focus au clavier.
Bordures
Ajoutez border-b à l’en-tête ou border-t au pied de page et la carte ajoute le remplissage correspondant du côté intérieur.
Imbriqué
Une carte dans CardContent déduit son rayon de celui du parent moins l’espacement : les coins restent concentriques.
Contenu long
Les titres sans coupure, les longues URL, les emoji et le texte CJK passent à la ligne dans une carte étroite au lieu de l’élargir.
Sémantique
Chaque partie prend une prop render : une carte peut donc être un <article> avec un vrai titre, un en-tête et un pied de page.
De droite à gauche
L’action passe au début de la ligne et le pied de page suit le sens de lecture.
Une carte n’est pas focusable d’elle-même. Ces touches s’appliquent lorsqu’elle contient un <CardLink />.
| Touche | Action |
|---|---|
| Tab | Donne le focus au lien de la carte, ce qui dessine l’anneau de focus autour de toute la carte, puis passe à chaque contrôle à l’intérieur. |
| Enter | Suit le lien de la carte. |
- Le nom accessible du lien est son propre texte : gardez donc
<CardLink />dans le titre plutôt que d’envelopper toute la carte dans une ancre. - Les contrôles d’une carte cliquable sont placés au-dessus de la zone de clic du lien : ils restent accessibles au pointeur et au clavier.
- Utilisez
rendersur<CardTitle />pour donner au titre le niveau de titre adapté à votre page.
Chaque partie rend un <div> par défaut, accepte ses attributs et prend une prop render pour remplacer l’élément.
| Prop | Type | Par défaut |
|---|---|---|
variant | "default" | "outline" | "muted" | "default" |
sizeMet à l’échelle ensemble l’espacement, le rayon et la taille du titre. | "default" | "sm" | "flush" | "default" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card" | Ciblez la carte en CSS. |
data-variant | La variante actuelle. |
data-size | La taille actuelle. |
data-link | Présent tant que la carte contient un CardLink. |
--card-spacing | Espacement intérieur partagé par toutes les parties. Défini par la taille. |
--card-radius | Rayon des coins. Les cartes imbriquées déduisent le leur de celui du parent. |
--card-title-size | Taille de police utilisée par CardTitle. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card-header" | Une grille qui place CardAction dans le coin supérieur de fin. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card-title" | Ciblez le titre. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card-description" | Ciblez la description. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card-action" | S’étend sur les lignes du titre et de la description, au-dessus de la zone de clic d’un CardLink. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card-content" | Transmet le rayon et l’espacement de la carte aux cartes imbriquées. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="card-footer" | Ciblez le pied de page. |
| Prop | Type | Par défaut |
|---|---|---|
href | string | – |
renderPassez ici le composant de lien de votre routeur. | ReactElement | (props, state) => ReactElement | <a> |
| Attribut | Description |
|---|---|
data-slot="card-link" | Étend sa zone de clic sur toute la carte. |
- AvatarDes photos d’utilisateurs avec initiales en repli, badges de statut et groupes empilés qui se réduisent en compteur.
- BadgeDes libellés de statut avec pastilles colorées, des tags amovibles qui se referment en glissant et des compteurs qui défilent vers leur nouvelle valeur.
- ChartDes graphiques Recharts aux couleurs du thème, avec une infobulle et une légende qui lisent leurs libellés depuis une seule config, et une navigation au clavier avec anneau de focus visible.
- Data tableUn tableau pour de vraies données, avec tri, recherche, sélection de lignes, colonnes épinglées, en-tête fixe et pagination.
- ItemUne ligne de média, de texte et d’actions pour les listes, réglages et sélecteurs, avec une surface groupée et une surbrillance de survol qui glisse d’une ligne à l’autre.
- KbdDes keycaps pour les raccourcis qui affichent les bons symboles sur chaque plateforme, se lisent correctement à voix haute et s’enfoncent comme de vraies touches.
Utilisé dans les blocks
Des blocks qui s’appuient sur Card.
- Code BlockDes blocs de code conçus pour les réponses d’IA. Coloration syntaxique qui suit le streaming, copie, téléchargement et retour à la ligne, numéros de ligne et lignes surlignées, diffs avec accepter et rejeter, et un terminal pour les commandes.
- Diff ReviewRelisez les modifications d’un agent dans plusieurs fichiers avant qu’elles ne soient appliquées. Une arborescence de fichiers avec compteurs, acceptation ou rejet de chaque changement, de chaque fichier ou de tout, des commentaires sur n’importe quelle ligne ou plage renvoyés à l’agent, des vues unifiée et côte à côte, des surlignages au niveau du mot, l’annulation, des modifications en streaming et un résumé « 4 fichiers modifiés » pour le chat.
- Tool CallsMontrez ce que fait un agent, une ligne par étape. Les lectures et recherches se replient en un court résumé, tandis que les modifications, commandes, approbations et erreurs restent visibles. Chaque étape s’ouvre sur une vraie vue : le fichier, le diff, le terminal ou les résultats. Tous les états d’outil d’AI SDK sont couverts, y compris les approbations avec un motif à donner en échange.