Files
HokmPlay/site/app/page.tsx
T
soroush.asadi 5d38312ef0
CI/CD / CI - API (dotnet build + engine sim) (push) Successful in 4m40s
CI/CD / CI - Web (tsc + next build) (push) Successful in 1m7s
CI/CD / Deploy - local stack (db + server + web) (push) Failing after 41s
Marketing site (bargevasat.ir) + admin-editable store links + subdomain split
- New standalone Next.js marketing site under site/ (static export, SEO):
  landing, download/install guide (Bazaar/Myket/iOS-PWA/web), FAQ (JSON-LD),
  privacy, terms, support, /admin link editor. fa RTL, sitemap/robots/manifest.
- Backend: SiteLinksService (JSON-file persisted) + GET /api/site/links (public)
  + POST /api/admin/site/links (X-Admin-Token). ADMIN_TOKEN + Site__DataDir via env.
- compose: hokm-site service (:1520) + hokm_data volume for links JSON.
- CI deploy job builds + deploys the site container.
- deploy/SUBDOMAIN_SPLIT.md: nginx blocks, cert reissue, DNS, ENV split.
- Exclude site/ from root tsc + web docker context.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 07:19:43 +03:30

113 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
Users, Bot, Trophy, Gift, MessageCircle, Globe, ShieldCheck, Zap, Crown, Star,
} from "lucide-react";
import { DownloadButtons } from "@/components/DownloadButtons";
import { BRAND } from "@/lib/site";
const FEATURES = [
{ icon: Users, title: "حکم ۴ نفره آنلاین", desc: "با بازیکن‌های واقعی از سراسر ایران، دونفره و تیمی بازی کن." },
{ icon: Bot, title: "بازی با هوش مصنوعی", desc: "آفلاین و بدون اینترنت، با ربات‌های هوشمند تمرین کن." },
{ icon: Trophy, title: "لیگ و رتبه‌بندی", desc: "از لیگ مبتدی تا استاد بالا برو و در جدول قهرمانان بدرخش." },
{ icon: Gift, title: "جایزه‌های روزانه", desc: "هر روز سکه بگیر، دستاورد باز کن و جوایز ویژه ببر." },
{ icon: MessageCircle, title: "چت و شکلک", desc: "سر میز با هم‌تیمی و حریف کل‌کل کن؛ استیکرهای فارسی." },
{ icon: Globe, title: "همه‌جا در دسترس", desc: "اندروید، آیفون و مرورگر — پیشرفتت همه‌جا همگام می‌شود." },
];
const STEPS = [
{ n: "۱", title: "وارد شو", desc: "با شماره موبایل ثبت‌نام کن — سریع و رایگان." },
{ n: "۲", title: "میز انتخاب کن", desc: "بازی سریع آنلاین، اتاق خصوصی با دوستان، یا بازی با کامپیوتر." },
{ n: "۳", title: "حکم بزن و ببر", desc: "حاکم شو، خال حکم را انتخاب کن و حریف را کُت کن!" },
];
const STATS = [
{ icon: Zap, label: "بازی سریع", value: "زیر ۱۵ ثانیه شروع" },
{ icon: ShieldCheck, label: "بدون تقلب", value: "سرور منصف و امن" },
{ icon: Crown, label: "کاملاً رایگان", value: "بدون اجبار خرید" },
];
export default function Home() {
return (
<>
{/* Hero */}
<section className="felt card-pattern">
<div className="mx-auto max-w-6xl px-4 py-16 text-center sm:py-24">
<span className="inline-flex items-center gap-1.5 rounded-full glass px-3 py-1 text-xs text-gold-soft">
<Star size={13} /> بازی حکمِ ایرانی، حرفهایتر از همیشه
</span>
<h1 className="mx-auto mt-6 max-w-3xl text-4xl font-black leading-tight sm:text-6xl">
<span className="gold-text">{BRAND.nameFa}</span>
<br />
بازی حکم آنلاین با دوستان
</h1>
<p className="mx-auto mt-5 max-w-2xl text-base leading-8 text-cream/70 sm:text-lg">
{BRAND.descFa}
</p>
<div className="mt-9 flex justify-center">
<DownloadButtons variant="hero" />
</div>
<div className="mx-auto mt-12 grid max-w-3xl gap-3 sm:grid-cols-3">
{STATS.map((s) => (
<div key={s.label} className="glass rounded-2xl px-4 py-4">
<s.icon className="mx-auto text-teal" size={22} />
<div className="mt-2 text-sm font-bold text-cream">{s.label}</div>
<div className="text-xs text-cream/55">{s.value}</div>
</div>
))}
</div>
</div>
</section>
{/* Features */}
<section id="features" className="mx-auto max-w-6xl px-4 py-16">
<h2 className="text-center text-3xl font-black sm:text-4xl">
چرا <span className="gold-text">برگ وسط</span>؟
</h2>
<p className="mx-auto mt-3 max-w-xl text-center text-cream/60">
همهٔ چیزی که یک بازی حکم بینقص لازم دارد، در یک اپ.
</p>
<div className="mt-10 grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
{FEATURES.map((f) => (
<div key={f.title} className="glass rounded-2xl p-6 transition hover:border-gold/40">
<f.icon className="text-gold" size={28} />
<h3 className="mt-4 text-lg font-bold text-cream">{f.title}</h3>
<p className="mt-2 text-sm leading-7 text-cream/65">{f.desc}</p>
</div>
))}
</div>
</section>
{/* How to play */}
<section className="mx-auto max-w-6xl px-4 py-16">
<div className="glass rounded-3xl p-8 sm:p-12">
<h2 className="text-center text-3xl font-black sm:text-4xl">در ۳ قدم شروع کن</h2>
<div className="mt-10 grid gap-6 sm:grid-cols-3">
{STEPS.map((s) => (
<div key={s.n} className="text-center">
<div className="mx-auto flex h-14 w-14 items-center justify-center rounded-full btn-gold text-2xl font-black">
{s.n}
</div>
<h3 className="mt-4 text-lg font-bold text-cream">{s.title}</h3>
<p className="mt-2 text-sm leading-7 text-cream/65">{s.desc}</p>
</div>
))}
</div>
</div>
</section>
{/* Final CTA */}
<section className="mx-auto max-w-4xl px-4 py-16 text-center">
<h2 className="text-3xl font-black sm:text-4xl">
همین حالا <span className="gold-text">حکم</span> را شروع کن
</h2>
<p className="mx-auto mt-3 max-w-lg text-cream/65">
رایگان روی مرورگر بازی کن یا اپ را روی گوشیات نصب کن.
</p>
<div className="mt-8 flex justify-center">
<DownloadButtons variant="full" />
</div>
</section>
</>
);
}