Pagination
New
Displays data in paged format and provides navigation between pages.
vue
<script setup lang="ts">
import { Icon } from '@iconify/vue'
import { PaginationEllipsis, PaginationFirst, PaginationLast, PaginationList, PaginationListItem, PaginationNext, PaginationPrev, PaginationRoot } from 'radix-vue'
</script>
<template>
<PaginationRoot :total="100" :sibling-count="1" show-edges :default-page="2">
<PaginationList v-slot="{ items }" class="flex items-center gap-1 text-white">
<PaginationFirst class="w-9 h-9 flex items-center justify-center disabled:opacity-50 focus-within:outline focus-within:outline-1 focus-within:outline-offset-1 rounded">
<Icon icon="radix-icons:double-arrow-left" />
</PaginationFirst>
<PaginationPrev class="w-9 h-9 flex items-center justify-center mr-4 disabled:opacity-50 focus-within:outline focus-within:outline-1 focus-within:outline-offset-1 rounded">
<Icon icon="radix-icons:chevron-left" />
</PaginationPrev>
<template v-for="(page, index) in items">
<PaginationListItem v-if="page.type === 'page'" :key="index" class="w-9 h-9 border rounded data-[selected]:bg-white data-[selected]:text-blackA11 hover:bg-white/10 transition focus-within:outline focus-within:outline-1 focus-within:outline-offset-1" :value="page.value">
{{ page.value }}
</PaginationListItem>
<PaginationEllipsis v-else :key="page.type" :index="index" class="w-9 h-9 flex items-center justify-center">
…
</PaginationEllipsis>
</template>
<PaginationNext class="w-9 h-9 flex items-center justify-center ml-4 disabled:opacity-50 focus-within:outline focus-within:outline-1 focus-within:outline-offset-1 rounded">
<Icon icon="radix-icons:chevron-right" />
</PaginationNext>
<PaginationLast class="w-9 h-9 flex items-center justify-center disabled:opacity-50 focus-within:outline focus-within:outline-1 focus-within:outline-offset-1 rounded">
<Icon icon="radix-icons:double-arrow-right" />
</PaginationLast>
</PaginationList>
</PaginationRoot>
</template>
Features
- Enable quick access to first, or last page
- Enable to show edges constantly, or not
Installation
Install the component from your command line.
bash
npm install radix-vue
Anatomy
Import all parts and piece them together.
vue
<script setup>
import { PaginationEllipsis, PaginationFirst, PaginationLast, PaginationList, PaginationListItem, PaginationNext, PaginationPrev, PaginationRoot } from 'radix-vue'
</script>
<template>
<PaginationRoot>
<PaginationList v-slot="{ items }">
<PaginationFirst />
<PaginationPrev />
<template v-for="(page, index) in items">
<PaginationListItem v-if="page.type === 'page'" :key="index" />
<PaginationEllipsis v-else :key="page.type" :index="index">
…
</PaginationEllipsis>
</template>
<PaginationNext />
<PaginationLast />
</PaginationList>
</PaginationRoot>
</template>
API Reference
Root
Contains all of the paginations parts.
Prop | Type | Default |
---|---|---|
page | number | |
defaultPage | number | 1 |
total | number | 10 |
itemsPerPage | number | 10 |
siblingCount | number | 3 |
showEdges | boolean |
Emit | Type |
---|---|
@update:page | (value: number) => void |
List
Used to show the list of pages. It also makes pagination accessible to assistive technologies.
Prop | Type | Default |
---|---|---|
asChild | boolean | false |
Item
Used to render the button that changes the current page.
Prop | Type | Default |
---|---|---|
value | number | |
asChild | boolean | false |
Data Attribute | Value |
---|---|
[data-selected] | "true" | "" |
[data-type] | "page" |
Ellipsis
Placeholder element when the list is long, and only a small amount of siblingCount
was set and showEdges
was set to true
.
Prop | Type | Default |
---|---|---|
asChild | boolean | false |
Data Attribute | Value |
---|---|
[data-type] | "ellipsis" |
First
Triggers that set the page value to 1
Prop | Type | Default |
---|---|---|
asChild | boolean | false |
Prev
Triggers that set the page value to the previous page
Prop | Type | Default |
---|---|---|
asChild | boolean | false |
Next
Triggers that set the page value to the next page
Prop | Type | Default |
---|---|---|
asChild | boolean | false |
Last
Triggers that set the page value to the last page
Prop | Type | Default |
---|---|---|
asChild | boolean | false |
Keyboard Interactions
Key | Description |
---|---|
Tab | Moves focus to the next focusable element. |
Space |
When focus is on a any trigger, trigger selected page or arrow navigation
|
Enter |
When focus is on a any trigger, trigger selected page or arrow navigation
|