@extends('layouts.nova') @php use App\Banner; @endphp @php $seoPage = max(1, (int) request()->query('page', 1)); $seoBase = url()->current(); $seoQ = request()->query(); unset($seoQ['page']); $seoUrl = fn(int $p) => $seoBase . ($p > 1 ? '?' . http_build_query(array_merge($seoQ, ['page' => $p])) : (count($seoQ) ? '?' . http_build_query($seoQ) : '')); $seoPrev = $seoPage > 1 ? $seoUrl($seoPage - 1) : null; $seoNext = (isset($artworks) && method_exists($artworks, 'nextPageUrl')) ? $artworks->nextPageUrl() : null; @endphp @push('head') @if($seoPrev)@endif @if($seoNext)@endif {{-- OpenGraph --}} {{-- Twitter card --}} @endpush @php // ── Rank API endpoint ──────────────────────────────────────────────────── // Map the active sort alias to the ranking API ?type= parameter. // Only trending / fresh / top-rated have pre-computed ranking lists. $rankTypeMap = [ 'trending' => 'trending', 'fresh' => 'new_hot', 'top-rated' => 'best', ]; $rankApiType = $rankTypeMap[$current_sort ?? 'trending'] ?? null; $rankApiEndpoint = null; if ($rankApiType) { if (isset($category) && $category && $category->id ?? null) { $rankApiEndpoint = '/api/rank/category/' . $category->id; } elseif (isset($contentType) && $contentType && $contentType->slug ?? null) { $rankApiEndpoint = '/api/rank/type/' . $contentType->slug; } else { $rankApiEndpoint = '/api/rank/global'; } } @endphp @section('content')
@php Banner::ShowResponsiveAd(); @endphp
{{-- ═══════════════════════════════════════════════════════════════ --}} {{-- HERO HEADER --}} {{-- ═══════════════════════════════════════════════════════════════ --}}
{{-- Animated gradient overlays --}}
{{-- Breadcrumb --}} {{-- Glass title panel --}}

{{ $hero_title ?? 'Browse Artworks' }}

@if(!empty($hero_description))

{!! $hero_description !!}

@endif @if(is_object($artworks) && method_exists($artworks, 'total') && $artworks->total() > 0)
{{ number_format($artworks->total()) }} artworks
@endif
{{-- ═══════════════════════════════════════════════════════════════ --}} {{-- RANKING TABS --}} {{-- ═══════════════════════════════════════════════════════════════ --}} @php $rankingTabs = [ ['value' => 'trending', 'label' => 'Trending', 'icon' => '🔥'], ['value' => 'fresh', 'label' => 'New & Hot', 'icon' => '🚀'], ['value' => 'top-rated', 'label' => 'Best', 'icon' => '⭐'], ['value' => 'latest', 'label' => 'Latest', 'icon' => '🕐'], ]; $activeTab = $current_sort ?? 'trending'; @endphp {{-- ═══════════════════════════════════════════════════════════════ --}} {{-- HORIZONTAL CATEGORY FILTER ROW --}} {{-- ═══════════════════════════════════════════════════════════════ --}} @php $filterItems = $subcategories ?? collect(); $activeFilterId = isset($category) ? ($category->id ?? null) : null; $categoryAllHref = isset($contentType) && $contentType ? url('/' . $contentType->slug) : url('/browse'); $activeSortSlug = $activeTab !== 'trending' ? $activeTab : null; @endphp @if($filterItems->isNotEmpty())
@php $allHref = $categoryAllHref . ($activeSortSlug ? '?sort=' . $activeSortSlug : ''); $carouselItems = [[ 'label' => 'All', 'href' => $allHref, 'active' => !$activeFilterId, ]]; foreach ($filterItems as $sub) { $subName = $sub->name ?? $sub->category_name ?? null; $subUrl = $sub->url ?? null; if (! $subUrl && isset($sub->slug) && isset($contentType) && $contentType) { $subUrl = url('/' . $contentType->slug . '/' . $sub->slug); } if (! $subName || ! $subUrl) { continue; } $sep = str_contains($subUrl, '?') ? '&' : '?'; $subLinkHref = $activeSortSlug ? ($subUrl . $sep . 'sort=' . $activeSortSlug) : $subUrl; $isActiveSub = $activeFilterId && isset($sub->id) && (int) $sub->id === (int) $activeFilterId; $carouselItems[] = [ 'label' => $subName, 'href' => $subLinkHref, 'active' => $isActiveSub, ]; } @endphp
@endif @php $galleryItems = (is_object($artworks) && method_exists($artworks, 'getCollection')) ? $artworks->getCollection() : collect($artworks); $galleryArtworks = $galleryItems->map(fn ($art) => [ 'id' => $art->id ?? null, 'name' => $art->name ?? null, 'thumb' => $art->thumb_url ?? $art->thumb ?? null, 'thumb_srcset' => $art->thumb_srcset ?? null, 'uname' => $art->uname ?? '', 'username' => $art->username ?? $art->uname ?? '', 'avatar_url' => $art->avatar_url ?? null, 'category_name' => $art->category_name ?? '', 'category_slug' => $art->category_slug ?? '', 'slug' => $art->slug ?? '', 'width' => $art->width ?? null, 'height' => $art->height ?? null, ])->values(); $galleryNextPageUrl = (is_object($artworks) && method_exists($artworks, 'nextPageUrl')) ? $artworks->nextPageUrl() : null; @endphp
@if($galleryItems->isEmpty())
No artworks found yet. Check back soon.
@else
@endif
{{-- ─── Filter Slide-over Panel ──────────────────────────────────── --}} @include('gallery._filter_panel')
@endsection @push('head') @endpush @push('scripts') @vite('resources/js/entry-masonry-gallery.jsx') @vite('resources/js/entry-pill-carousel.jsx') @endpush