Resizable
Paneles 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/resizable.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 react-resizable-panels cnCopia y pega el siguiente código en tu proyecto.
components/ui/resizable.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Los números son píxeles y las cadenas son porcentajes, así que defaultSize="30%" y minSize={240} funcionan. El divisor sigue siendo una línea fina hasta que lo alcanzas. Mientras arrastras, los paneles siguen exactamente al puntero; cualquier otro cambio se desliza, incluidos los restablecimientos con doble clic, los pasos con teclado y el colapso desde código.
Collapsible
Un panel collapsible se cierra de golpe al arrastrarlo por debajo de su minSize. Alterna desde un botón con usePanelRef; el colapso se anima.
Indicador de tamaño
showSize muestra el tamaño del panel anterior al divisor mientras arrastras o usas el teclado, en "percent" o "pixels".
Recordar el diseño
useDefaultLayout guarda los tamaños en localStorage y los restaura en la siguiente visita sin animar la entrada. Dale un id a cada panel.
Vertical
orientation="vertical" apila los paneles. Los grupos se pueden anidar, como en la demo de arriba.
Grip visible
withHandle mantiene el grip visible en lugar de revelarlo al pasar el cursor.
De derecha a izquierda
Los paneles y las flechas siguen la dirección de lectura.
| Key | Acción |
|---|---|
| ←→↑↓ | Mueve el divisor enfocado un 5% en la dirección de su grupo. |
| HomeEnd | Mueve el divisor hasta donde lo permitan los paneles. |
| Enter | Colapsa o expande un panel colapsable. |
| F6 | Pasa al siguiente divisor del grupo; Shift vuelve atrás. |
- Cada divisor es un
separatorenfocable que informa del tamaño del panel anterior. - El indicador de tamaño es decorativo; los lectores de pantalla reciben el valor propio del separator.
- Con movimiento reducido, los tamaños cambian al instante y el divisor no se anima.
| Prop | Tipo | Predeterminado |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
defaultLayout | Layout | – |
onLayoutChangeCada cambio, incluido mientras se arrastra. | (layout) => void | – |
onLayoutChangedUna vez que se asienta un cambio. | (layout, meta) => void | – |
disabled | boolean | false |
groupRef | Ref<GroupImperativeHandle> | – |
| Atributo | Descripción |
|---|---|
data-slot="resizable-panel-group" | El grupo. |
data-ready | Se define tras el montaje; a partir de entonces los tamaños se animan. |
| Prop | Tipo | Predeterminado |
|---|---|---|
defaultSize | number | string | – |
minSize | number | string | – |
maxSize | number | string | – |
collapsible | boolean | false |
collapsedSize | number | string | 0 |
onResize | (size, id, previous) => void | – |
panelRef | Ref<PanelImperativeHandle> | – |
idNecesario para recordar los diseños. | string | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
withHandleMuestra siempre el grip. | boolean | false |
showSize | boolean | "percent" | "pixels" | false |
disableDoubleClickEvita que el doble clic restablezca los paneles. | boolean | false |
disabled | boolean | false |
| Atributo | Descripción |
|---|---|
data-slot="resizable-handle" | El divisor. |
data-separator | "inactive", "hover", "active", "focus" o "disabled". |
data-slot="resizable-handle-grip" | La píldora del grip. |
usePanelRef y useGroupRef te dan collapse, expand, resize y setLayout. useDefaultLayout persiste el diseño de un grupo.
- 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.
- 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.
- 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 Resizable.
- ArtifactEl panel junto a un chat de IA que muestra lo que creó el modelo. Páginas web, SVG, documentos y código llegan en streaming y luego pasan a una vista previa en sandbox, con versiones que puedes comparar y restaurar, una división redimensionable y una hoja inferior en móviles.
- Diff ReviewRevisa las ediciones de un agente en todos los archivos antes de que se apliquen. Un árbol de archivos con contadores, aceptar o rechazar cada cambio, cada archivo o todo, comentarios en cualquier línea o rango que vuelven al agente, vistas unificada y dividida, resaltado a nivel de palabra, deshacer, ediciones en streaming y un resumen «Editados 4 archivos» para el chat.