Skip to main content

Product Card

Quero um card de produto reutilizável para grids e listagens. Qual é a implementação recomendada?
Referência: seu tema (adaptado do cookbook) + sections/product-card/ Índice: Cookbooks

Contratos utilizados


Contrato de dados do Product Card (público)

Campos oficialmente utilizáveis no snippet (ProductSummary / Product): Não usar no card: name (deprecated), stock, featured, reviewSummary nem o objeto de preço cru da API. Use title, availableForSale, price.formatted e featuredImage do contrato de produto. Badge de promoção: compareAtPrice.amount > price.amount (valores públicos Money.amount). Helpers SDK (getProductImage, getProductPrice) existem mas fazem fallback em campos não públicos — este cookbook usa somente featuredImage e price.formatted.

Separação de camadas


Resolução de dados

product_list persiste UUIDs (string[]). Resolver com API pública:
storefront.products.get(ref) aceita id ou handle (API pública StorefrontClient). Loading: a runtime injeta data quando o loader termina; até então a section pode não renderizar (wrapper withSectionData). Empty/error são tratados na section com mensagens explícitas.

Snippet (UI)

  • Link envolve o card (product.url)
  • Fallback visual sem featuredImage
  • Compare-at e badge só quando compareAtPrice > price
  • availableForSale === false → badge esgotado (sem CTA de carrinho neste cookbook)

Section (grid responsivo)

Settings: title, products (product_list), showSaleBadge, saleBadgeLabel, columns (2–4 desktop). CSS: grid 2 colunas mobile; columns via --product-card-columns em breakpoint 640px+.

Estados


Checklist

  • Snippet importado via @corvex/snippets/product-card
  • Resolução com storefront.products.get (não inventar fetch)
  • Somente campos ProductSummary públicos
  • Sem hooks de editor no snippet
  • corvex validate .
O card não adiciona ao carrinho. Variante e compra: Seletor de variante. Carrinho: Drawer.