GG.deals clone: CodeIgniter 4 + MongoDB game price tracker
- 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
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
<?= $this->extend('layout') ?>
|
||||
<?= $this->section('content') ?>
|
||||
|
||||
<div class="mb-6">
|
||||
<h1 class="text-2xl font-extrabold text-white tracking-tight">Stores</h1>
|
||||
<p class="text-sm text-muted mt-1">All <?= count($stores) ?> stores tracked by GG.deals — official stores and keyshop marketplaces.</p>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3">
|
||||
<?php foreach ($stores as $s): ?>
|
||||
<a href="/?stores[]=<?= $s['code'] ?>&kind=<?= $s['kind'] ?>"
|
||||
class="group bg-card border border-line rounded-xl p-4 hover:border-accent/50 transition-colors">
|
||||
<div class="flex items-center gap-3">
|
||||
<?= view('partials/store_badge', ['store' => $s]) ?>
|
||||
<div class="min-w-0 flex-1">
|
||||
<div class="text-sm font-semibold text-zinc-100 truncate group-hover:text-accent"><?= esc($s['name']) ?></div>
|
||||
<div class="kind-tag <?= $s['kind'] === 'official' ? 'kind-official' : 'kind-keyshop' ?> mt-0.5 inline-block">
|
||||
<?= $s['kind'] === 'official' ? 'Official store' : 'Keyshop' ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-3 grid grid-cols-3 gap-2 text-center">
|
||||
<div>
|
||||
<div class="text-lg font-extrabold text-zinc-100"><?= (int) $s['deals'] ?></div>
|
||||
<div class="text-[10px] uppercase tracking-wider text-muted">Deals</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-lg font-extrabold text-accent"><?= $s['min_price'] !== null ? money($s['min_price']) : '—' ?></div>
|
||||
<div class="text-[10px] uppercase tracking-wider text-muted">From</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-lg font-extrabold text-zinc-100">-<?= $s['avg_cut'] ?>%</div>
|
||||
<div class="text-[10px] uppercase tracking-wider text-muted">Avg cut</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<?= $this->endSection() ?>
|
||||
Reference in New Issue
Block a user