/* ORGULLO MILLONARIO · Landing modular — React + Tailwind · Liquid Glass iOS 26
   Réplica del sitio completo. Cada sección Y cada bloque (tarjetas/banners) se
   prende/apaga desde el Panel SaaS (config.sections[].on + blocks[].on) y se
   refleja EN VIVO vía OM-DB. */
const {useState,useEffect,useRef,useMemo,useSyncExternalStore,createContext,useContext}=React;
const useDB=()=>useSyncExternalStore(OMDB.subscribe,OMDB.get);

/* ---- icons ---- */
const I={
  home:<path d="M4 11 12 4l8 7M6 10v10h12V10"/>,
  cal:<><rect x="3" y="4" width="18" height="17" rx="2"/><path d="M8 2v4M16 2v4M3 10h18"/></>,
  ticket:<><path d="M5 9V6a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v3a2 2 0 0 0 0 4v3a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3a2 2 0 0 0 0-4Z"/></>,
  chat:<path d="M21 12a8 8 0 0 1-8 8H4l2-3a8 8 0 1 1 15-5Z"/>,
  user:<><circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/></>,
  wa:<path d="M12 3a9 9 0 0 0-7.7 13.6L3 21l4.6-1.2A9 9 0 1 0 12 3Zm4.8 12.3c-.2.6-1.2 1.1-1.7 1.1-.4 0-1 .1-3.2-.9-2.7-1.2-4.3-4-4.5-4.2-.1-.2-1-1.3-1-2.5s.6-1.8.9-2c.2-.3.5-.3.6-.3h.5c.2 0 .4 0 .6.5l.7 1.8c.1.2.1.4 0 .5l-.4.5c-.1.2-.3.3-.1.6.1.3.7 1.1 1.4 1.7.9.8 1.6 1 1.9 1.2.2 0 .4 0 .5-.2l.6-.7c.2-.2.4-.2.6-.1l1.7.8c.2.1.4.2.4.3.1.2.1.6 0 .9Z"/>,
  ig:<><rect x="3" y="3" width="18" height="18" rx="5"/><circle cx="12" cy="12" r="4"/><circle cx="17.5" cy="6.5" r="1"/></>,
  yt:<><rect x="3" y="6" width="18" height="12" rx="3"/><path d="m10 9 5 3-5 3V9Z"/></>,
  tk:<path d="M14 4c.5 2.5 2 4 4.5 4.2V11c-1.7 0-3.2-.5-4.5-1.4v5.7A4.8 4.8 0 1 1 9.2 10v2.6a2.2 2.2 0 1 0 2 2.2V4h2.8Z"/>,
  x:<path d="M4 4l16 16M20 4 4 20"/>,
  arrow:<path d="M5 12h14M13 6l6 6-6 6"/>,
  lock:<><rect x="4" y="11" width="16" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></>,
  play:<path d="M8 5v14l11-7L8 5Z"/>,
  chev:<path d="m9 6 6 6-6 6"/>,
  up:<path d="M12 19V5M6 11l6-6 6 6"/>,
};
const Ic=({n,s=18,c=""})=><svg viewBox="0 0 24 24" width={s} height={s} className={c} fill="none" stroke="currentColor" strokeWidth="1.7" strokeLinecap="round" strokeLinejoin="round">{I[n]}</svg>;

/* ---- crests (imagen si existe, si no badge con iniciales) ---- */
const CRESTS={river:'assets/clubs/river.png',boca:'assets/clubs/boca.png',barracas:'assets/clubs/barracas.png',argentinos:'assets/clubs/argentinos.png',racing:'assets/clubs/racing.png',talleres:'assets/talleres.png',gimnasia:'assets/clubs/gimnasia.png',rosario:'assets/clubs/rosario.png',flamengo:'assets/clubs/flamengo.png',millonarios:'assets/clubs/millonarios.png',penarol:'assets/clubs/penarol.png',tigre:'assets/clubs/tigre.png',ciudadbolivar:'assets/clubs/ciudadbolivar.png',velez:'assets/clubs/velez.png',banfield:'assets/clubs/banfield.png',indeprivadavia:'assets/clubs/indeprivadavia.png',huracan:'assets/clubs/huracan.png',sarmiento:'assets/clubs/sarmiento.png',estudiantesrc:'assets/clubs/estudiantesrc.png',estudiantes:'assets/clubs/estudiantes.png',belgrano:'assets/clubs/belgrano.png',blooming:'assets/clubs/blooming.png',carabobo:'assets/clubs/carabobo.png',caracas:'assets/clubs/caracas.png',aldosivi:'assets/clubs/aldosivi.png',bragantino:'assets/clubs/bragantino.png',tucuman:'assets/clubs/tucuman.png',sanlorenzo:'assets/clubs/sanlorenzo.png',newells:'assets/clubs/newells.png',santafe:'assets/clubs/santafe.png',independiente:'assets/clubs/independiente.png'};
function Crest({k,name,s=32,logo}){
  const src=logo||CRESTS[k];
  if(src)return <img src={src} alt={name||''} style={{width:s,height:s,objectFit:'contain'}} className="drop-shadow-[0_2px_6px_rgba(0,0,0,.4)]"/>;
  const ini=(name||'?').replace(/[^A-Za-zÁÉÍÓÚÑ ]/g,'').split(/\s+/).filter(Boolean).slice(0,2).map(w=>w[0]).join('').toUpperCase();
  return <span style={{width:s,height:s,borderRadius:'50%',display:'grid',placeItems:'center',fontFamily:'Oswald',fontWeight:700,fontSize:s*.42,background:'radial-gradient(circle at 35% 30%,#2a2a33,#111116)',border:'1px solid rgba(255,255,255,.14)',color:'#c0c0cb',flex:'none'}}>{ini}</span>;
}
const FORMA={G:['#2fe07a','rgba(47,224,122,.16)'],P:['#ff5a63','rgba(255,90,99,.16)'],E:['#e0a24e','rgba(224,162,78,.16)']};
const FormaBadges=({str,s=24})=><div className="flex gap-1.5">{str.split('').map((r,i)=>{const[c,bg]=FORMA[r]||FORMA.E;return <span key={i} style={{width:s,height:s,borderRadius:6,display:'grid',placeItems:'center',fontFamily:'Oswald',fontWeight:700,fontSize:s*.5,color:c,background:bg,border:'1px solid '+c}}>{r}</span>;})}</div>;

/* ---- 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 <ToastCtx.Provider value={toast}>{children}
    <div className={`fixed left-1/2 -translate-x-1/2 bottom-24 md:bottom-8 z-[90] transition-all duration-300 ${msg?'opacity-100 translate-y-0':'opacity-0 translate-y-4 pointer-events-none'}`}>
      <div className="glass rounded-2xl px-5 py-3 text-[13px] font-semibold" style={{borderColor:'rgba(224,30,47,.45)'}}>{msg}</div>
    </div>
  </ToastCtx.Provider>;
}

/* ---- 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)};}
function faltan(iso){let ms=new Date(iso)-Date.now();if(ms<0)return 'Jugado';const d=Math.floor(ms/864e5);const h=Math.floor((ms%864e5)/36e5);return `Faltan ${d}d ${h}h`;}

const Chip=({children,c='#ff2e3e'})=><span className="font-mono text-[8.5px] tracking-[1.5px] px-2.5 py-1 rounded-full" style={{color:c,background:c+'1e',border:`1px solid ${c}55`}}>{children}</span>;
const Eyebrow=({k,t,sub})=>(
  <div className="text-center mb-7">
    <div className="font-mono text-[10px] tracking-[3px] text-river2 mb-2">{k}</div>
    <h2 className="font-disp font-700 text-[34px] md:text-[54px] leading-[.95] tracking-[-.5px]">{t}</h2>
    {sub&&<p className="text-mut text-[14px] mt-2.5 max-w-lg mx-auto">{sub}</p>}
  </div>
);
const CountBoxes=({c,accent='#ffcf3e'})=>(
  <div className="grid grid-cols-4 gap-2 max-w-sm mx-auto">
    {[['DÍAS',c.dd],['HS',c.hh],['MIN',c.mm],['SEG',c.ss]].map(([l,v])=>(
      <div key={l} className="bg-black/35 rounded-2xl py-2.5 text-center border border-white/[.06]"><b className="font-disp text-[22px] md:text-[28px] tabular-nums leading-none" style={{color:accent}}>{v}</b><small className="font-mono text-[7px] tracking-[1.5px] text-mut block mt-1">{l}</small></div>))}
  </div>
);
const Bar=({pct,bg})=><div className="h-[6px] rounded-full bg-white/10 overflow-hidden"><i className="block h-full rounded-full" style={{width:pct+'%',background:bg||'linear-gradient(90deg,#8d0917,#ff2e3e)'}}/></div>;

/* helper visibilidad — la modularización SOLO aplica si el panel la activó */
function useVis(){
  const db=useDB();const modular=!!db.config.modular;const secs=db.config.sections||[];
  const blockOn=(secId,blkId)=>{if(!modular)return true;const s=secs.find(x=>x.id===secId);if(!s)return true;const b=(s.blocks||[]).find(x=>x.id===blkId);return b?b.on:true;};
  return {secs,blockOn,modular};
}

/* ============ SHIRT 360 ============ */
function Shirt360({front,back,s=150}){
  const [ang,setAng]=useState(0);const drag=useRef(null);const auto=useRef(true);const resume=useRef();
  useEffect(()=>{let last=performance.now(),raf;const loop=t=>{const dt=t-last;last=t;if(auto.current)setAng(a=>(a+dt*0.045)%360);raf=requestAnimationFrame(loop);};raf=requestAnimationFrame(loop);return()=>cancelAnimationFrame(raf);},[]);
  const down=e=>{auto.current=false;clearTimeout(resume.current);drag.current={x:e.clientX,a:ang};e.currentTarget.setPointerCapture&&e.currentTarget.setPointerCapture(e.pointerId);};
  const move=e=>{if(drag.current)setAng(drag.current.a+(e.clientX-drag.current.x)*0.8);};
  const up=()=>{if(drag.current){drag.current=null;resume.current=setTimeout(()=>auto.current=true,2200);}};
  return <div className="flex flex-col items-center gap-2 select-none">
    <div onPointerDown={down} onPointerMove={move} onPointerUp={up} onPointerCancel={up} className="relative cursor-grab active:cursor-grabbing touch-none" style={{width:s,height:s*1.28,perspective:'700px'}}>
      <div className="absolute inset-0" style={{transformStyle:'preserve-3d',transform:`rotateY(${ang}deg)`}}>
        <img src={front} draggable="false" className="absolute inset-0 w-full h-full object-contain drop-shadow-[0_14px_26px_rgba(0,0,0,.65)]" style={{backfaceVisibility:'hidden'}}/>
        <img src={back||front} draggable="false" className="absolute inset-0 w-full h-full object-contain drop-shadow-[0_14px_26px_rgba(0,0,0,.65)]" style={{backfaceVisibility:'hidden',transform:'rotateY(180deg)'}}/>
      </div>
    </div>
    <span className="font-mono text-[7.5px] tracking-[1.5px] text-mut">↺ ARRASTRÁ PARA GIRAR 360°</span>
  </div>;
}

/* ============ HERO ============ */
function Particles(){
  const dots=React.useMemo(()=>Array.from({length:26},(_,i)=>({l:Math.random()*100,d:8+Math.random()*10,delay:-Math.random()*12,s:2+Math.random()*3,o:.25+Math.random()*.5})),[]);
  return <div className="absolute inset-0 overflow-hidden pointer-events-none" style={{zIndex:2}}>
    {dots.map((p,i)=><span key={i} className="absolute rounded-full" style={{left:p.l+'%',bottom:'-10px',width:p.s,height:p.s,background:'#ff2e3e',boxShadow:'0 0 8px 1px rgba(255,46,62,.8)',opacity:p.o,animation:`floatUp ${p.d}s linear ${p.delay}s infinite`}}/>)}
  </div>;
}
function Hero(){
  const db=useDB();
  const now=Date.now();const dur=2*3600*1000;
  const ck=u=>{const m=(u||'').match(/([a-z]+)\.png/i);return m?m[1]:'river';};
  const pool=(db.proximos||[]).slice().sort((a,b)=>new Date(a.fecha)-new Date(b.fecha));
  const live=pool.find(x=>{const t=new Date(x.fecha).getTime();return now>=t&&now<=t+dur;});
  const p=live||pool.find(x=>new Date(x.fecha).getTime()>now)||db.partido;
  const jugando=!!live;
  const c=useCountdown(p.fecha);
  const dd=new Date(p.fecha);
  return <section className="relative" style={{minHeight:'100vh',width:'100vw',marginLeft:'calc(50% - 50vw)',marginRight:'calc(50% - 50vw)',marginTop:'calc(-1 * var(--om-main-pt,16px))'}}>
    <div className="absolute inset-0 overflow-hidden" style={{zIndex:0}}>
    <video src="assets/hero.mp4" autoPlay muted loop playsInline className="absolute inset-0 w-full h-full object-cover" style={{zIndex:0,background:'#0b0b10'}}/>
    <div className="absolute inset-0" style={{zIndex:1,background:'linear-gradient(180deg,rgba(8,8,11,.35) 0%,rgba(8,8,11,.35) 42%,rgba(8,8,11,.94) 100%)'}}/>
    <div className="absolute inset-0" style={{zIndex:1,background:'radial-gradient(75% 55% at 50% 8%,rgba(224,30,47,.28),transparent 60%)'}}/>
    </div>
    <Particles/>
    <span className="absolute left-0 right-0 top-0 h-[2px]" style={{zIndex:3,background:'linear-gradient(90deg,transparent,rgba(255,46,62,.8),transparent)',animation:'heroSweep 5s ease-in-out infinite'}}/>
    <div className="relative flex flex-col justify-between items-center text-center py-10 md:py-14 px-4" style={{zIndex:4,minHeight:'100vh'}}>
      <div className="mt-4 md:mt-8">
        <div className="flex items-center justify-center gap-2.5 font-mono text-[10px] tracking-[4px] text-river2 mb-4"><span className="h-px w-8" style={{background:'linear-gradient(90deg,transparent,#ff2e3e)'}}/>FILIAL RIVER · CORRIENTES<span className="h-px w-8" style={{background:'linear-gradient(90deg,#ff2e3e,transparent)'}}/></div>
        <h1 className="font-disp font-700 text-[52px] md:text-[100px] leading-[.84] tracking-[.5px]" style={{background:'linear-gradient(180deg,#fff 30%,#ffb3b9 130%)',WebkitBackgroundClip:'text',backgroundClip:'text',color:'transparent',filter:'drop-shadow(0 6px 34px rgba(224,30,47,.45))'}}>{db.config.hero_titulo}</h1>
        <p className="text-ink/80 text-[13px] md:text-[15px] max-w-lg mx-auto mt-4">{db.config.hero_subtitulo||'La hinchada de River más grande del NEA · viajes, figuritas y comunidad'}</p>
      </div>
      <div className="glass float-y rounded-[28px] p-5 md:p-8 w-full max-w-5xl -mb-16 md:-mb-24" style={{boxShadow:'0 30px 80px -30px rgba(0,0,0,.9),inset 0 1px 0 rgba(255,255,255,.14)'}}>
        <div className="flex justify-center mb-5">{jugando?<span className="font-mono text-[8.5px] tracking-[1.5px] px-3 py-1 rounded-full" style={{color:'#2fe07a',background:'rgba(47,224,122,.14)',border:'1px solid rgba(47,224,122,.4)'}}>● JUGANDO AHORA</span>:<Chip>● PRÓXIMO PARTIDO</Chip>}</div>
        <div className="grid grid-cols-[1fr_auto_1fr] items-center gap-3 mb-5">
          <div className="flex flex-col items-center gap-2"><Crest k={ck(p.escudo_local)} name={p.local} s={72}/><b className="font-disp text-[15px] md:text-[20px]">{p.local}</b><Chip>LOCAL</Chip></div>
          <div className="flex flex-col items-center"><span className="relative font-disp text-[32px] md:text-[46px] text-river2" style={{textShadow:'0 0 24px rgba(255,46,62,.8)'}}>VS<span className="absolute -inset-4 rounded-full border border-river/30" style={{animation:'pulseDot 2.4s infinite'}}/></span></div>
          <div className="flex flex-col items-center gap-2"><Crest k={ck(p.escudo_visita)} name={p.visitante} s={72}/><b className="font-disp text-[15px] md:text-[20px]">{p.visitante}</b><Chip c="#9a9aa6">VISITANTE</Chip></div>
        </div>
        {jugando?<div className="font-disp text-[30px] text-gold2 py-2">● EN VIVO</div>:<CountBoxes c={c}/>}
        <div className="flex flex-wrap items-center justify-center gap-4 mt-5 font-mono text-[10px] text-mut">
          <span>📅 {dd.toLocaleDateString('es-AR',{day:'2-digit',month:'short'}).toUpperCase()}</span><span>🏆 {p.competencia}</span><span>📍 {p.estadio||'Monumental'}</span>
        </div>
      </div>
    </div>
  </section>;
}

/* ============ PRÓXIMOS PARTIDOS (carrusel) ============ */
function MiniCount({fecha}){
  const c=useCountdown(fecha);
  return <div className="flex items-center justify-center gap-1.5 font-mono">
    {[['D',c.dd],['H',c.hh],['M',c.mm],['S',c.ss]].map(([k,v],i)=><span key={i} className="flex flex-col items-center"><b className="font-disp text-[20px] leading-none text-ink">{v}</b><small className="text-[6px] tracking-[1px] text-dim">{k}</small></span>)}
  </div>;
}
function Proximos(){
  const db=useDB();const {blockOn}=useVis();
  const list=(db.proximos||[]).filter(p=>new Date(p.fecha).getTime()>Date.now()).sort((a,b)=>new Date(a.fecha)-new Date(b.fecha)).slice(0,10);
  const ck=u=>{const m=(u||'').match(/([a-z]+)\.png/i);return m?m[1]:'river';};
  useEffect(()=>{const t=setInterval(()=>{document.querySelectorAll('.px-swiper').forEach(s=>{if(s.swiper&&!s.matches(':hover'))s.swiper.slideNext();});},4200);return()=>clearInterval(t);},[]);
  if(list.length===0)return null;
  return <section className="rise">
    <Eyebrow k="AGENDA · TEMPORADA 2026" t="Próximos Partidos"/>
    <swiper-container class="px-swiper" slides-per-view="1" space-between="18" centered-slides="false" grab-cursor="true" breakpoints='{"768":{"slidesPerView":2}}' style={{paddingBottom:'6px'}}>
      {list.map((p,i)=>{const clasico=/superclásico|clásico/i.test(p.competencia);
        return <swiper-slide key={i}>
        <div className="glass rounded-glass p-5 lift h-full relative overflow-hidden" style={clasico?{background:'radial-gradient(120% 90% at 100% 0%,rgba(224,30,47,.22),transparent 55%),radial-gradient(120% 90% at 0% 100%,rgba(38,86,224,.18),transparent 55%),linear-gradient(155deg,rgba(255,255,255,.09),rgba(255,255,255,.02))'}:{}}>
          {clasico&&<span className="absolute top-3 right-3 font-mono text-[7px] tracking-[2px] px-2 py-1 rounded-full" style={{background:'rgba(224,30,47,.2)',color:'#ff6b78'}}>SUPERCLÁSICO</span>}
          <div className="font-mono text-[8px] tracking-[1.5px] text-mut mb-3">{p.competencia}</div>
          <div className="grid grid-cols-[1fr_auto_1fr] items-center gap-2 mb-4">
            <div className="flex flex-col items-center gap-1.5"><Crest k={ck(p.escudo_local)} name={p.local} s={54}/><b className="font-disp text-[12px] text-center leading-tight">{p.local}</b></div>
            <span className="font-disp text-[20px] text-river2">VS</span>
            <div className="flex flex-col items-center gap-1.5"><Crest k={ck(p.escudo_visita)} name={p.visitante} s={54}/><b className="font-disp text-[12px] text-center leading-tight">{p.visitante}</b></div>
          </div>
          <div className="mb-1"><CountBoxes c={useCountdown(p.fecha)} accent="#ff6b78"/></div>
          <div className="flex items-center justify-between font-mono text-[9px] text-mut mt-3">
            <span>📅 {new Date(p.fecha).toLocaleDateString('es-AR',{weekday:'short',day:'2-digit',month:'short'})}</span>
            <span>📍 {p.estadio}</span>
          </div>
        </div>
      </swiper-slide>;})}
    </swiper-container>
  </section>;
}

/* ============ CENTRO DE DATOS ============ */
function Centro(){
  const db=useDB();const {blockOn}=useVis();const d=db.datos;
  const live=!!(window.OMDB&&OMDB.isLive&&OMDB.isLive());
  const _xgMax=Math.max(d.xg.river,d.xg.rivalXg);
  return <section>
    <Eyebrow k="DATOS EN VIVO · API SPORTMONKS" t="Centro de Datos"/>
    <div className="flex justify-center mb-6"><Chip c={live?'#2fe07a':'#7a7a86'}>{live?'● ON':'○ OFF'} · {d.liga}</Chip></div>
    <div className="grid lg:grid-cols-[1.3fr_1fr] gap-4">
      {blockOn('centro','tabla')&&<div className="glass rounded-glass p-5">
        <div className="flex items-center justify-between mb-3"><span className="font-mono text-[9px] tracking-[2px] text-river2">🏆 TABLA · ZONA DE RIVER</span><span className="font-mono text-[9px] text-mut">Liga Prof. 2026</span></div>
        <div className="grid grid-cols-[20px_1fr_auto_auto] gap-x-3 font-mono text-[8px] tracking-[1px] text-dim mb-1 px-2"><span>#</span><span>EQUIPO</span><span>DG</span><span className="text-right">PTS</span></div>
        <div className="flex flex-col gap-1">
          {d.tabla.map(t=>(
            <div key={t.pos} className="grid grid-cols-[20px_1fr_auto_auto] items-center gap-x-3 px-2 py-1.5 rounded-xl" style={t.river?{background:'linear-gradient(90deg,rgba(255,46,62,.2),rgba(255,255,255,.03))',border:'1px solid rgba(255,46,62,.42)'}:{}}>
              <span className="font-disp text-[14px]" style={{color:t.river?'#ff2e3e':'#8a8a97'}}>{t.pos}</span>
              <div className="flex items-center gap-2.5 min-w-0">
                <Crest k={t.crest} name={t.nombre} logo={t.logo} s={26}/>
                <div className="min-w-0 flex-1"><b className="text-[12.5px] block truncate" style={t.river?{color:'#ff6a78'}:{}}>{t.nombre}</b><div className="h-[5px] rounded-full bg-white/[.08] overflow-hidden mt-1"><i className="block h-full rounded-full" style={{width:t.pts/34*100+'%',background:t.river?'linear-gradient(90deg,#ff2e3e,#ff6a2e)':'rgba(255,255,255,.22)'}}/></div></div>
              </div>
              <span className="font-mono text-[10px] text-mut">{t.dg}</span>
              <b className="font-disp text-[17px] text-right" style={t.river?{color:'#ff2e3e'}:{}}>{t.pts}</b>
            </div>))}
        </div>
      </div>}
      <div className="flex flex-col gap-4">
        {blockOn('centro','forma')&&<div className="glass rounded-glass p-5">
          <span className="font-mono text-[9px] tracking-[2px] text-river2 block mb-3">📋 FORMA RIVER · ÚLTIMOS 5</span>
          <FormaBadges str={d.forma} s={30}/>
          <div className="flex gap-3 mt-3 font-mono text-[8px] text-mut"><span>■ Ganó</span><span>■ Empató</span><span>■ Perdió</span></div>
        </div>}
        {blockOn('centro','xg')&&<div className="glass rounded-glass p-5">
          <span className="font-mono text-[9px] tracking-[2px] text-river2 block mb-3">◎ xG · GOLES ESPERADOS</span>
          <div className="flex items-center gap-2 mb-2"><Crest k="river" name="River" s={24}/><div className="flex-1"><Bar pct={d.xg.river/_xgMax*100} bg="linear-gradient(90deg,#ff2e3e,#ff6a2e)"/></div><b className="font-disp text-[18px] text-ink w-12 text-right">{d.xg.river}</b></div>
          <div className="flex items-center gap-2"><Crest k={d.xg.crest} name={d.xg.rival} logo={d.xg.logo} s={24}/><div className="flex-1"><Bar pct={d.xg.rivalXg/_xgMax*100} bg="rgba(120,140,170,.5)"/></div><b className="font-disp text-[18px] text-mut w-12 text-right">{d.xg.rivalXg}</b></div>
        </div>}
        {blockOn('centro','ad')&&<div className="glass rounded-glass grid place-items-center text-center p-5" style={{minHeight:180}}>
          <div><div className="font-mono text-[10px] tracking-[2px] text-mut">ESPACIO PUBLICITARIO</div><div className="font-mono text-[8px] text-dim mt-1.5">300 × 250 · configurable desde el panel</div></div>
        </div>}
      </div>
    </div>
  </section>;
}

/* ============ PROBABILIDADES 1X2 ============ */
function Prob(){
  const db=useDB();const p=db.datos.pred;const pt=db.partido;
  const max=Math.max(...p.scores.map(s=>s.p));
  return <section className="glass rounded-glass p-5 md:p-7 rise">
    <div className="flex items-center justify-between mb-5"><span className="font-mono text-[10px] tracking-[2px] text-river2">◈ PROBABILIDADES · PRÓXIMO PARTIDO</span><span className="font-mono text-[9px] text-mut hidden sm:block">{p.modelo}</span></div>
    <div className="grid grid-cols-[1fr_auto_1fr] items-center gap-3 max-w-md mx-auto mb-6">
      <div className="flex flex-col items-center gap-2"><Crest k="river" name="River" s={54}/><b className="font-disp text-[13px]">River</b></div>
      <div className="text-center"><span className="font-disp text-[26px] text-river2">VS</span><div className="font-mono text-[8px] text-mut mt-1">25/7 · 19:15</div><div className="font-mono text-[8px] text-mut">📍 Monumental</div></div>
      <div className="flex flex-col items-center gap-2"><Crest k="barracas" name={pt.visitante} s={54}/><b className="font-disp text-[13px] text-center">{pt.visitante}</b></div>
    </div>
    <div className="mb-5">
      <span className="font-mono text-[9px] tracking-[1.5px] text-mut block mb-2">RESULTADO FINAL (1X2)</span>
      <div className="h-3 rounded-full overflow-hidden flex">
        <i style={{width:p.home+'%',background:'linear-gradient(90deg,#ff2e3e,#ff6a2e)'}}/>
        <i style={{width:p.draw+'%',background:'rgba(255,255,255,.28)'}}/>
        <i style={{width:p.away+'%',background:'rgba(120,140,170,.55)'}}/>
      </div>
      <div className="flex justify-between font-mono text-[9px] mt-2"><span className="text-river2">Gana River {p.home}%</span><span className="text-mut">Empate {p.draw}%</span><span className="text-mut">Gana rival {p.away}%</span></div>
    </div>
    <div className="grid md:grid-cols-2 gap-5 items-start">
      <div>
        <span className="font-mono text-[9px] tracking-[1.5px] text-mut block mb-2">AMBOS EQUIPOS MARCAN</span>
        <div className="h-3 rounded-full bg-white/10 overflow-hidden"><i className="block h-full rounded-full" style={{width:p.bttsYes+'%',background:'linear-gradient(90deg,#2fe07a,#0f9d54)'}}/></div>
        <div className="flex justify-between font-mono text-[9px] mt-2"><span className="text-green-400">Sí {p.bttsYes}%</span><span className="text-mut">No {p.bttsNo}%</span></div>
      </div>
      <div>
        <span className="font-mono text-[9px] tracking-[1.5px] text-mut block mb-2">RESULTADOS MÁS PROBABLES</span>
        <div className="grid grid-cols-4 gap-2">
          {p.scores.map((s,i)=>(<div key={s.s} className="text-center rounded-2xl py-3 px-1" style={{background:s.p===max?'linear-gradient(150deg,rgba(255,46,62,.22),rgba(255,255,255,.03))':'rgba(255,255,255,.05)',border:'1px solid '+(s.p===max?'rgba(255,46,62,.4)':'rgba(255,255,255,.08)')}}><b className="font-disp text-[19px] block">{s.s}</b><small className="font-mono text-[8px] text-mut">{s.p}%</small></div>))}
        </div>
      </div>
    </div>
    <div className="text-right font-mono text-[8px] text-dim mt-4">Actualizado 04:01:19 · se refresca cada 60s</div>
  </section>;
}

/* ============ CALENDARIO ============ */
const CAL=[
  {dia:'25',mes:'JUL',rival:'Barracas Central',crest:'barracas',comp:'Liga Profesional · Jornada 1 · Monumental',cond:'LOCAL',iso:'2026-07-25T19:15:00-03:00'},
  {dia:'29',mes:'JUL',rival:'Gimnasia La Plata',crest:'gimnasia',comp:'Liga Profesional · Jornada 2 · Visitante',cond:'VISITA',iso:'2026-07-29T19:15:00-03:00'},
  {dia:'02',mes:'AGO',rival:'Rosario Central',crest:'rosario',comp:'Liga Profesional · Jornada 3 · Monumental',cond:'LOCAL',iso:'2026-08-02T19:15:00-03:00'},
  {dia:'09',mes:'AGO',rival:'Tigre',crest:'tigre',comp:'Liga Profesional · Jornada 4 · Visitante',cond:'VISITA',iso:'2026-08-09T21:00:00-03:00'},
];
function Calendario(){
  const {blockOn}=useVis();
  return <section className="rise">
    <Eyebrow k="" t="Calendario"/>
    <div className="flex justify-center mb-6"><Chip c="#2fe07a">● Sincronizado · API fútbol</Chip></div>
    <div className="flex flex-col gap-3 max-w-4xl mx-auto">
      {CAL.map((m,i)=>(
        <div key={i} className="glass rounded-glass px-4 md:px-6 py-4 flex items-center gap-4 lift">
          <div className="text-center flex-none w-12"><b className="font-disp text-[26px] text-river2 leading-none">{m.dia}</b><small className="font-mono text-[8px] text-mut block">{m.mes}</small></div>
          <div className="flex items-center gap-2 flex-none"><Crest k="river" name="River" s={34}/><span className="font-mono text-[9px] text-dim">VS</span><Crest k={m.crest} name={m.rival} s={34}/></div>
          <div className="flex-1 min-w-0"><b className="font-disp text-[16px] md:text-[19px] block leading-tight"><span className="text-river2">River</span> vs {m.rival}</b><small className="font-mono text-[8.5px] text-mut">🏆 {m.comp}</small></div>
          <div className="text-right flex-none hidden sm:block"><Chip c={m.cond==='LOCAL'?'#ffcf3e':'#ff2e3e'}>{m.cond}</Chip><div className="font-mono text-[9px] text-river2 mt-2">{faltan(m.iso)}</div></div>
        </div>))}
      {blockOn('calendario','sponsor')&&<div className="glass rounded-glass px-6 py-5 flex items-center justify-center gap-4" style={{background:'linear-gradient(160deg,rgba(24,60,40,.35),rgba(255,255,255,.02))'}}>
        <span className="font-mono text-[8px] tracking-[2px] text-mut absolute left-6 top-4">SPONSOR OFICIAL · RIVER PLATE</span>
        <Crest k="river" name="River" s={38}/><img src="assets/betano.png" alt="Betano" className="h-7 object-contain"/>
      </div>}
    </div>
  </section>;
}

/* ============ TICKETS & VIAJES ============ */
function Viajes(){
  const db=useDB();const toast=useContext(ToastCtx);
  return <section className="rise">
    <Eyebrow k="VIAJÁ CON LA BANDA" t="Tickets & Viajes" sub="Publicados automáticamente desde los flyers de WhatsApp del club"/>
    <div className="grid md:grid-cols-3 gap-4">
      {db.viajes.map((v,i)=>{const pct=Math.round((1-v.cupos/v.total)*100);const last=v.cupos<=20&&v.cupos>0;
        return <div key={i} className="glass rounded-glass p-5 flex flex-col lift shine">
          <div className="flex items-center justify-between mb-3"><span className="font-mono text-[8px] tracking-[2px] text-river2">VIAJE OFICIAL</span>{v.nuevo&&<Chip c="#2fe07a">NUEVO · WHATSAPP</Chip>}</div>
          <h3 className="font-disp text-[26px] leading-none mb-2">{v.destino}</h3>
          <div className="flex items-center gap-2 mb-4"><Crest k="river" name="River" s={26}/><span className="font-mono text-[8px] text-dim">VS</span><Crest k={v.crest} name={v.rival} s={26}/><small className="text-mut text-[11px] leading-tight">{v.rival} · {v.comp}</small></div>
          <div className="flex flex-col gap-2 text-[12px] text-mut mb-4">
            <span>🗓 {v.fecha}</span><span>🚌 {v.salida}</span><span>📍 {v.punto}</span><span>👥 {v.cupos} de {v.total} cupos libres</span>
          </div>
          <Bar pct={pct} bg="linear-gradient(90deg,#ff2e3e,#ff6a2e)"/>
          <div className={`font-mono text-[9px] mt-2 ${last?'text-river2':'text-mut'}`}>{last?'¡Últimos lugares!':'Cupos disponibles'}</div>
          <div className="flex items-end justify-between mt-4">
            <div><b className="font-disp text-[26px] text-gold2">{v.precio}</b><div className="font-mono text-[8px] text-dim">SEÑA {v.sena}</div></div>
            <Chip c="#2fe07a">{v.estado}</Chip>
          </div>
          <button onClick={()=>{location.href=(window.OMAuth&&OMAuth.current())?'dashboard.html':'register.html';}} className="press glass rounded-2xl py-3 mt-4 text-[12px] font-bold text-mut hover:text-ink w-full">Reservá creando tu cuenta de socio ↓</button>
        </div>;})}
    </div>
  </section>;
}

/* ============ SORTEOS & PREMIOS ============ */
function Sorteos(){
  const db=useDB();const s=db.sorteo;const {blockOn}=useVis();
  const sold=useMemo(()=>new Set(s.sold),[s.sold]);
  const [pick,setPick]=useState(()=>new Set(s.eleccion&&s.eleccion.nums||[]));
  const user=window.OMAuth&&OMAuth.current();
  const toggle=n=>{if(sold.has(n))return;if(!user){location.href='login.html';return;}const nx=new Set(pick);nx.has(n)?nx.delete(n):nx.add(n);setPick(nx);
    OMDB.set('sorteo.eleccion',{user:user?user.nombre:'Invitado',avatar:user?user.avatar:null,nums:[...nx].sort((a,b)=>a-b),t:Date.now()});};
  const chosen=[...pick].sort((a,b)=>a-b);
  const p1=(db.precios&&db.precios.sorteo1)||s.precio1||3000, p2=(db.precios&&db.precios.sorteo2)||s.precio2||5000;
  const calcPrecio=n=>{if(n<=0)return 0;const pares=Math.floor(n/2);const impar=n%2;return pares*p2+impar*p1;};
  const totalSorteo=calcPrecio(chosen.length);
  const ini=(user&&user.nombre||'IN').split(/\s+/).slice(0,2).map(w=>w[0]).join('').toUpperCase();
  return <section className="rise">
    <Eyebrow k="GANÁ PREMIOS" t="Sorteos & Premios"/>
    <div className="grid md:grid-cols-3 gap-4 mb-6">
      {db.premios.map((pr,i)=>(
        <div key={i} className="glass rounded-glass p-5 flex flex-col lift shine" style={{border:`1px solid ${pr.accent}55`,boxShadow:`0 20px 50px -22px ${pr.accent}66`}}>
          <div className="flex items-center justify-between mb-3"><span className="font-mono text-[8px] tracking-[2px]" style={{color:pr.accent}}>{pr.kicker}</span><Chip c={pr.badgeColor}>{pr.badge}</Chip></div>
          <h3 className="font-disp text-[21px] leading-tight mb-4">{pr.titulo}</h3>
          <div className="rounded-2xl overflow-hidden grid place-items-center py-6 mb-4" style={{background:`radial-gradient(circle at 50% 40%,${pr.accent}22,rgba(0,0,0,.2))`}}>
            {pr.dorso?<Shirt360 front={pr.img} back={pr.dorso} s={212}/>:<img src={pr.img} alt={pr.titulo} className={`h-52 object-contain drop-shadow-[0_14px_26px_rgba(0,0,0,.6)] ${i%2?'float-yr':'float-y'}`}/>}
          </div>
          <b className="font-disp text-[20px] mt-auto">{pr.precio}</b>
          <button onClick={()=>{location.href=(window.OMAuth&&OMAuth.current())?'dashboard.html':'register.html';}} className="press glass rounded-2xl py-3 mt-3 text-[12px] font-bold text-mut hover:text-ink w-full">Participá creando tu cuenta ↓</button>
        </div>))}
    </div>
    {/* ===== TALONARIO INTERACTIVO ===== */}
    <div className="grid lg:grid-cols-[1.6fr_1fr] gap-4">
      <div className="glass rounded-glass p-5 md:p-6">
        <div className="flex items-center justify-between mb-4"><span className="font-mono text-[10px] tracking-[2px] text-river2">🎟 ELEGÍ TUS NÚMEROS</span><Chip c="#ffcf3e">1× ${p1.toLocaleString('es-AR')} · 2× ${p2.toLocaleString('es-AR')}</Chip></div>
        {!user&&<div className="mb-3 rounded-2xl px-4 py-2.5 flex items-center gap-2 text-[11.5px]" style={{background:'rgba(224,30,47,.1)',border:'1px solid rgba(224,30,47,.3)',color:'#ff9aa3'}}>🔒 <span><a href="login.html" className="font-bold underline">Iniciá sesión</a> para elegir tus números.</span></div>}
        <div className="grid grid-cols-10 gap-2">
          {Array.from({length:s.total},(_,n)=>{const isS=sold.has(n),isP=pick.has(n);
            return <button key={n} disabled={isS||!user} onClick={()=>toggle(n)} title={!user?'Iniciá sesión para elegir':isS?'Vendido':'Disponible'} className={`press aspect-square rounded-xl grid place-items-center font-mono text-[11px] md:text-[12.5px] font-bold transition-all ${!user&&!isS?'cursor-not-allowed':''}`}
              style={isP?{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',color:'#fff',boxShadow:'0 0 14px rgba(224,30,47,.6)'}:isS?{background:'rgba(255,255,255,.05)',color:'#6a6a76',border:'1px solid rgba(255,255,255,.08)'}:{background:'rgba(16,54,32,.55)',color:'#4fae74',border:'1px solid rgba(40,110,70,.55)',opacity:user?1:.7}}>{String(n).padStart(2,'0')}</button>;})}
        </div>
        <div className="flex flex-wrap items-center gap-x-5 gap-y-1.5 font-mono text-[10px] text-mut mt-4">
          <span className="flex items-center gap-1.5"><i className="w-3 h-3 rounded" style={{background:'rgba(16,54,32,.8)',border:'1px solid rgba(40,110,70,.6)'}}/>DISPONIBLES <b className="text-[#4fae74]">{s.total-sold.size}</b></span>
          <span className="flex items-center gap-1.5"><i className="w-3 h-3 rounded bg-white/10 border border-white/15"/>VENDIDOS <b className="text-mut">{sold.size}</b></span>
          <span className="flex items-center gap-1.5"><i className="w-3 h-3 rounded" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)'}}/>ELIGIENDO <b className="text-river2">{pick.size}</b></span>
        </div>
      </div>
      <div className="flex flex-col gap-4">
        {/* caja: solo números elegidos (tachados) */}
        <div className="glass rounded-glass p-5">
          <span className="font-mono text-[10px] tracking-[2px] text-river2 block mb-3">TUS NÚMEROS ELEGIDOS</span>
          {chosen.length===0?<p className="text-mut text-[12px] py-3">Todavía no elegiste números. Tocá el talonario ↖</p>
            :<div className="flex flex-wrap gap-2">{chosen.map(n=>(
              <span key={n} className="font-mono text-[14px] font-bold px-3 py-1.5 rounded-lg" style={{background:'rgba(224,30,47,.16)',border:'1px solid rgba(224,30,47,.5)',color:'#ff6b78',textDecoration:'line-through',textDecorationColor:'#ffcf3e'}}>{String(n).padStart(2,'0')}</span>))}</div>}
          {chosen.length>0&&<div className="flex justify-between items-center mt-4 pt-3 border-t border-white/10"><span className="font-mono text-[10px] text-mut">{chosen.length} número(s)</span><b className="font-disp text-[20px] text-gold2">${(Math.floor(chosen.length/2)*(s.precio2||5000)+(chosen.length%2)*(s.precio1||3000)).toLocaleString('es-AR')}</b></div>}
        </div>
        {/* tarjeta usuario + avatar + sus números */}
        <div className="glass rounded-glass p-5 flex items-center gap-4" style={{background:'linear-gradient(135deg,rgba(224,30,47,.18),rgba(255,255,255,.02))'}}>
          <span className="w-14 h-14 rounded-full grid place-items-center overflow-hidden font-disp font-bold text-[18px] text-gold2 border-2 border-river flex-none" style={{background:'radial-gradient(circle at 35% 30%,#3a3a44,#17171c)'}}>{user&&user.avatar?<img src={user.avatar} alt="" className="w-full h-full object-cover"/>:ini}</span>
          <div className="min-w-0 flex-1">
            <b className="font-disp text-[16px] block leading-none">{user?user.nombre:'Iniciá sesión'}</b>
            <small className="font-mono text-[9px] text-mut">{chosen.length?`Reservando: ${chosen.map(n=>String(n).padStart(2,'0')).join(' · ')}`:'Sin números aún'}</small>
          </div>
        </div>
        <button onClick={()=>{if(!chosen.length)return;location.href=(user?'dashboard.html':'register.html');}} className="press rounded-2xl py-3.5 text-[13px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',boxShadow:'0 12px 30px -8px rgba(224,30,47,.5)'}}>{chosen.length?`Reservar ${chosen.length} · $${totalSorteo.toLocaleString('es-AR')}`:'Elegí números para reservar'}</button>
        {blockOn('sorteos','ad')&&(()=>{const b=(db.config.banners||[]).find(x=>x.slot==='sorteo-300x250'&&x.img);
          return <a href={b&&b.link?b.link:undefined} target={b&&b.link?'_blank':undefined} className="block rounded-2xl overflow-hidden glass relative mt-3" style={{minHeight:250,width:'100%'}}>
            {b&&b.img?<img src={b.img} alt="Publicidad" className="absolute inset-0 w-full h-full object-cover"/>
              :<div className="absolute inset-0 grid place-items-center text-center"><div><div className="font-mono text-[10px] tracking-[2px] text-mut">ESPACIO PUBLICITARIO</div><div className="font-mono text-[8px] text-dim mt-1.5">300 × 250 · configurable desde el panel</div></div></div>}
          </a>;})()}
      </div>
    </div>
  </section>;
}

/* ============ ÚLTIMOS RESULTADOS ============ */
const MESES_ORD=[['ENE','ENERO'],['FEB','FEBRERO'],['MAR','MARZO'],['ABR','ABRIL'],['MAY','MAYO'],['JUN','JUNIO'],['JUL','JULIO'],['AGO','AGOSTO'],['SEP','SEPTIEMBRE'],['OCT','OCTUBRE'],['NOV','NOVIEMBRE'],['DIC','DICIEMBRE']];
function Resultados(){
  const db=useDB();const r=db.resultados;const pm=r.porMes||{};
  const meses=MESES_ORD.map(([m])=>[m,(pm[m]||[]).length]).filter(([m,n],i)=>n>0||['ENE','FEB','MAR','ABR','MAY','JUN','JUL','AGO','SEP','OCT','NOV'].includes(m));
  const [mes,setMes]=useState(r.activo||(meses[0]&&meses[0][0])||'ENE');
  const lista=pm[mes]||[];
  const label=(MESES_ORD.find(x=>x[0]===mes)||['',mes])[1];
  return <section className="rise">
    <Eyebrow k="DATOS EN VIVO" t="Últimos Resultados"/>
    <div className="glass rounded-glass p-3 md:p-4 max-w-4xl mx-auto mb-6 flex items-center gap-2 overflow-x-auto flex-nowrap" style={{scrollbarWidth:'thin',WebkitOverflowScrolling:'touch',scrollSnapType:'x proximity'}}>
      <span className="font-mono text-[9px] tracking-[1px] text-mut flex items-center gap-2 flex-none px-2">🗓 TEMPORADA {r.anio}</span>
      {meses.map(([m,n])=>(
        <button key={m} onClick={()=>n&&setMes(m)} disabled={!n} className={`press flex-none font-mono text-[10px] tracking-[1px] px-3 py-2 rounded-xl border transition-colors ${mes===m?'text-white border-river bg-river/15':n?'text-mut border-white/10 hover:text-ink':'text-dim border-transparent opacity-40'}`}>{m} {n>0&&<b className="text-[8px] ml-0.5">{n}</b>}</button>))}
    </div>
    <div className="text-center font-disp text-[22px] mb-4">{label} <span className="text-mut text-[14px]">{r.anio}</span></div>
    <div className="grid md:grid-cols-2 gap-4 max-w-4xl mx-auto">
      {lista.map((m,i)=>(
        <div key={i} className="glass rounded-glass p-5" style={{borderColor:(m.estado==='G'?'rgba(34,197,94,.5)':m.estado==='E'?'rgba(255,153,0,.5)':'rgba(224,30,47,.5)'),boxShadow:(m.estado==='G'?'0 0 26px -6px rgba(34,197,94,.5)':m.estado==='E'?'0 0 26px -6px rgba(255,153,0,.5)':'0 0 26px -6px rgba(224,30,47,.5)')}}>
          <div className="flex justify-between font-mono text-[8.5px] text-mut mb-3"><span>{m.comp}</span><span>{m.fecha}</span></div>
          <div className="grid grid-cols-[1fr_auto_1fr] items-center gap-3">
            <div className="flex flex-col items-center gap-2"><Crest k={m.crestL} name={m.local} logo={m.logoL} s={44}/><b className="font-disp text-[13px]">{m.local}</b></div>
            {m.gl!=null?<div className="text-center"><b className="font-disp text-[30px]">{m.gl} - {m.gv}</b><div className="mt-1"><Chip c={m.color}>{m.estado}</Chip></div></div>
              :<div className="text-center"><b className="font-disp text-[22px] text-river2">VS</b><div className="mt-1"><Chip c={m.color}>{m.estado}</Chip></div></div>}
            <div className="flex flex-col items-center gap-2"><Crest k={m.crestV} name={m.visita} logo={m.logoV} s={44}/><b className="font-disp text-[13px] text-center leading-tight">{m.visita}</b></div>
          </div>
        </div>))}
      {lista.length===0&&<p className="text-mut text-center col-span-full py-8">Sin partidos este mes.</p>}
    </div>
  </section>;
}

/* ============ ESTADÍSTICAS · SUPERCLÁSICO ============ */
function Stats(){
  const db=useDB();const cl=db.clasico;const h=db.historial;const c=useCountdown(cl.fecha);
  return <section className="rise">
    <Eyebrow k="DATOS EN VIVO · API" t="Estadísticas River" sub="Plantilla, próximo superclásico e historial ante Boca"/>
    <div className="rounded-glass p-6 md:p-8 relative overflow-hidden glass-deep float-y" style={{minHeight:280}}>
      <div className="absolute inset-0" style={{background:'linear-gradient(90deg,rgba(224,30,47,.30) 0%,rgba(224,30,47,.14) 45%,rgba(47,114,224,.14) 55%,rgba(47,114,224,.30) 100%)'}}/>
      <div className="absolute inset-y-0 left-1/2 w-px" style={{background:'linear-gradient(180deg,transparent,rgba(255,255,255,.25),transparent)'}}/>
      <div className="relative">
        <div className="flex justify-center mb-6"><Chip>● ✕ EL CLÁSICO DE CLÁSICOS</Chip></div>
        <div className="grid grid-cols-[1fr_auto_1fr] items-center gap-3 max-w-2xl mx-auto mb-6">
          <div className="relative flex flex-col items-center gap-2 rounded-2xl py-5 overflow-hidden" style={{background:'radial-gradient(120% 100% at 50% 0%,rgba(224,30,47,.34),rgba(224,30,47,.06) 70%)',border:'1px solid rgba(224,30,47,.3)'}}><span className="absolute inset-x-8 top-0 h-[2px]" style={{background:'linear-gradient(90deg,transparent,#ff2e3e,transparent)'}}/><Crest k="river" name="River" s={64}/><b className="font-disp text-[16px]">RIVER</b><small className="font-mono text-[8px] text-green-400">VISITANTE</small></div>
          <div className="text-center"><span className="font-disp text-[32px] text-river2">VS</span><div className="bg-black/40 rounded-xl px-3 py-1.5 mt-2 border border-white/10"><div className="font-mono text-[9px]">DOM 1 NOV</div><div className="font-mono text-[7px] text-mut">20:00 hs · Jornada 15</div></div></div>
          <div className="relative flex flex-col items-center gap-2 rounded-2xl py-5 overflow-hidden" style={{background:'radial-gradient(120% 100% at 50% 0%,rgba(47,114,224,.34),rgba(47,114,224,.06) 70%)',border:'1px solid rgba(47,114,224,.3)'}}><span className="absolute inset-x-8 top-0 h-[2px]" style={{background:'linear-gradient(90deg,transparent,#2f72e0,transparent)'}}/><Crest k="boca" name="Boca" s={64}/><b className="font-disp text-[16px]">BOCA</b><small className="font-mono text-[8px] text-[#2f72e0]">LOCAL · La Bombonera</small></div>
        </div>
        <CountBoxes c={c} accent="#ff2e3e"/>
        <div className="flex items-center justify-between max-w-2xl mx-auto mt-6 pt-5 border-t border-white/10">
          <div className="flex items-center gap-2"><span className="font-mono text-[8px] text-mut">RIVER</span><FormaBadges str={h.formaRiver} s={22}/></div>
          <span className="font-mono text-[8px] tracking-[1px] text-gold2">FORMA RECIENTE</span>
          <div className="flex items-center gap-2"><FormaBadges str={h.formaBoca} s={22}/><span className="font-mono text-[8px] text-mut">BOCA</span></div>
        </div>
      </div>
    </div>
  </section>;
}

/* ============ PLANTILLA 2026 ============ */
function PlantelModal({f,onClose}){
  const arr=x=>Array.isArray(x)?x:(x?[x]:[]);
  const lines=[['DELANTEROS',arr(f.del)],['MEDIOCAMPO',arr(f.med)],['DEFENSA',arr(f.def)],['ARQUERO',arr(f.arq)]];
  const PCard=({p,gk,big})=>(
    <div className="flex flex-col items-center gap-1.5 group" style={{animation:'rise .5s cubic-bezier(.22,1,.36,1) both'}}>
      <div className="relative" style={{width:big?76:62,height:big?76:62}}>
        <span className="absolute inset-0 rounded-full" style={{background:gk?'conic-gradient(from 0deg,#ffcf3e,#b0763a,#ffcf3e)':'conic-gradient(from 0deg,#ff2e3e,#8d0917,#ff2e3e)',padding:2.5}}>
          <span className="block w-full h-full rounded-full overflow-hidden" style={{background:'#0b0b10'}}>
            {p.foto?<img src={p.foto} alt={p.n} className="w-full h-full object-cover object-top transition-transform duration-500 group-hover:scale-110" onError={e=>{e.target.style.display='none';}}/>:<span className="w-full h-full grid place-items-center font-disp text-[18px] text-white/60">{(p.n||'?')[0]}</span>}
          </span>
        </span>
      </div>
      <div className="text-center leading-tight">
        <b className="font-disp text-[11.5px] block px-2 py-0.5 rounded-md" style={{background:gk?'rgba(255,207,62,.16)':'rgba(0,0,0,.5)',color:gk?'#ffcf3e':'#fff'}}>{p.n}</b>
        <small className="font-mono text-[6.5px] tracking-[1px] text-mut">{p.pos||''}</small>
      </div>
    </div>);
  return <div className="fixed inset-0 z-[95] flex items-center justify-center p-3 md:p-6" style={{animation:'fadeIn .3s both'}}>
    <div className="absolute inset-0 bg-black/90 backdrop-blur-xl" onClick={onClose}/>
    <div className="relative w-full max-w-[1080px] max-h-[92vh] overflow-y-auto no-scrollbar rounded-glass" style={{animation:'sheetUp .4s cubic-bezier(.22,1,.36,1) both',background:'linear-gradient(160deg,#12121a,#08080d)',border:'1px solid rgba(255,255,255,.1)'}}>
      <div className="sticky top-0 z-20 flex items-center gap-3 px-6 py-4" style={{background:'linear-gradient(180deg,rgba(11,11,16,.96),rgba(11,11,16,.75))',backdropFilter:'blur(10px)'}}>
        <img src="assets/clubs/river.png" alt="" className="w-9 h-9 object-contain"/>
        <div className="flex-1"><div className="font-mono text-[8px] tracking-[3px] text-river2">PLANTEL COMPLETO · TEMPORADA 2026</div><h2 className="font-disp text-[22px] leading-none">River Plate <span className="text-gold2 text-[15px] ml-1">{f.esquema}</span></h2></div>
        <button onClick={onClose} className="press w-9 h-9 rounded-full glass grid place-items-center text-mut hover:text-ink">✕</button>
      </div>
      <div className="grid lg:grid-cols-[1.5fr_1fr] gap-5 p-5 md:p-6">
        <div className="relative rounded-[24px] overflow-hidden p-5 flex flex-col justify-around gap-4" style={{minHeight:520,background:'#0a3a1c url(assets/cancha-bg.png) center/cover no-repeat, repeating-linear-gradient(180deg,#0e4a24 0px,#0e4a24 46px,#0c4020 46px,#0c4020 92px)',boxShadow:'inset 0 0 120px rgba(0,0,0,.55)'}}>
          <svg viewBox="0 0 300 460" className="absolute inset-0 w-full h-full pointer-events-none" preserveAspectRatio="none" style={{opacity:.5}}>
            <g fill="none" stroke="rgba(255,255,255,.5)" strokeWidth="1">
              <rect x="8" y="8" width="284" height="444"/><line x1="8" y1="230" x2="292" y2="230"/>
              <circle cx="150" cy="230" r="42"/><circle cx="150" cy="230" r="2" fill="rgba(255,255,255,.5)"/>
              <rect x="95" y="8" width="110" height="66"/><rect x="95" y="386" width="110" height="66"/>
              <rect x="125" y="8" width="50" height="26"/><rect x="125" y="426" width="50" height="26"/>
            </g>
          </svg>
          <div className="relative z-10 flex justify-around">{arr(f.del).map((p,i)=><PCard key={i} p={p}/>)}</div>
          <div className="relative z-10 flex justify-around px-4">{arr(f.med).map((p,i)=><PCard key={i} p={p}/>)}</div>
          <div className="relative z-10 flex justify-around">{arr(f.def).map((p,i)=><PCard key={i} p={p}/>)}</div>
          <div className="relative z-10 flex justify-center">{arr(f.arq).map((p,i)=><PCard key={i} p={p} gk/>)}</div>
        </div>
        <div className="flex flex-col gap-4">
          {f.dt&&f.dt.n&&<div className="glass rounded-glass p-4 flex items-center gap-3.5">
            <span className="w-16 h-16 rounded-full overflow-hidden grid place-items-center flex-none" style={{border:'2.5px solid #ffcf3e',boxShadow:'0 0 24px -6px #ffcf3e'}}>{f.dt.foto?<img src={f.dt.foto} alt={f.dt.n} className="w-full h-full object-cover object-top"/>:<span className="font-disp text-[20px] text-gold2">{f.dt.n[0]}</span>}</span>
            <div><span className="font-mono text-[7px] tracking-[2px] text-gold2 block">DIRECTOR TÉCNICO</span><b className="font-disp text-[20px] leading-tight block">{f.dt.n}</b><small className="text-mut text-[10px]">Desde marzo 2026</small></div>
          </div>}
          <div className="glass rounded-glass p-4 flex-1">
            <div className="flex items-center gap-2 mb-3"><span className="w-6 h-6 rounded-lg grid place-items-center text-[11px]" style={{background:'rgba(255,46,62,.15)',color:'#ff6b78'}}>🔄</span><b className="font-disp text-[14px] tracking-[.5px]">SUPLENTES · BANCO</b></div>
            <div className="grid grid-cols-3 gap-3">
              {(f.suplentes||[]).map((p,i)=><PCard key={i} p={p}/>)}
            </div>
          </div>
          <a href="dashboard.html" className="press rounded-2xl py-3 text-[13px] font-bold text-white grid place-items-center" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)'}}>Ir a mi cuenta →</a>
        </div>
      </div>
    </div>
  </div>;
}

function Plantilla(){
  const db=useDB();const {blockOn}=useVis();const f=db.formacion;const h=db.historial;
  const [modal,setModal]=useState(false);
  const Face=({p,gk})=>(<div className="flex flex-col items-center gap-1">
    <span className="w-12 h-12 rounded-full overflow-hidden grid place-items-center" style={{border:gk?'2px solid #ffcf3e':'2px solid rgba(255,255,255,.25)',background:gk?'radial-gradient(circle at 40% 30%,#3d3216,#1d1608)':'radial-gradient(circle at 40% 30%,#2a2a33,#111116)'}}>{p.foto?<img src={p.foto} alt={p.n} className="w-full h-full object-cover object-top"/>:<span className="font-disp text-[12px] text-white/70">{(p.n||'?')[0]}</span>}</span>
    <span className={`font-mono text-[8px] px-1.5 py-0.5 rounded ${gk?'bg-gold2 text-black font-bold':'bg-black/60 text-ink'}`}>{p.n}</span>
  </div>);
  const Row=({arr})=><div className="flex justify-around px-2 relative z-10">{(arr||[]).map((p,i)=><Face key={i} p={p}/>)}</div>;
  return <section className="grid lg:grid-cols-[1.2fr_1fr] gap-4 rise items-stretch">
    <div className="glass rounded-glass p-5 flex flex-col">
      <div className="flex items-center justify-between mb-4"><span className="font-mono text-[9px] tracking-[2px] text-holo">👥 PLANTILLA 2026</span><span className="font-mono text-[11px] text-gold2 font-bold tracking-[1px]">{f.esquema}</span></div>
      <div className="rounded-2xl py-6 flex-1 flex flex-col justify-around gap-6 relative overflow-hidden" style={{background:'linear-gradient(160deg,#0d3b1e,#08240f)',border:'1px solid rgba(255,255,255,.08)',minHeight:340}}>
        <div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-24 h-24 rounded-full border border-white/15"/>
        <div className="absolute inset-x-6 top-1/2 h-px bg-white/15"/>
        <Row arr={f.del}/><Row arr={f.med}/><Row arr={f.def}/>
        <div className="flex justify-center relative z-10"><Face p={f.arq} gk/></div>
      </div>
      {f.dt&&f.dt.n&&<div className="flex items-center gap-2.5 mt-3 rounded-2xl px-3.5 py-2.5" style={{background:'rgba(255,255,255,.05)',border:'1px solid rgba(255,207,62,.3)'}}>
        <span className="w-9 h-9 rounded-full overflow-hidden grid place-items-center flex-none" style={{border:'2px solid #ffcf3e',background:'radial-gradient(circle at 40% 30%,#3d3216,#1d1608)'}}>{f.dt.foto?<img src={f.dt.foto} alt={f.dt.n} className="w-full h-full object-cover object-top"/>:<span className="font-disp text-[12px] text-gold2">{f.dt.n[0]}</span>}</span>
        <div><span className="font-mono text-[7px] tracking-[1.5px] text-gold2 block">DIRECTOR TÉCNICO</span><b className="font-disp text-[14px] leading-tight">{f.dt.n}</b></div>
      </div>}
      <button onClick={()=>setModal(true)} className="press rounded-2xl py-3 mt-4 w-full text-[13px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',boxShadow:'0 12px 30px -8px rgba(224,30,47,.5)'}}>Ver plantilla completa →</button>
    </div>
    {modal&&<PlantelModal f={f} onClose={()=>setModal(false)}/>}
    <div className="flex flex-col gap-4">
      {blockOn('plantilla','historial')&&<div className="glass rounded-glass p-5">
        <span className="font-mono text-[9px] tracking-[2px] text-river2 block mb-4">📋 HISTORIAL SUPERCLÁSICOS</span>
        <div className="grid grid-cols-3 gap-2 mb-3">
          {[[h.ganoRiver,'GANÓ RIVER','#2fe07a'],[h.empates,'EMPATES','#e0a24e'],[h.ganoBoca,'GANÓ BOCA','#2f72e0']].map(([n,l,c],i)=>(
            <div key={i} className="bg-white/[.05] border border-white/[.08] rounded-2xl py-3 text-center"><b className="font-disp text-[26px] block leading-none" style={{color:c}}>{n}</b><small className="font-mono text-[7px] tracking-[1px] text-mut block mt-1.5">{l}</small></div>))}
        </div>
        <p className="font-mono text-[8px] text-dim mb-3">{h.total} clásicos oficiales · último: {h.ultimo}</p>
        <span className="font-mono text-[8px] tracking-[1px] text-mut block mb-2">ÚLTIMOS CRUCES</span>
        <div className="flex flex-col gap-1.5">
          {h.cruces.map(([f,s,r],i)=>{const[c,bg]=FORMA[r];return <div key={i} className="flex items-center justify-between bg-white/[.04] rounded-xl px-3 py-2"><span className="font-mono text-[10px] text-mut">{f}</span><b className="font-disp text-[14px]">{s}</b><span style={{width:20,height:20,borderRadius:6,display:'grid',placeItems:'center',fontFamily:'Oswald',fontWeight:700,fontSize:10,color:c,background:bg,border:'1px solid '+c}}>{r}</span></div>;})}
        </div>
      </div>}
      {blockOn('plantilla','ad')&&<div className="glass rounded-glass p-5 flex flex-col items-center gap-3">
        <span className="font-mono text-[8px] tracking-[2px] text-river2">PUBLICIDAD DE SOCIO EXCLUSIVO</span>
        <div className="flex items-center gap-4 py-3"><Crest k="river" name="River" s={44}/><img src="assets/betano.png" alt="Betano" className="h-8 object-contain"/></div>
      </div>}
    </div>
  </section>;
}

/* ============ SPONSORS ============ */
function Sponsors(){
  const db=useDB();const {blockOn}=useVis();const TC={ORO:'#ffcf3e',PLATA:'#c0c0cb',BRONCE:'#d9915a'};
  return <section className="rise">
    <Eyebrow k="COMERCIOS & MARCAS" t="Nuestros Sponsors" sub="Las marcas que viajan con la banda"/>
    {blockOn('sponsors','gob')&&<div className="rounded-glass overflow-hidden mb-4 relative" style={{background:'#fff'}}>
      <span className="absolute left-4 top-3 font-mono text-[8px] tracking-[2px] text-black/40">APOYA</span>
      <div className="flex items-center justify-center gap-3 py-8"><img src="assets/gobierno.gif" alt="Gobierno de Corrientes" className="h-12 object-contain"/></div>
    </div>}
    {/* tiers ahora se muestran en el carrusel grande (SponsorsTop) */}
    <div className="marquee-wrap overflow-hidden -mx-1 px-1">
      <div className="marquee-track gap-3">
        {[...(db.sponsors_locales||[]),...(db.sponsors_locales||[])].map((s,i)=>(
          <div key={i} className="glass rounded-glass flex-none w-[180px] h-24 grid place-items-center px-4 mr-3" style={{border:`1px solid ${TC[s.tier]}55`,boxShadow:`0 12px 30px -18px ${TC[s.tier]}66`}}>
            <div className="text-center"><div className="font-mono text-[8px] tracking-[2px] mb-1.5" style={{color:TC[s.tier]}}>{s.tier}</div>{s.logo?<img src={s.logo} className="h-7 mx-auto object-contain"/>:<span className="font-disp text-[15px] tracking-[.5px]">{s.nombre}</span>}</div>
          </div>))}
      </div>
    </div>
    <div className="flex justify-center mt-4"><Chip>★ NUESTROS SPONSORS OFICIALES</Chip></div>
  </section>;
}

/* ============ SPONSORS CARRUSEL (grande, bajo próximo partido) ============ */
function SponsorsTop(){
  const db=useDB();const TC={ORO:'#ffcf3e',PLATA:'#c0c0cb',BRONCE:'#d9915a'};
  const all=['ORO','PLATA','BRONCE'].flatMap(t=>((db.sponsors&&db.sponsors[t])||[]).map((s,i)=>({...s,tier:t,k:t+i}))).filter(s=>s.logo||s.nombre);
  const locales=(db.sponsors_locales||[]).map((s,i)=>({...s,k:'l'+i}));
  const list=[...all,...locales];
  useEffect(()=>{const t=setInterval(()=>{document.querySelectorAll('.spon-top').forEach(s=>{if(s.swiper&&!s.matches(':hover'))s.swiper.slideNext();});},2600);return()=>clearInterval(t);},[]);
  if(list.length===0)return null;
  return <section className="rise">
    <Eyebrow k="COMERCIOS & MARCAS" t="Nuestros Sponsors"/>
    <swiper-container class="spon-top" slides-per-view="1.6" space-between="18" loop="true" grab-cursor="true" breakpoints='{"640":{"slidesPerView":3},"1024":{"slidesPerView":4}}' style={{paddingBottom:'4px'}}>
      {list.map(s=>(
        <swiper-slide key={s.k}>
          <a href={s.link||'#'} target={s.link?'_blank':'_self'} onClick={e=>{if(!s.link)e.preventDefault();}} className="glass rounded-glass h-32 md:h-36 grid place-items-center px-5 lift" style={{border:`1px solid ${TC[s.tier]||'#d9915a'}55`,boxShadow:`0 18px 44px -22px ${TC[s.tier]||'#d9915a'}77`}}>
            <div className="text-center">
              <div className="font-mono text-[9px] tracking-[2px] mb-2" style={{color:TC[s.tier]||'#d9915a'}}>{s.tier||'SPONSOR'}</div>
              {s.logo?<img src={s.logo} alt={s.nombre} className="max-h-12 mx-auto object-contain"/>:<b className="font-disp text-[22px] tracking-[.5px]">{s.nombre}</b>}
            </div>
          </a>
        </swiper-slide>))}
    </swiper-container>
  </section>;
}

/* ============ PRODE ============ */
function ProdeJuego({pr}){
  const db=useDB();
  const user=window.OMAuth&&OMAuth.current();
  const ck=u=>{const m=(u||'').match(/([a-z]+)\.png/i);return m?m[1]:'river';};
  const fixtures=(pr.fixtures||[]).filter(f=>!f.cerrado);
  const f0=db.formacion||{};
  const arr=x=>Array.isArray(x)?x:(x&&typeof x==='object'?[x]:[]);
  const roster=[...arr(f0.del),...arr(f0.med),...arr(f0.def)].map(p=>p.n).filter(Boolean);
  const [picks,setPicks]=useState(()=>(user&&user.prodePicks)||{});
  const [saved,setSaved]=useState(false);
  const [openG,setOpenG]=useState(null);
  if(!user) return <div className="flex-1 grid place-items-center text-center py-4">
    <div>
      <span className="w-14 h-14 rounded-full grid place-items-center text-gold2 mx-auto mb-4" style={{background:'rgba(212,164,55,.12)',border:'1px solid rgba(212,164,55,.35)'}}><Ic n="lock" s={22}/></span>
      <h3 className="font-disp text-[22px] mb-2">Registrate para jugar el Prode</h3>
      <p className="text-mut text-[12.5px] max-w-xs mx-auto mb-5">Pronosticá el <b className="text-ink">marcador exacto</b> y los <b className="text-ink">goleadores</b> (con cuántos goles hizo cada uno) y ganá hasta 20% de descuento. Exclusivo de socios Plata, Oro y VIP.</p>
      <button onClick={()=>location.href='register.html'} className="press rounded-2xl py-3 px-6 text-[13px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',boxShadow:'0 12px 30px -8px rgba(224,30,47,.5)'}}>Registrate para jugar →</button>
    </div>
  </div>;
  const setP=(fid,patch)=>{const nx={...picks,[fid]:{...(picks[fid]||{gl:0,gv:0,goles:{}}),...patch}};setPicks(nx);setSaved(false);};
  const setGol=(fid,jug,d)=>{const p=picks[fid]||{gl:0,gv:0,goles:{}};const g={...(p.goles||{})};g[jug]=Math.max(0,(g[jug]||0)+d);if(g[jug]===0)delete g[jug];setP(fid,{goles:g});};
  const guardar=()=>{OMAuth.updateProfile({prodePicks:picks,prodeSemana:isoWeek()});
    OMDB.update(s=>{s.prode.participaciones=[{id:user.id,nombre:user.nombre,avatar:user.avatar||null,semana:isoWeek(),partidos:Object.keys(picks).length,fecha:Date.now(),aciertos:user.prodeAciertos||0},...((s.prode&&s.prode.participaciones)||[]).filter(p=>p.id!==user.id)].slice(0,200);});
    setSaved(true);};
  const yaJugo=user.prodeSemana===isoWeek();
  if(yaJugo)return <div className="flex-1 grid place-items-center text-center py-6">
    <div>
      <div className="text-[40px] mb-2">📩</div>
      <h3 className="font-disp text-[20px] mb-2">Pronóstico enviado</h3>
      <p className="text-mut text-[12.5px] max-w-xs mx-auto mb-3">Tus predicciones se manifestarán en tu cuenta. Podés consultar tus aciertos junto a la trivia una vez jugados los partidos.</p>
      <a href="dashboard.html" className="press rounded-2xl py-2.5 px-5 text-[12px] font-bold text-white inline-block" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)'}}>Ver mis aciertos →</a>
    </div>
  </div>;
  const Step=({val,onDec,onInc})=><div className="flex items-center gap-1.5"><button onClick={onDec} className="press w-7 h-7 rounded-lg grid place-items-center text-[16px] font-bold" style={{background:'rgba(255,255,255,.07)'}}>−</button><b className="font-disp text-[22px] w-6 text-center tabular-nums">{val}</b><button onClick={onInc} className="press w-7 h-7 rounded-lg grid place-items-center text-[16px] font-bold text-white" style={{background:'rgba(224,30,47,.8)'}}>+</button></div>;
  return <>
    <div className="flex items-center justify-between pb-3 mb-4 border-b border-dashed border-white/15">
      <b className="font-disp text-[15px] tracking-[.5px]">Tu Prode · marcador + goleadores</b>
      <span className="font-mono text-[8px] text-river2">● ABIERTO</span>
    </div>
    <div className="flex flex-col gap-3 flex-1">
      {fixtures.map(f=>{const p=picks[f.id]||{gl:0,gv:0,goles:{}};const golList=Object.entries(p.goles||{});
        return <div key={f.id} className="rounded-2xl p-3.5" style={{background:'rgba(255,255,255,.04)',border:'1px solid rgba(255,255,255,.07)'}}>
          <div className="grid grid-cols-[1fr_auto_1fr] items-center gap-2">
            <div className="flex flex-col items-center gap-1"><Crest k={ck(f.escudo_local)} name={f.local} s={30}/><b className="font-disp text-[10px] text-center leading-tight">{f.local}</b><Step val={p.gl} onDec={()=>setP(f.id,{gl:Math.max(0,p.gl-1)})} onInc={()=>setP(f.id,{gl:p.gl+1})}/></div>
            <span className="font-disp text-[16px] text-dim">-</span>
            <div className="flex flex-col items-center gap-1"><Crest k={ck(f.escudo_visita)} name={f.visitante} s={30}/><b className="font-disp text-[10px] text-center leading-tight">{f.visitante}</b><Step val={p.gv} onDec={()=>setP(f.id,{gv:Math.max(0,p.gv-1)})} onInc={()=>setP(f.id,{gv:p.gv+1})}/></div>
          </div>
          <button onClick={()=>setOpenG(openG===f.id?null:f.id)} className="press w-full mt-3 rounded-xl py-2 text-[11px] font-semibold text-cyanx" style={{background:'rgba(34,211,238,.08)',border:'1px solid rgba(34,211,238,.25)'}}>⚽ Goleadores {golList.length>0&&<span className="text-ink">· {golList.map(([n,c])=>c>1?`${n.split(' ')[0]}×${c}`:n.split(' ')[0]).join(', ')}</span>} {openG===f.id?'▲':'▼'}</button>
          {openG===f.id&&<div className="mt-2 grid grid-cols-1 gap-1 max-h-[160px] overflow-y-auto pr-1">
            {roster.map(j=>{const c=(p.goles||{})[j]||0;return <div key={j} className="flex items-center gap-2 rounded-lg px-2 py-1.5" style={{background:c>0?'rgba(224,30,47,.1)':'rgba(255,255,255,.03)'}}>
              <span className="text-[11px] flex-1 truncate">{j}</span>
              <button onClick={()=>setGol(f.id,j,-1)} className="press w-6 h-6 rounded grid place-items-center text-[14px]" style={{background:'rgba(255,255,255,.07)'}}>−</button>
              <b className="font-disp text-[13px] w-4 text-center" style={{color:c>0?'#ff6b78':'#5e5e6a'}}>{c}</b>
              <button onClick={()=>setGol(f.id,j,1)} className="press w-6 h-6 rounded grid place-items-center text-[14px] text-white" style={{background:'rgba(224,30,47,.7)'}}>+</button>
            </div>;})}
            {roster.length===0&&<p className="text-mut text-[10px] py-2 text-center">Cargá el plantel en el panel para elegir goleadores.</p>}
          </div>}
        </div>;})}
    </div>
    <button onClick={guardar} className="press rounded-2xl py-3 mt-3 text-[13px] font-bold text-white" style={{background:saved?'rgba(34,197,94,.9)':'linear-gradient(160deg,#ff2e3e,#8d0917)'}}>{saved?'✓ Pronóstico guardado':'Guardar mi pronóstico'}</button>
  </>;
}

function isoWeek(d=new Date()){const t=new Date(d);t.setHours(0,0,0,0);t.setDate(t.getDate()+3-((t.getDay()+6)%7));const w1=new Date(t.getFullYear(),0,4);return t.getFullYear()+'-W'+String(1+Math.round(((t-w1)/864e5-3+((w1.getDay()+6)%7))/7)).padStart(2,'0');}
function Trivia({embedded}){
  const db=useDB();const t=db.trivia||{preguntas:[]};const toast=useContext(ToastCtx);
  const user=window.OMAuth&&OMAuth.current();
  const semana=isoWeek();
  const yaJugo=user&&user.triviaSemana===semana;
  const [i,setI]=useState(0);const [sel,setSel]=useState(null);const [t10,setT10]=useState(10);const [aciertos,setAciertos]=useState(0);const [fin,setFin]=useState(false);
  const q=t.preguntas[i];
  useEffect(()=>{if(sel!==null||fin||yaJugo||!q)return;
    if(t10<=0){responder(-1);return;}
    const id=setTimeout(()=>setT10(t10-1),1000);return()=>clearTimeout(id);
  },[t10,sel,fin,q,yaJugo]);
  if(!q)return null;
  function responder(n){
    if(sel!==null)return;setSel(n);
    const ok=n===q.correcta;
    if(ok)setAciertos(a=>a+1);
    if(ok&&user)OMAuth.updateProfile({creditos:(user.creditos||0)+q.premio,xp:(user.xp||0)+q.premio});
    toast(ok?`¡Correcto! +${q.premio} créditos`:(n===-1?'⏱ Se acabó el tiempo':'Ups, no era esa'));
  }
  const next=()=>{
    if(i+1>=t.preguntas.length){setFin(true);if(user){OMAuth.updateProfile({triviaSemana:semana,triviaAciertos:(user.triviaAciertos||0)+aciertos,triviaJugadas:(user.triviaJugadas||0)+1});
      OMDB.update(s=>{s.trivia.participaciones=[{id:user.id,nombre:user.nombre,avatar:user.avatar||null,semana,aciertos,total:t.preguntas.length,fecha:Date.now()},...((s.trivia&&s.trivia.participaciones)||[]).filter(p=>!(p.id===user.id&&p.semana===semana))].slice(0,200);});}
      return;}
    setSel(null);setT10(10);setI(i+1);
  };
  const inner=<div className="glass rounded-glass p-6 md:p-8 max-w-2xl mx-auto w-full h-full flex flex-col justify-center">
      {yaJugo?<div className="text-center py-8">
        <div className="text-[44px] mb-2">🏆</div>
        <h3 className="font-disp text-[22px] mb-2">Ya jugaste esta semana</h3>
        {user&&<div className="flex items-center justify-center gap-6 my-4">
          <div className="text-center"><b className="font-disp text-[30px] block leading-none text-gold2">{user.triviaAciertos||0}</b><small className="font-mono text-[8px] tracking-[1.5px] text-mut">ACIERTOS TOTALES</small></div>
          <div className="text-center"><b className="font-disp text-[30px] block leading-none text-cyanx">{user.triviaJugadas||0}</b><small className="font-mono text-[8px] tracking-[1.5px] text-mut">TANDAS JUGADAS</small></div>
        </div>}
        <p className="text-mut text-[13px] max-w-sm mx-auto">Volvé la próxima semana: <b className="text-ink">preguntas nuevas y más difíciles</b>. Semana actual: {semana}.</p>
      </div>:fin?<div className="text-center py-8">
        <div className="text-[44px] mb-2">✅</div>
        <h3 className="font-disp text-[24px] mb-1">¡Terminaste la trivia!</h3>
        <p className="text-gold2 font-mono text-[13px] mb-1">{aciertos}/{t.preguntas.length} correctas esta semana</p>
        {user&&<p className="text-cyanx font-mono text-[11px] mb-2">Acumulás {(user.triviaAciertos||0)} aciertos · +créditos en tu cuenta</p>}
        <p className="text-mut text-[12.5px] max-w-sm mx-auto">{user?'Tus créditos y aciertos ya están en tu cuenta.':'Registrate para acumular los créditos que ganás.'}</p>
      </div>:<>
        <div className="flex items-center justify-between mb-4">
          <span className="font-mono text-[9px] tracking-[2px] text-river2">PREGUNTA {i+1}/{t.preguntas.length}</span>
          <div className="flex items-center gap-3">
            <span className="font-mono text-[9px] text-gold2">+{q.premio}</span>
            <span className="relative w-9 h-9 grid place-items-center font-disp text-[15px]" style={{color:t10<=3?'#ff2e3e':'#f4f4f6'}}>
              <svg viewBox="0 0 36 36" className="absolute inset-0 -rotate-90"><circle cx="18" cy="18" r="15" fill="none" stroke="rgba(255,255,255,.1)" strokeWidth="3"/><circle cx="18" cy="18" r="15" fill="none" stroke={t10<=3?'#ff2e3e':'#ffcf3e'} strokeWidth="3" strokeDasharray={94.2} strokeDashoffset={94.2*(1-t10/10)} strokeLinecap="round" style={{transition:'stroke-dashoffset 1s linear'}}/></svg>
              {t10}</span>
          </div>
        </div>
        <h3 className="font-disp text-[22px] md:text-[26px] leading-tight mb-5" style={{textWrap:'pretty'}}>{q.q}</h3>
        <div className="grid sm:grid-cols-2 gap-2.5">
          {q.opciones.map((o,n)=>{const isC=n===q.correcta;const picked=sel===n;
            const st=sel===null?{background:'rgba(255,255,255,.05)',border:'1px solid rgba(255,255,255,.1)',color:'#f4f4f6'}
              :isC?{background:'rgba(34,197,94,.15)',border:'1px solid rgba(34,197,94,.5)',color:'#7ef2a8'}
              :picked?{background:'rgba(224,30,47,.15)',border:'1px solid rgba(224,30,47,.5)',color:'#ff9aa3'}
              :{background:'rgba(255,255,255,.03)',border:'1px solid rgba(255,255,255,.06)',color:'#8a8a97'};
            return <button key={n} onClick={()=>responder(n)} disabled={sel!==null} className="press rounded-2xl px-4 py-3.5 text-left text-[14px] font-semibold flex items-center gap-3" style={st}>
              <span className="font-disp text-[13px] w-6 h-6 rounded-lg grid place-items-center flex-none" style={{background:'rgba(255,255,255,.08)'}}>{'ABCD'[n]}</span>{o}
              {sel!==null&&isC&&<span className="ml-auto">✓</span>}</button>;})}
        </div>
        {sel!==null&&<button onClick={next} className="press rounded-2xl py-3 mt-4 w-full text-[13px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)'}}>{i+1>=t.preguntas.length?'Ver resultado':'Siguiente pregunta →'}</button>}
      </>}
    </div>;
  if(embedded)return inner;
  return <section className="rise">
    <Eyebrow k={t.kicker} t={t.titulo} sub="Una tanda por semana · 10 segundos por pregunta · ganás créditos por cada acierto"/>
    {inner}
  </section>;
}

/* ============ PRODE (sección) ============ */
function Prode(){
  const db=useDB();const {blockOn}=useVis();const pr=db.prode;const pt=db.partido;const [vid,setVid]=useState(false);
  return <section className="rise">
    <Eyebrow k={pr.kicker} t={pr.titulo} sub={<>Acertá y ganá hasta <b className="text-ink">{pr.descuento}</b> en tu próximo viaje</>}/>
    <div className="grid md:grid-cols-2 gap-4">
      <div className="glass rounded-glass p-6 flex flex-col">
        <ProdeJuego pr={pr}/>
      </div>
      {blockOn('prode','video')&&<div className="glass rounded-glass p-5 flex flex-col">
        <div className="flex items-center gap-2 mb-4"><span className="w-8 h-8 rounded-xl grid place-items-center text-gold2" style={{background:'rgba(255,207,62,.12)',border:'1px solid rgba(255,207,62,.3)'}}>🧠</span><div><b className="font-disp text-[14px] tracking-[1px]">TRIVIA DE LA SEMANA</b><div className="font-mono text-[7px] text-gold2">● JUGÁ Y GANÁ CRÉDITOS</div></div></div>
        <div className="flex-1 flex"><Trivia embedded/></div>
      </div>}
    </div>
    {blockOn('prode','ad')&&(()=>{const b=(db.config.banners||[]).find(x=>x.slot==='prode-banner'&&x.img);
      return <a href={b&&b.link?b.link:undefined} target={b&&b.link?'_blank':undefined} className="block rounded-glass overflow-hidden glass relative mt-4" style={{aspectRatio:'970/140',width:'100%',marginInline:'auto',width:'100%'}}>
        {b&&b.img?<img src={b.img} alt="Publicidad" className="absolute inset-0 w-full h-full object-cover"/>
          :<div className="absolute inset-0 grid place-items-center text-center"><div><div className="font-mono text-[10px] tracking-[2px] text-mut">ESPACIO PUBLICITARIO</div><div className="font-mono text-[8px] text-dim mt-1.5">970 × 140 · configurable desde el panel</div></div></div>}
      </a>;})()}
    {vid&&<VideoModal reel={pr.video} onClose={()=>setVid(false)}/>}
  </section>;
}

/* ============ REELS ============ */
function ytId(u){const m=(u||'').match(/(?:youtu\.be\/|v=|shorts\/|embed\/)([\w-]{11})/);return m?m[1]:null;}
function ttId(u){const m=(u||'').match(/video\/(\d+)/);return m?m[1]:null;}
function VideoModal({reel,onClose}){
  const yt=reel.plataforma==='YOUTUBE'&&ytId(reel.url);const tt=reel.plataforma==='TIKTOK'&&ttId(reel.url);
  const vertical=!yt;
  return <div className="fixed inset-0 z-[95] flex items-center justify-center p-3 md:p-6" onClick={onClose} style={{animation:'fadeIn .25s both'}}>
    <div className="absolute inset-0 bg-black/92 backdrop-blur-xl"/>
    <button onClick={onClose} className="absolute top-4 right-4 z-20 press w-11 h-11 rounded-full glass grid place-items-center text-ink text-[18px]">✕</button>
    <div onClick={e=>e.stopPropagation()} className="relative flex flex-col items-center gap-3" style={{animation:'sheetUp .4s cubic-bezier(.22,1,.36,1) both'}}>
      <b className="font-disp text-[16px] md:text-[20px] tracking-[.5px] text-center max-w-[86vw] truncate">{reel.titulo}</b>
      <div className="rounded-[22px] overflow-hidden bg-black" style={vertical?{height:'min(84vh,760px)',aspectRatio:'9/16',maxWidth:'94vw',boxShadow:'0 40px 90px -20px rgba(0,0,0,.9)'}:{width:'min(94vw,1100px)',aspectRatio:'16/9',boxShadow:'0 40px 90px -20px rgba(0,0,0,.9)'}}>
        {yt?<iframe src={`https://www.youtube.com/embed/${yt}?autoplay=1&rel=0`} title={reel.titulo} allow="autoplay; encrypted-media; picture-in-picture" allowFullScreen className="w-full h-full border-0"/>
         :tt?<iframe src={`https://www.tiktok.com/embed/v2/${tt}`} title={reel.titulo} allowFullScreen className="w-full h-full border-0"/>
         :<a href={reel.url} target="_blank" className="w-full h-full grid place-items-center text-mut text-[13px]">Abrir video ↗</a>}
      </div>
    </div>
  </div>;
}
function Reels(){
  const db=useDB();const [playing,setPlaying]=useState(null);const reels=db.reels||[];
  const secRef=useRef();
  useEffect(()=>{
    const el=secRef.current;if(!el)return;
    const onScroll=()=>{const r=el.getBoundingClientRect();const vh=window.innerHeight;
      const center=r.top+r.height/2;const dist=Math.abs(center-vh/2);const k=Math.max(0,Math.min(1,1-(dist-vh*0.35)/(vh*0.5)));
      el.style.opacity=(0.25+0.75*k).toFixed(3);el.style.transform=`scale(${(0.965+0.035*k).toFixed(3)})`;};
    onScroll();window.addEventListener('scroll',onScroll,{passive:true});window.addEventListener('resize',onScroll);
    return()=>{window.removeEventListener('scroll',onScroll);window.removeEventListener('resize',onScroll);};
  },[]);
  return <section ref={secRef} className="rise" style={{transition:'opacity .3s,transform .3s',willChange:'opacity,transform'}}>
    <Eyebrow k="MULTIMEDIA EXCLUSIVA · FILIAL CORRIENTES" t="Reels & TikTok" sub="Los mejores momentos de la banda · deslizá para recorrerlos"/>
    <swiper-container class="reels-cf" effect="coverflow" grab-cursor="true" centered-slides="true" slides-per-view="auto" loop={reels.length>2?"true":"false"} space-between="0"
      coverflow-effect-rotate="6" coverflow-effect-stretch="0" coverflow-effect-depth="220" coverflow-effect-modifier="2.1" coverflow-effect-slide-shadows="true"
      pagination="true" navigation="true" style={{paddingBottom:'20px'}}>
      {reels.map((r,i)=>{const yt=r.plataforma==='YOUTUBE'&&ytId(r.url);const tt=r.plataforma==='TIKTOK'&&ttId(r.url);const thumb=yt?`https://i.ytimg.com/vi/${yt}/hqdefault.jpg`:null;const isPlay=playing===i;
        return <swiper-slide key={i} style={{width:'clamp(230px,74vw,290px)'}}>
          <div className="reel-card relative rounded-[30px] overflow-hidden bg-black w-full" style={{aspectRatio:'9/16',boxShadow:'0 30px 70px -26px rgba(0,0,0,.95),0 0 0 5px rgba(20,20,26,.9),0 0 0 6px rgba(255,255,255,.08)'}}>
            <span className="absolute top-2 left-1/2 -translate-x-1/2 w-[70px] h-[18px] bg-black rounded-full z-20 pointer-events-none" style={{boxShadow:'inset 0 0 0 1px rgba(255,255,255,.06)'}}/>
            {isPlay?(yt?<iframe src={`https://www.youtube.com/embed/${yt}?autoplay=1&rel=0&playsinline=1&modestbranding=1`} title={r.titulo} allow="autoplay; encrypted-media; picture-in-picture" allowFullScreen className="absolute inset-0 w-full h-full border-0"/>
                 :tt?<iframe src={`https://www.tiktok.com/embed/v2/${tt}`} title={r.titulo} allowFullScreen className="absolute inset-0 w-full h-full border-0"/>
                 :<a href={r.url} target="_blank" className="absolute inset-0 grid place-items-center text-mut text-[13px]">Abrir video ↗</a>)
             :<button onClick={()=>setPlaying(i)} className="press absolute inset-0 w-full h-full block group">
                {thumb?<img src={thumb} alt="" className="absolute inset-0 w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"/>:<span className="absolute inset-0 grid place-items-center text-[34px] opacity-30">▶</span>}
                <div className="absolute inset-0" style={{background:'linear-gradient(transparent 38%,rgba(0,0,0,.55) 68%,rgba(0,0,0,.95))'}}/>
                <span className="absolute top-3 right-3 font-mono text-[7px] tracking-[1px] px-2 py-1 rounded-full" style={{background:r.plataforma==='TIKTOK'?'rgba(34,211,238,.2)':'rgba(224,30,47,.28)',color:r.plataforma==='TIKTOK'?'#22d3ee':'#ff6b78'}}>{r.plataforma}</span>
                <span className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[66px] h-[66px] rounded-full grid place-items-center text-white transition-transform duration-300 group-hover:scale-110" style={{background:'rgba(224,30,47,.94)',boxShadow:'0 8px 34px rgba(224,30,47,.75)'}}><Ic n="play" s={28}/></span>
                <div className="absolute bottom-3.5 left-4 right-4 text-left">
                  <b className="font-disp text-[14px] leading-tight block">{r.titulo}</b>
                  <small className="font-mono text-[8px] text-mut tracking-[1px]">{r.vistas} vistas</small>
                </div>
              </button>}
          </div>
        </swiper-slide>;})}
    </swiper-container>
  </section>;
}

/* ============ TESTIMONIOS ============ */
function Testimonios(){
  const db=useDB();
  const list=db.testimonios||[];
  const ini=n=>(n||'?').split(/\s+/).slice(0,2).map(w=>w[0]).join('').toUpperCase();
  const [idx,setIdx]=useState(0);const [paused,setPaused]=useState(false);
  useEffect(()=>{if(paused||list.length<2)return;const t=setInterval(()=>setIdx(i=>(i+1)%list.length),4200);return()=>clearInterval(t);},[paused,list.length]);
  if(list.length===0)return null;
  const t=list[idx];
  const av=t.avatar?<img src={t.avatar} alt={t.nombre} className="w-full h-full object-cover"/>:<span className="font-disp font-bold text-[20px] text-white">{ini(t.nombre)}</span>;
  return <section className="rise" onMouseEnter={()=>setPaused(true)} onMouseLeave={()=>setPaused(false)}>
    <Eyebrow k="EXPERIENCIAS REALES" t="La Banda Habla" sub="Hinchas de River desde todo Corrientes"/>
    <div className="relative glass rounded-glass p-7 md:p-10 overflow-hidden" style={{minHeight:'260px'}}>
      <img src="assets/logo-om.png" alt="" className="absolute -right-10 -bottom-10 w-52 object-contain pointer-events-none" style={{opacity:.06}}/>
      <div key={idx} className="relative flex flex-col items-center text-center" style={{animation:'rise .55s cubic-bezier(.22,1,.36,1) both'}}>
        <span className="w-20 h-20 rounded-full grid place-items-center overflow-hidden border-2 border-river flex-none mb-4" style={{background:`linear-gradient(150deg,${t.color||'#e01e2f'},rgba(0,0,0,.4))`,boxShadow:`0 14px 40px -12px ${t.color||'#e01e2f'}`}}>{av}</span>
        <div className="text-gold2 text-[13px] mb-3 tracking-[2px]">★★★★★</div>
        <p className="text-[16px] md:text-[20px] text-ink leading-relaxed max-w-[640px] mb-5" style={{textWrap:'pretty'}}>“{t.texto}”</p>
        <b className="font-disp text-[16px] block leading-none">{t.nombre}</b>
        <small className="font-mono text-[9px] text-dim tracking-[1.5px] mt-1">{(t.lugar||'').toUpperCase()} · 🏆 {t.tag}</small>
      </div>
      <div className="flex items-center justify-center gap-2 mt-6">
        {list.map((_,i)=><button key={i} onClick={()=>setIdx(i)} className="press rounded-full transition-all" style={{width:i===idx?22:8,height:8,background:i===idx?'#ff2e3e':'rgba(255,255,255,.25)'}}/>)}
      </div>
    </div>
  </section>;
}

/* ============ CONTACTO ============ */
function Contacto(){
  const db=useDB();const [subj,setSubj]=useState('Reservar un viaje');const [nombre,setNombre]=useState('');const [email,setEmail]=useState('');const [msg,setMsg]=useState('');const [sent,setSent]=useState(false);
  const correo=db.config.email||'contacto@orgullomillonario.com';
  const send=()=>{
    if(!nombre.trim()||!msg.trim()){return;}
    OMDB.update(s=>{s.mensajes=[{id:'m'+Date.now(),asunto:subj,nombre:nombre.trim(),email:email.trim(),mensaje:msg.trim(),fecha:Date.now(),leido:false},...(s.mensajes||[])].slice(0,200);});
    const body=encodeURIComponent(`Asunto: ${subj}\nNombre: ${nombre}\nEmail: ${email}\n\n${msg}`);
    window.location.href=`mailto:${correo}?subject=${encodeURIComponent('['+subj+'] '+nombre)}&body=${body}`;
    setSent(true);setNombre('');setEmail('');setMsg('');
  };
  const subjects=[['Reservar un viaje','ticket','#ff2e3e'],['Ser sponsor','home','#ffcf3e'],['Sorteos','home','#8b5cf6'],['Consulta general','chat','#2fe07a']];
  const socials=[['ig','#ee2a7b','https://instagram.com/'+db.config.instagram],['yt','#ff3b30','#'],['tk','#22d3ee','#'],['x','#f6f1f2','#']];
  return <section className="glass rounded-glass p-6 md:p-8 rise">
    <div className="grid md:grid-cols-2 gap-8">
      <div>
        <div className="font-mono text-[10px] tracking-[3px] text-river2 mb-2">HABLEMOS</div>
        <h2 className="font-disp font-700 text-[40px] md:text-[52px] leading-none mb-4">CONTACTO</h2>
        <p className="text-mut text-[14px] max-w-sm mb-5">¿Querés reservar un viaje, ser sponsor o tenés una consulta? Escribinos y te respondemos a la brevedad.</p>
        <a href={'mailto:'+correo} className="inline-flex items-center gap-2.5 glass rounded-2xl px-4 py-3 mb-5 press"><span className="text-river2"><Ic n="chat" s={16}/></span><b className="font-mono text-[12px]">{correo}</b></a>
        <div className="rounded-2xl px-4 py-3 mb-5" style={{background:'rgba(47,224,122,.08)',border:'1px solid rgba(47,224,122,.28)'}}>
          <div className="flex items-center gap-2 font-mono text-[10px] tracking-[1px] text-green-400 mb-1"><i className="w-[6px] h-[6px] rounded-full bg-green-400" style={{animation:'pulseDot 1.6s infinite'}}/>HORARIO DE ATENCIÓN</div>
          <b className="text-[13px]">Lunes a sábado · 9:00 a 20:00 hs</b>
        </div>
        <div className="flex gap-2.5 mb-5">{socials.map(([n,c,href])=><a key={n} href={href} target="_blank" className="social-ico w-11 h-11 rounded-full glass grid place-items-center" style={{color:c}}><Ic n={n} s={17}/></a>)}</div>
        <a href="terminos.html" className="font-mono text-[11px] text-mut underline hover:text-ink">Términos y Condiciones</a>
        <a href="planes.html" className="font-mono text-[11px] text-mut underline hover:text-ink ml-4">Planes de socio</a>
      </div>
      <div>
        {sent?<div className="h-full flex flex-col items-center justify-center text-center gap-3 py-10">
          <div className="w-16 h-16 rounded-full grid place-items-center text-green-400 text-[30px]" style={{background:'rgba(47,224,122,.12)',border:'1px solid rgba(47,224,122,.4)'}}>✓</div>
          <b className="font-disp text-[24px]">¡Gracias por tu mensaje!</b>
          <p className="text-mut text-[13px] max-w-[300px]">Te responderemos a la brevedad dentro de nuestro horario de atención (9 a 20 hs).</p>
          <button onClick={()=>setSent(false)} className="press glass rounded-2xl px-5 py-2.5 text-[12px] font-bold text-ink mt-1">Enviar otro mensaje</button>
        </div>:<>
        <span className="font-mono text-[9px] tracking-[2px] text-mut block mb-2">¿SOBRE QUÉ NOS ESCRIBÍS?</span>
        <div className="grid grid-cols-2 gap-2 mb-3">
          {subjects.map(([s,ic,c])=>(
            <button key={s} onClick={()=>setSubj(s)} className={`press rounded-2xl px-3 py-3 flex items-center gap-2.5 border transition-all ${subj===s?'text-white':'text-mut'}`} style={{borderColor:subj===s?c:'rgba(255,255,255,.1)',background:subj===s?c+'1e':'rgba(255,255,255,.04)'}}>
              <span style={{color:c}}><Ic n={ic} s={16}/></span><b className="text-[12.5px] flex-1 text-left">{s}</b>{subj===s&&<span style={{color:c}}>✓</span>}
            </button>))}
        </div>
        <input value={nombre} onChange={e=>setNombre(e.target.value)} placeholder="Tu nombre" className="w-full bg-white/[.06] border border-white/12 rounded-2xl px-4 py-3 text-[13.5px] outline-none focus:border-river/60 mb-3 placeholder:text-dim"/>
        <input value={email} onChange={e=>setEmail(e.target.value)} type="email" placeholder="Tu email (para responderte)" className="w-full bg-white/[.06] border border-white/12 rounded-2xl px-4 py-3 text-[13.5px] outline-none focus:border-river/60 mb-3 placeholder:text-dim"/>
        <textarea value={msg} onChange={e=>setMsg(e.target.value)} placeholder="Contanos en qué podemos ayudarte…" rows="4" className="w-full bg-white/[.06] border border-white/12 rounded-2xl px-4 py-3 text-[13.5px] outline-none focus:border-river/60 mb-3 resize-none placeholder:text-dim"/>
        <button onClick={send} className="press rounded-2xl py-4 w-full text-[15px] font-bold text-white flex items-center justify-center gap-2" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',boxShadow:'0 12px 30px -8px rgba(224,30,47,.5)'}}>Enviar mensaje →</button>
        </>}
      </div>
    </div>
  </section>;
}

/* ============ FORO COMUNITARIO ============ */
function Foro(){
  const db=useDB();const foro=db.foro||{posts:[],comentarios:[]};
  const user=window.OMAuth&&OMAuth.current();
  const [open,setOpen]=useState(null);
  const [nt,setNt]=useState('');const [nc,setNc]=useState('');const [cat,setCat]=useState('general');
  const [reply,setReply]=useState('');
  const cats=[['general','General'],['viajes','Viajes'],['figuritas','Figuritas'],['prode','Prode']];
  const catColor={general:'#8b5cf6',viajes:'#2f7df6',figuritas:'#ffcf3e',prode:'#2fe07a'};
  const ago=t=>{const d=(Date.now()-t)/6e4;if(d<60)return Math.round(d)+'m';if(d<1440)return Math.round(d/60)+'h';return Math.round(d/1440)+'d';};
  const post=()=>{ if(!user){location.href='login.html';return;} if(!nt.trim()||!nc.trim())return;
    const p={id:'p'+Date.now(),titulo:nt.trim(),contenido:nc.trim(),categoria:cat,autor:user.nombre,avatar:user.avatar,fecha:Date.now()};
    OMDB.update(s=>{s.foro.posts=[p,...s.foro.posts];});
    if(window.OMCloud&&OMCloud.enabled)OMCloud.savePost(p.titulo,p.contenido,p.categoria);
    setNt('');setNc('');};
  const coment=(pid,parent)=>{ if(!user){location.href='login.html';return;} const txt=parent?reply:nc; if(!txt.trim())return;
    const c={id:'c'+Date.now(),post_id:pid,parent_id:parent||null,autor:user.nombre,avatar:user.avatar,contenido:txt.trim(),fecha:Date.now()};
    OMDB.update(s=>{s.foro.comentarios=[...s.foro.comentarios,c];});
    if(window.OMCloud&&OMCloud.enabled)OMCloud.addComentario(pid,c.contenido,parent);
    setReply('');};
  const comsOf=pid=>foro.comentarios.filter(c=>c.post_id===pid);
  const like=pid=>{if(!user){location.href='login.html';return;}OMDB.update(s=>{const p=s.foro.posts.find(x=>x.id===pid);if(!p)return;p.likes=p.likes||[];const i=p.likes.indexOf(user.id);i>=0?p.likes.splice(i,1):p.likes.push(user.id);});};
  const fijar=pid=>OMDB.update(s=>{const p=s.foro.posts.find(x=>x.id===pid);if(p)p.fijado=!p.fijado;});
  const isAdmin=user&&(user.role==='admin'||user.role==='moderator');
  const orden=[...foro.posts].sort((a,b)=>(b.fijado?1:0)-(a.fijado?1:0)||b.fecha-a.fecha);
  /* ranking Top de la Banda: puntos = posts*10 + comentarios*4 */
  const rank={};
  foro.posts.forEach(p=>{rank[p.autor]=rank[p.autor]||{n:p.autor,av:p.avatar,pts:0};rank[p.autor].pts+=10+((p.likes||[]).length*2);});
  foro.comentarios.forEach(c=>{rank[c.autor]=rank[c.autor]||{n:c.autor,av:c.avatar,pts:0};rank[c.autor].pts+=4;});
  const top=Object.values(rank).sort((a,b)=>b.pts-a.pts).slice(0,5);
  const insignia=p=>p>=60?['LEYENDA','#ffcf3e']:p>=30?['CAPITÁN','#8b5cf6']:p>=12?['TITULAR','#2fe07a']:['HINCHA','#9a9aa6'];
  const Avatar=({a,n,s=34})=><span className="rounded-full grid place-items-center overflow-hidden font-disp font-bold text-gold2 border border-river/60 flex-none" style={{width:s,height:s,fontSize:s*0.38,background:'radial-gradient(circle at 35% 30%,#3a3a44,#17171c)'}}>{a?<img src={a} alt="" className="w-full h-full object-cover"/>:(n||'?').slice(0,2).toUpperCase()}</span>;
  /* presencia en línea (usuarios registrados) + chat en vivo */
  const online=(foro.online&&foro.online.length?foro.online:[{n:'Marcos A.',av:null},{n:'Valen R.',av:null},{n:'Fer P.',av:null},{n:'Dai G.',av:null},{n:'Luli M.',av:null}]);
  const chat=foro.chat||[];const [cm,setCm]=useState('');const chatEnd=useRef();
  useEffect(()=>{if(chatEnd.current)chatEnd.current.scrollTop=chatEnd.current.scrollHeight;},[chat.length]);
  const sendChat=()=>{if(!cm.trim())return;if(!user){location.href='login.html';return;}OMDB.update(s=>{s.foro.chat=[...(s.foro.chat||[]),{id:'ch'+Date.now(),autor:user.nombre.split(' ')[0],avatar:user.avatar||null,texto:cm.trim(),fecha:Date.now()}].slice(-60);});setCm('');};
  return <section className="rise">
    <Eyebrow k="COMUNIDAD · EN VIVO" t="Foro de la Banda" sub="Debatí, organizá viajes e intercambiá figuritas · se actualiza en tiempo real"/>
    <div className="glass rounded-glass p-3.5 mb-4 flex items-center gap-3 overflow-x-auto no-scrollbar">
      <span className="font-mono text-[8px] tracking-[1.5px] text-green-400 flex items-center gap-1.5 flex-none"><i className="w-[7px] h-[7px] rounded-full bg-green-400" style={{animation:'pulseDot 1.6s infinite'}}/>{online.length} EN LÍNEA</span>
      <div className="flex items-center gap-3 flex-1">
        {online.map((o,i)=><div key={i} className="flex flex-col items-center gap-1 flex-none"><div className="relative"><Avatar a={o.av} n={o.n} s={38}/><i className="absolute bottom-0 right-0 w-3 h-3 rounded-full bg-green-400 border-2 border-[#0d0d12]"/></div><small className="font-mono text-[7px] text-mut">{(o.n||'').split(' ')[0]}</small></div>)}
      </div>
    </div>
    <div className="grid lg:grid-cols-[1fr_340px] gap-4 items-start">
      <div className="flex flex-col gap-3">
        {orden.map(p=>{const coms=comsOf(p.id);const isOpen=open===p.id;const cc=catColor[p.categoria]||'#8b5cf6';const liked=user&&(p.likes||[]).includes(user.id);
          return <div key={p.id} className="glass rounded-glass p-5 lift" style={p.fijado?{borderColor:'rgba(255,207,62,.4)'}:{}}>
            {p.fijado&&<div className="font-mono text-[7px] tracking-[2px] text-gold2 mb-1.5">📌 FIJADO POR EL CLUB</div>}
            <div className="flex items-center gap-3 mb-2">
              <Avatar a={p.avatar} n={p.autor}/>
              <div className="min-w-0 flex-1"><b className="text-[12.5px] block leading-tight">{p.autor}</b><small className="font-mono text-[8px] text-dim">{ago(p.fecha)} atrás</small></div>
              <span className="font-mono text-[7px] tracking-[1px] px-2.5 py-1 rounded-full" style={{color:cc,background:cc+'1e',border:`1px solid ${cc}55`}}>{p.categoria.toUpperCase()}</span>
            </div>
            <h3 className="font-disp text-[17px] tracking-[.3px] mb-1">{p.titulo}</h3>
            <p className="text-mut text-[12.5px] leading-snug">{p.contenido}</p>
            <div className="flex items-center gap-3 mt-3">
              <button onClick={()=>like(p.id)} className="press font-mono text-[9px] tracking-[1px] flex items-center gap-1.5" style={{color:liked?'#ff2e3e':'#8a8a97'}}>{liked?'♥':'♡'} {(p.likes||[]).length} ME GUSTA</button>
              <button onClick={()=>setOpen(isOpen?null:p.id)} className="press font-mono text-[9px] tracking-[1px] text-river2 flex items-center gap-1.5"><Ic n="chat" s={12}/>{coms.length} RESPUESTAS</button>
              {isAdmin&&<button onClick={()=>fijar(p.id)} className="press font-mono text-[9px] tracking-[1px] text-gold2 ml-auto">{p.fijado?'DESFIJAR':'📌 FIJAR'}</button>}
            </div>
            {isOpen&&<div className="mt-3 pt-3 border-t border-white/10 flex flex-col gap-2.5">
              {coms.filter(c=>!c.parent_id).map(c=>(
                <div key={c.id} className="flex flex-col gap-2">
                  <div className="flex items-start gap-2.5"><Avatar a={c.avatar} n={c.autor} s={28}/><div className="bg-white/[.05] rounded-2xl px-3.5 py-2 flex-1"><b className="text-[10.5px] block">{c.autor} <span className="font-mono text-[7px] text-dim">· {ago(c.fecha)}</span></b><span className="text-[11.5px] text-ink/90">{c.contenido}</span></div></div>
                  {coms.filter(r=>r.parent_id===c.id).map(r=>(
                    <div key={r.id} className="flex items-start gap-2.5 ml-8"><Avatar a={r.avatar} n={r.autor} s={24}/><div className="bg-white/[.04] rounded-2xl px-3 py-1.5 flex-1"><b className="text-[10px] block">{r.autor}</b><span className="text-[11px] text-ink/80">{r.contenido}</span></div></div>))}
                </div>))}
              <div className="flex gap-2 mt-1">
                <input value={reply} onChange={e=>setReply(e.target.value)} onKeyDown={e=>e.key==='Enter'&&coment(p.id)} placeholder={user?'Escribí una respuesta…':'Iniciá sesión para responder'} className="flex-1 bg-white/[.06] border border-white/12 rounded-xl px-3 py-2 text-[12px] outline-none focus:border-river/60 min-w-0"/>
                <button onClick={()=>coment(p.id)} className="press rounded-xl px-4 text-[12px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)'}}>Enviar</button>
              </div>
            </div>}
          </div>;})}
      </div>
      <div className="flex flex-col gap-4 lg:sticky lg:top-24">
      <div className="glass rounded-glass p-4 flex flex-col" style={{maxHeight:'380px'}}>
        <b className="font-disp text-[14px] tracking-[.5px] block mb-2 flex items-center gap-2">💬 Chat en vivo <span className="font-mono text-[7px] text-green-400 ml-auto flex items-center gap-1"><i className="w-[6px] h-[6px] rounded-full bg-green-400" style={{animation:'pulseDot 1.6s infinite'}}/>EN VIVO</span></b>
        <div ref={chatEnd} className="flex flex-col gap-2 overflow-y-auto flex-1 pr-1" style={{minHeight:'160px'}}>
          {chat.length===0&&<small className="text-mut text-[11px] py-4 text-center">Todavía sin mensajes. ¡Rompé el hielo!</small>}
          {chat.map(m=><div key={m.id} className="flex items-start gap-2"><Avatar a={m.avatar} n={m.autor} s={26}/><div className="bg-white/[.05] rounded-2xl rounded-tl-sm px-3 py-1.5 flex-1"><b className="text-[10px] text-gold2">{m.autor}</b><span className="text-[11.5px] text-ink/90 block leading-snug">{m.texto}</span></div></div>)}
        </div>
        <div className="flex gap-2 mt-2.5">
          <input value={cm} onChange={e=>setCm(e.target.value)} onKeyDown={e=>e.key==='Enter'&&sendChat()} placeholder={user?'Escribí un mensaje…':'Iniciá sesión para chatear'} className="flex-1 bg-white/[.06] border border-white/12 rounded-xl px-3 py-2 text-[12px] outline-none focus:border-river/60 min-w-0"/>
          <button onClick={sendChat} className="press rounded-xl px-3.5 text-white flex-none" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)'}}>➤</button>
        </div>
      </div>
      <div className="glass rounded-glass p-5">
        <b className="font-disp text-[15px] tracking-[.5px] block mb-3">🏆 Top de la Banda</b>
        <div className="flex flex-col gap-2">
          {top.length===0&&<small className="text-mut text-[11px]">Todavía sin actividad. ¡Sé el primero!</small>}
          {top.map((m,i)=>{const [ins,ic]=insignia(m.pts);return <div key={i} className="flex items-center gap-2.5">
            <span className="font-disp text-[13px] w-5 text-center" style={{color:i===0?'#ffcf3e':i===1?'#c0c0cb':i===2?'#b0763a':'#8a8a97'}}>{i+1}</span>
            <Avatar a={m.av} n={m.n} s={30}/>
            <div className="min-w-0 flex-1"><b className="text-[11.5px] block truncate leading-tight">{m.n}</b><small className="font-mono text-[7px] tracking-[1px]" style={{color:ic}}>{ins} · {m.pts} pts</small></div>
          </div>;})}
        </div>
      </div>
      <div className="glass rounded-glass p-5">
        <b className="font-disp text-[15px] tracking-[.5px] block mb-3">Abrí un tema</b>
        {!user&&<div className="mb-3 rounded-xl px-3 py-2 text-[11px]" style={{background:'rgba(224,30,47,.1)',border:'1px solid rgba(224,30,47,.3)',color:'#ff9aa3'}}>🔒 Iniciá sesión para publicar.</div>}
        <div className="flex gap-1.5 flex-wrap mb-2">{cats.map(([id,l])=><button key={id} onClick={()=>setCat(id)} className={`press rounded-full px-2.5 py-1 text-[9px] font-mono tracking-[.5px] border ${cat===id?'text-white border-river bg-river/15':'text-mut border-white/10'}`}>{l}</button>)}</div>
        <input value={nt} onChange={e=>setNt(e.target.value)} placeholder="Título del tema…" className="w-full bg-white/[.06] border border-white/12 rounded-xl px-3 py-2.5 text-[12.5px] outline-none focus:border-river/60 mb-2"/>
        <textarea value={nc} onChange={e=>setNc(e.target.value)} rows={3} placeholder="¿Qué querés compartir con la banda?" className="w-full bg-white/[.06] border border-white/12 rounded-xl px-3 py-2.5 text-[12px] outline-none focus:border-river/60 resize-none mb-2"/>
        <button onClick={post} className="press rounded-xl py-2.5 w-full text-[12.5px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',boxShadow:'0 10px 26px -8px rgba(224,30,47,.5)'}}>Publicar tema</button>
        <p className="font-mono text-[8px] text-dim mt-3 leading-relaxed">Moderado por roles (RLS). El contenido ofensivo puede ser removido. Realtime vía Supabase cuando está conectado.</p>
      </div>
      </div>
    </div>
  </section>;
}

/* ============ NAV / APP ============ */
const SECMAP={hero:Hero,proximos:Proximos,sponsors_top:SponsorsTop,centro:Centro,prob:Prob,calendario:Calendario,viajes:Viajes,sorteos:Sorteos,resultados:Resultados,stats:Stats,sponsors:Sponsors,trivia:Trivia,prode:Prode,plantilla:Plantilla,reels:Reels,testimonios:Testimonios,foro:Foro,contacto:Contacto};
const NAV=[['hero','home','Inicio'],['calendario','cal','Calendario'],['viajes','ticket','Viajes'],['foro','chat','Foro'],['cuenta','user','Mi Cuenta']];
function App(){
  const db=useDB();const toast=useContext(ToastCtx);
  const light=db.config.tema==='light';
  useEffect(()=>{document.body.classList.toggle('theme-light',light);},[light]);
  const [top,setTop]=useState(false);
  useEffect(()=>{const f=()=>setTop(window.scrollY>600);window.addEventListener('scroll',f);return()=>window.removeEventListener('scroll',f);},[]);
  const go=id=>{if(id==='cuenta'){location.href=(window.OMAuth&&OMAuth.current())?'dashboard.html':'login.html';return;}const el=document.getElementById('s-'+id);if(el)window.scrollTo({top:el.getBoundingClientRect().top+window.scrollY-96,behavior:'smooth'});};
  const sections=(db.config.sections||[]).filter(x=>SECMAP[x.id]&&(!db.config.modular||x.on));
  useEffect(()=>{const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}}),{threshold:.08,rootMargin:'0px 0px -8% 0px'});
    document.querySelectorAll('.sec-reveal').forEach(el=>io.observe(el));return()=>io.disconnect();},[sections.length]);
  return <>
    <div className="blob w-[560px] h-[560px] -top-40 -left-32" style={{background:'radial-gradient(circle,#8d0917,transparent 70%)',opacity:.5,animation:'drift1 18s ease-in-out infinite'}}/>
    <div className="blob w-[460px] h-[460px] top-1/3 -right-32" style={{background:'radial-gradient(circle,#3b1d6e,transparent 70%)',opacity:.42,animation:'drift2 22s ease-in-out infinite'}}/>
    <div className="blob w-[400px] h-[400px] bottom-0 left-1/3" style={{background:'radial-gradient(circle,#5a4008,transparent 70%)',opacity:.32,animation:'drift1 26s ease-in-out infinite'}}/>

    <header className="sticky top-0 z-[60] px-3 md:px-6 pt-3">
      <div className="glass-deep rounded-glass flex items-center gap-3 px-4 md:px-6 py-2.5 max-w-[1280px] mx-auto">
        <img src="assets/logo-om.webp" className="w-8 h-9 object-contain"/>
        <div className="leading-tight mr-1"><b className="font-disp text-[13px] tracking-[1px] block">ORGULLO MILLONARIO</b><small className="font-mono text-[7px] tracking-[2px] text-river2">FILIAL RIVER · CORRIENTES</small></div>
        <nav className="hidden md:flex items-center gap-1 flex-1 justify-center">
          {NAV.map(([id,ic,l])=><button key={id} onClick={()=>go(id)} className="press flex items-center gap-2 px-3.5 py-2 rounded-full text-[11px] font-semibold text-mut hover:text-ink hover:bg-white/[.07] transition-colors"><Ic n={ic} s={13}/>{l}</button>)}
        </nav>
        <div className="flex items-center gap-2 ml-auto">
          <button onClick={()=>{OMDB.set('config.tema',light?'dark':'light');toast(light?'Tema oscuro':'Tema claro');}} className="press w-9 h-9 rounded-full glass grid place-items-center text-gold2" title="Cambiar tema">{light?'☾':'☀'}</button>
          <button onClick={()=>go('cuenta')} className="press hidden sm:flex items-center gap-2 px-4 py-2 rounded-full text-[11px] font-bold text-white" style={{background:'linear-gradient(160deg,#ff2e3e,#8d0917)',boxShadow:'0 8px 24px -6px rgba(224,30,47,.6)'}}><Ic n="user" s={13}/>Mi Cuenta</button>
        </div>
      </div>
    </header>

    <main className="relative z-10 px-3 md:px-6 py-6 pb-28 md:pb-12 max-w-[1280px] mx-auto flex flex-col gap-14 md:gap-20">
      {sections.map((x,i)=>{const C=SECMAP[x.id];return <div key={x.id} id={'s-'+x.id} className="sec-reveal" style={{transitionDelay:(i%2?60:0)+'ms'}}><C/></div>;})}
      <footer className="text-center font-mono text-[9px] tracking-[1px] text-dim pt-4 flex flex-col gap-2">
        <div className="flex items-center justify-center gap-4"><span className="flex items-center gap-1.5"><i className="w-[6px] h-[6px] rounded-full bg-green-400"/>{db.kpis.socios} EN VIVO</span><span>👁 {db.kpis.visitas} VISITAS</span><span>HOY {db.kpis.visitas_hoy}</span></div>
        <div>© 2026 Orgullo Millonario · Filial River Corrientes · No afiliado a C.A. River Plate</div>
        <div>Creador: <a href="https://cambiosvirtuales.com" target="_blank" rel="noopener" className="text-river2 font-bold hover:text-river">Martínez Darío</a></div>
      </footer>
    </main>

    <button onClick={()=>window.scrollTo({top:0,behavior:'smooth'})} className={`press fixed bottom-20 md:bottom-6 right-4 z-[70] w-11 h-11 rounded-full glass-deep grid place-items-center text-river2 transition-all ${top?'opacity-100':'opacity-0 pointer-events-none'}`}><Ic n="up" s={18}/></button>

    <nav className="md:hidden fixed bottom-3 inset-x-3 z-[70] safe-b">
      <div className="glass-deep rounded-glass flex items-center justify-around px-1 py-2">
        {NAV.map(([id,ic,l])=><button key={id} onClick={()=>go(id)} className="press flex flex-col items-center gap-1 px-2.5 py-1.5 rounded-2xl text-mut hover:text-ink"><Ic n={ic} s={18}/><small className="font-mono text-[7px] tracking-[.5px]">{l}</small></button>)}
      </div>
    </nav>
  </>;
}

ReactDOM.createRoot(document.getElementById('root')).render(<ToastHost><App/></ToastHost>);
