Skip to content

Table

Table shows rows of data on a phone. It pins the leading column, scrolls the others sideways and keeps every row in one table at one height, in three densities, so people can compare values across rows.

On this page
  1. Preview
  2. Layouts
  3. Pinned column
  4. Density
  5. Header and sort
  6. Cells
  7. Trend chip
  8. Key Value Row
  9. Properties
  10. Tokens
  11. iOS and Material 3
  12. Accessibility
  13. Guidelines
  14. Examples

Preview

Click a header to sort, scroll the table sideways to slide the values under the pinned column, and switch the row density.

Table, Layout Inset, Density Default, Show pinned column, Show actions columnInset 361 x 268, header 44, rows 56, lead column 160
Row density
Invoices by person, with amount, status and invoice number
Actions
Kai AndersenDesign
1,248
Paid
INV-2481
Lena FischerMarketing
540
Paid
INV-2484
Mara DuarteFinance
860
Pending
INV-2482
Tomas ReyesEngineering
3,120
Overdue
INV-2483

Rows are separated by a hairline: the table draws no row hover and no striping.

Read from the Table set, node 16152:1156, on October 2, 2026.

Which layouts does Table have?

Table has two layouts. Inset keeps the table inside a card or a padded screen, and Full bleed runs it from one screen edge to the other.

Layout Inset, Layout Full bleedInset 361 x 268, radius 16; Full bleed 393 x 268, radius 0

Layout Inset

Layout Full bleed

Layout, option, width, radius, outline, lead column
LayoutWidthRadiusOutlineLead column
Inset361161 pt on all four sides160
Full bleed39301 pt on top and bottom only168

Inset is a 393 pt screen less 16 pt of margin on each side. Inside a card, set the table radius to the card radius minus the card padding, so the corners stay concentric.

Full bleed is for a table that meets the screen edge and scrolls sideways: its lead column sits on the 24 pt margin, which is why that column is 8 wider than in Inset. The Tasks table screen uses Full bleed.

Both layouts measure 268 tall with four rows at Default density: a 44 header and four rows of 56. The outline is a stroke drawn inside the frame, so it takes no height.

When should a column be pinned?

Pin the column that names the row, so a value never loses its label while it scrolls. Pin one column only, and only when the table is wider than the screen.

Pinned column at rest, scrolled by 120Lead column 160, scroll area 436, fade 40

At rest

Scrolled by 120

Pinned column and scroll, part, measure, what it does
PartMeasureWhat it does
Pinned column160, from the table/column/lead tokenStays at the left edge, with a 1 pt right hairline in border/soft-100.
Scroll areaFour columns, 436 wideAmount 104, Status 132, Invoice 120 and Actions 80 slide under the pinned column.
Peek201 of a 361 tableOne full value column fits beside the pinned one and the next is cut, which invites the scroll.
Scroll hint40 wide fade at the right edgeFades to the table ground, 92 percent at 70 percent of its width, so more columns read as more.
Edge shadowdropShadow/edgeFalls on the values that pass under the pinned column once the table has scrolled.
Show pinned columnBoolean, on by defaultTurn it off when every column fits in one screen width.

A pinned column pays for itself when the table has more columns than fit beside it. On a 393 pt screen a 160 pt pinned column leaves 233 pt, a little under two value columns at the default width, so a table with three or more columns scrolls and gains from the pin.

A table with a lead column and one value column fits without a pin, and the pin would only take 160 pt of width.

Which density fits which screen?

Use Default for most tables. Compact fits screens people scan row by row, and Comfortable fits cells that hold two lines or that fingers press.

Density Compact, Default, ComfortableRows 48, 56 and 64, padding 16, gap 8

Density Compact

Density Default

Density Comfortable

Density, option, row height, room around a 36 control, use for
DensityRow heightRoom above and below a 36 controlUse for
Compact486Long lists people scan, such as transactions.
Default5610Most tables, and the density the Table is built at.
Comfortable6414Cells with two lines, such as User, and tables people mostly tap.

Density is a property of _Table Cell, so the Table itself has none. To change a table, select its cells and set Density once.

The header stays 44 at every density.

What can a Table cell hold?

A cell holds one of eight parts, chosen through its Content swap. Each part hugs its content, so the cell does the aligning.

Text, Value, Status, Action, User, Trend, Sparkline, SlotCell 120 wide, padding 16, hairline 1

Text

Leading

Value

Trailing

Status

Leading

Action

Trailing

User

Leading

Trend

Leading

Sparkline

Leading

Slot

Leading

Cell contents, part, use for, size, built from
PartUse forSizeBuilt from
_Cell Content / TextNames, descriptions and any value that reads as words.Hugs, 20 highLabel in fg/strong-950, sm/default
_Cell Content / ValueA number. Right aligned so the digits line up down the column.Hugs, 20 highsm/emphasized in fg/strong-950
_Cell Content / StatusOne word that names the status.24 highBadge, Pill, Soft, with the Dot on
_Cell Content / ActionOne action. Put the rest behind a menu.36 roundButton, Neutral, Weak, Size sm, icon only
_Cell Content / UserA row about a person: avatar, name and a second line.126 by 36Avatar at 24, name in sm/emphasized, second line in xs/default, fg/sub-700
_Cell Content / TrendA change against a previous period.68 by 24Trend Chip
_Cell Content / SparklineShape only. The number belongs in its own column.64 by 20Sparkline, seven points
_Cell Content / SlotAnything the kit does not ship.120 by 24Frame on bg/weak-50 with a border/sub-200 stroke at radius 8

Content is an instance swap with these eight parts as its preferred values, so adding a kind of cell costs one component and no extra variant.

Cell contents use instance swap rather than native slots on purpose: Figma support confirmed on April 7, 2026 that once slot content is touched, even to reapply the same value, it stops inheriting library updates, and every filled table cell would freeze against the next Appetite UI release.

How do you show a change where down is good?

Set Direction to Down and Tone to Positive. Direction is what the number did, and Tone is whether that is good news: churn going up is Up and Negative, a falling cost is Down and Positive.

Direction Up, Down, Flat by Tone Positive, Negative, NeutralHeight 24, padding 4 by 8, gap 4, arrow 12

Tone Positive

Up, positive: 12.4%Down, positive: 12.4%Flat, positive: 12.4%

Tone Negative

Up, negative: 12.4%Down, negative: 12.4%Flat, negative: 12.4%

Tone Neutral

Up: 12.4%Down: 12.4%Flat: 12.4%

Trend Chip is 24 high with 4 by 8 of padding, a 12 pt arrow and the value in xs/emphasized. Positive and Negative sit on the lighter step of their state family with the dark-950 step as ink, and Neutral sits on bg/weak-50 with fg/sub-700.

The arrow follows the number and the color follows the news, so a falling cost can be Down and Positive. The arrow is a picture and the tone is a color, so a screen reader needs the words: the live chip carries them as hidden text.

A Sparkline colors by direction: Up is state/success/base-500, Down is state/error/base-500 and Flat is fg/sub-700. Beside a Trend Chip of the opposite tone it contradicts the chip, so pair a Sparkline with a number and let the chip carry the tone.

When does a Key Value Row replace a table?

When the data is one record. A Key Value Row is a label on the left and a value on the right, for summaries and detail lists. A table gives columns, this gives pairs.

Key Value Row, Divider on, last row without361 x 44, padding 12, divider 1
Subtotal
1,248.00
Delivery
0.00
Tax
99.84
Total
1,347.84

The row is 361 by 44 with 12 pt above and below. The label is sm/default in fg/sub-700, and the value is sm/emphasized in fg/strong-950.

The divider is an absolute 1 pt layer in border/soft-100, because a layer can be switched by a component property and a stroke cannot: turn the Divider boolean off on the last row of a list.

Properties

Every property of the parts a table uses. Table has 2 layouts, _Table Header Cell is Align by Sort for 6 variants, _Table Cell is Align by Density for 6 variants and Trend Chip is Direction by Tone for 9 variants.

Properties, set, property, type, options, default
SetPropertyTypeOptionsDefault
TableLayoutVariantInset or Full bleedInset
TableShow pinned columnBooleanOn or offOn
TableShow actions columnBooleanOn or offOn
TableRow 3BooleanOn or offOn
TableRow 4BooleanOn or offOn
_Table Header CellAlignVariantLeading or TrailingLeading
_Table Header CellSortVariantNone, Asc or DescNone
_Table Header CellLabelTextAny textColumn
_Table Header CellType IconBooleanOn or offOff
_Table Header CellType Icon SwapInstance swapThe Icons settype
_Table CellAlignVariantLeading or TrailingLeading
_Table CellDensityVariantCompact, Default or ComfortableCompact
_Table CellContentInstance swapThe eight _Cell Content parts_Cell Content / Text
Trend ChipDirectionVariantUp, Down or FlatUp
Trend ChipToneVariantPositive, Negative or NeutralPositive
Trend ChipValueTextAny text12.4%
Key Value RowLabelTextAny textSubtotal
Key Value RowValueTextAny text1,248.00
Key Value RowDividerBooleanOn or offOn
Sparkline, on the Chart pageTrendVariantUp, Down or FlatUp
Sparkline, on the Chart pageShow DotBooleanOn or offOn

Row 3 and Row 4 take the table from four rows down to two. _Table Cell opens on Density Compact, while the Table is built from Default cells.

Read from the Table page of the Figma file on October 2, 2026.

Tokens

Every value the Table parts read, resolved through its aliases to the Foundations primitive.

Tokens, token, light, dark, applied to
TokenLightDarkApplied to
bg/white-0#FFFFFF#0E0E0FTable ground, body cells, the pinned column
bg/weak-50#F4F5F5#242427Header band, Neutral Trend Chip, Action button, Slot
border/soft-100#E9E9EA#2F2F31Outline, row hairline, pinned hairline, Divider
border/sub-200#D1D1D6#48484ASlot stroke
text/soft-500#8E8E93#AEAEB2Header label at Sort None
text/strong-950#0E0E0F#FFFFFFHeader label when sorted
fg/strong-950#0E0E0F#FFFFFFCell text, values, names, Key Value Row value
fg/sub-700#48484A#C7C7CCSecond line of User, Key Value Row label, Neutral Trend Chip, Flat Sparkline
brand/base#155DFC#2B7FFFSort chevron
state/success/lighter-50#F0FDF4#22C55E at 16%Positive Trend Chip, Success status
state/success/dark-950#09361B#86EFACInk on the Positive chip and the Success status
state/success/base-500#22C55E#16A34AStatus dot, Sparkline Up
state/error/lighter-50#FEF2F2#FB2C36 at 16%Negative Trend Chip, Error status
state/error/dark-950#460809#FFA2A2Ink on the Negative chip and the Error status
state/error/base-500#FB2C36#FB2C36Sparkline Down
Geometry and styles, token, value, applied to
TokenValueApplied to
table/column/lead160The pinned column
table/column/default120A value column
table/column/action80The Actions column
dimensions/spacing/416Cell and header padding at the sides
dimensions/spacing/28Gap inside a cell
dimensions/spacing/14Gap inside a header cell
dimensions/radius/xl16Inset outline
dimensions/radius/md8Slot cell
dropShadow/edge6 0 12, spread -4, black at 8%Pinned column edge, drawn once the table scrolls
sm/default, sm/emphasized14 on 20, Regular and Semi BoldLabels, values, names
xs/default, xs/emphasized12 on 16, Regular and Semi BoldSecond line of User, Trend Chip, Status

Only the lead, default and action widths are tokens. Column / Amount is 104 wide and Column / Status is 132 wide in the Table, with no width variable behind either.

How does Table differ on iOS and Material 3?

Table has no counterpart on the Apple or Material 3 pages of the file, so Appetite UI draws one Table that is the same on both platforms.

Counterparts, Appetite UI component, iOS counterpart, Material 3 counterpart, what differs
Appetite UI componentiOS counterpartMaterial 3 counterpartWhat differs
TableNone in the file. The nearest pattern is List.None in the file. The nearest pattern is List.A platform list holds one value per row. Table keeps columns, pins one and scrolls the rest.
Key Value RowNone in the file. A List row with a detail value comes closest.None in the file. A List row with trailing text comes closest.Key Value Row is a pair with a divider layer, built for summaries.
Trend ChipNone in the fileNone in the fileNeither platform page carries a change indicator.

Keyboard and screen readers

A table that scrolls sideways has to take focus, and every part of it needs a name. The Table specimen on this page does all of it.

Keyboard and screen reader notes, part, role and name, keyboard
PartRole and nameKeyboard
TableA table with a caption. Header cells are th with scope col, the first cell of each row is th with scope row.Reads by row and column in a screen reader's table mode.
Scroll regionA region with a name that says it scrolls sideways, in the tab order.Tab to it, then the arrow keys scroll.
Sort headerA button inside the th, with aria-sort on the sorted column only.Enter or Space cycles None, Ascending, Descending. A polite status line says how the rows were sorted.
ActionAn icon button named with its row, such as Actions for Ines Roca.Tab, then Enter or Space.
StatusThe word is the status, and color repeats it.Not focusable.
Trend ChipHidden text states the direction and the tone before the value.Not focusable.

The Action control is 36 pt. The Platform collection sets platform/min-touch-target to 44 on iOS and 48 on Android, so give the control a transparent hit area of 44 pt: a 48 pt Compact row has room for it, and an Android build needs 48.

The header label at Sort None is text/soft-500 on bg/weak-50, a contrast of 2.99 to 1 in light and 7.0 to 1 in dark. The same soft text color on white is 3.26 to 1.

Light mode is under 4.5 to 1 for 14 pt text and is a documented product choice. Give a header label in your own product a color at 4.5 to 1, such as text/sub-700.

Guidelines

Do

Align numbers to the trailing edge in Value cells, so the digits line up down the column.

Don't

Do not left align numbers. Digits of different lengths stop lining up and the column cannot be compared.

Do

Put one word in a Status cell and let the dot and the tint repeat it.

Don't

Do not put a sentence in a Status cell. It truncates and the badge stops reading as a state.

Pin the one column that names the row and keep every other column in the scroll area. Keep one row height across the table, and keep one action per row with the rest behind a menu.

Set a Trend Chip from direction first and tone second.

Examples

Three tables made of the parts above, with the rows the Figma file ships: the invoices of the Table set, the tasks of the Tasks table screen in Full bleed, and the top sellers of the Examples board.

Invoices, Layout InsetInset 361, Full bleed 393, Density Default
Invoices by person, with amount, status and invoice number
Actions
Kai AndersenDesign
1,248
Paid
INV-2481
Lena FischerMarketing
540
Paid
INV-2484
Mara DuarteFinance
860
Pending
INV-2482
Tomas ReyesEngineering
3,120
Overdue
INV-2483
Tasks, Layout Full bleed, Type Icon onInset 361, Full bleed 393, Density Default
Tasks with due date, status and project
Actions
Push alertsMarketing
Today
In progress
Marketing
OnboardingMobile
12 Sep
In progress
Mobile
Pricing pageWeb
13 Sep
To do
Web
Store assetsMobile
14 Sep
In progress
Mobile
Top sellers, Layout Inset, Sparkline and Trend Chip columnsInset 361, Full bleed 393, Density Default
Top sellers by revenue over the last 7 days, with a sparkline and the change
7 daysActions
Kai Andersen142 orders
4,820
Up, positive: 18%
Mara Duarte118 orders
3,960
Up, positive: 9%
Tomas Reyes96 orders
3,410
Down, negative: 4%
Lena Fischer88 orders
2,980
Up, positive: 2%

The tasks table sorts by Due, so its header carries the one mark. Top sellers sorts by Sales, descending, and puts a Sparkline and a Trend Chip beside the number: scroll it sideways to reach the Trend column.

Rows from the Table set, the Tasks Table screen and the Table Examples board, read on October 2, 2026.