easyorders 0.1.14 → 0.1.15
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.
- package/README.md +93 -93
- package/dist/bin/cli.js +12 -5
- package/dist/template/theme/config.json +95 -95
- package/dist/template/theme/home-sections/category-mosaic/config.json +40 -40
- package/dist/template/theme/home-sections/category-mosaic/template.liquid +155 -155
- package/dist/template/theme/home-sections/editorial-feature/config.json +67 -67
- package/dist/template/theme/home-sections/editorial-feature/template.liquid +153 -153
- package/dist/template/theme/home-sections/newsletter-luxe/config.json +60 -60
- package/dist/template/theme/home-sections/newsletter-luxe/template.liquid +144 -144
- package/dist/template/theme/home-sections/runway-hero/config.json +91 -91
- package/dist/template/theme/home-sections/runway-hero/template.liquid +159 -159
- package/dist/template/theme/home-sections/shop-the-look/config.json +75 -75
- package/dist/template/theme/home-sections/shop-the-look/template.liquid +304 -304
- package/dist/template/theme/home-sections/trust-promise/config.json +47 -47
- package/dist/template/theme/home-sections/trust-promise/template.liquid +96 -96
- package/dist/template/theme/schema.json +151 -151
- package/dist/template/theme/script.js +586 -586
- package/dist/template/theme/sections/breadcrumbs.liquid +17 -17
- package/dist/template/theme/sections/categories.liquid +9 -9
- package/dist/template/theme/sections/fake-counter.liquid +27 -27
- package/dist/template/theme/sections/fake-stock.liquid +6 -6
- package/dist/template/theme/sections/fake-visitor.liquid +6 -6
- package/dist/template/theme/sections/featured-products.liquid +110 -110
- package/dist/template/theme/sections/fixed-buy-button.liquid +46 -46
- package/dist/template/theme/sections/footer.liquid +128 -128
- package/dist/template/theme/sections/gallery.liquid +61 -61
- package/dist/template/theme/sections/header.liquid +152 -152
- package/dist/template/theme/sections/home-products-grid.liquid +109 -109
- package/dist/template/theme/sections/list-products.liquid +93 -93
- package/dist/template/theme/sections/order-invoice.liquid +154 -154
- package/dist/template/theme/sections/product-description.liquid +30 -30
- package/dist/template/theme/sections/product-details.liquid +63 -63
- package/dist/template/theme/sections/products-grid.liquid +86 -86
- package/dist/template/theme/sections/related-products.liquid +88 -88
- package/dist/template/theme/sections/reviews.liquid +55 -55
- package/dist/template/theme/sections/slider.liquid +43 -43
- package/dist/template/theme/sections/thanks.liquid +33 -33
- package/dist/template/theme/style.css +3923 -3923
- package/dist/template/theme/theme-data.json +9 -9
- package/package.json +40 -40
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
<div class="ab-pd">
|
|
2
|
-
<h1 class="ab-pd-name">{{ product_name }}</h1>
|
|
3
|
-
|
|
4
|
-
<div class="ab-pd-price-row">
|
|
5
|
-
{% if sale_price and sale_price < price %}
|
|
6
|
-
<span class="ab-pd-price-old">{{ price }} {{ currency }}</span>
|
|
7
|
-
<span class="ab-pd-price ab-pd-price-sale">{{ sale_price }} {{ currency }}</span>
|
|
8
|
-
{% else %}
|
|
9
|
-
<span class="ab-pd-price">{{ price }} {{ currency }}</span>
|
|
10
|
-
{% endif %}
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
{% if rating > 0 %}
|
|
14
|
-
<div class="ab-pd-rating">
|
|
15
|
-
<div class="ab-pd-stars">
|
|
16
|
-
{% assign full_stars = rating | floor %}
|
|
17
|
-
{% assign has_half = false %}
|
|
18
|
-
{% assign decimal = rating | minus: full_stars %}
|
|
19
|
-
{% if decimal >= 0.25 and decimal < 0.75 %}
|
|
20
|
-
{% assign has_half = true %}
|
|
21
|
-
{% elsif decimal >= 0.75 %}
|
|
22
|
-
{% assign full_stars = full_stars | plus: 1 %}
|
|
23
|
-
{% endif %}
|
|
24
|
-
|
|
25
|
-
{% for i in (1..5) %}
|
|
26
|
-
{% if i <= full_stars %}
|
|
27
|
-
<span class="ab-pd-star ab-pd-star-filled"></span>
|
|
28
|
-
{% elsif has_half and i == full_stars | plus: 1 %}
|
|
29
|
-
<span class="ab-pd-star ab-pd-star-half"></span>
|
|
30
|
-
{% else %}
|
|
31
|
-
<span class="ab-pd-star ab-pd-star-empty"></span>
|
|
32
|
-
{% endif %}
|
|
33
|
-
{% endfor %}
|
|
34
|
-
</div>
|
|
35
|
-
<span class="ab-pd-reviews-count">({{ reviews_count }})</span>
|
|
36
|
-
</div>
|
|
37
|
-
{% endif %}
|
|
38
|
-
|
|
39
|
-
{% if description and description != "" %}
|
|
40
|
-
<p class="ab-pd-description">{{ description }}</p>
|
|
41
|
-
{% 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>
|
|
1
|
+
<div class="ab-pd">
|
|
2
|
+
<h1 class="ab-pd-name">{{ product_name }}</h1>
|
|
3
|
+
|
|
4
|
+
<div class="ab-pd-price-row">
|
|
5
|
+
{% if sale_price and sale_price < price %}
|
|
6
|
+
<span class="ab-pd-price-old">{{ price }} {{ currency }}</span>
|
|
7
|
+
<span class="ab-pd-price ab-pd-price-sale">{{ sale_price }} {{ currency }}</span>
|
|
8
|
+
{% else %}
|
|
9
|
+
<span class="ab-pd-price">{{ price }} {{ currency }}</span>
|
|
10
|
+
{% endif %}
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
{% if rating > 0 %}
|
|
14
|
+
<div class="ab-pd-rating">
|
|
15
|
+
<div class="ab-pd-stars">
|
|
16
|
+
{% assign full_stars = rating | floor %}
|
|
17
|
+
{% assign has_half = false %}
|
|
18
|
+
{% assign decimal = rating | minus: full_stars %}
|
|
19
|
+
{% if decimal >= 0.25 and decimal < 0.75 %}
|
|
20
|
+
{% assign has_half = true %}
|
|
21
|
+
{% elsif decimal >= 0.75 %}
|
|
22
|
+
{% assign full_stars = full_stars | plus: 1 %}
|
|
23
|
+
{% endif %}
|
|
24
|
+
|
|
25
|
+
{% for i in (1..5) %}
|
|
26
|
+
{% if i <= full_stars %}
|
|
27
|
+
<span class="ab-pd-star ab-pd-star-filled"></span>
|
|
28
|
+
{% elsif has_half and i == full_stars | plus: 1 %}
|
|
29
|
+
<span class="ab-pd-star ab-pd-star-half"></span>
|
|
30
|
+
{% else %}
|
|
31
|
+
<span class="ab-pd-star ab-pd-star-empty"></span>
|
|
32
|
+
{% endif %}
|
|
33
|
+
{% endfor %}
|
|
34
|
+
</div>
|
|
35
|
+
<span class="ab-pd-reviews-count">({{ reviews_count }})</span>
|
|
36
|
+
</div>
|
|
37
|
+
{% endif %}
|
|
38
|
+
|
|
39
|
+
{% if description and description != "" %}
|
|
40
|
+
<p class="ab-pd-description">{{ description }}</p>
|
|
41
|
+
{% 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>
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
|
|
2
|
-
<section class="ab-pgrid">
|
|
3
|
-
<div class="ab-pgrid-wrap ab-pgrid-wrap--no-hero">
|
|
4
|
-
{% for product in products %}
|
|
5
|
-
{% assign color_variation = product.variations | where: "type", "color" | first %}
|
|
6
|
-
{% assign image_variation = product.variations | where: "type", "image" | first %}
|
|
7
|
-
{% assign swatch_total = 0 %}
|
|
8
|
-
{% if color_variation and color_variation.props %}
|
|
9
|
-
{% assign swatch_total = color_variation.props.size %}
|
|
10
|
-
{% elsif image_variation and image_variation.props %}
|
|
11
|
-
{% assign swatch_total = image_variation.props.size %}
|
|
12
|
-
{% endif %}
|
|
13
|
-
|
|
14
|
-
<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>
|
|
18
|
-
{% endif %}
|
|
19
|
-
|
|
20
|
-
<div class="ab-pgrid-media">
|
|
21
|
-
<img class="ab-pgrid-img-primary" src="{{ product.thumb }}" alt="{{ product.name }}" loading="lazy" />
|
|
22
|
-
{% if product.images[0] %}
|
|
23
|
-
<img class="ab-pgrid-img-hover" src="{{ product.images[0] }}" alt="{{ product.name }}" loading="lazy" />
|
|
24
|
-
{% 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>
|
|
35
|
-
<button
|
|
36
|
-
class="ab-compare-btn"
|
|
37
|
-
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>
|
|
51
|
-
</div>
|
|
52
|
-
|
|
53
|
-
<div class="ab-pgrid-info">
|
|
54
|
-
<p class="ab-pgrid-name">{{ product.name }}</p>
|
|
55
|
-
|
|
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>
|
|
62
|
-
{% endif %}
|
|
63
|
-
</div>
|
|
64
|
-
|
|
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 %}
|
|
77
|
-
|
|
78
|
-
{% if swatch_total > 6 %}
|
|
79
|
-
<span class="ab-pgrid-swatch-more">+{{ swatch_total | minus: 6 }}</span>
|
|
80
|
-
{% endif %}
|
|
81
|
-
</div>
|
|
82
|
-
</div>
|
|
83
|
-
</a>
|
|
84
|
-
{% endfor %}
|
|
85
|
-
</div>
|
|
86
|
-
</section>
|
|
1
|
+
|
|
2
|
+
<section class="ab-pgrid">
|
|
3
|
+
<div class="ab-pgrid-wrap ab-pgrid-wrap--no-hero">
|
|
4
|
+
{% for product in products %}
|
|
5
|
+
{% assign color_variation = product.variations | where: "type", "color" | first %}
|
|
6
|
+
{% assign image_variation = product.variations | where: "type", "image" | first %}
|
|
7
|
+
{% assign swatch_total = 0 %}
|
|
8
|
+
{% if color_variation and color_variation.props %}
|
|
9
|
+
{% assign swatch_total = color_variation.props.size %}
|
|
10
|
+
{% elsif image_variation and image_variation.props %}
|
|
11
|
+
{% assign swatch_total = image_variation.props.size %}
|
|
12
|
+
{% endif %}
|
|
13
|
+
|
|
14
|
+
<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>
|
|
18
|
+
{% endif %}
|
|
19
|
+
|
|
20
|
+
<div class="ab-pgrid-media">
|
|
21
|
+
<img class="ab-pgrid-img-primary" src="{{ product.thumb }}" alt="{{ product.name }}" loading="lazy" />
|
|
22
|
+
{% if product.images[0] %}
|
|
23
|
+
<img class="ab-pgrid-img-hover" src="{{ product.images[0] }}" alt="{{ product.name }}" loading="lazy" />
|
|
24
|
+
{% 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>
|
|
35
|
+
<button
|
|
36
|
+
class="ab-compare-btn"
|
|
37
|
+
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>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class="ab-pgrid-info">
|
|
54
|
+
<p class="ab-pgrid-name">{{ product.name }}</p>
|
|
55
|
+
|
|
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>
|
|
62
|
+
{% endif %}
|
|
63
|
+
</div>
|
|
64
|
+
|
|
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 %}
|
|
77
|
+
|
|
78
|
+
{% if swatch_total > 6 %}
|
|
79
|
+
<span class="ab-pgrid-swatch-more">+{{ swatch_total | minus: 6 }}</span>
|
|
80
|
+
{% endif %}
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</a>
|
|
84
|
+
{% endfor %}
|
|
85
|
+
</div>
|
|
86
|
+
</section>
|
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
<section class="ab-plist ab-plist--related">
|
|
2
|
-
<div class="ab-plist-header">
|
|
3
|
-
{% if section_title %}
|
|
4
|
-
<h2 class="ab-plist-title ab-reveal">{{ section_title }}</h2>
|
|
5
|
-
{% endif %}
|
|
6
|
-
<div class="ab-plist-arrows">
|
|
7
|
-
<button class="ab-plist-arrow ab-plist-prev" aria-label="Previous">
|
|
8
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15 18 9 12 15 6"/></svg>
|
|
9
|
-
</button>
|
|
10
|
-
<button class="ab-plist-arrow ab-plist-next" aria-label="Next">
|
|
11
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 6 15 12 9 18"/></svg>
|
|
12
|
-
</button>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<div class="ab-plist-track">
|
|
17
|
-
{% for product in products %}
|
|
18
|
-
{% assign color_variation = product.variations | where: "type", "color" | first %}
|
|
19
|
-
{% 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>
|
|
25
|
-
{% endif %}
|
|
26
|
-
|
|
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>
|
|
59
|
-
|
|
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>
|
|
68
|
-
{% endif %}
|
|
69
|
-
</div>
|
|
70
|
-
|
|
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 %}
|
|
82
|
-
{% endif %}
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
</a>
|
|
86
|
-
{% endfor %}
|
|
87
|
-
</div>
|
|
88
|
-
</section>
|
|
1
|
+
<section class="ab-plist ab-plist--related">
|
|
2
|
+
<div class="ab-plist-header">
|
|
3
|
+
{% if section_title %}
|
|
4
|
+
<h2 class="ab-plist-title ab-reveal">{{ section_title }}</h2>
|
|
5
|
+
{% endif %}
|
|
6
|
+
<div class="ab-plist-arrows">
|
|
7
|
+
<button class="ab-plist-arrow ab-plist-prev" aria-label="Previous">
|
|
8
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15 18 9 12 15 6"/></svg>
|
|
9
|
+
</button>
|
|
10
|
+
<button class="ab-plist-arrow ab-plist-next" aria-label="Next">
|
|
11
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 6 15 12 9 18"/></svg>
|
|
12
|
+
</button>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div class="ab-plist-track">
|
|
17
|
+
{% for product in products %}
|
|
18
|
+
{% assign color_variation = product.variations | where: "type", "color" | first %}
|
|
19
|
+
{% 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>
|
|
25
|
+
{% endif %}
|
|
26
|
+
|
|
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>
|
|
59
|
+
|
|
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>
|
|
68
|
+
{% endif %}
|
|
69
|
+
</div>
|
|
70
|
+
|
|
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 %}
|
|
82
|
+
{% endif %}
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</a>
|
|
86
|
+
{% endfor %}
|
|
87
|
+
</div>
|
|
88
|
+
</section>
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
<div class="ab-reviews">
|
|
2
|
-
<div class="ab-reviews-header">
|
|
3
|
-
<h2 class="ab-reviews-title">{{ t_users_reviews }}</h2>
|
|
4
|
-
<div class="ab-reviews-summary">
|
|
5
|
-
<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>
|
|
25
|
-
</div>
|
|
26
|
-
<button class="ab-reviews-write-btn" type="button" onclick="this.dispatchEvent(new CustomEvent('review-open',{bubbles:true}))">{{ t_share_your_review }}</button>
|
|
27
|
-
</div>
|
|
28
|
-
|
|
29
|
-
<div class="ab-reviews-list">
|
|
30
|
-
{% for review in reviews %}
|
|
31
|
-
<div class="ab-review-card">
|
|
32
|
-
<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>
|
|
41
|
-
{% if review.user_name and review.user_name != "" %}
|
|
42
|
-
<h3 class="ab-review-author">{{ review.user_name }}</h3>
|
|
43
|
-
{% endif %}
|
|
44
|
-
<p class="ab-review-comment" data-review-comment>{{ review.comment }}</p>
|
|
45
|
-
{% if review.image and review.image != "" %}
|
|
46
|
-
<img src="{{ review.image }}" alt="{{ review.user_name }}" class="ab-review-image" loading="lazy" />
|
|
47
|
-
{% endif %}
|
|
48
|
-
</div>
|
|
49
|
-
{% endfor %}
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
{% if reviews.size == 0 %}
|
|
53
|
-
<p class="ab-reviews-empty">{{ t_no_reviews }}</p>
|
|
54
|
-
{% endif %}
|
|
55
|
-
</div>
|
|
1
|
+
<div class="ab-reviews">
|
|
2
|
+
<div class="ab-reviews-header">
|
|
3
|
+
<h2 class="ab-reviews-title">{{ t_users_reviews }}</h2>
|
|
4
|
+
<div class="ab-reviews-summary">
|
|
5
|
+
<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>
|
|
25
|
+
</div>
|
|
26
|
+
<button class="ab-reviews-write-btn" type="button" onclick="this.dispatchEvent(new CustomEvent('review-open',{bubbles:true}))">{{ t_share_your_review }}</button>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<div class="ab-reviews-list">
|
|
30
|
+
{% for review in reviews %}
|
|
31
|
+
<div class="ab-review-card">
|
|
32
|
+
<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>
|
|
41
|
+
{% if review.user_name and review.user_name != "" %}
|
|
42
|
+
<h3 class="ab-review-author">{{ review.user_name }}</h3>
|
|
43
|
+
{% endif %}
|
|
44
|
+
<p class="ab-review-comment" data-review-comment>{{ review.comment }}</p>
|
|
45
|
+
{% if review.image and review.image != "" %}
|
|
46
|
+
<img src="{{ review.image }}" alt="{{ review.user_name }}" class="ab-review-image" loading="lazy" />
|
|
47
|
+
{% endif %}
|
|
48
|
+
</div>
|
|
49
|
+
{% endfor %}
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
{% if reviews.size == 0 %}
|
|
53
|
+
<p class="ab-reviews-empty">{{ t_no_reviews }}</p>
|
|
54
|
+
{% endif %}
|
|
55
|
+
</div>
|