Row & Column

Atom
The layout primitives. Row lays children out horizontally, Column vertically. Both own arrangement through semantic boolean axes, a gap scale (flush / tight / snug / cozy / relaxed / loose), main-axis distribution (center, between, …), cross-axis alignment (alignCenter, baseline, …), and wrap / fill / grow / shrink, so a call site never hand-rolls flexDirection, gap, or alignItems.

Playground

Every control sets a real prop of FlexProps. The JSX below updates as you go.
Props
component
one of
Gap
pick one
Justify
pick one
Align
pick one
wrap
boolean
JSX · FlexProps
<Row />

Variants

9 examples from src/atoms/layout/layout.md, each rendered live from its own JSX.
Vertical stack
<Column>
<Button primary>Save</Button>
<Button ghost>Cancel</Button>
</Column>
schema
role
Centered row
<Row center>
<Badge>schema</Badge>
<Badge>role</Badge>
</Row>
Request ID
req_8f2c10ab
Space between
<Row between>
<Typography small>Request ID</Typography>
<Typography mono>req_8f2c10ab</Typography>
</Row>
alpha
beta
gamma
delta
epsilon
zeta
Wrap
<Row wrap>
<Badge>alpha</Badge>
<Badge>beta</Badge>
<Badge>gamma</Badge>
<Badge>delta</Badge>
<Badge>epsilon</Badge>
<Badge>zeta</Badge>
</Row>

Dashboard

Identity platform overview. Each widget reports its own window.
Shrink a child to the row
React Native gives every box flexShrink: 0, the opposite of the web's flex default, so a Row child sized by a long sentence keeps that sentence's full single-line width and spills past the row's edge, where the nearest clipping ancestor cuts it mid-word. shrink hands the row's width back to the text: the child gives way and the copy wraps. Reach for it on the copy in a heading-beside-actions row, or any Row child whose width should follow the row rather than its own longest line. It is not fill: fill also zeroes the flex basis, so in a wrap row every child then fits on one line and the actions stop wrapping below the copy.
<Row between alignEnd wrap>
<Column tight shrink>
<Typography h3>Dashboard</Typography>
<Typography small muted>Identity platform overview. Each widget reports its own window.</Typography>
</Column>
<Button outline small>Export</Button>
</Row>
Padded surround
Padded surround
<Card flush>
<Row pad>
<Typography>Padded surround</Typography>
</Row>
</Card>
Stacks at narrow widths
stacks renders the Row as a Column when the row's own container is at or below stackBreakpoint (default sm = 640): container-measured, so it stacks inside a narrow desktop column too, and the same gap, distribution, alignment, and padding props apply to the new axes. Children keep their own sizing, which makes stacks the tool for content-sized rows (a toolbar, a label beside its actions); equal-width tiles that should renumber columns belong to Grid. A Column never needs the inverse: a Column that must become a Row is a Row that stacks.
<Row stacks>
<Input placeholder="Search runs" />
<Button primary>New run</Button>
</Row>
Eight of twelve
Four
Spans (twelfths of the Row)
A direct child's span is its width in twelfths of the Row, Bootstrap's col-n: span={6} is half, span={4} a third, span={8} two thirds. The Row measures its own width and hands each spanning child a px cell with the gaps accounted for, so two span={6} children and the gap between them fill the row exactly, and spans past twelve wrap onto the next line. Fill components inside a span (a field, a card) fill the cell.
<Row>
<Column span={8}>
<Card>
<Typography medium>Eight of twelve</Typography>
</Card>
</Column>
<Column span={4}>
<Card>
<Typography medium>Four</Typography>
</Card>
</Column>
</Row>
Left
Right
Spans that stack
stacks and spans compose: below the breakpoint the Row becomes a Column and every child is full width, the col-12 col-md-6 idiom without a second prop. Crossing the breakpoint changes the layout only: every child stays mounted, so a field keeps its text and focus when a window is resized across it or a phone switches from the server's desktop layout after hydration. This is why a two-pane screen is a Row stacks of spans rather than a Row on one side of a useFormFactor() branch and a Column on the other, which remounts everything inside.
<Row stacks>
<Column span={6}>
<Card>
<Typography medium>Left</Typography>
</Card>
</Column>
<Column span={6}>
<Card>
<Typography medium>Right</Typography>
</Card>
</Column>
</Row>

Anatomy

1
Container
2
Child
Dimmed parts appear only in some states or variants.

Props

61 props on FlexProps, grouped as they are declared in source. Required props are marked *.
Prop
Type
Default
Description
Props
30 props
children
ReactNode
–
rowsTight
boolean
false
rowsComfortable
boolean
false
rowsSnug
boolean
false
rowsCozy
boolean
false
rowsSection
boolean
false
rowsPanel
boolean
false
A wrapped or stacked row's vertical gap of 28, apart from its main gap: the hand-off's section hero (gap:28px 40px), whose halves sit 40 apart beside each other and 28 apart once stacked.
insetIdentity
boolean
false
Application identity header inset.
insetActions
boolean
false
Application action footer inset.
insetTheme
boolean
false
Theme controls inset.
insetStatus
boolean
false
Status band inset.
insetTabs
boolean
false
Navigation close controls inset.
fine
boolean
false
dense
boolean
false
compact
boolean
false
close
boolean
false
nested
boolean
false
comfortable
boolean
false
balanced
boolean
false
roomy
boolean
false
airy
boolean
false
spacious
boolean
false
generous
boolean
false
section
boolean
false
panel
boolean
false
page
boolean
false
apart
boolean
false
The step between side-by-side panels of one composition (32), the hand-off's widest grid gap.
ample
boolean
false
The step between a section page's hero and the body under it, and between the hero's halves (40): the hand-off's section pages (gap:28px 40px on the hero, margin-bottom:40px under it).

Accessibility and keyboard

Keyboard
Not focusable. It has no interaction of its own and takes the semantics of what it wraps.
Semantics
No role of its own in source; it reads as the content it renders.

Platform skins

The playground's props on each platform: same tree, native shapes, type and touch sizes.
schema
role
Web
control 10 · field 10 · card 16 · Instrument Sans
schema
role
iOS
capsule controls · field 8 · card 12 · SF Pro · 44 pt
schema
role
Android
Material 3 stadium · field 4 · card 12 · Roboto · 48 dp

Usage

<Row>
<Button primary>Save</Button>
<Button ghost>Cancel</Button>
</Row>
The Argus reference adds intermediate spacing steps without rounding its layout: fine 3, dense 5, compact 6, close 7, nested 9, comfortable 10, balanced 11, roomy 14, airy 18, spacious 20, generous 22, section 26, panel 28, page 30, apart 32 (the space between the side-by-side panels of one composition), ample 40 (between a section page's hero and the body under it, and between the hero's halves) and broad 48 (between the two halves of a page-wide split). Existing named steps keep their values. Larger active steps take precedence.
ample (40) is the step between a section page's hero and the body under it, and between the hero's halves (the Canvas v4 section pages). chapter (64) is the widest step: the space between a page's chapters, the major sections of a long page (a component detail page's Playground, Props and Examples). It wins over every other gap step, so the precedence runs chapter > broad > ample > apart > page > panel > section > loose and on down the scale to flush. Row, Column and Grid all take them.

Tokens

Read from the playground render. Values follow the scheme and the ion hue.
--fd
--fm
--ft
--ion-ring
--ion-soft
--ion-tx
--ln2

Related components