From 12aaae4372b36eac4caf1e1ba5f550a9d67847b4 Mon Sep 17 00:00:00 2001 From: Axel Date: Wed, 15 Oct 2025 17:19:53 +0800 Subject: [PATCH] first commit --- snippets/product-grid-item.liquid | 390 ++++++++++++++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 snippets/product-grid-item.liquid diff --git a/snippets/product-grid-item.liquid b/snippets/product-grid-item.liquid new file mode 100644 index 0000000..eaf5712 --- /dev/null +++ b/snippets/product-grid-item.liquid @@ -0,0 +1,390 @@ +{% comment %} +Arguments +- product: product object +- [per_row]: number of items per row +- [quick_shop_enable]: boolean +- [collection]: collection object +{% endcomment %} + +{%- liquid + unless per_row + assign per_row = 4 + endunless + + capture gridView + render 'products_per_row', products_per_row: per_row, style: 'fractions' + endcapture + + # These assignments have no effect if a sizes parameter is passed in + assign sizeVariable = gridView + if fallback != blank + assign fallback = fallback + else + assign fallback = 'variable' + endif + + assign product_compare_at_price = product.compare_at_price + assign product_price = product.price + assign product_price_min = product.price_min + + assign product_price = product.metafields.app--168074346497.min_auto_discounted_price.value | default: product.price + + if product.metafields.app--168074346497.discount_percentage.value > 0.01 + assign deducted_percentage = 1.0 | minus: product.metafields.app--168074346497.discount_percentage.value + + assign product_price = product.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil + assign product_price_min = price + + assign product_compare_at_price = product.price + + if product.compare_at_price > product_compare_at_price + assign product_compare_at_price = product.compare_at_price + endif + endif + + assign on_sale = false + if product_compare_at_price > product_price + assign on_sale = true + endif + + assign product_tags = product.tags | join: ',' + assign has_custom_label = false + if product.metafields.theme.label and product.metafields.theme.label != blank + assign has_custom_label = true + assign custom_label = product.metafields.theme.label.value + elsif product_tags contains '_label_' + for tag in product.tags + if tag contains '_label_' + assign tag_starts_with = tag | slice: 0 + if tag_starts_with == '_' + assign has_custom_label = true + assign custom_label = tag | replace: '_label_', '' + endif + endif + endfor + endif +-%} + +
+
+ {%- if has_custom_label -%} +
+ {{ custom_label }} +
+ {%- else -%} + {%- unless product.available -%} +
+ {{ 'products.product.sold_out' | t }} +
+ {%- endunless -%} + {%- if on_sale and product.available -%} +
+ {{ 'products.general.sale' | t }} +
+ {%- endif -%} + {%- endif -%} + + {%- liquid + assign imageRatio = settings.product_grid_image_size + assign fixed_aspect_ratio = false + unless imageRatio == 'natural' + assign fixed_aspect_ratio = true + endunless + + if image_style == 'circle' + assign fixed_aspect_ratio = true + assign imageRatio = 'square' + endif + + assign preview_image = product.featured_media.preview_image + -%} + +
+
+ {%- if fixed_aspect_ratio -%} +
+ {%- capture image_classes -%} + {% unless settings.product_grid_image_fill %} grid__image-contain{% endunless %} image-style--{{ image_style }} + {%- endcapture -%} + {%- if preview_image != blank -%} + {%- render 'image-element', + img: preview_image, + classes: image_classes, + sizes: sizes, + sizeVariable: sizeVariable, + fallback: fallback, + widths: '360, 540, 720, 900, 1080', + -%} + {%- else -%} + {%- capture placeholder -%}product-{% cycle 1, 2, 3, 4, 5, 6 %}{%- endcapture -%} +
{{ placeholder | placeholder_svg_tag: 'placeholder-svg' }}
+ {%- endif -%} +
+ {%- else -%} +
+ {%- if preview_image != blank -%} + {%- capture image_classes -%} + grid-product__image image-style--{{ image_style }} + {%- endcapture -%} + {%- render 'image-element', + img: preview_image, + classes: image_classes, + sizes: sizes, + sizeVariable: sizeVariable, + fallback: fallback, + widths: '360, 540, 720, 900, 1080', + -%} + {%- else -%} + {%- capture placeholder -%}product-{% cycle 1, 2, 3, 4, 5, 6 %}{%- endcapture -%} +
{{ placeholder | placeholder_svg_tag: 'placeholder-svg' }}
+ {%- endif -%} +
+ {%- endif -%} + + {%- if settings.product_hover_image and product.media.size > 1 -%} + {%- for media in product.media offset: 1 limit: 1 -%} + {%- assign second_image = media.preview_image -%} + {%- endfor -%} +
+ {%- capture image_classes -%} + image-style--{{ image_style }} + {%- endcapture -%} + {%- render 'image-element', + img: second_image, + classes: image_classes, + sizes: sizes, + sizeVariable: sizeVariable, + fallback: fallback, + widths: '360, 540, 720, 1000', + -%} +
+ {%- endif -%} + + {%- if settings.enable_swatches -%} + {%- assign swatch_trigger = 'products.general.color_swatch_trigger' | t | downcase -%} + {%- for option in product.options_with_values -%} + {%- liquid + assign option_name = option.name | downcase + assign is_color = false + if option_name contains swatch_trigger + assign is_color = true + elsif swatch_trigger == 'color' and option_name contains 'colour' + assign is_color = true + endif + -%} + {%- if is_color -%} + {%- assign option_index = forloop.index0 -%} + {%- assign values = '' -%} + {%- for variant in product.variants -%} + {%- assign value = variant.options[option_index] %} + {%- unless values contains value -%} + {%- liquid + assign values = values | join: ',' | append: ',' | append: value | split: ',' + -%} + + {%- if variant.image -%} +
+
+ {%- endif -%} + {%- endunless -%} + {%- endfor -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + + {%- if quick_shop_enable and type == blank -%} + + {%- endif -%} +
+ + +
+
{{ product.title }}
+ {%- if settings.vendor_enable -%} +
{{ product.vendor }}
+ {%- endif -%} + {%- if product.available -%} + {% unless product_price < 1 %} +
+ {%- if on_sale -%} + {{ 'products.general.regular_price' | t }} + {%- if customer.tags contains 'b2b' -%} + {{ product_compare_at_price | divided_by: 1.375 | round | money_without_trailing_zeros | split: '.' | first }} + GST + {%- else -%} + {{ product_compare_at_price | money }} + {%- endif -%} + {{ 'products.general.sale_price' | t }} + {%- endif -%} + {%- if product.price_varies -%} + {%- if customer.tags contains 'b2b' -%} + {%- assign price = product_price_min | divided_by: 1.375 | round | money_without_trailing_zeros | split: '.' | first | append: ' + GST' -%} + {%- else -%} + {%- assign price = product_price_min | money -%} + {%- endif -%} + {{ 'products.general.from_text_html' | t: price: price }} + {%- elsif customer.tags contains 'b2b' -%} + {{ product_price | divided_by: 1.375 | round | money_without_trailing_zeros | split: '.' | first }} + GST + {%- else -%} + {{ product_price | money }} + {%- endif -%} + {%- if on_sale -%} + {%- if settings.product_save_amount -%} + {%- if settings.product_save_type == 'dollar' -%} + {%- capture saved_amount -%}{{ product_compare_at_price | minus: product_price | money }}{%- endcapture -%} + {%- else -%} + {%- capture saved_amount -%}{{ product_compare_at_price | minus: product_price | times: 100.0 | divided_by: product_compare_at_price | round }}%{%- endcapture -%} + {%- endif -%} + + {{ 'products.general.save_html' | t: saved_amount: saved_amount }} + + {%- endif -%} + {%- endif -%} + + {%- assign product_variant = product.selected_or_first_available_variant -%} + {%- if product_variant.unit_price_measurement -%} +
+ {%- capture unit_price_base_unit -%} + {%- if product_variant.unit_price_measurement -%} + {%- if product_variant.unit_price_measurement.reference_value != 1 -%} + {{ product_variant.unit_price_measurement.reference_value }} + {%- endif -%} + {{ product_variant.unit_price_measurement.reference_unit }} + {%- endif -%} + {%- endcapture -%} + + {{ product_variant.unit_price | money }}/{{ unit_price_base_unit }} +
+ {%- endif -%} +
+ {% endunless %} + {%- endif -%} + {%- if settings.enable_swatches and type == 'horizontal' -%} + {%- liquid + assign swatch_trigger = 'products.general.color_swatch_trigger' | t | downcase + assign swatch_file_extension = 'png' + assign color_count = 0 + -%} + + {%- for option in product.options_with_values -%} + {%- liquid + assign option_name = option.name | downcase + assign is_color = false + if option_name contains swatch_trigger + assign is_color = true + elsif swatch_trigger == 'color' and option_name contains 'colour' + assign is_color = true + endif + -%} + {%- if is_color -%} + {%- assign option_index = forloop.index0 -%} + {%- assign values = '' -%} +
+ {%- for variant in product.variants -%} + {%- assign value = variant.options[option_index] %} + {%- unless values contains value -%} + {%- liquid + assign values = values | join: ',' | append: ',' | append: value | split: ',' + + assign color_file_name = value | handle | append: '.' | append: swatch_file_extension + assign color_image = color_file_name | file_img_url: '50x50' | prepend: 'https:' | split: '?' | first + assign color_swatch_fallback = value | split: ' ' | last | handle + assign color_count = color_count | plus: 1 + -%} + + + {{ value }} + + {%- endunless -%} + {%- endfor -%} +
+ {%- if color_count < 2 -%} + {%- style -%} + .grid-product__colors--{{ product.id }} { + display: none; + } + {%- endstyle -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} +
+
+
+
+ {%- if settings.enable_swatches and type == blank -%} + {%- liquid + assign swatch_trigger = 'products.general.color_swatch_trigger' | t | downcase + assign swatch_file_extension = 'png' + assign color_count = 0 + -%} + + {%- for option in product.options_with_values -%} + {%- liquid + assign option_name = option.name | downcase + assign is_color = false + if option_name contains swatch_trigger + assign is_color = true + elsif swatch_trigger == 'color' and option_name contains 'colour' + assign is_color = true + endif + -%} + {%- if is_color -%} + {%- assign option_index = forloop.index0 -%} + {%- assign values = '' -%} +
+ {%- for variant in product.variants -%} + {%- assign value = variant.options[option_index] %} + {%- unless values contains value -%} + {%- liquid + assign values = values | join: ',' | append: ',' | append: value | split: ',' + + assign color_file_name = value | handle | append: '.' | append: swatch_file_extension + assign color_image = color_file_name | file_img_url: '50x50' | prepend: 'https:' | split: '?' | first + assign color_swatch_fallback = value | split: ' ' | last | handle + assign color_count = color_count | plus: 1 + -%} + + + {{ value }} + + {%- endunless -%} + {%- endfor -%} +
+ {%- if color_count < 2 -%} + {%- style -%} + .grid-product__colors--{{ product.id }} { + display: none; + } + {%- endstyle -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + + {%- if quick_shop_enable and type == blank -%} + {%- render 'quick-shop-modal', product: product -%} + {%- endif -%} +