/* La Pachanguera 95.1 FM — https://www.lapachanguera951.com
 * Código desarrollado y mantenido por Pragmatic Business Solutions.
 * Contacto: Johnny Gonzalez <info@pragmaticsolutions.app>
 */
/* ===========================================================================
   La Pachanguera 95.1 FM
   Type: Ubuntu. Scale: large — this is a party station, not a bank.
   Player: fixed bottom bar, the pattern every major Latin American station
   uses (Tropicana, Olímpica, Exa), so it reads as a radio immediately.
   =========================================================================== */
/* `hidden` tiene que esconder. NO es una regla de más: `[hidden]{display:none}`
   la pone el NAVEGADOR, y cualquier regla de autor con `display` le gana sin
   error y sin aviso — el código pone `hidden = true`, el elemento se queda en
   pantalla y nadie se entera. Ya mordió dos veces: el contador decía
   «0 ESCUCHANDO POR LA WEB» con nadie conectado, y la barra de progreso del
   programa al aire se veía en las 14 vistas del sitio con el relleno en 0.
   Medido el 16/09 en Chromium, elemento por elemento: de los 18 que el código
   esconde de verdad, a 4 no les funcionaba. Va GLOBAL y no acotada a cada uno
   porque a la cuarta vez acotar deja de ser prudencia: se midió qué cambia en
   las 7 páginas por 2 anchos y lo único que se mueve es #ahora-barra y su hijo.
   ANTES DE PONER ESTO hubo que sacar el reloj de adentro de #clima (build.py):
   con la regla puesta y /api/clima caído, esconder el clima se llevaba el reloj
   y la fecha, y el cintillo quedaba vacío. Si algún día hace falta un elemento
   que lleve `hidden` y aun así se vea, el arreglo no es aflojar esto: es no
   usar `hidden` para eso. */
[hidden]{display:none !important}

:root{
  --amarillo:#FFF100; --rosa:#FF3C77; --azul:#00418B;
  --campo:#00489C; --rayo:#1068C2; --halo:#B3E0FF;
  --rosa-fuerte:#C2185B;   /* pink that passes AA behind body text */
  --hondo:#012A62; --hondo2:#01214E;
  --pad: clamp(20px, 4.5vw, 56px);
  --borde: max(var(--pad), calc((100vw - var(--max)) / 2));  /* the one content edge */
  --max: 1180px;
  --rep: 86px;                     /* height of the fixed player bar */
  /* El botón «Saludos y pedidos», que flota ARRIBA de la barra. Su alto
     vive acá y no suelto en la regla porque el `padding-bottom` del body
     lo necesita: si no, el botón taparía el final del contenido de cada
     página y nadie lo notaría salvo justo al final de un scroll. */
  --fab: 48px;
  --fab-sep: 14px;                 /* hueco entre el botón y la barra */
  --hoja: 88svh;                   /* alto máximo de la hoja del diálogo */
}
*{box-sizing:border-box}
html{scroll-behavior:smooth; -webkit-text-size-adjust:100%}
body{
  margin:0; min-height:100svh; color:#fff; background:var(--campo);
  font-family:Ubuntu, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size:17px; line-height:1.6; -webkit-font-smoothing:antialiased;
  overflow-x:hidden; display:flex; flex-direction:column;
  /* Este `overflow-x:hidden` NO alcanza, y conviene saber por qué antes de
     agregarle otro: `.rays` es `position:fixed`, así que se ubica contra el
     VIEWPORT y no contra el body — el recorte del body no lo toca. El recorte
     que sirve está en `html`, más abajo. */
  padding-bottom: calc(var(--rep) + var(--fab) + var(--fab-sep) +
                       env(safe-area-inset-bottom, 0px));

  /* Una sola palabra larguísima —una URL pegada, un nombre sin espacios—
     no puede estirar la página. Sin esto, un texto del panel con un token
     de 70 caracteres desbordaba /locutores/ en 9000 px. `overflow-wrap`
     `anywhere` y no `break-word`: los dos parten la palabra al pintar,
     pero solo `anywhere` reduce el ancho mínimo intrínseco, que es lo
     que hace que un contenedor flex o grid deje de estirarse. Con
     `break-word` el desborde de 9000 px seguía igual. */
  overflow-wrap:anywhere}
img{max-width:100%; height:auto}
a{color:inherit}
h1,h2,h3{line-height:1.05; margin:0}

/* ---- backdrop -------------------------------------------------------- */
/* EL SITIO DESBORDABA EN HORIZONTAL ENTRE 810 Y 870 px, en producción, y nadie
   lo había medido. Medido el 16/09 barriendo de 360 a 1000 de a 10: el culpable
   no era la barra de navegación sino `.rays`, un adorno de 240vmax que a ciertas
   proporciones se pasa del borde y deja barra de desplazamiento lateral.

   Va `clip` y no `hidden` A PROPÓSITO: `overflow-x:hidden` en `html` crea un
   contenedor de desplazamiento y **rompe `position:sticky`** — y esta hoja lo
   usa en dos lugares, `.cabezal` (el encabezado que acompaña al rodar) y
   `.trafico-mapa`. `clip` recorta sin crear ese contenedor, así que los dos
   siguen pegados donde tienen que estar.

   Y se descubrió por el lado largo: se pidió medir si entraba un séptimo enlace
   en la barra. El comentario de `build.py` nombraba 1280 y 360 — y el defecto
   vive en el medio. Una lista de anchos a medir es una lista blanca de
   preguntas: lo que no está en la lista, no se pregunta. */
html{overflow-x:clip}

.rays{
  position:fixed; left:50%; top:20%; width:240vmax; height:240vmax;
  transform:translate(-50%,-50%); z-index:0; pointer-events:none; opacity:.40;
  background:repeating-conic-gradient(from 0deg at 50% 50%,
    var(--rayo) 0deg 2.6deg, transparent 2.6deg 7.5deg);
  -webkit-mask-image:radial-gradient(closest-side,#000 6%,rgba(0,0,0,.5) 30%,transparent 68%);
          mask-image:radial-gradient(closest-side,#000 6%,rgba(0,0,0,.5) 30%,transparent 68%);
  animation:turn 260s linear infinite;
}
@keyframes turn{to{transform:translate(-50%,-50%) rotate(360deg)}}
.glow{
  position:fixed; left:50%; top:18%; width:min(160vw,1240px); aspect-ratio:1;
  transform:translate(-50%,-50%); z-index:0; pointer-events:none;
  background:radial-gradient(circle,rgba(150,210,255,.40) 0%,rgba(0,72,156,0) 62%);
}

/* ---- header ---------------------------------------------------------- */
.cabezal{
  position:sticky; top:0; z-index:40;
  background:rgba(1,36,88,.82); backdrop-filter:blur(14px);
  border-bottom:1px solid rgba(255,255,255,.16);
  padding-top:env(safe-area-inset-top,0px);
}
.cabezal-fila{display:flex; align-items:center; gap:18px;
              padding-block:12px; padding-inline:var(--borde)}

/* ---- Septiembre, Mes de la Patria -------------------------------------- */
/* the top band: weather on the left, the seasonal message centred. It stays
   after September, carrying the weather on its own. */
.cintillo{display:flex; align-items:center; gap:14px; flex-wrap:nowrap;
  padding:6px var(--borde); background:#fff; color:#0A2A5E;
  border-bottom:1px solid rgba(1,36,88,.18)}
.patria{display:flex; align-items:center; gap:10px; min-width:0;
  margin-left:auto; text-align:right}

/* ---- the "this is not live traffic" notice ----------------------------- */
.aclaracion{background:rgba(255,241,0,.12); border:1.5px solid rgba(255,241,0,.5);
  border-left-width:6px; border-radius:16px; padding:clamp(18px,2.2vw,26px);
  font-size:16.5px; line-height:1.6; color:#EAF4FF; max-width:78ch}
.aclaracion strong{color:var(--amarillo); display:block; margin-bottom:6px; font-size:17.5px}
.aclaracion a{color:var(--amarillo); font-weight:700; display:inline-flex;
  align-items:center; min-height:44px}

/* ---- El Tráfico: avisos on the left, map on the right ------------------ */
.trafico-grid{display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);
              gap:clamp(18px,2.6vw,34px); align-items:start}
.trafico-mapa{position:sticky; top:150px}
@media (max-width:920px){
  .trafico-grid{grid-template-columns:1fr}
  .trafico-mapa{position:static; order:-1}   /* map first on a phone */
}

/* ---- map band above the footer ----------------------------------------- */
.mapa-franja{position:relative; z-index:2; padding:clamp(30px,4vw,56px) 0 clamp(20px,3vw,36px)}
.mapa-titulo{font-size:clamp(24px,3.2vw,38px); margin-bottom:clamp(16px,2vw,26px)}
.mapa-mas{margin-left:auto; text-decoration:none; font-size:14px; font-weight:700;
  color:var(--amarillo); display:inline-flex; align-items:center; min-height:44px}
.mapa-mas:hover{text-decoration:underline}

/* ---- map ---------------------------------------------------------------- */
.mapa-caja{position:relative; border-radius:22px; overflow:hidden;
  border:1px solid rgba(255,255,255,.24); box-shadow:0 18px 44px rgba(0,8,36,.34)}
.mapa{height:clamp(300px,50vh,520px); width:100%; background:#04306F}
.mapa-controles{display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:12px 16px; background:rgba(1,36,88,.9); border-top:1px solid rgba(255,255,255,.18)}
.mapa-check{display:inline-flex; align-items:center; gap:9px; min-height:44px;
  font-size:14.5px; font-weight:700; cursor:pointer}
.mapa-check input{width:20px; height:20px; accent-color:var(--rosa); cursor:pointer}
.mapa-nota{font-size:13px; color:var(--halo)}
.mapa-credito{margin:10px 0 0; font-size:12.5px; color:#AFCCEE}
.leaflet-container{font-family:inherit}
.leaflet-control-zoom a{width:44px; height:44px; line-height:44px; font-size:20px}
.leaflet-control-attribution{display:none}   /* credited below the map instead */
.mapa-credito a{color:var(--halo); display:inline-flex; align-items:center; min-height:44px}
.leaflet-popup-content{font-size:14px; line-height:1.5; margin:12px 14px}
.leaflet-popup-content b{display:block; font-size:15.5px; margin-bottom:4px}

/* ---- servicio list ------------------------------------------------------ */
.reportes{list-style:none; margin:0 0 26px; padding:0; display:grid; gap:12px}
.reporte{display:grid; grid-template-columns:auto 1fr; gap:14px; align-items:start;
  background:rgba(1,36,88,.5); border:1px solid rgba(255,255,255,.2);
  border-radius:18px; padding:18px 20px; cursor:pointer;
  transition:border-color .15s ease, transform .15s ease}
.reporte:hover{border-color:rgba(255,255,255,.5); transform:translateY(-2px)}
.reporte.activo{border-color:var(--amarillo)}
.rep-tipo{display:inline-flex; align-items:center; align-self:start;
  background:var(--c); color:var(--t,#fff); font-size:11px; font-weight:700;
  letter-spacing:.12em; text-transform:uppercase; padding:6px 11px; border-radius:999px;
  white-space:nowrap}
.reporte h3{font-size:18px; font-weight:700; margin-bottom:5px; line-height:1.25}
.reporte p{margin:0 0 6px; font-size:15px; color:#CFE6FF; line-height:1.5}
.rep-meta{font-size:13px; color:var(--halo)}

@media (max-width:560px){ .reporte{grid-template-columns:1fr} }

/* ---- weather ----------------------------------------------------------- */
.clima{display:inline-flex; align-items:center; gap:8px; flex:none}
.clima-ico{display:inline-flex; width:20px; height:20px; color:#0A2A5E}
.clima-ico svg{width:20px; height:20px}
.clima-temp{font-size:15px; font-weight:700; line-height:1}
.clima-desc{font-size:12.5px; color:#3C5F96; white-space:nowrap}
.reloj-sep{color:rgba(10,42,94,.32); font-weight:400}
.reloj{display:inline-flex; align-items:baseline; gap:7px; white-space:nowrap}
.reloj b{font-size:14px; font-weight:700; font-variant-numeric:tabular-nums;
         letter-spacing:.01em}
.reloj span{font-size:12.5px; color:#3C5F96}
/* The band must stay one line. Drop detail in order of importance as it
   narrows: the date, then the forecast text, then the celebration subtitle. */
@media (max-width:1100px){ .reloj span{display:none} }
@media (max-width:1000px){ .clima-desc{display:none} }
@media (max-width:900px){ .patria-txt em{display:none} }
@media (max-width:600px){ .patria-txt b{font-size:11.5px} }
@media (max-width:620px){ .reloj, .reloj-sep{display:none} }
.patria-bandera{display:inline-flex; flex-direction:column; width:26px; height:17px;
  border-radius:2px; overflow:hidden; flex:none; box-shadow:0 0 0 1px rgba(10,42,94,.25)}
.patria-bandera i{display:block; height:33.34%}
.patria-bandera i:nth-child(1),.patria-bandera i:nth-child(3){background:#0067C6}
.patria-bandera i:nth-child(2){background:#fff}
.patria-txt{display:flex; flex-wrap:nowrap; align-items:baseline; justify-content:flex-end;
            gap:4px 10px; line-height:1.3; min-width:0}
.patria-txt b,.patria-txt em{white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.patria-txt b{font-size:14px; font-weight:700; letter-spacing:.01em}
.patria-txt em{font-style:normal; font-size:13px; color:#3C5F96}
@media (max-width:560px){
  .cintillo{padding:6px 12px; gap:10px}
  .patria{gap:9px}
  .patria-txt b{font-size:12.5px}
  .patria-txt em{font-size:11.5px}
}
.marca{display:flex; align-items:center; gap:15px; text-decoration:none;
       margin-right:auto; min-height:56px}
.marca img{width:clamp(88px,7.4vw,124px); height:auto; aspect-ratio:1; object-fit:contain;
           filter:drop-shadow(0 5px 14px rgba(0,10,40,.55))}
.nav{display:flex; gap:6px}
.nav a{display:flex; align-items:center; min-height:48px; padding:0 18px;
       text-decoration:none; font-size:14.5px; font-weight:700; letter-spacing:.04em;
       text-transform:uppercase; border-radius:999px; white-space:nowrap}
.nav a:hover{background:rgba(255,255,255,.14)}
.nav a[aria-current="page"]{background:var(--amarillo); color:#04306F}
.nav a:focus-visible,.marca:focus-visible{outline:3px solid var(--amarillo); outline-offset:3px}
.menu{display:none; width:52px; height:52px; padding:0; cursor:pointer; background:none;
      border:1px solid rgba(255,255,255,.4); border-radius:14px}
.menu span{display:block; width:21px; height:2.5px; background:#fff; margin:4.5px auto; border-radius:2px}

/* ---- on-air strip ------------------------------------------------------ */
.alaire{position:relative; z-index:30; background:linear-gradient(90deg,#04306F,#0A54AE 55%,#04306F);
        border-bottom:1px solid rgba(255,255,255,.18)}
.alaire-in{width:100%; padding:14px var(--borde);
           display:flex; align-items:center; gap:16px}
.alaire-foto{width:70px; height:70px; flex:none; border-radius:16px; object-fit:cover;
             border:2.5px solid var(--amarillo); background:#04306F;
             box-shadow:0 6px 18px rgba(0,10,40,.45)}
.alaire-txt{display:flex; flex-direction:column; gap:3px; min-width:0; margin-right:auto}
.alaire-badge{display:inline-flex; align-items:center; gap:7px; align-self:flex-start;
  background:var(--rosa-fuerte); color:#fff; font-size:10.5px; font-weight:700; letter-spacing:.18em;
  text-transform:uppercase; padding:4px 10px; border-radius:999px}
.alaire-badge .dot{width:7px; height:7px; border-radius:50%; background:#fff}
body.playing .alaire-badge .dot{animation:blip 1.6s ease-out infinite}
.alaire-nom{font-size:clamp(18px,2.2vw,25px); font-weight:700; font-style:italic;
            letter-spacing:-.02em; line-height:1.12;
            white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.alaire-det{font-size:14px; color:var(--halo); white-space:nowrap; overflow:hidden;
            text-overflow:ellipsis}
.alaire-sig{font-size:13.5px; color:#CFE6FF; text-align:right; line-height:1.4;
            padding-left:16px; border-left:1px solid rgba(255,255,255,.22)}
.alaire-sig b{display:block; color:#fff; font-weight:700; font-size:15px}
.alaire-btn{flex:none; display:inline-flex; align-items:center; gap:10px; cursor:pointer;
  min-height:52px; padding:0 22px 0 18px; border-radius:999px; border:none;
  background:var(--amarillo); color:#04306F; font-family:inherit; font-size:15.5px;
  font-weight:700; transition:transform .14s ease}
.alaire-btn:hover{transform:scale(1.04)}
.alaire-btn:focus-visible{outline:3px solid #fff; outline-offset:3px}
.alaire-btn svg{width:22px; height:22px; fill:#04306F}
.alaire-btn .pause{display:none}
body.playing .alaire-btn .play{display:none}
body.playing .alaire-btn .pause{display:block}
.alaire > .progreso{height:5px; background:rgba(255,255,255,.2); display:block}
.alaire > .progreso > span{display:block; height:5px; width:0;
  background:linear-gradient(90deg,var(--amarillo),var(--rosa)); transition:width .6s linear}

@media (max-width:860px){
  .alaire-sig{display:none}
  .alaire-btn span{display:none}
  .alaire-btn{padding:0; width:52px; justify-content:center}
}
@media (max-width:520px){
  .alaire-in{gap:12px; padding:11px var(--pad)}
  .alaire-foto{width:54px; height:54px; border-radius:13px}
}

/* ---- live listener count ---------------------------------------------- */
/* La regla acotada `.oyentes[hidden]{display:none !important}` que vivía acá
   se fue: la cubre la regla global `[hidden]` del principio del archivo, que
   se puso el 16/09 después de medir las consecuencias que esta misma nota
   decía que no se habían mirado. Un remiendo que sobrevive a su motivo tapa
   el próximo. El display de autor de abajo es el que hacía falta ganarle. */
.oyentes{display:inline-flex; align-items:center; gap:7px; flex:none;
  padding:7px 13px; border-radius:999px; white-space:nowrap;
  background:rgba(255,255,255,.14); border:1px solid rgba(255,255,255,.3)}
.oyentes-punto{width:8px; height:8px; border-radius:50%; background:#5BE38B; flex:none;
  box-shadow:0 0 0 0 rgba(91,227,139,.7); animation:blip 2s ease-out infinite}
.oyentes b{font-size:16px; font-weight:700; line-height:1}
.oyentes-t{font-size:11.5px; letter-spacing:.09em; text-transform:uppercase;
           font-weight:700; color:var(--halo)}
@media (max-width:1024px){ .oyentes-t{display:none} }
/* in the player bar it sits just left of the play button */
.reproductor .oyentes{margin-right:4px}
@media (max-width:1024px){ .alaire .oyentes .oyentes-t{display:none} }
@media (max-width:520px){ .alaire .oyentes{padding:6px 10px} }
/* on phones it keeps just the dot and the number — the label is the first
   thing to go, never the count itself */
@media (max-width:860px){
  .reproductor .oyentes .oyentes-t{display:none}
  .reproductor .oyentes{padding:6px 11px; margin-right:2px}
}

/* ---- layout ---------------------------------------------------------- */
main{position:relative; z-index:2; flex:1; width:100%}
.wrap{width:100%; padding-inline:var(--borde)}
.franja{padding:clamp(38px,5vw,76px) 0}
.eyebrow{margin:0 0 12px; font-size:13px; letter-spacing:.22em; text-transform:uppercase;
         font-weight:700; color:var(--amarillo)}
h1{font-size:clamp(36px,5.1vw,68px); font-weight:700; font-style:italic;
   letter-spacing:-.035em; line-height:1.18; text-shadow:0 6px 30px rgba(0,12,48,.55)}
h2{font-size:clamp(30px,4.4vw,58px); font-weight:700; font-style:italic;
   letter-spacing:-.025em; line-height:1.14}
.titulo{margin-bottom:clamp(24px,3vw,44px)}
/* the highlight block, straight off the station's own key art */
.resalte{background:var(--rosa); color:#fff; padding:.02em .14em; border-radius:8px;
         box-decoration-break:clone; -webkit-box-decoration-break:clone;
         text-shadow:none}
h2 .resalte{background:var(--amarillo); color:#04306F}
.lede{margin:22px 0 0; color:#E8F3FF; font-size:clamp(17px,2.1vw,22px);
      line-height:1.58; max-width:44ch}
.eyebrow{margin:0 0 16px; font-size:clamp(12px,1.3vw,15px); letter-spacing:.26em;
         text-transform:uppercase; font-weight:700; color:var(--amarillo)}

/* ---- hero ------------------------------------------------------------ */
.hero{position:relative; overflow:hidden; display:grid; grid-template-columns:1.02fr .98fr;
      align-items:center; gap:clamp(6px,1.2vw,20px);
      min-height:min(62vh,660px);
      /* right gutter matches --borde so the art stops on the same grid as the
         nav and the on-air strip; the text column supplies its own left pad */
      padding:clamp(24px,3vw,44px) var(--borde) clamp(32px,4vw,60px)}
.hero-txt{width:100%; padding-right:clamp(16px,2vw,28px)}
.cta{display:flex; flex-wrap:wrap; gap:14px; margin-top:28px}
.btn-play{display:inline-flex; align-items:center; justify-content:center; gap:14px;
  min-height:72px; cursor:pointer; border:none; border-radius:999px; padding:0 32px 0 24px;
  background:var(--rosa); color:#fff; font-family:inherit; font-size:20px; font-weight:700;
  box-shadow:0 16px 38px rgba(255,60,119,.4); transition:transform .15s ease}
.btn-play:hover{transform:translateY(-3px)}
.btn-play:focus-visible{outline:3px solid var(--amarillo); outline-offset:4px}
.btn-play svg{width:34px; height:34px; fill:#fff; flex:none}
.btn-play .pause{display:none}
body.playing .btn-play .play{display:none}
body.playing .btn-play .pause{display:block}
.btn-ghost{display:inline-flex; align-items:center; justify-content:center; min-height:72px;
  text-decoration:none; border:3px solid rgba(255,255,255,.6); border-radius:999px;
  padding:0 28px; font-size:18px; font-weight:700}
.btn-ghost-oscuro{border-color:#04306F; color:#04306F}
.btn-ghost-oscuro:hover{background:#04306F; color:#fff; border-color:#04306F}
.btn-ghost:hover{background:rgba(255,255,255,.15); border-color:#fff}
.btn-ghost:focus-visible{outline:3px solid var(--amarillo); outline-offset:4px}
.hero-img{position:relative; margin:0; display:flex; align-items:center;
          justify-content:center}
.hero-img img{position:relative; display:block; width:100%; max-width:none; height:auto;
  max-height:min(58vh,650px); object-fit:contain; border-radius:5px;
  margin-inline:0; box-shadow:0 18px 44px rgba(0,8,36,.34)}

/* ---- destacados -------------------------------------------------------- */
.destacados{display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(14px,1.8vw,24px)}
.dest{position:relative; display:block; text-decoration:none; overflow:hidden;
  border-radius:28px; padding:clamp(26px,3vw,40px); min-height:clamp(240px,26vw,320px);
  background:#04306F; border:1px solid rgba(255,255,255,.22);
  transition:transform .18s ease, box-shadow .18s ease}
.dest:hover{transform:translateY(-6px); box-shadow:0 26px 54px rgba(0,8,36,.5)}
.dest:focus-visible{outline:4px solid var(--amarillo); outline-offset:4px}
.dest-n{position:absolute; right:.04em; bottom:-.24em; font-size:clamp(96px,12vw,168px);
  font-weight:700; font-style:italic; line-height:1; color:rgba(255,255,255,.13);
  pointer-events:none}
.dest h3{position:relative; font-size:clamp(25px,2.8vw,36px); font-weight:700; font-style:italic;
  letter-spacing:-.02em; line-height:1.02; margin-bottom:16px}
.dest p{position:relative; margin:0; font-size:17px; line-height:1.5; color:#CFE6FF}
.dest p b{display:inline-block; margin-top:4px; font-size:21px; color:var(--amarillo)}
.dest-rosa{background:var(--rosa-fuerte); border-color:rgba(255,255,255,.45)}
.dest-rosa p{color:#fff} .dest-rosa p b{color:var(--amarillo)}
.dest-amarillo{background:var(--amarillo); border-color:rgba(4,48,111,.3); color:#04306F}
.dest-amarillo .dest-n{color:rgba(4,48,111,.14)}
.dest-amarillo p{color:#0B3A7C} .dest-amarillo p b{color:#04306F}

/* ---- eventos y dinámicas ---------------------------------------------- */
.agenda{display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
        gap:clamp(14px,1.8vw,22px)}
.evento{background:#04306F; border:1px solid rgba(255,255,255,.22); border-radius:26px;
        overflow:hidden; display:flex; flex-direction:column;
        transition:transform .18s ease, box-shadow .18s ease}
.evento:hover{transform:translateY(-5px); box-shadow:0 24px 50px rgba(0,8,36,.46)}
.evento-img{position:relative; margin:0; aspect-ratio:3/2; background:#02265C}
.evento-img img{width:100%; height:100%; object-fit:cover; display:block}
.evento-cuerpo{padding:clamp(22px,2.4vw,30px); display:flex; flex-direction:column; gap:10px}
.ejemplo{position:absolute; top:12px; left:12px; z-index:2;
  background:rgba(2,26,64,.86); color:var(--amarillo); border:1px solid var(--amarillo);
  font-size:10.5px; font-weight:700; letter-spacing:.18em; text-transform:uppercase;
  padding:5px 11px; border-radius:999px; backdrop-filter:blur(4px)}
.evento .fecha{font-size:13px; font-weight:700; letter-spacing:.18em; text-transform:uppercase;
               color:var(--amarillo)}
.evento h3{font-size:clamp(22px,2.4vw,30px); font-weight:700; font-style:italic;
           letter-spacing:-.02em; line-height:1.1}
.evento p{margin:0; font-size:16.5px; color:#CFE6FF; line-height:1.55}
.evento .lugar{font-size:14.5px; color:var(--halo)}
.vacio-agenda{background:#04306F; border:2px dashed rgba(255,255,255,.34); border-radius:26px;
  padding:clamp(28px,4vw,48px); text-align:center}
.vacio-agenda h3{font-size:clamp(23px,2.6vw,32px); font-weight:700; font-style:italic;
                 margin-bottom:12px}
.vacio-agenda p{margin:0 auto 22px; max-width:46ch; font-size:17px; color:#CFE6FF; line-height:1.6}

/* ---- closing colour block --------------------------------------------- */
.cierre{background:var(--amarillo); color:#04306F; padding:clamp(52px,8vw,110px) 0;
        text-align:center; position:relative; z-index:2}
.cierre-k{margin:0 0 18px; font-size:clamp(12px,1.3vw,15px); letter-spacing:.26em;
          text-transform:uppercase; font-weight:700}
.cierre-h{margin:0; font-size:clamp(52px,11vw,150px); font-weight:700; font-style:italic;
  letter-spacing:-.04em; line-height:.88; text-transform:uppercase}
.cierre-l{margin:22px auto 34px; max-width:40ch; font-size:clamp(17px,2vw,21px); line-height:1.5}

/* ---- programación: one compact table, one line per programme ----------- */
.visualmente-oculto{position:absolute; width:1px; height:1px; overflow:hidden;
  clip:rect(0 0 0 0); white-space:nowrap}
.tabla-caja{border-radius:22px; overflow:hidden; border:1px solid rgba(255,255,255,.22);
  background:rgba(1,36,88,.5)}
.parrilla-tabla{width:100%; border-collapse:collapse; font-size:16px}
.parrilla-tabla th{text-align:left; font-size:11.5px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--halo); font-weight:700;
  padding:14px 18px; background:rgba(1,22,56,.6);
  border-bottom:1px solid rgba(255,255,255,.2)}
.parrilla-tabla td{padding:14px 18px; border-bottom:1px solid rgba(255,255,255,.12);
  vertical-align:middle}
.parrilla-tabla tr:last-child td{border-bottom:none}
.fila{transition:background .2s ease}
.fila:hover{background:rgba(255,255,255,.06)}

/* the time of day colours the row — a stripe on the left and the dot */
.punto{display:inline-block; width:10px; height:10px; border-radius:50%;
  background:var(--franja); margin-right:10px; vertical-align:middle;
  box-shadow:0 0 0 3px color-mix(in srgb, var(--franja) 28%, transparent)}
.fila td:first-child{box-shadow:inset 4px 0 0 var(--franja)}
.col-hora{white-space:nowrap; font-weight:700; font-variant-numeric:tabular-nums;
          font-size:15px; color:#EAF4FF}
.col-prog b{font-weight:700; font-size:17px}
.col-loc,.col-dias{color:#CFE6FF; white-space:nowrap}
.pill-franja{display:inline-block; padding:5px 11px; border-radius:999px;
  font-size:11px; font-weight:700; letter-spacing:.12em; text-transform:uppercase;
  background:color-mix(in srgb, var(--franja) 26%, transparent);
  border:1px solid color-mix(in srgb, var(--franja) 60%, transparent);
  color:var(--franja-txt, #fff); white-space:nowrap}

.franja-madrugada{--franja:#7C6BFF; --franja-txt:#D6D0FF}
.franja-manana   {--franja:#FFC44D; --franja-txt:#FFE1A3}
.franja-tarde    {--franja:#FF8A5B; --franja-txt:#FFD0BC}
.franja-noche    {--franja:#4FA8FF; --franja-txt:#C4E2FF}

/* the programme on air right now */
.al-aire{display:none}
.fila.live{background:var(--rosa-fuerte)}
.fila.live td{border-bottom-color:rgba(255,255,255,.3)}
.fila.live .col-hora,.fila.live .col-loc,.fila.live .col-dias{color:#fff}
.fila.live .al-aire{display:inline-block; margin-left:10px; vertical-align:middle;
  background:var(--amarillo); color:#04306F; font-size:10px; font-weight:700;
  letter-spacing:.14em; text-transform:uppercase; padding:4px 9px; border-radius:999px}
.fila.live .pill-franja{background:rgba(255,255,255,.22); border-color:rgba(255,255,255,.5);
  color:#fff}

@media (max-width:760px){
  .parrilla-tabla, .parrilla-tabla tbody{display:block}
  .parrilla-tabla thead{display:none}
  .fila{display:grid; grid-template-columns:auto 1fr; gap:2px 10px;
        padding:13px 16px; border-bottom:1px solid rgba(255,255,255,.14);
        box-shadow:inset 4px 0 0 var(--franja); align-items:baseline}
  .parrilla-tabla td{padding:0; border:none; display:block}
  .fila td:first-child{box-shadow:none}
  .col-hora{grid-column:1; font-size:13.5px}
  .col-franja{grid-column:2; justify-self:end}
  .col-prog{grid-column:1 / -1; margin-top:3px}
  .col-prog b{font-size:17px}
  .col-loc{grid-column:1 / -1; font-size:13.5px; color:var(--halo)}
  .col-loc::before{content:"con "}
  .col-dias{grid-column:1 / -1; font-size:13.5px; color:var(--halo); margin-top:-2px}
  .pill-franja{font-size:10px; padding:4px 9px}
}

/* ---- programación ---------------------------------------------------- */
.cabecera{padding:clamp(36px,4.6vw,68px) 0 clamp(8px,1vw,18px)}
.ejemplo.ejemplo-fila{position:static; display:inline-block; margin-left:8px;
                      vertical-align:middle; backdrop-filter:none}
.nota{margin-top:36px; border-radius:20px; padding:22px 26px;
      background:rgba(1,36,88,.5); border:1px solid rgba(255,255,255,.2); font-size:16.5px}
.nota p{margin:0}
.nota a{color:var(--amarillo); font-weight:700; display:inline-block; padding:10px 4px;
        min-height:44px; line-height:24px}

/* ---- locutores ------------------------------------------------------- */
.perfil{display:grid; grid-template-columns:minmax(300px,460px) 1fr; gap:clamp(24px,4vw,46px); align-items:start;
  background:rgba(1,36,88,.5); border:1px solid rgba(255,255,255,.22); border-radius:28px;
  padding:clamp(22px,3.4vw,38px)}
.perfil figure{margin:0; position:relative}
.perfil figure img{border-radius:26px; display:block; width:100%}
.perfil p{margin:0; font-size:clamp(17.5px,1.9vw,21px); line-height:1.6; color:#E8F3FF}
.shows{list-style:none; margin:26px 0; padding:0; display:flex; flex-direction:column; gap:12px}
.shows li{display:flex; flex-wrap:wrap; gap:6px 16px; align-items:baseline;
          border-bottom:1px solid rgba(255,255,255,.18); padding-bottom:12px}
.shows span{font-weight:700; font-size:clamp(19px,2vw,24px)}
.shows em{font-style:normal; font-size:14.5px; color:var(--amarillo); font-weight:700}

/* ---- locutor list ------------------------------------------------------ */
.perfiles{display:flex; flex-direction:column; gap:clamp(18px,2.4vw,30px);
          padding-bottom:clamp(30px,4vw,56px)}

/* ---- contacto -------------------------------------------------------- */
.tarjetas{display:grid; grid-template-columns:repeat(auto-fit,minmax(282px,1fr)); gap:18px}
.tarjeta{background:rgba(1,36,88,.5); border:1px solid rgba(255,255,255,.22);
         border-radius:24px; padding:28px}
.tarjeta h2{font-size:22px; margin-bottom:12px}
.tarjeta p{margin:0 0 12px; font-size:16.5px; color:#E8F3FF}
.tarjeta a{color:var(--amarillo); font-weight:700}
/* .tarjeta a would otherwise paint the WhatsApp button's label yellow on yellow */
.tarjeta .wa{color:#04306F}
.tarjeta p > a,.tarjeta a[href^="mailto"]{display:inline-block; padding:10px 4px;
         min-height:44px; line-height:24px; word-break:break-word}
.redes{list-style:none; margin:12px 0 0; padding:0; display:flex; flex-wrap:wrap; gap:6px 16px}
.redes a{text-decoration:none; font-weight:700; color:var(--amarillo);
         display:inline-flex; align-items:center; min-height:44px; min-width:44px}
.wa{display:inline-flex; align-items:center; justify-content:center; gap:12px; min-height:56px;
    text-decoration:none; background:var(--amarillo); color:#04306F; font-weight:700;
    font-size:17px; padding:0 26px; border-radius:999px; box-shadow:0 12px 30px rgba(0,14,48,.42)}
.wa:hover{filter:brightness(1.07)}

/* ---- contact form ------------------------------------------------------ */
.formulario{background:rgba(1,36,88,.55); border:1px solid rgba(255,255,255,.24);
  border-radius:28px; padding:clamp(24px,3.4vw,44px); margin-bottom:clamp(18px,2.4vw,30px)}
.formulario h2{font-size:clamp(26px,3.4vw,40px); margin-bottom:10px}
.form-intro{margin:0 0 26px; font-size:17px; color:#E8F3FF; max-width:48ch; line-height:1.55}
.campos{display:grid; grid-template-columns:1fr 1fr; gap:16px}
.campo{display:flex; flex-direction:column; gap:8px}
.campo-ancho{grid-column:1 / -1}
.campo > span{font-size:13px; font-weight:700; letter-spacing:.12em; text-transform:uppercase;
              color:var(--amarillo)}
.campo input,.campo select,.campo textarea{
  font-family:inherit; font-size:16.5px; color:#fff; min-height:54px;
  background:rgba(1,22,56,.72); border:1.5px solid rgba(255,255,255,.3);
  border-radius:14px; padding:14px 16px; width:100%}
.campo textarea{min-height:140px; resize:vertical; line-height:1.55}
.campo select{appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,#B3E0FF 50%),
                   linear-gradient(135deg,#B3E0FF 50%,transparent 50%);
  background-position:calc(100% - 22px) 24px, calc(100% - 15px) 24px;
  background-size:7px 7px,7px 7px; background-repeat:no-repeat}
.campo select option{background:#04306F; color:#fff}
.campo input::placeholder,.campo textarea::placeholder{color:rgba(199,225,255,.5)}
.campo input:focus,.campo select:focus,.campo textarea:focus{
  outline:none; border-color:var(--amarillo); box-shadow:0 0 0 3px rgba(255,241,0,.25)}
.form-nota{margin:14px 0 0; font-size:14px; color:var(--halo)}
.trampa{position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden}
.form-pie{display:flex; flex-wrap:wrap; gap:14px; align-items:center; margin-top:26px}
.form-pie .btn-play{padding:0 36px}
.form-estado{margin:18px 0 0; font-size:16px; font-weight:700; min-height:1.4em}
.form-estado.ok{color:var(--amarillo)}
.form-estado.mal{color:#FFD2DF}
.formulario.enviando{opacity:.75; pointer-events:none}

/* ---- nota de voz ------------------------------------------------------ */
/* Acá mucha gente manda audio y no escribe. Este bloque tiene que verse tan
   importante como la caja del mensaje, no como un extra escondido abajo. */
.grabar{margin:22px 0 0; padding:18px 20px; border-radius:16px;
  background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.22)}
.grabar-cab{display:flex; gap:13px; align-items:flex-start; margin-bottom:14px}
.grabar-icono{font-size:26px; line-height:1.1; flex:0 0 auto}
.grabar-cab b{display:block; font-size:16.5px; margin-bottom:3px}
.grabar-ayuda{display:block; font-size:13.5px; color:var(--halo); line-height:1.45}
.grabar-fila{display:flex; gap:13px; align-items:center; flex-wrap:wrap}
.btn-grabar,.btn-borrar{font-family:inherit; font-size:15px; font-weight:700;
  border-radius:999px; cursor:pointer; min-height:44px; padding:0 22px;
  border:2px solid var(--amarillo); background:transparent; color:var(--amarillo)}
.btn-grabar:hover,.btn-borrar:hover{background:var(--amarillo); color:#04306F}
.btn-grabar.grabando{background:var(--rosa); border-color:var(--rosa); color:#fff}
.btn-borrar{border-color:rgba(255,255,255,.35); color:var(--halo); font-size:14px;
  padding:0 16px}
.grabar-reloj{font-variant-numeric:tabular-nums; font-weight:700; font-size:17px;
  min-width:3.2em}
/* El reproductor no puede estirar la página en un teléfono. */
.grabar-oir{flex:1 1 200px; min-width:0; max-width:100%; height:40px}
.grabar-estado{margin:12px 0 0; font-size:14px; color:var(--halo); min-height:1.3em}
.grabar-estado.mal{color:#FFD2DF}

@media (max-width:640px){
  .campos{grid-template-columns:1fr}
  .grabar{padding:15px}
  .grabar-fila{gap:10px}
  .grabar-oir{flex-basis:100%}
}

/* ---- footer ---------------------------------------------------------- */
.pie{position:relative; z-index:2; margin-top:clamp(24px,3vw,48px);
     background:var(--hondo2); border-top:1px solid rgba(255,255,255,.14)}
.pie-deco{position:relative; height:clamp(120px,15vw,180px); margin-top:-1px;
          overflow:hidden; pointer-events:none}
.pie-deco .cinta{position:absolute; left:0; bottom:0; width:100%; height:100%}
.pie-deco .flor{position:absolute; left:-10px; bottom:0; width:clamp(126px,17vw,200px);
                filter:drop-shadow(0 10px 24px rgba(0,20,60,.5))}
.pie-cuerpo{width:100%; padding:clamp(34px,5vw,60px) var(--borde);
  display:grid; grid-template-columns:1.5fr 1fr 1.3fr 1.3fr; gap:clamp(26px,4vw,52px)}
.pie-logo{width:clamp(180px,15vw,232px); height:auto; display:block; margin-bottom:18px;
          filter:drop-shadow(0 6px 18px rgba(0,10,40,.5))}
.pie-col h3{font-size:13px; letter-spacing:.2em; text-transform:uppercase; color:var(--amarillo);
            font-weight:700; margin-bottom:16px}
.pie-col ul{list-style:none; margin:0; padding:0}
.pie-col li{margin-bottom:4px}
.pie-col li a{display:inline-flex; align-items:center; min-height:44px; min-width:44px;
              padding-right:6px; text-decoration:none; font-size:16px; color:#E4F1FF}
.pie-col li a:hover{color:var(--amarillo)}
.pie-nota,.pie-dir{margin:10px 0 0; font-size:14px; color:#A9C8EC; line-height:1.55}
.social{display:flex; gap:9px; flex-wrap:wrap; margin-top:16px}
.social a{display:inline-flex; align-items:center; justify-content:center;
  width:44px; height:44px; flex:none; text-decoration:none; color:#fff;
  border:1.5px solid rgba(255,255,255,.4); border-radius:50%;
  transition:background .15s ease, border-color .15s ease, transform .15s ease}
.social a:hover{transform:translateY(-2px)}
.social a:hover{background:rgba(255,255,255,.17); border-color:#fff}
.social a:focus-visible{outline:3px solid var(--amarillo); outline-offset:3px}
.pie-legal{width:100%; padding:20px var(--borde) 32px;
  border-top:1px solid rgba(255,255,255,.14); font-size:13.5px; color:#9FC0E8}
.pie-legal-fila{display:flex; flex-wrap:wrap; gap:8px 24px; justify-content:space-between}
.pie-credito{margin:16px 0 0; text-align:center; font-size:13.5px; color:#9FC0E8}
.pie-credito a{color:var(--halo); font-weight:700; text-decoration:underline;
               text-underline-offset:3px; display:inline-flex; align-items:center;
               padding:10px 2px; min-height:44px}
.pie-credito a:hover{color:var(--amarillo)}
/* Acceso al panel: solo en el pie, y deliberadamente discreto — es para el
   equipo de la estación, no para el oyente. */
.pie-sep{margin:0 4px; opacity:.55}
.pie-credito a.pie-panel{font-weight:400; text-decoration-thickness:1px;
  text-underline-offset:3px; opacity:.85}
.pie-credito a.pie-panel:hover{opacity:1}

/* ---- the fixed player bar -------------------------------------------- */
.reproductor{
  position:fixed; left:0; right:0; bottom:0; z-index:60;
  background:linear-gradient(180deg, rgba(1,33,78,.96), rgba(1,25,60,.99));
  border-top:2px solid var(--amarillo);
  backdrop-filter:blur(16px);
  padding-bottom:env(safe-area-inset-bottom,0px);
  box-shadow:0 -12px 34px rgba(0,8,30,.42);
}
.rep-caja{width:100%; height:var(--rep);
          padding:0 var(--borde); display:flex; align-items:center; gap:16px}
.rep-logo{width:58px; height:58px; flex:none; object-fit:contain;
          filter:drop-shadow(0 3px 10px rgba(0,10,40,.5))}
.rep-txt{display:flex; flex-direction:column; min-width:0; margin-right:auto; line-height:1.25}
.rep-k{font-size:11.5px; letter-spacing:.18em; text-transform:uppercase; font-weight:700;
       white-space:nowrap;
       color:var(--halo); display:inline-flex; align-items:center; gap:8px}
.rep-k .dot{width:9px; height:9px; border-radius:50%; background:rgba(255,241,0,.42); flex:none}
body.playing .rep-k .dot{background:var(--amarillo); animation:blip 1.6s ease-out infinite}
@keyframes blip{0%{box-shadow:0 0 0 0 rgba(255,241,0,.75)}100%{box-shadow:0 0 0 13px rgba(255,241,0,0)}}
.rep-v{font-size:18px; font-weight:700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.rep-btn{flex:none; width:62px; height:62px; border-radius:50%; cursor:pointer; padding:0;
  border:4px solid var(--amarillo); background:var(--rosa); color:#fff; display:grid;
  place-items:center; transition:transform .15s ease;
  box-shadow:0 10px 26px rgba(255,60,119,.42)}
.rep-btn:hover{transform:scale(1.06)}
.rep-btn:focus-visible{outline:4px solid var(--amarillo); outline-offset:4px}
.rep-btn svg{width:26px; height:26px; fill:#fff; pointer-events:none}
.rep-btn .pause{display:none}
body.playing .rep-btn .play{display:none}
body.playing .rep-btn .pause{display:block}
body.loading .rep-btn{animation:latir 1.1s ease-in-out infinite}
/* interrupted by another app: the button invites a tap back rather than
   looking like an ordinary stopped state */
body.interrumpido .rep-btn,
body.interrumpido .alaire-btn{box-shadow:0 0 0 3px rgba(255,241,0,.55)}
body.interrumpido .rep-k .dot{background:var(--amarillo)}
@keyframes latir{50%{transform:scale(.93); opacity:.75}}

/* ---- fallbacks ------------------------------------------------------- */
.sin-js{width:100%; padding:16px var(--borde); text-align:center;
        background:rgba(255,241,0,.15); font-size:16px}
.sin-js a{color:var(--amarillo); font-weight:700}
.directo{display:inline-flex; align-items:center; min-height:44px; margin-top:12px;
         color:var(--amarillo); font-weight:700; font-size:16px}

/* ---- responsive ------------------------------------------------------ */
@media (max-width:1040px){
  .pie-cuerpo{grid-template-columns:1fr 1fr}
}
@media (max-width:920px){
  .parrilla{grid-template-columns:1fr}
  .dias-tabs{display:flex}
  .dia{display:none}
  .dia.activo{display:block}
  .perfil{grid-template-columns:1fr}
  .perfil figure{max-width:320px}
}
@media (max-width:980px){
  .destacados{grid-template-columns:1fr}
  .dest{min-height:0}
}
@media (max-width:800px){
  .hero{grid-template-columns:1fr; min-height:0; padding-top:0; gap:0; padding-right:0}
  .hero-txt{padding:clamp(28px,6vw,44px) var(--pad) 0}
  .hero-img{order:-1}
  .hero-img img{width:100%; margin-inline:0; max-height:none; border-radius:5px}
  .nav{position:absolute; top:100%; right:var(--pad); flex-direction:column; gap:3px;
    background:#04306F; border:1px solid rgba(255,255,255,.24); border-radius:18px;
    padding:9px; min-width:212px; box-shadow:0 20px 46px rgba(0,8,34,.55)}
  .nav:not(.abierto){display:none}
  .menu{display:block}
}
@media (max-width:640px){
  :root{--rep:78px}
  .pie-cuerpo{grid-template-columns:1fr; gap:26px}
  .pie-legal{flex-direction:column; gap:6px}
  .marca img{width:74px}
}
@media (max-width:480px){
  .rep-logo{width:50px; height:50px}
  .rep-btn{width:56px; height:56px}
  .rep-v{font-size:16px}
  .social a span{display:none}
  .social a{padding:0; width:52px; height:52px; border-radius:50%}
}
@media (prefers-reduced-motion:reduce){*{animation:none!important; transition:none!important}}

/* Mapa de /eventos/. Reusa la caja del mapa de El Tráfico, pero más bajo:
   acá el mapa acompaña a las tarjetas, no es el contenido principal. */
.mapa-eventos-caja{margin-top:26px}
.mapa-eventos-caja .mapa{height:min(46vh,380px)}
.evento[data-i]{cursor:pointer}
.evento.activo{outline:3px solid var(--amarillo); outline-offset:3px}
@media (max-width:700px){ .mapa-eventos-caja .mapa{height:300px} }

/* ------------------------------------------------------------- pauta ----- */
/* Los espacios de publicidad. Cuando no hay anuncio el contenedor va `hidden`
   y no ocupa nada: el sitio no debe verse "con huecos" sin pauta vendida. */
.pauta{position:relative; min-width:0}
.pauta img{display:block; width:100%; height:auto; border-radius:10px}
.pauta a{display:block; text-decoration:none}
.pauta-tag{position:absolute; top:5px; right:7px; font-size:10px; letter-spacing:.06em;
  text-transform:uppercase; padding:2px 7px; border-radius:99px;
  background:rgba(2,18,48,.62); color:#E7EFFA; pointer-events:none}
.pauta-banda{width:100%; margin:0 0 6px}
.pauta-banda img{border-radius:0; max-height:110px; object-fit:cover}
.pauta-chica{flex:0 0 auto; max-width:190px}
.pauta-chica img{max-height:52px; object-fit:contain}
.pauta-chica .pauta-tag{font-size:9px; top:2px; right:3px; padding:1px 5px}
.pauta-pagina{margin:8px 0 22px}
.pauta-pagina img{max-height:220px; object-fit:cover}
.pauta-popup{border:0; border-radius:16px; padding:10px; max-width:min(92vw,460px);
  box-shadow:0 30px 80px rgba(0,8,30,.55)}
.pauta-popup::backdrop{background:rgba(2,12,34,.62)}
.pauta-cerrar{position:absolute; top:-10px; right:-10px; width:34px; height:34px;
  border-radius:50%; border:2px solid #fff; background:var(--azul, #00418B); color:#fff;
  cursor:pointer; display:grid; place-items:center; box-shadow:0 6px 18px rgba(0,0,0,.35)}
@media (max-width:760px){
  .pauta-chica{max-width:120px}
  .pauta-chica img{max-height:40px}
  .pauta-banda img{max-height:74px}
}


/* =======================================================================
   BOTÓN SIEMPRE VISIBLE + DIÁLOGO PARA ESCRIBIRLE A LA RADIO
   =======================================================================
   Por qué el botón está acá y no adentro de la barra del reproductor:
   MEDIDO en navegador, a 320 px quedan 16 px libres entre el texto
   «En vivo · 95.1 FM» y el botón de play (26 px a 390 px). No cabe nada.
   Así que flota justo encima, alineado al mismo borde derecho que el play.

   Las tres cosas que lo mantienen honesto:
   1. Se cuelga de `--rep`, la MISMA variable de la que cuelga el alto de la
      barra. Si la barra cambia de alto, el botón se mueve con ella; no hay
      dos números que se puedan desincronizar.
   2. `z-index` 55 contra 60 de la barra, A PROPÓSITO. La geometría ya los
      separa; esto es el seguro: si algún día se cruzan, gana la barra, que
      es lo que el dueño dijo que no se puede tapar.
   3. Su alto entra en el `padding-bottom` del body (arriba), así que no
      tapa el final del contenido de ninguna página.
   ======================================================================= */
.fab-escribir{
  position:fixed; z-index:55;
  right:var(--borde);
  bottom:calc(var(--rep) + env(safe-area-inset-bottom, 0px) + var(--fab-sep));
  display:inline-flex; align-items:center; gap:9px;
  min-height:var(--fab); padding:0 18px;
  font-family:inherit; font-size:15px; font-weight:700; line-height:1.15;
  color:#fff; background:var(--rosa); cursor:pointer;
  border:2.5px solid var(--amarillo); border-radius:999px;
  box-shadow:0 10px 26px rgba(0,8,30,.5);
  transition:transform .15s ease;
}
.fab-escribir:hover{transform:translateY(-2px)}
.fab-escribir:focus-visible{outline:4px solid var(--amarillo); outline-offset:3px}
.fab-escribir svg{flex:none}
/* Con el diálogo abierto el botón sobra: el foco está adentro y la página de
   atrás es inerte. Se esconde para que no asome por debajo del fondo. */
body:has(.dlg-escribir[open]) .fab-escribir{opacity:0; pointer-events:none}
/* Y la página de atrás no se desplaza mientras se escribe. */
body:has(.dlg-escribir[open]){overflow:hidden}

/* ---- el diálogo: hoja que sube en el teléfono, panel centrado en pantalla -- */
.dlg-escribir{
  border:0; padding:0; background:transparent; color:#fff;
  width:100%; max-width:560px; max-height:var(--hoja);
  margin:auto auto 0;              /* pegado abajo: ahí está el pulgar */
  overscroll-behavior:contain;
}
.dlg-escribir::backdrop{background:rgba(1,14,40,.74)}
.dlg-escribir-in{
  max-height:var(--hoja); overflow-y:auto; -webkit-overflow-scrolling:touch;
  background:linear-gradient(180deg,#04306F,#01214E);
  border:1px solid rgba(255,255,255,.22);
  border-top:3px solid var(--amarillo);
  border-radius:22px 22px 0 0;
  padding:16px 16px calc(20px + env(safe-area-inset-bottom, 0px));
}
.dlg-escribir-cab{display:flex; align-items:flex-start; gap:12px; margin-bottom:16px}
.dlg-escribir-cab h2{font-size:clamp(20px,5.2vw,26px); margin:0; line-height:1.2}
.dlg-escribir-lede{margin:6px 0 0; font-size:14px; color:var(--halo); line-height:1.45}
.dlg-escribir-x{
  flex:none; margin-left:auto; width:44px; height:44px; border-radius:50%;
  display:grid; place-items:center; cursor:pointer; color:#fff;
  background:rgba(255,255,255,.12); border:1.5px solid rgba(255,255,255,.34);
}
.dlg-escribir-x:hover{background:rgba(255,255,255,.22)}
.dlg-escribir-x:focus-visible{outline:3px solid var(--amarillo); outline-offset:2px}

/* Adentro del diálogo el formulario no lleva su propia caja: la caja es el
   diálogo. Y una sola columna, siempre: el panel mide 560 px como mucho. */
.dlg-escribir .formulario{background:none; border:0; border-radius:0; padding:0; margin:0}
.dlg-escribir .campos{grid-template-columns:1fr}
.dlg-escribir .form-pie{margin-top:20px}
.dlg-escribir .form-pie .btn-play{width:100%}

@media (min-width:760px){
  .dlg-escribir{margin:auto}
  .dlg-escribir-in{border-radius:22px; border-top-width:3px; padding:24px}
}

/* ---- los tres motivos --------------------------------------------------
   Son `<input type="radio">` de verdad, tapados con .visualmente-oculto y NO
   con display:none — que los sacaría del orden de tabulación. Así el valor
   viaja en `asunto` sin JavaScript, las flechas navegan entre ellos y el
   lector de pantalla los anuncia como grupo. */
.motivos{border:0; padding:0; margin:0 0 18px; min-width:0}
.motivos legend{padding:0; margin-bottom:10px; font-size:13px; font-weight:700;
  letter-spacing:.12em; text-transform:uppercase; color:var(--amarillo)}
/* auto-fit y no un número: hoy son dos motivos y ayer eran tres. La fila se
   acomoda sola a los que haya, sin que agregar uno sea rehacer la regla. */
.motivos-fila{display:grid; grid-template-columns:repeat(auto-fit,minmax(84px,1fr));
  gap:8px}
.motivo{display:block; min-width:0}
.motivo-cara{
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:7px; min-height:78px; padding:10px 5px; text-align:center;
  font-size:13px; font-weight:700; line-height:1.22; color:#fff;
  background:rgba(1,22,56,.72); border:1.5px solid rgba(255,255,255,.3);
  border-radius:14px; cursor:pointer; transition:background .12s ease;
}
.motivo-cara svg{flex:none}
.motivo:hover .motivo-cara{background:rgba(255,255,255,.14)}
.motivo input:checked + .motivo-cara{
  background:var(--rosa); border-color:var(--amarillo);
  box-shadow:0 6px 18px rgba(255,60,119,.35)}
.motivo input:focus-visible + .motivo-cara{outline:3px solid var(--amarillo); outline-offset:3px}


/* ---- videos: la fachada ------------------------------------------------
   Ver `parches/videos-portada.aplicar-estilo-css.py` para qué se reusa, por
   qué `.evento-img` no, y por qué los tres huecos miden 16/9. */
.vid{padding:0; overflow:hidden; display:flex; flex-direction:column}
/* La caja es un <button> (o un <a> cuando no reconocemos la URL): hay que
   apagarle el borde y el relleno que le pone el navegador, o la miniatura sale
   con un marco gris. */
.vid-caja{display:block; position:relative; width:100%; aspect-ratio:16/9;
  margin:0; padding:0; border:0; background:#02265C; color:inherit;
  font:inherit; text-align:left; cursor:pointer; overflow:hidden}
.vid-cara{position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; display:block; border:0}
.vid-play{position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  display:flex; align-items:center; justify-content:center;
  width:64px; height:64px; border-radius:50%; background:var(--rosa);
  box-shadow:0 6px 20px rgba(0,0,0,.45); transition:transform .12s ease}
.vid-play svg{width:30px; height:30px; fill:#fff; margin-left:4px}
/* Abajo a la izquierda porque `.ejemplo` ya ocupa arriba a la izquierda. */
.vid-red{position:absolute; left:12px; bottom:12px; padding:5px 10px;
  border-radius:999px; background:rgba(1,22,56,.86); color:#fff;
  font-size:12px; font-weight:700; letter-spacing:.04em; line-height:1.2}
.vid-caja:hover .vid-play{transform:translate(-50%,-50%) scale(1.08)}
.vid-caja:focus-visible{outline:3px solid var(--amarillo); outline-offset:-3px}
.vid-cuerpo{padding:16px 20px 20px; display:flex; flex-direction:column; gap:6px}
.vid-t{font-size:19px; line-height:1.28; margin:0}
.vid-aviso{margin:0; font-size:13.5px; color:#BFD8F5}
/* El reproductor del tercero, ya montado. Mismo alto que la fachada que
   reemplaza: la tarjeta no salta cuando ella toca. */
.vid-marco{display:block; width:100%; aspect-ratio:16/9; border:0; background:#000}
.vid-cerrar{display:block; width:100%; min-height:48px; margin-top:auto;
  padding:12px 16px; border:0; border-top:1px solid rgba(255,255,255,.22);
  background:rgba(255,255,255,.12); color:#fff; font:inherit; font-weight:700;
  cursor:pointer}
.vid-cerrar:hover{background:rgba(255,255,255,.22)}
.vid-cerrar:focus-visible{outline:3px solid var(--amarillo); outline-offset:-3px}
.vid-mas{margin-top:clamp(22px,2.6vw,32px)}


/* ---- la puerta de El Tráfico -------------------------------------------
   Ver `parches/calle-puerta.aplicar-estilo-css.py` para qué se reusa y por qué
   la banda de confianza se ve distinta de un aviso de la emisora. */
.calle-alta{margin-top:clamp(26px,3vw,40px); background:rgba(1,36,88,.5);
  border:1px solid rgba(255,255,255,.22); border-radius:24px;
  padding:clamp(22px,2.6vw,32px)}
.calle-alta-t{font-size:clamp(22px,2.6vw,30px); margin:0 0 8px}
.calle-alta-l{margin:0 0 22px; font-size:16px; color:#CFE6FF; line-height:1.55}
.calle-alta-l strong{color:var(--amarillo)}
/* El tipo elegido toma SU color, no el rosa de por omisión: es el mismo color
   con el que va a salir el pin, así que ella ve de antemano qué está eligiendo.
   `--c` y `--t` los escribe `build.py` leyéndolos de `TIPOS`, que es la única
   lista de tipos que hay. */
.calle-tipos{margin-bottom:20px}
.calle-tipo input:checked + .motivo-cara{background:var(--c); color:var(--t);
  border-color:#fff; box-shadow:0 6px 18px rgba(0,0,0,.35)}
.calle-punto{display:flex; flex-wrap:wrap; align-items:center; gap:12px 16px;
  margin-top:20px}
/* Más chico que el `.btn-ghost` de la portada: acá es un control de formulario
   y no la llamada principal de una sección. */
.calle-marcar{min-height:52px; font-size:16px; padding:0 22px; border-width:2px;
  background:none; color:#fff; font-family:inherit; cursor:pointer}
.calle-punto-txt{font-size:15px; color:var(--halo); font-weight:700}
.calle-quitar{min-height:44px; padding:0 12px; border:0; background:none;
  color:#FFD2DF; font:inherit; font-weight:700; text-decoration:underline;
  cursor:pointer}
.calle-pie{margin-top:24px}
.calle-enviar{width:100%}
@media (min-width:620px){ .calle-enviar{width:auto; min-width:280px} }
/* En el escritorio, la cruz. En un teléfono no hay cursor: la señal de verdad
   es el texto y el rótulo del botón, que los escribe `app.js`. */
body.calle-apuntando .mapa{cursor:crosshair}
body.calle-apuntando .mapa-caja{outline:3px solid var(--amarillo); outline-offset:3px}

/* ---- cuánto creerle a cada aviso --------------------------------------- */
.calle-banda{display:inline-block; margin-top:8px; padding:4px 10px;
  border-radius:999px; background:rgba(255,255,255,.12);
  border:1px solid rgba(255,255,255,.28); color:#D9E8FA;
  font-size:12.5px; font-weight:700; line-height:1.35}
.calle-banda-conf{background:rgba(79,168,255,.18); border-color:rgba(79,168,255,.5);
  color:#C4E2FF}

/* ---- «yo también lo vi» ------------------------------------------------- */
.calle-conf{margin-top:10px}
.calle-conf-btn{min-height:44px; padding:0 16px; border-radius:999px;
  border:2px solid rgba(255,255,255,.45); background:none; color:#fff;
  font:inherit; font-size:14.5px; font-weight:700; cursor:pointer}
.calle-conf-btn:hover{background:rgba(255,255,255,.16); border-color:#fff}
.calle-conf-btn:focus-visible{outline:3px solid var(--amarillo); outline-offset:2px}
.calle-conf-btn[disabled]{opacity:.6; cursor:default}
.calle-conf-nota{display:inline-block; font-size:13.5px; color:var(--halo);
  font-weight:700; padding:6px 0}
.calle-conf-mal{color:#FFD2DF; margin-left:8px}


/* ---- carrusel de la cabecera -------------------------------------------
   Ver `parches/hero-carrusel.aplicar-estilo-css.py`. Con UNA sola diapositiva
   `build.py` no emite el envoltorio y nada de esto se usa. */
.hero-car{position:relative}
.hero-car-pista{position:relative}

/* ESTA LÍNEA ES LA QUE NO SE PUEDE PERDER.
   `[hidden]` vale `display:none` desde la hoja del NAVEGADOR, y `.hero` trae
   `display:grid` desde la del autor: el autor gana siempre. Sin esto, las
   cinco diapositivas se ven apiladas, con `hidden` puesto y sin un solo error
   en consola. */
.hero-car-d[hidden]{display:none !important}

.hero-car-flecha{
  position:absolute; top:50%; transform:translateY(-50%); z-index:3;
  display:flex; align-items:center; justify-content:center;
  width:44px; height:44px; padding:0; border-radius:50%;
  border:2px solid rgba(255,255,255,.55); background:rgba(1,22,56,.72);
  color:#fff; cursor:pointer; transition:background .12s ease}
.hero-car-flecha:hover{background:var(--rosa); border-color:#fff}
.hero-car-flecha:focus-visible{outline:3px solid var(--amarillo); outline-offset:3px}
.hero-car-antes{left:clamp(4px,1.5vw,14px)}
.hero-car-sig{right:clamp(4px,1.5vw,14px)}

.hero-car-puntos{
  position:absolute; left:0; right:0; bottom:clamp(6px,1.4vw,16px); z-index:3;
  display:flex; justify-content:center; align-items:center; gap:2px}
/* El blanco de TOQUE mide 44; el punto que se VE mide 10. Un punto de 44 px es
   una pelota, y uno de 10 px no se puede tocar en un teléfono. */
.hero-car-punto{
  width:44px; height:44px; padding:0; border:0; background:none;
  display:flex; align-items:center; justify-content:center; cursor:pointer}
.hero-car-punto::before{
  content:""; display:block; width:10px; height:10px; border-radius:50%;
  background:rgba(255,255,255,.45); box-shadow:0 1px 4px rgba(0,0,0,.5);
  transition:background .12s ease, transform .12s ease}
.hero-car-punto[aria-current="true"]::before{background:var(--amarillo); transform:scale(1.35)}
.hero-car-punto:hover::before{background:#fff}
.hero-car-punto:focus-visible{outline:3px solid var(--amarillo); outline-offset:-6px;
  border-radius:50%}

/* En un teléfono la cabecera se apila y las flechas encima de la foto tapan
   media cara. Bajan al borde inferior, al lado de los puntos. */
@media (max-width:760px){
  .hero-car-flecha{top:auto; bottom:clamp(6px,1.4vw,16px); transform:none}
  .hero-car-antes{left:clamp(8px,4vw,20px)}
  .hero-car-sig{right:clamp(8px,4vw,20px)}
}


/* ---- la caja del carrusel no cambia de alto ----------------------------
   Ver `parches/hero-caja-fija.aplicar-estilo-css.py`. Medido: sin esto, pasar
   de diapositiva movía 32 px lo que está debajo del hero, sin ningún error.
   Todo va bajo `.hero-car-d`, que sólo existe con más de una diapositiva: con
   una sola, nada de esto se aplica. */
.hero-car-d .hero-img{height:min(58vh,650px)}
.hero-car-d .hero-img img{height:100%; max-height:none; object-fit:contain}

/* Y ABAJO DE 800 px TAMBIÉN, que es la parte que no es opcional: ahí
   `estilo.css:693` pone `max-height:none`, o sea que NO hay techo que amortigüe,
   y `order:-1` manda la foto primero — así que el salto empuja el botón de
   escuchar fuera de pantalla justo donde la oyente vino a apretarlo. */
@media (max-width:800px){
  .hero-car-d .hero-img{height:min(46vh,340px)}
}
