Table

Structured records for comparison, scanning, and row-level workflows. The component owns the table grammar; surrounding demos should not add a second visual frame.

Table · Divided
ProjectStatusOwnerTasksBudget
Website relaunchActiveOM42$18,400
Brand refreshReviewJuniper Vale16$9,750
App onboardingDraftBQ28$12,100
Checkout cleanupQueuedMS9$4,800
Analytics auditPausedZadie North31$7,250

Default table with row separators for scannable records.

Table · Plain
ProjectStatusOwnerTasksBudget
Website relaunchActiveOM42$18,400
Brand refreshReviewJV16$9,750
App onboardingDraftBQ28$12,100
Checkout cleanupQueuedMS9$4,800
Analytics auditPausedZN31$7,250

Same spacing and row height as divided; only the body row separators are removed.

Table · Row action
ProjectStatusOwnerOpenDue
Website relaunchOpenOM83d
Brand refreshReviewJV55d
App onboardingDraftBQ129d
Archive auditLockedZN0-
Checkout cleanupQueuedMS312d

Rows can advertise one clear action; static tables do not show hover affordance.

Table · Row selection
NameStatusOwnerBudget
Website relaunchActiveOM$18,400
Brand refreshSelectedJV$9,750
App onboardingDraftBQ$12,100
Checkout cleanupSelectedMS$4,800
Analytics auditPausedZN$7,250

Selection composes the native Checkbox; checked rows and the select-all indeterminate state use its exact visual and keyboard contract.

Usage notes

A table is for records with comparable columns.

VerdictRule
DoUse Table when rows compare across columns — items that are mainly narrative content belong in lists or cards.
DoDefault to --divided; --plain removes only the body row separators — spacing, density, and typography never change between variants.
DoKeep ordinary text in every column on Table's complete body recipe: body family, copy-sm, normal line height, regular weight, and normal tracking. Headers keep the same recipe and change only to semibold.
DoLet composed Badge, Chip, Avatar, Checkbox, Button, Link, Code, and similar components retain their own contracted typography and sizing.
DoRight-align numeric columns with tabular numbers, and give mixed tables explicit column tracks (colgroup) so numeric headers and cells share one right-aligned box.
DoUse the medium Avatar as-is in owner cells — standing alone it names the person (role="img" + aria-label).
DoKeep real table semantics — th headers, scope where it clarifies, a caption or heading naming the table; sorting, resizing, virtualization, and keyboard grids keep this visual contract and live in L2.
Don’tGive a static table hover affordance — --row-action exists for rows with one clear action, --row-selection for rows that persistently select.
Don’tApply page typography or ds-text-* recipes to individual plain cells or columns to manufacture hierarchy; semantic emphasis may change weight or color, never family or size.
Don’tMark selection with a second fill or a left marker — the checked checkbox is the selected state.
Don’tRound the table itself — the outer radius belongs to a wrapping container that owns the clipping, and header cells never round.