11<script setup lang="ts">
2+ import {
3+ ChevronLeftIcon ,
4+ ChevronRightIcon ,
5+ DoubleArrowLeftIcon ,
6+ DoubleArrowRightIcon ,
7+ } from " @radix-icons/vue" ;
28import { Label } from " ~/components/ui/label" ;
39import {
410 Select ,
@@ -9,53 +15,83 @@ import {
915} from " ~/components/ui/select" ;
1016import {
1117 Pagination as PaginationRoot ,
12- PaginationList ,
13- PaginationListItem ,
18+ PaginationContent ,
19+ PaginationItem ,
1420 PaginationFirst ,
15- PaginationPrev ,
21+ PaginationPrevious ,
1622 PaginationNext ,
1723 PaginationLast ,
1824 PaginationEllipsis ,
1925} from " ~/components/ui/pagination" ;
20- import { Button } from " ~/components/ui/button" ;
26+
27+ const navControlClass =
28+ " size-9 shrink-0 rounded-md p-0 text-muted-foreground shadow-none hover:bg-transparent hover:text-foreground disabled:opacity-35" ;
29+ const pageItemBaseClass =
30+ " size-9 shrink-0 rounded-md border text-sm font-semibold tabular-nums shadow-none" ;
31+ const activePageItemClass =
32+ " border-border/80 bg-background text-foreground hover:bg-background" ;
33+ const inactivePageItemClass =
34+ " border-transparent bg-transparent text-muted-foreground hover:border-border/60 hover:bg-accent/40 hover:text-foreground" ;
2135 </script >
2236
2337<template >
24- <div class =" flex items-center justify-between gap-4 mt-4" >
38+ <div
39+ class =" mt-4 flex w-full flex-col items-start gap-3 sm:flex-row sm:items-center sm:justify-between"
40+ >
2541 <PaginationRoot
2642 v-slot =" { page } "
2743 :key =" ` pagination-${current } ` "
44+ class="mx-0 min-w-0 flex-1 justify-start overflow-x-auto"
2845 :total =" total "
2946 :items-per-page =" perPage "
3047 :sibling-count =" 1 "
3148 show-edges
3249 :default-page =" current "
3350 @update :page =" paginate "
3451 >
35- <PaginationList v-slot =" { items } " class="flex items-center gap-1">
36- <PaginationFirst />
37- <PaginationPrev />
52+ <PaginationContent v-slot =" { items } " class="flex-nowrap gap-1 pr-2">
53+ <PaginationFirst :class =" navControlClass " >
54+ <DoubleArrowLeftIcon class="size-3.5 " />
55+ <span class =" sr-only" >First page</span >
56+ </PaginationFirst >
57+ <PaginationPrevious :class =" navControlClass " >
58+ <ChevronLeftIcon class="size-3.5 " />
59+ <span class =" sr-only" >Previous page</span >
60+ </PaginationPrevious >
3861
3962 <template v-for =" (item , index ) in items " >
40- <PaginationListItem
63+ <PaginationItem
4164 v-if =" item .type === ' page' "
42- :key =" index "
65+ :key =" ` page-${ item . value } ` "
4366 :value =" item .value "
44- as-child
67+ :is-active =" item .value === page "
68+ :class =" [
69+ pageItemBaseClass ,
70+ item .value === page ? activePageItemClass : inactivePageItemClass ,
71+ ] "
72+ >
73+ {{ item.value }}
74+ </PaginationItem >
75+ <PaginationEllipsis
76+ v-else
77+ :key =" ` ellipsis-${index } ` "
78+ :index =" index "
79+ class="h-9 w-7 shrink-0 text-muted-foreground"
4580 >
46- <Button
47- class="w-10 h-10 p-0"
48- :variant =" item .value === page ? ' default' : ' outline' "
49- >
50- {{ item.value }}
51- </Button >
52- </PaginationListItem >
53- <PaginationEllipsis v-else :key =" item .type " :index =" index " />
81+ <span aria-hidden =" true" class =" text-sm font-semibold" >...</span >
82+ <span class =" sr-only" >More pages</span >
83+ </PaginationEllipsis >
5484 </template >
5585
56- <PaginationNext />
57- <PaginationLast />
58- </PaginationList >
86+ <PaginationNext :class =" navControlClass " >
87+ <ChevronRightIcon class="size-3.5 " />
88+ <span class =" sr-only" >Next page</span >
89+ </PaginationNext >
90+ <PaginationLast :class =" navControlClass " >
91+ <DoubleArrowRightIcon class="size-3.5 " />
92+ <span class =" sr-only" >Last page</span >
93+ </PaginationLast >
94+ </PaginationContent >
5995 </PaginationRoot >
6096
6197 <div v-if =" showPerPageSelector" class =" flex items-center gap-2" >
0 commit comments