+
{product.title}
+ {product.vendor ? (
+
{product.vendor}
+ ) : null}
+
+
+
+ {formatPrice(price)}
+
+ {onSale && compareAt ? (
+ {formatPrice(compareAt)}
+ ) : null}
+
+
+ {selectedVariant && !selectedVariant.availableForSale ? (
+
{content.product.soldOut}
+ ) : null}
+
+ {/* Variant options */}
+
+ {options.map((option) => (
+
+ {option.name}
+
+ {option.values.map((value) =>
+ value.handle && value.handle !== product.handle ? (
+ // Cross-product value — navigates to the other product
+ // (hydrogen-variant-form combined-listings rule).
+
+ {value.name}
+
+ ) : value.exists ? (
+ // Same-product value — a real GET ` ` to the option
+ // URL so selection works without JS. Hydration enhances
+ // the same element through the product form register;
+ // ProductProvider owns selection state and onSelect keeps
+ // the TanStack Router URL in sync.
+
+ {value.name}
+
+ ) : (
+ // Non-existent combination — no valid option URL to
+ // degrade to, so render a disabled `` with
+ // `aria-pressed` (hydrogen-variant-form).
+
+ {value.name}
+
+ ),
+ )}
+
+
+ ))}
+
+
+ {/* Add to cart form — separate from variant selection (variant-form skill).
+ `formProps({ afterSubmit: openCartDrawer })` opens the drawer once
+ on a successful reply; do not double-wire it on the button. */}
+
+
+ {shopPayVariant ? (
+
+ ) : null}
+
+ {errors.userErrors.length > 0 ? (
+
+ {errors.userErrors.map((error, index) => (
+ {error.message}
+ ))}
+
+ ) : null}
+
+ {product.descriptionHtml ? (
+
+
{content.product.description}
+
+
+ ) : product.description ? (
+
+
{content.product.description}
+
{product.description}
+
+ ) : null}
+