Data Display Components
Data Display Components
Table Component
interface TableColumn<T> {
key: keyof T;
header: string;
sortable?: boolean;
filterable?: boolean;
width?: string | number;
render?: (value: any, row: T) => React.ReactNode;
}
interface TableProps<T> {
data: T[];
columns: TableColumn<T>[];
loading?: boolean;
selectable?: boolean;
pagination?: boolean;
pageSize?: number;
onSort?: (key: keyof T, direction: 'asc' | 'desc') => void;
onSelect?: (selectedRows: T[]) => void;
onPageChange?: (page: number) => void;
}
// Usage
<Table
data={campaigns}
columns={[
{ key: 'name', header: 'Campaign Name', sortable: true },
{ key: 'status', header: 'Status', render: renderStatusBadge },
{ key: 'sent', header: 'Emails Sent', sortable: true },
{ key: 'openRate', header: 'Open Rate', sortable: true, render: formatPercentage }
]}
pagination
pageSize={25}
selectable
onSelect={handleSelection}
/>
Card Component
interface CardProps {
variant?: 'default' | 'elevated' | 'outlined' | 'filled';
size?: 'sm' | 'md' | 'lg';
padding?: 'none' | 'sm' | 'md' | 'lg';
hoverable?: boolean;
clickable?: boolean;
fullWidth?: boolean;
onClick?: () => void;
header?: React.ReactNode;
footer?: React.ReactNode;
children: React.ReactNode;
}
// Usage
<Card variant="elevated" hoverable clickable onClick={handleCardClick}>
<CardHeader>
<Avatar src={user.avatar} />
<div>
<h3>{campaign.name}</h3>
<p>{campaign.description}</p>
</div>
</CardHeader>
<div className="card-metrics">
<Metric label="Sent" value={campaign.sent} />
<Metric label="Opens" value={campaign.opens} />
<Metric label="Clicks" value={campaign.clicks} />
</div>
</Card>