/* global React */ // THE COMMISSIONER — Marketing homepage V2. // Original layout preserved. Static screenshots replaced with animated UI mockups. const { useState: useS, useEffect: useE, useRef: useR, useCallback: useC } = React; // ─── Design tokens ────────────────────────────────────────────── const C = { bg: '#0a0a0a', surface: '#0e0e0e', surf2: '#141414', border: '#1f1f1f', border2: '#2a2a2a', text: '#ededed', text2: '#a3a3a3', text3: '#666', text4: '#404040', green: '#00ff88', purple: '#a855f7', }; // ─── Atoms ────────────────────────────────────────────────────── function Wordmark({ size = 15, showText = true }) { return (
The Commissioner {showText && The Commissioner}
); } function GhostButton({ children, href = '#', className = '' }) { return ( {children} ); } function PrimaryButton({ children, href = '#', className = '' }) { return ( {children} ); } function Eyebrow({ accent = C.green, children }) { return (
{children}
); } function ProBadge({ size = 'sm' }) { const sz = size === 'sm' ? 'h-4 px-1.5 text-[9px]' : 'h-5 px-2 text-[10px]'; return ( Pro ); } function Shot({ src, alt = '', label, badge, accent = 'green', className = '' }) { return (
{label &&
{label}
} {badge &&
{badge}
}
{alt}
); } // ─── Animated Chat Mockup ─────────────────────────────────────── // Mimics the real app chat UI with messages appearing one by one function TypingDots({ color = C.text3 }) { return (
{[0, 1, 2].map(i => ( ))}
); } function FormatMsg(text) { return text.split('\n').map((line, i) => { const parts = line.split(/(\*\*.*?\*\*)/g); return React.createElement(React.Fragment, { key: i }, i > 0 && React.createElement('br'), ...parts.map((part, j) => part.startsWith('**') && part.endsWith('**') ? React.createElement('strong', { key: j, className: 'text-white font-semibold' }, part.slice(2, -2)) : React.createElement('span', { key: j }, part) ) ); }); } function MockChat({ conversations, accent = 'green', label = 'Commissioner' }) { const accentColor = accent === 'green' ? C.green : C.purple; const [convoIdx, setConvoIdx] = useS(0); const [visibleMsgs, setVisibleMsgs] = useS(0); const [typing, setTyping] = useS(false); const scrollRef = useR(null); const convo = conversations[convoIdx]; const msgs = convo.messages; useE(() => { if (visibleMsgs >= msgs.length) { const t = setTimeout(() => { setConvoIdx(v => (v + 1) % conversations.length); setVisibleMsgs(0); setTyping(false); }, 5000); return () => clearTimeout(t); } const nextMsg = msgs[visibleMsgs]; const delay = nextMsg.role === 'user' ? 800 : 1200; setTyping(true); const t1 = setTimeout(() => { setTyping(false); setVisibleMsgs(v => v + 1); }, delay); return () => clearTimeout(t1); }, [visibleMsgs, convoIdx, msgs]); useE(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [visibleMsgs, typing]); return (
{/* Browser chrome */}
thecommissioner.ai · {label}
AI
{/* Chat header */}
{accent === 'green' ? 'C' : 'L'}
{label}
Online
{/* Scenario label */}
{convo.title} {convo.trigger}
{/* Messages */}
{msgs.slice(0, visibleMsgs).map((msg, i) => (
{msg.role === 'user' ? (

{msg.text}

) : (
{accent === 'green' ? 'C' : 'L'}
{FormatMsg(msg.text)}
)}
))} {typing && visibleMsgs < msgs.length && (
{msgs[visibleMsgs].role !== 'user' && (
{accent === 'green' ? 'C' : 'L'}
)}
)}
{/* Input area */}
Ask anything...
); } // ─── Animated Activity Feed ───────────────────────────────────── function MockActivityFeed() { const items = [ { type: 'commissioner', label: 'Commissioner', color: '#a855f7', bg: 'rgba(168,85,247,0.1)', text: 'Week 11 power rankings published. Team 2 takes the #1 spot.', time: '2m ago' }, { type: 'trade', label: 'Trade', color: '#f59e0b', bg: 'rgba(245,158,11,0.1)', text: "Trade accepted: Team 4 sends DJ Moore + 2026 1st to Team 7 for Ja'Marr Chase.", time: '1h ago' }, { type: 'commissioner', label: 'Commissioner', color: '#a855f7', bg: 'rgba(168,85,247,0.1)', text: 'League dues reminder sent to 3 unpaid owners. Deadline: Aug 28.', time: '3h ago' }, { type: 'waiver', label: 'Waiver', color: '#6366f1', bg: 'rgba(99,102,241,0.1)', text: 'Team 3 claims Kyren Williams (RB, LAR) — $22 FAAB.', time: '5h ago' }, { type: 'commissioner', label: 'Commissioner', color: '#a855f7', bg: 'rgba(168,85,247,0.1)', text: 'Stat corrections applied for Week 11. One matchup result flipped.', time: '1d ago' }, { type: 'add_drop', label: 'Add/Drop', color: '#10b981', bg: 'rgba(16,185,129,0.1)', text: 'Team 9 drops Jahan Dotson (WR, WAS), adds Quentin Johnston (WR, LAC).', time: '1d ago' }, ]; const [visible, setVisible] = useS(3); useE(() => { if (visible >= items.length) { const t = setTimeout(() => { setVisible(3); }, 4000); return () => clearTimeout(t); } const t = setTimeout(() => { setVisible(v => v + 1); }, 2500); return () => clearTimeout(t); }, [visible]); return (
/leagues/dynasty-warriors/activity
{items.slice(0, visible).map((item, i) => (
{item.label}

{item.text}

{item.time}
))}
); } // ─── Animated Action Center (Lieutenant) ──────────────────────── function MockActionCenter() { const alerts = [ { urgency: 'high', color: '#ef4444', league: 'Dynasty Warriors', text: 'McCaffrey ruled OUT. Roschon Johnson available as backup.', action: 'Swap in backup' }, { urgency: 'high', color: '#ef4444', league: 'Keeper League', text: 'Trade offer expires in 3 hours. Their 1st + Moore for your Chase.', action: 'Review trade' }, { urgency: 'medium', color: '#f59e0b', league: 'Dynasty Warriors', text: 'Drake London active but on pitch count. WR3 decision needed.', action: 'Check status' }, { urgency: 'low', color: '#10b981', league: 'Redraft Heroes', text: 'Lineup is optimized. No changes needed this week.', action: null }, { urgency: 'medium', color: '#f59e0b', league: 'Empire League', text: 'Opponent has 3 players on bye. Projected to win by 22.', action: null }, ]; const [visible, setVisible] = useS(2); useE(() => { if (visible >= alerts.length) { const t = setTimeout(() => { setVisible(2); }, 5000); return () => clearTimeout(t); } const t = setTimeout(() => { setVisible(v => v + 1); }, 2000); return () => clearTimeout(t); }, [visible]); return (
/lieutenant/action-center
PRO
{/* Header */}
Sunday Morning Brief
Week 11 · 5 leagues
LIVE
{alerts.slice(0, visible).map((a, i) => (
{a.league} {a.urgency}

{a.text}

{a.action && ( )}
))}
); } // ─── Nav ──────────────────────────────────────────────────────── function Nav() { const [mobileOpen, setMobileOpen] = useS(false); return ( React.createElement(React.Fragment, null, React.createElement('nav', { className: 'sticky top-0 z-50 backdrop-blur-md', style: { background: 'rgba(10,10,10,0.7)', borderBottom: '1px solid rgba(255,255,255,0.06)' } },
Commissioner Lieutenant Draft Formats Compare
Sign in Join waitlist →
), mobileOpen && (
{ setMobileOpen(false); }}>
{ e.stopPropagation(); }}>
{['Commissioner','Lieutenant','Draft','Formats','Compare'].map(l => ( { setMobileOpen(false); }} className="px-4 py-3 text-[#a3a3a3] hover:text-white hover:bg-white/5 rounded-lg transition-colors">{l} ))}
Sign in { setMobileOpen(false); }} className="mt-2 text-center text-[13px] font-semibold bg-white text-black px-4 py-3 rounded-lg hover:bg-[#e5e5e5]"> Join waitlist →
) ) ); } // ─── Hero ─────────────────────────────────────────────────────── function Hero() { return (
New AI mock drafts are here. Practice against bots trained on your actual league mates AI mock drafts are live

Two Fantasy Agents.
One for your league.
One for your lineups.

An AI commissioner that handles your league top to bottom: settings, scoring, disputes, weekly recaps. A personal AI advisor that helps you make smarter calls: draft strategy, lineup decisions, trade analysis, waivers. Across every league you're in.

Join the waitlist → Watch the draft demo
Free in beta · Importing 100 leagues a week · Bring yours from ESPN, Sleeper, Yahoo, or anywhere
); } // ─── Import Strip ─────────────────────────────────────────────── function ImportStrip() { const platforms = ['ESPN', 'Sleeper', 'Yahoo', 'NFL.com', 'MyFantasyLeague', 'Fleaflicker', 'Fantrax', 'CBS']; return (
Imports your existing league from anywhere
{platforms.map(p => ( {p} ))}
); } // ─── Feature Section ──────────────────────────────────────────── function FeatureSection({ id, eyebrow, accent = C.green, headline, lede, bullets, visual, reverse = false, kicker }) { return (
{eyebrow}

{headline}

{lede}

{bullets && (
    {bullets.map((b, i) => (
  • {b}
  • ))}
)} {kicker && (

{kicker}

)}
{visual}
); } // ─── Commissioner Section ─────────────────────────────────────── function CommissionerSection() { const conversations = window.MKT.COMMISSIONER_SCENARIOS.slice(0, 5).map(s => ({ title: s.title, trigger: s.trigger, messages: [ ...(s.trigger.includes('asks') || s.trigger.includes('messages') ? [{ role: 'user', text: s.trigger.replace(/^.*?"/, '').replace(/"$/, '') }] : []), { role: 'assistant', text: s.response }, ], })); return ( } /> ); } // ─── Lieutenant Section ───────────────────────────────────────── function LieutenantSection() { const conversations = window.MKT.LIEUTENANT_SCENARIOS.slice(0, 5).map(s => ({ title: s.title, trigger: s.trigger, messages: [ ...(s.userMessage ? [{ role: 'user', text: s.userMessage }] : []), { role: 'assistant', text: s.response }, ], })); return ( } /> ); } // ─── Draft Section ────────────────────────────────────────────── function DraftSection() { return (
The Draft Room

Draft night, the way it should be.

Six layouts. Built-in video call. An AI co-pilot whispering in your ear. Real-time board, pick timer, auto-draft queue, live chat.

/draft/dynasty-warriors · War Room
LIVE
Six layouts to choose from {['Classic','War Room','Spotlight','Scout','Co-Pilot','Pocket'].map(l => ( {l} ))}
); } // Draft mini (preserved from original) function DraftMini() { const F = [ { abbr: 'TPT', color: '#dc2626' }, { abbr: 'BSV', color: '#16a34a' }, { abbr: 'PG', color: '#f59e0b' }, { abbr: 'HSG', color: '#8b5cf6' }, { abbr: 'CMR', color: '#00ff88', isMine: true }, { abbr: 'MCM', color: '#0ea5e9' }, { abbr: 'MHM', color: '#ef4444' }, { abbr: 'CDL', color: '#06b6d4' }, { abbr: 'JFA', color: '#a855f7' }, { abbr: 'SQN', color: '#f97316' }, { abbr: 'CHC', color: '#eab308' }, { abbr: 'BJN', color: '#84cc16' }, ]; const PICKS = [ { n: 'McCaffrey', p: 'RB' }, { n: 'Lamb', p: 'WR' }, { n: 'Chase', p: 'WR' }, { n: 'Hill', p: 'WR' }, { n: 'Bijan', p: 'RB' }, { n: 'Jefferson', p: 'WR' }, { n: 'Hall', p: 'RB' }, { n: 'Barkley', p: 'RB' }, { n: 'St. Brown', p: 'WR' }, { n: 'Taylor', p: 'RB' }, { n: 'Gibbs', p: 'RB' }, { n: 'Nacua', p: 'WR' }, { n: 'Mahomes', p: 'QB' }, { n: 'Wilson', p: 'WR' }, { n: 'Adams', p: 'WR' }, { n: 'Etienne', p: 'RB' }, { n: 'Kelce', p: 'TE' }, { n: 'London', p: 'WR' }, ]; const PC = { QB:'#ef4444', RB:'#22c55e', WR:'#3b82f6', TE:'#f97316' }; const [t, setT] = useS(73); useE(() => { const i = setInterval(() => { setT(v => v > 0 ? v - 1 : 90); }, 1000); return () => clearInterval(i); }, []); const tColor = t <= 10 ? '#ef4444' : t <= 30 ? '#f59e0b' : '#00ff88'; return (
Round 2 · Pick 7
You're on the clock
{Math.floor(t/60)}:{String(t%60).padStart(2,'0')}
{F.map(f => (
{f.abbr}
))} {[1,2,3].map(r => { const rev = r % 2 === 0; return ( React.createElement(React.Fragment, { key: r },
R{r}
, ...F.map((f, idx) => { const rIdx = rev ? 11 - idx : idx; const pIdx = (r - 1) * 12 + rIdx; const pick = PICKS[pIdx]; const cur = r === 2 && idx === 4; return (
{pick && (
{pick.p}
{pick.n}
)} {!pick && cur &&
PICK
}
); }) ) ); })}
Available · top 4
{[ { n: 'Sam LaPorta', p: 'TE', t: 'DET', adp: 21.1, top: true }, { n: "De'Von Achane", p: 'RB', t: 'MIA', adp: 23.8 }, { n: 'Nico Collins', p: 'WR', t: 'HOU', adp: 24.5 }, { n: 'DeVonta Smith', p: 'WR', t: 'PHI', adp: 25.7 }, ].map((pl, i) => (
{pl.p} {pl.n} {pl.t} {pl.adp.toFixed(1)}
))}
Lieutenant says

Take LaPorta. Last Tier-1 TE — he won't return to you at 3.7.

The drop after T1 TEs is ~6 PPG. Highest expected-value pick on the board.

); } // ─── Multi-League Section ─────────────────────────────────────── function MultiLeagueSection() { return ( } /> ); } // ─── Formats ──────────────────────────────────────────────────── function FormatsSection() { const formats = [ { name: 'Redraft', sub: 'Standard, PPR, half-PPR, custom scoring' }, { name: 'Keeper', sub: '1-12 keepers with round penalties or none' }, { name: 'Dynasty', sub: 'Rookie drafts, taxi squads, multi-year contracts' }, { name: 'Empire', sub: 'Multi-year crowns and tribute mechanics' }, { name: 'Devy', sub: 'Full NCAA database, declarations, transfer portal' }, { name: 'IDP', sub: 'Defensive lineups with position-specific scoring' }, { name: 'Salary Cap', sub: 'Contracts, dead money, franchise tags' }, { name: 'Auction', sub: 'Slow and live auction, nomination strategy AI' }, { name: 'Best-Ball', sub: 'No lineups, all draft, all year' }, { name: 'Survivor', sub: 'Pick-em with rosters and elimination rounds' }, { name: 'Guillotine', sub: 'Lowest score eliminated each week' }, { name: 'Custom', sub: 'Any rule you can describe, the AI will enforce it' }, ]; return (
Every format

If you can describe it, we can run it.

Twelve built-in formats and a custom rules engine the AI Commissioner configures in plain English. The weird scoring system your group chat invented at 1am? In scope.

"Quarterback gets +5 if it rains in their stadium" is a real rule someone asked for. We said yes.

    {formats.map(f => (
  • {f.name}
    {f.sub}
  • ))}
); } // ─── Compare ──────────────────────────────────────────────────── function CompareSection() { const rows = [ { label: 'AI Commissioner', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'AI Lieutenant (personal advisor)',tc:'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'AI mock drafts vs your league', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'Dynasty + taxi + contracts', tc: 'yes', espn: 'partial',sleeper: 'yes', yahoo: 'no' }, { label: 'Devy (with NCAA player DB)', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'Empire leagues', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'Salary cap + dead money', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'IDP scoring', tc: 'yes', espn: 'yes', sleeper: 'yes', yahoo: 'yes' }, { label: 'Import from any platform', tc: 'yes', espn: 'no', sleeper: 'partial',yahoo: 'no' }, { label: 'Multi-league dashboard', tc: 'yes', espn: 'partial',sleeper: 'partial',yahoo: 'partial' }, { label: 'Built-in video call in draft', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'Custom rules engine', tc: 'yes', espn: 'no', sleeper: 'partial',yahoo: 'no' }, { label: 'AI weekly recap + podcast', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'Auto dues collection', tc: 'yes', espn: 'no', sleeper: 'no', yahoo: 'no' }, { label: 'Proactive injury/news alerts', tc: 'yes', espn: 'partial',sleeper: 'partial',yahoo: 'partial' }, ]; const Cell = ({ v }) => { if (v === 'yes') return ; if (v === 'partial') return ; return ; }; return (
The comparison

What you've been asking for. For ten years.

ESPN, Sleeper, and Yahoo are great at what they do. We built everything they haven't gotten to yet.

{rows.map((r, i) => ( ))}
Feature TC ESPN Sleeper Yahoo
{r.label}
Built-in Partial Not supported
); } // ─── FAQ ──────────────────────────────────────────────────────── function FAQSection() { const items = window.MKT.FAQ; const [open, setOpen] = useS(-1); return (
FAQ

Reasonable questions.

{items.map((f, i) => (
{open === i && (

{f.a}

)}
))}
); } // ─── CTA ──────────────────────────────────────────────────────── function CTASection() { return (
Beta

Your league, upgraded.

Free in beta. Import your league from ESPN, Sleeper, Yahoo, MFL, or anywhere else. Takes about three minutes.

{ e.preventDefault(); }}>
No spam. One email a month, max. We're better at follow-through than most commissioners.
); } // ─── Footer ───────────────────────────────────────────────────── function Footer() { return (

Fantasy football, with two minds of its own. Free in beta.

{[ { h: 'Product', items: ['Draft Room','Commissioner','Lieutenant','Mock Draft','Portfolio'] }, { h: 'Formats', items: ['Dynasty','Devy','Empire','Salary Cap','IDP'] }, { h: 'Compare', items: ['vs. ESPN','vs. Sleeper','vs. Yahoo','Import guide'] }, { h: 'Company', items: ['About','Blog','Changelog','Contact'] }, ].map(c => (
{c.h}
    {c.items.map(i =>
  • {i}
  • )}
))}
© 2026 The Commissioner. Not affiliated with the NFL, ESPN, or your friend Marcus.
); } // ─── Page ─────────────────────────────────────────────────────── function MarketingHome() { return (
); } window.MarketingHome = MarketingHome;