Pagination

Click through pages of content, like turning the pages of a book, controlling the flow of your data presentation.

Basic

Pagination is a navigation component that allows users to move through multiple pages. It’s composed of several elements working together to provide a smooth user experience.

Installation

In the terminal, run the following command to begin:
npx hq-kit add pagination

Simple

The simple pagination setup doesn’t display page numbers, using only basic arrow navigation.

Using Collections

Since the pagination list is part of the GridList primitive, handling collections is easy. Just pass the collections into the PaginationList using the items prop.

Preserving Scroll

Sometimes, you need to prevent the page from scrolling to the top when users interact with pagination. You can do this by passing scroll-related props from your routerOptions into the PaginationLink component.

Inertia.js

When using Inertia.js, you can use the preserveScroll prop to keep the page from scrolling to the top during pagination interactions.

<Pagination.List aria-label="Pagination Segment" items={pages}>
  {(item) => (
    <Pagination.Item
      routerOptions={{ preserveScroll: true }}
      id={item.label.toString()}
      isCurrent={item.isCurrent}
      href={item.url ?? ''}
    >

Next.js

When using Next.js, apply the scroll prop to stop the page from scrolling to the top when users navigate through pagination.

<Pagination.List aria-label="Pagination Segment" items={pages}>
  {(item) => (
    <Pagination.Item
      routerOptions={{ scroll: false }}
      id={item.label.toString()}
      isCurrent={item.isCurrent}
      href={item.url ?? ''}
    >

Remix

When using Remix, you can add the preventScrollReset prop to prevent the page from scrolling to the top when users interact with pagination.

<Pagination.List aria-label="Pagination Segment" items={pages}>
  {(item) => (
    <Pagination.Item
      routerOptions={{ preventScrollReset: true }}
      id={item.label.toString()}
      isCurrent={item.isCurrent}
      href={item.url ?? ''}
    >

React Router

If you're using React Router, check out this tutorial for guidance. After that, give it a go on your own. Apologies, I'm not fully up to speed with the latest updates in React Router.

Considering

You might be thinking, "Why not just bake this functionality directly into the Pagination component, right?" But it's not that simple. I tried integrating it into the Pagination setup, but when you start mixing in other functionalities, like those Inertia.js router options, things can get messy. So, I kept it straightforward to avoid any conflicts.

const renderListItem = (
    props: ListBoxItemProps & {
        textValue?: string
        ariaCurrent?: string | undefined
        isDisabled?: boolean
        className?: string
    },
    children: React.ReactNode
) => (
    <ListBoxItem routerOptions={{ preserveScroll: true, ...props.routerOptions }} {...props}>
        {children}
    </ListBoxItem>
)

So here's how I roll with it:

<Pagination.List aria-label='Pagination Segment' items={paginate.pages}>
    {(item) => (
        <Pagination.Item
            routerOptions={{ only: ['series'] }}
            id={item.label.toString()}
            isCurrent={item.isCurrent}
            href={item.url ?? ''}
        >
            {item.label}
        </Pagination.Item>
    )}
</Pagination.List>

I figured it'd be chill, but nah, it ain't cuttin' it. That’s why I’m throwin' this idea your way: toss that option in when you're rockin' the pagination component. Ain’t sayin' it's top shelf, but it’s one way to roll.

Client Side Routing

Make sure you have read Client Side Routing before using this component.