/**
 * ZARZA Player — la piel.
 *
 * NEGRO DE CRISTAL. Decision de Lawrence (2-sep-2026): el player deja de ser
 * rojo. El rojo es de la MARCA -- las ocho puertas son rojas de arriba abajo --
 * y una barra roja sobre una pagina roja no se distingue de la pagina; en
 * TicosLand, encima, era una banda roja a lo ancho metida en la cabecera de un
 * tema ajeno. El player tiene que poder posarse sobre CUALQUIER sitio, tambien
 * el de un cliente, sin discutir con sus colores.
 *
 * Del rojo solo queda el punto de AL AIRE, de 6 px: es convencion universal y se
 * lee de un vistazo sin tener que leer nada.
 *
 * Dos formas, un solo componente:
 *   .zzp-fijo       la barra de siempre, pegada abajo
 *   .zzp-incrustado dentro de un contenedor de la pagina (el embed)
 * Dos tamanos:
 *   .zzp-mini       una linea: que suena y el boton. Es como nace.
 *   .zzp-abierto    ademas progreso, saltos, volumen y velocidad.
 */

.zzp{
  /* La paleta es PROPIA y no hereda del tema: si el sitio de un cliente define
     --zz-* con otra cosa, el player no puede cambiar de aspecto por sorpresa. */
  --zzp-fondo:rgba(9,9,11,.72);
  --zzp-fondo-solido:#0b0b0d;
  --zzp-tinta:#f5f3f1;
  --zzp-tenue:rgba(245,243,241,.60);
  --zzp-linea:rgba(255,255,255,.10);
  --zzp-vivo:#ff3b30;

  background:var(--zzp-fondo);
  color:var(--zzp-tinta);
  font-family:var(--zz-cuerpo,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif);
  -webkit-backdrop-filter:blur(20px) saturate(1.4);
  backdrop-filter:blur(20px) saturate(1.4);
}
/* Sin desenfoque no puede quedarse translucido: se leeria la pagina a traves del
   texto. Ahi el fondo pasa a solido, que es feo pero legible. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .zzp{background:var(--zzp-fondo-solido)}
}

.zzp[hidden]{display:none}

/* --- pegada abajo --------------------------------------------------- */
.zzp-fijo{
  position:fixed;left:0;right:0;bottom:0;z-index:9990;
  border-top:1px solid var(--zzp-linea);
  box-shadow:0 -18px 50px -30px rgba(0,0,0,.95);
  transform:translateY(100%);transition:transform .28s ease;
}
.zzp-fijo.zzp-visible{transform:translateY(0)}
/* 🔴 Valores literales, y NO hay variable que los acompane. Hubo dos
   -- `--zzp-alto-mini` y `--zzp-alto` -- y no las leia nadie: viven en `.zzp`,
   que es DESCENDIENTE de body, asi que desde aqui no se ven y el `var()` caia
   siempre al respaldo. Una variable que promete gobernar una medida y no la
   gobierna es peor que no tenerla, asi que se retiraron. Cambiar el alto del
   player es tocar estos dos numeros y el `padding` de `.zzp-caja`. */
body.zzp-con-player{padding-bottom:56px}
body.zzp-con-player.zzp-cuerpo-abierto{padding-bottom:88px}

/* --- incrustado en la pagina (el embed) ------------------------------ */
.zzp-incrustado{
  position:relative;border:1px solid var(--zzp-linea);border-radius:12px;
  box-shadow:0 20px 50px -35px rgba(0,0,0,.8);
  background:var(--zzp-fondo-solido);   /* aqui no hay pagina detras que velar */
}

/* --- la onda: el FONDO de la barra entera ---------------------------- */
/* 🔴 Ocupa toda la anchura, detras del contenido. Antes eran doce barritas en
   una esquina y no se leia como sonido: se leia como un icono. Ahora la barra
   ENTERA se mueve mientras suena, que es lo que se pidio. */
/* 🔴 SIN `position` AQUI. Este bloque va DESPUES de `.zzp-fijo{position:fixed}`
   y tiene la misma especificidad, asi que un `position:relative` lo pisaba: la
   barra dejaba de estar pegada a la ventana y se quedaba al final del documento
   -- «abajo abajo», que es como lo describio Lawrence al encontrarlo en una
   ficha de podcast. La onda no lo necesita: sus dos anclajes, `.zzp-fijo`
   (fixed) y `.zzp-incrustado` (relative), ya son contextos posicionados. */
.zzp{overflow:hidden;isolation:isolate}
.zzp-onda{
  position:absolute;inset:0;z-index:0;display:flex;align-items:flex-end;
  gap:1px;padding:0 2px;pointer-events:none;
}
.zzp-onda i{
  flex:1 1 0;min-width:0;height:100%;display:block;border-radius:1px 1px 0 0;
  transform:scaleY(.03);transform-origin:50% 100%;
  background:linear-gradient(to top,
    rgba(255,255,255,.16) 0%, rgba(255,255,255,.075) 55%, rgba(255,255,255,.02) 100%);
  transition:transform .5s cubic-bezier(.2,.7,.3,1);
}
/* Mientras suena manda el requestAnimationFrame: sin transicion, o cada cuadro
   arrastraria el anterior y la onda iria medio segundo por detras del sonido. */
.zzp.zzp-sonando .zzp-onda i{transition:none}
/* Al aire, la onda se tine del rojo del directo -- muy poco, lo justo para que
   se distinga de un fichero. */
.zzp.zzp-aire.zzp-sonando .zzp-onda i{
  background:linear-gradient(to top,
    color-mix(in srgb, var(--zzp-vivo) 26%, rgba(255,255,255,.16)) 0%,
    rgba(255,255,255,.07) 55%, rgba(255,255,255,.02) 100%);
}

.zzp-caja{position:relative;z-index:1;display:flex;align-items:center;gap:.85rem;
  max-width:1400px;margin:0 auto;padding:.55rem clamp(.7rem,2.2vw,1.5rem)}

.zzp-mandos{flex:0 0 auto;display:flex;align-items:center;gap:.3rem}


/* --- botones ---------------------------------------------------------- */
.zzp-btn{border:0;background:none;color:inherit;cursor:pointer;display:grid;
  place-items:center;padding:0;line-height:0}

/* ======================================================================= */
/*  EL DISCO ES EL BOTON DE PLAY. Un solo elemento, tres caras:            */
/*                                                                         */
/*    detenido        -> boton de play, blanco hueso con el glifo negro     */
/*    sonando         -> disco de vinilo girando (o la caratula)            */
/*    sonando + raton -> la PAUSA, sobre el disco                           */
/*                                                                         */
/*  🔴 Estuvieron separados y era un error: dos circulos seguidos, uno      */
/*  decorativo y otro pulsable, compitiendo por la misma mirada -- y a      */
/*  pantalla completa, un disco enorme con un boton suelto debajo.          */
/*                                                                         */
/*  🔴 La cara del disco va en un `::before` porque es LO UNICO QUE GIRA.   */
/*  Rotando el elemento entero, los glifos giraban con el y la pausa salia  */
/*  inclinada en un angulo cualquiera.                                      */
/* ======================================================================= */
.zzp-play{width:40px;height:40px;flex:0 0 auto;border-radius:50%;position:relative;
  background:var(--zzp-tinta);isolation:isolate;
  transition:background-color .25s ease,transform .15s ease,width .2s ease,height .2s ease}
.zzp-play::before{content:"";position:absolute;inset:0;border-radius:50%;z-index:0;
  opacity:0;transition:opacity .25s ease;
  background:
    radial-gradient(circle at 50% 50%, #2e2e33 0 15%, transparent 15.5%),
    repeating-radial-gradient(circle at 50% 50%,
      rgba(255,255,255,.055) 0 1px, rgba(0,0,0,0) 1px 3px),
    radial-gradient(circle at 34% 28%, #26262b 0%, #0a0a0c 62%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
/* El disco se ve desde que HAY PISTA, no solo mientras suena: en pausa se
   atenua y el play se queda encima. Sin fuente si es un boton de play a secas,
   que es cuando no hay ninguna identidad que conservar todavia. */
.zzp.zzp-con-fuente .zzp-play{background:transparent}
.zzp.zzp-con-fuente .zzp-play::before{opacity:1}
.zzp.zzp-con-fuente:not(.zzp-sonando) .zzp-play::before{opacity:.5}
.zzp.zzp-con-fuente:not(.zzp-sonando) .zzp-play::after{content:"";position:absolute;
  inset:0;border-radius:50%;z-index:2;background:rgba(0,0,0,.42)}
.zzp.zzp-con-fuente:not(.zzp-sonando) .zzp-play .zzp-i-play{fill:#fff}
.zzp.zzp-gira .zzp-play::before{animation:zzp-gira 2.6s linear infinite}
@keyframes zzp-gira{to{transform:rotate(360deg)}}
/* Con caratula, picture disc: la imagen es la cara del disco. La pone el JS en
   una VARIABLE, no en `background-image`, para que viaje al `::before`. */
.zzp-play.zzp-portada::before{background-image:var(--zzp-portada);
  background-size:cover;background-position:center;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.18),inset 0 0 14px rgba(0,0,0,.55)}
/* El agujero central NO gira: esta centrado y girarlo no se veria, pero si
   arrastraria al resto si colgara del `::before`. */
.zzp-play > i{display:none;position:absolute;left:50%;top:50%;z-index:1;
  width:20%;height:20%;min-width:7px;min-height:7px;border-radius:50%;
  transform:translate(-50%,-50%);background:rgba(255,255,255,.22);
  box-shadow:0 0 0 3px rgba(0,0,0,.6)}
.zzp.zzp-con-fuente .zzp-play > i{display:block}
.zzp-play.zzp-portada > i{box-shadow:0 0 0 3px rgba(0,0,0,.78)}
/* Los glifos, SIEMPRE derechos y por encima de todo. */
.zzp-play svg{position:relative;z-index:3;width:18px;height:18px;fill:#0b0b0d}
.zzp-play .zzp-i-pausa{display:none}
/* Sonando no hay glifo: se ve el disco. */
.zzp.zzp-sonando .zzp-play .zzp-i-play{display:none}
/* ...hasta que se pasa el raton por encima. Entonces, la pausa sobre el disco,
   con un velo oscuro detras para que se lea tambien sobre una caratula clara. */
.zzp.zzp-sonando .zzp-play:hover::after,
.zzp.zzp-sonando .zzp-play:focus-visible::after{content:"";position:absolute;
  inset:0;border-radius:50%;z-index:2;background:rgba(0,0,0,.55)}
.zzp.zzp-sonando .zzp-play:hover .zzp-i-pausa,
.zzp.zzp-sonando .zzp-play:focus-visible .zzp-i-pausa{display:block;fill:#fff}
.zzp.zzp-sonando .zzp-play:hover > i,
.zzp.zzp-sonando .zzp-play:focus-visible > i{display:none}
.zzp-play:hover,.zzp-play:focus-visible{transform:scale(1.06)}
.zzp-chico{width:28px;height:28px;opacity:.6;border-radius:50%}
.zzp-chico svg{width:15px;height:15px;fill:currentColor}
.zzp-chico:hover,.zzp-chico:focus-visible{opacity:1;background:rgba(255,255,255,.08)}
.zzp-cerrar svg,.zzp-abrir svg{fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}
/* 🔴 CERRAR NACE APAGADO. En zarza y en TicosLand el player es un elemento
   principal y no interesa que se pueda apagar: se enciende con
   `ZZP.permiteCerrar`. A pantalla completa se muestra SIEMPRE, porque alli la X
   significa otra cosa -- salir de la vista -- y una vista a pantalla completa
   sin salida visible es una trampa. Y entonces el chevron sobra: los dos harian
   exactamente lo mismo. */
.zzp-cerrar{display:none}
.zzp-permite-cerrar .zzp-cerrar{display:grid}
.zzp-abierto .zzp-cerrar{display:grid}
.zzp-abierto .zzp-abrir{display:none}
.zzp-abrir svg{transition:transform .2s ease}
.zzp-abierto .zzp-abrir svg{transform:rotate(180deg)}
.zzp-btn:focus-visible{outline:2px solid var(--zzp-tinta);outline-offset:2px}

/* --- datos ------------------------------------------------------------ */
.zzp-datos{min-width:0;flex:1 1 12rem;display:flex;flex-direction:column;gap:1px}
.zzp-titulo{font-weight:600;font-size:.9rem;line-height:1.3;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.zzp-meta{font-family:var(--zz-mono,ui-monospace,monospace);font-size:.66rem;
  letter-spacing:.08em;color:var(--zzp-tenue);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;display:flex;align-items:center;gap:.4rem}
/* 🔴 Lo unico rojo que queda. Solo cuando es una EMISION: en un fichero no hay
   nada «al aire» y encender el punto ahi seria decir algo que no es. */
.zzp.zzp-aire .zzp-meta::before{content:"";flex:0 0 auto;width:6px;height:6px;
  border-radius:50%;background:var(--zzp-vivo);
  box-shadow:0 0 0 3px rgba(255,59,48,.18)}
.zzp.zzp-aire.zzp-sonando .zzp-meta::before{animation:zzp-late 2s ease-in-out infinite}
@keyframes zzp-late{50%{box-shadow:0 0 0 5px rgba(255,59,48,.08)}}

/* --- tiempo ------------------------------------------------------------ */
.zzp-tiempo{flex:2 1 22rem;display:flex;align-items:center;gap:.5rem;min-width:0}
.zzp-t-actual,.zzp-t-total{font-family:var(--zz-mono,ui-monospace,monospace);
  font-size:.7rem;font-variant-numeric:tabular-nums;color:var(--zzp-tenue);white-space:nowrap}
.zzp-barra{flex:1 1 auto;height:4px;border-radius:2px;background:rgba(255,255,255,.14);
  position:relative;cursor:pointer;min-width:4rem}
.zzp-cargado,.zzp-relleno{position:absolute;inset:0 auto 0 0;border-radius:2px}
.zzp-cargado{background:rgba(255,255,255,.18);width:0}
.zzp-relleno{background:var(--zzp-tinta);width:0}
/* 🔴 En directo NO HAY BARRA. Una emision no tiene duracion, asi que un riel a
   lo ancho -- aunque este apagado-- promete un control que no existe y sugiere
   una posicion que no significa nada. Se retira, y con ella los saltos.
   Lo que si queda es el tiempo que lleva puesto el oyente, que si es un dato.
   El rotulo EN VIVO tampoco se repite aqui: ya lo dice el pie, con su punto. */
.zzp.zzp-directo .zzp-barra,
.zzp.zzp-directo .zzp-t-total,
.zzp.zzp-directo .zzp-atras,
.zzp.zzp-directo .zzp-adelante{display:none}
.zzp.zzp-directo .zzp-tiempo{flex:0 0 auto}
/* Y la velocidad tampoco, pero ESO YA NO SE HACE AQUI: lo decide
   `modoSelector()` en el motor, que en una emision pone el hueco en modo
   idiomas o vecinas y la velocidad no llega a pintarse. 🔴 La regla que habia
   -- `.zzp.zzp-directo .zzp-vel{display:none}` -- se RETIRO: con ella puesta,
   el modo velocidad ganaba la clase y perdia contra el `display:none`, asi que
   no aparecia nunca y no habia error que mirar. No volver a anadirla. */

/* --- extras ------------------------------------------------------------ */
.zzp-extra{flex:0 0 auto;display:flex;align-items:center;gap:.5rem}

/* --- EL HUECO: uno solo, tres contenidos ------------------------------ */
/* Quien manda es `.zzp-modo-*` sobre `#zzp`, y nadie mas. Los tres <select>
   estan siempre en el DOM y solo uno se ve: nuestra emision pide el salto de
   idioma, una emisora ajena pide a donde ir si no gusta, y un podcast pide la
   velocidad. El de idiomas sobre un podcast ofrecia justo lo que ahi no sirve.
   🔴 Ninguno se esconde ya por `.zzp-mini` ni por ancho de pantalla: la
   velocidad en un podcast es lo que MAS se usa en un telefono. */
.zzp-selector{flex:0 1 auto;min-width:0;display:flex}
.zzp-selector > select{display:none;max-width:11rem;text-overflow:ellipsis}
.zzp-modo-idiomas .zzp-selector .zzp-emisoras:not([hidden]){display:block}
.zzp-modo-vecinas .zzp-selector .zzp-vecinas:not([hidden]){display:block}
.zzp-modo-velocidad .zzp-selector .zzp-vel{display:block}
/* 🔴 La lista desplegable la pinta el SISTEMA, no esta hoja: hereda el `color`
   del <select> -- casi blanco -- y la dibuja sobre su propio fondo blanco, asi
   que los numeros quedaban invisibles. Hay que vestir tambien las <option>, y
   con colores literales: ese menu se dibuja fuera de la pagina y ahi las
   variables del tema no llegan. */
.zzp-emisoras,.zzp-vecinas,.zzp-vel{background:rgba(255,255,255,.09);color:#f5f3f1;
  border:0;border-radius:4px;font:inherit;font-size:.7rem;padding:.2rem .3rem;
  cursor:pointer}
.zzp-emisoras option,.zzp-vecinas option,.zzp-vel option{background:#17151a;color:#f5f3f1}
.zzp-emisoras:focus-visible,.zzp-vecinas:focus-visible,.zzp-vel:focus-visible{
  outline:2px solid #f5f3f1;outline-offset:2px}

/* --- EL VOLUMEN: el altavoz siempre, el deslizador a peticion --------- */
/* 🔴 Se retiraron `.zzp-mini .zzp-vol` y el `.zzp-vol{display:none}` de la
   media query de 900 px. El player NACE mini, asi que con aquellas reglas el
   volumen no se veia nunca en la barra: para bajar la radio habia que abrir el
   player a pantalla completa. No volver a anadirlas. */
.zzp-volumen{position:relative;flex:0 0 auto;display:flex;align-items:center;gap:.15rem}
/* 🔴 `width:0` y NO `display:none`: un elemento sin caja no puede recibir foco,
   y entonces `:focus-within` no lo abriria nunca -- el deslizador quedaria
   fuera del alcance del teclado. */
.zzp-vol{width:0;min-width:0;padding:0;margin:0;opacity:0;pointer-events:none;
  accent-color:var(--zzp-tinta);transition:width .18s ease,opacity .18s ease}
.zzp-volumen:hover .zzp-vol,
.zzp-volumen:focus-within .zzp-vol,
.zzp-volumen.zzp-vol-abierto .zzp-vol{width:72px;opacity:1;pointer-events:auto}
/* En tactil no hay hover: pedir un toque para revelar y otro para mover son
   dos toques para lo que en escritorio no cuesta ninguno. */
@media (hover:none){
  .zzp-vol{width:56px;opacity:1;pointer-events:auto}
}
.zzp-vol-btn .zzp-i-mudo{display:none}
.zzp-mudo .zzp-vol-btn .zzp-i-alto{display:none}
.zzp-mudo .zzp-vol-btn .zzp-i-mudo{display:block}
.zzp-mudo .zzp-vol{opacity:.45}

.zzp-oculto{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);
  clip-path:inset(50%);white-space:nowrap}
.zzp.zzp-error .zzp-meta{color:#ff9a94}
/* --- el repuesto: suena la NUESTRA porque la otra no transmite -------- */
/* Ambar, no salmon. `.zzp-error` significa «esto fallo y no suena nada»; esto
   es «lo que pediste no esta, pero SUENA algo y te digo cual». Dos avisos del
   mismo color se leen como el mismo hecho. Va DESPUES del error y con el
   `:not()` explicito: si las dos clases coinciden manda el error, que es el
   que dice que no hay sonido. */
.zzp.zzp-repuesto:not(.zzp-error) .zzp-meta{color:#ffd08a}
/* --- el dato que revela el chevron ------------------------------------ */
/* 🔴 Sin esto, ampliar un DIRECTO no ensenaba nada nuevo: la barra de progreso,
   los saltos y la velocidad estan ocultos a proposito en una emision, asi que
   el boton parecia roto. Lo que aparece ahora es un dato de verdad -- cuanta
   gente esta escuchando -- que el relay ya nos manda. */
.zzp-extra-dato{font-family:var(--zz-mono,ui-monospace,monospace);font-size:.66rem;
  letter-spacing:.08em;color:var(--zzp-tenue);white-space:nowrap}
.zzp-mini .zzp-extra-dato,.zzp-extra-dato[hidden]{display:none}

/* --- MINI: lo que siempre importa, y nada mas ------------------------- */
/* Nace asi. Lo que se esconde no desaparece del DOM -- sigue siendo el mismo
   componente-- y vuelve con el chevron. */
.zzp-mini .zzp-tiempo{display:none}/* En una emision no hay progreso ni saltos ni velocidad -- tambien a pantalla
   completa. Lo que queda es el disco, lo que suena, cuantos escuchan y el
   volumen, que en un directo es exactamente todo lo que hay que ofrecer. */
.zzp-abierto.zzp-directo .zzp-tiempo{justify-content:center}

/* --- el boton que sustituye a un <audio> suelto ----------------------- */
.zzp-suelto{margin:1.1rem 0}
.zzp-boton-suelto{display:inline-flex;align-items:center;gap:.6rem;cursor:pointer;
  border:0;border-radius:999px;padding:.6rem 1.15rem .6rem .85rem;font:inherit;
  font-size:.9rem;background:#0b0b0d;color:#f5f3f1;
  box-shadow:0 8px 22px -14px rgba(0,0,0,.7)}
.zzp-boton-suelto svg{width:1.15em;height:1.15em;fill:currentColor;flex:0 0 auto}
.zzp-boton-suelto:hover,.zzp-boton-suelto:focus-visible{filter:brightness(1.35)}

/* --- lo que no se puede reproducir ------------------------------------ */
.zzp-caido{opacity:.4;cursor:not-allowed;filter:grayscale(1)}
.zzp-rotulo-caido{display:inline-block;margin-left:.5rem;padding:.1rem .45rem;
  border-radius:3px;background:rgba(0,0,0,.12);
  font-family:var(--zz-mono,ui-monospace,monospace);font-size:.62rem;
  letter-spacing:.08em;text-transform:uppercase;opacity:.7;vertical-align:middle}

/* --- el boton de la ficha que esta sonando ---------------------------- */
.zzp-suena{position:relative}

@media (max-width:900px){
  .zzp-tiempo{flex:1 1 auto}
}
@media (max-width:560px){
  .zzp-abierto .zzp-tiempo{flex-basis:100%}
  .zzp-caja{gap:.55rem}
  /* En la barra estrecha el hueco se encoge, pero NO desaparece: antes se
     retiraba entero por «no cabe», y con eso se iba tambien la velocidad --
     que en un podcast es justo lo que mas se usa en un telefono. El volumen ya
     no compite por ese ancho: es un icono. */
  .zzp-mini .zzp-selector > select{max-width:6.5rem;font-size:.66rem}
}@media (prefers-reduced-motion:reduce){
  .zzp-fijo{transition:none}
  .zzp.zzp-gira .zzp-play::before{animation:none}
  .zzp-play,.zzp-play::before,.zzp-abrir svg{transition:none}
  .zzp-onda i{transition:none}
  .zzp-play{transition:none}
  .zzp.zzp-aire.zzp-sonando .zzp-meta::before{animation:none}
}

/* ====================================================================== */
/*  AMPLIADO = PANTALLA COMPLETA                                          */
/*                                                                        */
/*  🔴 Antes, ampliar solo destapaba el progreso, los saltos y la          */
/*  velocidad. En un DIRECTO esos tres estan ocultos a proposito, asi que  */
/*  el boton no hacia NADA visible: un control que a veces no hace nada    */
/*  esta roto aunque el codigo funcione. Ahora el player toma la pantalla. */
/* ====================================================================== */
html.zzp-html-abierto{overflow:hidden}
/* El popover trae estilos del navegador -- `width:fit-content`, `margin:auto`,
   `border`, `padding` -- que hay que deshacer, y ademas hay que anular el
   `display:none` con el que nace mientras no esta abierto. */
.zzp.zzp-abierto,
.zzp.zzp-abierto:popover-open{
  display:block;position:fixed;inset:0;z-index:99999;border:0;border-radius:0;
  margin:0;padding:0;width:100%;height:100%;max-width:none;max-height:none;
  overflow:hidden;transform:none;
  background:var(--zzp-fondo-solido);
  -webkit-backdrop-filter:none;backdrop-filter:none;
  animation:zzp-entra .22s cubic-bezier(.2,.7,.3,1);
}
@keyframes zzp-entra{from{opacity:0;transform:scale(.985)}to{opacity:1;transform:none}}
.zzp.zzp-abierto .zzp-caja{
  display:grid;max-width:min(720px,92vw);height:100%;margin:0 auto;
  padding:clamp(3rem,9vh,6rem) 0 clamp(2rem,7vh,4rem);
  /* Cuatro filas, no cinco: el disco ES el boton de play, ya no hay una fila
     para un boton suelto debajo. */
  grid-template-rows:repeat(4, auto);
  grid-template-areas:"disco" "datos" "tiempo" "extra";
  justify-items:center;align-content:center;gap:clamp(.9rem,3vh,1.8rem);
}
.zzp-abierto .zzp-play{grid-area:disco;width:min(260px,44vh,52vw);height:min(260px,44vh,52vw);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.16),0 34px 80px -46px #000,
             0 0 0 12px rgba(255,255,255,.02)}
.zzp-abierto .zzp-play > i{width:17%;height:17%;box-shadow:0 0 0 6px rgba(0,0,0,.7)}
/* El glifo crece con el disco: a 260 px, uno de 18 px no se ve. */
.zzp-abierto .zzp-play svg{width:22%;height:22%}
.zzp-abierto .zzp-play:hover,.zzp-abierto .zzp-play:focus-visible{transform:scale(1.02)}
.zzp-abierto .zzp-datos{grid-area:datos;flex:0 0 auto;width:100%;text-align:center;
  align-items:center;gap:.5rem}
.zzp-abierto .zzp-titulo{font-size:clamp(1.15rem,3.4vw,1.6rem);line-height:1.28;
  white-space:normal;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;
  -webkit-box-orient:vertical;text-wrap:balance}
.zzp-abierto .zzp-meta{font-size:.72rem;justify-content:center;white-space:normal}
.zzp-abierto .zzp-tiempo{grid-area:tiempo;width:100%;flex:0 0 auto;justify-content:center}
.zzp-abierto .zzp-extra{grid-area:extra;justify-content:center}
.zzp-abierto .zzp-vol{width:min(240px,60vw);opacity:1;pointer-events:auto}
.zzp-abierto .zzp-selector > select{font-size:.9rem;padding:.5rem .7rem;
  max-width:min(320px,70vw)}.zzp-abierto .zzp-mandos{position:absolute;top:clamp(.9rem,3vh,1.6rem);
  right:clamp(.9rem,3vw,1.6rem);z-index:2}
.zzp-abierto .zzp-chico{width:40px;height:40px}
.zzp-abierto .zzp-chico svg{width:20px;height:20px}
/* 🔴 A pantalla completa la onda ocupa EL FONDO ENTERO. Ocupaba solo el tercio
   de abajo «para no distraer del disco», y esa cautela vaciaba la vista: quien
   amplia lo hace para ver la musica, no para ver un hueco negro. Decision de
   Lawrence: que parezca una fiesta.
   La legibilidad no se deja al azar -- se resuelve con el velo de `.zzp-caja`,
   aqui abajo --, no bajandole la altura a la onda. */
.zzp-abierto .zzp-onda{top:0;height:100%;gap:3px;padding:0 8px;opacity:1}
.zzp-abierto .zzp-onda i{border-radius:3px 3px 0 0;
  background:linear-gradient(to top,
    rgba(255,255,255,.30) 0%, rgba(255,255,255,.14) 55%, rgba(255,255,255,.04) 100%)}
.zzp-abierto.zzp-aire.zzp-sonando .zzp-onda i{
  background:linear-gradient(to top,
    color-mix(in srgb, var(--zzp-vivo) 42%, rgba(255,255,255,.28)) 0%,
    rgba(255,255,255,.13) 55%, rgba(255,255,255,.04) 100%)}
/* El velo: sombra radial DETRAS del contenido y por delante de la onda, para
   que el titulo se lea sobre las barras sin apagarlas. Vive dentro de
   `.zzp-caja`, que ya crea su propio contexto de apilado con `z-index:1`. */
.zzp-abierto .zzp-caja::before{content:"";position:absolute;z-index:-1;
  inset:-12% -25%;pointer-events:none;
  background:radial-gradient(ellipse at 50% 46%,
    rgba(11,11,13,.90) 0%, rgba(11,11,13,.62) 42%, rgba(11,11,13,0) 72%)}
/* Sin fondo del popover: la pantalla ya es nuestra de lado a lado. */
.zzp.zzp-abierto::backdrop{background:#000}
/* A 260 px, la vuelta de 2,6 s de la barra se ve acelerada: un vinilo real da
   una vuelta cada 1,8 s pero visto pequeno. Aqui se calma. */
.zzp.zzp-abierto.zzp-gira .zzp-play::before{animation-duration:6s}
