Skip to content

Empty State

A failed load and a first use state for a finance app, drawn light and dark. Each is a status badge, a headline, one line of support, a filled Button and a quiet one. Error takes its badge from a component and Add money draws its own.

On this page
  1. Preview
  2. Components
  3. Empty or error state
  4. Tokens

Preview

Two screens for the moments a product usually leaves blank. One thing went wrong, one thing has not happened yet, and both are laid out from the same parts as every other screen in the system.

Empty State, two screens, light and dark393 x 852 each, Platform ios-md
Error state screen: a red circle with a white x, the headline Something went wrong, a line asking the user to check the connection and try again, a filled Try again button and a quiet Go back buttonError state screen in dark mode: a red circle with a white x, the headline Something went wrong, a line asking the user to check the connection and try again, a filled Try again button and a quiet Go back button
Error
Empty state screen: a wallet icon in a pale blue circle, the headline No transactions yet, a line saying activity will appear after the first transaction, a filled Add money button and a quiet Go back buttonEmpty state screen in dark mode: a wallet icon in a dark blue circle, the headline No transactions yet, a line saying activity will appear after the first transaction, a filled Add money button and a quiet Go back button
Add money
Screens, screen, what it shows, built from
ScreenWhat it showsBuilt from
ErrorA request failed and the user can retry or go backStatus Bar, _Alert Status, Button
Add moneyNothing has happened yet and one action fixes thatStatus Bar, Button, a wallet-minimal icon in a hand drawn badge

Each screen is drawn in Light and in Dark, with Color Tokens set on the frame itself. The dark screens are the same instances resolved against the other mode.

What are the Empty State screens built from?

9 instances across the two screens. This is the smallest set of screens in the library, and it uses the same parts as every other screen.

9 instances are counted, 8 placed directly on the frames and 1 nested. Placed counts an instance that is not inside another instance. Nested counts one that is. A component is counted by its set name, and an icon is an instance named in lowercase. The dark row holds the same instances as the light row.

What it is built from, component, placed, nested, where
ComponentPlacedNestedWhere
Button40Both screens, one filled and one quiet
iOS / Status Bar20Both screens
_Alert Status10Error only, drawn at 80 x 80
Lucide icons11The x inside _Alert Status on Error, and the wallet-minimal glyph at 36 x 36 on Add money

Add money reports no nested instance at all, which shows where its badge came from. On Error the x is nested because it sits inside _Alert Status. On Add money the wallet glyph sits at the top level because the circle around it was drawn by hand.

Counted on October 2, 2026 with a Plugin API script over the two light frames of the Empty State page in the Appetite UI Figma file.

Which component should draw an empty or error state?

Empty State for a whole state, _Alert Status for the badge alone.

Use Empty State, a component with a Type of Info, Error or Success, a Title, a Body, an optional second action and an Icon Swap for the glyph. These two screens do not place it: Error places the _Alert Status badge and Add money draws its badge by hand. Booking Trips empty and Foodie Cart empty place Empty State, see Booking and Foodie.

Empty State properties, property, type, options, default
PropertyTypeOptionsDefault
TypeVariantInfo, Error, SuccessInfo
TitleTextAny textNo transactions yet
BodyTextAny textYour activity will appear here once you make your first payment.
Show secondaryBooleanOn, offOn
Icon SwapInstance swapAny iconThe Info glyph

The badge on its own is _Alert Status. It has one axis, Type, with four options, and each option is 64 x 64 in the component.

_Alert Status, type, glyph, use it for
TypeGlyphUse it for
ErrorxA request failed and the user can retry
WarningexclamationSomething needs attention before it fails
SuccesscheckA task finished and the screen has nothing left to show
VerifiedcheckAn identity or account is confirmed

Pick the type from what the user is meant to feel.

On Add money the badge is a frame holding two ellipses, a 70 x 70 named Stroke filled with bg/white-0 and a 60 x 60 named BG filled with state/information/lighter-50, around a wallet-minimal icon. The Type axis of _Alert Status fixes the glyph per type, so it cannot show a wallet. Empty State solves that with its Icon Swap. Four rectangles named Divider, each 345 x 179 and filled with bg/white-0, sit at the top and bottom of both screens and center the content. They are spacers with a fill, whatever their name says.

Which tokens do the Empty State screens use?

Every solid fill and stroke on these two frames resolves through a variable, so the badge drawn by hand survives the mode switch too.

The two light frames hold 34 solid fills and strokes, spread over 9 different variables, and none is unbound. The badge fill on Add money resolves through state/information/lighter-50, a pale blue in Light and a 16 percent blue in Dark, which is why the dark badge reads as a deep navy.

Tokens, token, where it lands, paints
TokenWhere it landsPaints
fg/strong-950Status Bar glyphs10
bg/white-0The screens, the four Divider rectangles, the Stroke ellipse and the _Alert Status ring8
brand/baseThe filled Button fills, the quiet Button labels and the wallet-minimal glyph5
static/static-white-0The filled Button labels and the x in _Alert Status3
text/strong-950The headline2
text/sub-700The line of support2
brand/alpha-10The quiet Button fill2
state/error/base-500The red circle of _Alert Status1
state/information/lighter-50The BG ellipse behind the wallet glyph1
Text styles, style, uses, screens
StyleUsesScreens
lg/emphasized42
2xl/emphasized22
base/default22
Collections, collection, modes, what it drives here
CollectionModesWhat it drives here
Color TokensLight, DarkEvery paint above, pinned on each frame
Platformios-md, ios-lg, android, ios-duo-outer, ios-duo-innerStatus bar and platform metrics, pinned to ios-md
FoundationsDefaultThe 345 content width and the block spacing
TypographyDefaultHeadline and supporting line
Platform BridgeBrand, SystemNot pinned on the frames, so the default mode applies
MotionDefaultNot used on these screens

Paints are every visible solid fill and stroke on the two light frames, inside instances included, counted by bound variable name on October 2, 2026.