Button group
Botones unidos en un solo control, con uniones compartidas, separadores, addons de texto, anidamiento y apilados verticales.
pnpm dlx shadcn@latest add https://hextaui.com/r/button-group.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 class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/button-group.tsx components/ui/separator.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Button group une los botones que ya usas. Instala también <Button />.
Tamaños
Define size en cada botón. Las esquinas unidas permanecen cuadradas en todos los tamaños, y las esquinas exteriores conservan el radio del botón.
Botón dividido
Los botones rellenos quedan pegados, así que añade un <ButtonGroupSeparator /> entre ellos. El trigger de un dropdown puede ser cualquier segmento.
Separadores
Separadores entre botones de icono, con un toggle que informa de su estado pulsado.
Feedback dentro de un grupo
Cuando la etiqueta de un botón cambia de ancho durante la carga, el éxito o el error, los segmentos siguientes se deslizan en lugar de saltar.
Vertical
orientation="vertical" apila los segmentos. Los separadores pasan a horizontales automáticamente.
Grupos anidados
Los grupos dentro de un grupo se convierten en clústeres separados con un hueco entre ellos, cada uno unido por su cuenta.
Con texto y un input
<ButtonGroupText /> añade una etiqueta o un prefijo. Renderízalo como un <label> para nombrar el input. El input se estira para llenar la fila.
Deshabilitado y no válido
Deshabilita o marca un solo segmento con aria-invalid. Un segmento no válido se eleva sobre sus vecinos para que su anillo rojo nunca quede cubierto.
Ancho completo
Dale un ancho al grupo y flex-1 a cada botón para repartir el espacio por igual.
Como fieldset
Usa render para generar un <fieldset> dentro de formularios.
De derecha a izquierda
Las esquinas unidas, los separadores y los clústeres anidados se reflejan en diseños de derecha a izquierda.
| Key | Acción |
|---|---|
| Tab | Recorre los segmentos en orden. El segmento con foco se eleva para que su anillo y su borde nunca queden cubiertos. |
| EnterSpace | Activa el botón con foco. |
- El grupo tiene
role="group". Dale unaria-labelque describa el conjunto, como “Message actions”. - Los segmentos solo con icono necesitan su propio
aria-label. - Los separadores se exponen como separadores con la orientación correcta. Añade
decorativecuando la línea sea solo visual.
Cada parte renderiza un <div> y acepta sus atributos.
| Prop | Tipo | Predeterminado |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="button-group" | Apunta a los grupos en CSS. |
data-orientation | La orientación actual. |
| Prop | Tipo | Predeterminado |
|---|---|---|
orientationPor defecto es lo contrario de la orientación del grupo. | "horizontal" | "vertical" | – |
decorativeOculta la línea para los lectores de pantalla. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="button-group-separator" | Selecciona los separadores en CSS. |
data-orientation | La orientación resuelta. |
| Prop | Tipo | Predeterminado |
|---|---|---|
renderRenderiza un <label> para nombrar un input del grupo. | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="button-group-text" | Selecciona los segmentos de texto en CSS. |
- SeparatorUna línea fina que divide el contenido horizontal o verticalmente, con una etiqueta opcional y un modo decorativo para líneas puramente visuales.
- ButtonBotones en todas las variantes y tamaños, con un flujo integrado de carga, éxito y error que omite el spinner en las peticiones rápidas.
- ToggleUn botón que se mantiene activado o desactivado, con un relleno que se asienta al pulsar, un paso claro de hover a activado e iconos que pueden rellenarse según el estado.
- Toggle groupUna fila de toggles para una o varias opciones, con un relleno que se desliza hasta el elemento elegido, elementos unidos o separados y foco con las teclas de flecha.