Pagination

Previous, next, and numbered page controls.

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 pagination

Usage

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
        └── PaginationNext

Basic

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".

PropTypeDefault
classNamestring
<Pagination>  <PaginationContent>    <PaginationItem>      <PaginationPrevious href="#" />    </PaginationItem>    <PaginationItem>      <PaginationLink href="#" isActive>        1      </PaginationLink>    </PaginationItem>    <PaginationItem>      <PaginationNext href="#" />    </PaginationItem>  </PaginationContent></Pagination>

PaginationContent

PropTypeDefault
classNamestring
<PaginationContent>  <PaginationItem>...</PaginationItem></PaginationContent>

PaginationItem

PropTypeDefault
classNamestring
<PaginationItem>  <PaginationLink href="#">1</PaginationLink></PaginationItem>

Renders an <a>. Active page matches outline Toggle pressed (border + accent fill, data-state="on") and aria-current="page".

PropTypeDefault
hrefstring
isActiveboolean
size"default" | "icon" | "sm" | "lg" | "xs" | "icon-xs" | "icon-sm" | "icon-lg""icon"
classNamestring
<PaginationLink href="#" isActive>  1</PaginationLink>

PaginationPrevious

Label text is hidden below the sm breakpoint. Pass text to localize.

PropTypeDefault
hrefstring
textstring"Previous"
classNamestring
<PaginationPrevious href="#" />

PaginationNext

Label text is hidden below the sm breakpoint. Pass text to localize.

PropTypeDefault
hrefstring
textstring"Next"
classNamestring
<PaginationNext href="#" />

PaginationEllipsis

PropTypeDefault
classNamestring
<PaginationEllipsis />