RelayCTX Creative guidelinesGUIDE.mobile-composition.md
RelayCTX Creative · Document

GUIDE — Mobile composition

1,031 words · 5 min View raw Source History

GUIDE — Mobile composition

Status: law — v1, 2026-08-03 Applies to: the web SPA at phone widths and the native app. Mobile-first means both — most people meet Relay in a browser before they install anything. Parent: GUIDE.interface-principles.md

Design at 390px first. Not "check it on mobile after" — compose for the phone, then let the layout earn extra space on wider screens.


The space budget

A phone gives you roughly 390–430px wide and about 700px tall, minus browser chrome. Treat it as a budget you spend, and know what each decision costs.

ConsumerBudgetRule
Horizontal navigation0pxThe rail is off-canvas at phone width. A docked icon rail costs ~25% of the viewport and is unscannable without labels.
Vertical chrome above content≤ 2 rowsOne control row + optional context line. Everything else goes in a sheet.
Contenteverything elseIf content is getting less than ~70% of the vertical space above the fold, the composition is wrong.

Measured failure (EXP-003/004): a docked rail took ~100px of ~430px, and five stacked control layers pushed the list down until roughly one card was visible. Neither element was individually unreasonable. The composition was.


Controls: on demand, not on arrival

A filter is useless until you know what you're filtering.

Controls do not get the position content should have. The pattern:

One control row, sticky at the top: [search] [scope] [Filter ▾]

One sheet behind the Filter button, carrying everything else — status, direction, unread, due, starred, labels, tags, sort. Filters that are active show as a count on the button (Filter · 2), so state is never hidden.

One result line111 relays — visible under the control row. That's orientation, not chrome.

Rules


Reach

The bottom third is where hands are. Compose accordingly.


Sheets, not modals

Bottom sheets are the default container for anything secondary: filters, actions, edit forms, pickers, confirmations that need more than a line.

RuleWhy
Draggable, and dismissible by drag and by backdrop tapA container the user can't dismiss by instinct reads as a trap
Sized to content, expandableA half-empty full-screen sheet wastes the reveal
Actions inside the sheet sit at its bottomSame reach rule applies inside the sheet
Never stack sheets more than one deepA second sheet means the first one was the wrong container

Full-screen modals are for one case only: a flow with its own multi-step lifecycle (send, claim with preview). Even then it gets a visible, labelled exit — never only a corner X.


Touch and input


Layout behaviour


Copy at 390px

Copy is written for the column, not trimmed to it. See GUIDE.states-and-language.md.


The checklist

Before a phone screen ships:


Framework note

Everything here except the Code paste rule is generic to any phone-width object surface — framework-candidate for Launchpad Phase 2 Frontend Core.