figma guide

Designing search UI in Figma: bars, filters, and results

Design search bars, autocomplete, filters, and results layouts in Figma with component variants, empty and loading states, and Dev Mode specs for tables and global search.

Published
Updated
Jun 11, 2026
Read time
8 min
Level
Beginner

Quick answer

Search UI in Figma spans three layers: the input (search bar with icon and clear button), suggestions (autocomplete dropdown or recent queries), and results (list, table, or card grid with filters and sort). Build a SearchInput component with variants for size=sm | md | lg, state=default | focus | disabled, and optional loading spinner inside the field. Pair it with filter chips, empty states, and pagination. Document debounce timing, minimum query length, keyboard navigation in suggestions, and URL sync (?q=) in Dev Mode. Start from the Figma guides hub if you are new to pattern libraries.


Who this is for

  • Product designers shipping global search, admin table filters, and e-commerce catalog browse.
  • Design system teams unifying search bars that were copy-pasted per feature.
  • Engineers implementing debounce, aria-autocomplete, and filter query params.

Search patterns compared

PatternUser goalBest forAvoid when
Simple search barType query → submitSmall lists, site search50+ filter dimensions
Autocomplete / typeaheadPick from suggestions while typingPeople, products, addressesResults need heavy faceted browse
Faceted searchNarrow by category, price, dateE-commerce, admin tablesSingle-field name lookup
Command paletteJump to action or page (⌘K)Power users, dense appsConsumer marketing sites
Filter-only (no query)Slice dataset without textStatus toggles on dashboardsFull-text needed

Verdict: combine a search input with facets when datasets are large; use typeahead when users know roughly what they want; use command palette for app navigation shortcuts—not catalog browsing.


Search input anatomy

PartPurposeSpec tip
ContainerBorder, radius, backgroundMatch form input height scale
Search iconLeft-aligned affordance16–20px; decorative (aria-hidden)
Text fieldQuery inputPlaceholder: “Search products…” not “Search”
Clear buttonReset query (×)Show when text length > 0
Loading indicatorFetch in progressReplace icon or show trailing spinner
Shortcut hint⌘K badge (desktop)Optional; hide on mobile
SearchInput
├── Variant: size=sm | md | lg
├── Variant: state=default | focus | disabled | error
├── Property: isLoading=true | false
├── Property: hasShortcut=true | false
├── Layer: Container (horizontal auto layout, padding 8–12px, gap 8px)
│   ├── Search icon
│   ├── Input text (fill width, hug height)
│   ├── Clear button (optional, icon button)
│   └── Shortcut badge (optional)

Bind border and focus ring to semantic tokensinput/border, input/focus-ring. Minimum 44px touch height on mobile.


Autocomplete dropdown anatomy

PartPurposeSpec tip
PanelSuggestions list below inputSame width as input or min 280px
Section label”Recent”, “Suggested”Uppercase or caption style
Suggestion rowIcon + primary + secondary textHighlight matching substring
Empty row”No results”Link to empty state
Footer action”See all results”Navigates to full results page
SearchSuggestions / Panel
├── Variant: state=loading | results | empty
├── Layer: List (vertical auto layout)
│   ├── Section header (optional)
│   └── SuggestionItem × N
│       ├── Icon or avatar (optional)
│       ├── Primary label (text/body-md)
│       └── Secondary label (text/body-sm, muted)

Reuse dropdown menu elevation and shadow tokens for the panel. Max height 320–400px with internal scroll.


Suggestion item states

StateVisualInteraction
DefaultNeutral backgroundHoverable
Hover / activesurface/hoverKeyboard aria-activedescendant
SelectedCheckmark or boldRecent searches persisted
DisabledMutedNon-selectable category headers

Document max suggestion count (e.g., 8) and debounce ms (250–400) in the component description.


Results layout patterns

LayoutWhen to usePair with
Table rowsAdmin data, audit logsTables, pagination
Card gridProducts, mediaCards
Simple listPeople, filesAvatars + metadata column
Grouped sectionsMixed entity typesSection headers per type

Show result count (“248 results for ‘invoice’”) above the list. Update count when filters change.


Filters and search together

UI placementBest for
Horizontal filter bar3–6 quick filters above results
Left sidebarMany facets; desktop catalog
Filter sheet (mobile)Same facets in bottom sheet
Inline chipsActive filters visible under search bar

Use filter chips for active facets with dismiss (×). Add Clear all when more than two filters applied.

For dense facet groups, use accordions in the sidebar—multi-open mode.


Sort and view controls

ControlPlacementOptions example
Sort dropdownResults header rightRelevance, Newest, Price
View toggleNext to sortList vs grid icons
DensityAdmin tablesCompact vs comfortable row height

Sort is not search—keep it adjacent but separate from the query field. Changing sort does not clear the query.


States: loading, empty, error, no-query

StateWhat to show
Initial / no queryPlaceholder + optional recent searches
LoadingSkeleton rows or spinner in input
ResultsList/table + count + pagination
Zero resultsEmpty state with alternate query tips
ErrorInline alert + retry

Build each state as a separate frame on the handoff page—Figma will not auto-switch based on query length.


TypeScopeUX notes
GlobalEntire app (⌘K)Modal overlay; grouped by entity type
LocalOne page (table toolbar)Inline bar; filters scoped to dataset
ScopedDropdown: “Search in Files”Prefix or pill showing scope

Document which entities global search includes (pages, users, settings). Link to navigation patterns for app shell placement.


Mobile behavior

DesktopMobile
Persistent sidebar filtersFilter button → full-screen sheet
Wide autocompleteFull-width panel; keyboard pushes content
⌘K shortcutOmit; optional search icon in nav bar

On small screens, prioritize query + 1–2 primary filters; move the rest behind Filters (3) button.


Accessibility

ElementRequirement
Input<input type="search"> or role="searchbox"
LabelVisible or aria-label="Search products"
Autocompletearia-autocomplete="list", aria-controls panel id
Suggestionsrole="listbox"; options role="option"
Live regionAnnounce result count updates
Clear buttonaria-label="Clear search"
FocusReturn focus to input after clear

Test contrast on highlighted match text inside suggestions—not only default row text.


Prototyping limits

Figma cannot filter real data. For stakeholder demos:

  1. Build frames: typing, suggestions, results, empty.
  2. Prototype input focus → show suggestions overlay.
  3. Wire See all results → results frame.
  4. Note debounce and API behavior in sticky Dev Mode comments.

Use sections to separate Global vs Local search flows.


Handoff to engineering

DeliverableWhere it lives
Debounce intervalSearchInput description
Min characters before fetchDev Mode note (e.g., 2 chars)
Suggestion API vs full search APIHandoff table
Filter query param names?q=&category=&sort= spec
Pagination reset on new query”New search → page 1”
Recent searches persistencelocalStorage vs server
Mobile filter sheet breakpointmd frame annotation

Include search in your Dev Mode handoff checklist. Publish under Patterns / Search in your team library.


Real-world examples

Search input left; filter chips for Status and Owner; table below with pagination.

E-commerce catalog (faceted)

Search bar + category sidebar accordions. Results grid uses cards. Zero results shows empty state with popular categories.

Command palette (global)

⌘K opens modal with search input and grouped shortcuts. Escape closes; Enter navigates.

Cross-link wireframing when search IA is still exploratory.


Common mistakes

MistakeConsequenceFix
Search icon as only submit affordanceUsers do not know Enter worksPlaceholder + document Enter behavior
No clear buttonFriction resetting queryShow × when input has text
Autocomplete too tallCovers entire screen on mobileMax height + scroll
Filters hidden with no indicatorUsers think search is brokenShow active filter chips
Spinner only, no skeletonLayout jump on resultsUse skeleton rows
Same component for global + localWrong shortcuts and scopeSplit variants or separate components
Zero-results dead endUsers abandonSuggest spelling, popular items, clear filters
Sort resets filters silentlyData feels randomDocument interaction matrix

FAQ

Use search input for open-ended text. Use searchable select (combobox) when users must pick one known option from a list.

Show recent searches?

Yes for global search and e-commerce—clearable list below empty input. Skip for sensitive admin contexts (HIPAA, finance).

Highlight matching letters in results?

Yes in autocomplete and result titles—use text/brand or bold weight for matched substring; verify contrast.

Instant search vs submit button?

Instant (debounced) for large catalogs. Explicit submit for expensive queries or compliance audit logs where each search is logged intentionally.


Bottom line

Design search as a system: input, suggestions, filters, results, and empty/loading states—not a lone magnifying-glass field. Document debounce, keyboard navigation, filter params, and mobile sheet behavior in Dev Mode. Continue with tables, pagination, accordions for facet sidebars, and the tutorials hub.

Share on X

§ Keep reading

Related guides.