Pagination

Long lists cut into honest, numbered pages.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Page 4 of 12
Configuration
Size
Total pages
<Pagination total={12} page={4} />
Behavior — The Engineering Contract
Prop / eventTypeNotes
page / totalnumber / numberCurrent page and page count, both 1-based
onChange(page) => voidFires with the requested page
variantnumbered · compact · simple · page-sizeNumbered is the default
pageSize / onPageSizeChangenumber / (n) => voidRows-per-page select; resets to page 1 and re-derives the range
sizeS · M · LItem scale; M is the default
siblingsnumberPages kept either side of current before an ellipsis
← / →Prev / next; both disable at the ends

Pagination moves through pages of one list. For peer views of one item use Tabs; for endless feeds prefer a Loader with infinite scroll.

Anatomy
1ChevronPrev / next; disabled and dimmed at the ends.
2EllipsisA gap in the range, never a click target.
3CurrentWarm tint, aria-current, not interactive.
Do's and Don'ts
✓ Do

Collapse long ranges. Keep the first, last and a window around current.

✕ Don't

Don't print every page. A twenty-item row is a wall, not a control.

✓ Do

Disable Previous on page one. Dead-end controls tell the truth.

✕ Don't

Never highlight two pages. Exactly one current page, always.

In context: Examples
A · Under a table

Numbered pagination sits below a data table, right or centre aligned.

B · Compact toolbar

The compact variant saves width in dense headers and mobile.

C · Simple feed

Two ghost buttons when the exact page number does not matter.

Measurements & Tokens
TokenValueRole
--pag-size34pxItem hit area (28 / 40 at S / L)
--pag-radius8pxItem corner
--pag-current#FF7A00 @14%Current page tint + #FF9D45 text
--pag-hover#16171BHover fill on idle items
--pag-ellipsis#565A62Range gap glyph
--pag-disabled0.32 opacityChevrons at the ends
Code
<nav class="o-pag" aria-label="Pagination">
  <button class="o-pag__item" aria-label="Previous">‹</button>
  <button class="o-pag__item">1</button>
  <span class="o-pag__ellipsis">…</span>
  <button class="o-pag__item is-current" aria-current="page">4</button>
  <button class="o-pag__item">5</button>
  <span class="o-pag__ellipsis">…</span>
  <button class="o-pag__item">12</button>
  <button class="o-pag__item" aria-label="Next">›</button>
</nav>