Pagination
On this page
Importing
Add rh-pagination to your page with this import statement:
<script type="module">
import '@rhds/elements/rh-pagination/rh-pagination.js';
</script>
Copy to Clipboard
Copied!
Wrap lines
Overflow lines
To learn more about installing RHDS elements on your site using an import map read our getting started docs.
Lightdom CSS
This element requires you to load "Lightdom CSS" stylesheets for styling deeply slotted elements.
Note
Replace /path/to/ with path to the CSS file, whether local or CDN.
<link rel="stylesheet" href="/path/to/rh-pagination/rh-pagination-lightdom.css">
Usage
<meta itemprop="description" content="Default pagination with page links and numeric input.">
<rh-pagination>
<ol>
<li><a href="?page=1">1</a></li>
<li><a href="?page=2">2</a></li>
<li><a href="?page=3">3</a></li>
<li><a href="?page=4">4</a></li>
<li><a href="?page=5">5</a></li>
</ol>
</rh-pagination>
<link rel="stylesheet" href="../rh-pagination-lightdom.css">
<script type="module">
import '@rhds/elements/rh-pagination/rh-pagination.js';
</script>
Copy to Clipboard
Copied!
Wrap lines
Overflow lines
Implementation guidelines
Basic Structure
<rh-pagination>must have a nested<ol>element with at least one nested<li>and<a>element.- Each
<a>element must have anhrefattribute that links to the corresponding page.
URL Structure Options
You can implement pagination URLs using any of these approaches:
Option 1: Hash fragments (recommended for client-side routing)
- Example:
example.redhat.com/search/#2,example.redhat.com/search/#3 - If using query parameters, ensure the hash comes after:
example.redhat.com/search/?q=test#2
Option 2: Query parameters
- Example:
example.redhat.com/search?page=2,example.redhat.com/search?page=3 - Can be combined with other query parameters:
example.redhat.com/search?q=test&page=2
Option 3: Path-based URLs
- Example:
example.redhat.com/search/page/2,example.redhat.com/search/page/3
Option 4: Manual control with aria-current
- Set
aria-current="page"on the current page's<a>element - Useful for server-side rendered pagination
How the Current Page is Determined
The component determines the active page in this order:
- Looking for an
aria-current="page"attribute on an<a>tag - Matching the full URL (pathname, search parameters, and hash) against each link's
href - If no match is found, the component logs a warning: "could not determine current link"
rh-pagination
Enables navigation across pages of content using first/prev/next/last
stepper buttons, numbered page links, and a direct page-input field.
Authors MUST provide a single <ol> child with <li><a> page links.
The active page is determined by aria-current="page" or URL match.
Supports box and open variants, default and small sizes, and compact
layout. Tab moves focus through steppers and input; Enter activates.
Screen readers announce the <nav> landmark with the label property.
Truncation with ellipsis appears automatically beyond 9 pages.
Slots
3
| Slot Name | Summary | Description |
|---|---|---|
go-to-page
|
page input label text (go-to-page slot) |
Label text preceding the page number input field. Defaults to
"Page". Customize for internationalization. Visually hidden at
very small widths but always accessible to screen readers via
|
out-of
|
||
[default]
|
page link list (default slot) |
An |
Attributes
8
| Attribute | DOM Property | Description | Type | Default |
|---|---|---|---|---|
overflow
|
overflow |
Controls which end(s) of the page list are truncated with ellipsis.
Accepts |
|
|
label
|
label |
Accessible label for the |
|
|
label-first
|
labelFirst |
Accessible label for the first-page stepper button. Used by screen readers. Defaults to |
|
|
label-previous
|
labelPrevious |
Accessible label for the previous-page stepper button. Used by screen readers. Defaults to |
|
|
label-next
|
labelNext |
Accessible label for the next-page stepper button. Used by screen readers. Defaults to |
|
|
label-last
|
labelLast |
Accessible label for the last-page stepper button. Used by screen readers. Defaults to |
|
|
size
|
size |
Controls pagination size. Accepts |
|
|
variant
|
variant |
Visual variant. Accepts |
|
|
Methods
5
| Method Name | Description |
|---|---|
first()
|
Navigate to the first page |
prev()
|
Navigate to the previous page |
next()
|
Navigate to the next page |
last()
|
Navigate to the last page |
go(page: 'first' | 'prev' | 'next' | 'last' | number)
|
Navigate to a specific page |
Events
0
None
CSS Shadow Parts
4
| Part Name | Summary | Description |
|---|---|---|
numeric
|
shared container for the numeric controls at all widths |
|
container
|
pagination container |
|
numeric-middle
|
container for the numeric control at medium screen widths |
|
numeric-end
|
container for the numeric control at small and large screen widths |
CSS Custom Properties
4
| CSS Property | Description | Default |
|---|---|---|
--rh-color-icon-status-disabled |
—
|
|
--rh-pagination-stepper-color |
Sets the stepper color. |
var(--rh-color-gray-50, #707070)
|
--rh-pagination-background-focused |
Sets the disabled stepper color. |
—
|
--rh-pagination-accent-color |
--rh-pagination-accent-color
Controls the accent color used for interactive elements and focus states.
Defaults to Usage guidelines:
|
var(--rh-color-interactive-primary-default)
|
Design Tokens
34
| Token | Description | Copy |
|---|---|---|
--rh-length-3xl
|
48px length token |
|
--rh-space-xs
|
4px spacer |
|
--rh-color-interactive-primary-hover
|
|
|
--rh-color-interactive-primary-visited-default
|
|
|
--rh-color-interactive-primary-visited-hover
|
|
|
--rh-color-surface-lighter
|
Tertiary surface (light theme) |
|
--rh-color-surface-dark
|
Tertiary surface (dark theme) |
|
--rh-color-text-primary-on-dark
|
Primary text color for dark theme |
|
--rh-color-border-subtle-on-light
|
Subtle border color (light theme) |
|
--rh-color-text-secondary-on-dark
|
Secondary text color for dark theme |
|
--rh-font-family-heading
|
Pagination typeface Heading font family |
|
--rh-font-size-heading-xs
|
Pagination text size h6 heading font size |
|
--rh-border-width-lg
|
3px border width: Example: Expanded Accordion panel |
|
--rh-color-border-interactive
|
|
|
--rh-space-2xl
|
Pagination end margin 32px spacer |
|
--rh-length-2xl
|
Pagination block size 32px length token |
|
--rh-length-4xl
|
Pagination inline size 64px length token |
|
--rh-color-surface-lightest
|
Primary surface (light theme) |
|
--rh-color-surface-darkest
|
Primary surface (dark theme) |
|
--rh-color-border-subtle
|
|
|
--rh-color-gray-60
|
Secondary text (light theme) |
|
--rh-color-text-primary
|
Pagination text color |
|
--rh-color-interactive-primary-default
|
|
|
--rh-space-sm
|
Pagination vertical spacing 6px spacer |
|
--rh-space-md
|
Pagination horizontal spacing 8px spacer |
|
--rh-color-red-60
|
Dark brand red |
|
--rh-color-red-40
|
Light brand red |
|
--rh-font-size-body-text-md
|
Pagination text size Pagination text size 16px font size |
|
--rh-border-width-sm
|
1px border width; Example: Secondary CTA or Button |
|
--rh-color-gray-50
|
Subtle icon |
|
--rh-color-gray-40
|
Subtle icon (hover state) |
|
--rh-border-radius-default
|
Pagination corner rounding Pagination corner rounding 3px border radius; Example: Card |
|
--rh-border-width-md
|
Pagination focus outline Pagination focus outline 2px border width: Example: Alert |
|
--rh-space-lg
|
Pagination horizontal margin Pagination start margin 16px spacer |
|
Other libraries
To learn more about our other libraries, visit this page.
Feedback
To give feedback about anything on this page, contact us.