vaiperui

componentes / pagination

Pagination

Navega entre páginas de resultados; el padre guarda la página y obtiene los datos.

Cómo usar

Un componente controlado: pasa `page` (desde 1), `pageCount` y `onPageChange`. Con muchas páginas muestra la primera, la última, la actual y `siblingCount` vecinas con puntos suspensivos, manteniendo el mismo ancho. Todo texto integrado se puede cambiar (`previousLabel`, `nextLabel`, `pageLabel`, `aria-label`). Si cada página tiene su URL, prefiere enlaces reales.

preview
Pagination.tsx
import { Pagination } from "vaiperui";
const [page, setPage] = useState(1);
<Pagination
page={page}
pageCount={20}
onPageChange={setPage}
previousLabel="Página anterior"
nextLabel="Página siguiente"
pageLabel={(n) => `Página ${n}`}
/>

Colores

preview
primary
success
warning
danger
colores.tsx
<Pagination page={page} pageCount={20} onPageChange={setPage} variantColor="primary" />
<Pagination page={page} pageCount={20} onPageChange={setPage} variantColor="success" />
<Pagination page={page} pageCount={20} onPageChange={setPage} variantColor="warning" />
<Pagination page={page} pageCount={20} onPageChange={setPage} variantColor="danger" />

Tamaños

preview
sm
md
lg
tamanos.tsx
<Pagination page={page} pageCount={20} onPageChange={setPage} size="sm" />
<Pagination page={page} pageCount={20} onPageChange={setPage} size="md" />
<Pagination page={page} pageCount={20} onPageChange={setPage} size="lg" />

Radio

preview
none
sm
md
lg
full
radio.tsx
<Pagination page={page} pageCount={20} onPageChange={setPage} radius="none" />
<Pagination page={page} pageCount={20} onPageChange={setPage} radius="sm" />
<Pagination page={page} pageCount={20} onPageChange={setPage} radius="md" />
<Pagination page={page} pageCount={20} onPageChange={setPage} radius="lg" />
<Pagination page={page} pageCount={20} onPageChange={setPage} radius="full" />

Color personalizado

preview
Naranja
Violeta
color-personalizado.tsx
<Pagination page={page} pageCount={20} onPageChange={setPage} customColor="#f97316" />
<Pagination page={page} pageCount={20} onPageChange={setPage} customColor="#8b5cf6" />

Vecinas

preview
siblingCount={2}
vecinas.tsx
<Pagination page={page} pageCount={30} siblingCount={2} onPageChange={setPage} />

Props

PropValoresPredeterminadoDescripción
pagenumberobligatorioPágina actual, desde 1
pageCountnumberobligatorioNúmero total de páginas
onPageChange(page: number) => voidobligatorioSe llama con la página elegida
siblingCountnumber1Páginas mostradas a cada lado de la actual
previousLabelstringPrevious pageNombre accesible del botón anterior
nextLabelstringNext pageNombre accesible del botón siguiente
pageLabel(page: number) => stringPage nNombre accesible de un botón de página
aria-labelstringPaginationNombre de la navegación
disabledbooleanfalseDeshabilita todos los botones
variantColorprimary | success | warning | dangerprimaryColor de acento del estado activo y del anillo de foco
customColorstring | { light, dark }ningunoCualquier color CSS (o un par por tema). Reemplaza a variantColor
sizesm | md | lgmdTamaño del control y del texto
radiusnone | sm | md | lg | fullmdRedondeo de las esquinas
animationnone | smooth | fast | bouncesmoothTransición entre estados

Accesibilidad

  • Renderiza un `<nav>` con `aria-label` (por defecto "Pagination") que contiene una lista (`<ul>`/`<li>`) de botones nativos.
  • El botón de la página actual tiene `aria-current="page"` y no hace nada al hacer clic.
  • Cada botón tiene un `aria-label` de `previousLabel`, `nextLabel` y `pageLabel(n)`; los iconos de flecha son `aria-hidden`.
  • Anterior se deshabilita en la primera página y siguiente en la última; `disabled` deshabilita todos los botones.
  • Los puntos suspensivos "…" son `aria-hidden` y no enfocables.

Teclado

TeclaAcción
Tab / Shift+TabRecorre los botones habilitados en orden.
Enter / SpaceActiva el botón enfocado (comportamiento nativo).

Ten en cuenta

  • Traduce `previousLabel`, `nextLabel`, `pageLabel` y `aria-label`; sus valores por defecto están en inglés.
  • Cambiar de página no mueve el foco ni anuncia nada; gestiónalo en `onPageChange` si hace falta.