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.
<script setup lang="ts">
import { Pagination } from '@vuetify/v0'
import { shallowRef } from 'vue'
const model = shallowRef(4)
</script>
<template>
<Pagination.Root
v-slot="{ items }"
v-model="model"
class="flex items-center justify-center gap-1"
:size="200"
>
<Pagination.First class="w-9 h-9 rounded border border-divider flex items-center justify-center bg-surface hover:bg-surface-tint data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed">
«
</Pagination.First>
<Pagination.Prev class="w-9 h-9 rounded border border-divider flex items-center justify-center bg-surface hover:bg-surface-tint data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed">
‹
</Pagination.Prev>
<template v-for="(item, index) in items" :key="index">
<Pagination.Ellipsis
v-if="item.type === 'ellipsis'"
class="w-9 h-9 flex items-center justify-center text-on-surface opacity-60"
/>
<Pagination.Item
v-else
class="w-9 h-9 rounded border border-divider flex items-center justify-center bg-surface hover:bg-surface-tint data-[selected]:bg-primary data-[selected]:text-on-primary data-[selected]:border-primary data-[selected]:hover:bg-primary"
:value="item.value as number"
>
{{ item.value }}
</Pagination.Item>
</template>
<Pagination.Next class="w-9 h-9 rounded border border-divider flex items-center justify-center bg-surface hover:bg-surface-tint data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed">
›
</Pagination.Next>
<Pagination.Last class="w-9 h-9 rounded border border-divider flex items-center justify-center bg-surface hover:bg-surface-tint data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed">
»
</Pagination.Last>
</Pagination.Root>
</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.
The following API details are for all variations of the Pagination component.
Pagination.Root
Props
totalVisible
numberNumber of visible page buttons. If undefined, auto-calculates based on container width.
Events
update:model-value
T | T[]Slots
default
PaginationRootSlotPropsPagination.Ellipsis
Props
Slots
default
PaginationEllipsisSlotPropsPagination.First
Props
Slots
default
PaginationFirstSlotPropsPagination.Item
Props
Slots
default
PaginationItemSlotPropsPagination.Last
Props
Slots
default
PaginationLastSlotPropsPagination.Next
Props
Slots
default
PaginationNextSlotPropsPagination.Prev
Props
Slots
default
PaginationPrevSlotPropsPagination.Status
Props
Slots
default
PaginationStatusSlotPropsWas this page helpful?