Allows the user to select a specific page from a range of pages.
Import
import { Pagination } from "@kobalte/core/pagination";// orimport { Root, Item, ... } from "@kobalte/core/pagination";// or (deprecated)import { Pagination } from "@kobalte/core";Features
- Labeling support for accessibility.
- Tab focus management.
- Can be controlled or uncontrolled.
- Customizable appearance.
Anatomy
The pagination consists of:
- Pagination: The root container for the pagination component.
- Pagination.Item: An item of the pagination.
- Pagination.Ellipsis: Ellipsis item of the pagination.
- Pagination.Previous: Previous button of the pagination.
- Pagination.Next: Next button of the pagination.
- Pagination.Items: Contains the list of items and allows a user to select one of them.
<Pagination> <Pagination.Previous/> <Pagination.Items/> <Pagination.Next/></Select>Example
import { Pagination } from "@kobalte/core/pagination";
export function BasicExample() { return ( <Pagination class={style.pagination__root} count={10} itemComponent={(props) => ( <Pagination.Item class={style.pagination__item} page={props.page}> {props.page} </Pagination.Item> )} ellipsisComponent={() => ( <Pagination.Ellipsis class={style.pagination__ellipsis}> ... </Pagination.Ellipsis> )} > <Pagination.Previous class={style.pagination__item}> Previous </Pagination.Previous> <Pagination.Items /> <Pagination.Next class={style.pagination__item}>Next</Pagination.Next> </Pagination> );}.pagination__root > ul { display: inline-flex; align-items: center; justify-content: space-between; gap: 0.5rem;}
.pagination__item { appearance: none; display: inline-flex; justify-content: center; align-items: center; height: 40px; width: auto; outline: none; border-radius: 6px; padding: 0 16px; background-color: white; color: hsl(240 4% 16%); font-size: 16px; line-height: 0; transition: 250ms background-color, 250ms color, 250ms border-color; cursor: pointer; font-variant-numeric: tabular-nums; border: 1px solid hsl(240 6% 90%);}
.pagination__ellipsis { display: inline-flex; justify-content: center; align-items: center; height: 40px; width: auto; outline: none; border-radius: 6px; padding: 0 16px; background-color: white; color: hsl(240 4% 16%); font-size: 16px; line-height: 0; cursor: default; border: 1px solid hsl(240 6% 90%);}
.pagination__item[aria-current="page"] { background-color: hsl(200 98% 39%); color: white;}
.pagination__item:hover { background-color: hsl(200 98% 39%); color: white;}
.pagination__item:focus-visible { outline: 2px solid hsl(200 98% 39%); outline-offset: 2px; color: white;}
.pagination__item:active { background-color: hsl(201 90% 27%); color: white;}
[data-theme*="dark"] .pagination__item { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9);}
[data-theme*="dark"] .pagination__ellipsis { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9);}
[data-theme*="dark"] .pagination__item[aria-current="page"] { background-color: hsl(201 96% 32%); color: hsla(0 100% 100% / 0.9);}
[data-theme*="dark"] .pagination__item:hover { border-color: hsl(240 4% 46%);}
[data-theme*="dark"] .pagination__item:active { background-color: hsl(199 89% 48%);}Usage
Default value
An initial, uncontrolled page can be provided using the defaultPage prop, which accepts a number smaller or equal to the count and starts at 1.
<Pagination count={10} defaultPage={4} itemComponent={props => <Pagination.Item page={props.page}>{props.page}</Pagination.Item>} ellipsisComponent={() => <Pagination.Ellipsis>...</Pagination.Ellipsis>}> <Pagination.Previous>Previous</Pagination.Previous> <Pagination.Items /> <Pagination.Next>Next</Pagination.Next></Pagination>Controlled value
The page prop, which accepts a page number, can be used to make the value controlled. The onPageChange event is fired when the user selects an item, and receives the new page number.
import { createSignal } from "solid-js";
export function ControlledExample() { const [page, setPage] = createSignal(4);
return ( <Pagination page={page()} onPageChange={setPage} count={10} itemComponent={props => <Pagination.Item page={props.page}>{props.page}</Pagination.Item>} ellipsisComponent={() => <Pagination.Ellipsis>...</Pagination.Ellipsis>} > <Pagination.Previous>Previous</Pagination.Previous> <Pagination.Items /> <Pagination.Next>Next</Pagination.Next> </Pagination> );}Next / Previous buttons example
The appearance can be customized by omitting the Next and Previous Button.
<Pagination count={10} itemComponent={props => <Pagination.Item page={props.page}>{props.page}</Pagination.Item>} ellipsisComponent={() => <Pagination.Ellipsis>...</Pagination.Ellipsis>}> <Pagination.Items /></Pagination>First / Last item example
The First and Last item can be hidden instead of displaying at all times.
<Pagination count={10} showFirst={false} showLast={false} itemComponent={props => <Pagination.Item page={props.page}>{props.page}</Pagination.Item>} ellipsisComponent={() => <Pagination.Ellipsis>...</Pagination.Ellipsis>}> <Pagination.Previous>Previous</Pagination.Previous> <Pagination.Items /> <Pagination.Next>Next</Pagination.Next></Pagination>Siblings example
The number of items around the current page item can be customized.
<Pagination count={10} siblingCount={2} itemComponent={props => <Pagination.Item page={props.page}>{props.page}</Pagination.Item>} ellipsisComponent={() => <Pagination.Ellipsis>...</Pagination.Ellipsis>}> <Pagination.Previous>Previous</Pagination.Previous> <Pagination.Items /> <Pagination.Next>Next</Pagination.Next></Pagination>Fixed Items example
The total number of items can be fixed to avoid content shift. If ellipsis are disabled (by returning an empty component) use fixedItems="no-ellipsis" instead.
<Pagination count={10} fixedItems itemComponent={props => <Pagination.Item page={props.page}>{props.page}</Pagination.Item>} ellipsisComponent={() => <Pagination.Ellipsis>...</Pagination.Ellipsis>}> <Pagination.Previous>Previous</Pagination.Previous> <Pagination.Items /> <Pagination.Next>Next</Pagination.Next></Pagination>API Reference
Pagination
Pagination is equivalent to the Root import from @kobalte/core/pagination (and deprecated Pagination.Root).
| Prop | Description |
|---|---|
| page | number The controlled page number of the pagination. (1-indexed) |
| defaultPage | string The default page number when initially rendered. (1-indexed) |
| onPageChange | (page: number) => void Event handler called when the page number changes. |
| count | number The number of pages for the pagination. |
| siblingCount | number The number of siblings to show around the current page item. |
| showFirst | boolean Whether to always show the first page item. |
| showLast | boolean Whether to always show the last page item. |
| fixedItems | boolean | "no-ellipsis" Whether to always show the same number of items (to avoid content shift). Special value: "no-ellipsis" does not count the ellipsis as an item (used when ellipsis are disabled). |
| itemComponent | Component<{page: number}> The component to render as an item in the Pagination.Items. |
| ellipsisComponent | Component The component to render as an ellipsis item in the Pagination.Items. |
| disabled | boolean Whether the pagination is disabled. |
| Data attribute | Description |
|---|---|
| data-disabled | Present when the pagination is disabled. |
Pagination.Item
| Prop | Description |
|---|---|
| page | number The page number to render. |
| Data attribute | Description |
|---|---|
| data-current | Present when the item is the current page. |
Rendered elements
| Component | Default rendered element |
|---|---|
Pagination | div |
Pagination.Item | button |
Pagination.Ellipsis | div |
Pagination.Previous | button |
Pagination.Next | button |
Pagination.Items | none |
Last updated: 7/16/26, 7:09 AM