figma guide

Designing wishlist and save-for-later UI in Figma: hearts, lists, and handoff

Design wishlist hearts, saved-item lists, move-to-cart actions, and empty states in Figma with component variants, guest vs signed-in flows, and Dev Mode specs.

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

Quick answer

Wishlist UI is a toggle on the product surface (heart or bookmark on cards and PDP) plus a dedicated saved-items page or drawer that reuses LineItem from cart with different actions—move to cart, remove, notify when back in stock. Build WishlistToggle with default, hover, active, and loading states; model guest (local) vs signed-in (synced) copy. Design empty, full, and error states explicitly. Pair with badges for sale alerts and toasts for add/remove feedback. Start from the Figma guides hub.


Who this is for

  • Product designers shipping DTC stores, marketplaces, and subscription catalogs where consideration cycles are long.
  • Design system teams aligning save-for-later behavior across PLP, PDP, cart, and account areas.
  • Engineers implementing heart toggles, list persistence, stock notifications, and cart merge rules.

Wishlist surfaces

SurfaceGoalKey components
Toggle on cardSave while browsingWishlistToggle on ProductCard
Toggle on PDPSave during evaluationWishlistToggle in buy box
Wishlist pageReview and batch actionsSavedItemsList, SavedLineItem
Mini wishlist drawerQuick peek (optional)WishlistDrawer
Account nav badgeCount indicatorBadge on nav icon

Verdict: reuse cart LineItem layout with action=move-to-cart | remove instead of quantity steppers—one component family keeps PLP → save → cart visually consistent.


WishlistToggle anatomy

PartPurposeSpec tip
IconHeart, bookmark, or starOutline = saved off; filled = saved on
Hit areaTouch targetMin 44×44px on mobile
Label (optional)Screen reader / tooltip”Save to wishlist” / “Saved”
LoadingAPI in flightSpinner overlay on icon
DisabledOut of catalogGray + no interaction
WishlistToggle
├── Variant: size=sm | md | lg
├── Variant: state=default | hover | active | loading | disabled
├── Property: isSaved (boolean)
└── Layers:
    ├── HitArea
    ├── Icon
    └── LoadingOverlay (optional)

Prototype with interactive components swapping isSaved and triggering a toast on the saved page.

Place the toggle top-right on product cards (does not compete with image) and near the buy box on PDP—never inside the primary CTA row.


SavedLineItem vs cart LineItem

FieldCart LineItemWishlist SavedLineItem
ThumbnailYesYes
Title + variantYesYes
PriceLive priceLive price + “Price dropped” chip
Quantity stepperYesNo
Primary actionMove to cart
SecondaryRemoveRemove from wishlist
Stock stateIn-cart qty limitsOut of stock + notify

When price decreases, show a badge (“−15% since you saved”)—engineers bind to price history API.


Guest vs signed-in flows

ScenarioUXCopy
Guest taps heartSave to device; prompt sign-in on wishlist page”Sign in to sync across devices”
Guest opens wishlistLocal list onlyBanner with sign-in CTA
Signed-in saveImmediate syncToast: “Saved to your list”
Merge on loginCombine local + account listsModal: “We merged 3 items”
Session expiredRead-only list + re-authInline alert

Design all four states—guest save, guest list, signed-in list, merge modal—so engineering does not invent auth UX mid-sprint.


Wishlist page layout

WishlistPage
├── PageHeader (title + item count)
├── Toolbar (sort, share list, select all)
├── SavedItemsList
│   └── SavedLineItem × n
├── BulkActionsBar (sticky when selecting)
└── EmptyState
Toolbar actionPurpose
SortDate saved, price low–high, back in stock
ShareGift registry / public list URL
Select allBatch move to cart or remove
FilterIn stock only, on sale only

Use tables layout on desktop (image | details | price | actions) and stacked cards on mobile—same responsive pattern as cart page.


Empty and edge states

StateVisualCTA
EmptyIllustration + short copy”Browse products” → PLP
All OOSList visible, CTAs disabled”Notify me when available” per item
Item removed from catalogGray row + “No longer available”Remove from list
List full (cap)Inline alert”Remove items to save more”
Error loadingRetry banner”Couldn’t load your list”

Follow empty state patterns—wishlist empty is high-intent recovery: link to categories or recently viewed, not a generic homepage link.


Save-for-later inside cart

Some stores let shoppers move cart lines to wishlist without losing context:

ActionLocationResult
”Save for later”Per cart lineLine moves to wishlist section below cart
”Move to cart”Wishlist sectionReverse flow
Section headerBelow active cart lines”Saved for later (2)”

Reuse SavedLineItem inside the cart page—only the container changes. Document that saved lines do not count toward cart subtotal or free-shipping threshold.


Stock and price notifications

TriggerUIChannel
Back in stockBell icon on row + email togglePush/email (marketing)
Price dropBadge on rowOptional digest email
Low stock”Only 2 left” on saved itemUrgency without cart pressure

Design a Notify me modal with email field for guests and one-click confirm for signed-in users. Include unsubscribe copy in footer specs.


Accessibility

RequirementImplementation
Toggle statearia-pressed on heart button
Live updatesToast + polite announcement region
KeyboardToggle focusable; list actions tab order
ColorDo not rely on red heart alone—pair with fill + label
ContrastOutline heart meets 3:1 on product photos—use scrim if needed

Cross-check with accessibility plugins before handoff.


Handoff checklist

ItemDev Mode annotation
Toggle sizes per surfacesm on card, md on PDP
API endpointsAdd/remove/list/merge
Guest storage keylocalStorage schema note
Move-to-cart behaviorOpens cart drawer vs navigates
Price refresh cadenceStale price max age
Notification opt-inGDPR/marketing consent flag
Analyticsadd_to_wishlist, remove_from_wishlist
Max list sizeHard cap number

Use Dev Mode checklist and semantic color tokens for sale badges.


Common mistakes

MistakeWhy it hurtsFix
Heart with no loading stateDouble-tap duplicatesLoading overlay on toggle
Separate card layout for wishlistVisual drift from PLPReuse ProductCard + SavedLineItem
No guest flowLost saves after browseLocal persistence + sign-in prompt
Move to cart without variant checkWrong SKU in cartOpen variant picker if needed
Hidden wishlist entryFeature unusedNav icon + count badge
OOS items look purchasableSupport ticketsDisabled move + notify CTA

  1. Define WishlistToggle with size and state variants.
  2. Place toggles on ProductCard and PDP buy box in existing files.
  3. Build SavedLineItem by forking cart LineItem actions column.
  4. Compose wishlist page with toolbar, list, empty, and bulk bar.
  5. Add guest/sign-in banners and merge modal.
  6. Spec cart “save for later” section if in scope.
  7. Prototype heart toggle → toast → wishlist page → move to cart.
  8. Mobile pass with sticky bulk actions and 44px targets.

FAQ

Heart icon or bookmark?

Heart is universal for B2C fashion and lifestyle; bookmark reads better for B2B catalogs and spec-heavy products. Pick one icon system-wide.

Public wishlists / gift registries?

Add Share list in toolbar → generates read-only URL. Design owner vs viewer modes: viewers see products without edit actions.

Multiple wishlists?

If supported, use dropdown on save: “Add to… Wedding / Everyday.” Default list handles 80% of cases—advanced lists are optional.

Wishlist count on nav badge?

Show count capped at 99+; hide badge at zero. Animate increment on save only if motion respects reduced-motion preference.


Next steps

Share on X

§ Keep reading

Related guides.