import { ReactNode } from 'react' import clsx from 'clsx' interface Column { header: string accessor: (row: T) => ReactNode className?: string } interface TableProps { columns: Column[] data: T[] className?: string emptyMessage?: string /** * responsive: stacked cards below `md`, table at md+. * tabular: always use columnar HTML table (holder lists, dense numeric tables). */ layout?: 'responsive' | 'tabular' /** Stable key for each row (e.g. row => row.id or row => row.hash). Falls back to index if not provided. */ keyExtractor?: (row: T) => string | number } export function Table({ columns, data, className, emptyMessage = 'No data available right now.', layout = 'responsive', keyExtractor, }: TableProps) { if (data.length === 0) { return (
{emptyMessage}
) } const stackedClass = layout === 'tabular' ? 'hidden' : 'grid gap-3 md:hidden' const tableWrapperClass = layout === 'tabular' ? 'overflow-x-auto' : 'hidden overflow-x-auto md:block' return (
{data.map((row, rowIndex) => (
{columns.map((column, colIndex) => (
{column.header}
{column.accessor(row)}
))}
))}
{columns.map((column, index) => ( ))} {data.map((row, rowIndex) => ( {columns.map((column, colIndex) => ( ))} ))}
{column.header}
{column.accessor(row)}
) }