Data Display
Data tables show structured information in rows and columns: student rosters, class schedules, workflow lists, submission histories. The CTD Learns App uses MUI's DataGrid with custom theme overrides for consistent styling: gray50 header background with uppercase labels, subtle row borders, hover highlighting, and an optional striped variant for dense tables. Status columns always use Chip components, never plain text, so state stays scannable.
Interactive Preview
DataGrid — Table display options
Name
Status
Maria Santos
James Chen
Aisha Johnson
Carlos Rivera
Props
density
striped
Row count
4
DataGrid
Maria Santos
maria@example.com
Spring 2026
Apr 6, 2026
James Chen
james@example.com
Spring 2026
Apr 3, 2026
Aisha Johnson
aisha@example.com
Fall 2025
Apr 5, 2026
Carlos Rivera
carlos@example.com
Spring 2026
Mar 15, 2026
Emily Nguyen
emily@example.com
Fall 2025
Apr 6, 2026
Border
1px solidgray200Border radius
10pxradiusLgFont size
14pxsmHeader bg
#F7F7F8gray50Header font
12px600 weight, uppercase, 0.05em trackingHeader border
1px solidgray200Cell border
1px solidgray100Row hover
#F7F7F8gray50Status cells
Chip component with semantic color variantsStriped Rows Variant
Maria Santos
Intro to React
85%
A
James Chen
Node.js Basics
72%
B+
Aisha Johnson
Intro to React
91%
A
Carlos Rivera
Database Design
45%
C
Striped row bg
#F0F0F1gray100Usage
Dense data tables where row distinction aids scanningCode
import { DataGrid } from '@mui/x-data-grid';
const columns = [
{ field: 'name', headerName: 'Name', flex: 1 },
{ field: 'email', headerName: 'Email', flex: 1.5 },
{
field: 'status',
headerName: 'Status',
flex: 1,
renderCell: (params) => (
<Chip label={params.value} color={statusColorMap[params.value]} size="small" />
),
},
{ field: 'cohort', headerName: 'Cohort', flex: 1 },
{ field: 'lastActive', headerName: 'Last Active', flex: 1 },
];
<DataGrid
rows={rows}
columns={columns}
pageSize={10}
disableSelectionOnClick
sx={{ border: 'none' }}
/><DataGrid
rows={rows}
columns={columns}
getRowClassName={(params) =>
params.indexRelativeToCurrentPage % 2 === 1 ? 'striped-row' : ''
}
sx={{
'& .striped-row': {
backgroundColor: "action.hover",
},
}}
/>