Skip to content

Pagination

Navegação entre páginas de uma lista ou tabela.

Regras de design: strip contínuo sem gap (bordas colapsadas), borda preta 2px sempre, célula ativa em preto/branco, hover em azul, fonte mono.

Uso

vue
<script setup lang="ts">
import { Pagination } from '@halfbyte-labs/maka'
import { ref } from 'vue'

const pagina = ref(1)
</script>

<template>
  <Pagination v-model="pagina" :total="10" />
</template>

Tamanhos

Três tamanhos: sm (32px), md (40px, padrão) e lg (52px). Altura, largura e fonte escalam juntos.

vue
<Pagination v-model="pagina" :total="10" size="sm" />
<Pagination v-model="pagina" :total="10" size="md" />
<Pagination v-model="pagina" :total="10" size="lg" />

Variantes

Quatro variantes visuais para diferentes contextos e fundos.

vue
<Pagination v-model="pagina" :total="10" variant="default" />
<Pagination v-model="pagina" :total="10" variant="ghost"  />
<Pagination v-model="pagina" :total="10" variant="blue"   />
VarianteBordaCélula ativa
default2px #111114Preto + branco
ghost1px cinzaPreto + branco
blue2px #111114Azul + branco
compactVer seção Compacto

Truncamento

Com muitas páginas, o algoritmo exibe os limites (boundary) e os vizinhos da página atual (siblings) — o restante vira .

siblings

siblings controla quantas páginas aparecem de cada lado da página ativa. Padrão: 1.

vue
<Pagination v-model="pagina" :total="20" :siblings="1" />
<Pagination v-model="pagina" :total="20" :siblings="2" />
<Pagination v-model="pagina" :total="20" :siblings="3" />

boundary

boundary controla quantas páginas sempre aparecem nas extremidades (início e fim). Padrão: 1.

vue
<Pagination v-model="pagina" :total="20" :boundary="1" />
<Pagination v-model="pagina" :total="20" :boundary="2" />

Sem truncamento

Quando o total de páginas cabe dentro do cálculo 2×siblings + 2×boundary + 1, todos os números aparecem sem .


Os botões Anterior e Próxima mostram texto + ícone por padrão. Use icon-only para exibir apenas o chevron.

vue
<Pagination v-model="pagina" :total="10" />
<Pagination v-model="pagina" :total="10" :icon-only="true" />
<Pagination v-model="pagina" :total="10" prev-label="Voltar" next-label="Avançar" />

Os botões de navegação ficam disabled automaticamente na primeira e última página.


Com botões first / last

show-first-last adiciona botões de salto direto para a primeira e última página.

vue
<Pagination v-model="pagina" :total="20" :show-first-last="true" />

Compacto

variant="compact" substitui os números por [‹] [pág X/Y] [›]. O campo do meio é um input — clique e digite para saltar para qualquer página.

vue
<Pagination v-model="pagina" :total="100" variant="compact" size="sm" />
<Pagination v-model="pagina" :total="100" variant="compact" />
<Pagination v-model="pagina" :total="100" variant="compact" size="lg" />

Ideal para tabelas com muitas páginas onde o espaço horizontal é limitado. O campo aceita Enter e blur para confirmar o salto.


Combinações de tamanho e variante


Props

PropTipoPadrãoDescrição
modelValuenumberObrigatório. Página atual (base 1)
totalnumberObrigatório. Total de páginas
size'sm' | 'md' | 'lg''md'Tamanho das células
variant'default' | 'ghost' | 'blue' | 'compact''default'Estilo visual
siblingsnumber1Páginas exibidas de cada lado da ativa
boundarynumber1Páginas sempre visíveis nas extremidades
showFirstLastbooleanfalseAdiciona botões de salto para primeira e última página
prevLabelstring'Anterior'Label do botão anterior
nextLabelstring'Próxima'Label do botão próxima
iconOnlybooleanfalseOculta o texto nos botões de navegação
aria-labelstring'Paginação'Label acessível do <nav>
pageLabel(p: number, isActive: boolean) => stringSobrescreve o aria-label de cada página

Events

EventoPayloadDescrição
update:modelValuenumberEmitido ao mudar de página. O valor é sempre entre 1 e total

Acessibilidade

  • O componente renderiza um <nav> com aria-label (padrão: 'Paginação').
  • A página ativa usa <span aria-current="page"> — nunca um <button>.
  • Os são aria-hidden="true" — não aparecem para leitores de tela.
  • Os botões de navegação ficam com disabled nativo nas extremidades.
  • Use pageLabel para sobrescrever os labels das páginas quando o contexto exigir (ex: "Página 3 de 20").
  • O compacto tem aria-label no input indicando a página atual e o total.