Item
Eine Zeile aus Medien, Text und Aktionen für Listen, Einstellungen und Auswahlen, mit gruppierter Fläche und einer Hover-Hervorhebung, die zwischen den Zeilen gleitet.
pnpm dlx shadcn@latest add https://hextaui.com/r/item.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/item.tsx lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Gib Icon-Media einen tone für farbige Kacheln wie in den iOS-Einstellungen oder lass ihn weg für eine neutrale Kachel. Ein Eintrag wird interaktiv, wenn er über render als Link, Button oder Label gerendert wird. Nur dann erhält er Hover-, Press- und Fokus-Stile, sodass statische Zeilen nie vorgeben, klickbar zu sein.
Gruppiert
variant="grouped" legt Items auf eine gemeinsame Fläche. Trenner werden automatisch gezeichnet und zum Text eingerückt, die erste und letzte Zeile besitzen die äußeren Ecken, und die Trenner neben einer gehoverten oder fokussierten Zeile blenden aus.
Hover-Hervorhebung
Interaktive Einträge in einer Gruppe teilen sich eine Hervorhebung, die zur Zeile unter dem Zeiger gleitet und deren Ecken übernimmt. Sie folgt nur einer Maus oder einem Stift, nie Touch, und lässt sich mit highlight={false} abschalten. Die Ecken von Bild-Media sind konzentrisch zur Zeile.
Auswählbar
Rendere ein Item als <label> um eine Checkbox, und die ganze Zeile schaltet sie um. Ein aktiviertes Steuerelement oder aria-selected, aria-checked bzw. aria-pressed am Item markiert die Zeile als ausgewählt.
Varianten
default hat keine Fläche, outline zeichnet eine feine Linie und muted liegt auf einer weichen Füllung.
Größen
size skaliert Padding, Abstand, Eckenradius und Media gemeinsam. Eine Gruppe verengt ihren Abstand entsprechend.
Avatar
Das Standard-<ItemMedia /> zentriert nur seinen Inhalt, sodass ein Avatar oder eine AvatarGroup direkt hineinpasst.
Personen
Eine gruppierte Liste von Personen. Trennlinien beginnen dort, wo der Text beginnt, egal was im Media-Slot sitzt, sodass sie unter den Namen fluchten.
Aktionen
<ItemActions /> hält Buttons am Ende der Zeile. Halte den Eintrag selbst statisch, wenn er Buttons enthält, damit nie ein Button in einem Link liegt.
Header und Footer
<ItemHeader /> und <ItemFooter /> nehmen über und unter dem Inhalt eine volle Zeile ein.
Separator
Setze in einer Standardgruppe selbst einen <ItemSeparator /> zwischen die Einträge.
Langer Inhalt
Titel werden auf eine Zeile und Beschreibungen auf zwei Zeilen gekürzt. Ununterbrochene Zeichenketten umbrechen, statt die Zeile zu verbreitern.
Rechts nach links
Padding, Trenner-Einzüge und das Chevron folgen der Leserichtung.
| Taste | Aktion |
|---|---|
| Tab | Wechselt zum nächsten interaktiven Eintrag, in Quellreihenfolge wie jeder Link oder Button. |
| Enter | Folgt einem Link-Eintrag oder drückt einen Button-Eintrag. |
| Space | Betätigt ein Button-Item oder schaltet ein Label-Item um. |
- Eine Gruppe ist eine Liste, wenn ihre Einträge einfache Zeilen sind. Einträge, die als Links oder Buttons gerendert werden, behalten ihre eigene Rolle, und die Gruppe verwirft die Listenrolle, damit das Markup gültig bleibt. Rendere die Gruppe als
<ul>und die Einträge als<li>, die Links umschließen, wenn du beides möchtest. <ItemMedia variant="icon" />und der Chevron sind für Screenreader verborgen. Gib Bildern echten Alt-Text, wenn sie Bedeutung tragen.- Das Highlight ist reine Dekoration. Der Tastaturfokus zeigt den Fokusring, und das Highlight verschiebt weder den Fokus noch ändert es die Tab-Reihenfolge.
Jeder Teil rendert standardmäßig ein <div> und akzeptiert render sowie die Attribute seines Elements.
| Prop | Typ | Standard |
|---|---|---|
variant | "default" | "outline" | "muted" | "default" |
size | "default" | "sm" | "xs" | "default" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="item" | Items in CSS ansprechen. |
data-variant | Die aktuelle Variante. |
data-size | Die aktuelle Größe. |
data-interactive | Vorhanden, wenn das Item als Link, Button oder Label gerendert wird. |
data-highlighted | Vorhanden, solange das Gruppen-Highlight darauf liegt. |
--item-radius | Eckenradius. Die Media-Ecken leiten sich davon ab. Wird durch size gesetzt. |
--item-px / --item-py / --item-gap | Padding und Abstand. Wird durch size gesetzt. |
--item-media-size | Größe von Icon- und Bild-Media. Wird über size gesetzt. |
--item-inset | Wo ein gruppierter Trenner beginnt. Wird gemessen, damit er unabhängig vom Media mit ItemContent fluchtet. |
| Prop | Typ | Standard |
|---|---|---|
variantgrouped legt Items mit automatischen Trennern auf eine gemeinsame Fläche. | "default" | "grouped" | "default" |
highlightZeige ein einzelnes Highlight, das beim Hover zwischen interaktiven Items gleitet. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="item-group" | Gruppen in CSS ansprechen. |
data-variant | Die aktuelle Variante. |
data-highlight | Vorhanden, wenn das Hover-Highlight aktiv ist. |
--item-group-radius | Eckenradius einer gruppierten Fläche. Der erste und der letzte Eintrag folgen ihm. |
data-slot="item-highlight" | Das Highlight-Element, mit data-visible und data-pressed. |
| Prop | Typ | Standard |
|---|---|---|
varianticon setzt das Icon auf eine Kachel und blendet es für Screenreader aus. image schneidet quadratisch zu. Beide haben Ecken, die konzentrisch zum Item verlaufen. | "default" | "icon" | "image" | "default" |
toneMit der Icon-Variante füllt es die Kachel mit einer Volltonfarbe und färbt das Icon weiß, wie in den iOS-Einstellungen. Ohne Angabe bleibt die Kachel neutral. | "gray" | "red" | "orange" | "yellow" | "green" | "teal" | "sky" | "blue" | "indigo" | "purple" | "pink" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="item-media" | Media per CSS ansprechen. |
data-variant | Die aktuelle Variante. |
data-tone | Die Farbe der Kachel, wenn tone bei einem Icon gesetzt ist. |
--item-media-tone | Die Farbe der Kachel. Setze eine beliebige Farbe für einen eigenen Ton. |
| Attribut | Beschreibung |
|---|---|
data-slot="item-content" | Wächst, um die Zeile zu füllen. Ein zweiter Inhaltsblock schmiegt sich an seinen Text. |
| Attribut | Beschreibung |
|---|---|
data-slot="item-title" | Auf eine Zeile begrenzt. |
| Prop | Typ | Standard |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Attribut | Beschreibung |
|---|---|
data-slot="item-description" | Auf zwei Zeilen begrenzt. |
| Attribut | Beschreibung |
|---|---|
data-slot="item-actions" | Die Aktionen in CSS ansprechen. |
| Attribut | Beschreibung |
|---|---|
data-slot="item-header" | Eine Zeile in voller Breite über dem Inhalt. |
data-slot="item-footer" | Eine Zeile in voller Breite unter dem Inhalt. |
Ein nachgestellter Chevron, der sich beim Hovern seines Eintrags in Leserichtung schiebt. Akzeptiert jede Tabler-Icon-Prop.
| Attribut | Beschreibung |
|---|---|
data-slot="item-chevron" | Das Chevron per CSS ansprechen. |
| Attribut | Beschreibung |
|---|---|
data-slot="item-separator" | Eine Haarlinie mit role="separator". |
- MotionDie Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
- AvatarNutzerfotos mit Initialen als Fallback, Statusbadges und gestapelte Gruppen, die zu einer Zahl einklappen.
- BadgeStatuslabels mit farbigen Punkten, entfernbare Tags, die zugleiten, und Zähler, die zu ihrem neuen Wert rollen.
- CardEine Fläche zum Gruppieren von Inhalten, mit drei Varianten, randlosen Medien, konzentrischen Radien und Links über die ganze Karte.
- ChartRecharts-Diagramme mit Theme-Farben, einem Tooltip und einer Legende, die Labels aus einer Konfiguration lesen, und Tastaturnavigation mit sichtbarem Fokusring.
- Data tableEine Tabelle für echte Daten, mit Sortierung, Suche, Zeilenauswahl, fixierten Spalten, Sticky Header und Paginierung.