| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import * as React from "react"
- import {
- ChevronLeftIcon,
- ChevronRightIcon,
- MoreHorizontalIcon,
- } from "lucide-react"
- import { cn } from "@/lib/utils"
- import { Button, buttonVariants } from "@/components/ui/button"
- function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
- return (
- <nav
- role="navigation"
- aria-label="pagination"
- data-slot="pagination"
- className={cn("mx-auto flex w-full justify-center", className)}
- {...props}
- />
- )
- }
- function PaginationContent({
- className,
- ...props
- }: React.ComponentProps<"ul">) {
- return (
- <ul
- data-slot="pagination-content"
- className={cn("flex flex-row items-center gap-1", className)}
- {...props}
- />
- )
- }
- function PaginationItem({ ...props }: React.ComponentProps<"li">) {
- return <li data-slot="pagination-item" {...props} />
- }
- type PaginationLinkProps = {
- isActive?: boolean
- } & Pick<React.ComponentProps<typeof Button>, "size"> &
- React.ComponentProps<"a">
- function PaginationLink({
- className,
- isActive,
- size = "icon",
- ...props
- }: PaginationLinkProps) {
- return (
- <a
- aria-current={isActive ? "page" : undefined}
- data-slot="pagination-link"
- data-active={isActive}
- className={cn(
- buttonVariants({
- variant: isActive ? "outline" : "ghost",
- size,
- }),
- className
- )}
- {...props}
- />
- )
- }
- function PaginationPrevious({
- className,
- ...props
- }: React.ComponentProps<typeof PaginationLink>) {
- return (
- <PaginationLink
- aria-label="Go to previous page"
- size="default"
- className={cn("gap-1 px-2.5 sm:pl-2.5", className)}
- {...props}
- >
- <ChevronLeftIcon />
- <span className="hidden sm:block">Previous</span>
- </PaginationLink>
- )
- }
- function PaginationNext({
- className,
- ...props
- }: React.ComponentProps<typeof PaginationLink>) {
- return (
- <PaginationLink
- aria-label="Go to next page"
- size="default"
- className={cn("gap-1 px-2.5 sm:pr-2.5", className)}
- {...props}
- >
- <span className="hidden sm:block">Next</span>
- <ChevronRightIcon />
- </PaginationLink>
- )
- }
- function PaginationEllipsis({
- className,
- ...props
- }: React.ComponentProps<"span">) {
- return (
- <span
- aria-hidden
- data-slot="pagination-ellipsis"
- className={cn("flex size-9 items-center justify-center", className)}
- {...props}
- >
- <MoreHorizontalIcon className="size-4" />
- <span className="sr-only">More pages</span>
- </span>
- )
- }
- export {
- Pagination,
- PaginationContent,
- PaginationLink,
- PaginationItem,
- PaginationPrevious,
- PaginationNext,
- PaginationEllipsis,
- }
|