Component

Pagination

Page controls with four navigation variants. Optional add-ons (page-size selector, total label) work with any variant.

variant="simple" (default)

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(1);
  return <Pagination page={page} totalPages={21} onPageChange={setPage} />;
}
render(<Demo />);

variant="numbered"

Windowed numbered buttons with ellipsis and a jump-to-page input.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(4);
  return (
    <Pagination
      variant="numbered"
      page={page}
      totalPages={21}
      onPageChange={setPage}
    />
  );
}
render(<Demo />);

variant="minimal"

Prev / Next only β€” no page indicator. Useful for carousels or compact contexts.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(1);
  return (
    <Pagination
      variant="minimal"
      page={page}
      totalPages={8}
      onPageChange={setPage}
    />
  );
}
render(<Demo />);

variant="compact"

Four icon buttons only (Β« β€Ή β€Ί Β»), no labels or page indicator. Right-aligned by default; override with className.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(1);
  return (
    <Pagination
      variant="compact"
      page={page}
      totalPages={8}
      onPageChange={setPage}
    />
  );
}
render(<Demo />);

Compact β€” alignment override

Use className to override the default right-alignment.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(1);
  return (
    <Pagination
      variant="compact"
      page={page}
      totalPages={8}
      onPageChange={setPage}
      className="justify-start"
    />
  );
}
render(<Demo />);

Compact + page-size selector and total label

The add-ons work with compact too β€” selector on the left, total label on the right.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(1);
  const [size, setSize] = useState(25);
  return (
    <Pagination
      variant="compact"
      page={page}
      totalPages={Math.ceil(70 / size)}
      onPageChange={setPage}
      pageSize={size}
      onPageSizeChange={(s) => { setSize(s); setPage(1); }}
      totalLabel="70 titles"
    />
  );
}
render(<Demo />);

With page-size selector and total label

Both add-ons are independent of the variant. Here combined with the default simple variant.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(1);
  const [size, setSize] = useState(20);
  return (
    <Pagination
      page={page}
      totalPages={11}
      onPageChange={setPage}
      totalLabel="202 posts"
      pageSize={size}
      onPageSizeChange={(s) => { setSize(s); setPage(1); }}
    />
  );
}
render(<Demo />);

Numbered + add-ons (full controls)

Admin table pattern: numbered navigation, page-size selector, and total count.

live editor β€” edit to update preview
function Demo() {
  const [page, setPage] = useState(4);
  const [size, setSize] = useState(10);
  return (
    <Pagination
      variant="numbered"
      page={page}
      totalPages={Math.ceil(202 / size)}
      onPageChange={setPage}
      totalLabel="202 articles"
      pageSize={size}
      onPageSizeChange={(s) => { setSize(s); setPage(1); }}
    />
  );
}
render(<Demo />);

Props

PropTypeDefaultDescription
page*numberβ€”Current page (1-indexed).
totalPages*numberβ€”Total number of pages.
onPageChange*(page: number) => voidβ€”Called with the new page number.
variant"simple" | "numbered" | "minimal" | "compact""simple"Navigation style. "simple" shows page x / y; "numbered" shows windowed buttons + jump-to-page; "minimal" shows Prev/Next only; "compact" shows four icon buttons (Β« β€Ή β€Ί Β») with no labels, right-aligned by default (override via className).
totalLabelstringβ€”Optional label at the far right, e.g. "202 posts". Works with any variant.
pageSizenumberβ€”Current page size. Shows a size selector at the left when provided together with onPageSizeChange. Works with any variant.
onPageSizeChange(size: number) => voidβ€”Called when the user changes items-per-page.
showPageNumbersbooleanfalseDeprecated. Use variant="numbered" instead.
classNamestringβ€”Additional class on the bar wrapper.