Collapsible
Un 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.
@preetsuthar17 starred 3 repositories
pnpm dlx shadcn@latest add https://hextaui.com/r/collapsible.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 cnCopia y pega el siguiente código en tu proyecto.
components/ui/collapsible.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Abierto por defecto
defaultOpen inicia el panel abierto sin tomar el control de su estado.
Mostrar más
El panel se sitúa sobre su trigger. Cuando se cierra, el hueco del diseño flex del padre se colapsa en la misma animación, así que el botón de debajo nunca salta.
Controlado
Pasa open y onOpenChange para controlar el panel desde tu propio estado. Alternar a mitad de la animación revierte desde donde está el panel.
Deshabilitado
disabled en la raíz mantiene el panel en su estado actual y hace que el trigger ignore clics y teclas.
Icono personalizado
Los hijos de <CollapsibleTriggerIcon /> reemplazan el chevron. Da estilo al estado abierto con group-data-panel-open/collapsible-trigger.
Árbol de archivos
Cada carpeta es su propio collapsible. Los paneles exteriores crecen suavemente a medida que se abren los interiores.
Dentro de una tarjeta
Los paneles cerrados permanecen en la página con hidden=“until-found”, así que Cmd/Ctrl+F para “webhook” abre este.
Desmontado al cerrarse
Define hiddenUntilFound={false} en el contenido para quitarlo del DOM mientras está cerrado, para paneles pesados que no quieres renderizar de antemano.
Contenido largo
Las cadenas sin espacios se ajustan dentro del panel en lugar de ensanchar la página.
De derecha a izquierda
Los chevrons se reflejan y las sangrías anidadas siguen la dirección de lectura.
| Key | Acción |
|---|---|
| EnterSpace | Abre o cierra el panel desde el trigger. |
| Tab | Mueve el foco del trigger al panel abierto. Los paneles cerrados se omiten. |
- El trigger recibe
aria-expandedyaria-controlsautomáticamente. - Los triggers solo con icono necesitan un
aria-label.<CollapsibleTriggerIcon />está oculto para las tecnologías de asistencia. - Con movimiento reducido, el panel se abre y se cierra sin animar su altura.
Construido sobre el collapsible de Base UI. Cada parte acepta las props de la primitiva que envuelve.
| Prop | Tipo | Predeterminado |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="collapsible" | Apunta a la raíz en CSS. |
data-open | Presente cuando está abierto. |
data-closed | Presente cuando está cerrado. |
| Prop | Tipo | Predeterminado |
|---|---|---|
renderNormalmente un Button. | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descripción |
|---|---|
data-slot="collapsible-trigger" | Apunta al trigger en CSS. |
data-panel-open | Presente cuando el panel está abierto. Da estilo a los hijos con group-data-panel-open/collapsible-trigger. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenEl chevron por defecto se voltea cuando se abre el panel. | ReactNode | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descripción |
|---|---|
data-slot="collapsible-trigger-icon" | Oculto para las tecnologías de asistencia. Baja ligeramente mientras se pulsa el trigger. |
| Prop | Tipo | Predeterminado |
|---|---|---|
classNameSe aplica al contenedor interno, para que el padding nunca choque con la animación de altura. | string | – |
hiddenUntilFoundMantiene el panel cerrado en el DOM para que la búsqueda de página pueda encontrarlo y abrirlo. | boolean | true |
keepMountedSe ignora mientras hiddenUntilFound está activado. | boolean | false |
| Atributo | Descripción |
|---|---|
data-slot="collapsible-content" | Selecciona el panel en CSS. |
data-open | Presente cuando está abierto. |
data-closed | Presente cuando está cerrado. |
data-starting-style | Presente mientras el panel se anima al abrirse. |
data-ending-style | Presente mientras el panel se anima al cerrarse. |
--collapsible-panel-height | La altura medida del panel. |
--collapsible-panel-width | El ancho medido del panel. |
--collapsible-gap-start | El gap del padre antes del panel, colapsado mientras está cerrado. |
--collapsible-gap-end | El gap del padre después del panel, colapsado mientras está cerrado. |
- AccordionEncabezados 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.
- 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.
- 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.
Usado en bloques
Bloques que se construyen sobre Collapsible.
- Agent TodosMuestra el plan de un agente mientras trabaja. Cada paso pasa de pendiente a por hacer, en curso y hecho, con tiempos en vivo, fallos y las llamadas a herramientas detrás. Una píldora de estado para sobre el compositor, cambios del plan que puedes ver y un paso de revisión para editar el plan antes de ejecutarlo.
- 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.
- BillingPlan y uso para un producto de IA, al estilo de Cursor, Claude y Vercel. Un medidor de uso dividido por modelo que proyecta el final del ciclo y avisa antes de que se agoten los créditos, un gráfico diario por el que puedes desplazarte, un límite de gasto con alertas que puedes previsualizar en el medidor, cambios de plan con prorrateo exacto, un formulario de tarjeta con validación real y facturas descargables en PDF.
- Chat SidebarLa barra lateral de una app de chat. Logo, búsqueda y Nuevo chat arriba, tus propios enlaces debajo, chats fijados, proyectos que se expanden para mostrar sus chats, recientes agrupados por día y filas con menús al pasar el cursor y con clic derecho, renombrado en línea, eliminación con deshacer y estados de respuesta en vivo.