All files / core/components/ui pagination.tsx

91.66% Statements 22/24
60% Branches 3/5
85.71% Functions 6/7
91.66% Lines 22/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109              1x 2x             1x   1x   2x     1x   1x 6x   1x             1x 4x                       1x   1x       2x 2x                       1x   1x 2x 2x                       1x   1x                         1x                      
import * as React from 'react'
import { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react'
import { useTranslation } from 'react-i18next'
 
import { cn } from '@core/lib/utils'
import { type ButtonProps, buttonVariants } from '@core/components/ui/button'
 
const Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => (
    <nav
        role="navigation"
        aria-label="pagination"
        className={cn('mx-auto flex w-full justify-center', className)}
        {...props}
    />
)
Pagination.displayName = 'Pagination'
 
const PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<'ul'>>(
    ({ className, ...props }, ref) => (
        <ul ref={ref} className={cn('flex flex-row items-center gap-1', className)} {...props} />
    ),
)
PaginationContent.displayName = 'PaginationContent'
 
const PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<'li'>>(
    ({ className, ...props }, ref) => <li ref={ref} className={cn('', className)} {...props} />,
)
PaginationItem.displayName = 'PaginationItem'
 
type PaginationLinkProps = {
    isActive?: boolean
} & Pick<ButtonProps, 'size'> &
    React.ComponentProps<'a'>
 
const PaginationLink = ({ className, isActive, size = 'icon', ...props }: PaginationLinkProps) => (
    <a
        aria-current={isActive ? 'page' : undefined}
        className={cn(
            buttonVariants({
                variant: isActive ? 'outline' : 'ghost',
                size,
            }),
            className,
        )}
        {...props}
    />
)
PaginationLink.displayName = 'PaginationLink'
 
const PaginationPrevious = ({
    className,
    ...props
}: React.ComponentProps<typeof PaginationLink>) => {
    const { t } = useTranslation('pagination')
    return (
        <PaginationLink
            aria-label={t('previous')}
            size="default"
            className={cn('gap-1 pl-2.5', className)}
            {...props}
        >
            <ChevronLeft className="h-4 w-4" />
            <span>{t('previous')}</span>
        </PaginationLink>
    )
}
PaginationPrevious.displayName = 'PaginationPrevious'
 
const PaginationNext = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => {
    const { t } = useTranslation('pagination')
    return (
        <PaginationLink
            aria-label={t('next')}
            size="default"
            className={cn('gap-1 pr-2.5', className)}
            {...props}
        >
            <span>{t('next')}</span>
            <ChevronRight className="h-4 w-4" />
        </PaginationLink>
    )
}
PaginationNext.displayName = 'PaginationNext'
 
const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => {
    const { t } = useTranslation('pagination')
    return (
        <span
            aria-hidden
            className={cn('flex h-9 w-9 items-center justify-center', className)}
            {...props}
        >
            <MoreHorizontal className="h-4 w-4" />
            <span className="sr-only">{t('more')}</span>
        </span>
    )
}
PaginationEllipsis.displayName = 'PaginationEllipsis'
 
export {
    Pagination,
    PaginationContent,
    PaginationEllipsis,
    PaginationItem,
    PaginationLink,
    PaginationNext,
    PaginationPrevious,
}