figma guide

Designing product variant selectors and swatches UI in Figma: color, size, and handoff

Design color swatches, size pickers, dropdown variant selectors, and out-of-stock states in Figma with component variants and Dev Mode specs for ecommerce PDP teams.

Published
Updated
Jul 01, 2026
Read time
6 min
Level
Beginner

Quick answer

Variant selectors live in the PDP buy box and must show the current selection, available options, and out-of-stock states without hiding the add-to-cart CTA. Use color swatches for visual attributes (hex fill + optional texture), pill or grid buttons for size and material, and dropdowns only when you have 8+ options or long labels. Always pair size with a size guide link, show price changes inline when variants affect cost, and update the gallery on selection. Start from the Figma guides hub and templates pillar.


Who this is for

  • Product designers building buy boxes for apparel, beauty, furniture, and configurable SKUs.
  • Design system teams standardizing swatch, pill, and dropdown variant patterns across PDP and quick view.
  • Engineers implementing variant matrix logic, inventory per SKU, and URL deep links.

Selector types map

Attribute typeBest controlAvoid when
ColorCircular or square swatchMore than ~12 colors without grouping
SizePill grid (XS–XXL)Numeric dimensions with units—use dropdown
Material / finishText pills or small swatchesSingle option only
Capacity / storageHorizontal pill rowLabels exceed ~12 characters
Style / bundle tierRadio cards with price deltaSimple yes/no—use toggle
8+ optionsDropdownColor—you lose scanability

Verdict: design ColorSwatch, SizePill, and VariantDropdown first—they cover most DTC PDPs; combine in a single VariantSelectorGroup with consistent label + error spacing.


Buy box placement

BlockOrder (desktop)Mobile notes
Title + ratingTopSame
PriceBelow titleUpdates on variant change
Color swatchesFirst selectorFull width, wrap
Size pillsSecond4–5 per row max
Secondary optionsDropdownsFull width
QuantityBefore CTAStepper or dropdown
Add to cartPrimary CTASticky bar optional
Size guide linkAdjacent to size labelOpens modal

Place selectors above BNPL callouts and below hero price—never bury swatches below the fold on mobile.


ColorSwatch component

StateVisualInteraction
Default32–40px circle/square, 2px borderHover ring
SelectedRing + check icon or thicker borderaria-checked=true
UnavailableDiagonal strike or 40% opacityNot focusable; show tooltip “Out of stock”
Low stockOptional dot badgeTooltip “Only 2 left”
Multi-colorSplit fill or thumbnailFor patterned fabrics
ColorSwatch
├── Variant: shape=circle | square
├── Variant: size=sm | md | lg
├── Variant: state=default | selected | unavailable | lowStock
├── Property: colorHex=#000000
├── Property: colorLabel=Midnight Navy
└── Layers:
    ├── SwatchFill
    ├── SelectedRing
    ├── UnavailableStrike
    └── Tooltip (optional)

Accessibility: each swatch needs a visible text label in the “Color: Midnight Navy” line above the row—not color alone. Use badges for “New color” sparingly.


SizePill component

ElementSpecNotes
Label row”Size” + “Size guide” linkLink opens modal or drawer
Pill gridMin 44px touch targetAuto Layout horizontal wrap
SelectedFilled backgroundHigh contrast
UnavailableStrike-through textaria-disabled
Error”Select a size” below gridAfter failed add-to-cart
SizePillGroup
├── Variant: layout=grid | scroll
├── Property: selectedSize=M
└── Layers:
    ├── LabelRow
    │   ├── SizeLabel
    │   └── SizeGuideLink
    ├── PillRow (repeat SizePill)
    └── InlineError

Link to size guide modal with measurement table—not a generic FAQ page.


VariantDropdown (long lists)

Use for width × length, phone model, or region-specific SKUs:

PartSpec
TriggerShows current selection + chevron
MenuMax height with scroll; group headers
Option rowLabel + optional price delta (+$20)
UnavailableGrayed + “(Out of stock)” suffix
SearchOptional inside menu for 15+ items

Reuse dropdown patterns—do not invent a new menu style for variants only.


Price and inventory feedback

EventUI response
Variant price changeAnimate price swap; show compare-at if on sale
All variants OOSDisable add-to-cart; show notify me
Low stock on selected SKUInline text below pills: “Only 3 left”
Invalid combinationAuto-select nearest available or clear dependent dropdown
LoadingSkeleton on price + disabled CTA

Align pricing tokens with variant-specific sale badges on PLP cards when one color is discounted.


When user picks a color, swap hero image to that variant’s primary shot:

PatternHandoff note
Image index mapcolorSlug → imageIds[]
Thumbnail stripFilter to variant images only
VideoHide or swap per variant
360° viewVariant-specific asset URL

Document in Dev Mode beside gallery component—engineers need the mapping table, not just static frames.


Quick view and PLP constraints

SurfaceVariant UI
Quick view modalColor + size only; defer exotic options to full PDP
PLP cardShow 3–5 color dots max + “+4” overflow
CompareFixed variant per column—selector in header
Cart line itemCompact dropdown to change size/color

Never show full pill grids on PLP cards—use swatch dots with tooltip.


Handoff checklist

ItemDev Mode annotation
Variant matrixWhich combinations are valid
Default selectionFirst in-stock SKU on load
URL param?color=navy&size=M deep link
OOS behaviorDisable vs hide vs strike
Price API fieldPer-SKU price object
Gallery mapVariant → image array
Analyticsvariant_select, size_guide_open
Error copyEmpty selection vs invalid combo

Use Dev Mode checklist and interactive components for selected/hover/disabled swatch states.


Common mistakes

MistakeWhy it hurtsFix
Swatches without text labelFails WCAG; confuses similar colors”Color: {name}” line always visible
Unavailable swatches still clickableFrustrating dead clicksaria-disabled + tooltip
Size pills too small on mobileMis-taps44px min height
Dropdown for 4 colorsHides optionsUse swatches
No size guide on apparelReturns spikeLink beside size label
Price doesn’t updateTrust breakBind price to selected SKU
Gallery static on color changeWrong product shownImage map in spec
Mixing pill and swatch styles per attributeVisual noiseOne control type per attribute class

  1. Audit variant attributes with merchandising—color, size, material, capacity.
  2. Build ColorSwatch and SizePill with selected/unavailable/low-stock variants.
  3. Compose VariantSelectorGroup inside PDP buy box.
  4. Wire price + gallery behavior notes and default SKU rules.
  5. Add quick view + PLP swatch dot variants at smaller sizes.
  6. Document matrix, URL params, and analytics in Dev Mode.

FAQ

One dropdown for “Color / Size” combined?

Avoid—split attributes so users can change size without re-opening color.

Show SKU ID to shoppers?

No—use human labels; SKU in Dev Mode only unless B2B catalog.

Pre-select first color on load?

Yes if in stock; otherwise first available variant.

Bundle variant pickers?

Per-tile dropdowns in FBT rows—reuse VariantDropdown at compact size.

Subscription frequency as a variant?

Use segmented control—see subscription UI guide.


Next steps

Share on X

§ Keep reading

Related guides.