figma guide

Figma tables and data UI: rows, columns, sorting, and handoff

Build scalable tables in Figma with row components, column alignment, sticky headers, empty states, and Dev Mode specs so data-heavy screens hand off cleanly.

Published
Updated
Jun 05, 2026
Read time
6 min
Level
Intermediate

Quick answer

Tables in Figma are built from reusable row components, not one giant flattened frame. Create a header row component, a body row with variants (state=default | hover | selected | disabled), and cell subcomponents with fixed or min widths per column type (text, number, badge, actions). Stack rows in vertical auto layout inside a scrollable content frame; document sorting, pagination, and empty states in Dev Mode. Use auto layout for alignment, semantic color for zebra/hover, and Dev Mode checklist before handoff. More patterns on Figma guides.


Who this is for

  • Designers on admin panels, billing, analytics, and settings with dense data.
  • Design system contributors defining table primitives before every squad invents a new grid.
  • Engineers implementing virtualized lists who need column width and truncation rules.

Table anatomy

PartComponent?Notes
Table containerFrameBorder radius, shadow level from effects guide
Header rowComponentBold labels, sort affordance optional
Body rowComponent setVariants for hover/selected
CellNested component or slotAlign numbers right, text left
FooterFramePagination, selection count
ToolbarSeparate frameFilters, search, bulk actions

Verdict: never draw 20 static rows and call it done—engineers need row logic, not a screenshot.


Column types and alignment

Column typeAlignmentWidth strategy
Text (name, email)Leftmin-width + truncate with ellipsis spec
Number / currencyRightTabular figures in typography styles
Status / badgeLeft or centerFixed width from badge component
DateLeftISO format in description (YYYY-MM-DD)
Actions (icons)RightFixed 80–120px, icon buttons from library
Checkbox selectionCenter40–48px column

Document truncate vs wrap per column in the cell component description.


Building the row component

Table / Row
├── Variant: type=header | body
├── Variant: state=default | hover | selected | disabled
├── Auto layout: horizontal, gap 0, fill container width
├── Cell / Checkbox (optional, instance)
├── Cell / Text (fill container)
├── Cell / Number (hug or fixed)
├── Cell / Badge (hug)
└── Cell / Actions (hug)
  1. Set row min height 40–48px (touch-friendly actions) or 32px for dense admin.
  2. Use stroke bottom border/subtle or zebra fill token on alternate rows.
  3. Selected row: background surface/selected, do not rely on border alone.

Publish from your library file—see team libraries.


Header row and sorting

ElementDesignSpec
Labeltext/label-sm semibold
Sort iconChevron up/down/neutralsortable=true, cycle: none → asc → desc
Resize (optional)Column divider handleOut of scope in Figma—note “resizable in product”

Show three header variants on a spec artboard: unsorted, sorted asc, sorted desc—so QA has reference.


Toolbar and filters (above the table)

Horizontal auto layout:

  1. Search field (reuse form input)
  2. Filter chips or dropdown triggers
  3. Primary action (Export, Add) aligned to inline end

Link filter patterns to wireframing workflow when exploring IA before hi-fi tables.


States you must design

StateWhat to show
LoadingSkeleton rows (3–5), same row height as body
EmptyIllustration optional + headline + CTA
ErrorInline alert above table, retry action
Partial selectionHeader checkbox indeterminate—describe in copy
No results (filtered)Different from empty database

Skeleton: use low-contrast rectangles with effects disabled; animate in prototype only if it helps stakeholders—engineers implement in code.


Pagination and virtualization

Figma cannot simulate 10,000 rows—document behavior instead:

PatternSpec fields
Page size10 / 25 / 50
ControlsPrev, next, page numbers
Infinite scrollLoad-more threshold, spinner placement
Virtualized listRow height fixed at N px for dev

Add a footer component Table / Pagination with variants for first/middle/last page.


Sticky header and horizontal scroll

  1. Place header in a frame with clip content above the scroll body, or duplicate header in spec with note position: sticky.
  2. For wide tables, put row components in a frame wider than viewport; show horizontal scroll on mobile artboard.
  3. On mobile, consider card list variant instead of 8-column table—ship as layout=card variant on the same feature page.

Cross-link responsive design for breakpoint-specific layouts.


Comparison: table approaches in Figma

ApproachBest forWeakness
Row component + auto layout stackProduction systemsSetup time
Single frame with manual linesThrowaway mockUnmaintainable
Plugin-generated tablesQuick populationOften off-token
Real data plugins (Content Reel)Stress testing copyNot structure

Verdict: invest in row + cell components once; use plugins only to fill instances.


Accessibility and readability

  • Header cells: use <th> semantics in spec; do not use body row style for headers.
  • Row hover: contrast check against background (a11y plugins).
  • Selection: checkbox + row highlight, not color alone.
  • Numeric columns: right-align and use tabular lining in text styles.

Keyboard: document row focus, Enter to open detail, and Space to select in Dev Mode—Figma will not simulate full grid keyboard nav.


Handoff to engineering

DeliverableLocation
Column width min/maxCell component descriptions
Sort behaviorHeader component description
Row click targetWhole row vs link only
API field mappingTable frame description (col: user.email)
TokensSemantic colors for hover/selected/zebra

Use dev handoff plugins when exporting design tokens for data-heavy apps.


Dashboard context (cards + tables)

Most dashboards combine KPI cards and tables:

BlockFigma tip
KPI rowHorizontal auto layout, equal-width cards with fill
Chart placeholderNamed layer chart / revenue / 12mo—engineers replace
Table blockFull-width below cards

Keep charts as bounded frames with axis labels—even if data is fake—so layout does not collapse in dev.


Common mistakes

MistakeConsequenceFix
One-off 30-row frameNo component reuseRow instances in auto layout
Center-aligned numbersHard to scanRight-align numeric cells
Missing empty stateDevs ship blank white boxDedicated empty artboard
Actions only on hover in static frameMissing default specShow actions column always or document reveal
Inconsistent row heightBroken virtualizationSingle row min-height token

FAQ

Should each column be its own component?

Optional. Start with row + cell slots; split columns into components when three+ products need different column sets.

How do I show sortable columns in prototype?

Use variants on the header cell for sort direction, or swap header instances on tap—keep logic in the description for engineers.

Card layout vs table on mobile?

Ship layout=table and layout=card variants on the same feature spec page; pick per breakpoint in the handoff table.

Zebra striping?

Use alternate row variant or a boolean property zebra=true on even rows—bind fill to surface/row-alt token.


Bottom line

Treat tables as systems: header row, body row variants, typed cells, and explicit empty/loading/error artboards. Align numbers, document sort and pagination in Dev Mode, and keep rows as library instances so data screens stay maintainable. Continue with forms, navigation patterns, and organize files at scale.

Share on X

§ Keep reading

Related guides.