{% comment %} Renders list of products in grid layout Accepts: - product: {Object} product (required) - animation_delay: {Int} animation timing for load - last_element: {Boolean} True when custom image is taking up the first slot for the collection and the loop is on the last element for the page. - index: element index in the loop - block_index: index of the block in Tab collections section - sizes: Image sizes Usage: {% render 'product-grid-item', product: product, index: index, sizes: image_sizes %} {% endcomment %} {%- liquid assign animation_delay = animation_delay | default: 0 assign aos_delay_default = animation_delay | times: 100 assign aos_delay = aos_delay | default: aos_delay_default assign aos_duration = 800 assign layout_desktop = section.settings.layout_desktop assign layout_mobile = section.settings.layout_mobile assign min_defer_index = 8 assign defer = false assign index = index | default: 1 if index > min_defer_index if layout_desktop == 'slider' or layout_mobile == 'slider' assign defer = true endif endif assign columns_desktop = section.settings.grid | plus: 0 assign columns_medium = 2 assign columns_small = 2 assign columns_mobile = section.settings.grid_mobile | plus: 0 if columns_desktop == 0 assign columns_desktop = 4 endif if columns_mobile == 0 assign columns_mobile = 1 endif if columns_desktop == 2 or columns_desktop == 4 assign columns_medium = 2 endif if settings.product_grid_center assign alignment_class = 'product-item--centered' else assign alignment_class = 'product-item--left' endif assign overlay_text_class = 'product-item--outer-text' if settings.overlay_text assign overlay_text_class = 'product-item--overlay-text' endif assign quickview_class = '' if settings.quickview_enable and product.first_available_variant assign quickview_class = 'product-item--has-quickbuy' endif assign has_siblings = false if settings.show_siblings and product.metafields.theme.siblings.value != blank and product.metafields.theme.siblings.type == 'single_line_text_field' assign has_siblings = true endif if settings.show_siblings and product.metafields.theme.sibling_products != blank and product.metafields.theme.sibling_products.type == 'list.product_reference' assign has_siblings = true endif if sizes == blank if section.settings.width == 'wrapper' if settings.grid_style == 'compact' assign sizes = '(min-width: 1400px) calc(80vw / ' | append: columns_desktop | append: '), (min-width: 750px) calc(100vw / ' | append: columns_medium | append: '), (min-width: 480px) calc(100vw / ' | append: columns_small | append: '), calc(100vw / ' | append: columns_mobile | append: ')' else assign sizes = '(min-width: 1400px) calc((80vw - 64px) / ' | append: columns_desktop | append: ' - 32px), (min-width: 750px) calc(100vw / ' | append: columns_medium | append: ' - 22px), (min-width: 480px) calc(100vw / ' | append: columns_small | append: ' - 16px), calc(100vw / ' | append: columns_mobile | append: ')' endif else if settings.grid_style == 'compact' assign sizes = '(min-width: 1400px) calc(100vw / ' | append: columns_desktop | append: '), (min-width: 750px) calc(100vw / ' | append: columns_medium | append: '), (min-width: 480px) calc(100vw / ' | append: columns_small | append: '), calc(100vw / ' | append: columns_mobile | append: ')' else assign sizes = '(min-width: 1400px) calc(100vw / ' | append: columns_desktop | append: ' - 32px), (min-width: 750px) calc(100vw / ' | append: columns_medium | append: ' - 22px), (min-width: 480px) calc(100vw / ' | append: columns_small | append: ' - 16px), calc(100vw / ' | append: columns_mobile | append: ')' endif endif endif assign widths = '136, 160, 180, 220, 254, 284, 292, 320, 480, 528, 640, 720, 960, 1080, 1296, 1512, 1728, 1950' assign aspect_ratio = 1 | divided_by: settings.product_grid_aspect_ratio assign loading = 'eager' if columns_desktop <= 3 assign eager_images_limit = columns_desktop else assign eager_images_limit = columns_desktop | times: 2 endif if layout_desktop == 'slider' and index > 3 assign loading = 'lazy' elsif index > eager_images_limit assign loading = 'lazy' endif if block_index > 1 assign loading = 'lazy' endif -%} {%- if settings.color_swatches -%} {%- assign has_colors = false -%} {%- capture swatches -%} {%- capture swatch_translation -%}{{ 'general.swatches.color' | t }}{%- endcapture -%} {%- assign swatch_labels = swatch_translation | append: ',' | split: ',' -%} {%- for label in swatch_labels -%} {%- assign sanitized_label = label | lstrip | rstrip -%} {%- if product.options_by_name[sanitized_label].values.size > 0 -%} {%- assign has_colors = true -%} {%- capture swatch_values -%} {%- for value in product.options_by_name[sanitized_label].values -%} {{- value -}}: {{- value | handle -}} {%- unless forloop.last -%}, {%- endunless -%} {%- endfor -%} {%- endcapture -%}
{%- break -%} {%- endif -%} {%- endfor -%} {%- endcapture -%} {%- endif -%} {%- liquid assign double_img = false if product.media[1].preview_image and settings.image_hover_enable assign double_img = true endif assign current_variant = product.first_available_variant assign product_url = product.url capture item_unique echo 'product-item--' | append: section.id | append: '-' | append: product.id endcapture assign aos_anchor_default = item_unique | prepend: '#' assign aos_anchor = aos_anchor | default: aos_anchor_default -%} {%- if has_siblings -%} {%- liquid assign sibling_products = product.metafields.theme.sibling_products.value | default: collections[product.metafields.theme.siblings.value].products assign count = product.metafields.theme.sibling_products.value.count | default: collections[product.metafields.theme.siblings.value].products.size assign count_string_one = 'collections.general.colors_with_count.one' | t assign count_string_other = 'collections.general.colors_with_count.other' | t -%} {%- if sibling_products != blank -%} {%- capture siblings_html -%}