Skip to main content

Pagination

Pagination with page navigation, next and previous links.

Default

import {
Pagination,
PaginationContent,
PaginationItem,
PaginationLink,
PaginationPrevious,
PaginationNext,
PaginationEllipsis,
} from "@/components/ui/pagination"

<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious href="#" />
</PaginationItem>
<PaginationItem>
<PaginationLink href="#">1</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink href="#">2</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink href="#">3</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationEllipsis />
</PaginationItem>
<PaginationItem>
<PaginationNext href="#" />
</PaginationItem>
</PaginationContent>
</Pagination>

Many Pages

Use generatePaginationRange to compute which pages and ellipses to render. Clicking an ellipsis jumps forward or backward by 5 pages.

import { useState } from "react"
import {
Pagination,
PaginationContent,
PaginationItem,
PaginationLink,
PaginationPrevious,
PaginationNext,
PaginationEllipsis,
generatePaginationRange,
} from "@/components/ui/pagination"

function PaginationDemo() {
const [currentPage, setCurrentPage] = useState(1)
const totalPages = 20
const range = generatePaginationRange(currentPage, totalPages)

function goTo(page: number) {
setCurrentPage(Math.max(1, Math.min(page, totalPages)))
}

return (
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious onClick={() => goTo(currentPage - 1)} />
</PaginationItem>
{range.map((item, i) =>
item === "ellipsis" ? (
<PaginationItem key={`ellipsis-${i}`}>
<PaginationEllipsis
onClick={() =>
goTo(i < range.length / 2 ? currentPage - 5 : currentPage + 5)
}
/>
</PaginationItem>
) : (
<PaginationItem key={item}>
<PaginationLink
onClick={() => goTo(item)}
isActive={item === currentPage}
>
{item}
</PaginationLink>
</PaginationItem>
)
)}
<PaginationItem>
<PaginationNext onClick={() => goTo(currentPage + 1)} />
</PaginationItem>
</PaginationContent>
</Pagination>
)
}

API Reference

PropTypeDefaultDescription
hrefstringThe link destination for the pagination item
isActivebooleanfalseHighlights the current page number
onClick() => voidClick handler (on PaginationEllipsis, PaginationLink, PaginationPrevious, PaginationNext)

Subcomponents

ComponentDescription
PaginationThe root navigation wrapper
PaginationContentThe list container for pagination items
PaginationItemIndividual list item wrapper
PaginationLinkA clickable page number link
PaginationPreviousPrevious page navigation with chevron icon
PaginationNextNext page navigation with chevron icon
PaginationEllipsisInteractive ellipsis button for truncated page ranges

Helpers

FunctionSignatureDescription
generatePaginationRange(currentPage: number, totalPages: number, siblingCount?: number) => (number | "ellipsis")[]Computes the array of page numbers and ellipsis markers to render. Always includes first and last page, shows siblingCount pages on each side of the current page (default 1), and inserts "ellipsis" between non-contiguous ranges.

Accessibility

The Pagination component follows WAI-ARIA navigation patterns:

  • Uses <nav> element with aria-label="pagination" for landmark navigation
  • aria-current="page" is set on the active page link
  • Previous and Next links include descriptive aria-label attributes
  • Ellipsis button has aria-label="Show more pages" for screen readers
  • Supports keyboard navigation through focusable link and button elements