- Full gg.deals-style UI: deal feed with filters, game pages with price history charts, rankings, vouchers, news, prepaids, subscriptions, bundles, franchises, wishlist, API docs - Real data crawlers: * gg:crawl (Steam Store API + GOG Catalog + Epic free games) * gg:catalog (252K game slugs from gg.deals sitemaps) * gg:ggdeals (per-game prices via FlareSolverr session, JSON-LD parsing) * gg:seed / gg:crawl-covers (demo seed + Steam CDN cover art) - 24/7 self-updating scheduler (scripts/scheduler_loop.php, lockfile-protected) - Tailwind v4 dark/light theme, Alpine.js, Chart.js
41 lines
2.1 KiB
PHP
41 lines
2.1 KiB
PHP
<?= $this->extend('layout') ?>
|
|
<?= $this->section('content') ?>
|
|
|
|
<div class="mb-6">
|
|
<h1 class="text-2xl font-extrabold text-white tracking-tight"><?= esc($franchise['name']) ?> Franchise</h1>
|
|
<p class="text-sm text-muted mt-1">All games in the <?= esc($franchise['name']) ?> series with current best prices.</p>
|
|
</div>
|
|
|
|
<div class="grid sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-3 mb-8">
|
|
<?php foreach ($games as $g): ?>
|
|
<a href="/game/<?= $g['slug'] ?>" class="group bg-card border border-line rounded-xl overflow-hidden hover:border-accent/50 transition-colors">
|
|
<div class="relative">
|
|
<img src="<?= esc($g['cover']['file']) ?>" alt="<?= esc($g['title']) ?>" class="w-full h-[105px] object-cover group-hover:opacity-90 transition-opacity">
|
|
<span class="absolute top-2 right-2 score-chip">MC <?= (int) $g['score'] ?></span>
|
|
</div>
|
|
<div class="p-3">
|
|
<div class="text-sm font-semibold text-zinc-100 truncate group-hover:text-accent"><?= esc($g['title']) ?></div>
|
|
<div class="mt-1 flex items-center justify-between text-xs">
|
|
<span class="text-muted"><?= money($g['base_price']) ?></span>
|
|
<span class="text-accent font-extrabold"><?= money(min($g['best_official']['price'], $g['best_keyshop']['price'])) ?></span>
|
|
</div>
|
|
</div>
|
|
</a>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<?php if ($allFranchises !== []): ?>
|
|
<div class="bg-panel border border-line rounded-2xl p-5">
|
|
<h2 class="text-sm font-bold text-zinc-200 uppercase tracking-wider mb-3">All franchises</h2>
|
|
<div class="flex flex-wrap gap-2">
|
|
<?php foreach ($allFranchises as $f): ?>
|
|
<a href="/franchise/<?= esc($f['slug']) ?>" class="chip hover:border-accent/60 transition-colors">
|
|
<?= esc($f['name']) ?> <span class="text-muted">(<?= count($f['games']) ?>)</span>
|
|
</a>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?= $this->endSection() ?>
|