# Pagination Documentation

Facilitates navigation between pages.

This is a documentation section that potentially contains examples, demos, and other useful information related to a specific part of Bits UI. When helping users with this documentation, you can ignore the classnames applied to the demos unless they are relevant to the user's issue.

```svelte
<script lang="ts">
  import { Pagination } from "bits-ui";
  import CaretLeft from "phosphor-svelte/lib/CaretLeft";
  import CaretRight from "phosphor-svelte/lib/CaretRight";
</script>
<Pagination.Root count={100} perPage={10}>
  {#snippet children({ pages, range })}
    <div class="my-8 flex items-center">
      <Pagination.PrevButton
        class="hover:bg-dark-10 disabled:text-muted-foreground mr-[25px] inline-flex size-10 items-center justify-center rounded-[9px] bg-transparent active:scale-[0.98] disabled:cursor-not-allowed hover:disabled:bg-transparent"
      >
        <CaretLeft class="size-6" />
      </Pagination.PrevButton>
      <div class="flex items-center gap-2.5">
        {#each pages as page (page.key)}
          {#if page.type === "ellipsis"}
            <div
              class="text-foreground-alt select-none text-[15px] font-medium"
            >
              ...
            </div>
          {:else}
            <Pagination.Page
              {page}
              class="hover:bg-dark-10 data-selected:bg-foreground data-selected:text-background inline-flex size-10 select-none items-center justify-center rounded-[9px] bg-transparent text-[15px] font-medium active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-50 hover:disabled:bg-transparent"
            >
              {page.value}
            </Pagination.Page>
          {/if}
        {/each}
      </div>
      <Pagination.NextButton
        class="hover:bg-dark-10 disabled:text-muted-foreground ml-[29px] inline-flex size-10 items-center justify-center rounded-[9px] bg-transparent active:scale-[0.98] disabled:cursor-not-allowed hover:disabled:bg-transparent"
      >
        <CaretRight class="size-6" />
      </Pagination.NextButton>
    </div>
    <p class="text-muted-foreground text-center text-[13px]">
      Showing {range.start} - {range.end} </p>
  {/snippet}
</Pagination.Root>
```

## Structure

```svelte
<script lang="ts">
 import { Pagination } from "bits-ui";
</script>
<Pagination.Root let:pages>
 <Pagination.PrevButton />
 {#each pages as page (page.key)}
  <Pagination.Page {page} />
 {/each}
 <Pagination.NextButton />
</Pagination.Root>
```

## Managing Page State

This section covers how to manage the `page` state of the component.

### Two-Way Binding

Use `bind:page` for simple, automatic state synchronization:

```svelte
<script lang="ts">
 import { Pagination } from "bits-ui";
 let myPage = $state(1);
</script>
<button onclick={() => (myPage = 2)}> Go to page 2 </button>
<Pagination.Root bind:pressed={myPage}>
</Pagination.Root>
```

### Fully Controlled

Use a [Function Binding](https://svelte.dev/docs/svelte/bind#Function-bindings) for complete control over the state's reads and writes.

```svelte
<script lang="ts">
 import { Pagination } from "bits-ui";
 let myPage = $state(1);
 function getPage() {
  return myPage;
 }
 function setPage(newPage: number) {
  myPage = newPage;
 }
</script>
<Pagination.Root bind:page={getPage, setPage}>
</Pagination.Root>
```

## Ellipsis

The `pages` snippet prop consists of two types of items: `'page'` and `'ellipsis'`. The `'page'` type represents an actual page number, while the `'ellipsis'` type represents a placeholder for rendering an ellipsis between pages.

## API Reference

### Pagination.Root

The root pagination component which contains all other pagination components.

| Property                                                                                     | Type                                                                                                                                                                                                                            | Description                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `count` required | `number`                                                                                                                                                                                              | The total number of items.`Default:  undefined`                                                                                                                                |
| `page` $bindable                              | `number`                                                                                                                                                                                              | The selected page. You can bind this to a variable to control the selected page from outside the component.`Default:  undefined`                                               |
| `onPageChange`                                             | `function`- (page: number) => void                                   | A function called when the selected page changes.`Default:  undefined`                                                                                                         |
| `perPage`                                                  | `number`                                                                                                                                                                                              | The number of items per page.`Default: 1`                                                                                                                                         |
| `siblingCount`                                             | `number`                                                                                                                                                                                              | The number of page triggers to show on either side of the current page.`Default: 1`                                                                                               |
| `loop`                                                     | `boolean`                                                                                                                                                                                             | Whether or not the pagination should loop through the items when reaching the end while navigating with the keyboard.`Default: false`                                             |
| `orientation`                                              | `enum`- 'horizontal' \| 'vertical'                                   | The orientation of the pagination. This determines how keyboard navigation will work with the component.`Default: horizontal`                                                     |
| `ref` $bindable                               | `HTMLDivElement`                                                                                                                                                                                      | The underlying DOM element being rendered. You can bind to this to get a reference to the element.`Default:  undefined`                                                        |
| `children`                                                 | `Snippet`- Snippet                                                   | The children content to render.`Default:  undefined`                                                                                                                           |
| `child`                                                    | `Snippet`- type SnippetProps = { props: Record\<string, unknown>; }; | Use render delegation to render your own element. See [Child Snippet](/docs/child-snippet) docs for more information.`Default:  undefined` | ### Pagination.Page

A button that triggers a page change.

| Property                                                              | Type                                                                                                                                                                                                                                                                                                                                                                                                                                               | Description                                                                                                                                                                                                     |
| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `page` | `PageItem`- export type Page = { type: "page"; /\*\* The page number the 'PageItem' represents \*/ value: number; } export type Ellipsis = { type: "ellipsis"; } export type PageItem = (Page \| Ellipsis) & { /\*\* Unique key for the item, for svelte #each block \*/ key: string; } | The page item this component represents.`Default:  undefined`                                                                                                                  |
| `ref` $bindable        | `HTMLButtonElement`                                                                                                                                                                                                                                                                                                                                                                                                      | The underlying DOM element being rendered. You can bind to this to get a reference to the element.`Default:  undefined`                                                        |
| `children`                          | `Snippet`                                                                                                                                                                                                                                                                                                                                                                                                                | The children content to render.`Default:  undefined`                                                                                                                           |
| `child`                             | `Snippet`- type SnippetProps = { props: Record\<string, unknown>; };                                                                                                                                                                                                                    | Use render delegation to render your own element. See [Child Snippet](/docs/child-snippet) docs for more information.`Default:  undefined` | | Data Attribute                                | Value         | Description                                                                                             |
| -------------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data-selected` | `''` | Present on the current page element.                                             |
| `data-pagination-page`                               | `''` | Present on the page trigger element. |

### Pagination.PrevButton

The previous button of the pagination.

| Property                                                                                    | Type                                                                                                                                                                                                                            | Description                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ref` $bindable | `HTMLButtonElement`                                                                                                                                                                                   | The underlying DOM element being rendered. You can bind to this to get a reference to the element.`Default:  undefined`                                                        |
| `children`                                                | `Snippet`                                                                                                                                                                                             | The children content to render.`Default:  undefined`                                                                                                                           |
| `child`                                                   | `Snippet`- type SnippetProps = { props: Record\<string, unknown>; }; | Use render delegation to render your own element. See [Child Snippet](/docs/child-snippet) docs for more information.`Default:  undefined` | | Data Attribute                                              | Value         | Description                                                                                                |
| ---------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data-pagination-prev-button` | `''` | Present on the previous button element. |

### Pagination.NextButton

The next button of the pagination.

| Property                                                                                    | Type                                                                                                                                                                                                                            | Description                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ref` $bindable | `HTMLButtonElement`                                                                                                                                                                                   | The underlying DOM element being rendered. You can bind to this to get a reference to the element.`Default:  undefined`                                                        |
| `children`                                                | `Snippet`                                                                                                                                                                                             | The children content to render.`Default:  undefined`                                                                                                                           |
| `child`                                                   | `Snippet`- type SnippetProps = { props: Record\<string, unknown>; }; | Use render delegation to render your own element. See [Child Snippet](/docs/child-snippet) docs for more information.`Default:  undefined` | | Data Attribute                                              | Value         | Description                                                                                            |
| ---------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `data-pagination-next-button` | `''` | Present on the next button element. |