// Platforms section — full-width feature cards w/ product UI
const PlatformsSection = () => (
  <section className="section-pad" id="platforms">
    <div className="container">
      <div className="section-head">
        <div>
          <div className="section-num" style={{ color: 'var(--accent)' }}>PLATFORMS</div>
          <h2 className="mt-4">Branded platforms running real trading operations today.</h2>
        </div>
        <p className="lead">
          QTG's platforms are live infrastructure — not concepts. Each is operated by real prop firms, brokers, and trading
          businesses across six markets.
        </p>
      </div>

      <div style={{display:'flex', flexDirection:'column', gap:24}}>
        <PlatformCard
          tag="01" name="YourPropFirm" href="yourpropfirm.html"
          headline="The operating system prop firms run on, from launch to scale."
          desc="One connected layer for traders, accounts, challenges, payouts, dashboards, risk, and support. Deployed by 85+ prop firms managing 2.75M+ accounts."
          stats={[['Prop firm clients','85+'],['Accounts provisioned','2.75M+'],['Client revenue powered','$238.4M']]}
          ui={<YourPropFirmUI/>}
        />
        <PlatformCard
          tag="02" name="QuantSentry" href="quantsentry.html" reverse
          headline="AI-native risk infrastructure for trading businesses."
          desc="Detects abuse patterns, enforces rule logic, and surfaces investigation-ready evidence in real time. Built for operators that can't afford to see yesterday's risk."
          stats={[['Events scored / mo','2.1B'],['Median latency','14ms'],['Patterns tracked','340+']]}
          ui={<QuantSentryUI/>}
        />
        <PlatformCard
          tag="03" name="Broker Infrastructure" href="broker-infrastructure.html"
          headline="Client lifecycle and operational systems for modern brokers."
          desc="Broker CRM, IB and affiliate workflows, onboarding, reporting, and platform integrations — engineered for brokers that operate across regions and asset classes."
          stats={[['Active integrations','126'],['Regions supported','24'],['Partner tiers','unlimited']]}
          ui={<BrokerUI/>}
        />
        <PlatformCard
          tag="04" name="QuantCX" href="quantcx.html" reverse
          headline="Customer experience and engagement, built for trading operators."
          desc="Omnichannel support, AI-assisted resolution, and a unified trader timeline — so every conversation carries full account context across chat, email, and ticketing."
          stats={[['Touchpoints / mo','18M'],['Auto-resolved','71%'],['Trader CSAT','94%']]}
          ui={<QuantCXUI/>}
        />
        <PlatformCard
          tag="05" name="PropTradeGroup" href="proptradegroup.html"
          headline="A managed white-label prop firm, running on the QTG core."
          desc="Launch a fully-operated prop brand without building the stack — challenges, payouts, risk, and support are run for you on the same infrastructure that powers QTG's platforms."
          stats={[['Managed brands','40+'],['Payouts processed','$48M'],['Time to launch','2 weeks']]}
          ui={<PropTradeGroupUI/>}
        />
        <PlatformCard
          tag="06" name="TradoPay" href="tradopay.html" reverse
          headline="Payments and payout infrastructure for trading businesses."
          desc="Multi-rail deposits and payouts, treasury, and reconciliation — one ledger across providers, regions, and currencies, with approvals and audit built in."
          stats={[['Payout rails','12'],['Settlement','T+0'],['Recon match','99.6%']]}
          ui={<TradoPayUI/>}
        />
      </div>
    </div>
  </section>
);

const PlatformCard = ({tag, name, headline, desc, stats, ui, reverse, href}) => (
  <div style={{
    display:'grid', gridTemplateColumns: reverse?'1.2fr 1fr':'1fr 1.2fr',
    gap:0, border:'1px solid var(--line)', borderRadius:16, overflow:'hidden',
    background:'var(--surface)'
  }}>
    {!reverse && <div style={{padding:'40px 40px', borderRight:'1px solid var(--line)'}}>
      <PlatformText {...{tag,name,headline,desc,stats,href}}/>
    </div>}
    <div style={{
      padding:'24px', background:'linear-gradient(180deg, var(--bg-3) 0%, var(--bg-2) 100%)',
      display:'flex', alignItems:'center', justifyContent:'center', minHeight:380,
      borderRight: reverse?'1px solid var(--line)':'none'
    }}>{ui}</div>
    {reverse && <div style={{padding:'40px 40px'}}>
      <PlatformText {...{tag,name,headline,desc,stats,href}}/>
    </div>}
  </div>
);
const PlatformText = ({tag, name, headline, desc, stats, href}) => (
  <>
    <div style={{display:'flex', alignItems:'center', gap:10}}>
      <span className="mono" style={{fontSize:11, color:'var(--text-4)', letterSpacing:'0.12em'}}>PLATFORM</span>
      <span style={{flex:1, height:1, background:'var(--line)'}}/>
    </div>
    <h3 style={{fontSize:30, marginTop:18, letterSpacing:'-0.022em'}}>{name}</h3>
    <p style={{marginTop:14, fontSize:17, color:'var(--text)', maxWidth:'34ch', letterSpacing:'-0.01em'}}>{headline}</p>
    <p style={{marginTop:14, fontSize:14, color:'var(--text-2)', maxWidth:'42ch'}}>{desc}</p>
    <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:16, marginTop:28, paddingTop:24, borderTop:'1px solid var(--line)'}}>
      {stats.map(([k,v],i)=>(
        <div key={i}>
          <div className="kicker" style={{fontSize:10}}>{k}</div>
          <div style={{fontFamily:'var(--font-sans)', fontSize:22, marginTop:4, letterSpacing:'-0.02em'}}>{v}</div>
        </div>
      ))}
    </div>
    <div style={{marginTop:28}}>
      <a className="btn-link" href={href || '#'} style={{fontSize:13.5}}>Explore {name} <ArrowRight/></a>
    </div>
  </>
);

// ===== platform UIs =====
const YourPropFirmUI = () => {
  // Animated state — keeps the UI feeling live without overwhelming the eye.
  const [funded, setFunded] = React.useState(4128);
  const [delta, setDelta] = React.useState(312);
  const [tick, setTick] = React.useState(0);
  // Bar heights — base + a slow per-bar oscillation. We recompute on each tick.
  const baseBars = React.useMemo(
    () => Array.from({length:30}, (_,i)=> 18 + Math.abs(Math.sin(i*0.6))*30 + (i*0.4)),
    []
  );
  // Roster of traders. We rotate the first row every few seconds so it
  // feels like new activity arrives at the top.
  const ROSTER = [
    ['#80213','Aria Tan','SG','Phase 2','+$8,420','pos'],
    ['#80148','M. Adler','EU','Funded','+$14,210','pos'],
    ['#80092','J. Kovac','EU','Phase 1','-$2,140','neg'],
    ['#79988','R. Mensah','MEA','Funded','+$5,890','pos'],
    ['#79914','D. Park','APAC','Phase 2','+$1,210','pos'],
    ['#80411','S. Okafor','MEA','Phase 1','+$2,310','pos'],
    ['#80388','L. Romero','LATAM','Funded','+$9,640','pos'],
    ['#80356','Y. Chen','APAC','Phase 2','+$3,470','pos'],
    ['#80329','H. Müller','EU','Phase 1','-$640','neg'],
    ['#80298','F. Hassan','MEA','Funded','+$11,205','pos'],
  ];
  const [rosterStart, setRosterStart] = React.useState(0);
  // Counter roll-up on first mount.
  React.useEffect(() => {
    let raf;
    const start = performance.now();
    const from = 4060, to = 4128, dur = 1200;
    const loop = (t) => {
      const k = Math.min(1, (t - start) / dur);
      const eased = 1 - Math.pow(1 - k, 3);
      setFunded(Math.round(from + (to - from) * eased));
      if (k < 1) raf = requestAnimationFrame(loop);
    };
    raf = requestAnimationFrame(loop);
    return () => cancelAnimationFrame(raf);
  }, []);
  // Steady "live" tick — drives bar oscillation + occasional new-trader event.
  React.useEffect(() => {
    const id = setInterval(() => setTick(t => t + 1), 700);
    return () => clearInterval(id);
  }, []);
  // Every 3.5s: shift the roster (new lead row) and bump funded count by 1.
  React.useEffect(() => {
    const id = setInterval(() => {
      setRosterStart(s => (s + 1) % ROSTER.length);
      setFunded(f => f + 1);
      setDelta(d => d + 1);
    }, 3500);
    return () => clearInterval(id);
  }, []);
  // Visible roster window (5 rows, wrapping).
  const visible = Array.from({length:5}, (_,i) => ROSTER[(rosterStart + i) % ROSTER.length]);
  return (
  <div className="dash" style={{width:'100%', maxWidth:540}}>
    <div className="dash-chrome">
      <div className="traffic"><span/><span/><span/></div>
      <span className="mono" style={{fontSize:11, color:'var(--text-3)'}}>yourpropfirm / traders</span>
      <span className="pill" style={{fontSize:9.5}}>v4.18.2</span>
    </div>
    <div style={{padding:'18px 20px'}}>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'baseline'}}>
        <div>
          <div className="kicker" style={{fontSize:10}}>FUNDED TRADERS</div>
          <div style={{
            fontFamily:'var(--font-sans)', fontSize:28, letterSpacing:'-0.02em',
            marginTop:4, fontVariantNumeric:'tabular-nums',
          }}>{funded.toLocaleString()}</div>
        </div>
        <span className="mono" style={{fontSize:11, color:'var(--accent)', fontVariantNumeric:'tabular-nums'}}>
          +{delta} this week
        </span>
      </div>
      <div style={{height:48, marginTop:16, display:'flex', alignItems:'flex-end', gap:3}}>
        {baseBars.map((base, i) => {
          // Per-bar slow oscillation; phase offset by index keeps it organic.
          const wobble = Math.sin((tick + i * 1.7) * 0.55) * 3;
          const isAccent = i > 22;
          // Newest bar (last) gets a stronger pulse synced with the live tick.
          const pulse = i === 29 ? Math.abs(Math.sin(tick * 0.9)) * 4 : 0;
          const h = base + wobble + pulse;
          return (
            <div key={i} style={{
              flex:1,
              height: Math.max(8, h),
              background: isAccent ? 'var(--accent)' : 'rgba(255,255,255,0.18)',
              borderRadius:1,
              transition:'height 600ms cubic-bezier(0.4, 0, 0.2, 1)',
            }}/>
          );
        })}
      </div>
      <div style={{marginTop:18, fontSize:12, position:'relative'}}>
        {visible.map((r,i)=>(
          <div
            key={`${r[0]}-${rosterStart}`}
            style={{
              display:'grid', gridTemplateColumns:'60px 1fr 40px 70px 80px',
              gap:8, padding:'9px 0',
              borderTop: i?'1px solid var(--line)':'none',
              alignItems:'center',
              animation: i === 0 ? 'ypf-row-in 520ms cubic-bezier(0.22, 0.61, 0.36, 1) both' : 'none',
            }}
          >
            <span className="mono" style={{fontSize:11, color:'var(--text-4)'}}>{r[0]}</span>
            <span style={{color:'var(--text)'}}>{r[1]}</span>
            <span className="mono" style={{fontSize:10.5, color:'var(--text-3)'}}>{r[2]}</span>
            <span className="pill" style={{fontSize:9.5, padding:'2px 6px',
              background: r[3]==='Funded'?'var(--accent-faint)':'rgba(255,255,255,0.04)',
              color: r[3]==='Funded'?'var(--accent)':'var(--text-2)'}}>{r[3]}</span>
            <span className="mono" style={{fontSize:11, textAlign:'right', color: r[5]==='pos'?'var(--accent)':'var(--danger)'}}>{r[4]}</span>
          </div>
        ))}
      </div>
    </div>
    <style>{`
      @keyframes ypf-row-in {
        from { opacity: 0; transform: translateY(-8px); }
        to   { opacity: 1; transform: translateY(0); }
      }
    `}</style>
  </div>
  );
};

const QuantSentryUI = () => {
  const [tick, setTick] = React.useState(0);
  const [risk, setRisk] = React.useState(0.42);
  const [flagged, setFlagged] = React.useState(46);
  const [investigations, setInvestigations] = React.useState(12);
  const [alertIdx, setAlertIdx] = React.useState(0);
  const ALERTS = [
    {id:'RX-2034', time:'14:02:11', sev:'HIGH', sevColor:'danger',
     title:'Latency arbitrage pattern · acct 80213',
     meta:'7 trades · venue B → venue C · avg edge 38ms · confidence 0.94'},
    {id:'RX-2035', time:'14:02:47', sev:'MED',  sevColor:'warn',
     title:'Stop-hunt cluster · acct 79914 + 2',
     meta:'12 trades · venue A · spread anomaly · confidence 0.81'},
    {id:'RX-2036', time:'14:03:04', sev:'HIGH', sevColor:'danger',
     title:'Group-coordinated entries · 4 accts',
     meta:'cluster id #C-118 · venue B · t-delta < 80ms · confidence 0.91'},
    {id:'RX-2037', time:'14:03:22', sev:'LOW',  sevColor:'text-2',
     title:'News-window scalp · acct 80411',
     meta:'NFP +14ms · 1 trade · within tolerance · confidence 0.62'},
  ];
  // Steady tick drives heatmap breathing + counter jitter.
  React.useEffect(() => {
    const id = setInterval(() => setTick(t => t + 1), 600);
    return () => clearInterval(id);
  }, []);
  // Counters drift slowly to feel live without distracting.
  React.useEffect(() => {
    const id = setInterval(() => {
      setRisk(r => {
        const next = r + (Math.random() - 0.5) * 0.04;
        return Math.max(0.18, Math.min(0.78, parseFloat(next.toFixed(2))));
      });
      setFlagged(f => Math.max(28, f + (Math.random() < 0.55 ? 1 : -1)));
      setInvestigations(i => {
        if (Math.random() < 0.18) return Math.max(8, i + (Math.random() < 0.5 ? 1 : -1));
        return i;
      });
    }, 1800);
    return () => clearInterval(id);
  }, []);
  // Cycle alerts every ~3.2s.
  React.useEffect(() => {
    const id = setInterval(() => setAlertIdx(a => (a + 1) % ALERTS.length), 3200);
    return () => clearInterval(id);
  }, []);
  const a = ALERTS[alertIdx];
  // Risk color follows magnitude.
  const riskColor = risk < 0.5 ? 'var(--accent)' : risk < 0.7 ? 'var(--warn)' : 'var(--danger)';
  return (
  <div className="dash" style={{width:'100%', maxWidth:540}}>
    <div className="dash-chrome">
      <div className="traffic"><span/><span/><span/></div>
      <span className="mono" style={{fontSize:11, color:'var(--text-3)'}}>quantsentry / live · all venues</span>
      <span className="pill pill-accent" style={{fontSize:9.5}}>SCORING</span>
    </div>
    <div style={{padding:'18px 20px'}}>
      <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:12}}>
        {[
          ['Risk index', risk.toFixed(2), 'normal', riskColor],
          ['Auto-flagged', String(flagged), 'last 1h', 'var(--warn)'],
          ['Investigations', String(investigations), 'open', 'var(--text)'],
        ].map(([k,v,d,col],i)=>(
          <div key={i} style={{padding:14, background:'rgba(255,255,255,0.025)', borderRadius:8, border:'1px solid var(--line)'}}>
            <div className="kicker" style={{fontSize:9.5}}>{k}</div>
            <div style={{
              fontFamily:'var(--font-sans)', fontSize:24, letterSpacing:'-0.02em', marginTop:6,
              color: col, fontVariantNumeric:'tabular-nums',
              transition:'color 400ms ease',
            }}>{v}</div>
            <div className="mono" style={{fontSize:10, color:'var(--text-3)', marginTop:2}}>{d}</div>
          </div>
        ))}
      </div>
      <div style={{marginTop:16}}>
        <div className="kicker" style={{fontSize:10}}>PATTERN HEATMAP · LAST 24H</div>
        <div style={{display:'grid', gridTemplateColumns:'repeat(24,1fr)', gap:2, marginTop:8}}>
          {Array.from({length:24*5}).map((_,i)=>{
            // Base intensity: same recipe as before so the heatmap shape is recognisable.
            const base = (Math.sin(i*0.3)+Math.cos(i*0.17)+1.2)/3;
            // Slow breathing per cell, phase-offset by index.
            const breathe = (Math.sin((tick + i * 0.9) * 0.4) + 1) / 2; // 0..1
            // Right-most column ("now") gets a stronger live pulse.
            const col = i % 24;
            const isNow = col >= 22;
            const live = isNow ? Math.abs(Math.sin(tick * 0.7 + i)) * 0.35 : 0;
            const v = Math.max(0.06, base * (0.7 + breathe * 0.4) + live);
            const op = Math.max(0.06, Math.min(0.95, v * 0.9));
            return (
              <div key={i} style={{
                aspectRatio:'1',
                background:`rgba(0,255,255,${op})`,
                borderRadius:1,
                transition:'background 700ms ease',
              }}/>
            );
          })}
        </div>
        <div className="mono" style={{display:'flex', justifyContent:'space-between', fontSize:9.5, color:'var(--text-4)', marginTop:6}}>
          <span>00:00</span><span>06:00</span><span>12:00</span><span>18:00</span><span>now</span>
        </div>
      </div>
      <div
        key={a.id}
        style={{
          marginTop:14, padding:12, border:'1px solid var(--line)', borderRadius:8,
          background:'rgba(255,255,255,0.015)',
          animation:'qs-alert-in 480ms cubic-bezier(0.22, 0.61, 0.36, 1) both',
        }}
      >
        <div style={{display:'flex', alignItems:'center', gap:8}}>
          <span style={{
            width:6, height:6, borderRadius:'50%',
            background: a.sevColor === 'danger' ? 'var(--danger)' : a.sevColor === 'warn' ? 'var(--warn)' : 'var(--text-3)',
            animation:'qs-dot-pulse 1.6s ease-in-out infinite',
          }}/>
          <span className="mono" style={{fontSize:10.5, color:'var(--text-3)', fontVariantNumeric:'tabular-nums'}}>{a.id} · {a.time}</span>
          <span style={{flex:1}}/>
          <span className={`pill ${a.sevColor === 'danger' ? 'pill-danger' : ''}`} style={{
            fontSize:9.5,
            background: a.sevColor === 'warn' ? 'rgba(255,180,80,0.15)' : a.sevColor === 'text-2' ? 'rgba(255,255,255,0.06)' : undefined,
            color:    a.sevColor === 'warn' ? 'var(--warn)'           : a.sevColor === 'text-2' ? 'var(--text-2)'           : undefined,
          }}>{a.sev}</span>
        </div>
        <div style={{fontSize:13, marginTop:6, color:'var(--text)'}}>{a.title}</div>
        <div className="mono" style={{fontSize:10.5, color:'var(--text-3)', marginTop:4}}>
          {a.meta}
        </div>
      </div>
    </div>
    <style>{`
      @keyframes qs-alert-in {
        from { opacity: 0; transform: translateY(6px); }
        to   { opacity: 1; transform: translateY(0); }
      }
      @keyframes qs-dot-pulse {
        0%, 100% { box-shadow: 0 0 0 0 rgba(255,80,80,0.45); }
        50%      { box-shadow: 0 0 0 5px rgba(255,80,80,0); }
      }
    `}</style>
  </div>
  );
};

const BrokerUI = () => {
  const TARGETS = [12840, 4210, 3108, 2894, 2612];
  const LABELS  = ['Lead','KYC','Funded','Active','Retained'];
  const [counts, setCounts] = React.useState(TARGETS.map(v => Math.round(v * 0.97)));
  const [partners, setPartners] = React.useState(892);
  const [tick, setTick] = React.useState(0);
  const [hotChip, setHotChip] = React.useState(0);
  const CHIPS = ['cTrader','MatchTrader','DXTrade','API','KYC-1','KYC-2','PSP-A','PSP-B','BI'];
  // Animate counters up to target on mount.
  React.useEffect(() => {
    let raf;
    const start = performance.now();
    const from = TARGETS.map(v => Math.round(v * 0.97));
    const dur = 1300;
    const loop = (t) => {
      const k = Math.min(1, (t - start) / dur);
      const eased = 1 - Math.pow(1 - k, 3);
      setCounts(TARGETS.map((to, i) => Math.round(from[i] + (to - from[i]) * eased)));
      if (k < 1) raf = requestAnimationFrame(loop);
    };
    raf = requestAnimationFrame(loop);
    return () => cancelAnimationFrame(raf);
  }, []);
  // Funnel-style live updates: each tick, Lead gets a few new entries; sometimes
  // those cascade down the funnel with decreasing probability per stage.
  React.useEffect(() => {
    const id = setInterval(() => {
      setCounts(prev => {
        const next = [...prev];
        next[0] += 1 + Math.floor(Math.random() * 3);
        // Cascade: each stage has a probability of incrementing too.
        const probs = [1, 0.55, 0.4, 0.35, 0.3];
        for (let i = 1; i < next.length; i++) {
          if (Math.random() < probs[i]) next[i] += 1;
        }
        return next;
      });
    }, 1700);
    return () => clearInterval(id);
  }, []);
  // IB partners drift up occasionally; bar tick driver.
  React.useEffect(() => {
    const id = setInterval(() => setTick(t => t + 1), 650);
    return () => clearInterval(id);
  }, []);
  React.useEffect(() => {
    const id = setInterval(() => {
      if (Math.random() < 0.55) setPartners(p => p + 1);
    }, 2400);
    return () => clearInterval(id);
  }, []);
  // Cycle the "active heartbeat" highlight across integration chips.
  React.useEffect(() => {
    const id = setInterval(() => setHotChip(h => (h + 1) % CHIPS.length), 900);
    return () => clearInterval(id);
  }, []);
  return (
  <div className="dash" style={{width:'100%', maxWidth:540}}>
    <div className="dash-chrome">
      <div className="traffic"><span/><span/><span/></div>
      <span className="mono" style={{fontSize:11, color:'var(--text-3)'}}>broker / clients · pipeline</span>
      <span className="pill" style={{fontSize:9.5}}>EU + APAC</span>
    </div>
    <div style={{padding:'18px 20px'}}>
      <div className="kicker" style={{fontSize:10}}>CLIENT LIFECYCLE · LAST 30D</div>
      <div style={{display:'grid', gridTemplateColumns:'repeat(5, 1fr)', gap:6, marginTop:12}}>
        {LABELS.map((k,i)=>(
          <div key={i} style={{padding:'12px 10px', background:'rgba(255,255,255,0.022)',
            border:'1px solid var(--line)', borderRadius:6, position:'relative', overflow:'hidden'}}>
            <div className="mono" style={{fontSize:9.5, color:'var(--text-4)', letterSpacing:'0.06em'}}>{k.toUpperCase()}</div>
            <div style={{
              fontFamily:'var(--font-sans)', fontSize:16, marginTop:4,
              letterSpacing:'-0.015em', fontVariantNumeric:'tabular-nums',
            }}>{counts[i].toLocaleString()}</div>
            <div style={{position:'absolute', left:0, bottom:0, height:2, width:`${100-(i*15)}%`, background:'var(--accent)', opacity:0.7}}/>
          </div>
        ))}
      </div>
      <div style={{marginTop:18, display:'grid', gridTemplateColumns:'1fr 1fr', gap:14}}>
        <div style={{padding:14, border:'1px solid var(--line)', borderRadius:8}}>
          <div className="kicker" style={{fontSize:10}}>IB NETWORK</div>
          <div style={{
            fontFamily:'var(--font-sans)', fontSize:22, marginTop:6, letterSpacing:'-0.02em',
            fontVariantNumeric:'tabular-nums',
          }}>{partners} <span style={{color:'var(--text-4)', fontSize:13}}>partners</span></div>
          <div style={{display:'flex', gap:3, marginTop:10}}>
            {Array.from({length:24}).map((_,i)=>{
              const base = 6 + Math.abs(Math.sin(i*0.7))*16;
              const wobble = Math.sin((tick + i * 1.3) * 0.6) * 2.5;
              const h = Math.max(4, base + wobble);
              return (
                <div key={i} style={{
                  flex:1, height:h,
                  background:'var(--accent)',
                  opacity:0.4 + (i/40),
                  borderRadius:1,
                  transition:'height 600ms cubic-bezier(0.4, 0, 0.2, 1)',
                }}/>
              );
            })}
          </div>
        </div>
        <div style={{padding:14, border:'1px solid var(--line)', borderRadius:8}}>
          <div className="kicker" style={{fontSize:10}}>INTEGRATIONS</div>
          <div style={{fontFamily:'var(--font-sans)', fontSize:22, marginTop:6, letterSpacing:'-0.02em'}}>126 <span style={{color:'var(--text-4)', fontSize:13}}>active</span></div>
          <div style={{display:'flex', flexWrap:'wrap', gap:4, marginTop:10}}>
            {CHIPS.map((t,i)=>{
              const hot = i === hotChip;
              return (
                <span key={i} className="mono" style={{
                  fontSize:9.5, padding:'2px 5px',
                  border:'1px solid',
                  borderColor: hot ? 'rgba(0,255,255,0.55)' : 'var(--line)',
                  borderRadius:3,
                  color: hot ? 'var(--accent)' : 'var(--text-3)',
                  background: hot ? 'rgba(0,255,255,0.08)' : 'transparent',
                  boxShadow: hot ? '0 0 0 2px rgba(0,255,255,0.10)' : 'none',
                  transition:'all 380ms ease',
                }}>{t}</span>
              );
            })}
          </div>
        </div>
      </div>
    </div>
  </div>
  );
};

// ===== QuantCX — CX / engagement console =====
const QuantCXUI = () => {
  const [open, setOpen] = React.useState(284);
  const [resolved, setResolved] = React.useState(71);
  const [tick, setTick] = React.useState(0);
  React.useEffect(() => {
    const id = setInterval(() => {
      setTick(t => t + 1);
      if (Math.random() < 0.5) setOpen(o => Math.max(240, Math.min(320, o + (Math.random()<0.5?-1:1)*2)));
      if (Math.random() < 0.3) setResolved(r => Math.max(66, Math.min(78, r + (Math.random()<0.5?-1:1))));
    }, 1100);
    return () => clearInterval(id);
  }, []);
  const convos = [
    ['CHAT','Payout ETA · acct 80213','auto','accent'],
    ['EMAIL','KYC document resubmit','agent','text'],
    ['CHAT','Challenge reset request','auto','accent'],
    ['TICKET','Platform login · 2FA','open','warn'],
  ];
  const channels = [['Chat',54],['Email',28],['Ticket',18]];
  return (
  <div className="dash" style={{width:'100%', maxWidth:540}}>
    <div className="dash-chrome">
      <div className="traffic"><span/><span/><span/></div>
      <span className="mono" style={{fontSize:11, color:'var(--text-3)'}}>quantcx / inbox · omnichannel</span>
      <span className="pill pill-accent" style={{fontSize:9.5}}>LIVE</span>
    </div>
    <div style={{padding:'18px 20px'}}>
      <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:12}}>
        {[['Open convos', open.toLocaleString(), 'var(--text)'],['Auto-resolved', resolved+'%', 'var(--accent)'],['Trader CSAT', '94%', 'var(--accent)']].map(([k,v,c],i)=>(
          <div key={i} style={{padding:13, background:'rgba(255,255,255,0.025)', borderRadius:8, border:'1px solid var(--line)'}}>
            <div className="kicker" style={{fontSize:9.5}}>{k}</div>
            <div style={{fontFamily:'var(--font-sans)', fontSize:22, marginTop:6, letterSpacing:'-0.02em', color:c, fontVariantNumeric:'tabular-nums'}}>{v}</div>
          </div>
        ))}
      </div>
      <div style={{marginTop:16}}>
        <div className="kicker" style={{fontSize:10}}>CHANNEL MIX · 24H</div>
        <div style={{display:'flex', gap:6, marginTop:8}}>
          {channels.map(([n,pct],i)=>(
            <div key={i} style={{flex:pct, padding:'7px 9px', borderRadius:6, background:i===0?'var(--accent-faint)':'rgba(255,255,255,0.03)', border:'1px solid var(--line)'}}>
              <div className="mono" style={{fontSize:9.5, color:i===0?'var(--accent)':'var(--text-3)'}}>{n} · {pct}%</div>
            </div>
          ))}
        </div>
      </div>
      <div style={{marginTop:16, display:'flex', flexDirection:'column', gap:0}}>
        {convos.map((c,i)=>(
          <div key={i} style={{display:'grid', gridTemplateColumns:'58px 1fr auto', gap:10, alignItems:'center', padding:'9px 0', borderTop:i?'1px solid var(--line)':'none'}}>
            <span className="mono" style={{fontSize:9.5, color:'var(--text-4)', letterSpacing:'0.06em'}}>{c[0]}</span>
            <span style={{fontSize:12.5, color:'var(--text-2)', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap'}}>{c[1]}</span>
            <span className="pill" style={{fontSize:9, background:c[3]==='accent'?'var(--accent-faint)':c[3]==='warn'?'oklch(0.82 0.14 75 / 0.12)':'rgba(255,255,255,0.04)', color:c[3]==='accent'?'var(--accent)':c[3]==='warn'?'var(--warn)':'var(--text-3)'}}>{c[2]}</span>
          </div>
        ))}
      </div>
    </div>
  </div>
  );
};

// ===== PropTradeGroup — managed white-label prop firm =====
const PropTradeGroupUI = () => {
  const [funded, setFunded] = React.useState(1284);
  const [tick, setTick] = React.useState(0);
  const bars = React.useMemo(() => Array.from({length:26}, (_,i)=> 14 + Math.abs(Math.sin(i*0.55))*30 + i*0.7), []);
  React.useEffect(() => {
    const id = setInterval(() => { setTick(t=>t+1); if (Math.random()<0.4) setFunded(f=>f+1); }, 1000);
    return () => clearInterval(id);
  }, []);
  return (
  <div className="dash" style={{width:'100%', maxWidth:540}}>
    <div className="dash-chrome">
      <div className="traffic"><span/><span/><span/></div>
      <span className="mono" style={{fontSize:11, color:'var(--text-3)'}}>proptradegroup / overview · managed</span>
      <span className="pill" style={{fontSize:9.5}}>WHITE-LABEL</span>
    </div>
    <div style={{padding:'18px 20px'}}>
      <div style={{display:'flex', justifyContent:'space-between', alignItems:'baseline'}}>
        <div>
          <div className="kicker" style={{fontSize:10}}>FUNDED TRADERS · MANAGED</div>
          <div style={{fontFamily:'var(--font-sans)', fontSize:28, letterSpacing:'-0.02em', marginTop:4, fontVariantNumeric:'tabular-nums'}}>{funded.toLocaleString()}</div>
        </div>
        <span className="mono" style={{fontSize:11, color:'var(--accent)'}}>40+ brands</span>
      </div>
      <div style={{height:54, marginTop:16, display:'flex', alignItems:'flex-end', gap:3}}>
        {bars.map((base,i)=>{
          const h = base + Math.sin((tick+i*1.6)*0.55)*3;
          return <div key={i} style={{flex:1, height:Math.max(8,h), background:i>19?'var(--accent)':'rgba(255,255,255,0.18)', borderRadius:1, transition:'height 600ms cubic-bezier(0.4,0,0.2,1)'}}/>;
        })}
      </div>
      <div style={{marginTop:16, display:'grid', gridTemplateColumns:'1fr 1fr', gap:12}}>
        {[['Payouts · MTD','$4.8M','accent'],['Run by QTG','Risk · Support · Ops','text']].map(([k,v,c],i)=>(
          <div key={i} style={{padding:13, border:'1px solid var(--line)', borderRadius:8}}>
            <div className="kicker" style={{fontSize:9.5}}>{k}</div>
            <div style={{fontFamily:'var(--font-sans)', fontSize:i?15:20, marginTop:6, letterSpacing:'-0.015em', color:c==='accent'?'var(--accent)':'var(--text)'}}>{v}</div>
          </div>
        ))}
      </div>
    </div>
  </div>
  );
};

// ===== TradoPay — payments / payout treasury =====
const TradoPayUI = () => {
  const [queueStart, setQueueStart] = React.useState(0);
  const QUEUE = [
    ['$8,420','USDT · TRC20','approved','accent'],
    ['€1,800','SEPA','processing','warn'],
    ['$14,210','Wire · USD','approved','accent'],
    ['$2,310','Card refund','queued','text'],
    ['$5,890','USDT · ERC20','approved','accent'],
  ];
  React.useEffect(() => {
    const id = setInterval(() => setQueueStart(s => (s+1)%QUEUE.length), 2600);
    return () => clearInterval(id);
  }, []);
  const visible = Array.from({length:4}, (_,i)=>QUEUE[(queueStart+i)%QUEUE.length]);
  const rails = ['SEPA','SWIFT','USDT','USDC','Card','Wire'];
  return (
  <div className="dash" style={{width:'100%', maxWidth:540}}>
    <div className="dash-chrome">
      <div className="traffic"><span/><span/><span/></div>
      <span className="mono" style={{fontSize:11, color:'var(--text-3)'}}>tradopay / treasury · payouts</span>
      <span className="pill pill-accent" style={{fontSize:9.5}}>T+0</span>
    </div>
    <div style={{padding:'18px 20px'}}>
      <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:12}}>
        {[['Settled · 24h','$2.84M','accent'],['Recon match','99.6%','accent']].map(([k,v,c],i)=>(
          <div key={i} style={{padding:13, background:'rgba(255,255,255,0.025)', borderRadius:8, border:'1px solid var(--line)'}}>
            <div className="kicker" style={{fontSize:9.5}}>{k}</div>
            <div style={{fontFamily:'var(--font-sans)', fontSize:22, marginTop:6, letterSpacing:'-0.02em', color:'var(--accent)', fontVariantNumeric:'tabular-nums'}}>{v}</div>
          </div>
        ))}
      </div>
      <div style={{marginTop:16}}>
        <div className="kicker" style={{fontSize:10}}>PAYOUT QUEUE</div>
        <div style={{marginTop:8}}>
          {visible.map((r,i)=>(
            <div key={`${r[0]}-${queueStart}`} style={{display:'grid', gridTemplateColumns:'auto 1fr auto', gap:10, alignItems:'center', padding:'9px 0', borderTop:i?'1px solid var(--line)':'none', animation:i===0?'ypf-row-in 520ms cubic-bezier(0.22,0.61,0.36,1) both':'none'}}>
              <span className="mono" style={{fontSize:12, color:'var(--text)'}}>{r[0]}</span>
              <span className="mono" style={{fontSize:10.5, color:'var(--text-3)'}}>{r[1]}</span>
              <span className="pill" style={{fontSize:9, background:r[3]==='accent'?'var(--accent-faint)':r[3]==='warn'?'oklch(0.82 0.14 75 / 0.12)':'rgba(255,255,255,0.04)', color:r[3]==='accent'?'var(--accent)':r[3]==='warn'?'var(--warn)':'var(--text-3)'}}>{r[2]}</span>
            </div>
          ))}
        </div>
      </div>
      <div style={{marginTop:14, display:'flex', flexWrap:'wrap', gap:4}}>
        {rails.map((t,i)=>(<span key={i} className="mono" style={{fontSize:9.5, padding:'3px 7px', border:'1px solid var(--line)', borderRadius:4, color:'var(--text-3)'}}>{t}</span>))}
      </div>
    </div>
  </div>
  );
};

Object.assign(window, { PlatformsSection });
