Accordion
Encabezados apilados que revelan cada uno un panel, con un movimiento de altura que puedes invertir a mitad de camino y paneles que siguen siendo buscables mientras están cerrados.
pnpm dlx shadcn@latest add https://hextaui.com/r/accordion.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/accordion.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Contorno
Los elementos comparten una sola superficie con borde, con las esquinas exteriores redondeadas.
Separated
Cada elemento es su propia tarjeta.
Ghost
Sin bordes. Los triggers reciben un relleno suave al pasar el cursor y cuando están abiertos.
Múltiple
Define multiple para que más de un elemento pueda permanecer abierto.
Deshabilitado
Deshabilita un solo elemento con disabled en <AccordionItem />, o todo el accordion en la raíz.
Controlado
Pasa value y onValueChange para mantener los elementos abiertos en tu propio estado.
Icono personalizado
Pasa cualquier elemento a icon. Da estilo a su estado abierto con group-data-panel-open/accordion-trigger.
Iconos iniciales
Los iconos antes de la etiqueta se dimensionan y alinean por ti. icon={null} quita el chevron.
Contenido largo
Los títulos largos se ajustan en varias líneas mientras el icono permanece en la primera. Los paneles cerrados siguen siendo buscables, así que Cmd/Ctrl+F para “retention” abre este.
Anidado
Un accordion interno conserva su propia variante, estilos de foco y navegación con las teclas de flecha.
De derecha a izquierda
El contenido, los iconos y el movimiento de apertura siguen la dirección de lectura.
| Key | Acción |
|---|---|
| EnterSpace | Abre o cierra el elemento con foco. |
| ↓ | Mueve el foco al siguiente trigger. |
| ↑ | Mueve el foco al trigger anterior. |
| Home | Mueve el foco al primer trigger. |
| End | Mueve el foco al último trigger. |
| Tab | Mueve el foco al panel abierto y luego al siguiente trigger. |
Construido sobre el accordion de Base UI. Cada parte acepta las props de la primitiva que envuelve.
| Prop | Tipo | Predeterminado |
|---|---|---|
variant | "default" | "outline" | "separated" | "ghost" | "default" |
multiplePermite que más de un elemento esté abierto. | boolean | false |
value | Value[] | – |
defaultValue | Value[] | – |
onValueChange | (value: Value[], details) => void | – |
disabled | boolean | false |
hiddenUntilFoundMantiene los paneles cerrados localizables con la búsqueda de página del navegador. | boolean | true |
keepMountedSe ignora mientras hiddenUntilFound está activado. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="accordion" | Apunta a la raíz en CSS. |
data-variant | La variante actual. |
data-disabled | Presente cuando el accordion está deshabilitado. |
| Prop | Tipo | Predeterminado |
|---|---|---|
valueSe genera automáticamente si se omite. | Value | – |
disabled | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="accordion-item" | Apunta a los elementos en CSS. |
data-open | Presente cuando el elemento está abierto. |
data-disabled | Presente cuando el elemento está deshabilitado. |
data-index | La posición del elemento, empezando en 0. |
| Prop | Tipo | Predeterminado |
|---|---|---|
iconnull quita el icono. | ReactNode | null | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descripción |
|---|---|
data-slot="accordion-trigger" | Apunta a los triggers en CSS. |
data-panel-open | Presente cuando su panel está abierto. Da estilo al icono con group-data-panel-open/accordion-trigger. |
data-disabled | Presente cuando el elemento está deshabilitado. |
| Prop | Tipo | Predeterminado |
|---|---|---|
classNameSe aplica al contenedor interno, para que el padding nunca choque con la animación de altura. | string | – |
keepMounted | boolean | false |
hiddenUntilFound | boolean | – |
| Atributo | Descripción |
|---|---|
data-slot="accordion-content" | Selecciona los paneles en CSS. |
data-open | Presente cuando el panel está abierto. |
data-starting-style | Presente mientras el panel se anima al abrirse. |
data-ending-style | Presente mientras el panel se anima al cerrarse. |
data-settled | Presente cuando el panel está completamente abierto. Deja de recortar entonces, así que los anillos de foco dentro de un accordion anidado se ven completos. |
--accordion-panel-height | La altura medida del panel, usada para la animación de altura. |
- Aspect ratioUn contenedor que mantiene su forma antes de que cargue el contenido multimedia, muestra un brillo mientras carga, hace aparecer el contenido con un fundido y muestra una alternativa si falla.
- CarouselDiapositivas nativas con scroll-snap, con inercia en pantallas táctiles, arrastre con el ratón, teclas de flecha, puntos, miniaturas y una reproducción automática que se pausa cuando debe.
- CollapsibleUn panel que se muestra y se oculta con un movimiento de altura que puedes invertir a mitad de camino, sin saltos en el diseño.
- ResizablePaneles que puedes separar arrastrando, con un divisor discreto que despierta al pasar el cursor, tamaños que se deslizan al restablecer o colapsar, y diseños que persisten.
- Scroll areaScroll nativo con una barra de desplazamiento mínima, bordes que se desvanecen solo donde hay más por ver y un vistazo opcional que corta el último elemento por la mitad.
- SeparatorUna línea fina que divide el contenido horizontal o verticalmente, con una etiqueta opcional y un modo decorativo para líneas puramente visuales.