/* =====================================================================
   PÚBLICO — landing y pantallas de autenticación.
   Es el ÚNICO lugar del proyecto con fondo oscuro, y vive en un archivo
   aparte a propósito: la app por dentro sigue clara y nada de acá tiene
   que poder filtrarse hacia ella. Por eso todo cuelga de .publico.
   No es una inconsistencia — es la separación entre la presentación
   pública y la herramienta de trabajo, que se usa en la cancha (bajo techo).
   Todos los colores salen de tokens.css.
   Mobile-first. Las versiones de escritorio viven en layout.css, que es el
   único lugar del proyecto con media queries de ancho.
   ===================================================================== */

.publico{
  min-height:100dvh;background:var(--pub-fondo);color:var(--sobre-oscuro);
  display:flex;flex-direction:column;
  position:relative;isolation:isolate;
}
/* El resplandor del color del club arriba de todo, detrás de la marca y del
   hero. Estático. Va en un pseudo-elemento y la intensidad en opacity porque
   el gradiente con color-mix() (--club mezclado con transparente) costó
   ~+450 ms de FCP y ~+900 ms de LCP en Lighthouse mobile; con var(--club) puro
   y opacity, que compone la GPU, el costo desaparece. */
.publico::before{
  content:"";position:absolute;inset:0 0 auto;height:28rem;z-index:-1;pointer-events:none;
  background:radial-gradient(ellipse 75% 100% at 50% 0,var(--club),transparent);
  opacity:.4;
}
.publico[hidden]{display:none}
.vista{display:none}
.vista.on{display:block}

/* ---- marca: escudo + nombre, arriba de todo ---- */
.marca{display:flex;align-items:center;justify-content:center;gap:var(--sp-3);padding:var(--sp-6) var(--sp-4) 0}
.marca img{width:2.75rem;height:2.75rem;flex:0 0 auto}
.marca .t{font-family:var(--ff-titulo);font-weight:700;font-size:var(--fs-230);letter-spacing:.04em;text-transform:uppercase;line-height:1}
.marca .s{font-size:var(--fs-100);color:var(--gris-osc);letter-spacing:.14em;text-transform:uppercase;margin-top:.1875rem}

/* ---- landing ---- */
.hero{padding:var(--sp-6) var(--sp-4) var(--sp-5);text-align:center}
.hero .club{font-family:var(--ff-titulo);font-size:var(--fs-125);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--gris-osc);margin-bottom:var(--sp-3)}

/* Escudo con el nombre del club girando alrededor. El SVG gira entero (su
   centro es el del escudo) y sólo anima transform. Es la única animación
   continua del proyecto (excepción en DESIGN.md): un observer le pone .quieto
   cuando sale de pantalla, y con prefers-reduced-motion base.css la apaga y el
   texto queda en su lugar, legible. */
.escudo-anillo{position:relative;width:9rem;height:9rem;margin:0 auto var(--sp-5)}
.escudo-anillo img{position:absolute;inset:26%;width:48%;height:48%;object-fit:contain}
.anillo{position:absolute;inset:0;width:100%;height:100%;animation:giro var(--dur-giro) linear infinite}
.anillo.quieto{animation-play-state:paused}
.anillo text{font-family:var(--ff-titulo);font-weight:600;letter-spacing:.04em;fill:var(--gris-osc)}
@keyframes giro{from{transform:rotate(-360deg)}}
.hero h1{font-size:clamp(1.75rem,1.35rem + 2vw,2.75rem);line-height:1.03;letter-spacing:.01em}
.hero h1 .r{color:var(--primario)}
.hero .bajada{color:var(--gris-osc);font-size:var(--fs-170);line-height:1.45;margin:var(--sp-4) auto 0;max-width:34rem}

.acciones-landing{display:flex;flex-direction:column;gap:var(--sp-3);padding:0 var(--sp-4) var(--sp-6);max-width:24rem;margin-inline:auto;width:100%}

.beneficios{display:grid;gap:var(--sp-3);padding:0 var(--sp-4) var(--sp-6)}
/* Cada beneficio lleva un filete del color del club a la izquierda: marca la
   jerarquía sin sumar fondo. NO entran animados: se probó un fade escalonado y
   subía el LCP de la landing ~+316 ms (+2.6 %) en Lighthouse mobile, porque un
   párrafo de estas tarjetas es el elemento más grande y no cuenta hasta que se
   ve. Sin la animación el LCP queda igual que antes. */
.ben{
  position:relative;background:var(--pub-tarjeta);border:1px solid var(--pub-borde);
  border-radius:var(--r);padding:var(--sp-4);
  transition:transform var(--dur-2) var(--ease-salida);
  animation:subir-ben var(--dur-3) var(--ease-salida) backwards;
}
/* Entran subiendo, pero SIN opacity: con opacity 0 el párrafo (que es el LCP)
   no contaba hasta verse y costaba ~+316 ms. Un translateY no oculta nada, así
   que se pinta desde el primer frame. Sólo escalonan las 6 de la landing. */
@keyframes subir-ben{from{transform:translateY(.75rem)}}
.ben:nth-child(2){animation-delay:60ms}
.ben:nth-child(3){animation-delay:120ms}
.ben:nth-child(4){animation-delay:180ms}
.ben:nth-child(5){animation-delay:240ms}
.ben:nth-child(6){animation-delay:300ms}
.ben::before{
  content:"";position:absolute;left:-1px;top:var(--sp-4);bottom:var(--sp-4);width:3px;
  background:var(--primario);border-radius:0 2px 2px 0;transform-origin:left;
  transition:transform var(--dur-2) var(--ease-salida);
}
/* Anillo y resplandor del club, que aparecen con opacity. */
.ben::after{
  content:"";position:absolute;inset:-1px;border-radius:inherit;pointer-events:none;
  box-shadow:var(--brillo-club);opacity:0;transition:opacity var(--dur-2) var(--ease-salida);
}

.ben .t{
  font-family:var(--ff-titulo);font-size:var(--fs-170);font-weight:600;
  text-transform:uppercase;letter-spacing:.04em;line-height:1.15;
  display:flex;align-items:baseline;gap:var(--sp-2);
}
.ben .t::before{
  content:"";width:.4375rem;height:.4375rem;background:var(--primario);flex:0 0 auto;
  transform:translateY(-.15em);transition:transform var(--dur-2) var(--ease-salida);
}
.ben .d{color:var(--gris-osc);font-size:var(--fs-135);line-height:1.5;margin-top:var(--sp-2)}

/* ---- demos de la landing ----
   Gráficos chicos con datos INVENTADOS, escritos en HTML/SVG y decorativos
   (aria-hidden): sólo muestran cómo se ve la función, no dicen nada real. Corren una sola vez: quedan pausadas,
   con fill-mode backwards (se ve el primer cuadro), hasta que landingAnimada.js
   le pone .en-vista a la tarjeta. Sólo se animan los gráficos: el texto de la
   tarjeta (.t y .d) se ve desde el primer cuadro porque es el LCP. */
.demo{margin-bottom:var(--sp-4);display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3)}
.ben:not(.en-vista) .demo *,.ben:not(.en-vista) .demo *::before{animation-play-state:paused}
@keyframes entra-demo{from{transform:translateY(.5rem);opacity:0}}
@keyframes aparece-demo{from{opacity:0}}
@keyframes destapa-demo{from{transform:translateX(0)}}

/* Planilla en miniatura con las columnas de la CABB. Una franja del color del
   club baja fila por fila (opacity, sin repintar) y cada fila "se convierte"
   en su chip de la derecha, con el mismo compás. */
.planilla{background:var(--pub-fondo);border:1px solid var(--pub-borde);border-radius:var(--r-s);overflow:hidden;font-family:var(--ff-mono);font-size:var(--fs-115);min-width:13.5rem}
.fila{position:relative;display:grid;grid-template-columns:2rem 1fr 2rem;gap:var(--sp-2);padding:var(--sp-1) var(--sp-2);color:var(--sobre-oscuro)}
.fila + .fila{border-top:1px solid var(--pub-borde)}
.fila span:first-child,.fila span:last-child,.fila b:first-child,.fila b:last-child{text-align:right}
.fila.cab{color:var(--gris-osc);background:var(--pub-tarjeta);font-weight:500}
.fila:not(.cab)::before{
  content:"";position:absolute;inset:0;background:var(--primario);opacity:0;pointer-events:none;
  animation:barre-fila var(--dur-3) var(--ease-salida);
}
.fila:nth-child(2)::before{animation-delay:150ms}
.fila:nth-child(3)::before{animation-delay:450ms}
.fila:nth-child(4)::before{animation-delay:750ms}
.fila:nth-child(5)::before{animation-delay:1050ms}
.fila:nth-child(6)::before{animation-delay:1350ms}
/* Sin fill backwards: en el retardo la fila está sin marcar (opacity 0) y no en el "from". */
@keyframes barre-fila{from{opacity:.4}}
.flecha{color:var(--gris-osc);font-size:var(--fs-190)}
.chips-j{display:flex;flex-wrap:wrap;gap:var(--sp-2);flex:1 1 12rem}
.chips-j span{
  font-family:var(--ff-mono);font-weight:500;font-size:var(--fs-115);color:var(--sobre-oscuro);
  background:var(--pub-fondo);border:1px solid var(--pub-borde);border-radius:var(--r-s);padding:var(--sp-1) var(--sp-2);
  animation:entra-demo var(--dur-3) var(--ease-salida) backwards;
}
.chips-j span:nth-child(1){animation-delay:300ms}
.chips-j span:nth-child(2){animation-delay:600ms}
.chips-j span:nth-child(3){animation-delay:900ms}
.chips-j span:nth-child(4){animation-delay:1200ms}
.chips-j span:nth-child(5){animation-delay:1500ms}
.chips-j span:nth-child(6){animation-delay:1800ms}
.chips-j .mas{color:var(--gris-osc)}

.demo-tiro svg{width:100%;max-width:22rem;height:auto;display:block}
.demo-tiro{gap:var(--sp-3) var(--sp-6)}
.curva-demo{fill:none;stroke:var(--primario);stroke-width:2.5;stroke-linejoin:round;stroke-linecap:round}
/* stroke-dashoffset repinta cada cuadro y está prohibido: la curva se "dibuja"
   corriendo un rectángulo del color de la tarjeta, que en reposo ya está afuera. */
.tapa{fill:var(--pub-tarjeta);transform:translateX(100%);animation:destapa-demo var(--dur-demo) var(--ease-salida) backwards}
.punto{fill:var(--primario);animation:aparece-demo var(--dur-3) var(--ease-salida) var(--dur-demo) backwards}
.cifra-tiro{fill:var(--sobre-oscuro);font-family:var(--ff-mono);font-weight:600;animation:aparece-demo var(--dur-3) var(--ease-salida) var(--dur-demo) backwards}

.demo-salto{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-3)}
.etq{font-family:var(--ff-titulo);font-weight:600;font-size:var(--fs-125);letter-spacing:.11em;text-transform:uppercase;color:var(--gris-osc)}
.cifra-salto{font-family:var(--ff-mono);font-weight:600;font-size:var(--fs-260);color:var(--sobre-oscuro);font-variant-numeric:tabular-nums}
.sube-osc{
  font-family:var(--ff-mono);font-weight:600;font-size:var(--fs-115);color:var(--sube-osc);
  background:var(--pub-fondo);border-radius:var(--r-s);padding:var(--sp-1) var(--sp-2);
  animation:aparece-demo var(--dur-3) var(--ease-salida) var(--dur-demo) backwards;
}

/* La pizarra de la landing es la misma que la de la app (cancha clara, fichas
   del club): sobre la tarjeta oscura queda como un recuadro de papel. La anima
   landingAnimada.js con la jugada de jugadaDemoLanding.js. */
.demo-jugadas{display:block}
.demo-jugadas svg.pz{max-width:24rem;margin-inline:auto}

/* Línea de tiempo: la línea se llena con scaleY desde arriba y los nodos se
   prenden en secuencia. El texto de cada temporada se ve siempre. */
.linea-t{list-style:none;margin:0;padding:0;position:relative;display:grid;gap:var(--sp-3);flex:1 1 100%}
.linea-t li{position:relative;padding-left:var(--sp-6);font-size:var(--fs-125);line-height:1.2rem;color:var(--sobre-oscuro)}
.linea-t::before{
  content:"";position:absolute;left:calc(.3125rem - 1px);top:.6rem;bottom:.6rem;width:2px;
  background:var(--primario);transform-origin:top;
  animation:llena-demo var(--dur-demo) var(--ease-salida) backwards;
}
.linea-t li::before{
  content:"";position:absolute;left:0;top:.3rem;width:.625rem;height:.625rem;border-radius:50%;background:var(--primario);
  animation:nodo-demo var(--dur-3) var(--ease-salida) backwards;
}
.linea-t li:nth-child(2)::before{animation-delay:300ms}
.linea-t li:nth-child(3)::before{animation-delay:600ms}
@keyframes llena-demo{from{transform:scaleY(0)}}
@keyframes nodo-demo{from{transform:scale(0);opacity:0}}

/* Lo único que se dice del futuro, y se dice separado de lo que ya anda. */
.futuro{
  color:var(--gris-osc);font-size:var(--fs-125);text-align:center;
  padding:0 var(--sp-4) var(--sp-8);max-width:34rem;margin-inline:auto;
  border-top:1px solid var(--pub-borde);padding-top:var(--sp-5);margin-top:var(--sp-2);
}

/* ---- Portal "Básquet Newell's" (public/portal.html) ----
   Ronda 2 (21/10): quien más la usa es un padre que viene a inscribir o a
   mandar un comprobante. Esas dos acciones son las protagonistas de la banda
   roja y negra de arriba (la camiseta); profes y jugadores tienen Semillero
   en el encabezado; el coordinador aparece una vez, al final de las preguntas
   frecuentes. Se alternan bandas a todo el ancho y tarjetas para que no se
   lea como un formulario. El LCP es la foto del hero (fetchpriority alto), no su
   texto: por eso el hero sí anima su entrada. Una columna en el celular; lo de compu vive en
   layout.css. Cada sección sin datos queda con [hidden] (lo pone src/ui/portal.js). */
/* Lo mismo que el <meta name="color-scheme"> de portal.html, por si el navegador
   mira el CSS: el portal ya es oscuro y el oscurecimiento automático (Samsung
   Internet, Chromium) no tiene que recolorearlo. Va sobre la raíz de ESTA página
   y no sobre .publico a secas, que también es el shell de la app. */
:root:has(.portal-d),.portal-d{color-scheme:dark}
.portal-d::before{height:22rem;background:radial-gradient(ellipse 90% 90% at 85% 0,var(--club),transparent);opacity:.38}
.portal{width:100%}
/* El hero va a todo el ancho; lo demás, en una columna centrada. El lugar de la barra fija lo deja el pie. */
.portal-cuerpo{max-width:64rem;margin-inline:auto}
.portal [hidden]{display:none}

/* Encabezado: flota sobre la foto del hero. Marca a la izquierda y, a la
   derecha, el botón de Semillero para profes y jugadores. La ayuda ya no
   está acá: se abre desde los atajos, el pie y los "¿Dudas?". */
.portal-barra{position:absolute;inset:0 0 auto;z-index:5;display:flex;align-items:center;gap:var(--sp-2);max-width:64rem;margin-inline:auto;width:100%;padding:var(--sp-3) var(--sp-4)}
.portal-barra img{width:2.25rem;height:2.25rem;flex:0 0 auto}
.portal-marca{min-width:0}
.portal-barra .t{font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.05em;font-size:var(--fs-190);line-height:1}
.portal-barra .t span{color:var(--primario)}
/* El subtítulo no entra junto al link en el celular: aparece desde 40rem (layout.css). */
.portal-barra .s{display:none;font-size:var(--fs-100);letter-spacing:.12em;text-transform:uppercase;color:var(--gris-osc);margin-top:.125rem}
.portal-barra-acc{margin-left:auto;display:flex;align-items:center;gap:var(--sp-1)}
.portal-barra-btn{
  display:inline-flex;align-items:center;justify-content:center;min-height:var(--tap);padding:0 var(--sp-3);
  font-size:var(--fs-135);font-weight:600;line-height:1.1;text-align:center;color:var(--sobre-oscuro);text-decoration:none;
  cursor:pointer;
}
/* "Semillero": un botón con borde e ícono (no un link subrayado), sobre un velo para que se lea encima de la foto. */
.portal-sem-btn{list-style:none;white-space:nowrap;gap:var(--sp-2);background:var(--velo-pub-medio);border:1px solid var(--gris-osc);border-radius:var(--r-btn)}
.portal-sem-btn::-webkit-details-marker{display:none}
.portal-sem-btn svg{width:1.125rem;height:1.125rem;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-sem[open] .portal-sem-btn{border-color:var(--primario)}
@media (hover:hover){.portal-sem-btn:hover{background:var(--toque-osc)}}
.portal-sem-panel{
  position:absolute;right:var(--sp-4);top:calc(100% - var(--sp-1));width:min(22rem,calc(100vw - 2rem));
  padding:var(--sp-4);background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);
}
.portal-sem-panel > b{display:block;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.04em;font-size:var(--fs-230)}
.portal-sem-panel p{color:var(--gris-osc);font-size:var(--fs-135);line-height:1.45;margin:var(--sp-1) 0 var(--sp-3)}
.portal-sem-panel .btn{text-decoration:none}
.portal-sem-inst{margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px solid var(--pub-borde)}
.portal-sem-inst small{display:block;font-size:var(--fs-100);letter-spacing:.12em;text-transform:uppercase;color:var(--gris-osc)}
.portal-sem-inst p{margin:var(--sp-2) 0 0;color:var(--sobre-oscuro)}

/* El hero: foto a pantalla completa, velos para que se lea el texto, corte
   diagonal abajo, título gigante y los dos botones. El título se achica con
   el ancho Y el alto de la pantalla (--fs-hero). El hero mide la pantalla
   menos la cinta, así la cinta queda pegada al borde de abajo de la primera
   pantalla, en el celu y en compu. Se reserva el lugar de la cinta aunque
   todavía no hayan llegado las fechas: si no, el hero se achicaría de golpe
   al aparecer. El texto va abajo, sobre el degradé; el padding de abajo deja
   lugar al corte diagonal. */
.portal-heroe{
  position:relative;isolation:isolate;overflow:hidden;color:var(--sobre-oscuro);
  display:flex;flex-direction:column;justify-content:flex-end;min-height:calc(100svh - var(--alto-cinta));
  padding:5rem var(--sp-4) 3.5rem;
  clip-path:polygon(0 0,100% 0,100% 100%,0 calc(100% - 2.5rem));
}
.portal-heroe-foto{position:absolute;inset:0;z-index:-2;display:block}
.portal-heroe-foto img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 30%}
.portal-heroe::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:
    linear-gradient(to top,var(--pub-fondo) 0,var(--velo-pub-fuerte) 28%,var(--velo-pub-cero) 72%),
    linear-gradient(to bottom,var(--velo-pub-fuerte) 0,var(--velo-pub-cero) 8rem);
}
/* Color real, un poco apagado: el piso azul de la cancha no domina. */
.portal-heroe-foto img{filter:saturate(.75)}

.portal-heroe-cuerpo{position:relative;width:100%;max-width:64rem;margin-inline:auto}
.portal-heroe-ey{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-2);font-family:var(--ff-titulo);font-weight:600;letter-spacing:.2em;text-transform:uppercase;font-size:var(--fs-145)}
.portal-heroe-ey span:first-child{flex:0 0 2rem;height:.125rem;background:var(--primario)}
.portal-titulo{position:relative}
.portal-heroe h1{font-size:var(--fs-hero);line-height:.82;letter-spacing:-.01em}
/* Cada línea sube desde su propia máscara (la entrada, más abajo). */
.portal-heroe .linea{display:block;overflow:hidden;padding-bottom:.06em}
.portal-heroe .linea > span{display:block}
/* El rojo del club sobre el negro llega a 3.8:1: alcanza para texto de este tamaño, no para uno chico. */
.portal-heroe .linea.rojo{color:var(--primario)}
.portal-heroe-bajada{max-width:30rem;margin:var(--sp-3) 0 var(--sp-4);font-size:var(--fs-170);line-height:1.4}
/* La bajada vive dentro del h1 (para el SEO) pero se ve como un párrafo, no como título. */
.portal-heroe h1 .portal-heroe-bajada{display:block;font-family:var(--ff-cuerpo);font-weight:400;text-transform:none;letter-spacing:normal}

.portal-acciones{display:grid;gap:var(--sp-2)}
/* Cada botón es la tarjeta entera: ícono, título, una línea y la flecha (o "Pronto"). */
.portal-accion{
  display:grid;grid-template-columns:2.5rem 1fr auto;align-items:center;gap:var(--sp-3);width:100%;min-height:3.5rem;padding:var(--sp-2) var(--sp-3);
  border:0;border-radius:var(--r-btn);text-decoration:none;font:inherit;text-align:left;cursor:pointer;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-accion:not(.apagada):active{transform:scale(.97)}
.portal-accion i{display:grid;place-items:center;width:2.5rem;height:2.5rem;border-radius:50%}
.portal-accion svg{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-accion b{display:block;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.04em;font-size:var(--fs-200);line-height:1}
.portal-accion small{display:block;font-size:var(--fs-135);line-height:1.3;margin-top:.1875rem}
.portal-accion em{font-style:normal;font-size:var(--fs-190)}
.portal-accion.principal{background:var(--primario);color:var(--sobre-club)}
.portal-accion.principal i{background:var(--presion-osc)}
.portal-accion.pago{background:var(--papel);color:var(--tinta)}
.portal-accion.pago i{background:var(--primario);color:var(--sobre-club)}
.portal-accion.pago small{color:var(--gris)}
/* Sin formulario activo (o todavía sin respuesta): oscura y maciza, con el ícono gris y, si corresponde, "Pronto". */
.portal-accion.apagada{background:var(--pub-tarjeta);color:var(--sobre-oscuro);border:1px solid var(--pub-borde);cursor:default}
.portal-accion.apagada i{background:var(--pub-fondo);color:var(--gris-osc)}
.portal-accion.apagada small{color:var(--gris-osc)}
.portal-accion.apagada em{font-family:var(--ff-titulo);font-weight:700;font-size:var(--fs-100);letter-spacing:.08em;text-transform:uppercase;color:var(--gris-osc);border:1px solid var(--pub-borde);border-radius:var(--r-btn);padding:.125rem var(--sp-2)}

/* El sticker de sponsor: un círculo dorado (el rojo es del botón del hero) con
   el pedido en un anillo que gira despacio y "Sumate" fijo al centro. Es el
   único elemento del portal que gira (con el anillo del escudo de la landing,
   del que reusa el keyframe y la duración): un observer le pone .quieto cuando
   el hero sale de pantalla y, con prefers-reduced-motion, base.css lo apaga y
   el texto queda legible. En el celu va dentro de .portal-titulo, arriba a la
   derecha, al lado de "ACÁ SE" y "FORMA": esas dos líneas miden ~2.7em y --fs-hero
   no pasa de 23vw, así que dejan libre más de un tercio del ancho; "LA LEPRA",
   que es más ancha, queda debajo del sticker. Así no le roba alto al título. En
   compu, abajo a la derecha de la foto (layout.css). */
.portal-sponsor{
  position:absolute;top:0;right:0;z-index:1;display:grid;place-items:center;width:5rem;height:5rem;
  border-radius:50%;background:var(--dorado);color:var(--pub-fondo);text-decoration:none;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-sponsor:active{transform:scale(.94)}
@media (hover:hover){.portal-sponsor:hover{transform:scale(1.06)}}
.portal-sponsor-anillo{position:absolute;inset:0;width:100%;height:100%;animation:giro var(--dur-giro) linear infinite}
.portal-sponsor-anillo.quieto{animation-play-state:paused}
.portal-sponsor-anillo text{font-family:var(--ff-titulo);font-weight:700;letter-spacing:.04em;fill:currentColor}
.portal-sponsor-centro{position:relative;font-family:var(--ff-titulo);font-weight:700;letter-spacing:.04em;text-transform:uppercase;font-size:var(--fs-170);line-height:1}

/* Entrada del hero, una sola vez al cargar: cada elemento sube escalonado
   (--i lo pone el HTML) y cada línea del título sube desde su máscara. Sólo
   con .js-anim: sin JS o con movimiento reducido, todo está ya en su lugar. */
.js-anim .entra{animation:subir var(--dur-rise) var(--ease-salida) backwards;animation-delay:calc(var(--retardo-entrada) + var(--i) * var(--paso-entrada))}
.js-anim .portal-heroe .linea > span{animation:subir-linea var(--dur-linea) var(--ease-salida) backwards;animation-delay:calc(var(--retardo-entrada) + var(--i) * var(--paso-entrada))}
@keyframes subir{from{opacity:0;transform:translateY(1.5rem)}}
@keyframes subir-linea{from{transform:translateY(105%)}}

/* Parallax suave de la foto: baja hasta un 18% mientras se scrollea el hero.
   Va con la línea de tiempo del scroll donde el navegador la tiene; en los
   demás (Safari anterior al 26) lo hace animaciones.js. El estado de
   reposo es el FINAL; el keyframe define sólo el de partida. */
@supports (animation-timeline:scroll()){
  .js-anim .portal-heroe-foto{transform:translateY(18%) scale(1.1);animation:parallax-hero linear both;animation-timeline:scroll(root);animation-range:0 100svh}
}
@keyframes parallax-hero{from{transform:translateY(0) scale(1.1)}}

/* Botón de una tarjeta sin formulario activo: visible pero claramente apagado
   (borde punteado y sin relleno), con el texto en una línea o dos legibles. */
.portal .btn:disabled{
  background:transparent;color:var(--gris-osc);border:1px dashed var(--gris-osc);
  font-size:var(--fs-135);letter-spacing:.06em;line-height:1.25;text-align:center;cursor:not-allowed;
}

/* Recaudación: una franja a todo el ancho en negro tibio, con filete y
   detalles dorados y un cuadrado girado de adorno (como en la propuesta de
   v0). Sin foto y con el botón dorado: el rojo queda para el hero (un solo
   bloque rojo por pantalla). */
.portal-rec{position:relative;overflow:hidden;margin-top:var(--sp-8);background:var(--pub-oro-fondo);border-block:1px solid var(--dorado-borde);scroll-margin-top:var(--sp-4)}
.portal-rec::before{content:"";position:absolute;top:-6rem;right:-6rem;width:18rem;height:18rem;border:1.75rem solid var(--dorado-suave);transform:rotate(45deg)}
.portal-rec-cuerpo{position:relative;max-width:64rem;margin-inline:auto;padding:var(--sp-8) var(--sp-4);display:grid;gap:var(--sp-6)}
.portal-rec .portal-st{color:var(--dorado)}
.portal-rec h2{font-size:clamp(2.25rem,1.5rem + 3.2vw,3.75rem);line-height:.92;margin:0 0 var(--sp-3);text-wrap:balance}
.portal-rec p{margin:0;color:var(--gris-osc);font-size:var(--fs-170);line-height:1.5;max-width:30rem}
.portal-rec-ej{list-style:none;margin:var(--sp-5) 0 0;padding:0;display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.portal-rec-ej li{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-4) var(--sp-2) var(--sp-3);border-radius:var(--r-full);background:var(--dorado-suave);font-size:var(--fs-160);font-weight:600}
.portal-rec-ej i{display:grid;color:var(--dorado)}
.portal-rec-ej svg{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-rec-btn{
  display:flex;align-items:center;justify-content:center;gap:var(--sp-2);width:100%;min-height:3.5rem;padding:0 var(--sp-5);
  background:var(--dorado);color:var(--pub-fondo);text-decoration:none;border:0;border-radius:var(--r-btn);
  font-family:var(--ff-titulo);font-weight:700;letter-spacing:.06em;text-transform:uppercase;font-size:var(--fs-230);
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-rec-btn:active{transform:scale(.97)}
.portal-rec-btn:disabled{background:transparent;color:var(--sobre-oscuro);border:1px dashed var(--dorado);font-size:var(--fs-145);letter-spacing:.04em;cursor:not-allowed;transform:none}

/* "Sumate al básquet de Newell's": las dos formas de colaborar y un botón y,
   al lado (abajo en el celular), el afiche de sponsors del club. Sin fotos de
   fondo: el afiche ya es la imagen de la sección. */
.portal-colaborar .portal-st{color:var(--dorado)}
.portal-colaborar h2{font-size:clamp(2rem,1.6rem + 2vw,2.75rem);line-height:.95;margin-bottom:var(--sp-4)}
.portal-colaborar-cuerpo{display:grid;gap:var(--sp-6)}
.portal-afiche{display:block;justify-self:center;width:min(100%,18rem);height:auto;border:1px solid var(--pub-borde);border-radius:var(--r)}
.portal-formas{list-style:none;margin:0 0 var(--sp-4);padding:0;display:grid;gap:var(--sp-3)}
.portal-formas li{display:grid;grid-template-columns:2.75rem 1fr;gap:var(--sp-3);align-items:start;padding:var(--sp-4);background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);color:var(--sobre-oscuro);font-size:var(--fs-145);line-height:1.45}
.portal-formas i{display:grid;place-items:center;width:2.75rem;height:2.75rem;border-radius:50%;background:var(--pub-fondo);color:var(--primario)}
.portal-formas svg{width:1.375rem;height:1.375rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-formas b{display:block;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.03em;font-size:var(--fs-200);line-height:1.1;color:var(--sobre-oscuro);margin-bottom:var(--sp-1)}
.portal-colaborar .btn{text-decoration:none}

/* La hoja de Ayuda (<dialog>): en el celular sube desde abajo y ocupa el
   ancho; en compu es un diálogo centrado (layout.css). El fondo de afuera es
   el propio <dialog>: tocarlo la cierra. */
.portal-hoja{
  position:fixed;inset:auto 0 0 0;margin:0;width:100%;max-width:100%;max-height:88dvh;padding:0;
  border:0;border-radius:var(--r) var(--r) 0 0;background:var(--pub-fondo);color:var(--sobre-oscuro);
  overflow:hidden;animation:subir-hoja var(--dur-3) var(--ease-salida);
}
.portal-hoja::backdrop{background:var(--velo)}
/* El foco va a la X y a las preguntas, que lo muestran; el contorno del diálogo entero sobra. */
.portal-hoja:focus-visible{outline:none}
.portal-hoja-cuerpo{max-height:88dvh;overflow-y:auto;overscroll-behavior:contain;padding:var(--sp-4) var(--sp-4) calc(var(--sp-6) + env(safe-area-inset-bottom))}
.portal-hoja-cab{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-3);margin-bottom:var(--sp-3)}
.portal-hoja-cab h2{font-size:var(--fs-260);line-height:1.05}
.portal-hoja-x{
  flex:0 0 auto;width:var(--tap);height:var(--tap);display:grid;place-items:center;font:inherit;font-size:var(--fs-260);line-height:1;
  color:var(--sobre-oscuro);background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:50%;cursor:pointer;
}
@keyframes subir-hoja{from{transform:translateY(100%)}}

/* Preguntas frecuentes en acordeón: tocás la pregunta y se abre la respuesta. */
.portal-faqs{border:1px solid var(--pub-borde);border-radius:var(--r);overflow:hidden;background:var(--pub-tarjeta)}
.portal-faq + .portal-faq{border-top:1px solid var(--pub-borde)}
.portal-faq summary{
  display:flex;justify-content:space-between;align-items:center;gap:var(--sp-3);min-height:3.5rem;padding:var(--sp-3) var(--sp-4);
  list-style:none;cursor:pointer;font-weight:600;font-size:var(--fs-145);line-height:1.3;
}
.portal-faq summary::-webkit-details-marker{display:none}
.portal-faq summary::after{content:"+";flex:0 0 auto;font-size:var(--fs-230);font-weight:400;color:var(--primario);transition:transform var(--dur-2) var(--ease-salida)}
.portal-faq[open] summary::after{transform:rotate(45deg)}
.portal-faq-r{padding:0 var(--sp-4) var(--sp-4);color:var(--gris-osc);font-size:var(--fs-145);line-height:1.55}
.portal-faq-r p{margin:0}
.portal-faq-r p + p,.portal-faq-r ol + p{margin-top:var(--sp-2)}
.portal-faq-pasos{margin:var(--sp-2) 0 0;padding-left:var(--sp-5);display:grid;gap:var(--sp-1)}
.portal-faq-r b{color:var(--sobre-oscuro);font-weight:600}
.portal-faq-r a{color:var(--sobre-oscuro);font-weight:600}
.portal-faq-r .btn{display:inline-flex;width:auto;margin-top:var(--sp-3);min-height:var(--tap);padding:0 var(--sp-4);font-size:var(--fs-145);text-decoration:none}
.portal-faq-fin{display:grid;gap:var(--sp-1);padding:var(--sp-5) var(--sp-4);border-top:1px solid var(--pub-borde);background:var(--pub-fondo)}
.portal-faq-fin b{font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.03em;font-size:var(--fs-230)}
.portal-faq-fin span{color:var(--gris-osc);font-size:var(--fs-145);margin-bottom:var(--sp-3)}
.portal-faq-fin .btn{text-decoration:none}

.portal-alias{
  display:flex;justify-content:space-between;align-items:center;gap:var(--sp-3);
  border:1px dashed var(--pub-borde);border-radius:var(--r-s);padding:var(--sp-2) var(--sp-3);margin-top:var(--sp-3);
}
.portal-alias small{display:block;font-size:var(--fs-100);color:var(--gris-osc);text-transform:uppercase;letter-spacing:.1em}
.portal-alias b{display:block;font-family:var(--ff-mono);font-size:var(--fs-145);font-weight:600;word-break:break-all}
.portal-alias span{display:block;font-size:var(--fs-115);color:var(--gris-osc)}
.portal-copiar{
  flex:0 0 auto;min-height:var(--tap);padding:0 var(--sp-3);font:inherit;font-size:var(--fs-125);font-weight:600;
  color:var(--sobre-oscuro);background:transparent;border:1px solid var(--pub-borde);border-radius:var(--r-s);cursor:pointer;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-copiar:active{transform:scale(.96)}

/* La hoja "Pagar": el alias grande, el botón de comprobante abajo. */
.portal-hoja .portal-alias{margin:var(--sp-4) 0;padding:var(--sp-4);border-color:var(--gris-osc)}
.portal-hoja .portal-alias b{font-size:var(--fs-230)}
.portal-hoja .intro{margin:0;color:var(--gris-osc);font-size:var(--fs-145);line-height:1.5}
.portal-pago-paso{margin:0 0 var(--sp-3);color:var(--gris-osc);font-size:var(--fs-145)}
.portal-pago-nada{margin:0;color:var(--gris-osc);font-style:italic;font-size:var(--fs-145)}
.portal-hoja-cuerpo .btn{text-decoration:none}

/* Atajos: sólo a lo que existe en la página (src/ui/portal.js). */
.portal-atajos{display:grid;grid-template-columns:repeat(auto-fit,minmax(4.5rem,1fr));gap:var(--sp-2);padding:var(--sp-5) var(--sp-4) 0}
.portal-atajos:empty{display:none}
.portal-atajos a{
  display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);min-height:var(--tap);
  background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);
  padding:var(--sp-3) var(--sp-1);text-align:center;text-decoration:none;color:var(--sobre-oscuro);
  font-size:var(--fs-115);font-weight:600;line-height:1.2;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-atajos a:active{transform:scale(.96)}
.portal-atajos i{display:grid;place-items:center;width:2.25rem;height:2.25rem;flex:0 0 auto;border-radius:50%;background:var(--pub-fondo);color:var(--primario)}
.portal-atajos svg{width:1.125rem;height:1.125rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

.portal-sec{padding:var(--sp-8) var(--sp-4) 0;scroll-margin-top:var(--sp-4)}
.portal-st{font-family:var(--ff-titulo);font-weight:600;letter-spacing:.16em;text-transform:uppercase;font-size:var(--fs-115);color:var(--club-texto);margin-bottom:var(--sp-1)}
/* Títulos de sección grandes y apretados, como en la propuesta de v0. */
.portal-sec h2{font-size:clamp(2.25rem,1.5rem + 3.2vw,3.75rem);line-height:.92;letter-spacing:.01em;margin-bottom:var(--sp-3);text-wrap:balance}
.portal-sec .intro{color:var(--gris-osc);font-size:var(--fs-145);line-height:1.5;margin-bottom:var(--sp-4)}
.portal-sec .portal-nota{color:var(--gris-osc);font-size:var(--fs-135);line-height:1.55;margin-top:var(--sp-4)}
.portal-sec .portal-nota b{color:var(--sobre-oscuro);font-weight:600}
.portal-sec > .btn{text-decoration:none}
/* Pie: franja con el borde de arriba rasgado y lugar abajo para la barra fija. */
.portal-pie{margin-top:var(--sp-8)}
.portal-rasgado{height:1.5rem;background:var(--pub-tarjeta);clip-path:polygon(0 55%,4% 30%,8% 70%,12% 40%,16% 75%,20% 35%,24% 60%,28% 25%,32% 70%,36% 45%,40% 80%,44% 30%,48% 65%,52% 40%,56% 75%,60% 28%,64% 62%,68% 38%,72% 78%,76% 32%,80% 68%,84% 42%,88% 72%,92% 30%,96% 64%,100% 45%,100% 100%,0 100%)}
.portal-pie .pie-legal{margin:0;display:grid;justify-items:center;gap:var(--sp-3);padding:var(--sp-4) var(--sp-4) calc(5.5rem + env(safe-area-inset-bottom));background:var(--pub-tarjeta)}
.pie-marca{display:flex;align-items:center;gap:var(--sp-3);text-align:left}
.pie-marca img{width:2.5rem;height:2.5rem;flex:0 0 auto}
.pie-marca b{display:block;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.05em;font-size:var(--fs-190);line-height:1;color:var(--sobre-oscuro)}
.pie-marca small{display:block;margin-top:.1875rem;font-size:var(--fs-100);letter-spacing:.12em;text-transform:uppercase;color:var(--gris-osc)}
.pie-links{margin:0;display:flex;flex-wrap:wrap;justify-content:center;gap:0 var(--sp-4)}
.pie-firma{margin:0;color:var(--gris-osc);font-size:var(--fs-125)}
.pie-firma b{color:var(--sobre-oscuro);font-weight:600}
.pie-firma .pie-firma-link{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:var(--tap);color:var(--sobre-oscuro);font-weight:600}
.portal-aviso{color:var(--gris-osc);font-style:italic;font-size:var(--fs-135);margin:0 0 var(--sp-3)}

.portal-lista{display:grid;gap:var(--sp-3)}
.portal-tarjeta{background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);padding:var(--sp-4);min-width:0}
.portal-tarjeta .t{font-family:var(--ff-titulo);font-size:var(--fs-170);font-weight:600;text-transform:uppercase;letter-spacing:.04em;line-height:1.15}
.portal-tarjeta .d{color:var(--gris-osc);font-size:var(--fs-135);line-height:1.55;margin:var(--sp-2) 0 var(--sp-4)}
.portal-tarjeta .btn{text-decoration:none}
.portal-logos:not(:empty){margin-top:var(--sp-5)}
.portal-logos-lista{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3)}
.portal-logos-lista li{display:flex;align-items:center;justify-content:center;min-height:var(--tap);background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);padding:var(--sp-3)}
.portal-logos-lista a{display:flex;align-items:center;justify-content:center;min-height:var(--tap);width:100%}
.portal-logos-lista img{display:block;max-width:100%;max-height:4rem;width:auto;height:auto;object-fit:contain}

/* "Lo que viene": el próximo evento en grande, como en la propuesta de v0. La
   foto es la del TIPO de evento (no hay una de cada uno), en el mismo duotono
   de las categorías, con la fecha en el color del tipo abajo a la izquierda.
   En el celular, la foto arriba y los datos abajo; en compu, lado a lado
   (layout.css). */
.portal-prox{display:grid;background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);overflow:hidden}
.portal-prox-foto{position:relative;isolation:isolate;aspect-ratio:3 / 2;overflow:hidden;background:var(--pub-fondo)}
.portal-prox-foto img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;object-fit:cover;filter:grayscale(1) contrast(1.25)}
.portal-prox-foto::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--club);mix-blend-mode:multiply;opacity:.35}
.portal-prox-foto::after{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(to top,var(--velo-pub-medio) 0,var(--velo-pub-cero) 55%)}
.portal-prox-fecha{
  position:absolute;left:var(--sp-4);bottom:var(--sp-4);display:grid;justify-items:center;gap:.125rem;min-width:5rem;
  padding:var(--sp-3);border-radius:var(--r-s);background:var(--sobre-oscuro);color:var(--pub-fondo);text-align:center;
}
.portal-prox-fecha small{display:block;font-family:var(--ff-titulo);font-weight:700;letter-spacing:.14em;text-transform:uppercase;font-size:var(--fs-170);line-height:1}
.portal-prox-fecha b{display:block;font-family:var(--ff-titulo);font-weight:700;font-size:3.5rem;line-height:.9}
.portal-prox-cuerpo{min-width:0;display:grid;align-content:center;gap:var(--sp-2);padding:var(--sp-5) var(--sp-4)}
.portal-prox-cuerpo > p{margin:0}
.portal-prox-cab{display:flex;align-items:center;gap:var(--sp-1)}
.portal-prox-tipo{font-size:var(--fs-125);font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--gris-osc)}
.portal-prox-cab b{margin-left:var(--sp-2);padding:.125rem var(--sp-3);border-radius:var(--r-full);background:var(--sobre-oscuro);color:var(--pub-fondo);font-family:var(--ff-titulo);font-weight:700;letter-spacing:.08em;text-transform:uppercase;font-size:var(--fs-135)}
.portal-prox-t{margin:0;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;font-size:clamp(2rem,1.5rem + 2.5vw,3rem);line-height:.95;overflow-wrap:anywhere;text-wrap:balance}
.portal-prox-h{color:var(--sobre-oscuro);font-size:var(--fs-170)}
.portal-prox-lugar{display:flex;align-items:center;gap:var(--sp-2);color:var(--gris-osc);font-size:var(--fs-160)}
.portal-prox-lugar i{display:grid}
.portal-prox-lugar svg{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* "Agendar": dos botones de verdad (48 px), no dos links chicos. */
.portal-prox .portal-ev-agregar{gap:var(--sp-2);margin-top:var(--sp-3)}
.portal-prox .portal-ev-agregar > span{font-size:var(--fs-135);width:100%}
.portal-prox .portal-ev-agregar a,.portal-prox .portal-ev-agregar button{
  min-height:3rem;padding:0 var(--sp-4);border:1px solid var(--gris-osc);border-radius:var(--r-btn);text-decoration:none;
  font-family:var(--ff-titulo);font-weight:700;letter-spacing:.06em;text-transform:uppercase;font-size:var(--fs-170);
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-prox .portal-ev-agregar a:active,.portal-prox .portal-ev-agregar button:active{transform:scale(.97)}
.portal-prox.tipo-partido .portal-prox-fecha{background:var(--agenda-partido);color:var(--sobre-club)}
.portal-prox.tipo-evento .portal-prox-fecha{background:var(--agenda-evento)}
.portal-prox.tipo-charla .portal-prox-fecha{background:var(--agenda-charla)}
.portal-prox.tipo-entrenamiento .portal-prox-fecha{background:var(--agenda-entrenamiento)}

/* El ícono del tipo (junto al texto del tipo): el tipo no se dice sólo con el color. */
.portal-tipo-ico{display:inline-grid;vertical-align:middle;margin-right:var(--sp-1)}
.portal-tipo-ico svg{width:1rem;height:1rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.tipo-partido .portal-tipo-ico{color:var(--agenda-partido)}
.tipo-evento .portal-tipo-ico{color:var(--agenda-evento)}
.tipo-charla .portal-tipo-ico{color:var(--agenda-charla)}
.tipo-entrenamiento .portal-tipo-ico{color:var(--agenda-entrenamiento)}
/* Sobre el talón de color el ícono del tipo no se pinta con el mismo color. */
.portal-prox .portal-tipo-ico{color:var(--gris-osc)}

/* ---- cinta de las próximas fechas ----
   Una banda recta, sólo con fechas. La pista tiene dos copias de la fila y corre la
   mitad: al terminar, vuelve a arrancar sin salto. Con .js-anim (o sea, sin
   movimiento reducido) corre siempre, aunque haya una sola fecha (portal.js repite
   la lista hasta llenar el ancho); sin él queda quieta y se desliza a mano, y ahí
   no se muestran las repeticiones. Se pausa con el mouse y con el botón. */
.portal-cinta{position:relative;overflow:hidden;box-sizing:border-box;height:var(--alto-cinta);display:flex;flex-direction:column;justify-content:center}
.portal-cinta-banda{border-block:1px solid var(--pub-borde);background:var(--pub-tarjeta);overflow:hidden}
html:not(.js-anim) .portal-cinta-banda{overflow-x:auto}
.portal-cinta-pista{display:flex;width:max-content;padding-inline:2rem}
.portal-cinta-fila{display:flex;align-items:center;list-style:none;margin:0;padding:0}
html:not(.js-anim) .portal-cinta-fila[aria-hidden],html:not(.js-anim) .portal-cinta-fila li[aria-hidden]{display:none}
.portal-cinta-fila li{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) 0 var(--sp-3) var(--sp-6);white-space:nowrap}
.portal-cinta-fila li > i{display:grid}
.portal-cinta-fila svg{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-cinta-fila b{font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.04em;font-size:var(--fs-230);line-height:1}
.portal-cinta-fila span{font-family:var(--ff-titulo);font-weight:600;text-transform:uppercase;letter-spacing:.04em;font-size:var(--fs-230);line-height:1}
.portal-cinta-fila em{width:.375rem;height:.375rem;margin-left:var(--sp-3);background:var(--gris-osc);transform:rotate(45deg)}
.portal-cinta-fila .tipo-partido > i,.portal-cinta-fila .tipo-partido b{color:var(--agenda-partido)}
.portal-cinta-fila .tipo-evento > i,.portal-cinta-fila .tipo-evento b{color:var(--agenda-evento)}
.portal-cinta-fila .tipo-charla > i,.portal-cinta-fila .tipo-charla b{color:var(--agenda-charla)}
.portal-cinta-fila .tipo-entrenamiento > i,.portal-cinta-fila .tipo-entrenamiento b{color:var(--agenda-entrenamiento)}
.js-anim .portal-cinta-pista.anda{transform:translateX(-50%);animation:marcha var(--dur-cinta) linear infinite}
@keyframes marcha{from{transform:translateX(0)}}
.portal-cinta.pausada .portal-cinta-pista{animation-play-state:paused}
@media (hover:hover){.portal-cinta:hover .portal-cinta-pista{animation-play-state:paused}}
.portal-cinta-pausa{
  position:absolute;right:var(--sp-3);top:calc((var(--alto-cinta) - var(--tap)) / 2);z-index:2;display:grid;place-items:center;width:var(--tap);height:var(--tap);
  color:var(--sobre-oscuro);background:var(--pub-fondo);border:1px solid var(--pub-borde);border-radius:50%;cursor:pointer;
}
.portal-cinta-pausa svg{width:1.125rem;height:1.125rem;fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round}
.portal-cinta-pausa .r{display:none;fill:currentColor;stroke-linejoin:round}
.portal-cinta-pausa[aria-pressed="true"] .p{display:none}
.portal-cinta-pausa[aria-pressed="true"] .r{display:block}
html:not(.js-anim) .portal-cinta-pausa{display:none}

/* ---- calendario del mes ---- */
/* El color de cada tipo pinta el puntito del día, el cuadradito de la leyenda y el filete del evento. */
.portal-puntos i.tipo-partido,.portal-prox.tipo-partido .portal-prox-tipo::before,.portal-ley li.tipo-partido::before,.portal-ev.tipo-partido::before{background:var(--agenda-partido)}
.portal-puntos i.tipo-evento,.portal-prox.tipo-evento .portal-prox-tipo::before,.portal-ley li.tipo-evento::before,.portal-ev.tipo-evento::before{background:var(--agenda-evento)}
.portal-puntos i.tipo-charla,.portal-prox.tipo-charla .portal-prox-tipo::before,.portal-ley li.tipo-charla::before,.portal-ev.tipo-charla::before{background:var(--agenda-charla)}
.portal-puntos i.tipo-entrenamiento,.portal-prox.tipo-entrenamiento .portal-prox-tipo::before,.portal-ley li.tipo-entrenamiento::before,.portal-ev.tipo-entrenamiento::before{background:var(--agenda-entrenamiento)}
/* El tipo no se dice sólo con el color: cada uno tiene su forma (partido, círculo;
   evento, rombo; charla, cuadrado; entrenamiento, triángulo), en el mes y en la leyenda. */
.portal-ley li.tipo-partido::before{border-radius:50%}
.portal-puntos i.tipo-evento,.portal-ley li.tipo-evento::before{transform:rotate(45deg);border-radius:1px}
.portal-puntos i.tipo-charla,.portal-ley li.tipo-charla::before{border-radius:1px}
.portal-puntos i.tipo-entrenamiento,.portal-ley li.tipo-entrenamiento::before{border-radius:0;clip-path:polygon(50% 0,100% 100%,0 100%)}
.portal-cal{background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r);overflow:hidden;min-width:0}
.portal-cal.cargando .portal-grilla{opacity:.55}
.portal-cal-cab{display:flex;justify-content:space-between;align-items:center;padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--pub-borde)}
.portal-cal-cab b{font-family:var(--ff-titulo);font-size:var(--fs-220);text-transform:uppercase;letter-spacing:.04em}
.portal-cal-cab span{display:flex;gap:var(--sp-2)}
.portal-cal-nav{
  width:var(--tap);height:var(--tap);display:grid;place-items:center;font:inherit;font-size:var(--fs-200);
  color:var(--sobre-oscuro);background:transparent;border:1px solid var(--pub-borde);border-radius:var(--r-s);cursor:pointer;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-cal-nav:active{transform:scale(.94)}
.portal-ley{list-style:none;margin:0;display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);padding:var(--sp-3) var(--sp-4) 0;font-size:var(--fs-115);color:var(--gris-osc)}
.portal-ley li{display:flex;align-items:center;gap:var(--sp-1)}
.portal-ley li::before{content:"";width:.625rem;height:.625rem}
.portal-grilla{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:2px 0;padding:var(--sp-2) var(--sp-1) var(--sp-3);transition:opacity var(--dur-2) var(--ease-salida)}
.portal-dn{font-size:var(--fs-100);font-weight:600;color:var(--gris-osc);text-align:center;padding:var(--sp-2) 0}
.portal-dia{
  position:relative;min-height:var(--tap);display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:.1875rem;
  padding:var(--sp-1) 0 0;font-family:var(--ff-mono);font-size:var(--fs-135);color:var(--sobre-oscuro);
  background:transparent;border:1px solid transparent;border-radius:var(--r-s);cursor:pointer;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-dia:active{transform:scale(.92)}
.portal-dia.fuera{color:var(--gris-osc);opacity:.5}
.portal-dia.hoy{border-color:var(--sobre-oscuro)}
.portal-dia.elegido{background:var(--primario);border-color:var(--primario);color:var(--sobre-club)}
.portal-puntos{display:flex;gap:2px}
.portal-puntos i{width:.5rem;height:.5rem;border-radius:50%}
/* Sobre el rojo del día elegido, un punto rojo de partido no se ve: se le pone aro. */
.portal-dia.elegido .portal-puntos i{box-shadow:0 0 0 1px var(--sobre-club)}
.portal-cal-dia{border-top:1px solid var(--pub-borde);padding:var(--sp-3) var(--sp-4) var(--sp-4)}
.portal-cal-t{font-family:var(--ff-titulo);font-weight:600;letter-spacing:.1em;text-transform:uppercase;font-size:var(--fs-125);color:var(--gris-osc);margin:var(--sp-1) 0 var(--sp-2)}
.portal-cal-nada{color:var(--gris-osc);font-size:var(--fs-135);margin:0 0 var(--sp-3)}
.portal-evs{list-style:none;margin:0 0 var(--sp-3);padding:0;display:grid;gap:var(--sp-3)}
.portal-ev{position:relative;padding-left:var(--sp-4)}
.portal-ev::before{content:"";position:absolute;left:0;top:.125rem;bottom:.125rem;width:4px;border-radius:2px}
.portal-ev small{display:flex;align-items:center;font-size:var(--fs-125);font-weight:600;color:var(--gris-osc);letter-spacing:.04em}
.portal-ev b{display:block;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;font-size:var(--fs-190);letter-spacing:.02em;line-height:1.1;margin:.125rem 0}
.portal-ev span{display:block;font-size:var(--fs-125);color:var(--gris-osc)}
/* "Agregar a mi calendario": dos botones chicos pero de 44 px de alto para el pulgar. */
.portal-ev-agregar{display:flex;flex-wrap:wrap;align-items:center;gap:0 var(--sp-2);margin-top:var(--sp-1);font-size:var(--fs-115);color:var(--gris-osc)}
.portal-ev-agregar a,.portal-ev-agregar button{
  display:inline-flex;align-items:center;gap:var(--sp-2);min-height:var(--tap);padding:0 var(--sp-2);
  font:inherit;font-weight:600;color:var(--sobre-oscuro);text-decoration:underline;text-underline-offset:.2em;
  background:transparent;border:0;cursor:pointer;
}
.portal-ev-agregar svg{flex:0 0 auto;width:1.125rem;height:1.125rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-seguir{margin-top:var(--sp-4);padding-top:var(--sp-4);border-top:1px solid var(--pub-borde)}
.portal-seguir b{display:block;font-size:var(--fs-145)}
.portal-seguir span{display:block;font-size:var(--fs-125);color:var(--gris-osc);margin:var(--sp-1) 0 var(--sp-3)}
.portal-seguir-bot{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2)}
.portal-seguir .btn{text-decoration:none;font-size:var(--fs-135);padding:var(--sp-2);letter-spacing:.08em}

/* ---- categorías y sede ---- */
/* "¿En qué categoría juega?" (como en la propuesta de v0): la sección no es
   una caja; adentro, una caja con el año y otra con la categoría. En el
   celular, una arriba de la otra; en compu, lado a lado (layout.css). */
.portal-buscador{display:grid;gap:var(--sp-3)}
.portal-anio-caja,.portal-cat-resultado{padding:var(--sp-4);background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r)}
.portal-anio-et{display:block;font-size:var(--fs-160);font-weight:600;color:var(--gris-osc);margin-bottom:var(--sp-2)}
.portal-anio{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3)}
.portal-anio button{
  flex:none;width:4rem;height:4rem;display:grid;place-items:center;font:inherit;font-size:var(--fs-300);line-height:1;
  color:var(--sobre-oscuro);background:var(--pub-fondo);border:1px solid var(--pub-borde);border-radius:50%;cursor:pointer;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-anio button:active{transform:scale(.92)}
.portal-anio button:disabled{color:var(--gris-osc);cursor:default;transform:none}
.portal-anio output{font-family:var(--ff-titulo);font-weight:700;font-size:clamp(3.5rem,2.75rem + 3vw,4.5rem);line-height:1;font-variant-numeric:tabular-nums}
.portal-cat-resultado{display:grid;gap:var(--sp-4);align-content:start}
.portal-cat-res + .portal-cat-res{padding-top:var(--sp-4);border-top:1px solid var(--pub-borde)}
.portal-cat-nombre{display:flex;align-items:flex-end;gap:var(--sp-3);margin-bottom:var(--sp-3)}
/* El nombre en el rojo del club: es texto grande (≥ 24 px), ahí alcanza --primario. */
.portal-cat-nombre b{font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;font-size:clamp(3.5rem,2.75rem + 3vw,4.5rem);line-height:.8;color:var(--primario)}
.portal-cat-nombre span{display:grid;gap:var(--sp-1)}
.portal-cat-nombre em{font-style:normal;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;font-size:var(--fs-230);line-height:1}
.portal-cat-nombre small{font-size:var(--fs-160);color:var(--gris-osc)}
.portal-cat-hora{list-style:none;margin:0;padding:0;border-top:1px solid var(--pub-borde)}
.portal-cat-hora li{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-5);padding:var(--sp-3) 0}
.portal-cat-hora li + li{border-top:1px solid var(--pub-borde)}
.portal-cat-hora span{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-170);font-weight:600}
.portal-cat-hora .lugar{font-size:var(--fs-160);font-weight:400;color:var(--gris-osc)}
.portal-cat-hora i{display:grid;color:var(--gris-osc)}
.portal-cat-hora svg{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-cat-sin{margin:0;color:var(--gris-osc);font-size:var(--fs-160)}
.portal-cat-nada{margin:0;color:var(--gris-osc);font-size:var(--fs-160);line-height:1.5}
.portal-cat-nada a{color:var(--sobre-oscuro);font-weight:600}
/* La fila de categorías: tarjetas con foto en duotono suave (grises + un poco
   del color del club, multiplicado, como el tono "subtle" de v0) y un degradé
   abajo para el texto. Cada una es un botón; la del año elegido lleva un aro y
   "Su categoría". Se desliza con snap; con mouse suma dos flechas. La pista
   sangra hasta el borde en el celular, así se ve que hay más a la derecha. Sin
   foto, un fondo del club y una pelota. */
.portal-carrusel{margin-top:var(--sp-6);min-width:0}
.portal-carrusel:empty{display:none}
.portal-carrusel-cab{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-2)}
.portal-carrusel-cab h3{margin:0;font-family:var(--ff-titulo);font-weight:600;letter-spacing:.16em;text-transform:uppercase;font-size:var(--fs-125);color:var(--gris-osc)}
.portal-carrusel-guia{margin:var(--sp-1) 0 0;font-size:var(--fs-135);color:var(--gris-osc)}
@media (hover:hover){.portal-carrusel-guia{display:none}}
.portal-carrusel-flechas{display:none;gap:var(--sp-2)}
.portal-carrusel-flechas button{width:var(--tap);height:var(--tap);display:grid;place-items:center;font-size:var(--fs-200);color:var(--sobre-oscuro);background:transparent;border:1px solid var(--pub-borde);border-radius:var(--r-s)}
.portal-carrusel-flechas button:active{transform:scale(.94)}
@media (hover:hover){.portal-carrusel-flechas{display:flex}}
.portal-carrusel-pista{
  display:flex;gap:var(--sp-3);list-style:none;margin:0 calc(var(--sp-4) * -1);padding:0 var(--sp-4) var(--sp-2);
  overflow-x:auto;scroll-snap-type:x mandatory;scroll-padding-inline:var(--sp-4);overscroll-behavior-x:contain;scrollbar-width:thin;scrollbar-color:var(--pub-borde) transparent;
}
.portal-card{position:relative;isolation:isolate;flex:0 0 min(15rem,72vw);aspect-ratio:3 / 4;scroll-snap-align:start;overflow:hidden;border-radius:var(--r);background:var(--pub-tarjeta)}
.portal-card button{position:absolute;inset:0;display:block;width:100%;padding:0;font:inherit;color:inherit;text-align:left;background:transparent;border:0;border-radius:inherit;cursor:pointer}
.portal-card button[aria-pressed="true"]{box-shadow:inset 0 0 0 3px var(--sobre-oscuro)}
.portal-card img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;object-fit:cover;filter:grayscale(1) contrast(1.25);transition:transform var(--dur-3) var(--ease-salida)}
@media (hover:hover){.portal-card button:hover img{transform:scale(1.05)}}
.portal-card::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--club);mix-blend-mode:multiply;opacity:.35}
.portal-card::after{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(to top,var(--velo-pub-fuerte) 0,var(--velo-pub-medio) 35%,var(--velo-pub-cero) 70%)}
.portal-card.sin-foto{background:linear-gradient(160deg,var(--primario-osc),var(--pub-fondo))}
.portal-card.sin-foto::before{display:none}
.portal-card button > i{position:absolute;top:var(--sp-4);right:var(--sp-4);opacity:.35}
.portal-card button > i svg{width:4rem;height:4rem;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.portal-card-su{position:absolute;top:var(--sp-3);left:var(--sp-3);display:none;align-items:center;gap:var(--sp-1);padding:var(--sp-1) var(--sp-3);border-radius:var(--r-full);background:var(--sobre-oscuro);color:var(--pub-fondo);font-size:var(--fs-135);font-weight:600}
[aria-pressed="true"] > .portal-card-su{display:flex}
.portal-card-su i{display:grid}
.portal-card-su svg{width:1rem;height:1rem;fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.portal-card-txt{position:absolute;inset:auto 0 0;display:block;padding:var(--sp-4)}
/* El nombre se achica con el ancho de la tarjeta: "Primera" en cinco columnas no entra a 3.5rem. */
.portal-card{container-type:inline-size}
.portal-card-txt b{display:block;font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;font-size:min(3.5rem,24cqi);line-height:.9;letter-spacing:.01em}
.portal-card-txt span{display:block;margin-top:var(--sp-1);font-family:var(--ff-titulo);font-weight:600;letter-spacing:.14em;text-transform:uppercase;font-size:var(--fs-145)}
.portal-card-txt small{display:block;margin-top:var(--sp-1);font-size:var(--fs-135);color:var(--sobre-oscuro)}

/* "Dónde se entrena": los lugares, "Cómo llegar" y el mapa 16:9. En el
   celular, el texto arriba y el mapa abajo; en compu, lado a lado (layout.css).
   El mapa es un cuadro propio hasta que se toca "Ver mapa". */
.portal-sede{display:grid;gap:var(--sp-4)}
.portal-sede-dir{margin:0;color:var(--gris-osc);font-size:var(--fs-145)}
.portal-sede-lugares{list-style:none;margin:var(--sp-3) 0 var(--sp-4);padding:0;display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.portal-sede-lugares li{padding:var(--sp-1) var(--sp-3);border:1px solid var(--pub-borde);border-radius:var(--r-full);background:var(--pub-tarjeta);font-size:var(--fs-125);font-weight:600}
.portal-sede-txt .btn{display:inline-flex;width:auto;min-height:var(--tap);padding:0 var(--sp-4);font-size:var(--fs-145);text-decoration:none}

/* Resumen estático de categorías, sede, cómo sumarte y preguntas (ver portal.html: se mantiene a mano). */
.portal-info-cats{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-3)}
.portal-info-cat{padding:var(--sp-4);border:1px solid var(--pub-borde);border-radius:var(--r);background:var(--pub-tarjeta)}
.portal-info-cat h3{font-size:var(--fs-230);line-height:1;margin-bottom:var(--sp-1)}
.portal-info-cat p{margin:0;color:var(--gris-osc);font-size:var(--fs-135)}
.portal-info-cat ul{list-style:none;margin:var(--sp-2) 0 0;padding:0;display:grid;gap:var(--sp-1);font-size:var(--fs-145)}
.portal-info-dir{margin:0 0 var(--sp-4);font-style:normal;font-size:var(--fs-145);line-height:1.5}
.portal-info-acc{display:flex;flex-wrap:wrap;gap:var(--sp-3)}
.portal-info .btn{display:inline-flex;width:auto;min-height:var(--tap);padding:0 var(--sp-4);font-size:var(--fs-145);text-decoration:none}
@media (min-width:48rem){.portal-info-cats{grid-template-columns:repeat(2,minmax(0,1fr))}}
.portal-mapa{
  position:relative;aspect-ratio:16 / 9;overflow:hidden;border:1px solid var(--pub-borde);border-radius:var(--r);
  background:
    repeating-linear-gradient(0deg,transparent 0 1.75rem,var(--pub-borde) 1.75rem calc(1.75rem + 1px)),
    repeating-linear-gradient(90deg,transparent 0 1.75rem,var(--pub-borde) 1.75rem calc(1.75rem + 1px)),
    var(--pub-tarjeta);
}
.portal-mapa iframe{display:block;width:100%;height:100%;border:0}
/* El recuadro del mapa, con una foto del estadio detrás (oscurecida): el botón sigue cargando el mapa recién al tocarlo. */
.portal-mapa-foto{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:saturate(.75) brightness(.5)}
.portal-mapa-ver{
  position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-1);
  font:inherit;color:var(--sobre-oscuro);background:transparent;border:0;cursor:pointer;
}
.portal-mapa-ver i{display:grid;place-items:center;width:3rem;height:3rem;border-radius:50%;background:var(--primario);color:var(--sobre-club);transition:transform var(--dur-1) var(--ease-salida)}
.portal-mapa-ver:active i{transform:scale(.92)}
.portal-mapa-ver svg{width:1.5rem;height:1.5rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-mapa-ver b{font-family:var(--ff-titulo);font-weight:700;text-transform:uppercase;letter-spacing:.06em;font-size:var(--fs-200)}
.portal-mapa-ver small{font-size:var(--fs-125);color:var(--sobre-oscuro)}

.portal-foto{margin:0;border:1px solid var(--pub-borde);border-radius:var(--r);overflow:hidden;background:var(--pub-tarjeta)}
.portal-foto img{display:block;width:100%;height:auto;aspect-ratio:3 / 2;object-fit:cover}
.portal-foto figcaption{padding:var(--sp-3) var(--sp-4);font-size:var(--fs-135);color:var(--gris-osc)}

.portal-semillero h2{font-size:var(--fs-220)}

/* ---- caja de autenticación ---- */
.caja{max-width:23rem;margin-inline:auto;width:100%;padding:var(--sp-5) var(--sp-4) var(--sp-8)}
.caja h2{font-size:var(--fs-260);text-align:center;margin-bottom:var(--sp-2)}
.caja .sub{color:var(--gris-osc);font-size:var(--fs-135);text-align:center;line-height:1.45;margin-bottom:var(--sp-5)}

/* "¿Quién sos?": dos opciones grandes con su explicación, para que nadie
   elija mal por tocar el botón más visible. */
.quien{display:flex;flex-direction:column;gap:var(--sp-3)}
.quien-op{
  display:flex;flex-direction:column;gap:var(--sp-1);text-align:left;width:100%;
  min-height:var(--tap);padding:var(--sp-4);
  background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-left:3px solid var(--primario);
  border-radius:var(--r-m);color:var(--sobre-oscuro);
  transition:transform var(--dur-1) var(--ease-salida);
}
.quien-op .t{font-family:var(--ff-titulo);font-size:var(--fs-190);font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.quien-op .d{color:var(--gris-osc);font-size:var(--fs-135);line-height:1.45}
.quien-op:active{transform:scale(.98)}

/* El código de 6 caracteres que el chico le muestra al profe en la práctica (0037). */
.codigo-solicitud{
  font-family:var(--ff-mono);font-weight:600;font-size:var(--fs-300);
  letter-spacing:.3em;text-align:center;color:var(--sobre-oscuro);
  margin:var(--sp-4) 0;
}

.campo-osc{margin-bottom:var(--sp-4)}
.campo-osc label{
  font-family:var(--ff-titulo);font-size:var(--fs-115);letter-spacing:.11em;
  text-transform:uppercase;color:var(--gris-osc);font-weight:500;
  display:block;margin-bottom:var(--sp-2);
}
.campo-osc .env{position:relative;display:block}
.campo-osc .env svg{
  position:absolute;left:var(--sp-3);top:50%;transform:translateY(-50%);
  width:1.125rem;height:1.125rem;stroke:var(--gris-osc);fill:none;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;pointer-events:none;
}
.campo-osc input{
  width:100%;min-height:3rem;padding:var(--sp-3) var(--sp-3) var(--sp-3) 2.75rem;
  background:var(--sup-2);border:1px solid var(--linea-osc);border-radius:var(--r-m);
  color:var(--sobre-oscuro);font-size:var(--fs-160);font-family:var(--ff-mono);
}
.campo-osc select{
  width:100%;min-height:3rem;padding:var(--sp-3);
  background:var(--sup-2);border:1px solid var(--linea-osc);border-radius:var(--r-m);
  color:var(--sobre-oscuro);font-size:var(--fs-160);
}
.campo-osc select:focus{border-color:var(--primario)}
.campo-osc input::placeholder{color:var(--placeholder-osc)}
.campo-osc input:focus{border-color:var(--primario)}
.campo-osc .ayuda{font-size:var(--fs-115);color:var(--gris-osc);margin-top:var(--sp-1)}

/* El aviso de la app es blanco sobre papel; acá tiene que vivir en oscuro. */
.publico .al{background:var(--sup-1);color:var(--sobre-oscuro);box-shadow:none}
.publico .al .mt{color:var(--gris-osc)}

/* El secundario sobre el negro. La regla global de .btn.sec lo pinta blanco
   con borde gris, para el papel de la app; acá eso dejaba texto blanco sobre
   fondo blanco (1.00:1), un rectángulo vacío. Vuelve a fondo transparente.

   El borde pasa a --gris-osc, el token pensado para fondo oscuro: 7.57:1
   contra --negro. El que había, --linea-osc, daba 1.65:1: el botón se
   reconocía sólo por el texto, y en este proyecto el borde tiene que alcanzar
   solo. Sin sombra: --sombra está pensada para superficies claras. */
.publico .btn.sec{background:transparent;border-color:var(--gris-osc);color:var(--sobre-oscuro);box-shadow:none}
/* Tampoco hereda el :active global, que pinta --papel: con texto blanco, un
   secundario apretado se volvía invisible justo mientras se lo toca. */
.publico .btn.sec:active{background:var(--presion-osc)}

.o{display:flex;align-items:center;gap:var(--sp-3);margin:var(--sp-5) 0;color:var(--gris-osc);font-family:var(--ff-titulo);font-size:var(--fs-135);font-weight:600;letter-spacing:.14em;text-transform:uppercase}
.o::before,.o::after{content:"";flex:1;height:1px;background:var(--linea-osc)}

.btn-google{
  display:flex;align-items:center;justify-content:center;gap:var(--sp-3);
  width:100%;min-height:var(--tap);padding:var(--sp-3) var(--sp-4);
  background:var(--blanco);color:var(--google-texto);border-radius:var(--r-btn);
  font-family:var(--ff-titulo);font-size:var(--fs-160);font-weight:600;
  letter-spacing:.06em;text-transform:uppercase;
  transition:transform var(--dur-1) var(--ease-salida);
}
.btn-google svg{width:1.125rem;height:1.125rem;flex:0 0 auto}
.btn-google:active{transform:scale(.97);background:var(--google-hover)}
.btn-google:disabled{background:var(--sup-2);color:var(--gris-osc);transform:none}

.enlaces{display:flex;flex-direction:column;align-items:center;margin-top:var(--sp-5)}
.enlaces button{
  min-height:var(--tap);display:flex;align-items:center;padding:0 var(--sp-2);
  color:var(--gris-osc);font-size:var(--fs-135);
}
.enlaces button b{color:var(--primario);font-family:var(--ff-titulo);letter-spacing:.06em;text-transform:uppercase;font-weight:600;margin-left:.35em}

/* ---- Términos y Privacidad ---- */
.pie-legal{text-align:center;font-size:var(--fs-125);color:var(--gris-osc);padding:0 var(--sp-4) var(--sp-8);margin-top:calc(-1 * var(--sp-5))}
.pie-legal a,.nota-legal a,.docs-legales a{color:var(--sobre-oscuro)}
/* Dos links en línea: el área de toque llega a --tap sin cambiar el texto. */
.pie-legal a{display:inline-flex;align-items:center;min-height:var(--tap);min-width:var(--tap)}
.nota-legal{font-size:var(--fs-125);color:var(--gris-osc);text-align:center;line-height:1.45;margin-top:var(--sp-3)}
.docs-legales{display:flex;flex-direction:column;gap:var(--sp-2);margin-bottom:var(--sp-5)}
.docs-legales a{
  display:flex;align-items:center;min-height:var(--tap);padding:0 var(--sp-4);
  background:var(--pub-tarjeta);border:1px solid var(--pub-borde);border-radius:var(--r-m);
  font-family:var(--ff-titulo);font-weight:600;letter-spacing:.04em;text-transform:uppercase;text-decoration:none;
}
.docs-legales a::after{content:"↗";margin-left:auto;color:var(--gris-osc)}
/* El texto entero es el blanco del toque: en el celular el checkbox solo es
   chico para el dedo. */
.acepto{display:flex;gap:var(--sp-3);align-items:flex-start;font-size:var(--fs-145);line-height:1.5;margin-bottom:var(--sp-4);cursor:pointer}
.acepto input{width:1.375rem;height:1.375rem;flex:0 0 auto;margin-top:.1rem;accent-color:var(--primario)}

/* ---- cuenta sin club ---- */
.sin-club{max-width:28rem;margin-inline:auto;width:100%;padding:var(--sp-6) var(--sp-4) var(--sp-8);text-align:center}
.sin-club .ico{
  width:3.5rem;height:3.5rem;margin:0 auto var(--sp-4);border-radius:50%;
  background:var(--sup-1);border:1px solid var(--linea-osc);
  display:flex;align-items:center;justify-content:center;
  font-family:var(--ff-titulo);font-size:var(--fs-260);font-weight:700;color:var(--primario);
}
.sin-club .btn + .d{margin-top:var(--sp-5)}
.sin-club .d + .btn{margin-top:var(--sp-2)}
.sin-club h2{font-size:var(--fs-250);margin-bottom:var(--sp-3)}
.sin-club .d{color:var(--gris-osc);font-size:var(--fs-145);line-height:1.55;margin-bottom:var(--sp-4);text-align:left}
.sin-club .mail{
  background:var(--sup-1);border:1px solid var(--linea-osc);border-radius:var(--r);
  padding:var(--sp-3);font-family:var(--ff-mono);font-size:var(--fs-145);
  margin-bottom:var(--sp-5);word-break:break-all;
}

/* El botón principal de la landing lleva un brillo suave en reposo y se
   enciende del todo al pasar el mouse (la regla de :hover lo pisa). */
.acciones-landing .btn:not(.sec)::after{opacity:.4}

@media (hover:hover){
  .ben:hover{transform:translateY(-4px)}
  .ben:hover::after{opacity:1}
  .ben:hover::before{transform:scaleX(1.7)}
  .ben:hover .t::before{transform:translateY(-.15em) rotate(45deg) scale(1.3)}
  .publico .btn.sec:not(:disabled):hover{background:var(--toque-osc)}
  .btn-google:not(:disabled):not(:active):hover{background:var(--google-hover);transform:translateY(-2px);transition-duration:var(--dur-2)}
  .enlaces button:hover b{color:var(--sobre-oscuro)}
  .quien-op:hover{background:var(--toque-osc)}
}

/* ---- Portal: entrada al scroll ----
   Lo que lleva .rise arranca oculto y 1.5rem más abajo SÓLO si public/js/anim.js
   prendió .js-anim (sin JS, o con movimiento reducido, no se prende y todo se
   ve). src/ui/animaciones.js le pone .visto al aparecer, una sola vez. La
   transición es de opacity y transform, como pide DESIGN.md. */
.js-anim .rise{opacity:0;transform:translateY(1.5rem);transition:opacity var(--dur-rise) var(--ease-salida),transform var(--dur-rise) var(--ease-salida)}
.js-anim .rise.visto{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  .js-anim .rise{opacity:1;transform:none}
}

/* ---- Portal: barra fija de abajo ----
   Los mismos dos botones del hero, para cuando el hero ya quedó atrás. Aparece
   y se va deslizándose (sólo transform). Fondo oscuro translúcido con blur; sin
   backdrop-filter, el velo ya es casi sólido. Respeta la zona segura del
   iPhone. El .portal reserva abajo el lugar de la barra para no tapar el pie. */
.portal-dock{
  position:fixed;inset:auto 0 0;z-index:20;
  padding:var(--sp-2) var(--sp-4) calc(var(--sp-2) + env(safe-area-inset-bottom));
  background:var(--velo-pub-fuerte);border-top:1px solid var(--pub-borde);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  transform:translateY(100%);transition:transform var(--dur-3) var(--ease-salida);
}
.portal-dock.visible{transform:none}
.portal-dock-acc{display:flex;gap:var(--sp-2);max-width:30rem;margin-inline:auto}
.portal-dock-btn{
  flex:1 1 0;display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);min-height:3rem;padding:0 var(--sp-2);
  border:0;border-radius:var(--r-btn);text-decoration:none;cursor:pointer;
  font-family:var(--ff-titulo);font-weight:700;letter-spacing:.06em;text-transform:uppercase;font-size:var(--fs-190);line-height:1;
  transition:transform var(--dur-1) var(--ease-salida);
}
.portal-dock-btn svg{flex:0 0 auto;width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.portal-dock-btn:active{transform:scale(.97)}
.portal-dock-btn.principal{flex-grow:1.5;background:var(--primario);color:var(--sobre-club);white-space:nowrap}
.portal-dock-btn.pago{background:var(--papel);color:var(--tinta)}
