Item
Une 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/item.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/item.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Donnez un tone au média de type icône pour des tuiles colorées comme dans les Réglages d’iOS, ou laissez-le non défini pour une tuile neutre. Un élément devient interactif lorsqu’il est rendu comme lien, bouton ou label via render. Seulement alors il reçoit des styles de survol, d’appui et de focus : les lignes statiques ne font donc jamais semblant d’être cliquables.
Groupé
variant="grouped" place les éléments sur une même surface. Les séparateurs sont tracés pour vous et alignés sur le texte, la première et la dernière ligne portent les coins extérieurs, et les séparateurs voisins d'une ligne survolée ou focalisée s'estompent.
Surbrillance au survol
Les éléments interactifs d’un groupe partagent une seule surbrillance qui glisse vers la ligne sous le pointeur et reprend ses coins. Elle ne suit qu’une souris ou un stylet, jamais le toucher, et se désactive avec highlight={false}. Les coins des médias image sont concentriques à la ligne.
Sélectionnable
Rendez un élément comme un <label> autour d'une Checkbox et toute la ligne la bascule. Un contrôle coché, ou aria-selected, aria-checked ou aria-pressed sur l'élément, marque la ligne comme sélectionnée.
Variantes
default n'a pas de surface, outline trace un filet et muted repose sur un fond doux.
Tailles
size adapte ensemble le padding, l'espacement, le rayon des coins et le média. Un groupe resserre son espacement en conséquence.
Avatar
Le <ItemMedia /> par défaut se contente de centrer son contenu : un Avatar ou un AvatarGroup s'y intègre directement.
Contacts
Une liste groupée de personnes. Les séparateurs commencent là où commence le texte, quel que soit le contenu de l’emplacement du média, de sorte qu’ils s’alignent sous les noms.
Actions
<ItemActions /> place des boutons à la fin de la ligne. Gardez l’élément lui-même statique lorsqu’il contient des boutons, pour qu’il n’y ait jamais de bouton dans un lien.
En-tête et pied de page
<ItemHeader /> et <ItemFooter /> occupent une ligne entière au-dessus et en dessous du contenu.
Separator
Dans un groupe par défaut, placez vous-même un <ItemSeparator /> entre les éléments.
Contenu long
Les titres sont limités à une ligne et les descriptions à deux. Les chaînes sans espace passent à la ligne au lieu d'élargir la ligne.
De droite à gauche
Le padding, les retraits des séparateurs et le chevron suivent le sens de lecture.
| Touche | Action |
|---|---|
| Tab | Passe à l’élément interactif suivant, dans l’ordre du source comme n’importe quel lien ou bouton. |
| Enter | Suit un élément lien ou actionne un élément bouton. |
| Space | Appuie sur un élément bouton ou bascule un élément label. |
- Un groupe est une liste lorsque ses éléments sont de simples lignes. Les éléments rendus en liens ou en boutons gardent leur propre rôle, et le groupe abandonne le rôle de liste pour que le balisage reste valide. Rendez le groupe comme
<ul>et les éléments comme<li>enveloppant des liens si vous voulez les deux. <ItemMedia variant="icon" />et le chevron sont masqués aux lecteurs d’écran. Donnez aux images un vrai texte alt lorsqu’elles portent du sens.- La surbrillance est purement décorative. Le focus clavier affiche l'anneau de focus, et la surbrillance ne déplace jamais le focus ni ne modifie l'ordre de tabulation.
Chaque partie rend un <div> par défaut et accepte render ainsi que les attributs de son élément.
| Prop | Type | Par défaut |
|---|---|---|
variant | "default" | "outline" | "muted" | "default" |
size | "default" | "sm" | "xs" | "default" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="item" | Ciblez les items en CSS. |
data-variant | La variante actuelle. |
data-size | La taille actuelle. |
data-interactive | Présent quand l'élément est rendu comme un lien, un bouton ou un label. |
data-highlighted | Présent tant que la surbrillance de groupe est sur l'élément. |
--item-radius | Rayon des coins. Les coins du média en dérivent. Défini par size. |
--item-px / --item-py / --item-gap | Remplissage et écart. Défini par size. |
--item-media-size | Taille des médias icône et image. Définie par size. |
--item-inset | Point de départ d'un séparateur groupé. Calculé pour s'aligner avec ItemContent, quel que soit le média. |
| Prop | Type | Par défaut |
|---|---|---|
variantgrouped place les éléments sur une même surface avec des séparateurs automatiques. | "default" | "grouped" | "default" |
highlightAffiche une seule surbrillance qui glisse entre les éléments interactifs au survol. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="item-group" | Ciblez les groupes en CSS. |
data-variant | La variante actuelle. |
data-highlight | Présent quand la surbrillance au survol est activée. |
--item-group-radius | Rayon des coins d’une surface groupée. Le premier et le dernier élément le suivent. |
data-slot="item-highlight" | L'élément de surbrillance, avec data-visible et data-pressed. |
| Prop | Type | Par défaut |
|---|---|---|
varianticon place l'icône sur une pastille et la masque aux lecteurs d'écran. image recadre en carré. Les deux ont des coins concentriques à l'élément. | "default" | "icon" | "image" | "default" |
toneAvec la variante icon, remplit la pastille d'une couleur unie et rend l'icône blanche, comme les Réglages d'iOS. Laissez-le non défini pour une pastille neutre. | "gray" | "red" | "orange" | "yellow" | "green" | "teal" | "sky" | "blue" | "indigo" | "purple" | "pink" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="item-media" | Cible le média en CSS. |
data-variant | La variante actuelle. |
data-tone | La couleur de la pastille, quand tone est défini sur une icône. |
--item-media-tone | La couleur de la pastille. Indiquez n'importe quelle couleur pour une teinte personnalisée. |
| Attribut | Description |
|---|---|
data-slot="item-content" | Grandit pour remplir la ligne. Un second bloc de contenu épouse son texte. |
| Attribut | Description |
|---|---|
data-slot="item-title" | Limité à une ligne. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Attribut | Description |
|---|---|
data-slot="item-description" | Limité à deux lignes. |
| Attribut | Description |
|---|---|
data-slot="item-actions" | Ciblez les actions en CSS. |
| Attribut | Description |
|---|---|
data-slot="item-header" | Une ligne pleine largeur au-dessus du contenu. |
data-slot="item-footer" | Une ligne pleine largeur sous le contenu. |
Un chevron final qui se décale dans le sens de lecture lorsque son élément est survolé. Accepte toutes les props d’icône Tabler.
| Attribut | Description |
|---|---|
data-slot="item-chevron" | Cible le chevron en CSS. |
| Attribut | Description |
|---|---|
data-slot="item-separator" | Un filet fin avec role="separator". |
- 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.
- 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.
- CardUne surface pour regrouper du contenu, avec trois variantes, médias bord à bord, rayons concentriques et liens sur toute la carte.
- 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.