DataGrid
Data Display
Tables
Modern CSS Grid-based data grid with flexible layouts, custom column widths, and rich content support.
Preview
Grid with avatars, badges, and formatted content
Employee
Department
Role
Status
Salary
AJ
Alice Johnson
alice@example.com
Engineering
Admin
Active
$120,000
BS
Bob Smith
bob@example.com
Sales
User
Active
$85,000
CB
Charlie Brown
charlie@example.com
Marketing
User
Inactive
$75,000
DP
Diana Prince
diana@example.com
Engineering
Manager
Active
$95,000
EH
Ethan Hunt
ethan@example.com
Operations
User
Active
$80,000
Density Options
Compact, comfortable, and spacious row heights
Compact
Project
Owner
Tasks
Progress
Marketing Strategy
Olivia Chen
42
90%
Content Pipeline
Sofia Rodriguez
28
89%
Product Launch
Priya Sharma
56
21%
Team Operations
Yuki Tanaka
15
100%
Spacious
Project
Owner
Tasks
Progress
Marketing Strategy
Olivia Chen
42
90%
Content Pipeline
Sofia Rodriguez
28
89%
Product Launch
Priya Sharma
56
21%
Team Operations
Yuki Tanaka
15
100%
Striped Rows
Alternating row colors for better readability
Project
Owner
Tasks
Progress
Marketing Strategy
Olivia Chen
42
90%
Content Pipeline
Sofia Rodriguez
28
89%
Product Launch
Priya Sharma
56
21%
Team Operations
Yuki Tanaka
15
100%
Loading State
Built-in loading indicator
Project
Owner
Tasks
Progress
Loading...
Props
DataGrid component API reference
| Prop | Type | Default | Description |
|---|---|---|---|
columns | DataGridColumn[] | — | Array of column definitions (required) |
data | T[] | — | Array of data objects (required) |
density | 'compact' | 'comfortable' | 'spacious' | 'comfortable' | Row height density |
striped | boolean | false | Alternating row colors |
hoverable | boolean | true | Row hover effect |
selectable | boolean | false | Enable row selection |
searchable | boolean | true | Enable search |
pagination | boolean | true | Enable pagination |
pageSize | number | 10 | Rows per page |
loading | boolean | false | Show loading state |
actions | DataGridAction[] | — | Row action buttons |
onRowClick | (row: T) => void | — | Row click handler |
Column Definition
interface DataGridColumn { key: string // Data key to display label: string // Column header label width?: string // CSS Grid width (1fr, 200px, minmax(...)) align?: 'left' | 'center' | 'right' sortable?: boolean // Enable sorting (default: true) render?: (value: any, row: T) => ReactNode // Custom cell renderer headerRender?: () => ReactNode // Custom header renderer}Usage
Import and implementation example
import { DataGrid } from '@/blocks/data-display/data-grid'import { Badge } from '@/components/ui/badge'import { Avatar } from '@/components/ui/avatar'
export default function Example() { const columns = [ { key: 'name', label: 'Employee', width: 'minmax(200px, 1fr)', render: (value, row) => ( <div className="flex items-center gap-3"> <Avatar size="sm">{row.avatar}</Avatar> <div> <div className="font-medium">{value}</div> <div className="text-xs text-slate-500">{row.email}</div> </div> </div> ), }, { key: 'status', label: 'Status', width: '120px', align: 'center', render: (value) => ( <Badge variant={value === 'Active' ? 'success' : 'default'}> {value} </Badge> ), }, ]
return ( <DataGrid columns={columns} data={users} density="comfortable" striped hoverable selectable searchable pagination pageSize={10} onRowClick={(row) => console.log(row)} /> )}Features
Built-in functionality
- CSS Grid layout: Flexible column widths with minmax
- Custom renderers: Rich content in cells
- Three densities: Compact, comfortable, spacious
- Row selection: Checkbox selection with select all
- Search & pagination: Built-in search and pagination
- Sorting: Column-based sorting
- Row actions: Action buttons per row
- Dark mode: Full dark mode support
Accessibility
Accessibility considerations
ARIA Attributes
Uses role="grid" for the tableColumn headers use role="columnheader"Rows use role="row" with proper labelingKeyboard Navigation
| Key | Action |
|---|---|
| Tab | Navigate between interactive elements |
| Arrow Keys | Navigate rows when focused |
| Space | Toggle row selection |
| Enter | Activate row click handler |
Notes
- Search input is properly labeled
- Pagination controls are keyboard accessible
- Sort direction is communicated via aria-sort
- Loading state announced to screen readers