apps/docs/content/docs/react/components/(navigation)/pagination.mdx
import { Pagination } from '@heroui/react';
<ComponentPreview name="pagination-basic" />
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>
);
<ComponentPreview name="pagination-sizes" />
<ComponentPreview name="pagination-with-ellipsis" />
<ComponentPreview name="pagination-simple-prev-next" />
<ComponentPreview name="pagination-with-summary" />
You can replace the default chevron icons by passing custom children to PreviousIcon and NextIcon.
<ComponentPreview name="pagination-custom-icons" />
<ComponentPreview name="pagination-controlled" />
<ComponentPreview name="pagination-disabled" />
<RelatedComponents component="pagination" />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>
);
}
To customize the Pagination component classes, you can use the @layer components directive.
@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.
The Pagination component uses these CSS classes (View source styles):
.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.pagination--sm - Small size variant.pagination--md - Medium size variant (default).pagination--lg - Large size variantThe component supports both CSS pseudo-classes and data attributes for flexibility:
[data-active="true"] or [aria-current="page"]:hover or [data-hovered="true"]:focus-visible or [data-focus-visible="true"]:disabled or [aria-disabled="true"]:active or [data-pressed="true"]| 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) |
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Summary content (e.g., "Showing 1-10 of 120") |
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Pagination items |
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Item content (Link, Previous, Next, or Ellipsis) |
| 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 |
| 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) |
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | Default chevron SVG | Custom icon to replace the default chevron |
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
The Pagination component is built on React Aria's Button primitive for all interactive elements, providing:
<nav> element with aria-label="pagination" and role="navigation"aria-current="page" on the current link:focus-visiblearia-hidden="true" to avoid screen reader confusionisDisabledNote: Pagination buttons use
onPressinstead ofonClick. TheonPresshandler from React Aria normalizes press behavior across pointer types and provides accessibility improvements out of the box.