/* =========================================================
   OUT2FI — stylesheet
   Design language: deep space navy, neon purple → indigo → pink
   gradient accents, glassy cards, editorial-clean type.
   ========================================================= */

:root {
  /* --- color: dark (default) --- */
  --bg: #08060f;
  --bg-elevated: #0d0a1a;
  --surface: #13101f;
  --surface-2: #171325;
  --border: rgba(255, 255, 255, 0.08);
  --border-strong: rgba(255, 255, 255, 0.14);
  --text: #f4f3f8;
  --text-dim: #a8a4b8;
  --text-faint: #6f6c82;

  --accent-1: #a855f7;
  --accent-2: #6366f1;
  --accent-3: #ec4899;
  --gradient: linear-gradient(120deg, var(--accent-1) 0%, var(--accent-2) 50%, var(--accent-3) 100%);
  --gradient-soft: linear-gradient(120deg, rgba(168,85,247,.16), rgba(99,102,241,.16), rgba(236,72,153,.16));

  --live: #f43f5e;
  --success: #22c55e;
  --success-bg: rgba(34,197,94,.12);

  --radius-sm: 10px;
  --radius-md: 16px;
  --radius-lg: 22px;
  --radius-full: 999px;

  --shadow-card: 0 8px 30px rgba(0,0,0,.35);
  --shadow-glow: 0 0 0 1px rgba(168,85,247,.25), 0 8px 24px rgba(99,102,241,.18);

  --font-display: 'Sora', system-ui, sans-serif;
  --font-body: 'Inter', system-ui, sans-serif;

  --header-h: 76px;
  --container: 1440px;

  color-scheme: dark;
}

:root[data-theme="light"] {
  --bg: #f6f5fb;
  --bg-elevated: #ffffff;
  --surface: #ffffff;
  --surface-2: #f0eef8;
  --border: rgba(20, 12, 40, 0.08);
  --border-strong: rgba(20, 12, 40, 0.14);
  --text: #17132a;
  --text-dim: #55506b;
  --text-faint: #8b869c;
  --shadow-card: 0 8px 30px rgba(90, 60, 140, .10);
  color-scheme: light;
}

/* --- reset --- */
*, *::before, *::after { box-sizing: border-box; }
html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Cinturón de seguridad contra scroll horizontal fantasma: el menú
     móvil (.mobile-nav, más abajo) es un panel position:fixed; inset:0
     que se saca de pantalla con transform: translateX(100%). En ciertos
     Android/Chromium ese patrón (fixed + inset:0 + transform) sigue
     sumando ancho al documento aunque esté invisible — en iOS no se nota
     porque Safari recorta/rebota distinto, pero en Android deja un hueco
     vacío a la derecha de TODA la página (header, tarjeta del
     reproductor, todo), porque el viewport queda más ancho de lo que se
     ve y el scroll descansa en su posición inicial. overflow-x: hidden
     acá corta cualquier desborde horizontal de cualquier elemento — de
     este panel o de cualquier otro que apareciera en el futuro — sin
     afectar el scroll horizontal interno que sí se usa a propósito en
     .greetings-scroller / .genre-scroller (esos declaran su propio
     overflow-x: auto y no dependen de que el documento pueda desbordar).
  */
  overflow-x: hidden;
  width: 100%;
}
body, h1, h2, h3, h4, p, figure, ul, ol { margin: 0; }
ul, ol { padding: 0; list-style: none; }
img, svg { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button, input, textarea { font: inherit; color: inherit; }
button { cursor: pointer; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
}

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.5;
  transition: background .25s ease, color .25s ease;

  /* BUG REAL (reportado: al hacer scroll el header no quedaba fijo).

     .site-header ya tiene position: sticky; top: 0 — no era eso. El
     problema estaba ACÁ: cuando un elemento declara overflow-x: hidden
     con overflow-y en visible, la especificación obliga al navegador a
     calcular overflow-y como auto. O sea que este overflow-x convertía
     al <body> en un contenedor de scroll propio, y un hijo sticky se
     pega al contenedor que scrollea MÁS CERCANO — que pasó a ser el
     body. Como el body no scrollea (scrollea el viewport), el header se
     iba con la página como si el sticky no existiera.

     No se puede simplemente borrarlo: está para cortar el desborde
     horizontal del panel móvil (ver el comentario largo en html, arriba).
     La solución es 'clip', que recorta EXACTAMENTE igual pero no crea un
     contenedor de scroll, así que el sticky vuelve a funcionar.

     Las dos líneas van a propósito y en este orden: un navegador viejo
     que no conozca 'clip' descarta esa declaración y se queda con
     'hidden' — mismo comportamiento que hasta ahora, nada se rompe.

     En <html> no hace falta tocar nada: ahí el overflow se propaga al
     viewport y el propio <html> queda como visible, así que nunca fue
     parte del problema. */
  overflow-x: hidden;
  overflow-x: clip;
  width: 100%;
  position: relative; /* ancla el contexto para que el recorte de arriba realmente recorte, no solo lo declare */
}

.icon { width: 20px; height: 20px; fill: currentColor; flex-shrink: 0; }
.icon-stroke { fill: none; }

.visually-hidden {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}

.skip-link {
  position: absolute; left: 1rem; top: -60px; z-index: 200;
  background: var(--accent-2); color: #fff; padding: .75rem 1.25rem;
  border-radius: var(--radius-sm); transition: top .2s ease;
}
.skip-link:focus { top: 1rem; }

:focus-visible {
  outline: 2px solid var(--accent-1);
  outline-offset: 2px;
  border-radius: 6px;
}

.container {
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: clamp(1rem, 3vw, 2.5rem);
}

/* =========================================================
   Header
   ========================================================= */
.site-header {
  position: sticky; top: 0; z-index: 100;
  height: calc(var(--header-h) + env(safe-area-inset-top, 0px));
  padding-top: env(safe-area-inset-top, 0px);
  box-sizing: border-box;
  display: flex; align-items: center;
  background: color-mix(in srgb, var(--bg) 88%, transparent);
  backdrop-filter: blur(14px) saturate(140%);
  border-bottom: 1px solid var(--border);
}
.site-header .container { display: flex; align-items: center; gap: 1.5rem; width: 100%; }

.brand { display: flex; align-items: center; gap: .6rem; font-family: var(--font-display); font-weight: 700; font-size: 1.25rem; letter-spacing: -.01em; margin-right: .5rem; }
.brand-mark { width: 34px; height: 34px; border-radius: 10px; }
.brand-accent { background: var(--gradient); -webkit-background-clip: text; background-clip: text; color: transparent; }

.main-nav { display: none; }
.main-nav ul { display: flex; align-items: center; gap: 2rem; }
.main-nav a {
  font-size: .72rem; font-weight: 600; color: var(--text-dim);
  text-transform: uppercase; letter-spacing: .08em;
  padding-block: .4rem; border-bottom: 2px solid transparent; transition: color .2s ease, border-color .2s ease;
}
.main-nav a:hover { color: var(--text); }
.main-nav a[aria-current="page"] { color: var(--text); border-color: var(--accent-1); }

.header-actions { display: flex; align-items: center; gap: .6rem; margin-left: auto; }

.icon-btn {
  position: relative;
  width: 42px; height: 42px; display: grid; place-items: center;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-full);
  color: var(--text-dim); transition: color .2s ease, border-color .2s ease, transform .15s ease;
}
.icon-btn:hover { color: var(--text); border-color: var(--border-strong); transform: translateY(-1px); }

/* Corazones flotantes al dar "me gusta" a la estación — estilo TikTok:
   varios corazones suben desde el botón con trayectorias ligeramente
   distintas (deriva horizontal + rotación) y se van desvaneciendo,
   en vez de un solo ícono subiendo en línea recta, que se ve mecánico. */
.heart-particle {
  position: absolute; left: 50%; top: 50%; width: 16px; height: 16px;
  color: var(--live); pointer-events: none; z-index: 5;
  transform: translate(-50%, -50%);
  animation: heart-float 1.1s ease-out forwards;
  /* Deriva, giro, tamaño y altura los pone el JS por corazón (--hx, --hr,
     --hs, --hy); los valores de aquí son solo el respaldo. */
}
@keyframes heart-float {
  0%   { opacity: 0; transform: translate(-50%, -50%) translate(0, 0) rotate(var(--hr, 0deg)) scale(.3); }
  12%  { opacity: 1; transform: translate(-50%, -50%) translate(calc(var(--hx, 0px) * .2), -10px) rotate(var(--hr, 0deg)) scale(var(--hs, 1)); }
  100% { opacity: 0; transform: translate(-50%, -50%) translate(var(--hx, 0px), var(--hy, -58px)) rotate(var(--hr, 0deg)) scale(calc(var(--hs, 1) * .8)); }
}
@media (prefers-reduced-motion: reduce) {
  .heart-particle { display: none; } /* la regla global ya congela animaciones, esto evita que aparezcan y desaparezcan de golpe sin transición */
}

.lang-switch { display: flex; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-full); padding: 3px; }
.lang-switch a {
  padding: .4rem .7rem; font-size: .78rem; font-weight: 700; letter-spacing: .03em; border-radius: var(--radius-full); color: var(--text-faint);
  transition: color .2s ease, background .2s ease;
}
.lang-switch a[aria-current="true"] { background: var(--gradient); color: #fff; }

.btn {
  display: inline-flex; align-items: center; gap: .5rem;
  padding: .7rem 1.3rem; border-radius: var(--radius-full);
  font-weight: 600; font-size: .88rem; border: 1px solid transparent;
  transition: transform .15s ease, box-shadow .2s ease, opacity .2s ease;
  white-space: nowrap;
}
.btn:hover { transform: translateY(-1px); }
.btn-gradient { background: var(--gradient); color: #fff; box-shadow: 0 6px 20px rgba(99,102,241,.35); }
.btn-gradient:hover { box-shadow: 0 8px 26px rgba(99,102,241,.5); }
.btn-outline { background: var(--surface); border-color: var(--border); color: var(--text); }
.btn-outline:hover { border-color: var(--border-strong); }
.btn .icon { width: 17px; height: 17px; }

.menu-toggle { display: grid; }

/* =========================================================
   Hero / live player
   ========================================================= */
.hero { padding-block: clamp(1.25rem, 3vw, 2rem) 1.5rem; }
.player-card {
  display: grid; grid-template-columns: 1fr; gap: 0;
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}

.player-art { position: relative; aspect-ratio: 16/10; overflow: hidden; }
.player-art img { width: 100%; height: 100%; object-fit: cover; }
.player-art::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(0deg, rgba(8,6,15,.55), transparent 55%);
}

.live-badge {
  position: absolute; top: 1rem; left: 1rem; z-index: 2;
  display: inline-flex; align-items: center; gap: .4rem;
  background: var(--live); color: #fff; font-weight: 700; font-size: .72rem; letter-spacing: .05em;
  padding: .35rem .7rem; border-radius: var(--radius-full);
}
.live-badge::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: #fff; animation: pulse-dot 1.6s ease-in-out infinite; }
@keyframes pulse-dot { 0%,100% { opacity: 1; } 50% { opacity: .35; } }

.player-info { position: relative; padding: 1.5rem clamp(1.25rem, 3vw, 2rem) 1.75rem; display: flex; flex-direction: column; gap: 1.1rem; }

.player-corner-badge { position: absolute; top: 1.1rem; right: clamp(1.25rem, 3vw, 2rem); z-index: 3; display: flex; flex-direction: column; align-items: flex-end; gap: .35rem; }
.player-listeners-badge {
  display: inline-flex; align-items: center; gap: .4rem; background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--radius-full); padding: .35rem .7rem .35rem .55rem; font-size: .74rem; white-space: nowrap;
}
.player-listeners-badge .icon { width: 14px; height: 14px; color: var(--text-faint); }
.player-listeners-badge strong { font-weight: 800; color: var(--text); }
.player-listeners-badge span { color: var(--text-faint); }
.player-listeners-badge::after {
  content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--success);
  animation: pulse-dot-slow 2.4s ease-in-out infinite;
}
.player-neon-logo {
  font-family: var(--font-display); font-weight: 800; font-size: clamp(1.15rem, 3vw, 1.55rem); letter-spacing: .05em;
  padding: .3rem .85rem; border-radius: var(--radius-full);
  /* Fondo oscuro FIJO, no ligado a --surface-2. El texto de este letrero
     es blanco a propósito (así se ve un neón real) y en modo claro
     --surface-2 es casi blanco — el texto quedaba casi invisible, solo
     se notaba el resplandor. Con este fondo propio el letrero se ve
     igual de bien en los dos temas. */
  background: #0d0a1a;
  color: #fff; border: 1.5px solid rgba(168,85,247,.65);
  text-shadow:
    0 0 4px #fff,
    0 0 10px rgba(168,85,247,1),
    0 0 22px rgba(168,85,247,.85),
    0 0 42px rgba(99,102,241,.6),
    0 0 74px rgba(99,102,241,.4);
  box-shadow:
    0 0 10px rgba(168,85,247,.55),
    0 0 24px rgba(168,85,247,.3),
    inset 0 0 12px rgba(168,85,247,.22);
  animation: neon-breathe 2.6s ease-in-out infinite, neon-flicker 6s linear infinite;
  position: relative; overflow: hidden; isolation: isolate;
}
/* Brillo que recorre el letrero de izquierda a derecha en loop — el
   típico "shine" de un cartel de neón profesional. Es una franja
   diagonal semitransparente que se desliza por encima del texto; se
   pausa 1.6s entre pasadas para que no distraiga (un brillo constante
   se siente barato, uno que "respira" con pausas se lee como intencional). */
.player-neon-logo::before {
  /* z-index NEGATIVO a propósito: en el orden de pintado de CSS, un
     descendiente con z-index negativo se pinta DESPUÉS del fondo del
     contenedor pero ANTES del texto en flujo normal — justo el hueco
     donde queda "detrás de las letras, encima del fondo". Con z-index
     positivo (o sin isolation:isolate) el brillo taparía "OUT2FI" en
     cada pasada en vez de asomar entre las letras. */
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(115deg, transparent 40%, rgba(255,255,255,.55) 50%, transparent 60%);
  background-size: 220% 100%; background-position: 150% 0;
  animation: neon-shine 3.6s cubic-bezier(.4,0,.2,1) infinite;
}
@keyframes neon-shine {
  0%   { background-position: 150% 0; }
  45%  { background-position: -50% 0; }
  100% { background-position: -50% 0; }
}
.player-neon-logo span {
  color: #ffe9fb;
  text-shadow:
    0 0 4px #fff,
    0 0 10px rgba(236,72,153,1),
    0 0 24px rgba(236,72,153,.9),
    0 0 46px rgba(236,72,153,.6),
    0 0 80px rgba(236,72,153,.35);
}
@keyframes neon-breathe {
  0%, 100% { filter: brightness(1); }
  50% { filter: brightness(1.2); }
}
@keyframes neon-flicker {
  0%, 89%, 92%, 100% { opacity: 1; }
  90% { opacity: .4; }
  91% { opacity: .9; }
  95% { opacity: 1; }
  96% { opacity: .6; }
  97% { opacity: 1; }
}
@media (max-width: 560px) {
  .player-corner-badge { position: static; align-items: flex-start; margin-bottom: .3rem; }
  /* Sitio reservado para el corazón, que en móvil sube a esta esquina:
     sin esto el contador ("119 En este momento") tiene white-space:nowrap
     y se metería por debajo del botón en teléfonos angostos. */
  .player-corner-badge { padding-right: 3.4rem; }
  .volume-track { width: 60px; }
  .player-secondary { gap: .5rem; }
  /* Con el botón de visualizador son cinco controles: se aprieta el
     espaciado y los botones para que la fila siga entrando de una sola
     línea en teléfonos angostos. */
  .volume-row { gap: .35rem; }
  .volume-row .icon-btn { width: 36px; height: 36px; }
  .player-controls-sep { height: 18px; }

  /* El corazón se va a la esquina superior derecha, en línea con el
     contador de oyentes. Se saca del flujo con position:absolute, así no
     deja un hueco en la fila de controles y esa fila queda más holgada.
     Se queda a 42px (no a los 36px del resto) porque es el gesto que más
     se toca y conviene un objetivo táctil cómodo. El selector lleva
     .volume-row para ganarle en especificidad a la regla de 36px de
     arriba, no porque siga dentro de esa fila visualmente. */
  .volume-row [data-favorite-toggle] {
    position: absolute; top: 1.25rem; right: clamp(1.25rem, 3vw, 2rem);
    width: 42px; height: 42px; z-index: 4;
  }
}
@media (max-width: 380px) {
  /* Muy angosto: se van el separador y el slider de volumen (el botón
     de silenciar sigue estando), antes que dejar que la fila se parta. */
  .volume-track { width: 44px; }
  .player-controls-sep { display: none; }
}
.eyebrow { font-size: .74rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--accent-1); }
.show-name { font-family: var(--font-display); font-size: clamp(1.4rem, 4vw, 1.9rem); font-weight: 700; letter-spacing: -.01em; }
.show-host { font-size: .85rem; font-weight: 600; color: var(--text-dim); }
.show-host strong { color: var(--text); }

.transport { display: flex; align-items: center; gap: 1rem; }
.play-btn {
  width: 62px; height: 62px; border-radius: 50%; flex-shrink: 0;
  background: var(--gradient); color: #fff; display: grid; place-items: center;
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent-2) 18%, transparent), 0 10px 30px rgba(99,102,241,.4);
  transition: transform .15s ease;
}
.play-btn:hover { transform: scale(1.05); }
.play-btn .icon { width: 26px; height: 26px; }
.play-btn.is-playing .icon-play { display: none; }
.play-btn:not(.is-playing) .icon-pause { display: none; }

.visualizer { flex: 1; display: flex; align-items: flex-end; gap: 3px; height: 54px; min-width: 0; overflow: hidden; }
.visualizer span { flex: 1; min-width: 2px; border-radius: 2px; background: var(--gradient); opacity: .85; transform-origin: bottom; }
/* Visualizador "onda líquida": el <canvas> ocupa toda la caja. Las
   reglas de .visualizer span se dejan porque otras vistas antiguas
   pueden seguir usándolas; aquí no hay spans. */
.visualizer { align-items: stretch; }
.visualizer .visualizer-canvas { flex: 1; width: 100%; height: 100%; min-width: 0; display: block; }


.progress-row { display: flex; align-items: center; gap: .75rem; font-size: .78rem; color: var(--text-faint); font-variant-numeric: tabular-nums; }
.progress-track { flex: 1; height: 4px; border-radius: var(--radius-full); background: var(--surface-2); position: relative; cursor: pointer; }
.progress-fill { position: absolute; inset: 0 auto 0 0; width: 22%; border-radius: var(--radius-full); background: var(--gradient); }
.progress-thumb { position: absolute; top: 50%; left: 22%; width: 12px; height: 12px; border-radius: 50%; background: #fff; transform: translate(-50%,-50%); box-shadow: 0 0 0 3px rgba(255,255,255,.15); }

.player-secondary { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.volume-row { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; row-gap: .5rem; }

/* Botón de visualizador: muestra el ícono del estilo activo (onda o
   ecualizador) y se marca en color de acento cuando está en modo
   ecualizador, para que se vea que es un interruptor y no un botón
   más. Misma medida que el resto de .icon-btn, así que entra igual en
   la fila en escritorio y en móvil. */
.icon-btn--viz .icon-viz-bars,
.icon-btn--viz.is-bars .icon-viz-wave { display: none; }
.icon-btn--viz.is-bars .icon-viz-bars { display: block; }
.icon-btn--viz.is-bars { color: var(--accent-1); border-color: color-mix(in srgb, var(--accent-1) 45%, transparent); }
.volume-track { width: 110px; height: 4px; border-radius: var(--radius-full); background: var(--surface-2); position: relative; cursor: pointer; }
.volume-fill { position: absolute; inset: 0 auto 0 0; width: 65%; border-radius: var(--radius-full); background: var(--gradient); }
.player-controls-sep { width: 1px; height: 22px; background: var(--border); flex-shrink: 0; }
[data-share-toggle] { position: relative; }
.share-tooltip {
  position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%);
  background: var(--surface); border: 1px solid var(--border-strong); color: var(--text);
  font-size: .72rem; font-weight: 600; padding: .4rem .7rem; border-radius: var(--radius-md);
  box-shadow: var(--shadow-card); z-index: 10; animation: share-tip-in .15s ease;
  /* width:max-content mantiene los avisos cortos ("Enlace copiado") en una
     sola línea; el max-width evita que la pista de marcadores, que es más
     larga, se salga de la tarjeta en móvil. */
  width: max-content; max-width: 260px; max-width: min(260px, 72vw); text-align: center;
}
.share-tooltip::after {
  content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%);
  border: 5px solid transparent; border-top-color: var(--border-strong);
}
@keyframes share-tip-in { from { opacity: 0; transform: translateX(-50%) translateY(4px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }

/* El corazón es el último control de la fila: centrado, su aviso se
   saldría por el borde derecho de la tarjeta. Se ancla a la derecha y la
   flechita se mueve con él. */
[data-favorite-toggle] .share-tooltip { left: auto; right: -4px; transform: none; animation-name: share-tip-in-right; }
[data-favorite-toggle] .share-tooltip::after { left: auto; right: 20px; transform: none; }
@keyframes share-tip-in-right { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.icon-heart-filled { display: none; }
[data-favorite-toggle].is-favorited { color: var(--live); border-color: color-mix(in srgb, var(--live) 45%, transparent); }
[data-favorite-toggle].is-favorited .icon-heart-outline { display: none; }
[data-favorite-toggle].is-favorited .icon-heart-filled { display: block; }

.ai-dj-note { display: inline-flex; align-items: center; gap: .4rem; font-size: .72rem; color: var(--text-faint); }
/* Cuando no hay ningún mensaje que mostrar ("Conectando…", un error),
   este elemento se oculta del todo. Antes se quedaba SIEMPRE visible
   con solo el icono de micrófono, y como .player-secondary reparte sus
   dos hijos con space-between, ese icono vacío quedaba flotando pegado
   al borde derecho con un hueco enorme antes — o, en móvil, saltaba a
   su propia línea pegado a la izquierda con el hueco después. La clase
   la pone/quita main.js según haya o no texto en data-player-status. */
.ai-dj-note.is-empty { display: none; }

.ai-dj-note .icon { width: 14px; height: 14px; }

@media (min-width: 900px) {
  .player-card { grid-template-columns: 380px 1fr; }
  .player-art { aspect-ratio: auto; height: 100%; }
  .player-info { justify-content: center; }
}

/* ---------------------------------------------------------
   Fullscreen mode — poster becomes a full-bleed background
   instead of being squeezed into the fixed-width side column
   (which is what was cropping/cutting off the cover art).
   Toggled via JS (.is-fullscreen) on fullscreenchange.
--------------------------------------------------------- */
.player-card.is-fullscreen {
  position: fixed; inset: 0; z-index: 300;
  display: block;
  width: 100vw; height: 100vh; height: 100dvh;
  border-radius: 0; border: 0; box-shadow: none;
}
.player-card.is-fullscreen .player-art {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  aspect-ratio: auto;
}
.player-card.is-fullscreen .player-art img { object-position: center; }
.player-card.is-fullscreen .player-art::after {
  background: linear-gradient(0deg, rgba(8,6,15,.92) 0%, rgba(8,6,15,.55) 35%, rgba(8,6,15,.1) 60%, transparent 75%);
}
.player-card.is-fullscreen .player-info {
  position: absolute; z-index: 2; inset: auto 0 0 0;
  max-width: 720px; margin-inline: auto;
  padding: 2rem clamp(1.5rem, 5vw, 3rem) clamp(2rem, 6vw, 3.5rem);
  justify-content: flex-end;
}
/* En pantalla completa el panel de info se pega abajo y usa 2rem de
   padding, así que el corazón baja un poco para seguir alineado con el
   contador de oyentes en vez de quedar montado sobre el borde. */
@media (max-width: 560px) {
  .player-card.is-fullscreen .volume-row [data-favorite-toggle] { top: 1.75rem; }
}
.player-card.is-fullscreen .show-name { font-size: clamp(1.9rem, 5vw, 2.75rem); }
.player-card.is-fullscreen .play-btn { width: 72px; height: 72px; }
.player-card.is-fullscreen .play-btn .icon { width: 30px; height: 30px; }

/* Fullscreen button swaps between the "expand" and "close" icon
   depending on state — same show/hide pattern already used for play/pause. */
.icon-collapse { display: none; }
[data-fullscreen-toggle].is-active .icon-expand { display: none; }
[data-fullscreen-toggle].is-active .icon-collapse { display: block; }

/* =========================================================
   Section headers + grid layout
   ========================================================= */
.section { padding-block: 1.75rem; }
.section-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.1rem; }
.section-head h2 { display: flex; align-items: center; gap: .55rem; font-family: var(--font-display); font-size: 1.05rem; font-weight: 700; }
.section-head h2 .icon { width: 18px; height: 18px; color: var(--accent-1); }
.section-link { display: inline-flex; align-items: center; gap: .25rem; font-size: .82rem; font-weight: 600; color: var(--text-dim); }
.section-link:hover { color: var(--text); }
.section-link .icon { width: 16px; height: 16px; }

.panel {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
  padding: 1.25rem; box-shadow: var(--shadow-card);
}

.content-grid { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }
@media (min-width: 1180px) {
  .content-grid { grid-template-columns: 1.05fr 1.05fr 0.9fr; align-items: start; }
}

/* --- trending --- */
.trending-list { display: flex; flex-direction: column; gap: .55rem; }
.trending-item {
  display: flex; align-items: center; gap: .8rem; padding: .55rem; border-radius: var(--radius-md);
  border: 1px solid transparent; transition: border-color .2s ease, background .2s ease;
}
.trending-item:hover { border-color: var(--border); background: var(--surface-2); }
.trending-rank { width: 1.4rem; text-align: center; font-family: var(--font-display); font-weight: 700; color: var(--text-faint); }
.trending-art { width: 52px; height: 52px; border-radius: var(--radius-sm); object-fit: cover; flex-shrink: 0; background: var(--surface-2); }
.trending-meta { min-width: 0; flex: 1; }
.trending-meta .t-title { font-weight: 700; font-size: .9rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.trending-meta .t-artist { font-size: .8rem; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.trending-play {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0; display: grid; place-items: center;
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text);
}
.trending-play:hover { background: var(--gradient); border-color: transparent; }
.trending-play .icon { width: 14px; height: 14px; }

/* --- shows schedule --- */
.shows-list { display: flex; flex-direction: column; gap: .6rem; }
.show-row {
  display: flex; align-items: center; gap: .9rem; padding: .7rem .9rem; border-radius: var(--radius-md);
  border: 1px solid var(--border); background: var(--surface-2);
}
.show-dj-img { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.show-row.is-live { background: var(--gradient-soft); border-color: color-mix(in srgb, var(--accent-2) 45%, transparent); }
.show-row.is-next { border-color: var(--accent-1); box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent-1) 35%, transparent), 0 0 16px color-mix(in srgb, var(--accent-1) 25%, transparent); }
.next-up-tag {
  display: inline-flex; align-items: center; gap: .3rem; font-size: .68rem; font-weight: 700; letter-spacing: .03em;
  color: var(--accent-1); border: 1px solid color-mix(in srgb, var(--accent-1) 55%, transparent); padding: .28rem .55rem; border-radius: var(--radius-full);
}
.next-up-tag::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--accent-1); animation: pulse-dot-slow 2.2s ease-in-out infinite; }
.show-time { width: 64px; flex-shrink: 0; font-size: .78rem; font-weight: 700; color: var(--text-dim); font-variant-numeric: tabular-nums; }
.show-row.is-live .show-time { color: var(--text); }
.show-details { flex: 1; min-width: 0; }
.show-details .s-title { font-weight: 700; font-size: .92rem; }
.show-details .s-host { font-size: .8rem; color: var(--text-dim); }
.on-air-tag { display: inline-flex; align-items: center; gap: .35rem; background: var(--live); color: #fff; font-size: .68rem; font-weight: 700; letter-spacing: .04em; padding: .3rem .55rem; border-radius: var(--radius-full); }
.on-air-tag::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: #fff; animation: pulse-dot 1.6s ease-in-out infinite; }
.on-air-tag--pill { font-size: .74rem; padding: .4rem .8rem; }
.show-play { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; background: var(--surface); border: 1px solid var(--border); flex-shrink: 0; }
.show-play .icon { width: 14px; height: 14px; }

/* --- community --- */
.community-panel { display: flex; flex-direction: column; gap: 1.1rem; max-height: 640px; }
.request-box { flex-shrink: 0; }
.chat-box { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.request-box h3, .chat-box h3 { font-size: .85rem; font-weight: 700; margin-bottom: .6rem; display: flex; align-items: center; gap: .4rem; }
.request-box h3 .icon, .chat-box h3 .icon { width: 16px; height: 16px; color: var(--accent-1); }

/* Standalone request-form panel and chat-only panel — used on the
   homepage now that these two live in separate columns instead of
   stacked together in one .community-panel (still used as-is on
   /generos, /contacto, etc). */
.stack-column { display: flex; flex-direction: column; gap: 1.5rem; }
@media (min-width: 900px) {
  .stack-column { align-self: stretch; }
  .stack-column > .request-only-panel { flex: 1; display: flex; flex-direction: column; justify-content: center; }
}
.request-only-panel h3 { font-size: .85rem; font-weight: 700; margin-bottom: .3rem; display: flex; align-items: center; gap: .4rem; }
.request-only-panel h3 .icon { width: 16px; height: 16px; color: var(--accent-1); }
.request-only-sub { font-size: .78rem; color: var(--text-faint); margin-bottom: .9rem; }
.chat-only-panel { display: flex; flex-direction: column; }
.chat-only-panel .chat-box { max-height: 560px; }
.chat-only-panel .chat-feed { min-height: 320px; }
.request-form { display: flex; gap: .5rem; }
.request-form input {
  flex: 1; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-full);
  padding: .7rem 1rem; font-size: .85rem; color: var(--text);
}
.request-form input::placeholder { color: var(--text-faint); }
.request-form button {
  width: 42px; height: 42px; border-radius: 50%; flex-shrink: 0; display: grid; place-items: center;
  background: var(--gradient); color: #fff;
}
.form-note { font-size: .74rem; margin-top: .5rem; min-height: 1em; }
.form-note.success { color: var(--success); }
.form-note.error { color: var(--live); }

.chat-feed { display: flex; flex-direction: column; gap: .85rem; flex: 1; min-height: 120px; overflow-y: auto; padding-right: .25rem; }
.chat-msg { display: flex; gap: .6rem; }
.chat-avatar {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0; background: var(--gradient);
  display: grid; place-items: center; color: #fff; font-weight: 700; font-size: .78rem;
}
.chat-body { min-width: 0; }
.chat-name-row { display: flex; align-items: center; gap: .4rem; font-size: .82rem; }
.chat-name { font-weight: 700; }
.host-badge { font-size: .6rem; font-weight: 800; letter-spacing: .03em; background: var(--gradient); color: #fff; padding: .12rem .4rem; border-radius: 5px; }
.chat-time { font-size: .7rem; color: var(--text-faint); margin-left: auto; flex-shrink: 0; }
.chat-text { font-size: .85rem; color: var(--text-dim); line-height: 1.45; word-break: break-word; }

.chat-form { display: flex; flex-direction: column; gap: .5rem; border-top: 1px solid var(--border); padding-top: .9rem; flex-shrink: 0; }
.chat-form input {
  flex: 1; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-full);
  padding: .7rem 1rem; font-size: .85rem;
}
.chat-form-row { display: flex; align-items: center; gap: .5rem; }
.chat-hint { font-size: .7rem; color: var(--text-faint); margin-top: .5rem; text-align: center; flex-shrink: 0; }
.chat-name-input { font-size: .78rem; padding-block: .55rem; }
.chat-form button.icon-btn { background: var(--surface-2); flex-shrink: 0; }

/* =========================================================
   Stats bar
   ========================================================= */
.stats-bar { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; padding-block: .5rem 1.75rem; }
@media (min-width: 800px) { .stats-bar { grid-template-columns: repeat(4, 1fr); } }
.stat-card { display: flex; align-items: center; gap: .9rem; padding: 1.1rem; }
.stat-icon { width: 46px; height: 46px; border-radius: var(--radius-md); display: grid; place-items: center; flex-shrink: 0; background: var(--gradient-soft); color: var(--accent-1); }
.stat-icon .icon { width: 21px; height: 21px; }
.stat-label { font-size: .76rem; color: var(--text-dim); font-weight: 600; }
.stat-value { font-family: var(--font-display); font-size: 1.35rem; font-weight: 700; line-height: 1.2; }
.stat-sub { font-size: .72rem; color: var(--text-faint); }
.stat-sub.positive { color: var(--success); }
.stat-live-dot { display: inline-flex; align-items: center; gap: .3rem; }
.stat-live-dot::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--success); animation: pulse-dot-slow 2.4s ease-in-out infinite; }
@keyframes pulse-dot-slow { 0%,100% { opacity: 1; } 50% { opacity: .3; } }

/* =========================================================
   Footer
   ========================================================= */
.site-footer { border-top: 1px solid var(--border); padding-block: 1.75rem; }
.footer-inner {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 1.25rem;
}
.footer-brand { justify-self: start; }
.footer-socials { justify-self: center; }
.footer-links { justify-self: end; }
.footer-legal { grid-column: 1 / -1; }
@media (max-width: 640px) {
  .footer-inner { grid-template-columns: 1fr; justify-items: center; text-align: center; }
  .footer-brand, .footer-socials, .footer-links { justify-self: center; }
}
.footer-socials { display: flex; gap: .6rem; }
.footer-socials a {
  width: 38px; height: 38px; border-radius: 50%; display: grid; place-items: center;
  background: var(--surface); border: 1px solid var(--border); color: var(--text-dim);
}
.footer-socials a:hover { color: var(--text); border-color: var(--border-strong); }
.footer-socials .icon { width: 17px; height: 17px; }
.footer-brand { display: flex; align-items: center; gap: .5rem; font-family: var(--font-display); font-weight: 700; }
.footer-brand .brand-mark { width: 24px; height: 24px; }
.footer-legal { font-size: .78rem; color: var(--text-faint); text-align: center; flex-basis: 100%; }
.footer-legal a { color: var(--text-dim); font-weight: 600; }
.footer-legal a:hover { color: var(--accent-1); }
.footer-links { display: flex; align-items: center; gap: .6rem; }
.footer-links a { font-size: .78rem; color: var(--text-faint); }
.footer-links a:hover { color: var(--text); }
.footer-links-sep { color: var(--text-faint); font-size: .7rem; }

/* =========================================================
   Install prompt (PWA)
   ========================================================= */
/* =========================================================
   Mini-player — the compact "now playing" bar shown on every page
   that isn't the homepage, so the radio stays reachable everywhere.
   Sticks right below the (also sticky) main header.
   ========================================================= */
.mini-player {
  position: sticky; top: calc(var(--header-h) + env(safe-area-inset-top, 0px)); z-index: 90;
  background: color-mix(in srgb, var(--bg) 92%, transparent);
  backdrop-filter: blur(14px) saturate(140%);
  border-bottom: 1px solid var(--border);
}
.mini-player-inner {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; padding-block: .6rem; flex-wrap: wrap;
}
.mini-player-info { display: flex; align-items: center; gap: .7rem; min-width: 0; }
.live-badge--sm { position: static; font-size: .64rem; padding: .28rem .55rem; flex-shrink: 0; }
.mini-player-art { width: 38px; height: 38px; border-radius: var(--radius-sm); object-fit: cover; flex-shrink: 0; }
.mini-player-text { min-width: 0; }
.mini-player-show { font-family: var(--font-display); font-weight: 700; font-size: .88rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mini-player-host { font-size: .74rem; color: var(--text-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.mini-player-controls { display: flex; align-items: center; gap: .6rem; }
.play-btn--sm { width: 40px; height: 40px; box-shadow: none; }
.play-btn--sm .icon { width: 18px; height: 18px; }
.mini-player-volume-track { width: 70px; }
.mini-player-status { font-size: .72rem; color: var(--text-faint); }

@media (max-width: 640px) {
  /* El estado ("Conectando…") sí se oculta: es texto largo que en una
     pantalla angosta empuja todo lo demás. */
  .mini-player-status { display: none; }

  /* BUG REAL (reportado: "en un género el reproductor sale abajo y en
     otro arriba"): .mini-player-inner tiene flex-wrap, así que la fila
     se partía o no SEGÚN EL LARGO DEL TÍTULO — con "Rock en Español"
     los controles no entraban y bajaban de línea; con "Bachata" sí
     entraban y quedaban al lado. De ahí que cambiara de género a
     género. Ahora cada bloque ocupa el 100% del ancho, así que los
     controles quedan SIEMPRE en su propia fila, debajo, en todos los
     géneros por igual. */
  .mini-player-info { flex: 1 1 100%; }
  .mini-player-controls { flex: 1 1 100%; justify-content: flex-start; }

  /* La barra de volumen estaba oculta en móvil (display:none) — por eso
     no se podía subir ni bajar el volumen desde el celular. Ahora se
     muestra, ocupando el aire que quedó libre en esa fila propia. */
  .mini-player-volume-track { display: block; width: 100%; max-width: 170px; }
}

/* Community/chat section on non-homepage pages — the panel was designed
   to sit in a narrow column on the homepage grid, so on a full-width
   page it gets its own centered, comfortably-readable width instead of
   stretching edge to edge on desktop (long chat lines and a full-width
   message input both read worse — same reason WhatsApp Web/Discord/
   iMessage never go full-bleed even on wide screens); on mobile it's
   simply full width like everything else. */
.community-section-wrap { max-width: 720px; margin-inline: auto; }
.community-section-wrap .community-panel { max-height: 600px; }
.community-section-wrap .chat-feed { min-height: 260px; }

/* =========================================================
   Contacto page — form, FAQ accordion, live greetings scroller
   ========================================================= */
.contact-hero { display: flex; align-items: center; gap: 1.1rem; }
.contact-hero-icon {
  width: 64px; height: 64px; border-radius: 50%; flex-shrink: 0; display: grid; place-items: center;
  background: var(--gradient); color: #fff;
}
.contact-hero-icon .icon { width: 26px; height: 26px; }

.contact-layout { display: grid; grid-template-columns: 1fr; gap: 1.5rem; margin-top: 2rem; }
@media (min-width: 980px) {
  .contact-layout { grid-template-columns: 1.5fr 1fr; align-items: start; }
}

.contact-panel-title { display: flex; align-items: center; gap: .5rem; font-family: var(--font-display); font-size: 1.1rem; font-weight: 700; }
.contact-panel-title .icon { width: 18px; height: 18px; color: var(--accent-1); }
.contact-panel-sub { font-size: .84rem; color: var(--text-dim); margin: .25rem 0 1.3rem; }

.contact-topic-label { font-size: .8rem; font-weight: 600; color: var(--text-dim); margin-bottom: .6rem; }
.contact-topics { display: grid; grid-template-columns: repeat(2, 1fr); gap: .7rem; margin-bottom: 1.4rem; }
@media (max-width: 560px) { .contact-topics { grid-template-columns: 1fr; } }
.contact-topic-card {
  position: relative; display: flex; align-items: flex-start; gap: .6rem; padding: .8rem;
  border-radius: var(--radius-md); border: 1px solid var(--border); background: var(--surface-2);
  cursor: pointer; transition: border-color .15s ease, background .15s ease;
}
.contact-topic-card input { position: absolute; opacity: 0; pointer-events: none; }
.contact-topic-card.is-selected { border-color: var(--accent-1); background: var(--gradient-soft); }
.contact-topic-icon {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0; display: grid; place-items: center;
  background: var(--surface); color: var(--accent-1);
}
.contact-topic-icon .icon { width: 16px; height: 16px; }
.contact-topic-text { display: flex; flex-direction: column; gap: .1rem; }
.contact-topic-text strong { font-size: .85rem; }
.contact-topic-text span { font-size: .74rem; color: var(--text-faint); }

.contact-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
@media (max-width: 560px) { .contact-field-row { grid-template-columns: 1fr; } }
.contact-field { margin-bottom: 1rem; }
.contact-field label { display: block; font-size: .78rem; font-weight: 600; color: var(--text-dim); margin-bottom: .35rem; }
.contact-field input, .contact-field textarea {
  width: 100%; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-md);
  padding: .7rem .9rem; font-size: .87rem; color: var(--text); font-family: inherit; box-sizing: border-box; resize: vertical;
}
.contact-field input::placeholder, .contact-field textarea::placeholder { color: var(--text-faint); }
.contact-char-count { display: block; text-align: right; font-size: .72rem; color: var(--text-faint); margin-top: .3rem; }

.contact-honeypot { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.contact-submit-row { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-top: .5rem; }
.contact-privacy-note {
  display: flex; align-items: center; gap: .4rem; font-size: .74rem; color: var(--text-faint); margin: 0;
}
.contact-privacy-note .icon { width: 13px; height: 13px; flex-shrink: 0; }

.faq-list { display: flex; flex-direction: column; gap: .5rem; }
.faq-item { border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-2); padding: .2rem .95rem; }
.faq-item summary {
  cursor: pointer; padding: .75rem 0; font-size: .87rem; font-weight: 600; list-style: none;
  display: flex; justify-content: space-between; align-items: center; gap: .6rem;
}
.faq-item summary::after { content: "+"; font-size: 1.1rem; color: var(--text-faint); flex-shrink: 0; transition: transform .15s ease; }
.faq-item[open] summary::after { transform: rotate(45deg); }
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item p { font-size: .82rem; color: var(--text-dim); line-height: 1.5; padding-bottom: .85rem; margin: 0; }
.faq-more {
  display: block; text-align: center; margin-top: 1.1rem; padding: .8rem; border-radius: var(--radius-md);
  background: var(--gradient-soft); color: var(--accent-1); font-size: .84rem; font-weight: 600; text-decoration: none;
}

.greetings-scroller { display: flex; gap: 1rem; overflow-x: auto; padding-bottom: .5rem; scroll-snap-type: x proximity; -webkit-overflow-scrolling: touch; }
.greetings-scroller::-webkit-scrollbar { height: 6px; }
.greetings-scroller::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 999px; }
.greeting-card {
  flex: 0 0 auto; width: 240px; padding: 1rem; border-radius: var(--radius-md); border: 1px solid var(--border);
  background: var(--surface-2); scroll-snap-align: start;
}
.greeting-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: .6rem; }
.greeting-time { font-size: .7rem; color: var(--text-faint); }
.greeting-text { font-size: .84rem; color: var(--text-dim); line-height: 1.45; margin-bottom: .6rem; min-height: 3.2em; }
.greeting-name { font-size: .78rem; font-weight: 700; display: flex; align-items: center; gap: .4rem; }

/* =========================================================
   Tendencias page — full Top 10 + horizontal genre scroller
   ========================================================= */
.top10-panel { padding: .8rem; }
.top10-grid { display: grid; grid-template-columns: 1fr; gap: .1rem; }
@media (min-width: 800px) {
  .top10-grid { grid-template-columns: 1fr 1fr; column-gap: 1rem; }
}

.genre-scroller {
  display: flex; gap: 1rem; overflow-x: auto; padding-bottom: .5rem; scroll-snap-type: x proximity;
  -webkit-overflow-scrolling: touch;
}
.genre-scroller::-webkit-scrollbar { height: 6px; }
.genre-scroller::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 999px; }
.genre-scroller-card {
  position: relative; flex: 0 0 auto; width: 160px; height: 130px; border-radius: var(--radius-md);
  overflow: hidden; border: 1px solid var(--border); scroll-snap-align: start; text-decoration: none;
  transition: transform .18s ease, border-color .18s ease;
}
.genre-scroller-card:hover { transform: translateY(-3px); border-color: var(--border-strong); }
.genre-scroller-card img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.genre-scroller-overlay {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(10,8,20,.05) 0%, rgba(10,8,20,.75) 100%);
}
.genre-scroller-title {
  position: absolute; left: .7rem; bottom: .6rem; z-index: 1; color: #fff; font-family: var(--font-display);
  font-weight: 700; font-size: .88rem;
}

/* =========================================================
   Términos / Privacidad — readable long-form legal content
   ========================================================= */
.legal-wrap { max-width: 760px; }
.legal-updated { color: var(--text-faint); font-size: .82rem; margin: .3rem 0 2rem; }
.legal-content h2 {
  font-family: var(--font-display); font-size: 1.15rem; font-weight: 700;
  margin: 2rem 0 .7rem;
}
.legal-content h2:first-child { margin-top: 0; }
.legal-content p { font-size: .92rem; color: var(--text-dim); line-height: 1.7; margin-bottom: .9rem; }
.legal-content ul { margin: 0 0 .9rem 1.2rem; padding: 0; }
.legal-content li { font-size: .92rem; color: var(--text-dim); line-height: 1.7; margin-bottom: .5rem; }
.legal-content strong { color: var(--text); }
.legal-content a { color: var(--accent-1); text-decoration: underline; text-underline-offset: 2px; }
.legal-disclaimer {
  margin-top: 2.5rem; padding: 1rem 1.2rem; border-radius: var(--radius-md);
  background: var(--surface-2); border: 1px solid var(--border);
  font-size: .82rem; color: var(--text-faint); font-style: italic;
}

/* =========================================================
   Programación page — real daily lineup, next-up sidebar
   ========================================================= */
.schedule-hero-title { font-family: var(--font-display); font-size: clamp(2rem, 5vw, 2.9rem); font-weight: 800; margin-top: .3rem; }

.schedule-layout { display: grid; grid-template-columns: 1fr; gap: 1.5rem; margin-top: 2rem; }
@media (min-width: 980px) {
  .schedule-layout { grid-template-columns: 1.7fr 1fr; align-items: start; }
}

.schedule-panel { padding: .6rem; }
.schedule-list { display: flex; flex-direction: column; }
.schedule-row {
  display: flex; align-items: center; gap: 1rem; padding: .9rem .7rem; border-radius: var(--radius-md);
  border-bottom: 1px solid var(--border);
}
.schedule-row:last-child { border-bottom: 0; }
.schedule-row.is-live { background: var(--gradient-soft); border-bottom-color: transparent; }
.schedule-art { width: 52px; height: 52px; border-radius: var(--radius-sm); object-fit: cover; flex-shrink: 0; }
.schedule-info { flex: 1; min-width: 0; }
.schedule-show-title { font-family: var(--font-display); font-weight: 700; font-size: .98rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.schedule-dj { font-size: .82rem; color: var(--text-dim); }
.schedule-time { display: flex; align-items: center; gap: .35rem; font-size: .82rem; color: var(--text-faint); flex-shrink: 0; }
.schedule-time .icon { width: 15px; height: 15px; }
@media (max-width: 560px) {
  .schedule-time span { display: none; }
}

.schedule-sidebar { display: flex; flex-direction: column; gap: 1.2rem; }
.sidebar-card h3 { display: flex; align-items: center; gap: .45rem; font-size: .88rem; font-weight: 700; margin-bottom: 1rem; }
.sidebar-card h3 .icon { width: 17px; height: 17px; color: var(--accent-1); }

.next-show { display: flex; align-items: center; gap: .8rem; }
.next-show img { width: 56px; height: 56px; border-radius: var(--radius-sm); object-fit: cover; flex-shrink: 0; }
.next-show-title { font-family: var(--font-display); font-weight: 700; font-size: .92rem; }
.next-show-dj { font-size: .78rem; color: var(--text-dim); }
.next-show-time { font-size: .78rem; color: var(--accent-1); font-weight: 700; margin-top: .1rem; }

.summary-stats { display: flex; justify-content: space-between; text-align: center; }
.summary-stats div { display: flex; flex-direction: column; gap: .15rem; }
.summary-stats strong { font-family: var(--font-display); font-size: 1.3rem; font-weight: 800; background: var(--gradient); -webkit-background-clip: text; background-clip: text; color: transparent; }
.summary-stats span { font-size: .7rem; color: var(--text-faint); }

.sidebar-cta p { font-size: .84rem; color: var(--text-dim); margin-bottom: 1rem; }
.sidebar-cta .btn { width: 100%; justify-content: center; }

/* =========================================================
   Géneros page — hero, category filter pills, genre cards
   ========================================================= */
.genres-hero { padding-block: 2.5rem 3rem; }
.genres-hero .eyebrow { margin-bottom: .3rem; }
.genres-hero h1 { font-family: var(--font-display); font-size: clamp(2rem, 5vw, 2.9rem); font-weight: 800; }
.genres-hero-sub { color: var(--text-dim); margin-top: .3rem; margin-bottom: 1.6rem; }

.genre-filters { display: flex; flex-wrap: wrap; gap: .6rem; margin-bottom: 1.6rem; }
.genre-filter-pill {
  padding: .55rem 1.1rem; border-radius: 999px; border: 1px solid var(--border);
  background: var(--surface-2); color: var(--text-dim); font-size: .85rem; font-weight: 600;
  cursor: pointer; transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.genre-filter-pill:hover { color: var(--text); border-color: var(--border-strong); }
.genre-filter-pill.is-active { background: var(--gradient); color: #fff; border-color: transparent; }

.genres-empty-note {
  font-size: .85rem; color: var(--text-dim); background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--radius-md); padding: .8rem 1rem; margin-bottom: 1.6rem;
}

.genre-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 1.1rem; }
.genre-card {
  position: relative; display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end;
  min-height: 190px; padding: 1.2rem; border-radius: var(--radius-lg); overflow: hidden;
  border: 1px solid var(--border); color: #fff; text-decoration: none;
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.genre-card:hover { transform: translateY(-3px); box-shadow: 0 14px 32px rgba(0,0,0,.35); }
.genre-card.is-selected { border-color: var(--accent-1); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-1) 35%, transparent); }
.genre-card--1 { background: linear-gradient(150deg, #7c3aed 0%, #db2777 100%); }
.genre-card--2 { background: linear-gradient(150deg, #4f46e5 0%, #9333ea 100%); }
.genre-card--3 { background: linear-gradient(150deg, #be185d 0%, #6d28d9 100%); }
.genre-card--4 { background: linear-gradient(150deg, #4338ca 0%, #c026d3 100%); }
.genre-card-img {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0;
  transition: transform .35s ease;
}
.genre-card:hover .genre-card-img { transform: scale(1.06); }
.genre-card-overlay {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(180deg, rgba(10,8,20,.1) 0%, rgba(10,8,20,.45) 55%, rgba(10,8,20,.9) 100%);
}
.genre-card-icon, .genre-card-top, .genre-card-title, .genre-card-sub { position: relative; z-index: 2; }
.genre-card-title, .genre-card-sub { width: 100%; }
.genre-card-top {
  display: flex; align-items: center; gap: .5rem; margin-bottom: auto;
}
.genre-card-icon {
  width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center;
  background: rgba(255,255,255,.16); backdrop-filter: blur(6px); flex-shrink: 0;
}
.genre-card-icon .icon { width: 20px; height: 20px; }
.genre-card-title { font-family: var(--font-display); font-weight: 700; font-size: 1.15rem; margin-top: 1rem; }
.genre-card-sub { font-size: .8rem; color: rgba(255,255,255,.78); margin-top: .15rem; }
.genre-card-play {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0;
  display: grid; place-items: center; background: rgba(0,0,0,.35); border: 1px solid rgba(255,255,255,.3);
  transition: background .15s ease;
}
.genre-card:hover .genre-card-play { background: var(--gradient); border-color: transparent; }
.genre-card-play .icon { width: 14px; height: 14px; }

/* =========================================================
   Side "skyscraper" ad banners (160x600) — fixed to the viewport
   edges, only shown once there's genuinely free space beside the
   1600px content container (roughly 2000px+ browser width) so they
   never crowd or shrink the actual content on normal screens.
   ========================================================= */
.side-banner {
  display: none;
  position: fixed; top: calc(var(--header-h) + env(safe-area-inset-top, 0px) + 24px);
  width: 160px; height: 600px; z-index: 50;
  border-radius: var(--radius-md); overflow: hidden;
  border: 1px dashed var(--border-strong); background: var(--surface-2);
}
.side-banner--left { left: max(20px, calc((100vw - var(--container)) / 2 - 180px)); }
.side-banner--right { right: max(20px, calc((100vw - var(--container)) / 2 - 180px)); }
.side-banner img { width: 100%; height: 100%; object-fit: cover; display: block; }
.side-banner a { display: block; width: 100%; height: 100%; }
.side-banner-placeholder {
  width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;
  text-align: center; padding: 1rem; color: var(--text-faint); font-size: .78rem; font-weight: 600;
  letter-spacing: .02em;
}
@media (min-width: 1900px) {
  .side-banner { display: block; }
}

/* In-content banner (300x250) — part of the normal page flow, so
   unlike the side skyscrapers it shows on every screen size. */
.inline-banner-wrap { display: flex; justify-content: center; margin-block: 1rem; }
.inline-banner {
  width: 300px; height: 250px; border-radius: var(--radius-md); overflow: hidden;
  border: 1px dashed var(--border-strong); background: var(--surface-2);
}
.inline-banner img { width: 100%; height: 100%; object-fit: cover; display: block; }
.inline-banner a { display: block; width: 100%; height: 100%; }
.inline-banner .side-banner-placeholder { font-size: .82rem; }

/* Full-width horizontal banner — each page (Inicio, Géneros, ...) gets
   its own independent one via includes/horizontal-banner.php. Uses a
   fixed aspect ratio instead of a fixed pixel height so it scales
   smoothly from a wide desktop banner down to a slim mobile strip,
   using the exact same image (no separate mobile crop needed). */
.horizontal-banner-wrap { margin-block: 1.5rem; }
.horizontal-banner {
  width: 100%; aspect-ratio: 7.5 / 1; border-radius: var(--radius-lg); overflow: hidden;
  border: 1px dashed var(--border-strong); background: var(--surface-2);
}
.horizontal-banner img { width: 100%; height: 100%; object-fit: cover; display: block; }
.horizontal-banner a { display: block; width: 100%; height: 100%; }
.horizontal-banner .side-banner-placeholder { font-size: clamp(.7rem, 2vw, .95rem); }

/* =========================================================
   Placeholder "coming soon" pages (Géneros, Programación, etc.)
   ========================================================= */
.coming-soon {
  min-height: 50vh; display: flex; flex-direction: column; align-items: center;
  justify-content: center; text-align: center; gap: .9rem; padding-block: 3rem;
}
.coming-soon-icon {
  width: 64px; height: 64px; border-radius: 50%; display: grid; place-items: center;
  background: var(--surface-2); border: 1px solid var(--border); color: var(--accent-1);
}
.coming-soon-icon .icon { width: 28px; height: 28px; }
.coming-soon h1 { font-family: var(--font-display); font-size: clamp(1.6rem, 4vw, 2.2rem); font-weight: 700; }
.coming-soon p { color: var(--text-dim); max-width: 460px; }
.coming-soon .btn { margin-top: .5rem; }

/* =========================================================
   Floating WhatsApp share button
   ========================================================= */
.whatsapp-fab {
  position: fixed; left: 1.1rem; bottom: calc(1.1rem + env(safe-area-inset-bottom, 0px)); z-index: 140;
  width: 56px; height: 56px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--gradient); color: #fff;
  box-shadow: 0 8px 24px rgba(99, 102, 241, .45);
  transition: transform .15s ease, box-shadow .15s ease;
}
.whatsapp-fab:hover { transform: scale(1.06); box-shadow: 0 10px 28px rgba(99, 102, 241, .55); }
.whatsapp-fab .icon { width: 28px; height: 28px; }

/* =========================================================
   ASISTENTE DEL OYENTE — único botón flotante de la izquierda.
   Sustituye al antiguo botón de WhatsApp (compartir ahora es una
   opción del menú). Ver includes/assistant-fab.php
   ========================================================= */
.assistant-fab {
  position: fixed; left: 1.1rem; bottom: calc(1.1rem + env(safe-area-inset-bottom, 0px));
  z-index: 145;
  display: flex; flex-direction: column; align-items: flex-start; gap: .65rem;
  /* El contenedor no intercepta clics: solo el botón y el panel. Sin
     esto, su caja invisible se come los toques de lo que tenga debajo. */
  pointer-events: none;
}
.assistant-fab > * { pointer-events: auto; }

/* --- El botón redondo ------------------------------------------------ */
.assistant-fab-toggle {
  position: relative;
  width: 56px; height: 56px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--gradient); color: #fff; border: 0; cursor: pointer;
  box-shadow: 0 8px 24px rgba(99, 102, 241, .45);
  transition: transform .18s cubic-bezier(.34, 1.56, .64, 1), box-shadow .18s ease;
}
.assistant-fab-toggle:hover { transform: scale(1.07); box-shadow: 0 12px 30px rgba(99, 102, 241, .6); }
.assistant-fab-toggle:active { transform: scale(.96); }
.assistant-fab-toggle .icon { width: 26px; height: 26px; grid-area: 1 / 1; transition: opacity .18s ease, transform .18s ease; }
/* El logo de WhatsApp es de relleno y se ve algo más pequeño que un
   icono de trazo al mismo tamaño: se compensa acá para que ocupe el
   círculo igual que antes. */
.assistant-fab-toggle .assistant-icon-open { width: 28px; height: 28px; }
.assistant-fab-toggle .assistant-icon-close { opacity: 0; transform: rotate(-90deg) scale(.6); }
.assistant-fab.is-open .assistant-fab-toggle .assistant-icon-close { opacity: 1; transform: none; }
.assistant-fab.is-open .assistant-fab-toggle .assistant-icon-open { opacity: 0; transform: rotate(90deg) scale(.6); }

/* Halo suave que late mientras nadie lo ha abierto — llama la atención
   sin moverse ni ocupar espacio extra. */
.assistant-fab-ping {
  position: absolute; inset: 0; border-radius: 50%;
  background: var(--gradient); opacity: .55;
  animation: assistant-ping 2.6s cubic-bezier(0, 0, .2, 1) infinite;
  z-index: -1;
}
.assistant-fab.is-open .assistant-fab-ping { display: none; }
@keyframes assistant-ping {
  0%   { transform: scale(1);   opacity: .5; }
  70%  { transform: scale(1.5); opacity: 0; }
  100% { transform: scale(1.5); opacity: 0; }
}

/* --- El panel --------------------------------------------------------- */
.assistant-panel {
  order: -1; /* se abre HACIA ARRIBA: nunca tapa el botón */
  width: min(360px, calc(100vw - 2.2rem));
  height: min(72vh, 560px);
  display: flex; flex-direction: column; overflow: hidden;
  background: var(--bg-card, #15101f);
  border: 1px solid var(--border-strong);
  border-radius: 20px;
  box-shadow: 0 24px 60px rgba(0, 0, 0, .6);
  opacity: 0; visibility: hidden; transform: translateY(14px) scale(.96);
  transform-origin: bottom left;
  transition: opacity .22s ease, transform .22s cubic-bezier(.34, 1.3, .64, 1), visibility .22s ease;
}
.assistant-fab.is-open .assistant-panel { opacity: 1; visibility: visible; transform: none; }

.assistant-head {
  flex: 0 0 auto;
  display: flex; align-items: center; gap: .65rem;
  padding: .75rem .85rem; border-bottom: 1px solid var(--border);
  background: linear-gradient(180deg, rgba(168, 85, 247, .16), rgba(255, 255, 255, .02));
}
.assistant-avatar {
  width: 42px; height: 42px; border-radius: 50%; flex: 0 0 auto; overflow: hidden;
  display: grid; place-items: center; background: #0d0a16; color: #fff;
  border: 1px solid rgba(168, 85, 247, .45);
  box-shadow: 0 4px 14px rgba(99, 102, 241, .45);
}
.assistant-avatar img, .assistant-avatar picture { width: 100%; height: 100%; display: block; object-fit: cover; }
.assistant-avatar .icon { width: 19px; height: 19px; }
.assistant-head-text { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.assistant-head-text strong { font-size: .95rem; line-height: 1.2; }
.assistant-status { font-size: .74rem; color: var(--text-dim); line-height: 1.35; display: flex; align-items: center; gap: .35rem; }
/* Latido LENTO (3.2s). Un parpadeo rápido lee como "alerta" y cansa la
   vista mientras alguien escribe; esto solo indica que está conectado. */
.assistant-status::before {
  content: ''; width: 6px; height: 6px; border-radius: 50%; background: #4ade80; flex: 0 0 auto;
  animation: assistant-latido 2.4s ease-in-out infinite;
}
@keyframes assistant-latido {
  0%   { opacity: 1;   box-shadow: 0 0 0 0 rgba(74, 222, 128, .7); }
  45%  { opacity: .15; box-shadow: 0 0 0 5px rgba(74, 222, 128, 0); }
  70%  { opacity: 1;   box-shadow: 0 0 0 0 rgba(74, 222, 128, 0); }
  100% { opacity: 1;   box-shadow: 0 0 0 0 rgba(74, 222, 128, .7); }
}
.assistant-head-btn {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
  display: grid; place-items: center; border: 0; cursor: pointer;
  background: rgba(255, 255, 255, .07); color: var(--text-dim);
  transition: background .15s ease, color .15s ease;
}
.assistant-head-btn:hover { color: var(--text); background: rgba(255, 255, 255, .14); }
.assistant-head-btn .icon { width: 16px; height: 16px; }

/* --- Hilo de la conversación ------------------------------------------ */
.assistant-body {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  padding: .85rem; display: flex; flex-direction: column; gap: .55rem;
  overscroll-behavior: contain; scrollbar-width: thin;
}
.assistant-body::-webkit-scrollbar { width: 6px; }
.assistant-body::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }

.assistant-msg {
  max-width: 88%; padding: .55rem .75rem; border-radius: 15px;
  font-size: .86rem; line-height: 1.5; white-space: pre-wrap;
  overflow-wrap: anywhere;
  animation: assistant-in .22s ease both;
}
@keyframes assistant-in { from { opacity: 0; transform: translateY(6px); } }
.assistant-msg.is-bot { align-self: flex-start; background: rgba(255, 255, 255, .07); border-bottom-left-radius: 5px; }
.assistant-msg.is-yo {
  align-self: flex-end; background: var(--gradient); color: #fff; border-bottom-right-radius: 5px;
  box-shadow: 0 4px 14px rgba(99, 102, 241, .3);
}
.assistant-msg.is-sistema {
  align-self: center; max-width: 100%; text-align: center;
  font-size: .78rem; color: #4ade80; background: rgba(74, 222, 128, .12);
  border: 1px solid rgba(74, 222, 128, .25);
}
.assistant-msg.is-typing { opacity: .6; font-style: italic; }

.assistant-link { color: var(--accent-1, #a855f7); text-decoration: underline; text-underline-offset: 2px; }
.assistant-msg.is-yo .assistant-link { color: #fff; }

/* --- Botones de acción bajo una respuesta ------------------------------ */
.assistant-actions {
  display: flex; flex-direction: column; align-items: flex-start; gap: .35rem;
  animation: assistant-in .22s ease both;
}
.assistant-actions.is-wrap { flex-direction: row; flex-wrap: wrap; }
.assistant-action {
  display: inline-block; cursor: pointer; text-decoration: none;
  padding: .45rem .85rem; border-radius: 999px; border: 0;
  background: var(--gradient); color: #fff; font-weight: 600; font-size: .8rem; line-height: 1.3;
  transition: transform .14s ease, box-shadow .14s ease;
}
.assistant-action:hover { transform: translateY(-1px); box-shadow: 0 6px 16px rgba(99, 102, 241, .45); }
.assistant-action.is-ghost {
  background: transparent; color: var(--text-dim);
  border: 1px solid var(--border-strong); font-weight: 500;
}
.assistant-action.is-ghost:hover { color: var(--text); border-color: var(--accent-1); box-shadow: none; }

/* --- El menú de opciones ---------------------------------------------- */
.assistant-menu {
  display: flex; flex-direction: column; gap: .3rem;
  animation: assistant-in .22s ease both;
}
.assistant-menu-title {
  margin: .2rem 0 .1rem; font-size: .76rem; font-weight: 600;
  color: var(--text-dim); text-transform: uppercase; letter-spacing: .06em;
}
.assistant-menu-item {
  display: flex; align-items: center; gap: .65rem; width: 100%; text-align: left;
  padding: .55rem .6rem; border-radius: 13px; cursor: pointer;
  background: rgba(255, 255, 255, .04); border: 1px solid transparent; color: inherit;
  transition: background .15s ease, border-color .15s ease, transform .12s ease;
}
.assistant-menu-item:hover {
  background: rgba(255, 255, 255, .09); border-color: var(--border-strong); transform: translateX(2px);
}
.assistant-menu-icon {
  flex: 0 0 auto; width: 32px; height: 32px; border-radius: 10px;
  display: grid; place-items: center;
  background: rgba(168, 85, 247, .16); color: var(--accent-1, #a855f7);
}
.assistant-menu-icon .icon { width: 16px; height: 16px; }
.assistant-menu-text { display: flex; flex-direction: column; min-width: 0; }
.assistant-menu-text strong { font-size: .855rem; font-weight: 600; line-height: 1.25; }
.assistant-menu-text span { font-size: .73rem; color: var(--text-dim); line-height: 1.3; }

/* Las 4 opciones extra viven acá: ocultas por defecto para que el panel
   no se estire de más, a un toque de distancia. */
.assistant-menu-extra { display: flex; flex-direction: column; gap: .3rem; }
.assistant-menu-extra[hidden] { display: none; }
.assistant-menu-more {
  position: relative; overflow: hidden;
  display: flex; align-items: center; justify-content: center; gap: .45rem;
  width: 100%; margin-top: .35rem; padding: .5rem .9rem;
  border-radius: 13px; cursor: pointer;
  /* Mismo lenguaje que las tarjetas del menú (violeta translúcido sobre
     el panel oscuro), pero con el borde en degradado de la marca para
     que se lea como "acción", no como una opción más de la lista. */
  background: linear-gradient(135deg, rgba(168, 85, 247, .18), rgba(99, 102, 241, .14));
  border: 1px solid rgba(168, 85, 247, .35);
  color: var(--text); font-size: .8rem; font-weight: 600; letter-spacing: .01em;
  transition: border-color .18s ease, box-shadow .18s ease, transform .14s ease;
}
.assistant-menu-more:hover {
  border-color: rgba(168, 85, 247, .8);
  box-shadow: 0 6px 18px rgba(99, 102, 241, .28);
  transform: translateY(-1px);
}
.assistant-menu-more:active { transform: translateY(0); }

/* Brillo que cruza el botón cada pocos segundos: sugiere "aquí hay más"
   sin mover nada de sitio ni ocupar espacio extra. */
.assistant-menu-more::before {
  content: ''; position: absolute; top: 0; bottom: 0; left: -60%; width: 45%;
  background: linear-gradient(100deg, transparent, rgba(255, 255, 255, .16), transparent);
  animation: assistant-brillo 4.5s ease-in-out infinite;
}
.assistant-menu-more.is-open::before { animation: none; opacity: 0; }
@keyframes assistant-brillo {
  0%, 55% { left: -60%; }
  85%     { left: 115%; }
  100%    { left: 115%; }
}

/* Cuántas opciones quedan escondidas — lo rellena el JS. */
.assistant-menu-more-count {
  display: inline-grid; place-items: center; min-width: 19px; height: 19px;
  padding: 0 .3rem; border-radius: 999px;
  background: var(--gradient); color: #fff; font-size: .68rem; font-weight: 700;
}
.assistant-menu-more.is-open .assistant-menu-more-count { display: none; }

/* El sprite solo trae la flecha hacia ARRIBA (#icon-chevron-up), así que
   en reposo se gira 180° para que apunte hacia abajo ("desplegar") y al
   abrir vuelve a su posición original ("plegar"). */
.assistant-menu-more .assistant-menu-more-arrow {
  width: 14px; height: 14px; flex: 0 0 auto;
  color: var(--accent-1, #a855f7);
  transform: rotate(180deg); transition: transform .22s ease;
}
.assistant-menu-more.is-open .assistant-menu-more-arrow { transform: rotate(0deg); }

/* --- Pie: "Mostrar menú" + campo de texto ------------------------------ */
.assistant-foot {
  flex: 0 0 auto; border-top: 1px solid var(--border);
  background: rgba(255, 255, 255, .02); padding: .5rem .8rem .35rem;
}
.assistant-menu-btn {
  display: flex; align-items: center; gap: .4rem; margin: 0 auto .5rem;
  padding: .35rem .8rem; border-radius: 999px; cursor: pointer;
  background: rgba(255, 255, 255, .06); border: 1px solid var(--border-strong);
  color: var(--text-dim); font-size: .78rem; font-weight: 600;
  transition: color .15s ease, border-color .15s ease;
}
.assistant-menu-btn:hover { color: var(--text); border-color: var(--accent-1); }
.assistant-menu-btn[hidden] { display: none; }
.assistant-menu-btn .icon { width: 14px; height: 14px; }

.assistant-form { display: flex; gap: .4rem; }
.assistant-form input {
  flex: 1 1 auto; min-width: 0; padding: .6rem .85rem; font-size: .86rem;
  border-radius: 999px; border: 1px solid var(--border-strong);
  background: rgba(255, 255, 255, .05); color: var(--text);
}
.assistant-form input::placeholder { color: var(--text-dim); }
.assistant-form input:focus {
  outline: none; border-color: var(--accent-1);
  box-shadow: 0 0 0 3px rgba(168, 85, 247, .18);
}
.assistant-form button {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 50%; border: 0; cursor: pointer;
  display: grid; place-items: center; background: var(--gradient); color: #fff;
  transition: transform .14s ease;
}
.assistant-form button:hover:not(:disabled) { transform: scale(1.06); }
.assistant-form button:disabled { opacity: .5; cursor: default; }
.assistant-form button .icon { width: 17px; height: 17px; }

.assistant-note { margin: .35rem 0 .3rem; text-align: center; font-size: .68rem; color: var(--text-dim); }

/* --- Responsive -------------------------------------------------------- */
@media (max-width: 560px) {
  .assistant-fab { right: 1.1rem; }
  .assistant-panel {
    width: 100%;
    /* Alto real de pantalla en iOS (dvh evita que la barra de Safari
       recorte el panel por abajo, con vh de respaldo donde no exista). */
    height: 70vh; height: min(70dvh, 560px);
    transform-origin: bottom center;
  }
  .assistant-msg { max-width: 92%; font-size: .875rem; }
  .assistant-menu-text strong { font-size: .88rem; }
}
@media (max-height: 520px) {
  .assistant-panel { height: calc(100vh - 8rem); }
}
@media (prefers-reduced-motion: reduce) {
  .assistant-panel, .assistant-fab-toggle, .assistant-fab-toggle .icon,
  .assistant-msg, .assistant-menu, .assistant-actions { transition: none; animation: none; }
  .assistant-fab-ping { animation: none; opacity: 0; }
  .assistant-status::before { animation: none; opacity: 1; }
}
.scroll-top-fab {
  position: fixed; right: 1.1rem; bottom: calc(1.1rem + env(safe-area-inset-bottom, 0px)); z-index: 140;
  width: 56px; height: 56px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--gradient); color: #fff; border: 0; cursor: pointer;
  box-shadow: 0 8px 24px rgba(99, 102, 241, .45);
  transition: transform .15s ease, box-shadow .15s ease, opacity .2s ease, visibility .2s ease;
  opacity: 0; visibility: hidden; transform: translateY(8px);
}
.scroll-top-fab.is-visible { opacity: 1; visibility: visible; transform: translateY(0); }
.scroll-top-fab:hover { transform: scale(1.06); box-shadow: 0 10px 28px rgba(99, 102, 241, .55); }
.scroll-top-fab .icon { width: 24px; height: 24px; }

/* =========================================================
   Invitación flotante al boletín (solo home) — ver includes/footer.php
   Apilada encima del botón de "subir": mismo borde derecho, mismo
   tamaño cerrada, así los tres flotantes se leen como un grupo.
   ========================================================= */
.news-fab {
  position: fixed; right: 1.1rem;
  /* 56px del scroll-top + 0.75rem de aire entre ambos */
  bottom: calc(1.1rem + 56px + .75rem + env(safe-area-inset-bottom, 0px));
  z-index: 141;
  display: flex; flex-direction: column; align-items: flex-end; gap: .6rem;
  /* Oculto hasta bajar bastante en la página (ver initNewsFabReveal en
     includes/footer.php) — mismo umbral y mismo criterio que ya usa el
     botón de "subir" de al lado, así los dos aparecen juntos.
     De paso, esto evita del todo que el botón pueda llegar a superponerse
     con el reproductor (que vive arriba de todo, en el hero): al no
     estar presente todavía cuando alguien recién entra a la página, no
     hay nada que tapar el botón de Play, pase lo que pase con el
     cálculo de la barra de Safari. */
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .25s ease;
}
.news-fab.is-visible { opacity: 1; visibility: visible; }
/* Solo el botón y el panel reciben clics: en móvil el contenedor se
   estira de borde a borde (ver la regla de 480px de más abajo) y, con
   pointer-events en el contenedor, esa franja invisible se comía los
   toques de lo que hubiera debajo. */
.news-fab.is-visible > * { pointer-events: auto; }
.news-fab-toggle {
  display: flex; align-items: center; gap: 0;
  height: 56px; padding: 0; border: 0; cursor: pointer;
  border-radius: 999px; background: var(--gradient); color: #fff;
  box-shadow: 0 8px 24px rgba(99, 102, 241, .45);
  transition: gap .22s ease, padding .22s ease, transform .15s ease, box-shadow .15s ease;
  overflow: hidden;
}
.news-fab-toggle .icon { width: 26px; height: 26px; flex: 0 0 auto; margin: 0 15px; }
.news-fab-label {
  max-width: 0; opacity: 0; white-space: nowrap;
  font-weight: 600; font-size: .92rem; line-height: 1;
  transition: max-width .28s ease, opacity .2s ease;
}
/* Escritorio: se despliega sola al pasar el mouse. */
@media (hover: hover) and (pointer: fine) {
  .news-fab-toggle:hover { box-shadow: 0 10px 28px rgba(99, 102, 241, .55); }
  .news-fab-toggle:hover .news-fab-label,
  .news-fab-toggle:focus-visible .news-fab-label { max-width: 260px; opacity: 1; }
  .news-fab-toggle:hover .icon,
  .news-fab-toggle:focus-visible .icon { margin-right: 10px; }
  .news-fab-toggle:hover { padding-right: 20px; }
}
/* Abierta (clic/tap): el texto queda visible en cualquier dispositivo. */
.news-fab.is-open .news-fab-label { max-width: 260px; opacity: 1; }
.news-fab.is-open .news-fab-toggle { padding-right: 20px; }
.news-fab.is-open .news-fab-toggle .icon { margin-right: 10px; }

.news-fab-panel {
  order: -1; /* el panel se abre HACIA ARRIBA, no tapa los otros botones */
  width: min(310px, calc(100vw - 2.2rem));
  background: var(--bg-card, #15101f);
  border: 1px solid var(--border-strong);
  border-radius: 16px; padding: 1rem 1rem .9rem;
  box-shadow: 0 18px 44px rgba(0, 0, 0, .5);
  position: relative;
  opacity: 0; visibility: hidden; transform: translateY(10px) scale(.97);
  transform-origin: bottom right;
  transition: opacity .2s ease, transform .2s ease, visibility .2s ease;
}
.news-fab.is-open .news-fab-panel { opacity: 1; visibility: visible; transform: translateY(0) scale(1); }
.news-fab-close {
  position: absolute; top: .45rem; right: .6rem;
  background: none; border: 0; cursor: pointer;
  color: var(--text-dim); font-size: 1.4rem; line-height: 1; padding: .1rem .3rem;
}
.news-fab-close:hover { color: var(--text); }
.news-fab-title { display: block; font-size: .98rem; margin-bottom: .3rem; padding-right: 1.2rem; }
.news-fab-text { color: var(--text-dim); font-size: .84rem; line-height: 1.45; margin: 0 0 .8rem; }
.news-fab-form { display: flex; flex-direction: column; gap: .5rem; }
.news-fab-form input[type="email"] {
  width: 100%; padding: .6rem .8rem; font-size: .9rem;
  border-radius: 10px; border: 1px solid var(--border-strong);
  background: rgba(255, 255, 255, .04); color: var(--text);
}
.news-fab-form input[type="email"]:focus {
  outline: none; border-color: var(--accent-1);
  box-shadow: 0 0 0 3px rgba(168, 85, 247, .18);
}
.news-fab-form button[type="submit"] {
  padding: .6rem 1rem; border: 0; border-radius: 10px; cursor: pointer;
  background: var(--gradient); color: #fff; font-weight: 600; font-size: .9rem;
}
.news-fab-form button[type="submit"]:disabled { opacity: .6; cursor: default; }
.news-fab-status { margin: .6rem 0 0; font-size: .82rem; line-height: 1.4; }
.news-fab-status.is-ok { color: #4ade80; }
.news-fab-status.is-error { color: #f87171; }

/* Móvil: el panel se centra para no salirse por el borde derecho. */
@media (max-width: 480px) {
  .news-fab { left: 1.1rem; right: 1.1rem; align-items: flex-end; }
  .news-fab-panel { width: 100%; transform-origin: bottom center; }
}

.install-banner {
  position: fixed; left: 1rem; right: 1rem; bottom: calc(1rem + env(safe-area-inset-bottom, 0px)); z-index: 150;
  max-width: 420px; margin-inline: auto;
  background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-card); padding: 1rem 1.1rem;
  display: none; align-items: center; gap: .9rem;
  transform: translateY(12px); opacity: 0; transition: transform .25s ease, opacity .25s ease;
}
.install-banner.is-visible { display: flex; transform: translateY(0); opacity: 1; }
.install-banner .brand-mark { width: 42px; height: 42px; flex-shrink: 0; }
.install-banner-text { flex: 1; min-width: 0; }
.install-banner-text strong { display: block; font-size: .88rem; }
.install-banner-text p { font-size: .76rem; color: var(--text-dim); margin-top: .15rem; }
.install-banner-actions { display: flex; flex-direction: column; gap: .4rem; }
.install-banner-actions button { font-size: .78rem; padding: .45rem .8rem; }
.install-dismiss { background: none; color: var(--text-faint); }

/* =========================================================
   Mobile nav drawer
   ========================================================= */
.mobile-nav {
  position: fixed; inset: 0; z-index: 190; background: color-mix(in srgb, var(--bg) 96%, transparent);
  backdrop-filter: blur(10px);
  display: flex; flex-direction: column;
  padding: calc(1.25rem + env(safe-area-inset-top, 0px)) 1.25rem calc(1.25rem + env(safe-area-inset-bottom, 0px));
  transform: translateX(100%); transition: transform .28s ease;
}
/* El atributo [hidden] del HTML (ver includes/head.php) por sí solo NO
   alcanza para ocultar este panel: la regla ".mobile-nav { display: flex }"
   de arriba tiene la MISMA especificidad que el "[hidden] { display: none }"
   del navegador, y en CSS el estilo del autor le gana al del navegador
   cuando empatan — así que sin esta línea el panel queda SIEMPRE
   presente en el layout (position:fixed; inset:0, del tamaño de toda la
   pantalla), solo corrido visualmente con el transform. En Android eso
   se traducía en un ancho extra "fantasma" a la derecha de toda la
   página cuando el menú está cerrado (ver overflow-x: hidden en html/body
   más arriba, que es la protección general — esto ataca la causa
   puntual). Con esta regla, en reposo (cerrado, con [hidden] puesto) el
   panel es display:none de verdad y no aporta nada al ancho de la
   página; main.js sigue abriendo/cerrando exactamente igual (le saca el
   atributo hidden al abrir, se lo vuelve a poner 280ms después de
   cerrar, lo que ya hacía antes — ver initMobileNav en assets/js/main.js),
   así que la animación de deslizamiento no cambia en nada. */
.mobile-nav[hidden] { display: none; }
.mobile-nav.is-open { transform: translateX(0); }
.mobile-nav-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 2rem; }
.mobile-nav ul { display: flex; flex-direction: column; gap: .3rem; }
.mobile-nav a {
  display: block; padding: .9rem .3rem; font-size: .92rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em;
  border-bottom: 1px solid var(--border);
}
.mobile-nav a[aria-current="page"] { color: var(--accent-1); }

@media (min-width: 980px) {
  .main-nav { display: block; }
  .menu-toggle { display: none; }
}

/* =========================================================
   Responsive tweaks
   ========================================================= */
@media (max-width: 640px) {
  .header-actions .btn-gradient span { display: none; }
  .header-actions .btn-gradient { padding: .7rem; }
  .lang-switch { order: -1; margin-right: .3rem; }
  .header-actions { gap: .4rem; }
  .icon-btn { width: 38px; height: 38px; }
  .brand { font-size: 1.05rem; gap: .4rem; margin-right: .2rem; }
  .brand-mark { width: 28px; height: 28px; }
}

@media (max-width: 899px) {
  .content-grid > * { min-width: 0; }
}

/* =========================================================
   Noticias — listado, tarjeta, artículo individual
   ========================================================= */
.empty {
  padding: 2.5rem 1.5rem; text-align: center; color: var(--text-faint);
  background: var(--surface); border: 1px dashed var(--border); border-radius: var(--radius-lg);
}

.news-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 1.25rem;
  margin-top: 1.5rem;
}

.news-card {
  display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-card);
  transition: transform .18s ease, border-color .18s ease;
}
.news-card:hover { transform: translateY(-3px); border-color: var(--border-strong); }
.news-card-image { position: relative; aspect-ratio: 16 / 9; background: var(--surface-2); overflow: hidden; }
.news-card-image img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.news-card-image-placeholder { position: absolute; inset: 0; display: grid; place-items: center; color: var(--text-faint); }
.news-card-image-placeholder .icon { width: 28px; height: 28px; }
.news-card-body { padding: 1.1rem 1.2rem 1.3rem; display: flex; flex-direction: column; gap: .45rem; flex: 1; }
.news-card-tag {
  align-self: flex-start; font-size: .68rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: var(--accent-1); background: var(--gradient-soft); padding: .2rem .55rem; border-radius: var(--radius-full);
}
.news-card-title { font-family: var(--font-display); font-size: 1.02rem; font-weight: 700; line-height: 1.35; }
.news-card-excerpt {
  font-size: .85rem; color: var(--text-dim); line-height: 1.55;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.news-card-date { font-size: .76rem; color: var(--text-faint); margin-top: auto; padding-top: .3rem; }

/* --- Paginador (listado) --- */
.pager { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: 2rem; justify-content: center; }
.pager-link {
  min-width: 38px; height: 38px; display: grid; place-items: center; padding-inline: .5rem;
  border: 1px solid var(--border); border-radius: var(--radius-full); font-size: .85rem; font-weight: 600;
  color: var(--text-dim);
}
.pager-link:hover { border-color: var(--border-strong); color: var(--text); }
.pager-link.is-active { background: var(--gradient); color: #fff; border-color: transparent; }

/* --- Artículo individual --- */
.news-article-container { max-width: 760px; }
.news-breadcrumb { font-size: .8rem; color: var(--text-faint); margin-bottom: 1rem; }
.news-breadcrumb a { color: var(--text-dim); }
.news-breadcrumb a:hover { color: var(--accent-1); }

.news-tags { display: flex; flex-wrap: wrap; gap: .4rem; margin-bottom: .8rem; }
.news-tag {
  font-size: .74rem; font-weight: 600; color: var(--text-dim); background: var(--surface-2);
  border: 1px solid var(--border); padding: .25rem .65rem; border-radius: var(--radius-full);
}
/* Etiquetas al pie del artículo, debajo del botón de WhatsApp — mismo
   chip que arriba, solo con su propio espaciado de separador. */
.news-tags--bottom {
  margin-top: 1.75rem; margin-bottom: 0; padding-top: 1.5rem; border-top: 1px solid var(--border);
}

.news-article-title {
  font-family: var(--font-display); font-size: clamp(1.6rem, 4vw, 2.4rem); font-weight: 800;
  letter-spacing: -.01em; line-height: 1.2;
}
.news-article-date { font-size: .84rem; color: var(--text-faint); margin-top: .5rem; }

.news-article-image {
  width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: var(--radius-lg);
  margin-top: 1.5rem; background: var(--surface-2);
}
.news-article-excerpt {
  font-size: 1.05rem; color: var(--text-dim); line-height: 1.65; margin-top: 1.25rem;
  font-family: var(--font-display); font-weight: 500;
}

.news-video-embed {
  position: relative; width: 100%; aspect-ratio: 16 / 9; margin-top: 1.5rem;
  border-radius: var(--radius-lg); overflow: hidden; background: #000;
}
.news-video-embed iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }

/* Contenido del editor del panel — solo negrita/cursiva/fuente/listas
   sobreviven al saneado del servidor (ver out2fi_news_sanitize_content()
   en api/lib/news.php), así que el CSS aquí solo necesita cubrir eso. */
.news-article-content { margin-top: 1.5rem; font-size: 1rem; line-height: 1.8; color: var(--text); }
.news-article-content p { margin: 0 0 1.1rem; }
.news-article-content ul, .news-article-content ol { margin: 0 0 1.1rem; padding-left: 1.4rem; }
.news-article-content li { margin-bottom: .4rem; }
.news-article-content b, .news-article-content strong { font-weight: 700; color: var(--text); }
.news-article-content i, .news-article-content em { font-style: italic; }

.news-social-links { margin-top: 2rem; padding-top: 1.5rem; border-top: 1px solid var(--border); }
.news-social-label { font-size: .8rem; font-weight: 700; color: var(--text-dim); margin-bottom: .6rem; }
.news-social-icons { display: flex; gap: .6rem; }
.news-social-icons a {
  width: 40px; height: 40px; display: grid; place-items: center; border-radius: var(--radius-full);
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
  transition: color .18s ease, border-color .18s ease;
}
.news-social-icons a:hover { color: var(--accent-1); border-color: var(--accent-1); }
.news-social-icons .icon { width: 18px; height: 18px; }

.news-share-btn {
  display: inline-flex; align-items: center; gap: .5rem; margin-top: 1.5rem;
  padding: .6rem 1.1rem; border-radius: var(--radius-full); font-size: .86rem; font-weight: 600;
  color: var(--text-dim); border: 1px solid var(--border); background: var(--surface);
}
.news-share-btn:hover { color: var(--text); border-color: var(--border-strong); }
.news-share-btn .icon { width: 17px; height: 17px; }

@media (max-width: 640px) {
  .news-grid { grid-template-columns: 1fr; }
}

/* --- Layout de dos columnas: contenido + barra lateral --- */
.news-layout { display: grid; grid-template-columns: 1fr; gap: 2rem; align-items: start; margin-top: 1.5rem; }
@media (min-width: 1000px) {
  .news-layout { grid-template-columns: minmax(0, 1fr) 300px; }
}
/* Dentro del artículo, .news-layout ya está a un nivel de anidación más
   (article > container > news-layout), así que no necesita el
   margin-top de arriba (el h1 ya trae su propio espaciado). */
.news-article-container .news-layout,
.news-article .news-layout { margin-top: 0; }

.news-sidebar { display: flex; flex-direction: column; gap: 1.25rem; position: sticky; top: calc(var(--header-h) + 1.5rem); }
.news-sidebar-box {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
  padding: 1.1rem; box-shadow: var(--shadow-card);
}
.news-sidebar-box--flush { padding: 0; padding-bottom: 1rem; overflow: hidden; }
.news-sidebar-title {
  font-family: var(--font-display); font-size: .8rem; font-weight: 800;
  text-transform: uppercase; letter-spacing: .07em; color: var(--text);
  display: flex; align-items: center; gap: .5rem;
  margin: 0 0 .9rem; padding-bottom: .8rem; border-bottom: 1px solid var(--border);
}
.news-sidebar-title .icon {
  width: 15px; height: 15px; flex-shrink: 0; color: #fff; padding: 4px; border-radius: var(--radius-sm);
  background: var(--gradient); box-shadow: var(--shadow-glow);
}
.news-sidebar-title--flush { padding: 1rem 1.1rem .8rem; margin-bottom: 0; }

.news-search-form { display: flex; gap: .5rem; }
.news-search-form input {
  flex: 1; font-size: .88rem; background: var(--bg-soft, var(--surface-2)); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--radius-full); padding: .55rem .95rem;
}
.news-search-form button {
  width: 40px; height: 40px; flex-shrink: 0; display: grid; place-items: center;
  border-radius: var(--radius-full); background: var(--gradient); color: #fff; border: none; cursor: pointer;
}
.news-search-form button .icon { width: 16px; height: 16px; }

.news-subscribe-form { display: flex; flex-direction: column; gap: .6rem; }
.news-subscribe-form input[type="email"] {
  font-size: .88rem; background: var(--bg-soft, var(--surface-2)); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--radius-sm); padding: .6rem .85rem;
}
.news-subscribe-form input[type="email"]:focus { outline: none; border-color: var(--accent-1); }
.news-subscribe-form button {
  border: none; border-radius: var(--radius-full); background: var(--gradient); color: #fff;
  font-weight: 700; font-size: .86rem; padding: .62rem 1rem; cursor: pointer;
  transition: filter .15s, transform .12s;
}
.news-subscribe-form button:hover { filter: brightness(1.08); }
.news-subscribe-form button:disabled { opacity: .6; cursor: wait; }
.news-subscribe-status { margin: .6rem 0 0; font-size: .82rem; min-height: 1.1em; }
.news-subscribe-status.is-ok { color: var(--ok, #34d399); }
.news-subscribe-status.is-err { color: var(--err, #fb7185); }

.news-sidebar-tags { display: flex; flex-wrap: wrap; gap: .4rem; }
.news-sidebar-tags .news-tag { cursor: pointer; }
.news-sidebar-tags .news-tag:hover { border-color: var(--accent-1); color: var(--accent-1); }

.news-video-of-week { display: block; }
.news-video-of-week-thumb {
  position: relative; display: block; aspect-ratio: 16 / 9; border-radius: var(--radius-md);
  overflow: hidden; background: var(--surface-2);
}
.news-video-of-week-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.news-video-of-week-play {
  position: absolute; inset: 0; display: grid; place-items: center; background: rgba(8,6,15,.35);
  transition: background .18s ease;
}
.news-video-of-week-play .icon { width: 30px; height: 30px; color: #fff; filter: drop-shadow(0 2px 8px rgba(0,0,0,.5)); }
.news-video-of-week:hover .news-video-of-week-play { background: rgba(8,6,15,.15); }
.news-video-of-week-title {
  display: block; margin-top: .6rem; font-size: .86rem; font-weight: 600; color: var(--text); line-height: 1.4;
}
.news-video-of-week:hover .news-video-of-week-title { color: var(--accent-1); }

/* El widget de Spotify a veces muestra un borde blanco/gris alrededor
   del propio iframe, incluso con theme=0 (oscuro) puesto — es un bug
   conocido del lado de Spotify, reportado por bastante gente y sin
   arreglo oficial (es contenido de otro dominio, no podemos tocarle los
   estilos internos). Lo que SÍ podemos hacer: agrandar el iframe un
   poco más allá del ancho de la caja y usar el overflow:hidden de
   .news-sidebar-box--flush para recortar ese borde por fuera — el
   iframe sigue siendo el mismo, solo se le esconden los bordes. */
.news-spotify-embed { display: block; width: calc(100% + 12px); margin: 0 -6px; height: 352px; border: 0; }

.news-filter-note { margin-top: 1rem; font-size: .88rem; color: var(--text-dim); }
.news-filter-note a { color: var(--accent-1); font-weight: 600; margin-left: .4rem; }
.news-filter-note strong { color: var(--text); }

@media (max-width: 640px) {
  .news-sidebar { position: static; }
}