Pagination
Navigation controls for moving between pages of content, with previous/next buttons and page numbers.
The Pagination component provides page navigation controls with previous/next buttons, numbered page links, and ellipsis for truncated ranges. It uses the buttonVariants from the Button component for consistent styling and supports active page highlighting.
Preview
Installation
npx novaui-cli add paginationDependencies
lucide-react-native>= 0.300- Requires the
Buttoncomponent (forbuttonVariants)
Import
import {
Pagination,
PaginationContent,
PaginationItem,
PaginationLink,
PaginationPrevious,
PaginationNext,
PaginationEllipsis,
} from 'novaui-components'Basic Usage
The Pagination is a compound component with these parts:
Pagination- Rootnavcontainer with accessibility rolePaginationContent- Horizontal list of pagination itemsPaginationItem- Wrapper for each page elementPaginationLink- Numbered page button (supportsisActive)PaginationPrevious- Previous page button with chevron iconPaginationNext- Next page button with chevron iconPaginationEllipsis- Dots indicating truncated page range
import {
Pagination,
PaginationContent,
PaginationItem,
PaginationLink,
PaginationPrevious,
PaginationNext,
} from 'novaui-components'
export function BasicPagination() {
return (
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious onPress={() => {}} />
</PaginationItem>
<PaginationItem>
<PaginationLink isActive>1</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink>2</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink>3</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationNext onPress={() => {}} />
</PaginationItem>
</PaginationContent>
</Pagination>
)
}With Ellipsis
Show ellipsis when there are many pages:
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious onPress={() => {}} />
</PaginationItem>
<PaginationItem>
<PaginationLink>1</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink>2</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink isActive>3</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationEllipsis />
</PaginationItem>
<PaginationItem>
<PaginationLink>10</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationNext onPress={() => {}} />
</PaginationItem>
</PaginationContent>
</Pagination>Controlled Pagination
Build a fully controlled pagination with state:
import { useState } from 'react'
export function ControlledPagination() {
const [currentPage, setCurrentPage] = useState(1)
const totalPages = 10
return (
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious
onPress={() => setCurrentPage((p) => Math.max(1, p - 1))}
/>
</PaginationItem>
{[1, 2, 3].map((page) => (
<PaginationItem key={page}>
<PaginationLink
isActive={currentPage === page}
onPress={() => setCurrentPage(page)}
>
{page}
</PaginationLink>
</PaginationItem>
))}
{currentPage < totalPages - 2 && (
<PaginationItem>
<PaginationEllipsis />
</PaginationItem>
)}
<PaginationItem>
<PaginationLink
isActive={currentPage === totalPages}
onPress={() => setCurrentPage(totalPages)}
>
{totalPages}
</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationNext
onPress={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
/>
</PaginationItem>
</PaginationContent>
</Pagination>
)
}Props API
Pagination Props
Extends React.ComponentPropsWithoutRef<typeof View>:
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
Root has role="navigation" and aria-label="pagination".
PaginationContent Props
Extends React.ComponentPropsWithoutRef<typeof View>:
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
PaginationItem Props
Extends React.ComponentPropsWithoutRef<typeof View>:
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
PaginationLink Props
Extends React.ComponentPropsWithoutRef<typeof Pressable> and Pick<ButtonProps, 'size'>:
| Prop | Type | Default | Description |
|---|---|---|---|
isActive | boolean | false | Whether this page is the current active page |
size | ButtonSize | 'icon' | Button size variant |
className | string | - | Additional CSS classes |
Active links use variant="outline", inactive use variant="ghost".
PaginationPrevious Props
Extends PaginationLink props:
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
Renders a ChevronLeft icon with "Previous" label. Uses size="default".
PaginationNext Props
Extends PaginationLink props:
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
Renders "Next" label with a ChevronRight icon. Uses size="default".
PaginationEllipsis Props
Extends React.ComponentPropsWithoutRef<typeof View>:
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
Best Practices
-
Show context: Always indicate the active page with
isActiveso users know where they are -
Truncate large ranges: Use
PaginationEllipsiswhen there are more than 5-7 pages to keep the UI compact -
Disable at bounds: Disable or hide
PaginationPreviouson page 1 andPaginationNexton the last page -
Pair with tables: Place pagination below
Tablecomponents for paginated data sets -
Consistent placement: Always position pagination at the bottom of the content it controls
Related Components
- Use below
Tablefor paginated data - Combine with
Cardfor a contained data view - Use
Buttonvariants for custom page navigation controls