import React from 'react'; /* ── 1. Types & Interfaces ─────────────────────────────────────────── */ export type PaginationVariant = 'default' | 'outline' | 'ghost' | 'pills' | 'segmented' | 'compact' | 'icons-only'; export type PaginationSize = 'sm' | 'md' | 'lg'; export interface PaginationProps extends React.HTMLAttributes { currentPage?: number; totalPages?: number; totalItems?: number; startIndex?: number; endIndex?: number; pageSize?: number | string; pageSizeOptions?: number[]; variant?: PaginationVariant; size?: PaginationSize; showSummary?: boolean; showSizePicker?: boolean; showFirstLast?: boolean; onPageChange?: (page: number) => void; onPageSizeChange?: (size: number | string) => void; } /* ── 2. Composable Subcomponents (shadcn/ui style) ─────────────────── */ export const PaginationContent: React.FC> = ({ className = '', children, ...props }) => (
{children}
); export const PaginationItem: React.FC> = ({ className = '', children, ...props }) => (
{children}
); export interface PaginationLinkProps extends React.ButtonHTMLAttributes { isActive?: boolean; asAnchor?: boolean; href?: string; } export const PaginationLink: React.FC = ({ isActive = false, asAnchor = false, href, className = '', children, ...props }) => { const classes = `qhr-pagination__page ${isActive ? 'is-active' : ''} ${className}`.trim(); if (asAnchor && href) { return ( {children} ); } return ( ); }; export const PaginationPrevious: React.FC> = ({ className = '', children, ...props }) => ( ); export const PaginationNext: React.FC> = ({ className = '', children, ...props }) => ( ); export const PaginationFirst: React.FC> = ({ className = '', children, ...props }) => ( ); export const PaginationLast: React.FC> = ({ className = '', children, ...props }) => ( ); export const PaginationEllipsis: React.FC> = ({ className = '', ...props }) => ( ); export interface PaginationSummaryProps extends React.HTMLAttributes { start: number; end: number; total?: number; } export const PaginationSummary: React.FC = ({ start, end, total, className = '', ...props }) => (
عرض {start} إلى {end} {total !== undefined && ( <> من أصل {total} عنصراً )}
); /* ── 3. High-Level All-in-One Component ────────────────────────────── */ export const Pagination: React.FC = ({ currentPage = 1, totalPages = 1, totalItems, startIndex, endIndex, pageSize = 10, pageSizeOptions = [10, 25, 50], variant = 'default', size = 'md', showSummary = true, showSizePicker = false, showFirstLast = false, onPageChange, onPageSizeChange, className = '', children, ...props }) => { // If consumer passes children, render as headless composable shell if (children) { const rootClasses = [ 'qhr-pagination', variant !== 'default' ? `qhr-pagination--${variant}` : '', size !== 'md' ? `qhr-pagination--${size}` : '', className, ].filter(Boolean).join(' '); return ( ); } // Automatic calculation const getPages = () => { if (totalPages <= 7) { return Array.from({ length: totalPages }, (_, i) => i + 1); } if (currentPage <= 4) { return [1, 2, 3, 4, 5, '...', totalPages]; } if (currentPage >= totalPages - 3) { return [1, '...', totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages]; } return [1, '...', currentPage - 1, currentPage, currentPage + 1, '...', totalPages]; }; const pages = getPages(); const calculatedStart = startIndex ?? ((currentPage - 1) * Number(pageSize) + 1); const calculatedEnd = endIndex ?? Math.min(currentPage * Number(pageSize), totalItems ?? totalPages * Number(pageSize)); const rootClasses = [ 'qhr-pagination', variant !== 'default' ? `qhr-pagination--${variant}` : '', size !== 'md' ? `qhr-pagination--${size}` : '', className, ].filter(Boolean).join(' '); return ( ); };