HeroUI

PaginationNew

Page navigation with composable page links, previous/next buttons, and ellipsis indicators

Import

import { Pagination } from '@heroui/react';

Usage

"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

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

sm
md
lg
"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

With Ellipsis

"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

Simple (Previous / Next)

"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

With Summary

"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

Custom Icons

You can replace the default chevron icons by passing custom children to PreviousIcon and NextIcon.

"use client";

import {Pagination} from "@heroui/react";
import {Icon} from "@iconify/react";
import {useState} from "react";

Controlled

"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

Disabled

"use client";

import {Pagination} from "@heroui/react";
import {useState} from "react";

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: :hover or [data-hovered="true"]
  • Focus: :focus-visible or [data-focus-visible="true"]
  • Disabled: :disabled or [aria-disabled="true"]
  • Pressed: :active or [data-pressed="true"]

API Reference

Pagination Props

PropTypeDefaultDescription
size"sm" | "md" | "lg""md"Size of the pagination items
classNamestring-Additional CSS classes
childrenReactNode-Pagination parts (Summary, Content)

Pagination.Summary Props

PropTypeDefaultDescription
classNamestring-Additional CSS classes
childrenReactNode-Summary content (e.g., "Showing 1-10 of 120")

Pagination.Content Props

PropTypeDefaultDescription
classNamestring-Additional CSS classes
childrenReactNode-Pagination items

Pagination.Item Props

PropTypeDefaultDescription
classNamestring-Additional CSS classes
childrenReactNode-Item content (Link, Previous, Next, or Ellipsis)
PropTypeDefaultDescription
isActivebooleanfalseWhether this is the current page
isDisabledbooleanfalseWhether the link is disabled
onPress(e: PressEvent) => void-Press handler (from React Aria)
classNamestring-Additional CSS classes
childrenReactNode-Page number content

Pagination.Previous / Pagination.Next Props

PropTypeDefaultDescription
isDisabledbooleanfalseWhether the button is disabled
onPress(e: PressEvent) => void-Press handler (from React Aria)
classNamestring-Additional CSS classes
childrenReactNode-Button content (compose with PreviousIcon/NextIcon)

Pagination.PreviousIcon / Pagination.NextIcon Props

PropTypeDefaultDescription
classNamestring-Additional CSS classes
childrenReactNodeDefault chevron SVGCustom icon to replace the default chevron

Pagination.Ellipsis Props

PropTypeDefaultDescription
classNamestring-Additional CSS classes

Accessibility

The Pagination component is built on React Aria's Button primitive for all interactive elements, providing:

  • Semantic <nav> element with aria-label="pagination" and role="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 onPress instead of onClick. The onPress handler from React Aria normalizes press behavior across pointer types and provides accessibility improvements out of the box.

On this page