@props(['product', 'tone' => 'light']) @php if (! $product->relationLoaded('variants') || ! $product->relationLoaded('media') || ! $product->relationLoaded('options')) { $product->loadMissing(['variants', 'media', 'options.values']); } $variant = $product->variants->sortBy('price_cents')->first(); $priced = $variant ? app(\App\Domain\Markets\Services\MarketService::class)->priceForVariant($variant) : ['labeled' => 'AUD 0.00']; $thumb = $product->thumbnailMedia() ?? ($product->relationLoaded('media') ? $product->media->first() : null); $imageUrl = $thumb?->publicUrl() ?: ($thumb?->path ? asset('storage/'.$thumb->path) : null); $isDark = $tone === 'dark'; $colourOption = $product->options->first(fn ($o) => in_array(strtolower($o->name), ['colour', 'color'], true)); $sizeOption = $product->options->first(fn ($o) => strtolower($o->name) === 'size'); $styleOption = $product->options->first(fn ($o) => strtolower($o->name) === 'style'); $colours = $colourOption ? $colourOption->values->pluck('value')->filter()->unique()->values() : collect(); $sizes = $sizeOption ? $sizeOption->values->pluck('value')->filter()->unique()->values() : collect(); $styles = $styleOption ? $styleOption->values->pluck('value')->filter()->unique()->values() : collect(); // Fallback when options relation is sparse but variants carry Shopify-style option columns if ($colours->isEmpty() && $sizes->isEmpty() && $styles->isEmpty()) { $option2 = $product->variants->pluck('option2')->filter()->unique()->values(); $knownColours = ['black', 'grey', 'gray', 'red', 'blue', 'white']; if ($option2->isNotEmpty() && $option2->every(fn ($v) => in_array(strtolower($v), $knownColours, true))) { $colours = $option2; } $option1 = $product->variants->pluck('option1')->filter()->unique()->values(); if ($option1->isNotEmpty() && $option1->contains(fn ($v) => preg_match('/\bft\b/i', (string) $v))) { $sizes = $option1; } elseif ($option1->count() > 1) { $styles = $option1; } } // Prefer variant image_path for colour swatches when available $colourImages = []; foreach ($product->variants as $v) { $colour = $v->option2; if ($colour && $v->image_path && ! isset($colourImages[$colour])) { $colourImages[$colour] = str_starts_with($v->image_path, 'http') ? $v->image_path : asset('storage/'.$v->image_path); } } $variantCount = $product->variants->count(); @endphp
merge(['class' => 'store-product-card group '.($isDark ? 'store-product-card-dark' : '')]) }}>
@if($imageUrl) {{ $product->title }} @else @endif @if($product->grade) {{ $product->grade }} @endif @if($variantCount > 1) {{ $variantCount }} options @endif

{{ $product->title }}

From {{ $priced['labeled'] }}

@if($colours->count() > 1)
@foreach($colours->take(6) as $colour) @php $slug = \Illuminate\Support\Str::slug($colour); $bg = $colourImages[$colour] ?? null; @endphp {{ $colour }} @endforeach @if($colours->count() > 6) +{{ $colours->count() - 6 }} @endif
@endif @if($sizes->count() > 1)
@foreach($sizes->take(5) as $size) {{ $size }} @endforeach @if($sizes->count() > 5) +{{ $sizes->count() - 5 }} @endif
@elseif($styles->count() > 1)
@foreach($styles as $style) {{ $style }} @endforeach
@endif
@if($variant)
@csrf @if($variantCount > 1) Choose options @else @endif
@endif