{%- doc -%} Renders a product item. @param {object} prod - The product object. We use 'prod' to avoid collision with the global 'product' object. @param {string} product_columns_desktop - The number of columns in the product grid on desktop. @param {string} product_columns_mobile - The number of columns in the product grid on mobile. @param {string} aspect_ratio - The image aspect ratio. @param {boolean} [has_grid_reveal] - Whether the item should animate. @param {string} custom_color_key_map - A list of custom color names for swatches. @param {string} custom_color_value_map - A list of custom color values for swatches. @param {boolean} [quick_view_is_beneath] - Whether the quick view displays below the product info (instead of overlayed on the image). @param {boolean} [placeholder] - Whether the item is being rendered as a placeholder. {%- enddoc -%} {%- liquid assign prod_compare_at_price = prod.compare_at_price assign prod_price = prod.price assign prod_price = prod.metafields.app--168074346497.min_auto_discounted_price.value | default: prod.price if prod.metafields.app--168074346497.discount_percentage.value > 0.01 assign deducted_percentage = 1.0 | minus: prod.metafields.app--168074346497.discount_percentage.value assign prod_price = prod.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil assign prod_compare_at_price = prod.price if prod.compare_at_price > prod_compare_at_price assign prod_compare_at_price = prod.compare_at_price endif endif assign has_grid_reveal = has_grid_reveal | default: false, allow_false: true assign quick_view_is_beneath = quick_view_is_beneath | default: false, allow_false: true assign placeholder = placeholder | default: false, allow_false: true if settings.product_listing_show_second_image_on_hover and prod.media.size > 1 assign show_multiple_images = true else assign show_multiple_images = false endif assign mobile_column_count = product_columns_mobile | plus: 0 case product_columns_desktop when '5' assign sizes = '(max-width: 720px) calc((90vw - 12px) /[[mcc]]), (max-width: 1400px) calc((93.4vw - (12px * 3)) / 5), 270px' | replace: '[[mcc]]', mobile_column_count when '3' assign sizes = '(max-width: 720px) calc((90vw - 12px) /[[mcc]]), (max-width: 1400px) calc((93.4vw - (12px * 3)) / 3), 450px' | replace: '[[mcc]]', mobile_column_count when '2' assign sizes = '(max-width: 720px) calc((90vw - 12px) /[[mcc]]), (max-width: 1400px) calc((93.4vw - (12px * 3)) / 2), 690px' | replace: '[[mcc]]', mobile_column_count else # Using a 4 item grid as default for sizes assign sizes = '(max-width: 720px) calc((90vw - 12px) /[[mcc]]), (max-width: 1400px) calc((93.4vw - (12px * 3)) / 4), 304px' | replace: '[[mcc]]', mobile_column_count endcase assign has_hover_swatches = false assign has_hover_chips = false assign show_sibling_swatches = false assign sibling_products = prod.metafields.stiletto.sibling_collection.value.products | default: prod.metafields.stiletto.siblings_collection.value.products # Sibling swatches will override other swatches if these conditions are met if settings.enable_product_card_sibling_swatches and settings.siblings_option_name != blank and sibling_products.size > 0 assign has_hover_swatches = true assign show_sibling_swatches = true assign first_swatchified_option = settings.siblings_option_name | downcase assign displayed_swatch_count = sibling_products.size elsif settings.enable_product_card_swatches capture first_swatchified_option render 'get-first-styled-option', prod: prod, styled_options: settings.swatch_options endcapture assign displayed_swatch_count = prod.options_by_name[first_swatchified_option].values.size if displayed_swatch_count > 0 assign has_hover_swatches = true endif endif if settings.show_product_card_chips capture first_chipped_option render 'get-first-styled-option', prod: prod, styled_options: settings.product_card_chip_options endcapture assign displayed_chip_count = prod.options_by_name[first_chipped_option].values.size if displayed_chip_count > 0 assign has_hover_chips = true endif endif if quick_view_is_beneath assign has_hover_swatches = false assign has_hover_chips = false endif if prod.has_only_default_variant assign product_has_variants = false else assign product_has_variants = true endif # Quick add takes precedence over quick view # Use quick view for products with variants and sold out products if settings.enable_quick_add and prod.available if product_has_variants assign quick_shop_type = 'quick-view' assign quick_shop_button_text = 'products.product.choose_options' | t else assign quick_shop_type = 'quick-add' assign quick_shop_button_text = 'products.product.add_to_cart' | t endif capture quick_shop_button_hoverless_icon render 'icon', icon: 'quick-add' endcapture elsif settings.enable_quick_view assign quick_shop_type = 'quick-view' assign quick_shop_button_text = 'products.product.quick_view' | t capture quick_shop_button_hoverless_icon render 'icon', icon: 'quick-view' endcapture else assign quick_shop_type = 'none' endif -%} {%- if quick_shop_type != 'none' -%} {%- liquid capture quick_shop_button_attributes echo 'data-quick-shop-trigger="[[qst]]"' | replace: '[[qst]]', quick_shop_type if quick_shop_type == 'quick-add' echo 'data-product-id="[[pid]]"' | replace: '[[pid]]', prod.variants[0].id else echo 'data-product-url="[[pu]]"' | replace: '[[pu]]', prod.url endif endcapture -%} {%- capture quick_shop_button -%} {%- endcapture -%} {%- capture quick_shop_button_hoverless -%} {%- endcapture -%} {%- endif -%} {%- liquid # Wrap add to cart buttons in a product form for no-js, or if purchase confirmation and quick cart are disabled if quick_shop_type == 'quick-add' capture product_form_tags echo '' | replace: '[[vi]]', prod.variants[0].id endcapture capture quick_shop_button form 'product', prod, class: 'product-item__product-form' echo product_form_tags echo quick_shop_button endform endcapture capture quick_shop_button_hoverless form 'product', prod, class: 'product-item__product-form' echo product_form_tags echo quick_shop_button_hoverless endform endcapture endif capture product_item_class echo 'product-item' if has_hover_swatches echo ' product-item--with-hover-swatches' endif if has_hover_chips echo ' product-item--with-hover-chips' endif if settings.enable_border_on_hover echo ' product-item--border-on-hover' endif echo ' animation animation--item' if has_grid_reveal echo ' animation--item-initial' endif endcapture -%}

{%- if placeholder -%} {{- 'homepage.onboarding.product_title' | t -}} {%- else -%} {{ prod.title }} {%- endif -%}

{%- if settings.product_listing_show_vendor and prod.vendor -%}
{{- prod.vendor -}}
{%- endif -%} {%- liquid if settings.product_listing_show_rating render 'product-rating', prod: prod endif assign price_content_type = 'price' if prod.available if prod.price == 0 and prod.price_varies == false if settings.zero_dollar_listing_price_display == 'replace' assign price_content_type = 'custom' assign custom_price_content = 'products.inventory.zero_price_custom_label' | t elsif settings.zero_dollar_listing_price_display == 'hide' assign price_content_type = 'hide' assign custom_price_content = blank endif endif else if settings.sold_out_listing_price_display == 'hide' assign price_content_type = 'hide' assign custom_price_content = blank elsif settings.sold_out_listing_price_display == 'replace' assign price_content_type = 'custom' assign custom_price_content = 'products.inventory.sold_out_price_custom_label' | t endif endif -%} {%- if price_content_type == 'price' -%}

{%- if placeholder -%} {{- 9999 | money -}} {%- elsif prod_compare_at_price > prod_price -%} {{ 'products.product.regular_price' | t }} {%- liquid # Extend Shopify's detection for varied compare_at_price assign has_null_compare_at_price = false for variant in prod.variants assign variant_compare_at_price = variant.compare_at_price assign variant_price = variant.metafields.app--168074346497.auto_discounted_price.value | default: variant.price if variant.metafields.app--168074346497.discount_type.value != nil and variant.metafields.app--168074346497.discount_type.value != "fixed" and prod.metafields.app--168074346497.discount_percentage.value > 0.01 assign deducted_percentage = 1.0 | minus: prod.metafields.app--168074346497.discount_percentage.value if variant.metafields.app--168074346497.discount_percentage.value > 0.01 assign deducted_percentage = 1.0 | minus: variant.metafields.app--168074346497.discount_percentage.value endif assign variant_price = variant.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil assign variant_compare_at_price = variant.price if variant.compare_at_price > variant_compare_at_price assign variant_compare_at_price = variant.compare_at_price endif endif if variant_price < variant.price and variant_compare_at_price == blank assign variant_compare_at_price = variant.price endif if variant_compare_at_price == null assign has_null_compare_at_price = true break endif endfor -%} {%- unless prod.compare_at_price_varies or has_null_compare_at_price -%} {{ prod_compare_at_price | money }} {%- endunless -%} {%- if prod.price_varies or prod.compare_at_price_varies or has_null_compare_at_price -%} {%- assign sale_price = prod_price | money -%} {{- 'products.product.on_sale_from_html' | t: price: sale_price -}} {%- else -%} {{ prod_price | money }} {%- endif -%} {%- else -%} {%- if prod.price_varies -%} {%- assign price = prod_price | money -%} {{- 'products.product.from_lowest_price_html' | t: lowest_price: price -}} {%- else -%} {{ prod_price | money }} {%- endif -%} {%- endif -%} {%- if settings.product_listing_show_discount -%} {%- render 'get-display-discount', prod: prod, format: settings.product_listing_discount_format -%} {%- endif -%} {%- render 'unit-price', item: prod.selected_or_first_available_variant -%}

{%- elsif price_content_type == 'custom' -%} {%- if prod.price_varies and prod_price == 0 -%} {%- assign price = prod_price | money -%} {%- assign custom_price_content = 'products.inventory.zero_price_custom_label' | t -%}

{%- liquid capture from_lowest_price_html echo 'products.product.from_lowest_price_html' | t: lowest_price: custom_price_content endcapture if prod_compare_at_price > prod_price echo '[[flph]]' | replace: '[[flph]]', from_lowest_price_html else echo from_lowest_price_html endif -%}

{%- else -%} {%- if custom_price_content != blank -%}

{{ custom_price_content }}

{%- endif -%} {%- endif -%} {%- endif -%} {%- if has_hover_swatches or has_hover_chips -%} {%- liquid assign option_string = blank if has_hover_swatches assign swatch_string = 'products.product.swatch_count' | t: count: displayed_swatch_count, swatch_name: first_swatchified_option assign option_string = option_string | append: swatch_string endif if has_hover_swatches and has_hover_chips assign delimiter_string = 'products.product.swatch_and_chip_delimiter' | t assign option_string = option_string | append: delimiter_string endif if has_hover_chips assign chip_string = 'products.product.chip_count' | t: count: displayed_chip_count, chip_name: first_chipped_option assign option_string = option_string | append: chip_string endif %}
{{- option_string -}}
{%- endif -%}
{%- if has_hover_swatches or has_hover_chips -%}
{%- if has_hover_swatches -%} {%- render 'product-item-swatches', prod: prod, option_name: first_swatchified_option, show_sibling_swatches: show_sibling_swatches, sibling_products: sibling_products, custom_color_key_map: custom_color_key_map, custom_color_value_map: custom_color_value_map -%} {%- endif -%} {%- if has_hover_chips -%} {%- render 'product-item-chips', prod: prod, option_name: first_chipped_option -%} {%- endif -%}
{%- endif -%} {%- liquid if quick_shop_type != 'none' and quick_view_is_beneath echo quick_shop_button endif -%}