Select
Elige una o varias opciones de una lista que se abre sobre el valor actual, con typeahead, grupos y soporte de formularios.
pnpm dlx shadcn@latest add https://hextaui.com/r/select.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/select.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
La lista se abre justo sobre el trigger con la opción actual alineada encima del valor, para que la vista nunca pierda su sitio. Pasa items para que SelectValue muestre etiquetas en lugar de valores sin procesar. Para listas largas que necesitan búsqueda, usa Combobox.
Tamaños
size en SelectTrigger coincide con las alturas de Input y Button.
Grupos y listas largas
Agrupa las opciones con SelectGroup y SelectLabel. Las listas largas se ajustan a la pantalla y muestran flechas de scroll que desplazan al pasar el cursor.
Con iconos
Pon iconos en los elementos y pasa una función a SelectValue para mostrar el mismo icono en el trigger.
Múltiple
Con multiple, la lista permanece abierta mientras eliges, y el valor puede resumir selecciones largas.
En un formulario
Dentro de Field, el trigger recibe su etiqueta, descripción y validación de obligatorio.
Deshabilitado y no válido
Deshabilita todo el select o solo algunas opciones, y márcalo como no válido con aria-invalid.
Debajo del trigger
alignItemWithTrigger={false} abre la lista debajo del trigger como un menú. La entrada táctil lo hace automáticamente.
De derecha a izquierda
El trigger, la lista y la marca siguen la dirección de lectura.
| Key | Acción |
|---|---|
| SpaceEnter↓↑ | Abre la lista desde el trigger. |
| ↓↑ | Se mueve entre opciones. |
| HomeEnd | Va a la primera o a la última opción. |
| A–Z | Salta a la siguiente opción que empieza por el texto escrito. |
| EnterSpace | Elige la opción resaltada. |
| Esc | Cierra la lista y devuelve el foco al trigger. |
- Etiqueta el trigger con
FieldLabeloaria-label. - En táctil, la lista se abre debajo del trigger en lugar de encima, para que tu dedo no caiga sobre una opción.
| Prop | Tipo | Predeterminado |
|---|---|---|
value | Value | Value[] | null | – |
defaultValue | Value | Value[] | null | – |
onValueChange | (value, details) => void | – |
itemsPermite que SelectValue muestre etiquetas. | 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 | Predeterminado |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descripción |
|---|---|
data-slot="select-trigger" | El trigger, con data-size. |
data-popup-open | Presente mientras la lista está abierta. |
data-placeholder | Presente mientras no hay nada elegido. |
| Prop | Tipo | Predeterminado |
|---|---|---|
placeholder | ReactNode | – |
childrenDa formato al valor mostrado. | ReactNode | (value) => ReactNode | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
alignItemWithTriggerSe abre sobre el trigger con la opción actual alineada. | boolean | true |
sideCuando no está alineado con el trigger. | "top" | "bottom" | … | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Atributo | Descripción |
|---|---|
data-slot="select-content" | El popup. |
data-side="none" | Presente mientras está alineado sobre el trigger. |
| Prop | Tipo | Predeterminado |
|---|---|---|
value | Value | – |
disabled | boolean | false |
labelTexto para el typeahead. | string | – |
| Atributo | Descripción |
|---|---|
data-selected | La opción elegida. |
data-highlighted | La opción enfocada. |
data-disabled | La opción está deshabilitada. |
- CalendarUna cuadrícula de fechas para selección única, de rango y múltiple, con meses deslizantes, vistas previas de rango y días de tamaño táctil.
- CheckboxUna casilla de verificación cuya marca se dibuja, con padres indeterminados, grupos y etiquetas que comparten su hover.
- ComboboxUn select filtrable con chips, grupos y resultados asíncronos, en un popup que cambia de tamaño mientras escribes.
- Date pickerUn botón que abre un calendario en un popover, o en una hoja inferior en móviles, para fechas únicas y rangos.
- FieldEtiquetas, descripciones y errores conectados a su control, con estados de validación y diseños para formularios.
- InputUn campo de texto con tres tamaños, estados inválido y de solo lectura, estilos de validación nativos y una fuente táctil de 16px para que los móviles nunca hagan zoom.
Usado en bloques
Bloques que se construyen sobre Select.
- API keysLa página de claves de API de un producto de IA, como las consolas de OpenAI y Anthropic. Crea claves con permisos acotados y caducidad, ve el secreto una sola vez con una copia que lo confirma, revoca con deshacer, renombra en el sitio, rota con un periodo de gracia y consulta el uso por clave.
- NotificationsLa sección Notificaciones de los ajustes de un producto de IA. Una cuadrícula de canal por evento con toggles por fila, por columna y para todo, horas de silencio con una línea en vivo del próximo silencio, un resumen por correo, envíos de prueba reales para escritorio, correo, push y Slack, gestión de permisos del navegador y un flujo para conectar Slack. Se integra en cualquier sección de Ajustes.