Pagination
Navegação entre páginas de uma lista ou tabela, composta sobre o Button, com a página atual marcada por aria-current.
Instalação
Recebe correções por update de versão. O caminho recomendado.
npm i @trdr/ui
import { Pagination } from "@trdr/ui/pagination"Uso
import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext } from "@trdr/ui/pagination"
export function Exemplo() {
return <Pagination />
}Props
PaginationPropsestende React.ComponentPropsWithoutRef<"nav">PaginationContentPropsestende React.ComponentPropsWithoutRef<"ul">PaginationItemPropsestende React.ComponentPropsWithoutRef<"li">PaginationLinkPropsestende React.ComponentPropsWithoutRef<"a">, Pick<ButtonProps, "size">| Prop | Tipo | Descrição |
|---|---|---|
| isActive? | boolean | Marca esta pagina como a atual: aplica `aria-current="page"` e a variante visual ativa. |
PaginationPreviousPropsestende PaginationLinkPropsPaginationNextPropsestende PaginationLinkPropsPaginationEllipsisPropsestende React.ComponentPropsWithoutRef<"span">Pagination
Navegação entre páginas de uma lista, tabela ou histórico de ordens. Composta sobre o Button
(mesma variante, mesmo foco, mesmo alvo de toque): Pagination não reimplementa nada visual, só
organiza links de página dentro de uma estrutura semântica de navegação.
Quando usar
- Listas ou tabelas paginadas no servidor (histórico de operações, extrato, ordens). O
componente não sabe quantas páginas existem nem qual é a atual: isso é responsabilidade de
quem monta a lista de
PaginationItem/PaginationLink. - Quando cada página tem uma URL própria (os links são
<a href>de verdade, não botões comonClick): isso é o que torna a paginação navegável, indexável e compatível com abrir-em-nova-aba.
Quando não usar
- Rolagem infinita ou "carregar mais": não há conceito de página aqui, use um botão comum
(
Button) ou um observer de scroll. - Paginação de poucos itens sem necessidade de navegar direto para uma página específica: às
vezes só
PaginationPrevious/PaginationNextjá bastam, sem números de página no meio.
Anatomia
<Pagination> <nav aria-label="pagination">
<PaginationContent> <ul>
<PaginationItem> <li>
<PaginationPrevious href="..." /> Button ghost, com seta e "Anterior"
<PaginationItem>
<PaginationLink href="...">1</PaginationLink> Button ghost (ou secondary se isActive)
<PaginationItem>
<PaginationEllipsis /> reticencia, decorativa (aria-hidden)
<PaginationItem>
<PaginationNext href="..." /> Button ghost, com "Proxima" e setaVariantes
PaginationLink não usa cva própria: ela repassa variant/size para o buttonVariants do
Button. A página atual (isActive) usa variant="secondary"; as demais usam variant="ghost".
size aceita as mesmas chaves do Button (default, lg, icon); o padrão é icon (24x24,
para números de página) e PaginationPrevious/PaginationNext usam default (para caber o
texto ao lado do ícone).
Acessibilidade
- A raiz é sempre
<nav aria-label="pagination">: um leitor de tela anuncia o bloco como uma região de navegação nomeada, não uma lista qualquer. - A página atual recebe
aria-current="page"emPaginationLink, além do destaque visual (variant="secondary"). É assim que o usuário de leitor de tela sabe qual página está aberta sem depender só da cor. PaginationPrevious/PaginationNexttêmaria-labelpróprio ("Ir para a página anterior" / "Ir para a próxima página"): o texto visível ("Anterior"/"Próxima") some em telas pequenas (hidden sm:block), mas o nome acessível do link não depende dele.PaginationEllipsisé puramente decorativa:aria-hidden="true"erole="presentation", com um texto "Mais páginas" reservado para leitor de tela (sr-only) caso o ícone sozinho não seja suficiente em algum contexto de auditoria.
Slots e tokens
Todo elemento renderizado carrega um data-slot para estilizar partes internas sem depender de classe da biblioteca. Os tokens listados são extraídos do código fonte.
[data-slot="pagination"][data-slot="pagination-content"][data-slot="pagination-ellipsis"][data-slot="pagination-item"][data-slot="pagination-link"]