// VEXEL — About, Careers, Contact, Sign in, Dashboard
// useState is already in scope from ui.jsx (loaded first)
// ─── ABOUT ───────────────────────────────────────────────────────────────────
function AboutPage({ go }) {
return (
{/* Hero */}
About Vexel
Built in Dubai. For the Gulf.
{/* Mission */}
The Mission
Stop the talent drain.
The GCC has a generational depth of competitive talent and zero infrastructure to keep them home. Every year, our best players sign with EU and NA orgs, train in Berlin or Seoul, and never come back. We're tired of it.
Vexel is the operating system for what comes next — a tournament platform, broadcast network, ranking system and player pipeline, owned and operated out of Dubai. The point isn't to chase global esports. The point is to build a regional ecosystem so strong that the world has to come to us.
{/* Timeline */}
The story so far.
{[
["2023 · Q1", "Wakefield Project Management is incorporated in Dubai. Trade Licence 1167116 issued. Founder Ibrahim Hussain Ahli writes the first business plan on the back of a napkin in DIFC."],
["2023 · Q4", "First exhibition tournament — a 32-player Tekken showcase at Dubai Mall. Sells out in under an hour. AED 25,000 prize pool, 4,200 viewers on a stream nobody planned to put online."],
["2024 · Q2", "Vexel platform officially launches. Six titles, three tournaments running, 1,400 registered players in the first week."],
["2024 · Q4", "First major: Vexel Winter Invitational. AED 600,000 prize pool. Coca-Cola Arena. Falcons GG take the crown."],
["2025", "Vexel becomes the official GCC qualifier path for two international circuits. Active player base passes 12,000."],
["2026", "Spring Open hits AED 450k — the largest single Valorant prize pool ever staged outside of Riot's official circuit. Diamond partners on board. Summer Invitational announced at AED 1.2M."],
].map(([year, body], i) => (
{year}
{body}
))}
{/* Leadership */}
Leadership.
{[
["Ibrahim Hussain Ahli", "Founder & CEO", PHOTOS.gamer1, "Wakefield owner. UAE-born, Dubai-built. 18 years in regional sport, three years in esports, zero patience for slow."],
["Shirley Bouchard", "Head of Partnerships", PHOTOS.player8, "Ran sponsorship for Dubai Tennis Championships before she crossed over. Speaks five languages, signs ten contracts a week."],
["Tariq Al-Saud", "Director of Esports", PHOTOS.gamer3, "Former pro Valorant player. Now decides which players become pros. Brutal but fair."],
["Aysha Al-Kaabi", "Head of Broadcast", PHOTOS.player5, "Built the production graph that runs every Vexel stream. Ex-MBC, ex-twitch.tv/middleeast."],
].map(([name, role, photo, bio]) => (
{name}
{role.toUpperCase()}
{bio}
))}
{/* HQ photos */}
HQ · DIFC, Dubai.
Our offices sit on Level 41 of the ICD Brookfield Place. Broadcast studio one floor down, training rooms in Marina, players sleep wherever they want — usually nowhere.
{/* Press */}
Press.
{[
["Forbes Middle East", "\"The most ambitious esports operator working in the GCC.\""],
["The National", "\"Vexel just rewrote what a regional tournament looks like.\""],
["Esports Insider", "\"Dubai's answer to FACEIT, with a Gulf accent and double the ambition.\""],
].map(([source, quote]) => (
{source}
{quote}
))}
{/* Wakefield strip */}
Owned & Operated By
Wakefield Project Management
Trade Licence 1167116 · Owner: Ibrahim Hussain Ahli · Dubai, UAE
);
}
// ─── CAREERS ─────────────────────────────────────────────────────────────────
function CareersPage({ go }) {
return (
Careers · Hiring across 4 teams
Build the future of competitive gaming.
We're a tight team in Dubai (and remote-friendly) building the operating system for Gulf esports. We move fast, take swings, and don't pretend to know everything. Sound right?
{/* Values */}
{[
["01", "Compete or coach", "Either you play, or you build for people who do. There's no third option."],
["02", "GCC-first, not GCC-only", "We're built here. We don't apologise for that. But our platform speaks five languages."],
["03", "Operate in public", "Every roadmap, prize pool, and post-mortem is in the open. No secret KPIs."],
["04", "Pay above the meta", "Top-quartile salaries, full healthcare, four-day Eid week, 26 days off, ESOP for first 50."],
].map(([n, t, b]) => (
VALUE {n}
{t}
{b}
))}
{/* Open roles */}
Open roles · {POSITIONS.length}
All postings · Updated May 14
{POSITIONS.map((p, i) => (
{p.title}
{p.team.toUpperCase()}
{p.location}
{p.type}
))}
{/* Apply form */}
Don't see a fit?
Tell us anyway.
We hire people, not roles. If you've got something the team needs and we don't have a posting for it, write to us. Worst case we email back.
{[
["▸", "Free entry into 8 weekly tournaments"],
["▸", "Anti-cheat protected matchmaking, every match"],
["▸", "Direct payouts to local bank account (AED)"],
["▸", "First-look access to limited Vexel drops"],
["▸", "Climb the GCC ladder — top 100 get scouted"],
].map(([s, t]) => (
{s}{t}
))}
);
}
// ─── DASHBOARD ───────────────────────────────────────────────────────────────
function DashboardPage({ go, setSignedIn }) {
const [tab, setTab] = useState("overview");
const [user, setUser] = useState(null);
const player = PLAYERS[0];
const team = teamById(player.team);
useEffect(() => {
(async () => {
const r = await window.VexelAPI.me();
if (r.ok && r.user) { setUser(r.user); setSignedIn(true); }
})();
}, []);
const signOut = async () => {
await window.VexelAPI.signOut();
setSignedIn(false);
go("home");
};
// Display name for the avatar/sidebar — use real user if available, fall back to demo
const displayHandle = user?.handle || "sandstorm";
const displayCountry = user?.country || "UAE";
const initial = (displayHandle[0] || "S").toUpperCase();
return (
{/* Sidebar */}
{/* Main */}
{tab === "overview" && (
<>
Hey, sandstorm.
Two matches today. One trophy on the line. Let's go.
{[
["MAY 17", "Cash-out · Emirates NBD ••2204", "var(--text-mute)", "−AED 24,200"],
["MAY 09", "GCC Pro League S3 · 1st place prize", "var(--lime)", "+AED 108,000"],
["APR 28", "Vexel Open · 2nd place prize", "var(--lime)", "+AED 38,400"],
["APR 12", "Cash-out · Emirates NBD ••2204", "var(--text-mute)", "−AED 64,000"],
["MAR 22", "Riyadh Major Qualifier · 1st prize", "var(--lime)", "+AED 72,000"],
].map((tx, i) => (
{tx[0]}{tx[1]}{tx[3]}
))}
>
)}
{tab === "settings" && (
<>
Settings
Profile
Notifications
{[
["Email me when matches are 15 minutes from starting", true],
["Push me on iOS / Android for live tournament invites", true],
["Weekly drop newsletter", true],
["Marketing from partner publishers", false],
].map(([l, on], i) => (