# Pagination
Navigate between multiple pages of content.
```tsx
import { faker } from '@faker-js/faker';
import { Pagination } from '@skeletonlabs/skeleton-react';
import { ArrowRightIcon, ArrowLeftIcon } from 'lucide-react';
import { useState } from 'react';
const users = Array.from({ length: 500 }, (_, i) => ({
id: i + 1,
name: faker.person.fullName(),
email: faker.internet.email(),
country: faker.location.country(),
}));
const PAGE_SIZE = 5;
export default function Default() {
const [page, setPage] = useState(1);
const start = (page - 1) * PAGE_SIZE;
const end = start + PAGE_SIZE;
const data = users.slice(start, end);
return (
ID |
Name |
Email |
Country |
{data.map((user) => (
{user.id} |
{user.name} |
{user.email} |
{user.country} |
))}
setPage(event.page)}>
{(pagination) =>
pagination.pages.map((page, index) =>
page.type === 'page' ? (
{page.value}
) : (
…
),
)
}
);
}
```
## Page Size
```tsx
import { faker } from '@faker-js/faker';
import { Pagination } from '@skeletonlabs/skeleton-react';
import { ArrowRightIcon, ArrowLeftIcon } from 'lucide-react';
import { useState } from 'react';
const users = Array.from({ length: 500 }, (_, i) => ({
id: i + 1,
name: faker.person.fullName(),
email: faker.internet.email(),
country: faker.location.country(),
}));
export default function Default() {
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(5);
const start = (page - 1) * pageSize;
const end = start + pageSize;
const data = users.slice(start, end);
return (
ID |
Name |
Email |
Country |
{data.map((user) => (
{user.id} |
{user.name} |
{user.email} |
{user.country} |
))}
setPage(event.page)}>
{(pagination) =>
pagination.pages.map((page, index) =>
page.type === 'page' ? (
{page.value}
) : (
…
),
)
}
);
}
```
## Direction
```tsx
import { faker } from '@faker-js/faker';
import { Pagination } from '@skeletonlabs/skeleton-react';
import { ArrowRightIcon, ArrowLeftIcon } from 'lucide-react';
import { useState } from 'react';
const users = Array.from({ length: 500 }, (_, i) => ({
id: i + 1,
name: faker.person.fullName(),
email: faker.internet.email(),
country: faker.location.country(),
}));
const PAGE_SIZE = 5;
export default function Dir() {
const [page, setPage] = useState(1);
const start = (page - 1) * PAGE_SIZE;
const end = start + PAGE_SIZE;
const data = users.slice(start, end);
return (
ID |
Name |
Email |
Country |
{data.map((user) => (
{user.id} |
{user.name} |
{user.email} |
{user.country} |
))}
setPage(event.page)} dir="rtl">
{(pagination) =>
pagination.pages.map((page, index) =>
page.type === 'page' ? (
{page.value}
) : (
…
),
)
}
);
}
```
## Total Count
For server-side pagination, your data source may be truncated. Make sure to specify the total records using `count`.
```json
{
"data": [...],
"pagination": {
"page": 1,
"limit": 10,
"count": 500,
}
}
```
{/* prettier-ignore */}
```tsx
...
```
## API Reference
### PaginationRootProps
| Property | Default | Type | Description |
| ----------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| ids? | - | Partial\<\{ root: string; ellipsis: (index: number) => string; prevTrigger: string; nextTrigger: string; item: (page: number) => string; }> \| undefined | The ids of the elements in the accordion. Useful for composition. |
| translations? | - | IntlTranslations \| undefined | Specifies the localized strings that identifies the accessibility elements and their states |
| count? | - | number \| undefined | Total number of data items |
| pageSize? | - | number \| undefined | The controlled number of data items per page |
| defaultPageSize? | 10 | number \| undefined | The initial number of data items per page when rendered.
Use when you don't need to control the page size of the pagination. |
| siblingCount? | 1 | number \| undefined | Number of pages to show beside active page |
| page? | - | number \| undefined | The controlled active page |
| defaultPage? | 1 | number \| undefined | The initial active page when rendered.
Use when you don't need to control the active page of the pagination. |
| onPageChange? | - | ((details: PageChangeDetails) => void) \| undefined | Called when the page number is changed |
| onPageSizeChange? | - | ((details: PageSizeChangeDetails) => void) \| undefined | Called when the page size is changed |
| type? | "button" | "button" \| "link" \| undefined | The type of the trigger element |
| getPageUrl? | - | ((details: PageUrlDetails) => string) \| undefined | Function to generate href attributes for pagination links.
Only used when \`type\` is set to "link". |
| dir? | "ltr" | "ltr" \| "rtl" \| undefined | The document's text/writing direction. |
| getRootNode? | - | (() => ShadowRoot \| Node \| Document) \| undefined | A root node to correctly resolve document in custom environments. E.x.: Iframes, Electron. |
| element? | - | ((attributes: HTMLAttributes\<"nav">) => Element) \| undefined | Render the element yourself |
### PaginationRootProviderProps
| Property | Default | Type | Description |
| -------- | ------- | -------------------------------------------------------------- | --------------------------- |
| value | - | PaginationApi\ | - |
| element? | - | ((attributes: HTMLAttributes\<"nav">) => Element) \| undefined | Render the element yourself |
### PaginationRootContextProps
| Property | Default | Type | Description |
| -------- | ------- | ---------------------------------------------------- | ----------- |
| children | - | (pagination: PaginationApi\) => ReactNode | - |
### PaginationPrevTriggerProps
| Property | Default | Type | Description |
| -------- | ------- | ----------------------------------------------------------------- | --------------------------- |
| element? | - | ((attributes: HTMLAttributes\<"button">) => Element) \| undefined | Render the element yourself |
### PaginationItemProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------------------ | --------------------------- |
| type | - | "page" | - |
| value | - | number | - |
| element? | - | ((attributes: HTMLAttributes\<"a">) => Element) \| undefined | Render the element yourself |
### PaginationEllipsisProps
| Property | Default | Type | Description |
| -------- | ------- | --------------------------------------------------------------- | --------------------------- |
| index | - | number | - |
| element? | - | ((attributes: HTMLAttributes\<"span">) => Element) \| undefined | Render the element yourself |
### PaginationNextTriggerProps
| Property | Default | Type | Description |
| -------- | ------- | ----------------------------------------------------------------- | --------------------------- |
| element? | - | ((attributes: HTMLAttributes\<"button">) => Element) \| undefined | Render the element yourself |