Files
cleargame/resources/views/games/show.blade.php
T
2025-07-11 12:56:44 +03:00

528 lines
29 KiB
PHP

@extends('layouts.app')
@section('title', $game->name)
@section('content')
<!-- Hero Section -->
<div class="game-hero position-relative mb-5">
@if($game->screenshots()->count())
<div class="game-hero-bg position-absolute w-100 h-100" style="background: linear-gradient(rgba(18, 18, 18, 0.7), rgba(18, 18, 18, 1)), url('{{ $game->screenshots()->first()->url }}') no-repeat center center; background-size: cover; filter: blur(3px); z-index: -1;"></div>
@else
<div class="game-hero-bg position-absolute w-100 h-100" style="background: linear-gradient(rgba(18, 18, 18, 0.9), rgba(18, 18, 18, 1)); z-index: -1;"></div>
@endif
<div class="container py-5">
<div class="row align-items-center">
<div class="col-lg-3 col-md-4 mb-4 mb-md-0">
<div class="game-cover position-relative">
<img src="{{ $game->cover_url }}" class="img-fluid rounded shadow-lg" alt="{{ $game->name }}">
@if($game->rating)
<div class="position-absolute top-0 end-0 bg-dark bg-opacity-75 p-2 rounded-circle m-2 shadow">
<div class="d-flex align-items-center justify-content-center">
<span class="fw-bold text-warning">{{ number_format($game->rating, 1) }}</span>
</div>
</div>
@endif
</div>
</div>
<div class="col-lg-9 col-md-8">
<h1 class="display-4 fw-bold mb-2">{{ $game->name }}</h1>
<div class="d-flex flex-wrap gap-2 mb-3">
@foreach($game->genres()->get() as $genre)
<span class="badge bg-primary">{{ $genre->name }}</span>
@endforeach
</div>
<div class="d-flex flex-wrap gap-2 mb-4">
@foreach($game->platforms()->get() as $platform)
<span class="badge bg-secondary">{{ $platform->name }}</span>
@endforeach
</div>
<p class="lead mb-4">{{ Str::limit($game->summary, 200) }}</p>
<div class="d-flex flex-wrap gap-3 align-items-center">
<div class="d-flex align-items-center">
<i class="far fa-calendar-alt me-2"></i>
<span>{{ $game->first_release_date->format('F j, Y') }}</span>
</div>
@if($game->rating)
<div class="d-flex align-items-center">
<div class="rating-stars d-flex gap-1">
@for($i = 1; $i <= 5; $i++)
<i class="fas fa-star {{ $i <= ($game->rating/20) ? 'text-warning' : 'text-secondary' }}"></i>
@endfor
</div>
<span class="ms-2">({{ number_format($game->rating_count) }} ratings)</span>
</div>
@endif
@auth
<div class="dropdown">
<button class="btn btn-outline-primary dropdown-toggle" type="button" id="addToListDropdown"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="fas fa-plus me-2"></i>Add to List
</button>
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="addToListDropdown">
@foreach(Auth::user()->lists as $list)
<li>
<form action="{{ route('lists.addGame', $list) }}" method="POST" class="d-inline">
@csrf
<input type="hidden" name="game_id" value="{{ $game->id }}">
<button type="submit" class="dropdown-item">
<i class="fas fa-list me-2"></i>{{ $list->name }}
</button>
</form>
</li>
@endforeach
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" href="{{ route('lists.create') }}">
<i class="fas fa-plus me-2"></i>Create New List
</a>
</li>
</ul>
</div>
@endauth
@auth
<a href="{{ route('games.reviews.create', $game) }}" class="btn btn-gradient">
<i class="fas fa-star me-2"></i>Write a Review
</a>
@endauth
</div>
</div>
</div>
</div>
</div>
<div class="container">
<!-- Tabs Navigation -->
<ul class="nav nav-tabs mb-4" id="gameDetailsTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="about-tab" data-bs-toggle="tab" data-bs-target="#about" type="button" role="tab" aria-controls="about" aria-selected="true">
<i class="fas fa-info-circle me-2"></i>About
</button>
</li>
@if($game->screenshots()->count())
<li class="nav-item" role="presentation">
<button class="nav-link" id="media-tab" data-bs-toggle="tab" data-bs-target="#media" type="button" role="tab" aria-controls="media" aria-selected="false">
<i class="fas fa-images me-2"></i>Media
</button>
</li>
@endif
<li class="nav-item" role="presentation">
<button class="nav-link" id="reviews-tab" data-bs-toggle="tab" data-bs-target="#reviews" type="button" role="tab" aria-controls="reviews" aria-selected="false">
<i class="fas fa-comments me-2"></i>Reviews
@if($game->reviews->count() > 0)
<span class="badge bg-primary ms-1">{{ $game->reviews->count() }}</span>
@endif
</button>
</li>
@if($game->similar_games->count() > 0)
<li class="nav-item" role="presentation">
<button class="nav-link" id="similar-tab" data-bs-toggle="tab" data-bs-target="#similar" type="button" role="tab" aria-controls="similar" aria-selected="false">
<i class="fas fa-gamepad me-2"></i>Similar Games
</button>
</li>
@endif
</ul>
<!-- Tabs Content -->
<div class="tab-content" id="gameDetailsTabsContent">
<!-- About Tab -->
<div class="tab-pane fade show active" id="about" role="tabpanel" aria-labelledby="about-tab">
<div class="row">
<div class="col-lg-8">
<div class="card bg-dark text-white mb-4">
<div class="card-header">
<h5 class="mb-0">Summary</h5>
</div>
<div class="card-body">
<p class="card-text">{{ $game->summary }}</p>
@if($game->storyline)
<h6 class="mt-4 mb-2">Storyline</h6>
<p class="card-text">{{ $game->storyline }}</p>
@endif
</div>
</div>
@if($game->dlcs->count() > 0)
<div class="card bg-dark text-white mb-4">
<div class="card-header">
<h5 class="mb-0">DLCs & Expansions</h5>
</div>
<div class="card-body">
<div class="row g-3">
@foreach($game->dlcs as $dlc)
<div class="col-md-6 col-lg-4">
<div class="card bg-dark h-100">
<img src="{{ $dlc->cover_url }}" class="card-img-top" alt="{{ $dlc->name }}">
<div class="card-body">
<h6 class="card-title">{{ $dlc->name }}</h6>
<a href="{{ route('games.show', $dlc) }}" class="btn btn-sm btn-outline-primary mt-2">View Details</a>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
@endif
</div>
<div class="col-lg-4">
<div class="card bg-dark text-white mb-4">
<div class="card-header">
<h5 class="mb-0">Game Details</h5>
</div>
<div class="card-body">
<ul class="list-group list-group-flush bg-transparent">
<li class="list-group-item bg-dark text-white border-secondary">
<div class="d-flex justify-content-between">
<span><i class="far fa-calendar-alt me-2"></i>Release Date</span>
<span class="text-end">{{ $game->first_release_date->format('F j, Y') }}</span>
</div>
</li>
@if($game->rating)
<li class="list-group-item bg-dark text-white border-secondary">
<div class="d-flex justify-content-between">
<span><i class="fas fa-star me-2"></i>Rating</span>
<span class="text-end">{{ number_format($game->rating, 1) }}/100 ({{ number_format($game->rating_count) }} ratings)</span>
</div>
</li>
@endif
<li class="list-group-item bg-dark text-white border-secondary">
<div>
<span><i class="fas fa-tags me-2"></i>Genres</span>
<div class="d-flex flex-wrap gap-1 mt-2">
@foreach($game->genres()->get() as $genre)
<span class="badge bg-primary">{{ $genre->name }}</span>
@endforeach
</div>
</div>
</li>
<li class="list-group-item bg-dark text-white border-secondary">
<div>
<span><i class="fas fa-desktop me-2"></i>Platforms</span>
<div class="d-flex flex-wrap gap-1 mt-2">
@foreach($game->platforms()->get() as $platform)
<span class="badge bg-secondary">{{ $platform->name }}</span>
@endforeach
</div>
</div>
</li>
@if($game->url)
<li class="list-group-item bg-dark text-white border-secondary">
<div class="d-flex justify-content-between">
<span><i class="fas fa-external-link-alt me-2"></i>Website</span>
<a href="{{ $game->url }}" target="_blank" class="text-primary">Visit</a>
</div>
</li>
@endif
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- Media Tab -->
@if($game->screenshots()->count() || $game->videos()->count())
<div class="tab-pane fade" id="media" role="tabpanel" aria-labelledby="media-tab">
@if($game->screenshots()->count())
<div class="card bg-dark text-white mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Screenshots</h5>
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="collapse" data-bs-target="#screenshotsCollapse">
<i class="fas fa-chevron-down"></i>
</button>
</div>
<div class="collapse show" id="screenshotsCollapse">
<div class="card-body">
<div class="row g-3">
@foreach($game->screenshots()->get() as $screenshot)
<div class="col-md-6 col-lg-4">
<a href="{{ $screenshot->url }}" data-lightbox="game-screenshots" data-title="{{ $game->name }} Screenshot">
<img src="{{ $screenshot->url }}" class="img-fluid rounded shadow-sm hover-scale" alt="Game Screenshot">
</a>
</div>
@endforeach
</div>
</div>
</div>
</div>
@endif
@if($game->videos()->count())
<div class="card bg-dark text-white mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Videos</h5>
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="collapse" data-bs-target="#videosCollapse">
<i class="fas fa-chevron-down"></i>
</button>
</div>
<div class="collapse show" id="videosCollapse">
<div class="card-body">
<div class="row g-3">
@foreach($game->videos()->get() as $video)
<div class="col-md-6">
<div class="card bg-dark border-secondary">
<div class="ratio ratio-16x9">
<iframe src="https://www.youtube.com/embed/{{ $video->video_id }}"
title="{{ $video->name }}" allowfullscreen></iframe>
</div>
<div class="card-body">
<h6 class="card-title">{{ $video->name }}</h6>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@endif
</div>
@endif
<!-- Reviews Tab -->
<div class="tab-pane fade" id="reviews" role="tabpanel" aria-labelledby="reviews-tab">
<div class="card bg-dark text-white mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">User Reviews</h5>
@auth
<a href="{{ route('games.reviews.create', $game) }}" class="btn btn-gradient btn-sm">
<i class="fas fa-plus me-2"></i>Write a Review
</a>
@endauth
</div>
<div class="card-body">
@if($game->reviews->isEmpty())
<div class="text-center py-5">
<i class="fas fa-comments fa-3x text-muted mb-3"></i>
<p class="text-muted mb-3">No reviews yet. Be the first to review this game!</p>
@auth
<a href="{{ route('games.reviews.create', $game) }}" class="btn btn-gradient">
<i class="fas fa-plus me-2"></i>Write a Review
</a>
@else
<a href="{{ route('login') }}" class="btn btn-gradient">
<i class="fas fa-sign-in-alt me-2"></i>Login to Write a Review
</a>
@endauth
</div>
@else
<div class="row mb-4">
<div class="col-md-4">
<div class="card bg-dark border-secondary h-100">
<div class="card-body text-center">
<h2 class="display-4 fw-bold text-warning mb-0">
{{ number_format($game->reviews->avg('rating'), 1) }}
</h2>
<div class="rating-stars d-flex gap-1 justify-content-center my-2">
@for($i = 1; $i <= 5; $i++)
<i class="fas fa-star {{ $i <= ($game->reviews->avg('rating')/2) ? 'text-warning' : 'text-secondary' }}"></i>
@endfor
</div>
<p class="text-muted">Based on {{ $game->reviews->count() }} reviews</p>
<div class="d-flex justify-content-center gap-3">
<div class="text-center">
<span class="d-block fw-bold text-success">{{ $game->reviews->where('recommended', true)->count() }}</span>
<small class="text-muted">Recommended</small>
</div>
<div class="text-center">
<span class="d-block fw-bold text-danger">{{ $game->reviews->where('recommended', false)->count() }}</span>
<small class="text-muted">Not Recommended</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-8">
<div class="card bg-dark border-secondary h-100">
<div class="card-body">
<h6 class="mb-3">Rating Distribution</h6>
@for($i = 10; $i >= 1; $i--)
@php
$count = $game->reviews->where('rating', '>=', ($i-1)*2)->where('rating', '<', $i*2)->count();
$percentage = $game->reviews->count() > 0 ? ($count / $game->reviews->count()) * 100 : 0;
@endphp
<div class="d-flex align-items-center mb-2">
<div class="rating-label me-2" style="width: 30px;">{{ $i*2-1 }}-{{ $i*2 }}</div>
<div class="progress flex-grow-1" style="height: 10px;">
<div class="progress-bar bg-warning" role="progressbar" style="width: {{ $percentage }}%"></div>
</div>
<div class="ms-2" style="width: 40px;">{{ $count }}</div>
</div>
@endfor
</div>
</div>
</div>
</div>
<div class="reviews-list">
@foreach($game->reviews as $review)
<div class="card bg-dark border-secondary mb-4">
<div class="card-header">
<div class="d-flex justify-content-between align-items-center">
<div class="d-flex align-items-center">
<div class="me-3">
<i class="fas fa-user-circle fa-2x"></i>
</div>
<div>
<h6 class="mb-0">
<a href="{{ route('profile.show', $review->user) }}" class="text-white text-decoration-none">
{{ $review->user->name }}
</a>
</h6>
<small class="text-muted">
<i class="far fa-clock"></i> {{ $review->created_at->diffForHumans() }}
</small>
</div>
</div>
<div class="d-flex align-items-center">
<div class="rating-badge me-2 px-2 py-1 rounded" style="background-color: {{ $review->rating >= 15 ? '#28a745' : ($review->rating >= 10 ? '#ffc107' : '#dc3545') }};">
<span class="fw-bold">{{ $review->rating }}/20</span>
</div>
@if($review->recommended)
<span class="badge bg-success">Recommended</span>
@else
<span class="badge bg-danger">Not Recommended</span>
@endif
</div>
</div>
</div>
<div class="card-body">
<div class="review-content">
{!! nl2br(e(Str::limit($review->content, 300))) !!}
@if(strlen($review->content) > 300)
<a href="{{ route('reviews.show', $review) }}" class="text-primary">Read more</a>
@endif
</div>
</div>
<div class="card-footer bg-dark border-top border-secondary">
<div class="d-flex justify-content-between align-items-center">
<a href="{{ route('reviews.show', $review) }}" class="btn btn-link text-white p-0">
Read full review
</a>
@if(auth()->id() === $review->user_id)
<div class="d-flex gap-2">
<a href="{{ route('reviews.edit', $review) }}" class="btn btn-outline-primary btn-sm">
<i class="fas fa-edit"></i> Edit
</a>
<form action="{{ route('reviews.destroy', $review) }}" method="POST" class="d-inline">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-outline-danger btn-sm" onclick="return confirm('Are you sure you want to delete this review?')">
<i class="fas fa-trash"></i> Delete
</button>
</form>
</div>
@endif
</div>
</div>
</div>
@endforeach
</div>
@endif
</div>
</div>
</div>
<!-- Similar Games Tab -->
@if($game->similar_games->count() > 0)
<div class="tab-pane fade" id="similar" role="tabpanel" aria-labelledby="similar-tab">
<div class="card bg-dark text-white">
<div class="card-header">
<h5 class="mb-0">Similar Games You Might Like</h5>
</div>
<div class="card-body">
<div class="row g-4">
@foreach($game->similar_games as $similar)
<div class="col-md-6 col-lg-3">
<div class="card bg-dark h-100 hover-scale">
<a href="{{ route('games.show', $similar) }}" class="text-decoration-none">
<img src="{{ $similar->cover_url }}" class="card-img-top" alt="{{ $similar->name }}">
<div class="card-body">
<h6 class="card-title text-white">{{ $similar->name }}</h6>
<p class="card-text text-muted small">{{ $similar->first_release_date->format('Y') }}</p>
@if($similar->rating)
<div class="d-flex align-items-center mt-2">
<div class="rating-stars d-flex gap-1">
@for($i = 1; $i <= 5; $i++)
<i class="fas fa-star {{ $i <= ($similar->rating/20) ? 'text-warning' : 'text-secondary' }}"></i>
@endfor
</div>
<span class="ms-2 small">{{ number_format($similar->rating, 1) }}</span>
</div>
@endif
</div>
</a>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@endif
</div>
</div>
<style>
.game-hero {
min-height: 400px;
display: flex;
align-items: center;
}
.hover-scale {
transition: transform 0.3s ease;
}
.hover-scale:hover {
transform: scale(1.03);
}
.nav-tabs {
border-bottom: 1px solid #343a40;
}
.nav-tabs .nav-link {
color: #eaeaea;
border: none;
border-bottom: 2px solid transparent;
padding: 0.75rem 1rem;
}
.nav-tabs .nav-link:hover {
border-color: transparent;
border-bottom: 2px solid var(--accent);
}
.nav-tabs .nav-link.active {
color: var(--accent);
background-color: transparent;
border-color: transparent;
border-bottom: 2px solid var(--accent);
}
.btn-gradient {
background: linear-gradient(90deg, var(--primary), var(--accent));
border: none;
color: white;
}
.btn-gradient:hover {
opacity: 0.9;
color: white;
}
.btn-outline-primary {
border-color: var(--primary);
color: var(--primary);
}
.btn-outline-primary:hover {
background-color: var(--primary);
color: white;
}
</style>
@endsection