// VEXEL — Teams, Team detail, Players, Player detail // ─── TEAMS LIST ────────────────────────────────────────────────────────────── function TeamsPage({ go }) { const [game, setGame] = useState("all"); const [region, setRegion] = useState("all"); const filtered = TEAMS.filter(t => (game === "all" || t.games.includes(game)) && (region === "all" || t.region === region)); const featured = TEAMS[0]; return (
The Roster · {TEAMS.length} active teams

Teams.

Every organisation playing on the Vexel platform. Sixteen across the GCC, ten countries, ten games.

{/* Featured team — Apex */}
Team of the month
go("team", { id: featured.id })} style={{ cursor: "pointer", position: "relative", overflow: "hidden", border: "1px solid var(--line)", borderRadius: 8, minHeight: 320 }}>

{featured.name}

{featured.region} · Founded 2023 · {featured.members} active players

"{featured.motto}"

{[["Win rate", featured.winRate + "%", "var(--lime)"], ["Active games", featured.games.length, "var(--cyan)"], ["Titles '26", "6", "var(--gold)"], ["World rank", "#14", "var(--magenta)"]].map(([l, v, c]) => (
{l}
{v}
))}
{/* Filters */}
Game
Region
{filtered.length} TEAMS
{filtered.map(t => (
go("team", { id: t.id })} className="card lift" style={{ cursor: "pointer", overflow: "hidden" }}>
{t.games.slice(0, 3).map(gid => )}
{t.name}
{t.region} · {t.tag}
WIN%
{t.winRate}
ROSTER
{t.members}
GAMES
{t.games.length}
))}
); } // ─── TEAM DETAIL ───────────────────────────────────────────────────────────── function TeamDetailPage({ params, go }) { const t = TEAMS.find(x => x.id === params.id) || TEAMS[0]; const roster = PLAYERS.filter(p => p.team === t.id).slice(0, 5); // Make sure we always have 5 — fall back to slicing PLAYERS const r5 = roster.length >= 5 ? roster.slice(0, 5) : PLAYERS.slice(0, 5).map(p => ({ ...p, team: t.id, region: t.region })); return (
{/* Cinematic hero */}
{t.region} · FOUNDED 2023 · WORLD #14

{t.name}

"{t.motto}"

{[["Win rate", t.winRate + "%", "var(--lime)"], ["Roster", t.members, "var(--cyan)"], ["Titles '26", "6", "var(--gold)"], ["Earnings YTD", "AED 1.4M", "var(--magenta)"], ["Active games", t.games.length, "var(--white)"]].map(([l, v, c]) => (
{l}
{v}
))}
{/* Roster */}
The starting five · Valorant roster

Roster

UPDATED MAY 14, 2026
{r5.map(p => (
go("player", { id: p.id })} className="card lift" style={{ cursor: "pointer", overflow: "hidden", position: "relative" }}>
{p.role.toUpperCase()}
#{p.rank} · {p.region}
{p.handle}
{p.realName}
K/D
{p.kd}
WIN%
{p.winRate}%
RATING
{p.points}
))}
{/* Trophy + matches grid */}
{/* Trophy case */}

Trophy case · 2026

{[ ["Vexel Spring Open", "1st", "AED 270,000", "VAL", "Apr 18"], ["GCC Pro League S3", "1st", "AED 180,000", "VAL", "Mar 22"], ["Riyadh Major Qualifier", "1st", "AED 120,000", "CS2", "Mar 04"], ["Vexel FIFA Cup", "2nd", "AED 32,000", "FC25", "Feb 14"], ["Falcon League S2", "1st", "AED 95,000", "DOTA", "Feb 02"], ["Vexel Winter Open", "3rd–4th", "AED 28,000", "VAL", "Jan 18"], ].map(([n, p, e, g, d], i) => (
{p}
{n}
{g}
{e} {d}
))}
{/* Upcoming + results */}

Upcoming matches

{[["May 21 · 16:00", "Falcons GG", "VAL", "Semi-final · Bo5"], ["May 23 · 20:00", "TBD", "VAL", "Grand Final · Bo7"], ["Jun 02 · 18:00", "Cairo Sphinx", "DOTA", "Group A · Bo3"]].map((m, i) => (
{m[0]}
vs {m[1]}
{m[2]} · {m[3]}
))}

Recent results

{[ ["MAY 18", "vs Mirage Collective", "2-1", true], ["MAY 16", "vs Dune Wolves", "2-0", true], ["MAY 12", "vs Beirut Bullets", "1-2", false], ["MAY 09", "vs Riyadh Royals", "2-0", true], ["MAY 05", "vs Cairo Sphinx", "2-1", true], ].map(([d, m, s, w], i) => (
{d} {m} {s} {w ? "W" : "L"}
))}
{/* Stats panel */}

Team stats · last 50 matches

{[ ["Matches", "50"], ["Wins", "39"], ["Losses", "11"], ["Map win %", "72.4"], ["Avg. round diff", "+4.2"], ["Pistol round %", "63"] ].map(([l, v]) => (
{l}
{v}
))}
); } // ─── PLAYERS / RANKINGS ────────────────────────────────────────────────────── function PlayersPage({ go }) { const [scope, setScope] = useState("global"); const [game, setGame] = useState("all"); const [role, setRole] = useState("all"); const [hover, setHover] = useState(null); let list = PLAYERS.filter(p => (game === "all" || p.game === game) && (role === "all" || p.role === role)); if (scope === "gcc") list = list.filter(p => ["UAE", "KSA", "QAT", "KWT", "OMN", "BHR"].includes(p.region)); if (scope === "uae") list = list.filter(p => p.region === "UAE"); return (
Live · Season 03

Rankings.

The top 100 players on the Vexel platform. Updated every 24 hours. Tiebreakers: rating, head-to-head, K/D.

{/* Tabs + filters */}
{[["global", "GLOBAL"], ["gcc", "GCC ONLY"], ["uae", "UAE ONLY"]].map(([k, l]) => ( ))}
RANKPLAYERREGIONTEAMGAMEROLEK/DRATINGWIN %
{list.slice(0, 32).map((p, i) => { const team = teamById(p.team); const isTop3 = p.rank <= 3; return (
go("player", { id: p.id })} onMouseEnter={() => setHover(p.id)} onMouseLeave={() => setHover(null)} style={{ display: "grid", gridTemplateColumns: "60px 1fr 120px 1fr 70px 90px 80px 100px 90px", padding: "14px 20px", borderBottom: "1px solid var(--line)", alignItems: "center", cursor: "pointer", background: hover === p.id ? "var(--surface-2)" : "transparent", transition: "background 0.1s", position: "relative" }}>
{isTop3 ? ( {p.rank} ) : ( {String(p.rank).padStart(2, "0")} )} {i % 3 === 0 ? "▲" : i % 5 === 0 ? "▼" : "—"}
{p.handle[0]}
{p.handle}
{hover === p.id &&
{p.realName}
}
{p.region}
{team.tag}
{p.role} {p.kd} {p.points} {p.winRate}%
); })}
); } // ─── PLAYER DETAIL ─────────────────────────────────────────────────────────── function PlayerDetailPage({ params, go }) { const p = PLAYERS.find(x => x.id === params.id) || PLAYERS[0]; const team = teamById(p.team); const game = gameById(p.game); return (
{/* Hero */}
{p.region} · WORLD RANK #{String(p.rank).padStart(3, "0")}
{team.name.toUpperCase()} · {p.role.toUpperCase()}

{p.handle}

{p.realName} · {game.name}

{/* Career stats */}
{[ ["Career matches", "1,248", null], ["Win rate", p.winRate + "%", "var(--lime)"], ["K/D", p.kd, "var(--cyan)"], ["Peak rank", "#" + Math.max(1, p.rank - 3), "var(--gold)"], ["Prize money", "AED " + p.earnings.toLocaleString(), "var(--magenta)"], ["Rating", p.points, "var(--white)"], ].map(([l, v, c], i) => (
{l}
{v}
))}
{/* Recent matches + highlights */}

Recent matches

DATEEVENTvsK/D/ARATINGRESULT
{[ ["MAY 18", "Vexel Spring Open · QF", "Mirage Collective", "24/14/8", "1.62", true], ["MAY 16", "Vexel Spring Open · R16", "Dune Wolves", "29/8/4", "2.18", true], ["MAY 14", "Vexel Spring Open · Group", "Beirut Bullets", "18/16/11", "1.04", false], ["MAY 09", "GCC Pro League S3 · Final", "Riyadh Royals", "31/11/6", "1.94", true], ["MAY 05", "GCC Pro League S3 · SF", "Cairo Sphinx", "22/15/9", "1.32", true], ["MAY 02", "GCC Pro League S3 · QF", "Bedouin Black", "26/12/5", "1.71", true], ["APR 28", "Vexel Open · Final", "Doha Demons", "19/17/12", "1.06", false], ["APR 25", "Vexel Open · SF", "Falcons GG", "33/14/8", "2.04", true], ].map((m, i) => (
{m[0]} {m[1]} {m[2]} {m[3]} = "1.5" ? "var(--lime)" : m[4] >= "1.2" ? "var(--cyan)" : "var(--text)", fontWeight: 700 }}>{m[4]} {m[5] ? "W" : "L"}
))}

Highlight reel

{[ ["5K Ace · Ascent", "2:14", PHOTOS.gamer1], ["1v3 Clutch · Bind", "0:48", PHOTOS.gamer2], ["The Wallbang · Haven", "1:02", PHOTOS.gamer3], ["Triple Headshot · Pearl", "0:32", PHOTOS.gamer4], ["Operator Show · Split", "1:48", PHOTOS.gamer5], ["The Final Round", "3:11", PHOTOS.setup1], ].map(([title, dur, img]) => (
{title}
{dur}
))}
{/* Stream + about */}

Live on Twitch

LIVE · 2.4K WATCHING
Late-night Valorant ranked grind
VALORANT · TWITCH.TV/{p.handle.toUpperCase()}

About

{p.realName} ({p.handle}) is a {p.role} for {team.name} and one of the {p.region}'s top-rated {game.name} players. Known for ice-cold clutches, brutal AWP picks under pressure, and the kind of out-of-meta picks that decide tournaments.

{[["Age", "21"], ["Joined", "Apr 2024"], ["Sensitivity", "0.42"], ["DPI", "800"]].map(([l, v]) => (
{l}
{v}
))}
Socials
{["𝕏 Twitter", "Twitch", "YouTube", "Discord"].map(s => ( {s} ))}
); } Object.assign(window, { TeamsPage, TeamDetailPage, PlayersPage, PlayerDetailPage });