figma guide

Designing product listing and grid UI in Figma: filters, sort, and handoff

Design PLP grids, list views, filters, sort controls, and skeleton loading in Figma with reusable components, responsive breakpoints, and Dev Mode specs for ecommerce.

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

Quick answer

A product listing page (PLP) is a layout system: filter rail + toolbar (result count, sort, view toggle) + responsive product grid built from one ProductCard component—not a page full of one-off frames. Build ProductCard with image, title, price, optional rating, and badges; wrap cards in a grid with 2/3/4 columns by breakpoint. Pair filters with search UI, sliders, and chips for active filter pills. Start from the Figma guides hub.


Who this is for

  • Product designers shipping category pages, search results, and collection landing pages.
  • Design system teams aligning card density, filter patterns, and grid breakpoints across storefronts.
  • Engineers implementing URL-driven filters, infinite scroll vs pagination, and responsive column counts.

PLP anatomy

ZonePurposeKey components
Header / breadcrumbContext and hierarchyBreadcrumb, H1, optional hero
Filter railNarrow resultsFilterGroup, checkboxes, sliders
ToolbarControl viewResult count, SortDropdown, grid/list toggle
Product gridBrowse inventoryProductGrid + ProductCard instances
Empty / errorNo matchesEmpty state
Pagination / load moreNavigate resultsPagination or infinite scroll note

Verdict: design desktop filter sidebar and mobile filter sheet as two layouts of the same filter model, not two unrelated UIs that diverge after launch.


ProductCard component

Reuse the card patterns guide—PLP cards are a specialized variant, not a new shape language.

PartPurposeSpec tip
ImageProduct thumbnail1:1 or 4:5 aspect; export @2x
BadgesSale, New, Low stockTop-left overlay; max 2 visible
TitleProduct name2-line clamp
PriceCurrent + compare-atPriceDisplay sm/md
RatingAggregate scoreRatingDisplay compact
Swatches (optional)Color variantsRow of 4–6 dots + “+3”
Quick action (optional)Add to cart, wishlistIcon button; document hover vs always-visible
ProductCard
├── Variant: layout=grid | list
├── Variant: density=compact | comfortable
├── Variant: state=default | hover | focus | disabled | skeleton
├── Property: showRating (boolean)
├── Property: showSwatches (boolean)
└── Layers:
    ├── Media (image + badges)
    ├── Content (title, price, rating)
    └── Actions (optional)

Use vertical auto layout for grid cards; switch to horizontal auto layout for list view with a fixed image column width.


Grid vs list view

ViewColumns (desktop)Best forCard layout
Grid3–4Fashion, home, visual catalogsVertical stack
Grid compact4–5Grocery, parts, high SKU countSmaller image, shorter title
List1Spec-heavy B2B, comparison shoppingHorizontal row
MasonryVariableLookbooks (rare in design systems)Document as exception
BreakpointGrid columnsGutterNotes
Mobile (<640px)212–16pxFilter opens in full-screen sheet
Tablet (640–1024px)2–316–20pxCollapsible filter drawer
Desktop (1024px+)3–420–24pxPersistent filter sidebar

Document column math in Dev Mode: cardWidth = (container - (columns - 1) * gutter) / columns. Pair with responsive frames and layout grids.


Filters and sort

Filter groups

Filter typeControlExample
CategoryTree or checkboxesApparel → Shirts
Price rangeDual-handle slider$25–$100
BrandCheckbox list + searchNike, Adidas…
Size / colorChips or swatchesS, M, L
RatingStar threshold4★ & up
AvailabilityToggleIn stock only
FilterPanel
├── Variant: placement=sidebar | sheet | horizontal-bar
├── Layer: ActiveFilters (chip row)
├── Layer: FilterGroups (accordion)
└── Layer: Footer (Clear all, Apply on mobile)

On mobile, Apply commits filter changes; on desktop, live update is common—note the expected behavior so engineers do not guess.

Sort dropdown

Use the dropdown menu component with a single-select pattern:

OptionLabel example
FeaturedFeatured
Price low → highPrice: Low to High
Price high → lowPrice: High to Low
NewestNewest
RatingTop Rated
Best sellingBest Selling

Show the active sort in the toolbar label (Sort: Price: Low to High). Include a result count (128 products) beside sort—reduces disorientation when filters change.

Active filter chips

When filters apply, show removable chips above the grid:

[Price: $25–$100 ×] [Brand: Nike ×] [Clear all]

Chip remove updates URL params in production; prototype with interactive components swapping visibility on the chip row.


Loading, empty, and error states

StateGrid behaviorSupporting UI
Initial loadSkeleton cards8–12 placeholders
Filter refreshDim grid + skeleton overlayKeep filter panel interactive
Empty resultsHide gridEmpty illustration + “Clear filters” CTA
Partial errorShow cached results + inline alertRetry action
End of catalogStop infinite scroll”You’ve seen it all” message

Never show a blank white grid during loading—skeleton cards preserve layout and reduce cumulative layout shift.


Toolbar and view toggle

PLPToolbar
├── Layer: ResultCount
├── Layer: Spacer
├── Layer: SortDropdown
└── Layer: ViewToggle (grid | list icons)
ControlAccessibilityHandoff note
View togglearia-pressed on active iconPersist preference in localStorage
SortLabelled combobox or menuURL param ?sort=price_asc
Filter button (mobile)Opens sheet with focus trapBadge count of active filters

Link mobile filter entry to modal/sheet patterns—full-screen sheet with sticky Apply/Clear footer.


Promotional rows and merchandising

Category pages often mix editorial content with the grid:

ModulePlacementDesign note
Hero bannerAbove gridFull-width; do not break filter model
Promo tileIn-grid slot (position 5)Same row height as cards or span 2 columns
Collection carouselAbove or below gridHorizontal scroll; separate from PLP grid
SEO copy blockBelow paginationCollapsible on mobile

Document grid slot overrides in Dev Mode: “Tile at index 4 spans 2 columns on desktop only.”


Handoff checklist

ItemDev Mode annotation
Column count per breakpoint2 / 3 / 4 with pixel gutters
Card min/max widthPrevents broken grids on ultrawide
Image aspect ratio1:1 vs 4:5—do not mix without variant
Filter apply behaviorLive vs Apply button
Sort defaultFeatured unless URL overrides
Pagination vs infinite scrollOne pattern per page type
Empty state CTALinks to parent category or clear filters
Skeleton countMinimum rows to fill viewport

Run through Dev Mode checklist before handoff. Link PLP cards to PDP frames via prototype connections for stakeholder walkthroughs.


Common mistakes

MistakeWhy it hurtsFix
Unique card per productUnmaintainable catalogOne ProductCard with properties
Filters that reset scrollFrustrating browsePreserve scroll or show count change
Missing list viewB2B buyers need specsAdd layout=list variant early
5-column desktop gridCards too narrow for price + ratingCap at 4; use compact density instead
Sort without visible labelUsers lose contextShow active sort in toolbar
No skeleton loadingLayout jump on slow networks8+ skeleton cards matching grid

  1. Define ProductCard with grid and list variants; bind price, rating, and badge components.
  2. Build filter model as reusable groups; mirror sidebar (desktop) and sheet (mobile).
  3. Lay out responsive grid with constraints and auto layout rows.
  4. Add toolbar with sort, count, and view toggle.
  5. Design empty, skeleton, and error states before stakeholder review.
  6. Prototype filter chip removal and mobile sheet open/close.
  7. Annotate breakpoint columns and filter behavior in Dev Mode.

FAQ

How many products should I show per page?

24–48 is a common default for grid PLPs; B2B list views often use 10–20 with pagination. Match skeleton count to the first page load, not the full catalog.

Should filters live in a sidebar or horizontal bar?

Sidebar for 5+ filter dimensions (fashion, marketplace). Horizontal chip bar for 2–3 quick filters (grocery, small catalogs). Design both if mobile uses a sheet.

Grid or list as default?

Grid for visual categories; list for spec-heavy SKUs. Default the view toggle to grid but persist user choice.

One click target on the card (image + title); secondary actions (wishlist, quick add) stop propagation—document hit areas in Dev Mode. See product detail page patterns for the destination layout.


Next steps

Share on X

§ Keep reading

Related guides.