Skip to main content
Quero seleção de cor e tamanho na página de produto. Como implementar com o contrato Corvex?
Referência: seu tema (adaptado do cookbook) + sections/variant-selector-demo/ Índice: Cookbooks

Objetivo

O Variant Selector não resolve produto. Não usa product field, UUID, handle ou products.get() dentro do snippet.

Contratos utilizados

Shape público relevante

Product (variantes)

ProductVariant

Não usar: stock, inventory, trackInventory nem o objeto de preço cru da API. A disponibilidade pública é availableForSale. O preço público é price.formatted.

Arquivos


Implementação

product MUST ser Product completo (via usePage('product').product, data.product, ou loader da section parent).

Como funciona o matching

Formato real: array variant.selectedOptions:
Normalização local (exemplo):
Variant correspondente = variante cujo todos selectedOptions coincidem com a seleção completa.

Uma opção

Exemplo fixture FIXTURE_SIZE_ONLY:
Selecionar M → variant.id === 'var-m'.

Múltiplas opções

Fixture FIXTURE_COLOR_SIZE:
Preto + M → variante existe mas availableForSale === false. Branco + M → variante disponível com preço/imagem próprios.

Availability

Somente variant.availableForSale (contrato público). Disponibilidade considera combinação parcial — selecionar Preto não desabilita M globalmente se Branco/M ainda é possível.

Integração com preço / imagem

Responsabilidade do parent, não do selector:
O demo VariantInfo no section mostra esse padrão.

Integração com Add to Cart

Proteções:
  • sem selectedVariant válida → não chamar addItem
  • !selectedVariant.availableForSale → botão desabilitado
Se a API rejeitar a variante, o cliente pode gravar a linha sem o id escolhido e o botão ainda parece sucesso. Trate error de useCorvexCart e confira productVariantId na linha. Detalhe: Ações do carrinho.

Comportamento no Editor

  • Snippet não importa APIs de editor.
  • Demo section usa fixtures embutidas — funciona em /preview e editor sem resolver produto real.
  • SectionChrome apenas na section demo (PUBLIC_EDITOR_INTEGRATION).

Edge cases


Estado inicial

Sem regra de plataforma. Este exemplo usa getExampleDefaultSelection:
primeira variante com availableForSale, senão primeira da lista.
Marcado como estratégia do exemplo em matchVariant.js.

Accessibility

  • fieldset + legend por opção
  • role="group" nos valores
  • botões com aria-pressed
  • disabled real para combinações impossíveis
  • :focus-visible nos botões

Checklist

  • product já resolvido antes do snippet
  • matching via selectedOptions[] público
  • availability via availableForSale
  • parent atualiza preço/imagem
  • addItem(product, 1, variant) com guards
  • corvex validate .

Veja também