/* ORGULLO MILLONARIO · Página principal — React + Tailwind · Liquid Glass iOS 26 Lee TODO en vivo desde OM-DB (el Panel SaaS lo escribe). */ const {useState,useEffect,useRef,useMemo,useSyncExternalStore,createContext,useContext}=React; /* ---- suscripción viva a OM-DB ---- */ function useDB(){ return useSyncExternalStore(OMDB.subscribe, OMDB.get); } /* ---- icons ---- */ const I={ home:, ticket:<>, cards:<>, gift:<>, squad:<>, wa:, }; const Ic=({n,s=18,c=""})=>{I[n]}; const RARE={'COMÚN':'#9a9aa6','PLATA':'#c0c0cb','ORO':'#ffcf3e','LEYENDA':'#ff2e3e','HOLOGRÁFICA':'#8b5cf6','ULTRA PREMIUM':'#22d3ee'}; /* ---- toast ---- */ const ToastCtx=createContext(()=>{}); function ToastHost({children}){ const [msg,setMsg]=useState(null);const t=useRef(); const toast=m=>{setMsg(m);clearTimeout(t.current);t.current=setTimeout(()=>setMsg(null),2400);}; return {children}
{msg}
; } /* ---- countdown ---- */ function useCountdown(iso){ const [d,setD]=useState(()=>calc(iso)); useEffect(()=>{const t=setInterval(()=>setD(calc(iso)),1000);return()=>clearInterval(t);},[iso]); return d; } function calc(iso){ let ms=Math.max(0,new Date(iso).getTime()-Date.now()); const p=n=>String(n).padStart(2,'0'); const dd=Math.floor(ms/864e5);ms-=dd*864e5;const hh=Math.floor(ms/36e5);ms-=hh*36e5;const mm=Math.floor(ms/6e4);const ss=Math.floor((ms-mm*6e4)/1000); return {dd:p(dd),hh:p(hh),mm:p(mm),ss:p(ss)}; } const Chip=({children,c='#ff2e3e'})=>{children}; const SectionTitle=({k,t,right})=>(
{k}

{t}

{right}
); /* ============ HERO ============ */ function Hero(){ const db=useDB();const toast=useContext(ToastCtx); const p=db.partido;const c=useCountdown(p.fecha); return
TEMPORADA 2026SOMOS RIVER

{db.config.hero_titulo}

{db.config.hero_subtitulo}

{/* next match card */}
{p.competencia}PRÓXIMO PARTIDO
{p.local}
VS{p.estadio}
{p.visitante}
{[['DÍAS',c.dd],['HS',c.hh],['MIN',c.mm],['SEG',c.ss]].map(([l,v])=>(
{v}{l}
))}
; } /* ============ VIAJE / BOARDING ============ */ function ViajeModule(){ const db=useDB();const toast=useContext(ToastCtx); const cats=[['VIP','#8b5cf6',120000],['ORO','#ffcf3e',90000],['PLATA','#c0c0cb',60000],['BRONCE','#b0763a',40000]]; const taken=useMemo(()=>new Set(['A1','B2','D1','C3','A5','D6','B7']),[]); const [sel,setSel]=useState('B4'); const catOf=r=>r<=2?cats[0]:r<=4?cats[1]:r<=6?cats[2]:cats[3]; return
MI VIAJE · ELEGÍ ASIENTO
{cats.map(([n,c])=>{n})}
{Array.from({length:10},(_,ri)=>{const r=ri+1;const[cn,cc]=catOf(r); return {r} {['A','B','','C','D'].map((col,ci)=>{if(!col)return ;const id=col+r;const isT=taken.has(id);const isS=sel===id; return ;})} ;})}
$ 30.000DEPÓSITO · de $ 420.000
PASE CONFIRMADO
PASE DE ABORDAJEOM-{sel}-0024
RIVER
VS
BARRACAS
{[['FECHA','25 JUL'],['ASIENTO',sel],['SERV.','MIX']].map(([l,v])=>
{l}{v}
)}

SALIDA 12:00 HS
LA COSTANERA
{db.config.punto_salida}
BUS 02 · SEMICAMA

; } function qrPath(){let seed=20260725;const rnd=()=>((seed=(seed*1103515245+12345)&0x7fffffff)/0x7fffffff);let h='';const F=(x,y)=>h+=``;for(let y=0;y<29;y++)for(let x=0;x<29;x++){const f=(x<8&&y<8)||(x>20&&y<8)||(x<8&&y>20);if(!f&&rnd()>.52)h+=``;}F(0,0);F(22,0);F(0,22);return h;} /* ============ FIGURITAS ============ */ function FiguritasModule(){ const db=useDB();const toast=useContext(ToastCtx); const [filter,setFilter]=useState('TODAS'); const tiers=['TODAS','COMÚN','PLATA','ORO','LEYENDA','HOLOGRÁFICA']; const total=250, done=106; return
{tiers.map(t=>)}}/>
{db.figuritas.filter(f=>filter==='TODAS'||f.tier===filter).map(f=>{const c=RARE[f.tier]||'#9a9aa6'; return
{f.tenida ?<>{f.nombre} {f.flag&&{f.flag}} {f.num&&{f.num}} {(f.tier==='HOLOGRÁFICA'||f.tier==='ULTRA PREMIUM')&&}
{f.nombre} {f.tier} · ×{f.cant}
:
?
BLOQUEADA
}
;})}
MI ÁLBUM · {done}/{total}{Math.round(done/total*100)}%
; } /* ============ PLANTEL carrusel ============ */ function PlantelModule(){ const db=useDB(); const POS={ARQ:'#22d3ee',DEF:'#2f7df6',MED:'#22c55e',DEL:'#ff2e3e'}; return
{db.plantel.map(p=>(
{p.num}
{p.n}
{p.pos} · #{p.num}
))}
; } /* ============ SORTEO ============ */ function SorteoModule(){ const db=useDB();const toast=useContext(ToastCtx);const s=db.sorteo; const sold=useMemo(()=>new Set(s.sold),[s.sold]); const [pick,setPick]=useState(()=>new Set()); const toggle=n=>{if(sold.has(n))return;const nx=new Set(pick);nx.has(n)?nx.delete(n):nx.add(n);setPick(nx);}; return
${s.precio} c/u}/>
{s.premio}
{Array.from({length:s.total},(_,n)=>{const isS=sold.has(n);const isP=pick.has(n); return ;})}
; } /* ============ FIXTURE ============ */ function FixtureModule(){ const db=useDB();const cl=db.clasico;const c=useCountdown(cl.fecha); return
{cl.torneo}

SUPERCLÁSICO

RIVER
VS
BOCA
{[['DÍAS',c.dd],['HS',c.hh],['MIN',c.mm],['SEG',c.ss]].map(([l,v])=>
{v}{l}
)}
CALENDARIO
{db.fixture.map((f,i)=>(
{f.rival}{f.dia} · {f.hora}
{f.cond} {f.res}
))}
; } /* ============ SPONSORS ============ */ function SponsorsModule(){ const db=useDB();const T=[['ORO','#ffcf3e'],['PLATA','#c0c0cb'],['BRONCE','#b0763a']]; return
NUESTROS ALIADOS

Sponsors Oficiales

{T.map(([t,c])=>(
{t}
{(db.sponsors[t]||[]).map((sp,i)=>(
{sp.logo?:{sp.nombre}}
))}
))}
; } /* ============ NAV / APP ============ */ const NAV=[['inicio','home','Inicio'],['viaje','ticket','Viaje'],['figuritas','cards','Figuritas'],['plantel','squad','Plantel'],['sorteo','gift','Sorteos']]; function App(){ const db=useDB();const toast=useContext(ToastCtx); useEffect(()=>{document.body.classList.toggle('theme-light',db.config.tema==='light');},[db.config.tema]); const go=id=>{const el=document.getElementById('s-'+id);if(el)window.scrollTo({top:el.getBoundingClientRect().top+window.scrollY-88,behavior:'smooth'});}; return <>
{/* top nav */}
ORGULLOMILLONARIO
ORGULLO MILLONARIO ® 2026 · SIEMPRE JUNTOS, DONDE SEA · PANEL
{/* tab bar móvil */} ; } ReactDOM.createRoot(document.getElementById('root')).render();