A lightweight, windowed pagination component for React
npm install react-compact-paginationA lightweight, windowed pagination component for React with a compact UI and predictable behavior.
Designed to work seamlessly with Next.js, React Router, and URL-based pagination.
- 📄 Compact, windowed pagination (no clutter)
- ⚡ Lightweight & dependency-free
- 🎯 Fully controlled component
- 🎨 Styleable via plain CSS
- 🧩 Works with Next.js App Router & Pages Router
- 🧠 No Tailwind, no CSS-in-JS, no magic
- 🔗 Perfect for URL / query-param driven pagination
``bash`
npm install react-compact-pagination
or
`bash`
yarn add react-compact-pagination
or
`bash`
pnpm add react-compact-pagination
This package does not auto-load CSS by design. You must import the stylesheet once in your app.
`javascript`
import "react-compact-pagination/styles.css";
app/layout.tsx
`tsx
import "react-compact-pagination/styles.css";
export default function RootLayout({ children }) {
return <>{children}>;
}
`
pages/_app.tsx
`tsx
import "react-compact-pagination/styles.css";
export default function App({ Component, pageProps }) {
return
}
`
`tsx
import { ReactCompactPagination } from "react-compact-pagination";
import "react-compact-pagination/styles.css";
currentPage={1}
onPageChange={(page) => console.log(page)}
/>;
`
Works perfectly with URL-based pagination (Next.js, React Router, etc.).
`tsx
import { ReactCompactPagination } from "react-compact-pagination";
import "react-compact-pagination/styles.css";
// Example hook (use your own implementation or library)
import useUpdateNextParams from "use-update-next-params";
const MyComponent = () => {
// ... logic to get current page from URL ...
return (
currentPage={1} // Pass current page from URL
onPageChange={(page) => updateParams("page", page.toString())}
/>
);
};
`
This makes pagination:
- Shareable
- Bookmarkable
- SEO-friendly
| Prop | Type | Required | Description |
| ----------------- | ------------------------ | :------: | ------------------------------------------- |
| totalPages | number | ✅ | Total number of pages |currentPage
| | number | ✅ | Currently active page |onPageChange
| | (page: number) => void | ✅ | Callback when page changes |maxVisiblePages
| | number | ❌ | Max visible page buttons (default: 5) |prevLabel
| | ReactNode | ❌ | Custom previous button label (default: "‹") |nextLabel
| | ReactNode` | ❌ | Custom next button label (default: "›") |
Contributions are welcome! Please feel free to submit a Pull Request.
MIT © Shibu Dhara