figma guide

Designing empty states in Figma: illustrations, copy, and handoff

Design empty state components in Figma with illustration slots, headline and body copy, primary CTAs, and layout variants for tables, search, and dashboards.

Published
Updated
Jun 08, 2026
Read time
7 min
Level
Beginner

Quick answer

Empty states in Figma are centered content blocks shown when a list, table, search, or dashboard has no data yet or no matching results. Build them as published components with an illustration or icon slot, headline, body copy, and optional primary + secondary actions. Use variants for type=first-use | no-results | error | permission-denied and size=compact | full-page. Document when the state appears (zero rows vs filtered to zero) in Dev Mode—not only a pretty illustration. Pair with tables, cards, and forms for create flows. Start from the Figma guides hub if you are new to component libraries.


Who this is for

  • Product designers shipping first-run experiences, search-no-results, and empty dashboards.
  • Design system teams who need reusable empty state blocks instead of one-off art per feature.
  • Engineers implementing conditional renders who need copy, CTA targets, and illustration assets.

Empty state types: choose the right pattern

TypeWhen it showsToneTypical CTA
First useUser has never created dataEncouraging”Create your first project”
No resultsFilters or search return zeroNeutral, helpful”Clear filters” or broaden search tips
Error / failed loadAPI or network failureApologetic”Try again”
Permission deniedUser lacks accessClear, not blaming”Request access” or contact admin
Completed / all doneInbox zero, tasks donePositiveOptional next step

Verdict: first use and no results look similar but need different copy and actions. Do not reuse “Nothing here yet” for a failed API call.


Component anatomy

PartPurposeSpec tip
Illustration / iconVisual anchor120–200px; optional for compact
HeadlinePrimary message1 short sentence, sentence case
BodySupporting context1–2 lines max; explain what to do next
Primary actionMain CTAOne button—create, retry, or clear filters
Secondary actionOptionalLink style: “Learn more”, “Import CSV”
EmptyState / Base
├── Variant: type=first-use | no-results | error | permission
├── Variant: size=compact | full-page
├── Property: hasSecondaryAction=true | false
├── Layer: Container (vertical auto layout, center align)
│   ├── Illustration slot (instance swap or fixed component)
│   ├── Headline (text/heading-md)
│   ├── Body (text/body-md, text-secondary token)
│   ├── Primary button (nested component)
│   └── Secondary link button (optional)

Bind text colors to semantic tokens. Keep illustration colors on-brand but muted—empty states should not compete with primary UI.


Size variants

VariantMax widthIllustrationBest for
Full-page400–480px contentLarge illustrationNew account, empty project
Compact320pxSmall icon 48–64pxTable body, sidebar panel
InlineHug contentsIcon onlySingle card slot, combobox

Design compact and full-page as separate variants—not scaled-down copies with illegible type.


Copy guidelines

ElementGoodWeak
Headline”No projects yet""Oops!”
Body”Create a project to start tracking tasks with your team.""You have no data.”
CTA”Create project""Click here”
No results”No matches for ‘invoice’""Error”

Write action-oriented body copy that tells users the next step. Link to wireframing patterns when exploring copy in low fidelity first.


Layout with auto layout

  1. Container: vertical auto layout, center align, gap 16px (compact) or 24px (full-page).
  2. Text stack: vertical auto layout, gap 8px, center text align for full-page; left align for compact inside tables.
  3. Actions: horizontal auto layout, gap 12px, primary before secondary.
  4. Padding: 32–48px vertical inside table cells; 64–96px for full-page centers.

Use layout grids on full-page empty artboards so content stays centered on wide screens. For responsive frames, set max width on the text stack and center the group.


Embedding in tables and lists

ContainerLayoutNotes
Table (zero rows)Compact empty state spans table widthHide column headers or keep them—document choice
Card gridFull-page centered in content areaCTA creates first card
Search dropdownInline: icon + “No results”Link to dropdown patterns
Dashboard widgetCompact inside widget frameMay omit illustration

Show table + empty state on a spec artboard so engineers know the empty component replaces <tbody> content, not the entire page chrome.


Illustrations and icons

ApproachProsCons
Custom illustrationBrand personalityMaintenance cost
Icon in circleFast, system-friendlyLess memorable
Product screenshot ghostShows what “full” looks likeCan feel busy
No visualMinimalHarder to scan

Use icon plugins and sets for consistent stroke weight. Export illustrations as SVG with notes in export guide.

Dark mode: provide illustration variants or use tokens on fills—preview with dark mode tricks.


Accessibility checklist

  • Headline maps to heading level in code (h2 or h3)—document level per context.
  • Illustrations use alt="" when decorative; meaningful images need alt text in Dev Mode.
  • CTA is a real button component with focus ring—not a text link styled as primary action unless intentional.
  • Color contrast on body text meets WCAG—check with accessibility plugins.
  • Do not rely on illustration alone to convey error vs empty—headline must state the situation.

Common use cases

Empty project (first use)

Full-page variant. Headline: “Start your first design file.” CTA: “New file.” Optional secondary: “Import from Sketch” linking to Sketch import guide.

Search no results

Compact variant. Headline: “No results for ‘{query}’.” Body: “Try different keywords or clear filters.” Actions: “Clear filters” (primary), “Search all projects” (secondary).

Empty inbox / notifications

Compact or full-page. Positive tone: “You’re all caught up.” No primary CTA—or optional “Notification settings.”

Failed to load

Error type. Headline: “Couldn’t load projects.” CTA: “Try again.” Do not use cheerful illustrations for errors.

Cross-link navigation patterns when empty states appear inside tab panels.


Prototyping limits

Figma prototypes can show one static empty frame—they do not switch between populated and empty based on data. For demos:

  1. Duplicate the screen: with data and empty state.
  2. Wire a toggle button between them for stakeholder review.
  3. Note: “Engineering: render when items.length === 0.”

Optional: prototype CTA click to form modal for create flows.


Handoff to engineering

DeliverableWhere it lives
Type enumVariant property names
Trigger condition”Show when filteredItems.length === 0”
CTA destinationLink or route in description
Illustration exportSVG/PNG in Dev Mode assets
Heading levelComponent description
Compact vs fullVariant name + min height

Include empty states in your Dev Mode handoff checklist. When empty states sit in data-heavy views, cross-link Dev Mode specs with table column definitions.


Comparison: empty state vs skeleton loader

PatternWhenUser expectation
Empty stateConfirmed zero data”Nothing here; here’s what to do”
SkeletonData is loading”Content is on the way”
Error stateLoad failed”Something went wrong”

Verdict: never show an empty state during loading—use skeleton placeholders first, then swap to empty or populated content.


Common mistakes

MistakeConsequenceFix
Same copy for first use and no resultsUser confusionSeparate variants
Cheerful art for errorsTrust lossError type variant
No CTA on first useDead endPrimary action always
Giant illustration in table cellLayout breakCompact variant
”No data” onlyUnhelpfulExplain next step in body
Empty state hides navUser feels lostKeep chrome visible
Lorem ipsum in production specShips to prodReal copy in component

FAQ

Should every list share one empty state component?

One base component with instance-swap illustration and text overrides per feature. Headlines and CTAs differ; structure stays the same.

How do empty states relate to onboarding modals?

Modals interrupt for guided tours; empty states are persistent in-context prompts. Use modals once; empty state until the user creates data.

Include empty states in the component library?

Yes. Publish under Patterns / EmptyState in your team library so squads do not redraw them.

What about zero-state for charts?

Use compact variant with icon + “No data for this period” + optional “Change date range”—same anatomy, smaller illustration slot.


Bottom line

Treat empty states as structured illustration + headline + body + CTA blocks with clear type variants for first use, no results, and errors. Write copy that explains the next action, not just the absence of data. Publish compact and full-page sizes from your library and document trigger conditions in Dev Mode. Continue with tables for zero-row layouts, cards for grid empties, and the tutorials hub.

Share on X

§ Keep reading

Related guides.