Skip to main content
Vuetify0 is now in alpha!
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

Pagination

A headless component for creating page navigation with proper ARIA support.

Usage

The Pagination component provides a compound component pattern for building page navigation interfaces. It uses the createPagination and createOverflow composable internally.

The two core props are size (total item count) and items-per-page (items per page, default 10). Together they determine the page count:

vue
<template>
  <!-- 200 items at 10 per page = 20 pages -->
  <Pagination.Root :size="200" :items-per-page="10" v-model="page" />

  <!-- 200 items at 25 per page = 8 pages -->
  <Pagination.Root :size="200" :items-per-page="25" v-model="page" />
</template>

Anatomy

Anatomy
<script setup lang="ts">
  import { Pagination } from '@vuetify/v0'
</script>

<template>
  <Pagination.Root>
    <Pagination.Status />

    <Pagination.First />

    <Pagination.Prev />

    <Pagination.Ellipsis />

    <Pagination.Item />

    <Pagination.Next />

    <Pagination.Last />
  </Pagination.Root>
</template>
Warning

For responsive sizing to work accurately, all pagination buttons must have the same width. The component measures a sample button and uses that width to calculate how many buttons fit. If buttons have variable widths (e.g., single-digit “1” vs double-digit “50”), the calculation will be inaccurate and items may overflow or leave excess space.

Accessibility

The Pagination component renders semantic HTML and manages ARIA attributes automatically:

  • Wraps controls in a <nav> element with aria-label="pagination" for landmark navigation

  • Current page button is marked with aria-current="page" so screen readers announce it as the active page

  • Arrow keys navigate between page buttons; Enter and Space select the focused page

  • Page changes are announced to screen readers via aria-live region updates

For custom implementations, use renderless mode and bind the attrs slot prop to preserve all ARIA attributes:

vue
<template>
  <Pagination.Root v-slot="{ attrs }" renderless>
    <nav v-bind="attrs">
      <!-- Custom pagination controls -->
    </nav>
  </Pagination.Root>
</template>

API Reference

The following API details are for all variations of the Pagination component.

Pagination.Root

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

size

number | undefined

Total number of items

Default: 1

totalVisible

number | undefined

Number of visible page buttons. If undefined, auto-calculates based on container width.

itemsPerPage

number | undefined

Number of items per page

Default: 10

ellipsis

string | false | undefined

Ellipsis character

Default: "..."

modelValue

number | undefined

Default: 1

Events

update:model-value

[value: T | T[]]

Slots

default

PaginationRootSlotProps

Pagination.Ellipsis

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

ellipsis

string | undefined

Ellipsis character to display (overrides context)

id

string | undefined

Unique identifier for registration

Default: useId()

Slots

default

PaginationEllipsisSlotProps

Pagination.First

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

disabled

boolean | undefined

Override disabled state

id

string | undefined

Unique identifier for registration

Default: useId()

Slots

default

PaginationFirstSlotProps

Pagination.Item

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

value required

number

Page number this item represents

disabled

boolean | undefined

Override disabled state

Default: false

id

string | undefined

Unique identifier for registration

Default: useId()

Slots

default

PaginationItemSlotProps

Pagination.Last

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

disabled

boolean | undefined

Override disabled state

id

string | undefined

Unique identifier for registration

Default: useId()

Slots

default

PaginationLastSlotProps

Pagination.Next

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

disabled

boolean | undefined

Override disabled state

id

string | undefined

Unique identifier for registration

Default: useId()

Slots

default

PaginationNextSlotProps

Pagination.Prev

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

disabled

boolean | undefined

Override disabled state

id

string | undefined

Unique identifier for registration

Default: useId()

Slots

default

PaginationPrevSlotProps

Pagination.Status

Props

namespace

string | undefined

Namespace for dependency injection

Default: "v0:pagination"

Slots

default

PaginationStatusSlotProps
Was this page helpful?

Ctrl+/