Saltar al contenido
EspañolEnglish
Todos los componentes (204)

Paneles redimensionables

Gestión · ResizablePanels · .amset-panels

Qué es y cuándo usarlo

Dos o más paneles con un separador que se arrastra. El caso de siempre: la lista a un lado, el detalle al otro, y quien mira decide cuánto ocupa cada cosa. El separador no es solo arrastrable: se mueve también con el teclado.

Cuándo usarlo

  • Lista y detalle, un editor con su vista previa, un catálogo en tres columnas.
  • shipping para empezar en proporciones ([2, 1]: el primero, el doble que el segundo); sizes con onChange para guardarlo y recuperarlo (en tantos por ciento que suman cien).
  • orientation="vertical" para apilarlos uno encima de otro.
  • El contenedor ocupa el alto que se le dé: aquí no se inventa ninguno, porque vive dentro de una pantalla que ya sabe cuánto mide.

Cuándo no

  • Un detalle que se abre por encima y se cierra: Drawer.
  • Secciones que se pliegan una debajo de otra: Accordion.

Teclado: Tab llega a cada separador. En horizontal, las flechas izquierda y derecha lo mueven un step (un 2 % por defecto), y en un idioma que se escribe de derecha a izquierda la flecha sigue moviéndolo hacia donde apunta; en vertical, arriba y abajo. Re Pág y Av Pág saltan cinco pasos, e Inicio y Fin lo llevan a los topes. Lo que gana un panel lo pierde el de al lado, nunca los demás. Un panel con más contenido del que cabe también recibe el foco, para poder desplazarlo con el teclado.

Accesibilidad: el grupo se llama como label y cada panel es una región con su nombre. El separador es un separator enfocable que dice qué ajusta («Ajustar Pedidos y Detalle») y por dónde va con palabras («45 % para Pedidos»). Cada panel tiene su min (10 % por defecto): no hay manera de dejar uno en dos píxeles. Con el dedo, el separador se ensancha para poder agarrarlo.

Aspecto fino: variables CSS --amset-panels-*: -extra, -handle, -handle-hover, -separator, -target. El tamaño mueve el hueco entre paneles y el tirador. El separador se VE en -separator y se agarra en -target, con el area de mas metida por encima de los paneles.

Cómo se ve

Las carpetas.

Lo que se edita.

<ResizablePanels
  label="Editor"
  panels={[
    { key: 'lista', label: 'Lista', content: <Lista /> },
    { key: 'detalle', label: 'Detalle', content: <Detalle /> },
  ]}
/>

Props

Se importa con import { ResizablePanels } from '@amset/ui'. Las obligatorias van marcadas.

PropTipoPara qué sirve
labelobligatoriastringObligatoria: el grupo se anuncia con ella.
panelsobligatoriareadonly ResizablePanel[]—
classNamestringSe une a las clases de la biblioteca, no las sustituye.
onChange(sizes: readonly number[]) => void—
orientationPanelsOrientation—
shippingreadonly number[]Proporciones iniciales. `[2, 1]` es «el primero el doble que el segundo».
size"sm" | "md" | "lg"—
sizesreadonly number[]Controlado: tantos por ciento que suman cien.
stepnumberCuanto mueve cada flecha, en tanto por ciento. Por defecto 2.

Acepta además los atributos del elemento que pinta: className, style, data-*, aria-* y sus eventos.

Mandos

Estas variables CSS son la forma de adaptarlo. Se declaran sobre el selector del componente, no en :root: la hoja las redeclara en la propia regla y una declaración en el mismo elemento gana siempre.

VariablePor defecto
--amset-panels-separatorvar(--amset-space-3)
--amset-panels-handle1.75rem
--amset-panels-handle-hover2.5rem
--amset-panels-target1.5rem
--amset-panels-extracalc((var(--amset-panels-target) - var(--amset-panels-separator)) / 2)

Cómo se cambia

.amset-panels {
  --amset-panels-separator: ...;
  --amset-panels-handle: ...;
}

En el banco de pruebas

Cada estado y cada variante, para tocarlos de uno en uno, en su ficha de ui.amset.tech: