TrademarkTrademark
Docs
Ctrl k
Search docs...
Components

Pagination

Updated: October 18, 2026
View on GitHub
Soon
Not released yet. This is on main and is not in any published version yet. It will not install today.

Pagination pages through a long list: previous and next buttons, the first and last pages, the pages around the current one, and an ellipsis for the rest. The number of buttons stays the same wherever you are, so the row keeps its width. Pass total pages, or count items and perPage. See the web Pagination for the browser version.

Basic usage

Without page, Pagination keeps its own state, starting at defaultPage.

Controlled with a page size

Pass page and onChange to own the state, as server-side paging needs. perPageOptions adds a page-size select; when the size changes, the page moves so the first item on screen stays on screen.

Differences from the web

  • On a phone, siblings={0} keeps the row to one line on most screens. The row wraps when it does not fit.
  • The page-size select is a native Select, labelled with labels.perPage inside the field, and opens a bottom sheet.
  • Page buttons are named "Page 3" and the current one is announced as selected, in place of aria-current="page". There is no nav landmark, so there is no aria-label.
  • Focus does not move back to the current page when an arrow disables itself at either end.

API reference

Prop
Type
Default
Description
pagenumberThe current page, from 1, when the host owns the state. Pair with onChange.
defaultPagenumber1The first page shown when Pagination keeps its own state.
onChange(page: number) => voidCalled with the new page. Not called for the page already shown.
totalnumberHow many pages there are.
countnumberHow many items there are. With perPage, gives the page count.
perPagenumberItems per page, when the host owns it. Pair with onPerPageChange.
defaultPerPagenumber10Items per page when Pagination keeps its own state.
perPageOptionsnumber[]Page sizes to offer in a select.
onPerPageChange(perPage: number) => voidCalled with the new page size.
siblingsnumber1Pages drawn on each side of the current page.
boundariesnumber1Pages always drawn at each end.
showFirstLastbooleanfalseAdds buttons to the first and last page.
size"s" | "m" | "l""m"The buttons' size.
disabledbooleanfalseDisables every control.
labelsPartial<PaginationLabels>The buttons' names and the per-page label, to translate them.
...FlexPropsFlexPropsSpacing, size and surface props for the row, as on Flex.
Edit this page on GitHub
TrademarkTrademark
Built with curiosity by Lorant One and the Design Engineers Club