easyorders 0.1.15 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/template/theme/config.json +45 -27
  2. package/dist/template/theme/home-sections/Tilted-Scrolling-Marque/config.json +107 -0
  3. package/dist/template/theme/home-sections/Tilted-Scrolling-Marque/template.liquid +171 -0
  4. package/dist/template/theme/home-sections/category-mosaic/config.json +125 -40
  5. package/dist/template/theme/home-sections/category-mosaic/template.liquid +170 -155
  6. package/dist/template/theme/home-sections/different-hero/config.json +199 -0
  7. package/dist/template/theme/home-sections/different-hero/template.liquid +219 -0
  8. package/dist/template/theme/home-sections/editorial-feature/config.json +93 -67
  9. package/dist/template/theme/home-sections/editorial-feature/template.liquid +154 -153
  10. package/dist/template/theme/home-sections/newsletter-luxe/config.json +86 -60
  11. package/dist/template/theme/home-sections/newsletter-luxe/template.liquid +150 -144
  12. package/dist/template/theme/home-sections/runway-hero/config.json +148 -91
  13. package/dist/template/theme/home-sections/runway-hero/template.liquid +189 -159
  14. package/dist/template/theme/home-sections/shop-the-look/config.json +167 -75
  15. package/dist/template/theme/home-sections/shop-the-look/template.liquid +326 -304
  16. package/dist/template/theme/home-sections/slider-before-after/config.json +213 -0
  17. package/dist/template/theme/home-sections/slider-before-after/template.liquid +336 -0
  18. package/dist/template/theme/home-sections/test-hero-allbird/config.json +130 -0
  19. package/dist/template/theme/home-sections/test-hero-allbird/template.liquid +149 -0
  20. package/dist/template/theme/home-sections/trust-promise/config.json +121 -47
  21. package/dist/template/theme/home-sections/trust-promise/template.liquid +34 -11
  22. package/dist/template/theme/home-sections/zoom-parallax/config.json +48 -0
  23. package/dist/template/theme/home-sections/zoom-parallax/template.liquid +135 -0
  24. package/dist/template/theme/product-data-schema.json +27 -0
  25. package/dist/template/theme/schema.json +114 -129
  26. package/dist/template/theme/script.js +694 -185
  27. package/dist/template/theme/sections/categories.liquid +20 -4
  28. package/dist/template/theme/sections/featured-products.liquid +65 -32
  29. package/dist/template/theme/sections/fixed-buy-button.liquid +6 -1
  30. package/dist/template/theme/sections/footer.liquid +90 -91
  31. package/dist/template/theme/sections/gallery.liquid +37 -33
  32. package/dist/template/theme/sections/header.liquid +105 -25
  33. package/dist/template/theme/sections/home-products-grid.liquid +68 -10
  34. package/dist/template/theme/sections/list-products.liquid +73 -30
  35. package/dist/template/theme/sections/order-invoice.liquid +39 -91
  36. package/dist/template/theme/sections/product-description.liquid +18 -8
  37. package/dist/template/theme/sections/product-details.liquid +9 -24
  38. package/dist/template/theme/sections/products-grid.liquid +102 -54
  39. package/dist/template/theme/sections/related-products.liquid +124 -60
  40. package/dist/template/theme/sections/reviews.liquid +43 -28
  41. package/dist/template/theme/style.css +2283 -589
  42. package/dist/template/theme/theme-data.json +25 -8
  43. package/package.json +1 -1
@@ -10,54 +10,39 @@
10
10
  {% endif %}
11
11
  </div>
12
12
 
13
+ <div class="ab-pd-divider"></div>
14
+
13
15
  {% if rating > 0 %}
14
16
  <div class="ab-pd-rating">
15
17
  <div class="ab-pd-stars">
16
18
  {% assign full_stars = rating | floor %}
17
19
  {% assign has_half = false %}
18
20
  {% assign decimal = rating | minus: full_stars %}
21
+
19
22
  {% if decimal >= 0.25 and decimal < 0.75 %}
20
23
  {% assign has_half = true %}
21
24
  {% elsif decimal >= 0.75 %}
22
25
  {% assign full_stars = full_stars | plus: 1 %}
23
26
  {% endif %}
24
27
 
28
+ {% assign half_star_index = full_stars | plus: 1 %}
29
+
25
30
  {% for i in (1..5) %}
26
31
  {% if i <= full_stars %}
27
32
  <span class="ab-pd-star ab-pd-star-filled"></span>
28
- {% elsif has_half and i == full_stars | plus: 1 %}
33
+ {% elsif has_half and i == half_star_index %}
29
34
  <span class="ab-pd-star ab-pd-star-half"></span>
30
35
  {% else %}
31
36
  <span class="ab-pd-star ab-pd-star-empty"></span>
32
37
  {% endif %}
33
38
  {% endfor %}
34
39
  </div>
40
+
35
41
  <span class="ab-pd-reviews-count">({{ reviews_count }})</span>
36
42
  </div>
37
- {% endif %}
43
+ {% endif %}
38
44
 
39
45
  {% if description and description != "" %}
40
46
  <p class="ab-pd-description">{{ description }}</p>
41
47
  {% endif %}
42
-
43
- {% comment %} Wishlist & Compare buttons on the product detail page — dispatch toggle events handled by the storefront JS layer
44
- <div class="ab-pd-actions">
45
- <button
46
- class="ab-pd-wishlist-btn"
47
- type="button"
48
- aria-label="Add to wishlist"
49
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('toggle-wishlist',{bubbles:true,detail:{productId:'{{ product_id }}'}}));"
50
- >
51
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
52
- </button>
53
- <button
54
- class="ab-pd-compare-btn"
55
- type="button"
56
- aria-label="Compare"
57
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('toggle-compare',{bubbles:true,detail:{productId:'{{ product_id }}'}}));"
58
- >
59
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 3 21 8 16 13"/><line x1="21" y1="8" x2="9" y2="8"/><polyline points="8 21 3 16 8 11"/><line x1="3" y1="16" x2="15" y2="16"/></svg>
60
- </button>
61
- </div>
62
- {% endcomment %}
63
- </div>
48
+ </div>
@@ -1,5 +1,12 @@
1
1
 
2
- <section class="ab-pgrid">
2
+ <section
3
+ class="ab-pgrid"
4
+ style="
5
+ --ab-sale-badge-bg: {{ theme_data.sale_badge_bg_color | default: '#c94a4a' }};
6
+ --ab-sale-badge-text: {{ theme_data.sale_badge_text_color | default: '#ffffff' }};
7
+ --ab-product-card-bg: {% if theme_data.card_background_product == 'transparent' %}transparent{% else %}{{ theme_data.card_background_product_color | default: '#f5f4f2' }}{% endif %};
8
+ "
9
+ >
3
10
  <div class="ab-pgrid-wrap ab-pgrid-wrap--no-hero">
4
11
  {% for product in products %}
5
12
  {% assign color_variation = product.variations | where: "type", "color" | first %}
@@ -11,10 +18,52 @@
11
18
  {% assign swatch_total = image_variation.props.size %}
12
19
  {% endif %}
13
20
 
21
+ {% assign pgrid_custom_badge = '' %}
22
+ {% if product.product_theme_data %}
23
+ {% assign pgrid_custom_badge = product.product_theme_data.custom_badge_title | strip %}
24
+ {% endif %}
25
+ {% assign pgrid_has_sale = false %}
26
+ {% if product.sale_price and product.sale_price < product.price and theme_data.show_sale_badge != false %}
27
+ {% assign pgrid_has_sale = true %}
28
+ {% endif %}
29
+ {% assign pgrid_has_variants = false %}
30
+ {% if product.variations and product.variations.size > 0 %}
31
+ {% assign pgrid_has_variants = true %}
32
+ {% endif %}
33
+ {% assign pgrid_disable_no_stock_str = product.disable_orders_for_no_stock | append: '' | downcase | strip %}
34
+ {% assign pgrid_disable_no_stock = false %}
35
+ {% if pgrid_disable_no_stock_str == 'true' or pgrid_disable_no_stock_str == '1' %}
36
+ {% assign pgrid_disable_no_stock = true %}
37
+ {% endif %}
38
+ {% assign pgrid_stock_flag_raw = product.in_stock | default: product.available %}
39
+ {% assign pgrid_stock_flag_str = pgrid_stock_flag_raw | append: '' | downcase | strip %}
40
+ {% assign pgrid_is_out_of_stock = false %}
41
+ {% if pgrid_stock_flag_str == 'false' or pgrid_stock_flag_str == '0' %}
42
+ {% assign pgrid_is_out_of_stock = true %}
43
+ {% elsif pgrid_stock_flag_str == 'true' or pgrid_stock_flag_str == '1' %}
44
+ {% assign pgrid_is_out_of_stock = false %}
45
+ {% else %}
46
+ {% assign pgrid_stock_qty = product.quantity | default: product.stock | default: product.total_quantity | default: 0 | plus: 0 %}
47
+ {% if pgrid_stock_qty <= 0 %}
48
+ {% assign pgrid_is_out_of_stock = true %}
49
+ {% endif %}
50
+ {% endif %}
51
+ {% assign pgrid_hide_add_btn = false %}
52
+ {% if pgrid_disable_no_stock and pgrid_has_variants == false and pgrid_is_out_of_stock %}
53
+ {% assign pgrid_hide_add_btn = true %}
54
+ {% endif %}
55
+
14
56
  <a href="/products/{{ product.slug }}" class="ab-pgrid-card ab-reveal" style="animation-delay: {{ forloop.index | times: 0.04 }}s">
15
- {% if product.sale_price and product.sale_price < product.price %}
16
- {% assign discount = product.price | minus: product.sale_price | times: 100 | divided_by: product.price | floor %}
17
- <span class="ab-pgrid-badge ab-sale-badge">{{ sale }} -{{ discount }}%</span>
57
+ {% if pgrid_has_sale or pgrid_custom_badge != '' %}
58
+ <div class="ab-pgrid-badge-stack">
59
+ {% if pgrid_has_sale %}
60
+ {% assign discount = product.price | minus: product.sale_price | times: 100 | divided_by: product.price | floor %}
61
+ <span class="ab-pgrid-badge ab-sale-badge">-{{ discount }}%</span>
62
+ {% endif %}
63
+ {% if pgrid_custom_badge != '' %}
64
+ <span class="ab-pgrid-badge ab-product-custom-badge">{{ pgrid_custom_badge }}</span>
65
+ {% endif %}
66
+ </div>
18
67
  {% endif %}
19
68
 
20
69
  <div class="ab-pgrid-media">
@@ -22,65 +71,64 @@
22
71
  {% if product.images[0] %}
23
72
  <img class="ab-pgrid-img-hover" src="{{ product.images[0] }}" alt="{{ product.name }}" loading="lazy" />
24
73
  {% endif %}
25
- {% comment %} Wishlist & Compare action buttons — dispatch custom events caught by the storefront JS layer
26
- <div class="ab-card-actions">
27
- <button
28
- class="ab-wishlist-btn"
29
- type="button"
30
- aria-label="Add to wishlist"
31
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('toggle-wishlist',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
32
- >
33
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
34
- </button>
74
+ {% unless pgrid_hide_add_btn %}
35
75
  <button
36
- class="ab-compare-btn"
76
+ class="ab-pgrid-add-btn"
37
77
  type="button"
38
- aria-label="Compare"
39
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('toggle-compare',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
40
- >
41
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 3 21 8 16 13"/><line x1="21" y1="8" x2="9" y2="8"/><polyline points="8 21 3 16 8 11"/><line x1="3" y1="16" x2="15" y2="16"/></svg>
42
- </button>
43
- </div>
44
- {% endcomment %}
45
- <button
46
- class="ab-pgrid-add-btn"
47
- type="button"
48
- aria-label="Add to cart"
49
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('quick-add',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
50
- ></button>
78
+ aria-label="Add to cart"
79
+ onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('quick-add',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
80
+ ></button>
81
+ {% endunless %}
51
82
  </div>
52
83
 
53
- <div class="ab-pgrid-info">
54
- <p class="ab-pgrid-name">{{ product.name }}</p>
84
+ <div class="ab-pgrid-info">
85
+ <p class="ab-pgrid-name">{{ product.name }}</p>
55
86
 
56
- <div class="ab-pgrid-price-row">
57
- {% if product.sale_price and product.sale_price < product.price %}
58
- <span class="ab-price-old">{{ product.price }} {{ currency }}</span>
59
- <span class="ab-pgrid-price ab-price-sale">{{ product.sale_price }} {{ currency }}</span>
60
- {% else %}
61
- <span class="ab-pgrid-price">{{ product.price }} {{ currency }}</span>
87
+ {% if color_variation and color_variation.props and color_variation.props.size > 0 %}
88
+ {% assign _sw0 = color_variation.props | first %}
89
+ <p class="ab-pgrid-color">{{ _sw0.name }}</p>
90
+ {% elsif image_variation and image_variation.props and image_variation.props.size > 0 %}
91
+ {% assign _sw0 = image_variation.props | first %}
92
+ <p class="ab-pgrid-color">{{ _sw0.name }}</p>
62
93
  {% endif %}
63
- </div>
64
94
 
65
- <div class="ab-pgrid-swatches">
66
- {% if color_variation and color_variation.props %}
67
- {% for prop in color_variation.props limit: 6 %}
68
- <span class="ab-pgrid-swatch" style="background: {{ prop.value }}" title="{{ prop.name }}"></span>
69
- {% endfor %}
70
- {% elsif image_variation and image_variation.props %}
71
- {% for prop in image_variation.props limit: 6 %}
72
- <span class="ab-pgrid-swatch ab-pgrid-swatch-image" title="{{ prop.name }}">
73
- <img src="{{ prop.value }}" alt="{{ prop.name }}" loading="lazy" />
74
- </span>
75
- {% endfor %}
76
- {% endif %}
95
+ <div class="ab-pgrid-price-row">
96
+ {% if product.sale_price and product.sale_price < product.price %}
97
+ <span class="ab-price-old">{{ product.price }} {{ currency }}</span>
98
+ <span class="ab-pgrid-price ab-price-sale">{{ product.sale_price }} {{ currency }}</span>
99
+ {% else %}
100
+ <span class="ab-pgrid-price">{{ product.price }} {{ currency }}</span>
101
+ {% endif %}
102
+ </div>
77
103
 
78
- {% if swatch_total > 6 %}
79
- <span class="ab-pgrid-swatch-more">+{{ swatch_total | minus: 6 }}</span>
80
- {% endif %}
104
+ <div class="ab-pgrid-swatches">
105
+ {% if color_variation and color_variation.props %}
106
+ {% for prop in color_variation.props limit: 6 %}
107
+ <span
108
+ class="ab-pgrid-swatch{% if forloop.first %} ab-pgrid-swatch--active{% endif %}"
109
+ style="background: {{ prop.value }}"
110
+ title="{{ prop.name }}"
111
+ ></span>
112
+ {% endfor %}
113
+ {% elsif image_variation and image_variation.props %}
114
+ {% for prop in image_variation.props limit: 6 %}
115
+ <span
116
+ class="ab-pgrid-swatch ab-pgrid-swatch-image{% if forloop.first %} ab-pgrid-swatch--active{% endif %}"
117
+ title="{{ prop.name }}"
118
+ >
119
+ <img src="{{ prop.value }}" alt="{{ prop.name }}" loading="lazy" />
120
+ </span>
121
+ {% endfor %}
122
+ {% endif %}
123
+
124
+ {% if swatch_total > 6 %}
125
+ <span class="ab-pgrid-swatch-more">+{{ swatch_total | minus: 6 }}</span>
126
+ {% endif %}
127
+ </div>
81
128
  </div>
82
- </div>
83
- </a>
129
+ </a>
84
130
  {% endfor %}
85
131
  </div>
132
+
133
+
86
134
  </section>
@@ -1,4 +1,11 @@
1
- <section class="ab-plist ab-plist--related">
1
+ <section
2
+ class="ab-plist ab-plist--related"
3
+ style="
4
+ --ab-sale-badge-bg: {{ theme_data.sale_badge_bg_color | default: '#c94a4a' }};
5
+ --ab-sale-badge-text: {{ theme_data.sale_badge_text_color | default: '#ffffff' }};
6
+ --ab-product-card-bg: {% if theme_data.card_background_product == 'transparent' %}transparent{% else %}{{ theme_data.card_background_product_color | default: '#f5f4f2' }}{% endif %};
7
+ "
8
+ >
2
9
  <div class="ab-plist-header">
3
10
  {% if section_title %}
4
11
  <h2 class="ab-plist-title ab-reveal">{{ section_title }}</h2>
@@ -14,75 +21,132 @@
14
21
  </div>
15
22
 
16
23
  <div class="ab-plist-track">
17
- {% for product in products %}
24
+ {% for product in products limit: 4 %}
18
25
  {% assign color_variation = product.variations | where: "type", "color" | first %}
19
26
  {% assign image_variation = product.variations | where: "type", "image" | first %}
20
-
21
- <a href="/products/{{ product.slug }}" class="ab-plist-card ab-reveal" style="animation-delay: {{ forloop.index | times: 0.04 }}s">
22
- {% if product.sale_price and product.sale_price < product.price %}
23
- {% assign discount = product.price | minus: product.sale_price | times: 100 | divided_by: product.price | floor %}
24
- <span class="ab-plist-badge ab-sale-badge">{{ sale }} -{{ discount }}%</span>
27
+ {% assign swatch_total = 0 %}
28
+ {% assign pgrid_custom_badge = '' %}
29
+ {% if product.product_theme_data %}
30
+ {% assign pgrid_custom_badge = product.product_theme_data.custom_badge_title | strip %}
31
+ {% endif %}
32
+ {% assign pgrid_has_sale = false %}
33
+ {% if product.sale_price and product.sale_price < product.price and theme_data.show_sale_badge != false %}
34
+ {% assign pgrid_has_sale = true %}
35
+ {% endif %}
36
+ {% if color_variation and color_variation.props %}
37
+ {% assign swatch_total = color_variation.props.size %}
38
+ {% elsif image_variation and image_variation.props %}
39
+ {% assign swatch_total = image_variation.props.size %}
40
+ {% endif %}
41
+ {% assign pgrid_has_variants = false %}
42
+ {% if product.variations and product.variations.size > 0 %}
43
+ {% assign pgrid_has_variants = true %}
44
+ {% endif %}
45
+ {% assign pgrid_disable_no_stock_str = product.disable_orders_for_no_stock | append: '' | downcase | strip %}
46
+ {% assign pgrid_disable_no_stock = false %}
47
+ {% if pgrid_disable_no_stock_str == 'true' or pgrid_disable_no_stock_str == '1' %}
48
+ {% assign pgrid_disable_no_stock = true %}
49
+ {% endif %}
50
+ {% assign pgrid_stock_flag_raw = product.in_stock | default: product.available %}
51
+ {% assign pgrid_stock_flag_str = pgrid_stock_flag_raw | append: '' | downcase | strip %}
52
+ {% assign pgrid_is_out_of_stock = false %}
53
+ {% if pgrid_stock_flag_str == 'false' or pgrid_stock_flag_str == '0' %}
54
+ {% assign pgrid_is_out_of_stock = true %}
55
+ {% elsif pgrid_stock_flag_str == 'true' or pgrid_stock_flag_str == '1' %}
56
+ {% assign pgrid_is_out_of_stock = false %}
57
+ {% else %}
58
+ {% assign pgrid_stock_qty = product.quantity | default: product.stock | default: product.total_quantity | default: 0 | plus: 0 %}
59
+ {% if pgrid_stock_qty <= 0 %}
60
+ {% assign pgrid_is_out_of_stock = true %}
25
61
  {% endif %}
62
+ {% endif %}
63
+ {% assign pgrid_hide_add_btn = false %}
64
+ {% if pgrid_disable_no_stock and pgrid_has_variants == false and pgrid_is_out_of_stock %}
65
+ {% assign pgrid_hide_add_btn = true %}
66
+ {% endif %}
26
67
 
27
- <div class="ab-plist-media">
28
- <img class="ab-plist-img-primary" src="{{ product.thumb }}" alt="{{ product.name }}" loading="lazy" />
29
- {% if product.images[0] %}
30
- <img class="ab-plist-img-hover" src="{{ product.images[0] }}" alt="{{ product.name }}" loading="lazy" />
31
- {% endif %}
32
- {% comment %} Wishlist & Compare action buttons — dispatch custom events caught by the storefront JS layer
33
- <div class="ab-card-actions">
34
- <button
35
- class="ab-wishlist-btn"
36
- type="button"
37
- aria-label="Add to wishlist"
38
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('toggle-wishlist',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
39
- >
40
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
41
- </button>
42
- <button
43
- class="ab-compare-btn"
44
- type="button"
45
- aria-label="Compare"
46
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('toggle-compare',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
47
- >
48
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 3 21 8 16 13"/><line x1="21" y1="8" x2="9" y2="8"/><polyline points="8 21 3 16 8 11"/><line x1="3" y1="16" x2="15" y2="16"/></svg>
49
- </button>
50
- </div>
51
- {% endcomment %}
52
- <button
53
- class="ab-plist-add-btn"
54
- type="button"
55
- aria-label="Add to cart"
56
- onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('quick-add',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
57
- ></button>
58
- </div>
68
+ <div class="ab-pgrid-card ab-reveal" style="animation-delay: {{ forloop.index | times: 0.04 }}s">
69
+ <a href="/products/{{ product.slug }}" class="ab-pgrid-card-link">
70
+ <div class="ab-pgrid-media">
71
+ {% if pgrid_has_sale or pgrid_custom_badge != '' %}
72
+ <div class="ab-pgrid-badge-stack">
73
+ {% if pgrid_has_sale %}
74
+ {% assign discount = product.price | minus: product.sale_price | times: 100 | divided_by: product.price | floor %}
75
+ <span class="ab-pgrid-badge ab-sale-badge">-{{ discount }}%</span>
76
+ {% endif %}
77
+ {% if pgrid_custom_badge != '' %}
78
+ <span class="ab-pgrid-badge ab-product-custom-badge">{{ pgrid_custom_badge }}</span>
79
+ {% endif %}
80
+ </div>
81
+ {% endif %}
59
82
 
60
- <div class="ab-plist-info">
61
- <p class="ab-plist-name">{{ product.name }}</p>
62
- <div class="ab-plist-price-row">
63
- {% if product.sale_price and product.sale_price < product.price %}
64
- <span class="ab-price-old">{{ product.price }} {{ currency }}</span>
65
- <span class="ab-plist-price ab-price-sale">{{ product.sale_price }} {{ currency }}</span>
66
- {% else %}
67
- <span class="ab-plist-price">{{ product.price }} {{ currency }}</span>
83
+ <img class="ab-pgrid-img-primary" src="{{ product.thumb }}" alt="{{ product.name }}" loading="lazy" />
84
+ {% if product.images[0] %}
85
+ <img class="ab-pgrid-img-hover" src="{{ product.images[0] }}" alt="{{ product.name }}" loading="lazy" />
68
86
  {% endif %}
69
87
  </div>
70
88
 
71
- <div class="ab-plist-swatches">
72
- {% if color_variation and color_variation.props %}
73
- {% for prop in color_variation.props limit: 4 %}
74
- <span class="ab-plist-swatch" style="background: {{ prop.value }}" title="{{ prop.name }}"></span>
75
- {% endfor %}
76
- {% elsif image_variation and image_variation.props %}
77
- {% for prop in image_variation.props limit: 4 %}
78
- <span class="ab-plist-swatch ab-plist-swatch-image" title="{{ prop.name }}">
79
- <img src="{{ prop.value }}" alt="{{ prop.name }}" loading="lazy" />
80
- </span>
81
- {% endfor %}
89
+ <div class="ab-pgrid-info">
90
+ <p class="ab-pgrid-name">{{ product.name }}</p>
91
+
92
+ {% if color_variation and color_variation.props and color_variation.props.size > 0 %}
93
+ {% assign _sw0 = color_variation.props | first %}
94
+ <p class="ab-pgrid-color">{{ _sw0.name }}</p>
95
+ {% elsif image_variation and image_variation.props and image_variation.props.size > 0 %}
96
+ {% assign _sw0 = image_variation.props | first %}
97
+ <p class="ab-pgrid-color">{{ _sw0.name }}</p>
82
98
  {% endif %}
99
+
100
+ <div class="ab-pgrid-price-row">
101
+ {% if product.sale_price and product.sale_price < product.price %}
102
+ <span class="ab-price-old">{{ product.price }} {{ currency }}</span>
103
+ <span class="ab-pgrid-price ab-price-sale">{{ product.sale_price }} {{ currency }}</span>
104
+ {% else %}
105
+ <span class="ab-pgrid-price">{{ product.price }} {{ currency }}</span>
106
+ {% endif %}
107
+ </div>
108
+
109
+ <div class="ab-pgrid-swatches">
110
+ {% if color_variation and color_variation.props %}
111
+ {% for prop in color_variation.props limit: 6 %}
112
+ <span
113
+ class="ab-pgrid-swatch{% if forloop.first %} ab-pgrid-swatch--active{% endif %}"
114
+ style="background: {{ prop.value }}"
115
+ title="{{ prop.name }}"
116
+ ></span>
117
+ {% endfor %}
118
+ {% elsif image_variation and image_variation.props %}
119
+ {% for prop in image_variation.props limit: 6 %}
120
+ <span
121
+ class="ab-pgrid-swatch ab-pgrid-swatch-image{% if forloop.first %} ab-pgrid-swatch--active{% endif %}"
122
+ title="{{ prop.name }}"
123
+ >
124
+ <img src="{{ prop.value }}" alt="{{ prop.name }}" loading="lazy" />
125
+ </span>
126
+ {% endfor %}
127
+ {% endif %}
128
+
129
+ {% if swatch_total > 6 %}
130
+ <span class="ab-pgrid-swatch-more">+{{ swatch_total | minus: 6 }}</span>
131
+ {% endif %}
132
+ </div>
133
+ </div>
134
+ </a>
135
+
136
+ {% unless pgrid_hide_add_btn %}
137
+ <div class="ab-pgrid-card-footer">
138
+ <button
139
+ class="ab-pgrid-cta"
140
+ type="button"
141
+ aria-label="Add to cart"
142
+ onclick="event.preventDefault();event.stopPropagation();this.dispatchEvent(new CustomEvent('quick-add',{bubbles:true,detail:{productId:'{{ product.id }}'}}));"
143
+ >
144
+ <svg class="size-5" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.8999 7.5C8.8999 6.28498 9.88488 5.3 11.0999 5.3H12.8999C14.1149 5.3 15.0999 6.28498 15.0999 7.5C15.0999 7.77615 15.3238 8 15.5999 8C15.876 8 16.0999 7.77615 16.0999 7.5C16.0999 5.73269 14.6672 4.3 12.8999 4.3H11.0999C9.33259 4.3 7.8999 5.73269 7.8999 7.5C7.8999 7.77615 8.12376 8 8.3999 8C8.67604 8 8.8999 7.77615 8.8999 7.5ZM5.7998 15.6V9.39999H18.1998V15.6C18.1998 17.0359 17.0357 18.2 15.5998 18.2H8.39981C6.96387 18.2 5.7998 17.0359 5.7998 15.6ZM4.7998 9.29999C4.7998 8.80294 5.20275 8.39999 5.6998 8.39999H18.2998C18.7969 8.39999 19.1998 8.80294 19.1998 9.29999V15.6C19.1998 17.5882 17.588 19.2 15.5998 19.2H8.39981C6.41158 19.2 4.7998 17.5882 4.7998 15.6V9.29999Z" fill="currentColor"></path></svg>
145
+ <span class="ab-pgrid-cta-label">ADD TO CART</span>
146
+ </button>
83
147
  </div>
84
- </div>
85
- </a>
148
+ {% endunless %}
149
+ </div>
86
150
  {% endfor %}
87
151
  </div>
88
152
  </section>
@@ -1,27 +1,38 @@
1
1
  <div class="ab-reviews">
2
2
  <div class="ab-reviews-header">
3
- <h2 class="ab-reviews-title">{{ t_users_reviews }}</h2>
3
+ <h2 class="ab-reviews-title">Real customer reviews</h2>
4
4
  <div class="ab-reviews-summary">
5
+ <span class="ab-reviews-count">{{ average_rating_display }} </span>
5
6
  <div class="ab-reviews-avg-stars">
6
- {% assign avg_full = average_rating | floor %}
7
- {% assign avg_decimal = average_rating | minus: avg_full %}
8
- {% assign avg_has_half = false %}
9
- {% if avg_decimal >= 0.25 and avg_decimal < 0.75 %}
10
- {% assign avg_has_half = true %}
11
- {% elsif avg_decimal >= 0.75 %}
12
- {% assign avg_full = avg_full | plus: 1 %}
13
- {% endif %}
14
- {% for i in (1..5) %}
15
- {% if i <= avg_full %}
16
- <span class="ab-pd-star ab-pd-star-filled"></span>
17
- {% elsif avg_has_half and i == avg_full | plus: 1 %}
18
- <span class="ab-pd-star ab-pd-star-half"></span>
19
- {% else %}
20
- <span class="ab-pd-star ab-pd-star-empty"></span>
21
- {% endif %}
22
- {% endfor %}
23
- </div>
24
- <span class="ab-reviews-count">{{ average_rating_display }} ({{ reviews_count }} {{ t_reviews }})</span>
7
+ {% if reviews_count > 0 %}
8
+ {% assign avg_full = average_rating | floor %}
9
+ {% assign avg_decimal = average_rating | minus: avg_full %}
10
+ {% assign avg_has_half = false %}
11
+
12
+ {% if avg_decimal >= 0.25 and avg_decimal < 0.75 %}
13
+ {% assign avg_has_half = true %}
14
+ {% elsif avg_decimal >= 0.75 %}
15
+ {% assign avg_full = avg_full | plus: 1 %}
16
+ {% endif %}
17
+
18
+ {% assign half_star_index = avg_full | plus: 1 %}
19
+
20
+ {% for i in (1..5) %}
21
+ {% if i <= avg_full %}
22
+ <span class="ab-pd-star ab-pd-star-filled"></span>
23
+ {% elsif avg_has_half and i == half_star_index %}
24
+ <span class="ab-pd-star ab-pd-star-half"></span>
25
+ {% else %}
26
+ <span class="ab-pd-star ab-pd-star-empty"></span>
27
+ {% endif %}
28
+ {% endfor %}
29
+ {% else %}
30
+ {% for i in (1..5) %}
31
+ <span class="ab-pd-star ab-pd-star-empty"></span>
32
+ {% endfor %}
33
+ {% endif %}
34
+ </div>
35
+ <span class="ab-reviews-count"> ({{ reviews_count }} {{ t_reviews }})</span>
25
36
  </div>
26
37
  <button class="ab-reviews-write-btn" type="button" onclick="this.dispatchEvent(new CustomEvent('review-open',{bubbles:true}))">{{ t_share_your_review }}</button>
27
38
  </div>
@@ -30,14 +41,18 @@
30
41
  {% for review in reviews %}
31
42
  <div class="ab-review-card">
32
43
  <div class="ab-review-stars">
33
- {% for i in (1..5) %}
34
- {% if i <= review.rating %}
35
- <span class="ab-pd-star ab-pd-star-filled"></span>
36
- {% else %}
37
- <span class="ab-pd-star ab-pd-star-empty"></span>
38
- {% endif %}
39
- {% endfor %}
40
- </div>
44
+ <div class="stars-wrapper">
45
+ {% for i in (1..5) %}
46
+ {% if i <= review.rating %}
47
+ <span class="ab-pd-star ab-pd-star-filled"></span>
48
+ {% else %}
49
+ <span class="ab-pd-star ab-pd-star-empty"></span>
50
+ {% endif %}
51
+ {% endfor %}
52
+ </div>
53
+
54
+ <span class="verified-badge">Verified Buyer</span>
55
+ </div>
41
56
  {% if review.user_name and review.user_name != "" %}
42
57
  <h3 class="ab-review-author">{{ review.user_name }}</h3>
43
58
  {% endif %}