Select
Escolha uma ou mais opções de uma lista que abre no valor atual, com typeahead, grupos e suporte a formulários.
pnpm dlx shadcn@latest add https://hextaui.com/r/select.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/select.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
A lista abre bem sobre o gatilho com a opção atual alinhada sobre o valor, para o olhar nunca perder o lugar. Passe items para que SelectValue mostre rótulos em vez de valores brutos. Para listas longas que precisam de busca, use Combobox.
Tamanhos
size em SelectTrigger combina com as alturas de Input e Button.
Grupos e listas longas
Agrupe opções com SelectGroup e SelectLabel. Listas longas cabem na tela e mostram setas de rolagem que rolam quando você passa o mouse.
Com ícones
Coloque ícones nos itens e passe uma função para SelectValue para mostrar o mesmo ícone no gatilho.
Múltiplo
Com multiple, a lista permanece aberta enquanto você escolhe, e o valor pode resumir seleções longas.
Em um formulário
Dentro de Field, o gatilho recebe seu rótulo, descrição e validação de obrigatório.
Desativado e inválido
Desabilite o select inteiro ou opções individuais, e marque-o como inválido com aria-invalid.
Abaixo do gatilho
alignItemWithTrigger={false} abre a lista sob o gatilho como um menu. A entrada por toque faz isso automaticamente.
Da direita para a esquerda
O gatilho, a lista e o check seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| SpaceEnter↓↑ | Abre a lista a partir do gatilho. |
| ↓↑ | Move entre as opções. |
| HomeEnd | Move para a primeira ou a última opção. |
| A–Z | Salta para a próxima opção que começa com o texto digitado. |
| EnterSpace | Escolhe a opção destacada. |
| Esc | Fecha a lista e devolve o foco ao gatilho. |
- Rotule o gatilho com
FieldLabelouaria-label. - Em toque, a lista abre abaixo do gatilho em vez de sobre ele, para seu dedo não cair sobre uma opção.
| Prop | Tipo | Padrão |
|---|---|---|
value | Value | Value[] | null | – |
defaultValue | Value | Value[] | null | – |
onValueChange | (value, details) => void | – |
itemsPermite que SelectValue mostre rótulos. | Record<string, ReactNode> | { value, label }[] | – |
multiple | boolean | false |
name | string | – |
required | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
| Prop | Tipo | Padrão |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="select-trigger" | O gatilho, com data-size. |
data-popup-open | Presente enquanto a lista está aberta. |
data-placeholder | Presente enquanto nada está escolhido. |
| Prop | Tipo | Padrão |
|---|---|---|
placeholder | ReactNode | – |
childrenFormata o valor exibido. | ReactNode | (value) => ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
alignItemWithTriggerAbre sobre o gatilho com a opção atual alinhada. | boolean | true |
sideQuando não está alinhado com o gatilho. | "top" | "bottom" | … | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Atributo | Descrição |
|---|---|
data-slot="select-content" | O popup. |
data-side="none" | Presente enquanto alinhado sobre o gatilho. |
| Prop | Tipo | Padrão |
|---|---|---|
value | Value | – |
disabled | boolean | false |
labelTexto para o typeahead. | string | – |
| Atributo | Descrição |
|---|---|
data-selected | A opção escolhida. |
data-highlighted | A opção com foco. |
data-disabled | A opção está desabilitada. |
- CalendarUma grade de datas para seleção única, de intervalo e múltipla, com meses deslizantes, prévias de intervalo e dias com tamanho adequado ao toque.
- CheckboxUma caixa de seleção cujo check é desenhado na tela, com pais indeterminados, grupos e rótulos que compartilham seu hover.
- ComboboxUm select filtrável com chips, grupos e resultados assíncronos, em um popup que se redimensiona conforme você digita.
- Date pickerUm botão que abre um calendário em um popover, ou em um bottom sheet no celular, para datas únicas e intervalos.
- FieldRótulos, descrições e erros ligados ao seu controle, com estados de validação e layouts para formulários.
- InputUm campo de texto com três tamanhos, estados inválido e somente leitura, estilo de validação nativa e fonte de 16px no toque para que os celulares nunca façam zoom.
Usado em blocos
Blocos que se baseiam em Select.
- API keysA página de chaves de API de um produto de IA, como nos consoles da OpenAI e da Anthropic. Crie chaves com permissões restritas e uma expiração, veja o segredo uma única vez com uma cópia que confirma, revogue com desfazer, renomeie no próprio lugar, faça a rotação com um período de tolerância e veja o uso por chave.
- NotificationsA seção Notificações das configurações de um produto de IA. Uma grade de canal por evento com alternadores por linha, por coluna e geral, horário de silêncio com uma linha ao vivo do próximo silêncio, um resumo por e-mail, envios de teste reais para desktop, e-mail, push e Slack, tratamento da permissão do navegador e um fluxo de conexão com o Slack. Encaixa em qualquer seção de Configurações.