Pagination
Install: npm install @mantine/core@9.7.1 @mantine/hooks@9.7.1
Version and compatibility
Pinned Mantine Core 9.7.1 requires React and React DOM ^19.2.0 and matching @mantine/hooks@9.7.1, from the installed npm package's peerDependencies. Do not force it into React 18 or another incompatible version. Explain upgrade impact and agree on a plan with the project owner; do not hide conflicts with --force/--legacy-peer-deps. The native Provider enables theme.respectReducedMotion and uses forceColorScheme for light/dark.
Use case
Choose a page from a known page count.
Native props used by this example
These props are extracted from the local typechecked JSX and grouped by their owning native component. This is not an exhaustive prop list; see pinned source signatures and inheritance below.
| Component prop | Explanation |
|---|---|
Pagination.total | Known page count, not an item count or a data-fetch callback. |
Interaction and state checks
Current scenarios: Default. Check actual behavior after selecting supported disabled/error/read-only scenarios; components without those native states do not receive invented universal props. Verify keyboard focus and exits, then connect changed values through the native callback signature.
Business integration boundary
Demo content/state is local, without server persistence, authorization or fetching. A static display component is not a completed business workflow.
Host setup
Install pinned @mantine/core and @mantine/hooks, import @mantine/core/styles.css at the entry and use MantineProvider. The example's theme/variant are JGuang-authored host props, not universal native component APIs; forceColorScheme synchronizes the app theme. Native implementation source is a reading reference: use npm exports rather than copying internal engines. This batch covers Core, not dates/charts/forms extension packages. Detailed upstream prose remains English.
Runnable usage
import { useState } from 'react';
import * as M from '@mantine/core';
import '@mantine/core/styles.css';
function ComponentPreview({ variant = 'Default' }: { variant?: string }) {
return <M.Pagination total={10} />;
}
export default function Example({ variant = 'Default', theme = 'light' }: { variant?: string; theme?: 'light' | 'dark' }) {
return <M.MantineProvider forceColorScheme={theme} theme={{ respectReducedMotion: true }}><ComponentPreview variant={variant} /></M.MantineProvider>;
}
Preview states
Default
The example uses the native Mantine API. For supported input demos, change the local variant to Disabled, Invalid or Read only; these are example labels, not new component props. Keep the documented data, controlled values, stores and compound children when adapting the example.
Usage
Example with chunked content
Controlled
To control the component state, provide value and onChange props:
import { useState } from 'react';
import { Pagination } from '@mantine/core';
function Demo() {
const [activePage, setPage] = useState(1);
return (
<Pagination value={activePage} onChange={setPage} total={10} />
);
}
Siblings
Control the number of active item siblings with the siblings prop:
Boundaries
Control the number of items displayed after previous and before next buttons with the boundaries prop:
Responsive layout
Set layout="responsive" to use CSS container queries to show a compact "Page X of Y" label
when the container is narrow. Use formatLabel prop to customize the label text.
Hide pages controls
Set withPages={false} to hide the pages controls:
Compound components
You can use the following compound components to have full control over the Pagination rendering:
Pagination.Root– context providerPagination.Items– items listPagination.Next– next controlPagination.Previous– previous controlPagination.First– first controlPagination.Last– last controlPagination.Label– compact label for responsive layout
Controls as links
Change icons
Controls size
By default, pagination controls have reduced size compared to inputs and buttons.
If you want controls to have the same size as inputs and buttons, you can use input- prefix for the size prop:
Start value
Set startValue to define the starting page number. For example, with startValue={5} and total={15},
the pagination range will be from 5 to 15:
URL synchronization
You can synchronize pagination state with URL query parameters. This pattern is commonly used for list views where you want to share the URL with a specific page selected.
Next.js
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
import { Pagination } from '@mantine/core';
function Demo() {
const router = useRouter();
const searchParams = useSearchParams();
const pathname = usePathname();
const page = Number(searchParams.get('page')) || 1;
const handlePageChange = (p: number) => {
const params = new URLSearchParams(searchParams);
params.set('page', p.toString());
router.push(`${pathname}?${params.toString()}`);
};
return <Pagination total={10} value={page} onChange={handlePageChange} />;
}
react-router-dom
import { useSearchParams } from 'react-router-dom';
import { Pagination } from '@mantine/core';
function Demo() {
const [searchParams, setSearchParams] = useSearchParams();
const page = Number(searchParams.get('page')) || 1;
const handlePageChange = (p: number) => {
setSearchParams({ page: p.toString() });
};
return <Pagination total={10} value={page} onChange={handlePageChange} />;
}
nuqs
Example using nuqs:
import { useQueryState, parseAsInteger } from 'nuqs';
import { Pagination } from '@mantine/core';
function Demo() {
const [page, setPage] = useQueryState('page', parseAsInteger.withDefault(1));
return <Pagination total={10} value={page} onChange={setPage} />;
}
use-pagination hook
If you need more flexibility, the @mantine/hooks package exports the use-pagination hook.
You can use it to create custom pagination components.
Source-backed parameter reference
Implementation signatures and types are generated from the pinned local source. Optional props, native inherited types, union branches and never exclusions are preserved. A forwardRef implementation's ref is a React reference, not an additional business prop.
Pagination(_props)
export type PaginationStylesNames = PaginationRootStylesNames;
export type PaginationCssVariables = PaginationRootCssVariables;
export interface PaginationProps extends PaginationRootProps {
/** If set, first/last controls are displayed @default false */
withEdges?: boolean;
/** If set, next/previous controls are displayed @default true */
withControls?: boolean;
/** Props passed down to next/previous/first/last controls */
getControlProps?: (control: 'first' | 'previous' | 'last' | 'next') => Record<string, any>;
/** Next control icon component */
nextIcon?: PaginationIcon;
/** Previous control icon component */
previousIcon?: PaginationIcon;
/** Last control icon component */
lastIcon?: PaginationIcon;
/** First control icon component */
firstIcon?: PaginationIcon;
/** Dots icon component */
dotsIcon?: PaginationIcon;
/** Key of `theme.spacing`, gap between controls @default 8 */
gap?: MantineSpacing;
/** If set, the pagination is hidden when only one page is available (`total={1}`) @default false */
hideWithOnePage?: boolean;
/** If set to `false`, page number buttons are hidden, only next/previous controls remain @default `true` */
withPages?: boolean;
/** Function to format the label text displayed in responsive mode */
formatLabel?: PaginationFormatLabel;
}
export type PaginationFactory = Factory<{
props: PaginationProps;
ref: HTMLDivElement;
stylesNames: PaginationStylesNames;
vars: PaginationCssVariables;
staticComponents: {
Root: typeof PaginationRoot;
Control: typeof PaginationControl;
Dots: typeof PaginationDots;
First: typeof PaginationFirst;
Last: typeof PaginationLast;
Next: typeof PaginationNext;
Previous: typeof PaginationPrevious;
Items: typeof PaginationItems;
Label: typeof PaginationLabel;
};
}>;
Native and external types
External types remain defined by React or native dependencies, not manually expanded into guessed props. The installed version's TypeScript definitions are authoritative.
Factory<{
props: PaginationProps;
ref: HTMLDivElement;
stylesNames: PaginationStylesNames;
vars: PaginationCssVariables;
staticComponents: {
Root: typeof PaginationRoot;
Control: typeof PaginationControl;
Dots: typeof PaginationDots;
First: typeof PaginationFirst;
Last: typeof PaginationLast;
Next: typeof PaginationNext;
Previous: typeof PaginationPrevious;
Items: typeof PaginationItems;
Label: typeof PaginationLabel;
};
}>
PaginationRootProps
Record<string, any>
PaginationIcon
MantineSpacing
PaginationFormatLabel
HTMLDivElement
PaginationRootStylesNames
PaginationRootCssVariables