/* 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=""})=>;
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}
;
}
/* ---- 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})=>(
);
/* ============ 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}
)}
;
}
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.flag&&
{f.flag}}
{f.num&&
{f.num}}
{(f.tier==='HOLOGRÁFICA'||f.tier==='ULTRA PREMIUM')&&
}
{f.nombre}
{f.tier} · ×{f.cant}
>
:
}
;})}
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
{/* tab bar móvil */}
>;
}
ReactDOM.createRoot(document.getElementById('root')).render();