← back to Dw Theme Compact Toolbar
snippets/other-colorways.liquid
164 lines
{% comment %}
Other Colorways — shows sibling products with the same pattern name
Uses Shopify Predictive Search API to find products sharing the pattern.
Reads dwc.pattern_name metafield; falls back to parsing title before " - " or " | ".
{% endcomment %}
{% assign pattern_name = product.metafields.dwc.pattern_name.value %}
{% unless pattern_name != blank %}
{% assign title_parts = product.title | split: ' | ' %}
{% assign before_pipe = title_parts[0] %}
{% assign dash_parts = before_pipe | split: ' - ' %}
{% if dash_parts.size > 1 %}
{% assign pattern_name = dash_parts[0] | strip %}
{% else %}
{% assign pattern_name = before_pipe | strip %}
{% endif %}
{% endunless %}
{% if pattern_name != blank %}
<div id="dw-other-colorways" data-pattern="{{ pattern_name | escape }}" data-current="{{ product.handle }}" data-vendor="{{ product.vendor | escape }}" style="display:none;">
<style>
.dw-colorways-section {
margin: 24px 0 32px;
padding: 0 20px;
}
.dw-colorways-heading {
font-family: 'Lora', serif;
font-size: 18px;
font-weight: 500;
margin: 0 0 14px;
color: #1a1a1a;
letter-spacing: -0.01em;
}
.dw-colorways-scroll {
display: flex;
gap: 12px;
overflow-x: auto;
padding-bottom: 8px;
scroll-snap-type: x mandatory;
-webkit-overflow-scrolling: touch;
}
.dw-colorways-scroll::-webkit-scrollbar { height: 4px; }
.dw-colorways-scroll::-webkit-scrollbar-track { background: #f0ede8; border-radius: 2px; }
.dw-colorways-scroll::-webkit-scrollbar-thumb { background: #ccc; border-radius: 2px; }
.dw-colorway-card {
flex: 0 0 140px;
scroll-snap-align: start;
text-decoration: none;
color: inherit;
border: 1px solid #e5e2dc;
border-radius: 8px;
overflow: hidden;
background: #fff;
transition: border-color 0.15s, box-shadow 0.15s;
}
.dw-colorway-card:hover {
border-color: #bbb;
box-shadow: 0 2px 10px rgba(0,0,0,0.06);
}
.dw-colorway-card.dw-current {
border-color: #3D4246;
border-width: 2px;
}
.dw-colorway-card img {
width: 100%;
aspect-ratio: 1 / 1;
object-fit: cover;
display: block;
background: #f2f0ec;
}
.dw-colorway-label {
padding: 8px 10px;
font-size: 12px;
line-height: 1.3;
color: #3D4246;
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<div class="dw-colorways-section">
<h3 class="dw-colorways-heading">Other Colorways</h3>
<div class="dw-colorways-scroll" id="dw-colorways-list"></div>
</div>
</div>
<script>
(function() {
var wrapper = document.getElementById('dw-other-colorways');
if (!wrapper) return;
var pattern = wrapper.dataset.pattern;
var currentHandle = wrapper.dataset.current;
var currentVendor = wrapper.dataset.vendor;
if (!pattern) return;
var url = '/search/suggest.json?q=' + encodeURIComponent(pattern) + '&resources[type]=product&resources[limit]=24';
fetch(url)
.then(function(r) { return r.json(); })
.then(function(data) {
var products = (data.resources && data.resources.results && data.resources.results.products) || [];
// Filter: same vendor, has image, and title contains the pattern name
var patternLower = pattern.toLowerCase();
var vendorLower = (currentVendor || '').toLowerCase();
var siblings = products.filter(function(p) {
if (!p.image) return false;
var titleLower = (p.title || '').toLowerCase();
if (titleLower.indexOf(patternLower) === -1) return false;
// Must match vendor to avoid cross-vendor contamination
if (vendorLower) {
var pVendor = ((p.vendor || '')).toLowerCase();
if (pVendor !== vendorLower) return false;
}
return true;
});
if (siblings.length < 2) return; // Need at least 2 (including current) to show section
var container = document.getElementById('dw-colorways-list');
siblings.forEach(function(p) {
var a = document.createElement('a');
a.href = p.url;
a.className = 'dw-colorway-card';
if (p.url.indexOf('/' + currentHandle) !== -1) {
a.className += ' dw-current';
}
var img = document.createElement('img');
img.src = p.image.replace(/(\.[a-z]+)(\?|$)/, '_300x300$1$2');
img.alt = p.title;
img.loading = 'lazy';
a.appendChild(img);
// Extract color from title: "Pattern - Color | Vendor" → "Color"
var label = p.title || '';
var pipeIdx = label.indexOf(' | ');
if (pipeIdx > 0) label = label.substring(0, pipeIdx);
var dashIdx = label.indexOf(' - ');
if (dashIdx > 0) label = label.substring(dashIdx + 3).trim();
else {
// Try removing pattern name prefix
var pi = label.toLowerCase().indexOf(patternLower);
if (pi === 0) label = label.substring(pattern.length).trim();
}
if (!label) label = p.title;
var labelDiv = document.createElement('div');
labelDiv.className = 'dw-colorway-label';
labelDiv.textContent = label;
a.appendChild(labelDiv);
container.appendChild(a);
});
wrapper.style.display = 'block';
})
.catch(function() {});
})();
</script>
{% endif %}