/*
 * Plantilla visual del sitio (Task 15), fiel a la plantilla Joomla yoo_vox
 * (variación de color "music") que usaba el sitio hasta ahora: fondo
 * oscuro texturado, acentos turquesa/petróleo, contenedor de 1300px,
 * columnas laterales oscuras y contenido central claro. Mismo aspecto,
 * CSS nuevo -sin frameworks, sin CDN-.
 *
 * Las rutas a imágenes son relativas a este archivo (assets/css/), no a la
 * página: por eso 'assets/img/...' y no una ruta absoluta escrita a mano.
 */

:root {
  --acento: #3d9fc4;
  --acento-oscuro: #165b75;
  --caja: #388eaf;
  --texto: #d8d8d8;
  /* La página ocupa todo el ancho de la pantalla (antes estaba topeada en
     1300px y centrada). El .contenedor sigue con su padding lateral, así el
     contenido no queda pegado a los bordes. */
  --ancho: 100%;
  --radio: 8px;

  /*
   * Los grises del yoo_vox 'music'. No son "parecidos": están MEDIDOS
   * pixel por pixel sobre el sitio original renderizado en Chrome
   * (docs/capturas/original-home-1400.png) y contra los propios PNG del
   * template, que siguen en e:/xampp/htdocs/rdc/templates/yoo_vox/.
   *
   * Son tres nada más, y esa es la mitad de por qué el original tiene
   * profundidad y la migración se veía plana: la migración usaba UN color
   * (#141414) con transparencias encima, o sea un solo plano.
   *
   *   --fondo-pagina  #232220  la textura page_bg.png del fondo
   *   --fondo-panel   #373635  los envoltorios (franja, columnas, pie)
   *   --modulo        #41403f  las cajas de las columnas laterales
   */
  --fondo-pagina: #232220;
  --fondo-panel: #373635;
  --modulo: #41403f;

  /*
   * La fila de pestañas del menú, del sprite images/menu_level1_item.png
   * (290x270, un estado cada 39px). Medido sobre el sprite Y sobre el
   * render: la pestaña normal es #232221 plano con una caída oscura en
   * los últimos 5px, y la activa es #373635 plano SIN caída -por eso se
   * funde con el panel de abajo, que es el mismo color-.
   */
  --pestana: #232221;
  --pestana-activa: #373635;
  --pestana-base: #121111;
  --texto-pestana: #969696;

  /* El borde de las cajas: 1px negro por fuera y 1px de brillo por
     dentro. Es lo que da el relieve, y es de los pocos trucos de 2011 que
     sigue siendo el más simple para lograrlo. */
  --linea: #000000;
  --brillo: #404040;
  --brillo-activo: #666666;

  --texto-modulo: #b4b4b4;
  --fondo-contenido: #faf9f8;
  --texto-contenido: #333333;
  --borde-panel: rgba(255, 255, 255, .08);

  /*
   * El color del anillo de foco SOBRE FONDO OSCURO (menú de cabecera,
   * columnas laterales, pie). El --acento del sitio (#3d9fc4) sobre la
   * pestaña #232221 da 4,3:1, que pasa raspando el 3:1 que pide la guía
   * para un indicador no textual; este da 9,4:1 y se ve de lejos, que es
   * de lo que se trata un indicador de foco.
   */
  --foco-oscuro: #8ed7f5;
  --triangulo: #d4241a;
}

/* ---------- Base ---------- */

*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  overflow-x: hidden;
}

/*
 * El fondo del sitio, que son DOS capas y no una. La migración se había
 * traído solo la primera y por eso se veía plano y parejo.
 *
 * 1. La textura: assets/img/fondo.png, que es byte a byte el mismo
 *    archivo que images/variations/music/page_bg.png del Joomla original
 *    (100x100, repetida).
 * 2. El halo: en el original es una FOTO, page_bg_img.jpg (1650x600,
 *    40 KB, '50% 0 no-repeat'), un degradado radial suave que aclara el
 *    centro de arriba y le da profundidad a la página.
 *
 * Acá el halo es un radial-gradient y no la foto, a propósito: 40 KB
 * menos, nítido en cualquier pantalla de alta densidad (un JPG de 1650px
 * de ancho estirado no lo es) y sin una imagen más que acordarse de meter
 * en el paquete. Los topes NO son inventados: salen de muestrear el JPG
 * original con GD sobre sus dos ejes -pico #6f6c67 en (52,8%, 0), y de
 * ahí hasta el #232220 del fondo en ~660px a los lados y ~600px hacia
 * abajo-. Comparados contra el original, los valores intermedios caen
 * dentro de 4 unidades sobre 255 en los dos ejes.
 *
 * El halo va PRIMERO (o sea, encima de la textura) porque en el original
 * el JPG vive en #page-body, que es hijo de body y lo tapa.
 */
body {
  margin: 0;
  overflow-x: hidden;
  font-family: Arial, Helvetica, sans-serif;
  color: var(--texto);
  background-color: var(--fondo-pagina);
  background-image:
    radial-gradient(660px 600px at 50% 0,
      #6f6c67 0%,
      #5a5653 32%,
      #423f3c 55%,
      #2d2c2a 78%,
      rgba(45, 44, 42, 0) 100%),
    url('../img/fondo.png');
  background-repeat: no-repeat, repeat;
  background-position: 50% 0, 50% 0;
  line-height: 1.6;
}

h1, h3, h5 { color: var(--acento); }
h2, h4, h6 { color: var(--acento-oscuro); }

a {
  color: var(--acento);
  text-decoration: none;
}

a:hover,
a:focus {
  color: var(--acento-oscuro);
  text-decoration: underline;
}

img {
  max-width: 100%;
}

ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

.contenedor {
  max-width: var(--ancho);
  margin: 0 auto;
  padding: 0 16px;
}

:focus-visible {
  outline: 2px solid var(--acento);
  outline-offset: 2px;
}

/* ---------- Encabezado: fecha, logo y fila de pestañas ---------- */

/*
 * El encabezado del original NO es una barra de ancho completo: el logo y
 * las pestañas se apoyan directamente sobre el fondo de la página -halo
 * incluido- y recién abajo empieza el panel. La migración lo tenía como
 * franja oscura de borde a borde, que tapaba justo la parte del halo que
 * más se ve. Por eso acá no hay ni fondo ni borde: los pone el body.
 *
 * z-index: la pestaña activa tiene que taparle el borde superior al panel
 * de abajo (así se funden en una sola pieza, que es el efecto del
 * original). Sin esto el panel, que viene después en el HTML, le pinta
 * encima.
 */
.sitio-header {
  position: relative;
  z-index: 2;
}

/*
 * Tres piezas en dos filas, sin tocar el orden del HTML: el logo y el
 * botón de hamburguesa arriba, la fila de pestañas abajo -que es como
 * está en el original, no el menú al costado del logo-. Con grid-areas el
 * botón puede seguir al lado del logo en el teléfono sin mover una línea
 * del marcado.
 */
.sitio-header-interior {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-areas:
    "logo boton"
    "menu menu";
  align-items: center;
  /* 8px y no los 16 del .contenedor: en el original el logo y la fila de
     pestañas arrancan pegados al borde del panel de abajo, no adentro de
     su relleno. */
  padding: 6px 8px 0;
}

.sitio-logo {
  grid-area: logo;
  min-height: 40px;
  min-width: 0;
  display: flex;
  align-items: center;
}

/* El bloque 'logo' trae un título administrativo ("Logo") que en Joomla
   nunca se mostraba (el módulo tenía "Mostrar título" apagado): se oculta
   acá, no se borra el dato. */
.sitio-logo .bloque-titulo {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.sitio-logo img {
  display: block;
  width: 436px;
  max-width: 100%;
  height: auto;
}

/* Respaldo si todavía no hay bloque 'logo' cargado (instalación nueva,
   sin datos): usa el mismo archivo que Step 1 copió a assets/img/. */
.sitio-logo:empty::before {
  content: '';
  display: block;
  width: 436px;
  max-width: 100%;
  height: 70px;
  background: url('../img/logo.png') left center / contain no-repeat;
}

/* La fecha de arriba de todo ("Viernes, 21 Agosto 2026"), que arma
   fecha_en_castellano(). En el original mide 9px, que hoy es ilegible;
   acá va en 11px, que es la mejora más barata de toda la tarea. */
.barra-fecha {
  padding: 8px 16px 0;
  font-size: 11px;
  color: #c8c8c8;
  text-shadow: 0 1px 3px rgba(0, 0, 0, .9);
}

/* ---------- El botón de hamburguesa ---------- */

.boton-menu {
  grid-area: boton;
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  padding: 10px;
  background: var(--pestana);
  border: 1px solid var(--linea);
  border-radius: 5px;
  box-shadow: inset 0 1px 0 var(--brillo);
  cursor: pointer;
}

.boton-menu-barra {
  display: block;
  height: 2px;
  background: var(--texto);
}

/* El botón cambia de aspecto cuando el menú está abierto. Se engancha del
   MISMO atributo que assets/js/menu.js ya mantiene sincronizado
   (aria-expanded), no de una clase paralela que pudiera desfasarse. */
.boton-menu[aria-expanded="true"] {
  background: var(--pestana-activa);
  box-shadow: inset 0 1px 0 var(--brillo-activo);
}

.boton-menu[aria-expanded="true"] .boton-menu-barra {
  background: #ffffff;
}

.boton-menu:focus-visible {
  outline: 2px solid var(--foco-oscuro);
  outline-offset: 2px;
}

.boton-menu-texto {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ---------- La fila de pestañas ---------- */

/*
 * Las pestañas del original, sin el sprite.
 *
 * El original las dibuja con images/menu_level1_item.png (290x270, 1,5 KB,
 * un estado cada 39px) recortado en tres pedazos por pestaña: tapa
 * izquierda, cuerpo y tapa derecha. Eso obligaba a tres elementos anidados
 * por ítem (li > a > span.bg) y se ve borroso en cualquier pantalla de
 * alta densidad, porque es un bitmap estirado.
 *
 * Acá es un border-radius, un borde y un degradado: mismo dibujo, nítido a
 * cualquier densidad, un solo elemento y cero bytes de imagen. Los valores
 * están medidos sobre el original renderizado, columna por columna:
 *
 *   normal  1px #000 arriba, 1px #404040 de brillo, #232221 plano 27px,
 *           y una caída a #121111 en los últimos 5px
 *   activa  1px #000 arriba, 1px #666666 de brillo, #373635 plano hasta
 *           abajo, SIN caída
 *
 * Ese "sin caída" no es un detalle: el panel que sigue es #373635, el
 * mismo color, así que la pestaña abierta se funde con él y forma una sola
 * pieza. Es la idea central del diseño.
 *
 * Sobre el alto: el CSS del original declara 36px y el sprite pinta 34 de
 * esos 36 (las últimas 2 filas de la banda son transparentes, y #menu
 * lleva bottom:-2px para que la parte pintada termine justo contra el
 * panel). Lo que el visitante ve son 34px, y 34px es lo que se usa acá.
 *
 * El ancho lo da el contenido, igual que en el original: 20px de relleno a
 * cada lado (allá eran 10 de la tapa + 10 del cuerpo) y 5px de separación
 * entre pestañas.
 */
.menu-principal {
  grid-area: menu;
  min-width: 0;
}

.menu-header {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 4px 5px;
  margin-top: 10px;
}

.menu-header > li {
  position: relative;
}

.menu-header > li > a {
  display: block;
  height: 34px;
  /* 19 y no 20: el original reparte 10+10 de relleno y NO tiene borde en
     la caja (el borde se lo dibuja el sprite). Acá el borde de 1px sí
     cuenta -box-sizing: border-box-, así que con 20 cada pestaña salía
     exactamente 2px más ancha que la del original, las nueve. Con 19 dan
     al pixel: INICIO 85,8 / CATALOGO 121,1 / QUIENES SOMOS 167,5. */
  padding: 0 19px;
  border: 1px solid var(--linea);
  border-bottom: 0;
  border-radius: 5px 5px 0 0;
  background: linear-gradient(to top, var(--pestana-base) 0, var(--pestana) 5px);
  box-shadow:
    inset 0 1px 0 var(--brillo),
    inset 1px 0 0 var(--brillo),
    inset -1px 0 0 var(--brillo);
  color: var(--texto-pestana);
  font-size: 15px;
  line-height: 33px;
  text-transform: uppercase;
  /* El segundo halo, blanco y difuso, es el brillo característico de la
     fila; el primero es la sombra dura que despega el texto del fondo. */
  text-shadow: 1px 1px 1px rgba(0, 0, 0, 1), 0 0 5px rgba(255, 255, 255, .3);
  white-space: nowrap;
}

.menu-header > li > a:hover,
.menu-header > li > a:focus-visible,
.menu-header > li.activo > a,
.menu-header > li.activo-rama > a {
  background: var(--pestana-activa);
  box-shadow:
    inset 0 1px 0 var(--brillo-activo),
    inset 1px 0 0 var(--brillo-activo),
    inset -1px 0 0 var(--brillo-activo);
  color: #ffffff;
  text-decoration: none;
}

/*
 * La mejora sobre el original, y la única licencia que se toma esta fila:
 * la pestaña de la sección abierta lleva además una línea de 3px del
 * celeste de la marca arriba.
 *
 * En el original la única diferencia entre "abierta" y "el mouse está
 * encima" es el color del texto, así que apenas movés el mouse dejás de
 * saber en qué sección estás. Con la línea, la sección abierta se
 * distingue de la pestaña bajo el mouse Y se ve de un vistazo desde lejos.
 * La forma, el tamaño, el color de fondo y el texto blanco no cambian:
 * sigue siendo la misma pestaña.
 */
.menu-header > li.activo > a,
.menu-header > li.activo-rama > a {
  box-shadow:
    inset 0 3px 0 var(--acento),
    inset 1px 0 0 var(--brillo-activo),
    inset -1px 0 0 var(--brillo-activo);
}

/*
 * Los 2px que tapan el borde superior del panel de abajo, para que la
 * pestaña abierta y el panel sean una sola pieza. Van como pseudo-elemento
 * y no como margen negativo porque un margen negativo correría de lugar a
 * las pestañas vecinas.
 */
.menu-header > li.activo > a::after,
.menu-header > li.activo-rama > a::after {
  content: '';
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  height: 2px;
  background: var(--pestana-activa);
}

/*
 * El foco de teclado. El anillo va HACIA ADENTRO (offset negativo): con el
 * offset positivo de la regla general se metía debajo de la pestaña
 * vecina, que está a 5px, y se veía cortado justo del lado por el que
 * venís tabulando.
 */
.menu-header a:focus-visible {
  outline: 2px solid var(--foco-oscuro);
  outline-offset: -4px;
  color: #ffffff;
}

/*
 * Submenú de segundo nivel. Los tres menús reales son planos, pero el
 * parcial dibuja dos niveles desde siempre y el panel deja armar
 * submenús: sin esto, un ítem con hijos los desparramaba como texto suelto
 * abajo de la fila.
 *
 * Se abre con :hover y con :focus-within, no con JavaScript: la CSP del
 * sitio es script-src 'self' y, más importante, :focus-within hace que el
 * submenú se abra solo al tabular hasta el padre. Un desplegable de 2011
 * con onmouseover no se podía recorrer con el teclado.
 */
.menu-header > li > ul {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 20;
  min-width: 100%;
  padding: 4px 0;
  background: var(--modulo);
  border: 1px solid var(--linea);
  border-radius: 0 5px 5px 5px;
  box-shadow: 0 6px 14px rgba(0, 0, 0, .5);
}

.menu-header > li:hover > ul,
.menu-header > li:focus-within > ul {
  display: block;
}

.menu-header > li > ul a {
  display: block;
  padding: 8px 16px;
  color: #ffffff;
  font-size: .95rem;
  white-space: nowrap;
}

.menu-header > li > ul a:hover,
.menu-header > li > ul a:focus-visible {
  background: var(--fondo-panel);
  color: #ffffff;
  text-decoration: none;
}

.menu-header > li > ul .activo > a {
  color: var(--acento);
  font-weight: bold;
}

/* ---------- Franja de banner (slider / avisos superiores) ---------- */

/*
 * El panel no es de ancho completo: es una columna de 1300px sobre el
 * fondo de la página, igual que en el original. Con la franja pintada de
 * borde a borde -que es como estaba- el halo del fondo quedaba tapado en
 * todo el ancho y solo se veía en el encabezado; con el panel acotado, el
 * fondo respira a los costados en toda la altura de la página, que es
 * justamente lo que le da profundidad al original.
 *
 * Por eso el color se le pone al CONTENEDOR de adentro (.contenedor ya
 * tiene el max-width y el centrado) y no a la franja de afuera. Lo mismo
 * hacen .disposicion, .zona-inferior-logos y .sitio-pie-interior, así que
 * las cuatro piezas se apilan sin costuras y forman un solo panel
 * continuo desde abajo de las pestañas hasta el pie.
 */
.franja-banner {
  position: relative;
}

/* El slider de portada (765px) a la izquierda y los avisos de 225px a la
   derecha, igual que el módulo "Banner top" del sitio original: una franja
   de ancho completo, no una columna más. En una sola línea a partir de
   1024px; envuelve antes que eso (mismo criterio que el resto de la
   plantilla: sin media query propia hasta que el contenido no entra). */
.franja-banner-interior {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 16px;
  padding: 12px 16px;
  background: var(--fondo-panel);
  border: 1px solid var(--linea);
  border-bottom: 0;
  /* El brillo de 1px bajo el borde negro: es lo que hace que el panel
     parezca tener relieve en vez de estar apoyado. La pestaña abierta lo
     tapa con su ::after y por eso las dos piezas se funden. */
  box-shadow: inset 0 1px 0 var(--brillo-activo);
}

/* Los dos avisos de 225px, uno al lado del otro, igual que el "float:right;
   width:472px" del módulo original: el slider de publicidad (real,
   Slide::publicados('publicidad')) y -si hay algo publicado en la
   posición 'banner-top'- .franja-banner-radio. */
.franja-banner-publicidad {
  display: flex;
  flex-wrap: wrap;
  flex: 1 1 225px;
  min-width: 0;
  gap: 16px;
}

.franja-banner-radio {
  /* Ancho por contenido, no 225px fijos: el bloque puede traer MÁS de un
     aviso (ver el <p> de más abajo) y cada uno ocupa su lugar en la fila. */
  flex: 0 1 auto;
  min-width: 0;
}

/*
 * El bloque 'banner-top' EDITADO desde el panel: desde el 2026-09-09 ya no
 * trae los floats de Joomla sino un <p> con los avisos uno detrás de otro
 * -Radio de Cultura y Catálogo Juan Falú, cada uno un <a><img></a> de
 * 225x157-. Un <p> es un bloque: dentro de los 225px que tenía la caja, el
 * segundo aviso bajaba a un renglón nuevo y quedaba colgando debajo del
 * primero, con un hueco a la izquierda. Con el <p> como fila flex cada
 * aviso es un ítem más, al lado del anterior, con el mismo 'gap' que separa
 * a Tienda de Radio; si no entran, envuelven.
 *
 * font-size: 0 no es capricho: el HTML del panel deja "&nbsp;" y espacios
 * entre los dos <a>, y en una caja flex ese texto suelto arma un ítem
 * anónimo propio (un tercer "aviso" de unos píxeles). A tamaño cero
 * desaparece; las imágenes no dependen del tamaño de fuente. El costo es
 * que un TEXTO escrito suelto dentro de ese <p> no se vería, cosa que el
 * bloque nunca tuvo (es una fila de avisos).
 *
 * La separación horizontal va como margen entre enlaces y NO como
 * column-gap: aunque mida cero, ese ítem anónimo sigue contando para el
 * gap, y entre Radio y Juan Falú quedaban dos gaps (32px) en vez de uno.
 * El margen va a la DERECHA de cada aviso menos el último (el texto suelto
 * no es un elemento, así que :last-child es el último <a>): son los mismos
 * 16px que hay entre Tienda y Radio, y cuando envuelven -en una pantalla
 * angosta cada aviso queda en su renglón- el de abajo arranca al ras, sin
 * la sangría que dejaría un margen a la izquierda. El row-gap sí queda,
 * para separar los renglones.
 */
.franja-banner-radio .bloque-contenido > p {
  display: flex;
  flex-wrap: wrap;
  row-gap: 16px;
  margin: 0;
  font-size: 0;
}

.franja-banner-radio .bloque-contenido > p > a {
  flex: 0 0 auto;
  display: block;
}

.franja-banner-radio .bloque-contenido > p > a:not(:last-child) {
  margin-right: 16px;
}

/*
 * El bloque 'banner-top' migrado trae, adentro de .bloque-contenido, el
 * HTML completo del módulo original: un div envoltorio con dos floats de
 * época (765px y 472px) que hoy, sin los tags [widgetkit...], están vacíos
 * salvo por el aviso de "radio de cultura" -el único dato real que queda,
 * ver el comentario de layout.php-. Neutralizarlos con display:none los
 * borraría del árbol junto con lo que tienen adentro (perdería el aviso);
 * display:contents en cambio saca la CAJA del div pero conserva a sus
 * hijos, así el aviso entra como un ítem más de 225px en la fila de arriba
 * en vez de arrastrar 1237px de floats que ya no representan nada.
 *
 * Selectores acotados a .franja-banner-radio (no a .bloque-contenido en
 * general): es intervención puntual sobre ESTE bloque, con los mismos
 * valores en píxeles que trae su HTML migrado. Si el panel de bloques
 * (Task 18) llega a cambiar este contenido, estos selectores simplemente
 * dejan de matchear -no rompen nada, el bloque se muestra tal cual, como
 * cualquier otro-.
 */
.franja-banner-radio .bloque-contenido > div {
  display: contents;
}

.franja-banner-radio .bloque-contenido div[style*="width: 472px"] {
  display: contents;
}

.franja-banner-radio .bloque-contenido div[style*="width: 765px"],
.franja-banner-radio .bloque-contenido div[style*="padding-left: 10px"] {
  display: none;
}

/* El aviso real (el div de 225x157 con el link a radiodecultura.com.ar):
   se le saca el float -ya no hace falta, ahora es un ítem de flex más- y
   overflow:hidden le recorta el "&nbsp;" suelto que trae después del
   <a>...</a> en el HTML heredado (arma su propia línea y pasa los 157px
   declarados; el aviso en sí queda completo y visible). */
.franja-banner-radio .bloque-contenido div[style*="height: 157px"] {
  float: none !important;
  max-width: 100%;
  overflow: hidden;
}

/* Igual que el logo, el módulo "Banner top" tampoco mostraba su título en
   Joomla (mismo motivo). */
.franja-banner .bloque-titulo {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.franja-banner img {
  height: auto;
}

/*
 * En el teléfono (<=767px, el mismo corte donde el menú pasa a hamburguesa y
 * el marco se apila a una sola columna) NO se muestra la franja de sliders:
 * el slider de portada de 765px, el de publicidad y el aviso de radio son la
 * "cabecera decorativa" del sitio de escritorio, y en una pantalla angosta
 * comen la primera pantalla entera antes del contenido. Se ocultan enteros
 * -es lo que pidió el cliente-. No se pierde ningún acceso: la Tienda, RdC
 * Publishing, la Radio y YouTube que viven en estos avisos están también en
 * la zona "Amigos de la web" y en el pie, que sí se muestran en el teléfono.
 */
@media (max-width: 767px) {
  .franja-banner {
    display: none;
  }

  /*
   * En el teléfono tampoco se muestra la columna derecha ("Amigos de la
   * web"): apilada quedaba como una tira larga de logos entre el contenido
   * y el pie. No se pierde nada -esos mismos accesos (RdC Publishing, Radio,
   * Tienda, YouTube) están en la zona inferior y en el pie, que sí se ven en
   * el teléfono-. La columna izquierda (Menú principal) se conserva.
   */
  .columna-der {
    display: none;
  }
}

/*
 * Los bloques (logo, banner-top, sidebar-der, pie) traen HTML crudo
 * migrado del panel de Joomla, con estilos inline de la época -algunos con
 * anchos fijos en píxeles (floats de 765px/225px, igual que las tablas de
 * un artículo). Se contienen igual que .articulo-cuerpo: en vez de forzar
 * su ancho a mano y arriesgar romper el maquetado que traían, dejan que
 * ese contenido puntual scrollee adentro suyo.
 */
.bloque-contenido {
  overflow-x: auto;
}

/* ---------- Slider de portada y de publicidad ---------- */

/* Mismo marcado para los dos (parciales/slider.php), sólo cambia el ancho:
   765px el de portada, 225px el de publicidad -ver .slider-publicidad más
   abajo-. */
.slider-portada {
  position: relative;
  width: 765px;
  max-width: 100%;
  min-width: 0;
  flex: 0 1 765px;
}

.slider-publicidad {
  position: relative;
  width: 225px;
  max-width: 100%;
  min-width: 0;
  flex: 0 1 225px;
}

.slider-lista {
  position: relative;
  min-height: 158px;
  overflow: hidden;
  border-radius: var(--radio);
}

/* Movimiento lateral: los slides van apilados; el que NO está activo se corre
   hacia el costado y se desvanece, y el activo entra deslizándose desde la
   derecha. El activo es 'relative' para que su alto defina el de la lista. */
.slider-item {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  min-height: 158px;
  opacity: 0;
  transform: translateX(42px);
  transition: transform .7s cubic-bezier(.22, .61, .36, 1), opacity .55s ease;
  pointer-events: none;
}

.slider-item.activo {
  position: relative;
  opacity: 1;
  transform: translateX(0);
  pointer-events: auto;
}

@media (prefers-reduced-motion: reduce) {
  .slider-item { transition: none; transform: none; }
}

.slider-item img {
  display: block;
  width: 100%;
  height: 158px;
  object-fit: cover;
}

/* ---------- Artistas destacados ---------- */

/* Video destacado del canal de YouTube: marco 16:9 responsive. */
/* Recuadro negro del home: contiene juntos a los artistas destacados y al
   video, CENTRADO y de ancho cómodo aunque el resto del sitio sea a todo el
   ancho (así el video no queda gigante en pantallas grandes). En pantallas
   chicas el max-width no molesta (cae a 100%). */
.home-panel {
  max-width: 900px;
  margin: 24px auto;
  padding: 22px 24px 26px;
  background: #0d0d0d;
  border-radius: var(--radio);
}
/* Sobre el negro del panel, los títulos de sección y los nombres van claros. */
.home-panel .titulo-seccion {
  color: #ededed;
  border-bottom-color: rgba(255, 255, 255, .14);
}
.home-panel .destacados-item a,
.home-panel .destacados-item span {
  color: #e6e6e6;
}

.video-destacado {
  margin: 24px 0 0;
}
.video-destacado-marco {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--radio);
  overflow: hidden;
  background: #000;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .18);
}
.video-destacado-marco iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

.artistas-destacados {
  margin: 0;
}

.destacados-lista {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.destacados-item {
  flex: 1 1 140px;
  max-width: 180px;
  min-width: 0;
  text-align: center;
}

.destacados-item span {
  display: block;
  margin-top: 4px;
  font-size: .85rem;
}

/* ---------- Carrusel de artistas destacados ----------
   Muestra 3 imágenes y avanza (assets/js/slider.js). Mejora progresiva: sin
   JS, .carrusel-pista sigue siendo la grilla que envuelve y las flechas quedan
   ocultas. El JS agrega .carrusel--activo y toma el control. */
.carrusel {
  display: flex;
  align-items: center;
  gap: 8px;
}
.carrusel-viewport {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
}
.carrusel-flecha {
  display: none;
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  align-items: center;
  justify-content: center;
  font-size: 1.5rem;
  line-height: 1;
  color: var(--acento-oscuro, #b34700);
  background: #fff;
  border: 1px solid var(--linea, #e4e4e1);
  border-radius: 50%;
  cursor: pointer;
  transition: background .18s, border-color .18s, color .18s;
}
.carrusel-flecha:hover { background: var(--acento-oscuro, #b34700); border-color: var(--acento-oscuro, #b34700); color: #fff; }
.carrusel-flecha:disabled { opacity: .35; cursor: default; }
.carrusel-flecha:disabled:hover { background: #fff; color: var(--acento-oscuro, #b34700); border-color: var(--linea, #e4e4e1); }

.carrusel--activo.carrusel--movil .carrusel-flecha { display: inline-flex; }
.carrusel--activo .carrusel-pista {
  flex-wrap: nowrap;
  transition: transform .45s ease;
  will-change: transform;
}
/* Exactamente 3 por página, en todos los tamaños. El -1px evita que asome
   una franja de la 4ª tapa por redondeo de sub-píxel. */
.carrusel--activo .carrusel-item {
  flex: 0 0 calc((100% - 24px) / 3 - 1px);
  max-width: none;
}
/* Todas las tapas al MISMO alto, pero SIN recortar: se igualan por altura y el
   ancho sale de su propia proporción (width auto), así la tapa se ve completa.
   max-width evita que una apaisada se pase del ancho de la columna; se centra
   dentro de ella. */
.carrusel-item img {
  height: 190px;
  width: auto;
  max-width: 100%;
  object-fit: contain;
  display: block;
  margin: 0 auto;
}
@media (prefers-reduced-motion: reduce) {
  .carrusel--activo .carrusel-pista { transition: none; }
}

/* ---------- Disposición de tres columnas ---------- */

.disposicion {
  display: grid;
  grid-template-columns: 240px 1fr 240px;
  gap: 20px;
  padding: 16px;
  align-items: start;
  background: var(--fondo-panel);
  border-left: 1px solid var(--linea);
  border-right: 1px solid var(--linea);
}

/*
 * Ancho completo (páginas embebidas de tipo iframe): sin la columna
 * derecha, la de contenido se estira hasta donde estaba esa columna, así
 * el iframe "se extiende hasta allí". El layout NO dibuja el <aside> de la
 * derecha en estas páginas (ver layout.php), por eso alcanza con quitar la
 * tercera pista de la rejilla -no queda un hueco-. La columna izquierda (el
 * menú) se conserva: sigue siendo navegación útil en una página embebida.
 *
 * Va antes del @media de abajo a propósito: a <=1023px la regla de
 * .disposicion pasa a una sola columna y, por venir después en el archivo
 * con la misma especificidad, gana; el apilado del teléfono no se toca.
 */
.disposicion-ancha {
  grid-template-columns: 240px 1fr;
}

/*
 * Las cajas de las columnas laterales van un tono MÁS CLARO que el panel
 * que las contiene (#41403f sobre #373635), no más oscuro. Es lo que hace
 * que se lean como cajas apoyadas encima y no como huecos, y es el tercer
 * gris del original.
 *
 * padding: 0 y el relleno se lo pone cada hijo, porque el encabezado del
 * módulo tiene que llegar hasta los bordes de la caja -si no, queda una
 * barra flotando adentro de un marco, que no es el dibujo del original-.
 */
.columna-izq,
.columna-der {
  min-width: 0;
  padding: 0 0 12px;
  overflow: hidden;
  background: var(--modulo);
  border: 1px solid var(--linea);
  border-radius: 5px;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .07);
}

.menu-lateral,
.columna-der .bloque-contenido {
  padding: 0 12px;
}

.columna-contenido {
  background: var(--fondo-contenido);
  color: var(--texto-contenido);
  border-radius: var(--radio);
  padding: 20px 28px;
  min-width: 0;
}

/* Variante gris de la columna de contenido: la usa el home, para que el
   recuadro negro de destacados/video no quede sobre un blanco que le choca.
   Un tono un poco más oscuro que el gris de los envoltorios (--fondo-panel
   #373635) para que se note como una sección distinta, sin llegar al casi negro
   del fondo de la página. */
.columna-contenido--gris {
  background: #2d2c2a;
}

/*
 * Los títulos de la columna de contenido van en el celeste OSCURO, no en
 * el claro.
 *
 * En el original el h1 de un artículo es #3d9fc4 sobre el fondo claro
 * (#faf9f8): 2,6:1, muy por debajo del 4,5:1 que pide la guía para texto.
 * Es una de las cosas que el original tiene mal y que no conviene copiar:
 * el mismo azul de la marca un tono más oscuro (#165b75, que el propio
 * yoo_vox ya usa para h2/h4/h6) da 7,1:1 y se lee igual de "de la marca".
 * Sobre el fondo oscuro, en cambio, el claro se queda como está.
 */
.columna-contenido h1,
.columna-contenido h2,
.columna-contenido h3,
.columna-contenido h4,
.columna-contenido h5,
.columna-contenido h6 {
  color: var(--acento-oscuro);
}

.columna-contenido a {
  color: var(--acento-oscuro);
}

.columna-contenido a:hover,
.columna-contenido a:focus {
  color: var(--acento);
}

.menu-lateral a,
.columna-der a {
  color: #ffffff;
}

.menu-lateral a:hover,
.menu-lateral a:focus,
.columna-der a:hover,
.columna-der a:focus {
  color: var(--acento);
  text-decoration: none;
}

.menu-lateral > li + li {
  border-top: 1px solid rgba(0, 0, 0, .35);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .05);
}

/*
 * 40px de alto mínimo: son enlaces de una línea en una columna angosta y
 * en el original medían 26px, por debajo del área táctil mínima que pide
 * la guía. Es la clase de arreglo que no se nota en el escritorio y que
 * es la diferencia entre poder y no poder usar el menú en un teléfono.
 */
.menu-lateral a {
  display: block;
  min-height: 40px;
  padding: 9px 4px;
}

.menu-lateral a:focus-visible,
.columna-der a:focus-visible {
  outline: 2px solid var(--foco-oscuro);
  outline-offset: -2px;
}

.bloque + .bloque {
  margin-top: 16px;
}

/*
 * El encabezado de un módulo ("MENÚ PRINCIPAL", "AMIGOS DE LA WEB"): una
 * barra gris pegada al borde de arriba de la caja, con el texto en
 * mayúsculas y clarito.
 *
 * Acá estaba en turquesa liso (#388EAF), que salía de la tabla de colores
 * del brief y no de mirar el sitio: en el original NINGÚN encabezado de
 * módulo es turquesa. Son este degradado gris (#41403f a #383736, medido)
 * con el texto en #b4b4b4, y el turquesa se reserva para los enlaces y
 * los acentos, que es donde el original lo usa.
 *
 * El margen negativo lo pega a los bordes de la caja, que tiene padding 0
 * justamente para esto.
 */
.bloque-titulo {
  margin: 0 0 12px;
  padding: 0 12px;
  height: 34px;
  line-height: 34px;
  background: linear-gradient(to bottom, #41403f, #383736);
  border-bottom: 1px solid var(--linea);
  color: var(--texto-modulo);
  font-size: 15px;
  font-weight: normal;
  text-transform: uppercase;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .8);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ---------- Títulos de sección ---------- */

/*
 * El título de una sección adentro de la columna de contenido
 * ("ARTISTAS DESTACADOS" en la home del original): mayúsculas, gris
 * oscuro y un triangulito rojo adelante. El triángulo es un borde de CSS
 * y no la imagen que usaba el original -no hay archivo que servir y se ve
 * nítido a cualquier densidad-.
 *
 * aria-hidden no hace falta: un ::before generado por CSS no aporta texto
 * al árbol de accesibilidad.
 */
.titulo-seccion {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 16px;
  padding-bottom: 8px;
  border-bottom: 1px solid #e2e2e2;
  color: #3f3f3f;
  font-size: 1rem;
  font-weight: normal;
  letter-spacing: .04em;
  text-transform: uppercase;
}

.titulo-seccion::before {
  content: '';
  flex: none;
  width: 0;
  height: 0;
  border-left: 9px solid var(--triangulo);
  border-top: 6px solid transparent;
  border-bottom: 6px solid transparent;
}

/* ---------- Artículos y listados ---------- */

.articulo-cuerpo {
  overflow-x: auto;
}

.articulo-cuerpo img,
.articulo-imagen {
  max-width: 100%;
  height: auto;
}

.articulo-restringido {
  padding: 12px;
  background: rgba(56, 142, 175, .12);
  border: 1px solid var(--caja);
  border-radius: var(--radio);
}

.listado-articulos {
  display: grid;
  gap: 16px;
}

.listado-item {
  padding-bottom: 16px;
  border-bottom: 1px solid #e2e2e2;
}

.listado-item a {
  font-size: 1.1rem;
  font-weight: bold;
}

/* ---------- Catálogo de discos ---------- */

/*
 * La sección nueva del sitio (Task 23): la grilla de tapas de /catalogo y
 * la ficha de cada disco. Misma paleta y mismas piezas que el resto -la
 * caja turquesa del filtro es la misma --caja de los títulos de bloque, el
 * paginado es el .paginado que ya usaban categoría y buscador-, para que
 * se lea como una sección más del sitio y no como algo pegado.
 *
 * La grilla es una grilla de verdad (CSS grid con auto-fill), no una tabla:
 * las tablas de este proyecto son el contenido heredado de las fichas, no
 * el maquetado nuevo. Las columnas se acomodan solas por ancho mínimo de
 * tarjeta, así que no hace falta un breakpoint por cada tamaño: en la
 * columna de contenido a 1300px de ventana entran 4 tapas de 157px, y en
 * un teléfono son 2 (fijas, ver el breakpoint de <768 más abajo).
 */

/*
 * La fila A-Z, arriba del formulario. flex con wrap y no una tira rígida:
 * 26 elementos en línea son lo que rompe estas filas en un teléfono, y así
 * bajan solos a la línea siguiente en vez de desbordar.
 *
 * Las letras sin ningún artista van apagadas y SIN enlace (la vista las
 * imprime como <span>, no como <a>): no pueden parecer clickeables y
 * llevar a una página vacía. El cursor tampoco cambia, que es la otra
 * mitad de "no parece clickeable".
 *
 * Los cuadraditos miden 34px de lado en escritorio y 32 en teléfono: por
 * encima de los 24 que pide la guía de tamaño mínimo de área táctil, que
 * es justo lo que suele fallar en una fila de 26 elementos.
 */
.catalogo-letras {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-bottom: 16px;
}

.catalogo-letra {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 34px;
  height: 34px;
  padding: 0 6px;
  border: 1px solid rgba(56, 142, 175, .35);
  border-radius: 4px;
  font-weight: bold;
  line-height: 1;
}

a.catalogo-letra:hover,
a.catalogo-letra:focus {
  background: var(--caja);
  border-color: var(--caja);
  color: #ffffff;
  text-decoration: none;
}

.catalogo-letra-activa {
  background: var(--acento-oscuro);
  border-color: var(--acento-oscuro);
  color: #ffffff;
}

.catalogo-letra-vacia {
  color: #b9b9b9;
  border-color: #e2e2e2;
  background: #f2f2f2;
  cursor: default;
}

.catalogo-letra-todas {
  font-weight: normal;
}

.form-catalogo {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 12px;
  margin-bottom: 18px;
  padding: 14px 16px;
  background: rgba(56, 142, 175, .08);
  border: 1px solid rgba(56, 142, 175, .25);
  border-radius: var(--radio);
}

.form-catalogo-campo {
  flex: 1 1 220px;
  min-width: 0;
}

.form-catalogo select {
  width: 100%;
  padding: 8px 10px;
  border: 1px solid #ccc;
  border-radius: 4px;
  font: inherit;
  background: #ffffff;
}

.form-catalogo-botones {
  display: flex;
  align-items: center;
  gap: 14px;
}

.catalogo-limpiar {
  white-space: nowrap;
}

.catalogo-cuenta {
  margin: 0 0 16px;
  color: #6a6a6a;
}

.grilla-discos {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(145px, 1fr));
  gap: 22px 18px;
}

.disco-tarjeta-enlace {
  display: flex;
  flex-direction: column;
  gap: 8px;
  height: 100%;
}

.disco-tarjeta-enlace:hover,
.disco-tarjeta-enlace:focus {
  text-decoration: none;
}

/*
 * La tapa va adentro de una caja cuadrada fija. Las 257 tapas reales
 * tienen proporciones distintas -de 265x235 a fotos verticales- y sin una
 * caja de proporción fija cada fila de la grilla quedaría de una altura
 * distinta y el pie de las tarjetas bailaría.
 *
 * object-fit: contain, no cover: la tapa entra ENTERA, sin recortarle un
 * borde. Es la obra del cliente, no una foto de stock.
 */
.disco-tarjeta-tapa {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 1 / 1;
  padding: 8px;
  background: #ffffff;
  border: 1px solid #dcdcdc;
  border-radius: 4px;
  overflow: hidden;
}

.disco-tarjeta-tapa img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
}

.disco-tarjeta-sin-tapa {
  color: #999999;
  font-size: .85rem;
}

.disco-tarjeta-datos {
  display: flex;
  flex-direction: column;
  gap: 2px;
  line-height: 1.35;
}

.disco-tarjeta-artista {
  font-weight: bold;
  color: var(--acento-oscuro);
}

.disco-tarjeta-titulo {
  font-size: .92rem;
  color: var(--texto-contenido);
}

.disco-tarjeta-enlace:hover .disco-tarjeta-artista,
.disco-tarjeta-enlace:focus .disco-tarjeta-artista {
  color: var(--acento);
}

.disco-tarjeta-enlace:hover .disco-tarjeta-tapa,
.disco-tarjeta-enlace:focus .disco-tarjeta-tapa {
  border-color: var(--caja);
  box-shadow: 0 2px 10px rgba(0, 0, 0, .15);
}

/* --- La ficha --- */

.disco-ficha-volver {
  margin: 0 0 10px;
}

/*
 * El artista y el título van en dos elementos separados y NO se unen con
 * una raya escrita en el HTML: en 2 de los 257 discos el título está vacío
 * -son homónimos, el disco se llama igual que el artista- y una raya en el
 * marcado quedaría colgando. La separación es visual: sin título no hay
 * nada que separar y no se ve ningún hueco.
 */
.disco-ficha-encabezado {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 2px 14px;
  margin: 0 0 6px;
}

.disco-ficha-nombre {
  color: var(--acento-oscuro);
  font-size: .82em;
}

.disco-ficha-anio {
  margin: 0 0 14px;
  color: #6a6a6a;
  font-size: .9rem;
}

.disco-ficha-imagenes {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  margin-bottom: 18px;
}

.disco-ficha-imagenes img {
  max-width: 265px;
  height: auto;
  border: 1px solid #dcdcdc;
  border-radius: 4px;
}

/*
 * El HTML heredado de las fichas: maquetación en tablas de 2005 con anchos
 * fijos en píxeles, 641px de máximo (medido: es el width del <table> en las
 * 257 fichas reales; 3 de ellas lo repiten además en un style inline).
 *
 * En escritorio esos 641px entran de sobra -la columna de contenido mide
 * ~684px con la ventana en 1300- y la ficha se ve igual que en el catálogo
 * viejo. En un teléfono NO entran, y el HTML guardado no se toca: es
 * contenido del cliente y ya está migrado.
 *
 * La red de seguridad es overflow-x: auto acá, igual que .articulo-cuerpo:
 * lo que se desborde scrollea ADENTRO de esta caja en vez de empujar la
 * página. Hace falta decirlo explícito porque el sitio tiene
 * html,body{overflow-x:hidden}, que RECORTA un desborde en vez de
 * mostrarlo: sin esta caja el contenido no se vería cortado, se vería
 * inalcanzable, y ninguna revisión a ojo lo notaría.
 *
 * Pero scrollear una tabla de 641px en una pantalla de 360 es una mala
 * lectura, así que por debajo de 768px la tabla se DESARMA (ver el
 * breakpoint): cada celda pasa a ser un bloque de ancho completo y las dos
 * columnas de la ficha -tapa a la izquierda, lista de temas a la derecha-
 * quedan una arriba de la otra. Se puede hacer sin riesgo porque está
 * medido contra los datos reales: las 257 fichas tienen tablas NO anidadas
 * (profundidad máxima 1), sin ningún colspan y con un solo rowspan, así
 * que no hay una estructura que el apilado pueda malinterpretar.
 */
.disco-ficha-cuerpo {
  overflow-x: auto;
  /*
   * Las fichas traen direcciones de correo y URLs completas escritas como
   * texto ('discografica@registrosdecultura.com.ar' mide 318px y no entra
   * en los 272 de una pantalla de 360). Son una sola "palabra", así que
   * sin esto no se cortan nunca y desbordan aunque la tabla ya esté
   * desarmada. break-word corta solo cuando la palabra no entra sola en la
   * línea: no toca ni un texto normal.
   */
  overflow-wrap: break-word;
}

.disco-ficha-cuerpo table {
  max-width: 100%;
}

/*
 * height: auto con !important, y no por costumbre: 3 de las 257 fichas
 * traen un style="width: 641px; height: 1043px" inline en la TABLA, y un
 * estilo inline le gana a cualquier regla de autor que no lleve
 * !important.
 *
 * Medido en Chrome sobre /catalogo/rafael-amor-2 con la ventana en 360px,
 * que es una de las tres: como está, la tabla mide 272 x 2084 y no
 * desborda nada. Neutralizando SOLO este height -o sea, dejando ganar al
 * inline- el alto se queda en los 1043px originales mientras el contenido
 * ya desarmado necesita 2084, así que la ficha se recorta sobre sí misma.
 * El ancho no depende de esta regla: de eso se ocupa el max-width de
 * arriba (y, en el breakpoint de teléfono, el width: auto).
 */
.disco-ficha-cuerpo table[style],
.disco-ficha-cuerpo img {
  height: auto !important;
}

.disco-ficha-cuerpo img {
  max-width: 100%;
}

/* Tres fichas traen un <pre>: sin esto, una línea larga desborda. */
.disco-ficha-cuerpo pre {
  white-space: pre-wrap;
  word-wrap: break-word;
}

/* ---------- Biografía (/biografia/<slug>) ---------- */

.biografia {
  max-width: 900px;
}

/* El "Volver" a la página anterior (la ficha del disco desde donde se llegó). */
.biografia-volver {
  margin: 0 0 14px;
  font-size: .95rem;
}
.biografia-volver a {
  color: var(--acento, #165b75);
  text-decoration: none;
  border-bottom: 1px solid transparent;
}
.biografia-volver a:hover {
  border-bottom-color: currentColor;
}

.biografia-nombre {
  margin: 0 0 16px;
}

/* El retrato: flota a la izquierda del texto en pantallas anchas, y se
   apila arriba en las angostas (el media query de más abajo lo suelta). */
.biografia-foto {
  float: left;
  width: 240px;
  max-width: 40%;
  height: auto;
  margin: 0 20px 12px 0;
  border-radius: 4px;
}

.biografia-cuerpo {
  line-height: 1.6;
}

.biografia-cuerpo img {
  max-width: 100%;
  height: auto;
}

/* La galería arranca por debajo del texto y del retrato flotado. */
.biografia-galeria {
  clear: both;
  margin-top: 24px;
}

@media (max-width: 640px) {
  .biografia-foto {
    float: none;
    width: 100%;
    max-width: 100%;
    margin: 0 0 16px;
  }
}

/* ---------- Paginado ---------- */

.paginado {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 20px;
}

.paginado a {
  display: inline-block;
  padding: 4px 10px;
  border: 1px solid var(--acento-oscuro);
  border-radius: 4px;
  color: var(--acento-oscuro);
}

.paginado a.pagina-actual {
  background: var(--acento-oscuro);
  color: #ffffff;
}

/* ---------- Formularios (contacto, ingreso, registro, buscador) ---------- */

.form-buscador,
.form-contacto,
.form-ingreso,
.form-registro {
  max-width: 480px;
}

.form-buscador label,
.form-catalogo label,
.form-contacto label,
.form-ingreso label,
.form-registro label {
  display: block;
  margin-bottom: 4px;
  font-weight: bold;
}

.form-buscador input,
.form-catalogo input,
.form-contacto input,
.form-contacto textarea,
.form-ingreso input,
.form-registro input {
  width: 100%;
  padding: 8px 10px;
  border: 1px solid #ccc;
  border-radius: 4px;
  font: inherit;
}

.form-buscador {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 8px;
  max-width: none;
}

.form-buscador label {
  width: 100%;
}

.form-catalogo button,
.form-contacto button,
.form-ingreso button,
.form-registro button,
.form-buscador button {
  padding: 8px 20px;
  background: var(--acento);
  color: #ffffff;
  border: 0;
  border-radius: 4px;
  cursor: pointer;
  font: inherit;
}

.form-catalogo button:hover,
.form-contacto button:hover,
.form-ingreso button:hover,
.form-registro button:hover,
.form-buscador button:hover {
  background: var(--acento-oscuro);
}

.mensaje-error {
  color: #a4262c;
}

.mensaje-ok {
  color: #1b6f3a;
}

.error-campo {
  display: block;
  color: #a4262c;
  font-size: .9em;
}

/*
 * Honeypot del contacto y el registro: oculto por CSS, no con
 * type="hidden". Los bots suelen rellenar cualquier campo del formulario
 * salvo los explícitamente ocultos con type="hidden"; este sigue siendo un
 * <input type="text"> normal a sus ojos, pero invisible y fuera del tabulado
 * para una persona.
 */
.campo-oculto {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ---------- Embebidos (catálogo, tienda, etc.) ---------- */

.embebido-iframe {
  width: 100%;
  min-height: 70vh;
  border: 0;
  background: #ffffff;
  border-radius: var(--radio);
}

/* ---------- Zona inferior: los cuatro logos ---------- */

/* Sigue la columna de panel de arriba: el color va en el contenedor de
   1300px, no de borde a borde (ver .franja-banner). */
.zona-inferior-logos {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
  padding: 16px;
  background: var(--fondo-panel);
  border-left: 1px solid var(--linea);
  border-right: 1px solid var(--linea);
  border-top: 1px solid rgba(0, 0, 0, .4);
}

/* Las cuatro cajas de los logos, un tono MÁS OSCURO que el panel: en el
   original son #1e1d1c sobre #373635 -al revés que las columnas
   laterales, que van más claras-. */
.zona-inferior-logos > .bloque {
  padding: 10px;
  background: #1e1d1c;
  border: 1px solid var(--linea);
  border-radius: 5px;
}

.zona-inferior-logos > .bloque {
  min-width: 0;
}

.zona-inferior .bloque {
  text-align: center;
}

.zona-inferior .bloque + .bloque {
  margin-top: 0;
}

/* Los cuatro logos tampoco mostraban título en Joomla (posición 'bottom',
   mismo criterio que el logo y el banner-top). */
.zona-inferior .bloque-titulo {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ---------- Pie ---------- */

.sitio-pie {
  padding-bottom: 30px;
}

/*
 * El pie del original va CENTRADO, no con el menú a la izquierda y el
 * copyright a la derecha. Es la última pieza de la columna de panel, así
 * que acá se le cierran los bordes de abajo.
 */
.sitio-pie-interior {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 14px 16px 16px;
  background: var(--fondo-panel);
  border: 1px solid var(--linea);
  border-top: 0;
  border-radius: 0 0 5px 5px;
  text-align: center;
}

.menu-pie {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.menu-pie a {
  color: #ffffff;
}

.menu-pie a:hover,
.menu-pie a:focus {
  color: var(--acento);
}

.menu-pie a:focus-visible {
  outline: 2px solid var(--foco-oscuro);
  outline-offset: 2px;
}

.sitio-copyright {
  margin: 0;
  font-size: .85rem;
  color: #b0b0b0;
}

/* ============================================================
   Breakpoints (spec, sección 10.1)
   ≥1024: igual al sitio actual, sin reglas extra acá abajo.
   ============================================================ */

/*
 * 1024-1199: las nueve pestañas piden 1134px de fila y dejan de entrar
 * antes de que aparezca el hamburguesa. Se les recorta el relleno en vez
 * de dejarlas envolver enseguida: con 14px a cada lado la fila entra
 * entera hasta ~1000px de ventana, y recién abajo de eso pasa a dos
 * renglones -que siguen siendo pestañas, apoyadas contra el panel-.
 */
@media (max-width: 1199px) {
  .menu-header > li > a {
    padding: 0 14px;
  }
}

/* 768–1023 */
@media (max-width: 1023px) {
  .disposicion {
    grid-template-columns: 1fr;
  }

  .columna-der {
    order: 3;
  }

  .zona-inferior-logos {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* <768 */
@media (max-width: 767px) {
  /*
   * El menú del teléfono, que es donde el original de 2011 nunca funcionó
   * -allá la fila de 1134px simplemente se salía de la pantalla-.
   *
   * Las pestañas dejan de ser pestañas: nueve cajas con esquinas
   * redondeadas arriba, apiladas, serían nueve recortes flotando. Pasan a
   * ser una lista de botones de ancho completo, cada uno de 44px de alto
   * -el mínimo de área táctil de la guía- y con el mismo relieve (borde
   * negro, brillo arriba, fondo #232221) para que se sigan reconociendo
   * como la misma pieza.
   *
   * El despliegue lo maneja assets/js/menu.js alternando la clase
   * 'abierto' y manteniendo aria-expanded en el botón.
   *
   * Las tres reglas cuelgan de .con-js, que ese mismo script le pone al
   * <html>. Sin eso -si el archivo no llega: un 404, una red cortada, una
   * extensión que bloquea scripts- el visitante de un teléfono se quedaba
   * con un botón que no hace nada y el menú escondido para siempre. Así
   * falla del lado seguro: sin JavaScript no hay botón y el menú se ve
   * desplegado, más largo pero entero.
   */
  .menu-principal {
    margin-bottom: 10px;
  }

  .con-js .menu-principal {
    display: none;
  }

  .con-js .menu-principal.abierto {
    display: block;
  }

  .con-js .boton-menu {
    display: flex;
  }

  .menu-header {
    flex-direction: column;
    align-items: stretch;
    gap: 4px;
    margin-top: 10px;
  }

  .menu-header > li > a {
    height: auto;
    min-height: 44px;
    padding: 0 16px;
    line-height: 42px;
    border: 1px solid var(--linea);
    border-radius: 5px;
    box-shadow: inset 0 1px 0 var(--brillo);
  }

  .menu-header > li > a:hover,
  .menu-header > li > a:focus-visible,
  .menu-header > li.activo > a,
  .menu-header > li.activo-rama > a {
    box-shadow: inset 0 1px 0 var(--brillo-activo);
  }

  /* En vertical la línea de la sección abierta va al costado, no arriba:
     apilados, un borde superior se confunde con el brillo del de al lado. */
  .menu-header > li.activo > a,
  .menu-header > li.activo-rama > a {
    box-shadow: inset 4px 0 0 var(--acento), inset 0 1px 0 var(--brillo-activo);
  }

  /* La lengüeta que une la pestaña abierta con el panel no tiene sentido
     cuando las pestañas están apiladas y lejos del panel. */
  .menu-header > li.activo > a::after,
  .menu-header > li.activo-rama > a::after {
    display: none;
  }

  /* El submenú, apilado y siempre visible: en un teléfono no hay hover, y
     :focus-within lo abriría recién al tabular. */
  .menu-header > li > ul {
    display: block;
    position: static;
    margin-top: 4px;
    border-radius: 5px;
    box-shadow: none;
  }

  .menu-header > li > ul a {
    min-height: 44px;
    line-height: 28px;
    white-space: normal;
  }

  .zona-inferior-logos {
    grid-template-columns: 1fr;
  }

  /*
   * La grilla del catálogo: dos tapas por fila, fijas. Con auto-fill y un
   * mínimo de 145px, una pantalla de 360 (menos los 32px de padding del
   * contenedor y los 40 de la columna de contenido) da UNA sola columna, y
   * una tira de 24 tapas de ancho completo es una página infinita.
   */
  .grilla-discos {
    grid-template-columns: repeat(2, 1fr);
    gap: 18px 12px;
  }

  /*
   * La fila A-Z en un teléfono: 26 cuadraditos de 32px con 3px de hueco
   * entran en tres filas dentro de los 272px de la columna de contenido a
   * 360px de ventana. Sin achicarlos, la fila sigue entrando igual (hace
   * wrap), pero ocupa una pantalla entera antes de llegar a las tapas.
   */
  .catalogo-letra {
    min-width: 32px;
    height: 32px;
    padding: 0 4px;
  }

  .catalogo-letras {
    gap: 3px;
  }

  /*
   * La maquetación heredada de las fichas, desarmada: cada celda pasa a
   * ser un bloque de ancho completo, así que las dos columnas de la ficha
   * -la tapa y la lista de temas- quedan una arriba de la otra en vez de
   * scrollear 641px de tabla dentro de una pantalla de 360.
   *
   * Sobre el !important, con lo que se midió de verdad en Chrome (ficha
   * /catalogo/rafael-amor-2, una de las 3 que traen el ancho en un style
   * inline, con la ventana en 360px):
   *
   * - Como está: la tabla mide 272px y no desborda nada.
   * - Neutralizando SOLO este width: auto: sigue en 272px, porque el
   *   max-width: 100% de más arriba le gana igual (max-width siempre le
   *   gana a width en el valor usado, importante o no).
   * - Neutralizando SOLO ese max-width: sigue en 272px, ahora gracias a
   *   este !important, que es lo único que le gana al style inline.
   * - Neutralizando los dos: la tabla se va a 641px y desborda 369px.
   *
   * O sea: cada uno alcanza solo, y están los dos a propósito. El
   * width="641" del atributo no necesita ninguno -es una sugerencia de
   * presentación y pierde contra cualquier regla de autor-; el style
   * inline de esas 3 fichas sí.
   *
   * No hay riesgo de malinterpretar una estructura: las 257 fichas tienen
   * tablas NO anidadas (profundidad máxima 1), sin colspan y con un solo
   * rowspan en total.
   */
  .disco-ficha-cuerpo table,
  .disco-ficha-cuerpo tbody,
  .disco-ficha-cuerpo tr,
  .disco-ficha-cuerpo td,
  .disco-ficha-cuerpo th {
    display: block;
    width: auto !important;
    height: auto !important;
    max-width: 100%;
  }
}

/* ---------- Galerías de fotos ---------- */

/*
 * La grilla de una galería (un ítem de menú de tipo 'galeria', o la marca
 * <!-- galeria ... --> revivida dentro de una nota del catálogo viejo). Mismo
 * lenguaje visual que la grilla del catálogo (.grilla-discos): tarjetas
 * cuadradas que respiran, del sitio público, no del panel.
 *
 * auto-fill con un mínimo de 150px reparte las columnas según el ancho
 * disponible -la página de galería va a ancho completo, pero la misma grilla
 * aparece embebida en la columna de contenido de una nota, más angosta, y
 * tiene que entrar en las dos-.
 */
.galeria-grilla {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 16px;
  margin: 16px 0;
}

/*
 * Cada foto en una caja cuadrada fija: las fotos reales tienen proporciones
 * distintas y sin una caja de proporción fija cada fila quedaría de una
 * altura distinta. object-fit: cover recorta al cuadrado para la MINIATURA;
 * el click lleva a la imagen entera, sin recorte (un simple enlace a la foto
 * a tamaño completo, sin JavaScript: la CSP del sitio no permitiría una
 * lightbox con script inline, y tampoco hace falta).
 */
.galeria-item {
  display: block;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: #ffffff;
  border: 1px solid #dcdcdc;
  border-radius: 4px;
}

.galeria-foto {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .2s ease;
}

.galeria-item:hover,
.galeria-item:focus {
  border-color: var(--caja);
  box-shadow: 0 2px 10px rgba(0, 0, 0, .15);
}

.galeria-item:hover .galeria-foto,
.galeria-item:focus .galeria-foto {
  transform: scale(1.04);
}

.galeria-vacia {
  color: #6a6a6a;
  margin: 16px 0;
}

@media (max-width: 767px) {
  /*
   * En el teléfono, dos columnas fijas: con auto-fill y un mínimo de 150px,
   * los ~272px de la columna de contenido a 360px de ventana darían una sola
   * columna y una tira infinita de fotos de ancho completo. Dos columnas de
   * ~128px entran sin desbordar (medido con el overflow-x real, no el
   * html,body{overflow-x:hidden} que lo enmascara).
   */
  .galeria-grilla {
    grid-template-columns: repeat(2, 1fr);
    gap: 12px;
  }
}

/* ---------- Visor (lightbox) de la galería ---------- */

/*
 * La capa que muestra una foto de la galería encima de la página, sin salir
 * del sitio. La arma assets/js/galeria.js con la API del DOM y la engancha al
 * <body>; acá va sólo el aspecto. Es MEJORA PROGRESIVA: sin JavaScript esta
 * capa no existe y el <a href="foto-grande"> de la grilla abre la foto como
 * siempre. Nada de esto se ve hasta que el visor se abre (arranca con el
 * atributo `hidden`).
 *
 * Fondo oscuro semitransparente sobre el negro del sitio (--pestana-base), la
 * foto centrada y entera (object-fit: contain, nunca desborda la pantalla) y
 * los controles como círculos tocables de 48px (más que los 44px mínimos).
 */
.galeria-visor {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: rgba(18, 17, 17, .93);
  animation: galeria-visor-aparecer .18s ease-out;
}

/* Cerrado: fuera del árbol de accesibilidad y sin pintar. Gana en
   especificidad sobre el display:flex de arriba (clase + atributo). */
.galeria-visor[hidden] {
  display: none;
}

@keyframes galeria-visor-aparecer {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/*
 * La foto entra SIEMPRE en la pantalla: max-width/height al 100% del área
 * disponible (la capa ya descuenta su padding) y contain para conservar la
 * proporción sin recorte y sin desbordar -ni a lo ancho ni a lo alto, ni en
 * el teléfono-.
 */
.galeria-visor-imagen {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  border-radius: var(--radio);
  box-shadow: 0 8px 44px rgba(0, 0, 0, .6);
  background: #000000;
}

.galeria-visor button {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  width: 48px;
  height: 48px;
  margin: 0;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .55);
  color: #ffffff;
  line-height: 1;
  cursor: pointer;
  transition: background .15s ease;
}

.galeria-visor button[hidden] {
  display: none;
}

.galeria-visor button:hover {
  background: var(--acento);
}

/* El foco entra a la capa al abrir: tiene que verse de lejos sobre el
   fondo oscuro (mismo anillo que el resto del sitio sobre oscuro). */
.galeria-visor button:focus {
  outline: 3px solid var(--foco-oscuro);
  outline-offset: 2px;
  background: var(--acento);
}

.galeria-visor button span {
  display: block;
}

.galeria-visor-cerrar {
  top: 16px;
  right: 16px;
  font-size: 30px;
}

.galeria-visor-anterior,
.galeria-visor-siguiente {
  top: 50%;
  transform: translateY(-50%);
  font-size: 40px;
}

.galeria-visor-anterior {
  left: 16px;
}

.galeria-visor-siguiente {
  right: 16px;
}

.galeria-visor-contador {
  position: absolute;
  left: 50%;
  bottom: 16px;
  transform: translateX(-50%);
  margin: 0;
  padding: 5px 14px;
  border-radius: 999px;
  background: rgba(0, 0, 0, .55);
  color: #ffffff;
  font-size: 14px;
  letter-spacing: .02em;
}

.galeria-visor-contador[hidden] {
  display: none;
}

/*
 * Con el visor abierto, el fondo no scrollea. Va en <html> (y en body) porque
 * el html del sitio ya lleva overflow-x: hidden; overflow: hidden tapa los dos
 * ejes mientras dura.
 */
html.galeria-visor-abierto,
html.galeria-visor-abierto body {
  overflow: hidden;
}

@media (max-width: 767px) {
  /* En el teléfono la foto gana lugar y los controles se arriman al borde,
     sin dejar de ser tocables (48px). */
  .galeria-visor {
    padding: 12px;
  }
  .galeria-visor-cerrar {
    top: 10px;
    right: 10px;
  }
  .galeria-visor-anterior {
    left: 8px;
  }
  .galeria-visor-siguiente {
    right: 8px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .galeria-visor {
    animation: none;
  }
  .galeria-visor button {
    transition: none;
  }
}
