Pagination
Page navigation with composable page links, previous/next buttons, and ellipsis indicators
Import
import { Pagination } from '@heroui/react';Usage
Anatomy
Import the Pagination component and access all parts using dot notation.
import { Pagination } from '@heroui/react';
export default () => (
<Pagination>
<Pagination.Summary>Showing 1-10 of 100 results</Pagination.Summary>
<Pagination.Content>
<Pagination.Item>
<Pagination.Previous>
<Pagination.PreviousIcon />
<span>Previous</span>
</Pagination.Previous>
</Pagination.Item>
<Pagination.Item>
<Pagination.Link isActive>1</Pagination.Link>
</Pagination.Item>
<Pagination.Item>
<Pagination.Ellipsis />
</Pagination.Item>
<Pagination.Item>
<Pagination.Link>10</Pagination.Link>
</Pagination.Item>
<Pagination.Item>
<Pagination.Next>
<span>Next</span>
<Pagination.NextIcon />
</Pagination.Next>
</Pagination.Item>
</Pagination.Content>
</Pagination>
);Sizes
With Ellipsis
Simple (Previous / Next)
With Summary
Custom Icons
You can replace the default chevron icons by passing custom children to PreviousIcon and NextIcon.
Controlled
Disabled
Styling
Passing Tailwind CSS classes
You can customize individual Pagination parts:
import { Pagination } from '@heroui/react';
function CustomPagination() {
return (
<Pagination className="gap-8">
<Pagination.Content className="gap-2">
<Pagination.Item>
<Pagination.Link className="rounded-md" isActive>1</Pagination.Link>
</Pagination.Item>
</Pagination.Content>
</Pagination>
);
}Customizing the component classes
To customize the Pagination component classes, you can use the @layer components directive.
Learn more.
@layer components {
.pagination {
@apply gap-8;
}
.pagination__link {
@apply rounded-md;
}
.pagination__summary {
@apply text-xs font-semibold;
}
}HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
CSS Classes
The Pagination component uses these CSS classes (View source styles):
Base & Layout Classes
.pagination- Root navigation container with flex layout.pagination__summary- Left-side info text container.pagination__content- Container for pagination items.pagination__item- Individual item wrapper.pagination__link- Page number button (ghost button style).pagination__link--nav- Navigation button modifier (Previous/Next).pagination__ellipsis- Ellipsis indicator
Size Classes
.pagination--sm- Small size variant.pagination--md- Medium size variant (default).pagination--lg- Large size variant
Interactive States
The component supports both CSS pseudo-classes and data attributes for flexibility:
- Active page:
[data-active="true"]or[aria-current="page"] - Hover:
:hoveror[data-hovered="true"] - Focus:
:focus-visibleor[data-focus-visible="true"] - Disabled:
:disabledor[aria-disabled="true"] - Pressed:
:activeor[data-pressed="true"]
API Reference
Pagination Props
| Prop | Type | Default | Description |
|---|---|---|---|
size | "sm" | "md" | "lg" | "md" | Size of the pagination items |
className | string | - | Additional CSS classes |
children | ReactNode | - | Pagination parts (Summary, Content) |
Pagination.Summary Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Summary content (e.g., "Showing 1-10 of 120") |
Pagination.Content Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Pagination items |
Pagination.Item Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Item content (Link, Previous, Next, or Ellipsis) |
Pagination.Link Props
| Prop | Type | Default | Description |
|---|---|---|---|
isActive | boolean | false | Whether this is the current page |
isDisabled | boolean | false | Whether the link is disabled |
onPress | (e: PressEvent) => void | - | Press handler (from React Aria) |
className | string | - | Additional CSS classes |
children | ReactNode | - | Page number content |
Pagination.Previous / Pagination.Next Props
| Prop | Type | Default | Description |
|---|---|---|---|
isDisabled | boolean | false | Whether the button is disabled |
onPress | (e: PressEvent) => void | - | Press handler (from React Aria) |
className | string | - | Additional CSS classes |
children | ReactNode | - | Button content (compose with PreviousIcon/NextIcon) |
Pagination.PreviousIcon / Pagination.NextIcon Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | Default chevron SVG | Custom icon to replace the default chevron |
Pagination.Ellipsis Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
Accessibility
The Pagination component is built on React Aria's Button primitive for all interactive elements, providing:
- Semantic
<nav>element witharia-label="pagination"androle="navigation" - Active page indicated via
aria-current="page"on the current link - Keyboard navigation via Tab key through all interactive elements
- Press events handled across mouse, touch, and keyboard interactions via React Aria
- Focus ring on keyboard navigation via
:focus-visible - Ellipsis marked with
aria-hidden="true"to avoid screen reader confusion - Disabled states properly communicated to assistive technology via
isDisabled
Note: Pagination buttons use
onPressinstead ofonClick. TheonPresshandler from React Aria normalizes press behavior across pointer types and provides accessibility improvements out of the box.



