UIPackage

Pagination

Vue navigation
Edit on GitHub

Page-number bar with previous/next, ellipsis collapse, and a configurable visible-window size. Pair with a data-table or any paged list.

Also available for React ->

Installation

$ npx shadcn-vue@latest add https://uipkge.dev/r/vue/pagination.json

Or with the named registry: npx shadcn-vue@latest add @uipkge/pagination

Examples

Props

Name Type / Values Default Required
class HTMLAttributes['class']; ariaLabel?: string optional

Dependencies

Files (9)

  • app/components/ui/pagination/Pagination.vue 0.8 kB
    <script setup lang="ts">
    import type { PaginationRootEmits, PaginationRootProps } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { reactiveOmit } from '@vueuse/core'
    import { PaginationRoot, useForwardPropsEmits } from 'reka-ui'
    import { cn } from '@/lib/utils'
    
    const props = defineProps<PaginationRootProps & { class?: HTMLAttributes['class']; ariaLabel?: string }>()
    const emits = defineEmits<PaginationRootEmits>()
    
    const delegated = reactiveOmit(props, 'class')
    const forwarded = useForwardPropsEmits(delegated, emits)
    </script>
    
    <template>
      <PaginationRoot
        v-slot="slotProps"
        as="nav"
        :aria-label="props.ariaLabel ?? 'Pagination'"
        data-uipkge
        data-slot="pagination"
        v-bind="forwarded"
        :class="cn('flex items-center gap-1', props.class)"
      >
        <slot v-bind="slotProps" />
      </PaginationRoot>
    </template>
  • app/components/ui/pagination/PaginationEllipsis.vue 0.2 kB
    <script setup lang="ts">
    import { PaginationEllipsis as RkPaginationEllipsis } from 'reka-ui'
    </script>
    <template>
      <RkPaginationEllipsis aria-hidden="true"><slot /></RkPaginationEllipsis>
    </template>
  • app/components/ui/pagination/PaginationFirst.vue 0.3 kB
    <script setup lang="ts">
    import { PaginationFirst as RkPaginationFirst } from 'reka-ui'
    import { ChevronsLeft } from 'lucide-vue-next'
    </script>
    <template>
      <RkPaginationFirst aria-label="Go to first page"
        ><slot><ChevronsLeft class="size-4" aria-hidden="true" /></slot
      ></RkPaginationFirst>
    </template>
  • app/components/ui/pagination/PaginationLast.vue 0.3 kB
    <script setup lang="ts">
    import { PaginationLast as RkPaginationLast } from 'reka-ui'
    import { ChevronsRight } from 'lucide-vue-next'
    </script>
    <template>
      <RkPaginationLast aria-label="Go to last page"
        ><slot><ChevronsRight class="size-4" aria-hidden="true" /></slot
      ></RkPaginationLast>
    </template>
  • app/components/ui/pagination/PaginationList.vue 0.5 kB
    <script setup lang="ts">
    import type { PaginationListProps } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { PaginationList as RkPaginationList } from 'reka-ui'
    import { cn } from '@/lib/utils'
    
    const props = defineProps<PaginationListProps & { class?: HTMLAttributes['class'] }>()
    </script>
    
    <template>
      <RkPaginationList
        v-slot="slotProps"
        data-uipkge
        data-slot="pagination-list"
        v-bind="props"
        :class="cn('flex items-center gap-1', props.class)"
      >
        <slot v-bind="slotProps" />
      </RkPaginationList>
    </template>
  • app/components/ui/pagination/PaginationListItem.vue 0.6 kB
    <script setup lang="ts">
    import type { PaginationListItemProps } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { reactiveOmit } from '@vueuse/core'
    import { PaginationListItem as RkPaginationListItem } from 'reka-ui'
    import { cn } from '@/lib/utils'
    
    const props = defineProps<PaginationListItemProps & { class?: HTMLAttributes['class'] }>()
    const delegated = reactiveOmit(props, 'class')
    </script>
    
    <template>
      <RkPaginationListItem
        data-uipkge
        data-slot="pagination-list-item"
        v-bind="delegated"
        :class="cn('shrink-0', props.class)"
      >
        <slot />
      </RkPaginationListItem>
    </template>
  • app/components/ui/pagination/PaginationNext.vue 0.3 kB
    <script setup lang="ts">
    import { PaginationNext as RkPaginationNext } from 'reka-ui'
    import { ChevronRight } from 'lucide-vue-next'
    </script>
    <template>
      <RkPaginationNext aria-label="Go to next page"
        ><slot><ChevronRight class="size-4" aria-hidden="true" /></slot
      ></RkPaginationNext>
    </template>
  • app/components/ui/pagination/PaginationPrev.vue 0.3 kB
    <script setup lang="ts">
    import { PaginationPrev as RkPaginationPrev } from 'reka-ui'
    import { ChevronLeft } from 'lucide-vue-next'
    </script>
    <template>
      <RkPaginationPrev aria-label="Go to previous page"
        ><slot><ChevronLeft class="size-4" aria-hidden="true" /></slot
      ></RkPaginationPrev>
    </template>
  • app/components/ui/pagination/index.ts 0.5 kB
    export { default as Pagination } from './Pagination.vue'
    export { default as PaginationList } from './PaginationList.vue'
    export { default as PaginationListItem } from './PaginationListItem.vue'
    export { default as PaginationFirst } from './PaginationFirst.vue'
    export { default as PaginationPrev } from './PaginationPrev.vue'
    export { default as PaginationNext } from './PaginationNext.vue'
    export { default as PaginationLast } from './PaginationLast.vue'
    export { default as PaginationEllipsis } from './PaginationEllipsis.vue'

Raw manifest: https://uipkge.dev/r/vue/pagination.json