import * as React from "react" import { cn } from "@/lib/utils" import { ArrowUp, ArrowDown, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react" interface TableProps extends React.HTMLAttributes {} /** * Table component for displaying tabular data with sticky header. */ const Table = React.forwardRef( ({ className, ...props }, ref) => (
) ) Table.displayName = "Table" interface TableHeaderProps extends React.HTMLAttributes {} /** * TableHeader component for table header with sticky positioning. */ const TableHeader = React.forwardRef< HTMLTableSectionElement, TableHeaderProps >(({ className, ...props }, ref) => ( )) TableHeader.displayName = "TableHeader" interface TableBodyProps extends React.HTMLAttributes {} /** * TableBody component for table body with hover effects. */ const TableBody = React.forwardRef< HTMLTableSectionElement, TableBodyProps >(({ className, ...props }, ref) => ( )) TableBody.displayName = "TableBody" interface TableFooterProps extends React.HTMLAttributes {} /** * TableFooter component for table footer. */ const TableFooter = React.forwardRef< HTMLTableSectionElement, TableFooterProps >(({ className, ...props }, ref) => ( tr]:last:border-b-0", className )} style={{ backgroundColor: 'var(--sand-beige)' }} {...props} /> )) TableFooter.displayName = "TableFooter" interface TableRowProps extends React.HTMLAttributes {} /** * TableRow component for table row with hover effect. */ const TableRow = React.forwardRef( ({ className, ...props }, ref) => ( { e.currentTarget.style.backgroundColor = 'var(--soft-cream)' }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'var(--ivory-cream)' }} {...props} /> ) ) TableRow.displayName = "TableRow" interface TableHeadProps extends React.ThHTMLAttributes {} /** * TableHead component for table header cell with bold text. */ const TableHead = React.forwardRef( ({ className, ...props }, ref) => (
) ) TableHead.displayName = "TableHead" interface TableCellProps extends React.TdHTMLAttributes {} /** * TableCell component for table data cell. */ const TableCell = React.forwardRef( ({ className, ...props }, ref) => ( ) ) TableCell.displayName = "TableCell" interface TableCaptionProps extends React.HTMLAttributes {} /** * TableCaption component for table caption. */ const TableCaption = React.forwardRef< HTMLTableCaptionElement, TableCaptionProps >(({ className, ...props }, ref) => (
)) TableCaption.displayName = "TableCaption" interface SortableTableHeadProps extends TableHeadProps { sortable?: boolean sortDirection?: 'asc' | 'desc' | null onSort?: () => void } /** * SortableTableHead component for sortable table headers with sort indicators. * @param {boolean} sortable - Whether the column is sortable * @param {string} sortDirection - Current sort direction: asc, desc, or null * @param {Function} onSort - Callback when sort is clicked */ export function SortableTableHead({ sortable = false, sortDirection = null, onSort, className, children, ...props }: SortableTableHeadProps) { return (
{children} {sortable && ( )}
) } interface PaginationProps { currentPage: number totalPages: number onPageChange: (page: number) => void pageSize?: number totalItems?: number showPageSizeSelector?: boolean pageSizeOptions?: number[] onPageSizeChange?: (size: number) => void } /** * Pagination component for table pagination. * @param {number} currentPage - Current page number (1-based) * @param {number} totalPages - Total number of pages * @param {Function} onPageChange - Callback when page changes * @param {number} pageSize - Number of items per page * @param {number} totalItems - Total number of items * @param {boolean} showPageSizeSelector - Whether to show page size selector * @param {number[]} pageSizeOptions - Available page size options * @param {Function} onPageSizeChange - Callback when page size changes */ export function Pagination({ currentPage, totalPages, onPageChange, pageSize, totalItems, showPageSizeSelector = false, pageSizeOptions = [10, 25, 50, 100], onPageSizeChange, }: PaginationProps) { const startItem = ((currentPage - 1) * (pageSize || 10)) + 1 const endItem = Math.min(currentPage * (pageSize || 10), totalItems || 0) return (
{totalItems !== undefined && pageSize !== undefined && ( Mostrando {startItem}-{endItem} de {totalItems} )} {showPageSizeSelector && onPageSizeChange && ( )}
Página {currentPage} de {totalPages}
) } export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, }