Item
Uma linha de mídia, texto e ações para listas, configurações e seletores, com uma superfície agrupada e um destaque de hover que desliza entre as linhas.
pnpm dlx shadcn@latest add https://hextaui.com/r/item.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/item.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Dê à mídia de ícone um tone para blocos coloridos como os do Ajustes do iOS, ou deixe sem definir para um bloco neutro. Um item se torna interativo quando é renderizado como link, botão ou label por meio de render. Só então ele ganha estilos de hover, pressionado e foco, para que linhas estáticas nunca finjam ser clicáveis.
Agrupado
variant="grouped" coloca os itens em uma única superfície. Os separadores são desenhados para você e recuados até o texto, a primeira e a última linha ficam com os cantos externos, e os separadores ao lado de uma linha com hover ou foco desaparecem.
Destaque ao passar o mouse
Os itens interativos de um grupo compartilham um único destaque que desliza até a linha sob o ponteiro e assume seus cantos. Ele só acompanha mouse ou caneta, nunca toque, e é desativado com highlight={false}. Os cantos da mídia de imagem são concêntricos com a linha.
Selecionável
Renderize um item como <label> em volta de um Checkbox e a linha inteira o alterna. Um controle marcado, ou aria-selected, aria-checked ou aria-pressed no item, marca a linha como selecionada.
Variantes
default não tem superfície, outline desenha uma linha fina e muted fica sobre um preenchimento suave.
Tamanhos
size escala padding, espaçamento, raio dos cantos e mídia em conjunto. Um grupo reduz o espaçamento para acompanhar.
Avatar
O <ItemMedia /> padrão apenas centraliza o conteúdo, então um Avatar ou AvatarGroup se encaixa direto.
Pessoas
Uma lista agrupada de pessoas. Os separadores começam onde o texto começa, seja o que for que estiver no slot de mídia, então se alinham sob os nomes.
Ações
<ItemActions /> contém botões no fim da linha. Mantenha o próprio item estático quando ele contiver botões, para que nunca haja um botão dentro de um link.
Header e footer
<ItemHeader /> e <ItemFooter /> ocupam uma linha inteira acima e abaixo do conteúdo.
Separator
Em um grupo padrão, coloque você mesmo um <ItemSeparator /> entre os itens.
Conteúdo longo
Os títulos são limitados a uma linha e as descrições a duas. Strings sem quebras são quebradas em vez de alargar a linha.
Da direita para a esquerda
O padding, os recuos do separador e o chevron seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| Tab | Move para o próximo item interativo, na ordem do código-fonte como qualquer link ou botão. |
| Enter | Segue um item de link ou pressiona um item de botão. |
| Space | Pressiona um item de botão ou alterna um item de rótulo. |
- Um grupo é uma lista quando seus itens são linhas simples. Itens renderizados como links ou botões mantêm o próprio role, e o grupo abre mão do role de lista para que a marcação continue válida. Renderize o grupo como
<ul>e os itens como<li>envolvendo links se quiser os dois. <ItemMedia variant="icon" />e o chevron ficam ocultos para leitores de tela. Dê às imagens um texto alt real quando elas carregarem significado.- O destaque é apenas decorativo. O foco do teclado mostra o anel de foco, e o destaque nunca move o foco nem altera a ordem de tabulação.
Cada parte renderiza um <div> por padrão e aceita render e os atributos do seu elemento.
| Prop | Tipo | Padrão |
|---|---|---|
variant | "default" | "outline" | "muted" | "default" |
size | "default" | "sm" | "xs" | "default" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="item" | Selecione itens no CSS. |
data-variant | A variante atual. |
data-size | O tamanho atual. |
data-interactive | Presente quando o item é renderizado como link, botão ou rótulo. |
data-highlighted | Presente enquanto o destaque do grupo está sobre ele. |
--item-radius | Raio dos cantos. Os cantos da mídia derivam dele. Definido por size. |
--item-px / --item-py / --item-gap | Padding e espaço. Definido por size. |
--item-media-size | Tamanho da mídia de ícone e de imagem. Definido por size. |
--item-inset | Onde começa um separador agrupado. Medido para alinhar com ItemContent, qualquer que seja a mídia. |
| Prop | Tipo | Padrão |
|---|---|---|
variantgrouped coloca os itens em uma única superfície com separadores automáticos. | "default" | "grouped" | "default" |
highlightMostre um único destaque que desliza entre os itens interativos ao passar o mouse. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="item-group" | Selecione grupos no CSS. |
data-variant | A variante atual. |
data-highlight | Presente quando o destaque ao passar o mouse está ativado. |
--item-group-radius | Raio dos cantos de uma superfície agrupada. O primeiro e o último item o seguem. |
data-slot="item-highlight" | O elemento de destaque, com data-visible e data-pressed. |
| Prop | Tipo | Padrão |
|---|---|---|
varianticon coloca o ícone em um tile e o oculta dos leitores de tela. image recorta em quadrado. Ambos têm cantos concêntricos com o item. | "default" | "icon" | "image" | "default" |
toneCom a variante icon, preenche o tile com uma cor sólida e deixa o ícone branco, como nos Ajustes do iOS. Deixe sem definir para um tile neutro. | "gray" | "red" | "orange" | "yellow" | "green" | "teal" | "sky" | "blue" | "indigo" | "purple" | "pink" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="item-media" | Seleciona a mídia no CSS. |
data-variant | A variante atual. |
data-tone | A cor do tile, quando tone é definido em um ícone. |
--item-media-tone | A cor do tile. Defina qualquer cor para um tom personalizado. |
| Atributo | Descrição |
|---|---|
data-slot="item-content" | Cresce para preencher a linha. Um segundo bloco de conteúdo se ajusta ao texto. |
| Atributo | Descrição |
|---|---|
data-slot="item-title" | Limitado a uma linha. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Atributo | Descrição |
|---|---|
data-slot="item-description" | Limitado a duas linhas. |
| Atributo | Descrição |
|---|---|
data-slot="item-actions" | Seleciona as ações no CSS. |
| Atributo | Descrição |
|---|---|
data-slot="item-header" | Uma linha de largura total acima do conteúdo. |
data-slot="item-footer" | Uma linha de largura total abaixo do conteúdo. |
Um chevron final que se move um pouco na direção de leitura quando o mouse passa sobre o item. Aceita todas as props de ícone do Tabler.
| Atributo | Descrição |
|---|---|
data-slot="item-chevron" | Seleciona o chevron no CSS. |
| Atributo | Descrição |
|---|---|
data-slot="item-separator" | Uma linha fina com role="separator". |
- MotionAs curvas de easing, as durações e a verificação de movimento reduzido com que todo componente anima, além de hooks para transformações de tamanho e destaques deslizantes.
- AvatarFotos de usuário com fallback de iniciais, badges de status e grupos empilhados que se recolhem em uma contagem.
- BadgeRótulos de status com pontos coloridos, tags removíveis que deslizam até fechar e contagens que rolam até o novo valor.
- CardUma superfície para agrupar conteúdo, com três variantes, mídia de ponta a ponta, raios concêntricos e links no card inteiro.
- ChartGráficos do Recharts com cores do tema, um tooltip e uma legenda que leem os rótulos de uma única configuração, e navegação por teclado com um anel de foco visível.
- Data tableUma tabela para dados reais, com ordenação, busca, seleção de linhas, colunas fixadas, cabeçalho fixo e paginação.