Pagination
Em andamentoPaginação de lista: anterior, os números das páginas (com reticências quando são muitas) e próxima. Com hrefDaPagina, cada página é um link com endereço (E71); sem, são botões que trocam no lugar. No celular, os números dão lugar a "Página X de Y".
- Função
- Navegação e estrutura
- Também chamado de
- paginação, páginas, anterior e próxima
- Mora em
- app/components/molecules/Pagination.tsx
- Última mudança
- 2026-10-01
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Embaixo de uma lista ou grade longa dividida em páginas — resultados de busca, catálogo de cursos, posts do blog.
Faça
- Com mais de uma paginação na página, dê a cada uma um nome próprio:
aria-label="Paginação dos resultados de busca"substitui o padrão "Paginação" (E143, Magoo). - Na troca no lugar (
onPageChange), anuncie o trecho novo numa região viva ("Página 3 de 12") e deixe o foco no controle: a Pagination não sabe o que mudou na lista. - Use
hrefDaPaginaquando a lista tem endereço (o catálogo): a página 2 vira link indexável, compartilhável e que abre em nova aba (E71). - Para lista que troca no lugar, guarde a página no consumidor e passe
currentPage;onPageChangerecebe a escolhida. - Leve o foco (ou a rolagem) ao início da lista depois de trocar de página.
- Dê um
aria-labelpróprio quando houver duas paginações na tela.
Evite
- Contar com os números no celular: abaixo de 768px, só anterior, próxima e o texto "Página X de Y" aparecem.
Quando não usar. Para passar itens de um carrossel, use o CarouselNavButton. Para alternar seções de uma página, o CourseTabs.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Anterior — "Página anterior"; indisponível na primeira.
- Números — Até sete, com `aria-label` "Página N de T"; o atual em vermelho.
- Reticências — Marcam os saltos quando há mais de sete páginas; decorativas.
- Texto compacto — "Página X de Y", só abaixo de 768px.
- Próxima — "Próxima página"; indisponível na última.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Página atual | Fundo --primary, texto branco e aria-current="page". |
| Outra página | Borda e texto escuro; no hover, fundo --muted. |
| Foco | O anel de foco, só no teclado. |
| Ponta, em botões | Anterior (na primeira) ou próxima (na última) a 50%, com aria-disabled="true": continua no Tab, o leitor diz "indisponível" e o clique não faz nada. |
| Ponta, em links | Sem destino, fica só o desenho a 50%, fora do Tab e da árvore — conferido no teste da ficha. |
Comportamento
| Situação | O que acontece |
|---|---|
| Uma página só | Não renderiza nada (E71) — conferido no teste da ficha. |
| Página fora do intervalo | Fica presa nele: currentPage={40} de 5 vira a 5 (E71) — conferido no teste da ficha. |
| Até sete páginas | Todas aparecem. |
| Mais de sete, perto do começo | 1 a 5, reticências e a última. |
| Mais de sete, no meio | A primeira, reticências, a atual com as vizinhas, reticências e a última. |
| Tela abaixo de 768px | Os números e as reticências somem; aparece "Página X de Y". |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Pagination } from '@/app/components/molecules/Pagination';
<Pagination currentPage={…} totalPages={…}>…</Pagination>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
currentPage | number | — | sim | — |
totalPages | number | — | sim | — |
onPageChange | (page: number) => void | — | não | Lista no cliente: troca a página sem mudar de endereço. |
hrefDaPagina | (page: number) => string | — | não | Página com URL (E71): (p) => '/cursos?pagina=' + p. Com ele, cada número é um link — indexável, compartilhável, abre em nova aba. O catálogo de uma faculdade precisa disso; o onPageChange continua para lista que troca no lugar. |
Aceita também: Omit<React.HTMLAttributes<HTMLElement>, 'onChange'>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Cada controle | 44 × 44px | w-alvo-toque h-alvo-toque |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--primary | #D42B2B | bg-primaryborder-primary |
--border | #E5E5E5 | border-border |
--border-interactive | #8C8C8C | border-border-interactive |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
--primary-foreground | #FFFFFF | text-primary-foreground |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Passa por anterior, pelos números visíveis e por próxima; em botões, as setas das pontas também, indisponíveis. No celular, só anterior e próxima. |
| EnterEspaço | Em botões, vai à página em foco; ela passa a ter `aria-current="page"` — conferido no teste da ficha. Em links, só o Enter, que segue o endereço. |
Leitor de tela
O que é anunciado, e por quê.
- É uma
<nav>"Paginação"; cada número é lido como "Página 3 de 10". - Em botões, as setas das pontas usam
aria-disabled, e nãodisabled: desabilitar o botão com o foco em cima jogava o foco no<body>(E102). - As reticências são
aria-hidden.
O que sustenta o estado
Esta peça usa navegacao. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: navegacao — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/molecules/Pagination.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
251416b2026-10-01E159: Testimonials — o vídeo toca dentro do cartão, YouTube e Vimeo
O histórico completo está no GitHub (abre em outra aba).