Page navigation with previous and next controls, numbered links, and an optional ellipsis.
tsx
import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious,} from "@/components/ui/pagination"export function Example() { return ( <Pagination> <PaginationContent> <PaginationItem> <PaginationPrevious href="#" /> </PaginationItem> <PaginationItem> <PaginationLink href="#">1</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#" isActive> 2 </PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">3</PaginationLink> </PaginationItem> <PaginationItem> <PaginationEllipsis /> </PaginationItem> <PaginationItem> <PaginationNext href="#" /> </PaginationItem> </PaginationContent> </Pagination> )}Installation
npx @arctis-sh/@arctis-sh/ui@latest add paginationUsage
import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious,} from "@/components/ui/pagination"<Pagination> <PaginationContent> <PaginationItem> <PaginationPrevious href="#" /> </PaginationItem> <PaginationItem> <PaginationLink href="#">1</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#" isActive> 2 </PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">3</PaginationLink> </PaginationItem> <PaginationItem> <PaginationEllipsis /> </PaginationItem> <PaginationItem> <PaginationNext href="#" /> </PaginationItem> </PaginationContent></Pagination>Composition
Pagination
└── PaginationContent
├── PaginationItem
│ └── PaginationPrevious
├── PaginationItem
│ └── PaginationLink
├── PaginationItem
│ └── PaginationEllipsis
└── PaginationItem
└── PaginationNextBasic
The full set: previous, numbered links, an ellipsis, and next.
tsx
import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious,} from "@/components/ui/pagination"export function Example() { return ( <Pagination> <PaginationContent> <PaginationItem> <PaginationPrevious href="#" /> </PaginationItem> <PaginationItem> <PaginationLink href="#">1</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#" isActive> 2 </PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">3</PaginationLink> </PaginationItem> <PaginationItem> <PaginationEllipsis /> </PaginationItem> <PaginationItem> <PaginationNext href="#" /> </PaginationItem> </PaginationContent> </Pagination> )}Simple
Page numbers only — no previous or next.
tsx
import { Pagination, PaginationContent, PaginationItem, PaginationLink,} from "@/components/ui/pagination"export function Example() { return ( <Pagination> <PaginationContent> <PaginationItem> <PaginationLink href="#">1</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#" isActive> 2 </PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">3</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">4</PaginationLink> </PaginationItem> <PaginationItem> <PaginationLink href="#">5</PaginationLink> </PaginationItem> </PaginationContent> </Pagination> )}Icons Only
Previous and next controls only. Pair them with a DropdownMenu when people can change the number of rows per page.
Rows per page
tsx
import { useState } from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"import { Pagination, PaginationContent, PaginationItem, PaginationNext, PaginationPrevious,} from "@/components/ui/pagination"export function Example() { const [rows, setRows] = useState("25") return ( <div className="flex w-full items-center justify-between gap-4"> <div className="flex items-center gap-2"> <span className="text-sm tracking-wide text-muted-foreground whitespace-nowrap"> Rows per page </span> <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline", className: "w-[4.5rem]" })} > {rows} <ChevronDownIcon /> </DropdownMenuTrigger> <DropdownMenuContent align="start"> {(["10", "25", "50", "100"] as const).map((value) => ( <DropdownMenuItem key={value} onClick={() => setRows(value)}> {value} </DropdownMenuItem> ))} </DropdownMenuContent> </DropdownMenu> </div> <Pagination className="mx-0 w-auto"> <PaginationContent> <PaginationItem> <PaginationPrevious href="#" /> </PaginationItem> <PaginationItem> <PaginationNext href="#" /> </PaginationItem> </PaginationContent> </Pagination> </div> )}function ChevronDownIcon() { return ( <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden className="size-4" data-icon="inline-end" > <path d="m6 9 6 6 6-6" /> </svg> )}API Reference
Pagination
Renders the root <nav> with aria-label="pagination".
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<Pagination> <PaginationContent> <PaginationItem> <PaginationPrevious href="#" /> </PaginationItem> <PaginationItem> <PaginationLink href="#" isActive> 1 </PaginationLink> </PaginationItem> <PaginationItem> <PaginationNext href="#" /> </PaginationItem> </PaginationContent></Pagination>PaginationContent
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<PaginationContent> <PaginationItem>...</PaginationItem></PaginationContent>PaginationItem
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<PaginationItem> <PaginationLink href="#">1</PaginationLink></PaginationItem>PaginationLink
Renders an <a>. Active page matches outline Toggle pressed (border + accent fill, data-state="on") and aria-current="page".
| Prop | Type | Default |
|---|---|---|
| href | string | — |
| isActive | boolean | — |
| size | "default" | "icon" | "sm" | "lg" | "xs" | "icon-xs" | "icon-sm" | "icon-lg" | "icon" |
| className | string | — |
<PaginationLink href="#" isActive> 1</PaginationLink>PaginationPrevious
Label text is hidden below the sm breakpoint. Pass text to localize.
| Prop | Type | Default |
|---|---|---|
| href | string | — |
| text | string | "Previous" |
| className | string | — |
<PaginationPrevious href="#" />PaginationNext
Label text is hidden below the sm breakpoint. Pass text to localize.
| Prop | Type | Default |
|---|---|---|
| href | string | — |
| text | string | "Next" |
| className | string | — |
<PaginationNext href="#" />PaginationEllipsis
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<PaginationEllipsis />