# Pagination

<FrameworkCodeSwitcher>
  <div slot="astro">
```astro
---
import {
  Pagination,
  PaginationEllipsis,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/starwind/pagination";
---
<Pagination>
  <PaginationContent>
    <PaginationItem>
      <PaginationPrevious href="#">Prev</PaginationPrevious>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">1</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#" isActive>2</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">3</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationEllipsis />
    </PaginationItem>
    <PaginationItem>
      <PaginationNext href="#">Next</PaginationNext>
    </PaginationItem>
  </PaginationContent>
</Pagination>
```
  </div>
  <div slot="react">
```tsx
import {
  Pagination,
  PaginationEllipsis,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/starwind/pagination";

export function Example() {
  return (
    <>
      <Pagination>
        <PaginationContent>
          <PaginationItem>
            <PaginationPrevious href="#">Prev</PaginationPrevious>
          </PaginationItem>
          <PaginationItem>
            <PaginationLink href="#">1</PaginationLink>
          </PaginationItem>
          <PaginationItem>
            <PaginationLink href="#" isActive>2</PaginationLink>
          </PaginationItem>
          <PaginationItem>
            <PaginationLink href="#">3</PaginationLink>
          </PaginationItem>
          <PaginationItem>
            <PaginationEllipsis />
          </PaginationItem>
          <PaginationItem>
            <PaginationNext href="#">Next</PaginationNext>
          </PaginationItem>
        </PaginationContent>
      </Pagination>
    </>
  );
}
```
  </div>
  <div slot="vue">
```vue
<script setup lang="ts">
import {
  Pagination,
  PaginationEllipsis,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/starwind/pagination";
</script>

<template>
  <Pagination>
    <PaginationContent>
      <PaginationItem>
        <PaginationPrevious href="#">Prev</PaginationPrevious>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#">1</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" isActive>2</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#">3</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationEllipsis />
      </PaginationItem>
      <PaginationItem>
        <PaginationNext href="#">Next</PaginationNext>
      </PaginationItem>
    </PaginationContent>
  </Pagination>
</template>
```
  </div>
</FrameworkCodeSwitcher>

## Installation

```bash
npx starwind@latest add pagination --framework astro
```
</DocsTabsContent>
```bash
npx starwind@latest add pagination --framework react
```
</DocsTabsContent>
```bash
npx starwind@latest add pagination --framework vue
```
</DocsTabsContent>
</DocsTabs>

## Usage

<FrameworkCodeSwitcher>
  <div slot="astro">
```astro
---
import {
  Pagination,
  PaginationEllipsis,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/starwind/pagination";
---
<Pagination>
  <PaginationContent>
    <PaginationItem>
      <PaginationPrevious href="#">Prev</PaginationPrevious>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">1</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#" isActive>2</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">3</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationEllipsis />
    </PaginationItem>
    <PaginationItem>
      <PaginationNext href="#">Next</PaginationNext>
    </PaginationItem>
  </PaginationContent>
</Pagination>
```
  </div>
  <div slot="react">
```tsx
import {
  Pagination,
  PaginationEllipsis,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/starwind/pagination";

export function Example() {
  return (
    <>
      <Pagination>
        <PaginationContent>
          <PaginationItem>
            <PaginationPrevious href="#">Prev</PaginationPrevious>
          </PaginationItem>
          <PaginationItem>
            <PaginationLink href="#">1</PaginationLink>
          </PaginationItem>
          <PaginationItem>
            <PaginationLink href="#" isActive>2</PaginationLink>
          </PaginationItem>
          <PaginationItem>
            <PaginationLink href="#">3</PaginationLink>
          </PaginationItem>
          <PaginationItem>
            <PaginationEllipsis />
          </PaginationItem>
          <PaginationItem>
            <PaginationNext href="#">Next</PaginationNext>
          </PaginationItem>
        </PaginationContent>
      </Pagination>
    </>
  );
}
```
  </div>
  <div slot="vue">
```vue
<script setup lang="ts">
import {
  Pagination,
  PaginationEllipsis,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/starwind/pagination";
</script>

<template>
  <Pagination>
    <PaginationContent>
      <PaginationItem>
        <PaginationPrevious href="#">Prev</PaginationPrevious>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#">1</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" isActive>2</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#">3</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationEllipsis />
      </PaginationItem>
      <PaginationItem>
        <PaginationNext href="#">Next</PaginationNext>
      </PaginationItem>
    </PaginationContent>
  </Pagination>
</template>
```
  </div>
</FrameworkCodeSwitcher>

## Composition

Place each control inside a `PaginationItem`:

```text
Pagination
└── PaginationContent
    ├── PaginationItem
    │   └── PaginationPrevious
    ├── PaginationItem
    │   └── PaginationLink
    ├── PaginationItem
    │   └── PaginationEllipsis
    └── PaginationItem
        └── PaginationNext
```

## Active Page

The basic pagination component includes previous/next buttons and numbered pages.

> **Tip:** Use the `isActive` prop on `<PaginationLink>` to highlight the current page.

## Sizes

`PaginationLink`, `PaginationPrevious`, and `PaginationNext` accept the Button component's `size`
values. `PaginationLink` defaults to `size="icon"`. `PaginationPrevious` and `PaginationNext`
default to `size="md"` so their text labels receive standard button spacing.
`PaginationEllipsis` accepts the icon size values and defaults to `size="icon"`.

Use `icon-sm`, `icon`, or `icon-lg` for page links and ellipses. Use `sm`, `md`, or `lg` for
previous and next controls. Button supplies the spacing, text size, and icon size for each control.

<FrameworkCodeSwitcher>
  <div slot="astro">
```astro
---
import {
  Pagination,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
  PaginationEllipsis,
} from "@/components/starwind/pagination";
---

<section class="mx-auto mt-10 max-w-lg">
  <Pagination>
    <PaginationContent>
      <PaginationItem>
        <PaginationPrevious href="#" size="sm">Prev</PaginationPrevious>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" size="icon-sm">1</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" size="icon-sm" isActive>2</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" size="icon-sm">3</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationEllipsis size="icon-sm" />
      </PaginationItem>
      <PaginationItem>
        <PaginationNext href="#" size="sm">Next</PaginationNext>
      </PaginationItem>
    </PaginationContent>
  </Pagination>
</section>

<section class="mx-auto mt-10 max-w-lg">
  <Pagination>
    <PaginationContent>
      <PaginationItem>
        <PaginationPrevious href="#" size="lg">Prev</PaginationPrevious>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" size="icon-lg">1</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" size="icon-lg" isActive>2</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationLink href="#" size="icon-lg">3</PaginationLink>
      </PaginationItem>
      <PaginationItem>
        <PaginationEllipsis size="icon-lg" />
      </PaginationItem>
      <PaginationItem>
        <PaginationNext href="#" size="lg">Next</PaginationNext>
      </PaginationItem>
    </PaginationContent>
  </Pagination>
</section>
```
  </div>
  <div slot="react">
```tsx
import {
  Pagination,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
  PaginationEllipsis,
} from "@/components/starwind/pagination";

export function Example() {
  return (
    <>
      <section className="mx-auto mt-10 max-w-lg">
        <Pagination>
          <PaginationContent>
            <PaginationItem>
              <PaginationPrevious href="#" size="sm">Prev</PaginationPrevious>
            </PaginationItem>
            <PaginationItem>
              <PaginationLink href="#" size="icon-sm">1</PaginationLink>
            </PaginationItem>
            <PaginationItem>
              <PaginationLink href="#" size="icon-sm" isActive>2</PaginationLink>
            </PaginationItem>
            <PaginationItem>
              <PaginationLink href="#" size="icon-sm">3</PaginationLink>
            </PaginationItem>
            <PaginationItem>
              <PaginationEllipsis size="icon-sm" />
            </PaginationItem>
            <PaginationItem>
              <PaginationNext href="#" size="sm">Next</PaginationNext>
            </PaginationItem>
          </PaginationContent>
        </Pagination>
      </section>

      <section className="mx-auto mt-10 max-w-lg">
        <Pagination>
          <PaginationContent>
            <PaginationItem>
              <PaginationPrevious href="#" size="lg">Prev</PaginationPrevious>
            </PaginationItem>
            <PaginationItem>
              <PaginationLink href="#" size="icon-lg">1</PaginationLink>
            </PaginationItem>
            <PaginationItem>
              <PaginationLink href="#" size="icon-lg" isActive>2</PaginationLink>
            </PaginationItem>
            <PaginationItem>
              <PaginationLink href="#" size="icon-lg">3</PaginationLink>
            </PaginationItem>
            <PaginationItem>
              <PaginationEllipsis size="icon-lg" />
            </PaginationItem>
            <PaginationItem>
              <PaginationNext href="#" size="lg">Next</PaginationNext>
            </PaginationItem>
          </PaginationContent>
        </Pagination>
      </section>
    </>
  );
}
```
  </div>
  <div slot="vue">
```vue
<script setup lang="ts">
import {
  Pagination,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
  PaginationEllipsis,
} from "@/components/starwind/pagination";
</script>

<template>
  <section class="mx-auto mt-10 max-w-lg">
    <Pagination>
      <PaginationContent>
        <PaginationItem>
          <PaginationPrevious href="#" size="sm">Prev</PaginationPrevious>
        </PaginationItem>
        <PaginationItem>
          <PaginationLink href="#" size="icon-sm">1</PaginationLink>
        </PaginationItem>
        <PaginationItem>
          <PaginationLink href="#" size="icon-sm" isActive>2</PaginationLink>
        </PaginationItem>
        <PaginationItem>
          <PaginationLink href="#" size="icon-sm">3</PaginationLink>
        </PaginationItem>
        <PaginationItem>
          <PaginationEllipsis size="icon-sm" />
        </PaginationItem>
        <PaginationItem>
          <PaginationNext href="#" size="sm">Next</PaginationNext>
        </PaginationItem>
      </PaginationContent>
    </Pagination>
  </section>

  <section class="mx-auto mt-10 max-w-lg">
    <Pagination>
      <PaginationContent>
        <PaginationItem>
          <PaginationPrevious href="#" size="lg">Prev</PaginationPrevious>
        </PaginationItem>
        <PaginationItem>
          <PaginationLink href="#" size="icon-lg">1</PaginationLink>
        </PaginationItem>
        <PaginationItem>
          <PaginationLink href="#" size="icon-lg" isActive>2</PaginationLink>
        </PaginationItem>
        <PaginationItem>
          <PaginationLink href="#" size="icon-lg">3</PaginationLink>
        </PaginationItem>
        <PaginationItem>
          <PaginationEllipsis size="icon-lg" />
        </PaginationItem>
        <PaginationItem>
          <PaginationNext href="#" size="lg">Next</PaginationNext>
        </PaginationItem>
      </PaginationContent>
    </Pagination>
  </section>
</template>
```
  </div>
</FrameworkCodeSwitcher>

## Size migration

| Before | After |
| --- | --- |
| `<Pagination size="sm"><PaginationLink /></Pagination>` | `<Pagination><PaginationLink size="icon-sm" /></Pagination>` |
| `<Pagination size="lg"><PaginationPrevious /></Pagination>` | `<Pagination><PaginationPrevious size="lg" /></Pagination>` |

## API Reference
### Pagination
- Inherits nav attributes.

### PaginationContent
- Inherits ul attributes.

### PaginationItem
- Inherits li attributes.

### PaginationLink
| Prop | Type | Required | Default | Kind | Description |
| --- | --- | --- | --- | --- | --- |
| `isActive` | `boolean` | No | - | Wrapper prop | Applies the active visual state. |
| `size` | `"sm" \| "md" \| "lg" \| "icon-sm" \| "icon" \| "icon-lg"` | No | `"icon"` | Styled variant | Selects the component's visual size. |
- Inherits Button props. Omits `as`, `ref`, and `variant`.

### PaginationPrevious
| Prop | Type | Required | Default | Kind | Description |
| --- | --- | --- | --- | --- | --- |
| `size` | `"sm" \| "md" \| "lg" \| "icon-sm" \| "icon" \| "icon-lg"` | No | `"md"` | Styled variant | Selects the component's visual size. |
- Inherits PaginationLink props.

### PaginationNext
| Prop | Type | Required | Default | Kind | Description |
| --- | --- | --- | --- | --- | --- |
| `size` | `"sm" \| "md" \| "lg" \| "icon-sm" \| "icon" \| "icon-lg"` | No | `"md"` | Styled variant | Selects the component's visual size. |
- Inherits PaginationLink props.

### PaginationEllipsis
| Prop | Type | Required | Default | Kind | Description |
| --- | --- | --- | --- | --- | --- |
| `size` | `"icon-sm" \| "icon" \| "icon-lg"` | No | `"icon"` | Styled variant | Selects the component's visual size. |
- Inherits span attributes.

## Changelog

### v5.0.0

- Moved size control from `Pagination` to each link, navigation control, and ellipsis.
- Set `PaginationLink` and `PaginationEllipsis` to `size="icon"` by default.
- Set `PaginationPrevious` and `PaginationNext` to `size="md"` by default so text labels use standard button spacing.
- Removed the hover movement from the previous and next icons. Button now supplies their icon size.

### v4.0.1

- Named the generated aggregate default export so React and Astro tooling can identify the installed component cleanly.

### v4.0.0

- Moved `size` ownership to `Pagination`; remove `size` from `PaginationLink`,
`PaginationPrevious`, `PaginationNext`, and `PaginationEllipsis`.
- Migration: `<PaginationLink size="icon-sm" />` becomes
`<Pagination size="sm"><PaginationLink /></Pagination>`.

### v3.1.0

- Added contract-generated Astro and React implementations while preserving the component's existing public API and styling.

### v3.0.4

- Refactor tailwind variants functions into separate `variants.ts` file

### v3.0.2

- add size prop to `PaginationEllipsis`
- Adjust `PaginationNext` and `PaginationPrevious` to use button variant props for sizes

### v3.0.1

- Add named slot "icon" to `PaginationEllipsis` to enable easy icon swapping, and a default slot for the `sr-only` label
- Add named slot "icon" to `PaginationNext` and `Pagination Previous` to enable easy icon swapping

### v3.0.0

- Now requires the starwind button component installed to make use of the button variants for `PaginationLink`

### v2.1.0

- Add `data-slot` attribute to enable global styling updates

### v2.0.1

- Add eslint comments to disable "no-explicit-any" when using Astro special syntax to require a child element

### v2.0.0

- `tailwind-variants` now implemented. This uses `tailwind-merge` under the hood to merge Tailwind classes without style conflicts.
- Removed `radius` prop now that classes like "rounded-full" can be passed to the components to override, taking advantage of `tailwind-variants`