// VEXEL — News, Article, Store, Partners
// ─── NEWS / JOURNAL ──────────────────────────────────────────────────────────
function NewsPage({ go }) {
const [cat, setCat] = useState("All");
const cats = ["All", "Esports", "Tournaments", "Industry", "Game Updates", "Behind the Scenes"];
const featured = NEWS.find(n => n.featured) || NEWS[0];
const filtered = cat === "All" ? NEWS : NEWS.filter(n => n.category === cat);
return (
The Drop · Vexel Journal
News.
{/* Featured article hero */}
go("article", { id: featured.id })} className="lift" style={{ cursor: "pointer", display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 0, border: "1px solid var(--line)", borderRadius: 8, overflow: "hidden", background: "var(--surface)" }}>
FEATURED · {featured.category.toUpperCase()}
{featured.read} read · {featured.date}
{featured.title}
{featured.excerpt}
{featured.author}
SENIOR EDITOR
Read story →
{/* Category chips */}
{cats.map(c => (
setCat(c)} className={"pill " + (c === cat ? "pill-up" : "pill-past")} style={{ padding: "8px 16px", fontSize: 12 }}>{c}
))}
{filtered.length} STORIES
{/* Article grid */}
{filtered.map((n, i) => {
const big = i === 0; // first card spans more
return (
go("article", { id: n.id })} className="card lift" style={{ cursor: "pointer", overflow: "hidden", gridColumn: big ? "span 2" : "span 1" }}>
{n.category}
{n.date} · {n.read} read
{n.title}
{big &&
{n.excerpt}
}
BY {n.author.toUpperCase()}
);
})}
{/* Pagination */}
{[1, 2, 3, "…", 6].map((p, i) => (
{p}
))}
);
}
// ─── ARTICLE DETAIL ──────────────────────────────────────────────────────────
function ArticleDetailPage({ params, go }) {
const n = NEWS.find(x => x.id === params.id) || NEWS[0];
const related = NEWS.filter(x => x.id !== n.id).slice(0, 3);
return (
{/* Cinematic cover */}
{n.category.toUpperCase()}
{n.date.toUpperCase()} · {n.read.toUpperCase()} READ
{n.title}
{n.excerpt}
{n.author}
SENIOR EDITOR · DUBAI
{/* Long-form body */}
{/* Left rail: socials */}
{["X", "in", "▶", "♡"].map(s => (
{s}
))}
2,140 SHARES
{/* Body */}
{NEWS_BODY[0]}
{NEWS_BODY[1]}
{/* Pull quote */}
{NEWS_BODY[2]}
— IBRAHIM HUSSAIN AHLI, FOUNDER
{NEWS_BODY[3]}
{/* Embedded match clip */}
Match point on Map 5 — Apex's k1rito clutches a 1v3 to seal Vexel Open #1. Watch the full play. (2:14)
{NEWS_BODY[4]}
{/* Player photo block */}
Apex Esports' starting five at the Coca-Cola Arena. Photo: Vexel.
What comes next.
The next twelve months will tell us whether the Gulf scene can sustain prize pools at this scale across multiple titles, and whether the Spring Open's broadcast numbers translate into long-term sponsor commitments. Vexel's Summer Invitational — already targeting AED 1.2M — is the next major test.
{/* Tags */}
Tags
{["Vexel Spring Open", "Valorant", "GCC", "Prize pool", "Apex Esports"].map(t => (
{t}
))}
{/* Related */}
More from the journal
{related.map(r => (
go("article", { id: r.id })} className="card lift" style={{ cursor: "pointer" }}>
))}
);
}
// ─── STORE ───────────────────────────────────────────────────────────────────
function StorePage({ go, currency }) {
const [cat, setCat] = useState("All");
const [team, setTeam] = useState("All");
const [cartOpen, setCartOpen] = useState(false);
const [cart, setCart] = useState([]);
const cats = ["All", "Apparel", "Peripherals", "Merch"];
let list = PRODUCTS;
if (cat !== "All") list = list.filter(p => p.category === cat);
if (team !== "All") list = list.filter(p => p.team === team);
const addToCart = (p) => setCart(c => [...c, p]);
const total = cart.reduce((s, p) => s + p.price, 0);
const price = (n) => currency === "AED" ? fmtAED(n) : fmtUSD(n);
return (
{/* Hero */}
Vexel Shop · 2026 Collection
Dresslike a pro.
Official VEXEL apparel, team jerseys, peripherals and limited-edition tournament drops. Ships across the GCC and worldwide.
[c, c])} value={cat} onChange={setCat} />
[t.name, t.name])]} value={team} onChange={setTeam} />
{/* Mini cart */}
Your Cart
{cart.length} ITEMS
{cart.length === 0 ? (
Empty. Add something.
) : (
<>
{cart.map((p, i) =>
{p.name} {price(p.price)}
)}
Total {price(total)}
setCartOpen(true)} className="btn btn-primary btn-sm" style={{ marginTop: 12, width: "100%", justifyContent: "center" }}>Checkout →
>
)}
SHOWING {list.length} OF {PRODUCTS.length} PRODUCTS
Best selling
Newest
Price (low → high)
{list.map(p => (
e.target.style.transform = "scale(1.05)"} onMouseLeave={e => e.target.style.transform = "scale(1)"} />
{p.tag &&
{p.tag}
}
{ e.stopPropagation(); addToCart(p); }} className="btn btn-primary btn-sm sweep" style={{ position: "absolute", bottom: 12, right: 12, opacity: 0.95 }}>+ Cart
{p.team &&
{p.team.toUpperCase()}
}
{p.name}
{price(p.price)}
{p.was && {price(p.was)} }
))}
{/* Checkout modal */}
{cartOpen && (
setCartOpen(false)} style={{ position: "fixed", inset: 0, background: "rgba(10,10,15,0.85)", backdropFilter: "blur(8px)", zIndex: 80, display: "flex", alignItems: "center", justifyContent: "center", padding: 24 }}>
e.stopPropagation()} className="card-flat" style={{ maxWidth: 760, width: "100%", padding: 0 }}>
Checkout · Step 1 of 2
Confirm your order
setCartOpen(false)} style={{ fontSize: 20, color: "var(--text-dim)" }}>✕
Shipping address
Payment
{["Card", "Apple Pay", "Tabby", "Tamara"].map(m => {m} )}
Summary
{cart.map((p, i) => (
{p.name}
{price(p.price)}
))}
Shipping Free
VAT (5%) {price(total * 0.05)}
Total {price(total * 1.05)}
Confirm & Pay →
)}
);
}
// ─── PARTNERS ────────────────────────────────────────────────────────────────
function PartnersPage({ go }) {
const tiers = [
{ name: "Bronze", color: "#C9764A", price: "From AED 75k / year", perks: ["Tournament logo placement", "1 broadcast mention per event", "5 social posts / year", "Email newsletter footer"] },
{ name: "Silver", color: "#B7BBC4", price: "From AED 180k / year", perks: ["All Bronze tier benefits", "Branded segment in broadcast", "2 hospitality boxes / major event", "Quarterly performance report", "On-arena LED rotation"] },
{ name: "Gold", color: "#FFC93C", price: "From AED 450k / year", perks: ["All Silver tier benefits", "Named tournament sponsorship slot", "Exclusive category lock (12 months)", "Co-branded merch capsule", "Dedicated brand manager"] },
{ name: "Diamond", color: "#00E5FF", price: "Bespoke · AED 1M+", perks: ["All Gold tier benefits", "Title sponsorship (\"presented by\")", "Year-round on-stage signage", "Co-produced content series", "First refusal on 2027 league rights", "Dedicated VIP suite at Coca-Cola Arena"] },
];
return (
{/* Hero */}
Partner with Vexel
Partner with theGulf's competitive scene.
The fastest-growing esports audience on Earth — half a billion people, 65% under 30, average broadcast watch time 47 minutes. We have the inventory. Pick the tier.
{[["520M", "MENA audience"], ["47min", "Avg watch time"], ["32", "Markets reached"], ["AED 4.2M", "Activated '26"]].map(([v, l]) => (
))}
{/* Tiers */}
Partnership tiers. All amounts in AED · Renewable annually
{tiers.map(t => (
{t.name}
{t.name}
{t.price}
{t.perks.map((p, i) => (
▸ {p}
))}
Request deck →
))}
{/* Current partners wall */}
Current partners
{PARTNERS.slice(0, 20).map((p, i) => (
{ e.currentTarget.style.color = "var(--cyan)"; e.currentTarget.style.background = "var(--surface)"; }} onMouseLeave={e => { e.currentTarget.style.color = "var(--text-mute)"; e.currentTarget.style.background = "transparent"; }}>{p.toUpperCase()}
))}
{/* Lead form */}
Get in touch
Let's talk numbers.
Tell us what your brand wants out of 2026 and we'll come back with a custom deck within 72 hours.
DIRECT
WHATSAPP CONCIERGE
+971 50 200 1167
);
}
// ─── PartnershipForm (used inside PartnersPage) ──────────────────────────
function PartnershipForm({ tiers }) {
const [data, setData] = useState({ firstName: "", lastName: "", company: "", email: "", tier: tiers[0]?.name || "", message: "" });
const [status, setStatus] = useState("idle");
const [error, setError] = useState("");
const onSubmit = async (e) => {
e.preventDefault(); setStatus("sending"); setError("");
const r = await window.VexelAPI.partnership(data);
if (r.ok) setStatus("ok"); else { setStatus("err"); setError(r.error || "Please try again."); }
};
if (status === "ok") return (
Request received
We'll be in touch.
Our partnerships lead replies within 72 hours.
);
return (
);
}
Object.assign(window, { NewsPage, ArticleDetailPage, StorePage, PartnersPage, PartnershipForm });