/* display:flex + flex-direction:column en body y flex:1 en ".body-inner"
   (footer sticky): el pie de página vive fuera de ".body-inner", como
   hermano suyo directo dentro de <body> (ver html_pie_pagina(), llamado
   después de cerrar ese div). En páginas con poco contenido (secundarias
   con pocos resultados, por ejemplo) sin esto el pie quedaba justo debajo
   del contenido, a media pantalla, en vez de anclado abajo del todo. */
body{
    /* Negro fijo (no var(--body-bg-color), que es el color configurado de la
       web): el contenido queda limitado a 2400px (.bloque_datos, .body-inner)
       y este es el fondo que se ve a los lados en pantallas más anchas. */
    background-color: #000000 !important;
    color: var(--body-text-color) !important;
    font-family: var(--font-family-base) !important;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

/* Forzado explícito en <p> (no basta con la herencia desde body): plugins.css
   define "body{color:#3c4043}" sin !important, así que en teoría lo de
   arriba ya gana, pero el color de la web no llegaba a los párrafos. */
p{
    color: var(--body-text-color) !important;
}

/* La plantilla fija "strong{font-weight:600}" (ver style.css): un peso
   semi-negrita que se nota poco sobre las fuentes de la web, muy por debajo
   del "bold" (700) que aplica el propio navegador en los editores del admin
   (TinyMCE) al marcar texto en negrita. Con esto el negrito se ve igual de
   grueso en la web que en el editor. */
strong, b{
    font-weight: 700;
}

/* Color hover genérico de enlaces (Otras configuraciones > Personalización
   > "Color hover"): la plantilla trae "a:hover{color:#1d44d6}" fijo (ver
   style.css), sin relación con los colores configurados de la web. No
   afecta a botones/insignias con su propio hover (.boton1, .boton2,
   .btn-resultados-clasificacion...), que al llevar selector de clase ganan
   por especificidad. */
a:hover{
    color: var(--body-hover-color) !important;
}

/* Enlaces insertados a mano dentro del contenido de un editor (TinyMCE:
   noticias, secciones de texto/pestañas/testimonios, portada...): sin esto
   se confundían con el texto normal (heredan --body-text-color y la
   plantilla les quita el subrayado por defecto, ver comentario de arriba).
   El color es una variación derivada del propio color de texto configurado
   (color-mix, sin necesidad de configurar un color adicional por web) y el
   subrayado es más fino que el del navegador para que no resulte agresivo.
   ".contenido-html" es la clase genérica añadida en funciones_html.php a los
   contenedores que no tenían ya una clase propia estable; el resto
   (.portada_texto, .noticia-detalle-cuerpo, .noticia-detalle-resumen,
   .blog-slider__text) ya existían y no ha hecho falta tocar el PHP.
   ":not(.custom_boton)" excluye a los botones con estilo propio (Botón tipo
   1-4, del desplegable de formatos del editor): sin él, el !important de
   aquí les ganaba a los suyos y salían como un enlace suelto en vez de como
   el botón que son. */
.contenido-html a:not(.custom_boton),
.portada_texto a:not(.custom_boton),
.noticia-detalle-cuerpo a:not(.custom_boton),
.noticia-detalle-resumen a:not(.custom_boton),
.blog-slider__text a:not(.nav-link):not(.custom_boton){
    color: color-mix(in srgb, var(--body-text-color) 65%, transparent) !important;
    text-decoration: underline !important;
    text-decoration-color: color-mix(in srgb, var(--body-text-color) 35%, transparent) !important;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
}

.contenido-html a:not(.custom_boton):hover,
.portada_texto a:not(.custom_boton):hover,
.noticia-detalle-cuerpo a:not(.custom_boton):hover,
.noticia-detalle-resumen a:not(.custom_boton):hover,
.blog-slider__text a:not(.nav-link):not(.custom_boton):hover{
    color: var(--body-hover-color) !important;
    text-decoration-color: var(--body-hover-color) !important;
}

/* Excepción: la cabecera (portada_texto, la gran franja de texto/CTA que
   corona la home, ver #portada-section en funciones_html.php) y el pie de
   página NO deben llevar este estilo "de sección" en sus enlaces, aunque
   los reutilicen por dentro. El pie es el caso más amplio: cualquier tipo
   de bloque (texto, cards, columnas, testimonios, patrocinadores...) puede
   vivir ahí (pagina='PIE', ver html_pie_pagina()), no solo el bloque "pie"
   propiamente dicho, y todos comparten el mismo prefijo de id/clase
   "bloque_pie_N" (ver get_bloque_clase()) sea cual sea su tipo — así que
   basta con excluir por ese prefijo en vez de listar cada tipo de bloque.
   Más específico que el bloque de arriba (mismo selector + un ancestro más),
   así que gana sin depender del orden. */
section[id^="bloque_pie_"] .contenido-html a:not(.custom_boton),
section[id^="bloque_pie_"] .noticia-detalle-cuerpo a:not(.custom_boton),
section[id^="bloque_pie_"] .noticia-detalle-resumen a:not(.custom_boton),
section[id^="bloque_pie_"] .blog-slider__text a:not(.nav-link):not(.custom_boton),
#portada-section .portada_texto a:not(.custom_boton){
    color: inherit !important;
    text-decoration: none !important;
}

section[id^="bloque_pie_"] .contenido-html a:not(.custom_boton):hover,
section[id^="bloque_pie_"] .noticia-detalle-cuerpo a:not(.custom_boton):hover,
section[id^="bloque_pie_"] .noticia-detalle-resumen a:not(.custom_boton):hover,
section[id^="bloque_pie_"] .blog-slider__text a:not(.nav-link):not(.custom_boton):hover,
#portada-section .portada_texto a:not(.custom_boton):hover{
    color: inherit !important;
}

/* El bloque de arriba solo cubre los enlaces de texto enriquecido (los que
   pasan por .contenido-html y compañía), pero NO es la única fuente de este
   estilo: css/textarea.css trae su propia regla "a:not(.custom_boton)" SIN
   ningún selector que la limite (confirmado inspeccionando el CSS
   computado real de un enlace del menú). Ese fichero lo carga tanto el
   sitio público como el editor/vista previa de TinyMCE (bloque_textarea.css
   lo importa) — dentro del iframe del editor ESTÁ bien que sea global, ya
   que ahí todo el contenido es "sección"; en el sitio público en cambio
   afecta a CUALQUIER enlace de la página (menú, pie, paginación de
   noticias.php, lo que sea) que no pase por ninguna de las clases de
   arriba. En vez de ir añadiendo una excepción cada vez que aparece en un
   sitio nuevo (así estaba antes: una para el menú, otra para el pie...) se
   neutraliza aquí de una vez para todo el sitio público — custom.css no se
   carga dentro del iframe del editor, así que no hay conflicto con el caso
   en el que SÍ debe quedarse global. Solo dentro de .contenido-html y
   compañía (arriba, con !important) debe verse como un enlace de texto.
   Sin "!important" a propósito: basta con ganar por especificidad a la
   regla de textarea.css (mismo ":not(.custom_boton)", con "body" delante). */
body a:not(.custom_boton){
    color: inherit;
    text-decoration: none;
}

/* La plantilla fija "section{background-color:#fff}" (ver style.css), lo que
   tapa el background configurado de la web en las páginas secundarias
   (resultados, ...): su contenido vive dentro de un <section> normal, sin
   fondo propio como sí tienen los bloques de la portada. */
.pagina-resultados-contenido{
    background-color: transparent !important;
}

/* Corrige un problema de orden en plugins.css: ahí ".col-12{flex:0 0 auto;
   width:100%}" aparece DESPUÉS de ".col-md{flex:1 0 0%}" dentro de su
   @media, así que con igual especificidad gana ".col-12" y una columna
   "col-12 col-md" se queda a ancho completo incluso en escritorio. Como
   este fichero se carga después de plugins.css, esta regla reafirma el
   comportamiento correcto de Bootstrap (auto-reparto a partir de 768px). */
@media (min-width: 768px) {
    .col-md {
        flex: 1 0 0%;
    }
}

body .body-inner {
    /* El <body> ahora es negro fijo (letterboxing fuera de los 2400px); sin
       un fondo propio aquí, cualquier hueco "transparente" dentro del
       contenido (p.ej. ".pagina-resultados-contenido", pensada para dejar
       ver el color configurado de la web) dejaba ver ese negro en su lugar. */
    background-color: var(--body-bg-color);
    max-width: 2400px;
    margin: auto;
    flex: 1 0 auto;
    width: 100%;
}

/* Todas las secciones (get_base_seccion(), clase siempre presente: "bloque_N"
   en páginas normales, "bloque_pie_N" en las del pie) limitadas a 2400px de
   ancho, centradas. Cubre tanto las que viven dentro de ".body-inner" (ya
   limitado a 2400px, así que aquí es redundante pero inofensivo) como las
   del pie de página (html_pie_pagina()), que se pintan fuera de
   ".body-inner" como hermanas directas de <body> (necesario para el footer
   sticky) y por tanto no heredaban ese límite: sin esto su fondo se estiraba
   hasta el borde de la ventana en pantallas muy anchas aunque su contenido
   interior (".container", 1340px) sí quedara centrado. */
.bloque_datos {
    max-width: 2400px;
    width: 100%;
    margin-left: auto;
    margin-right: auto;
}

/* El header vive fuera de .body-inner (suele ir fixed/full-width), así que
   sin esto se estira a todo el ancho de pantalla mientras el resto del
   contenido queda centrado con el mismo max-width de arriba. */
#header .header-inner {
    max-width: 2400px;
    margin-left: auto;
    margin-right: auto;
}

/* Capa superior del "container" de un bloque (independiente de la capa de
   la sección, que usa .bg-overlay). Sin mix-blend-mode a propósito: dentro
   del container esa mezcla no se pintaba de forma fiable. */
.container-overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    z-index: 0;
}

/* Capa superior de la SECCIÓN de un bloque (capa_superior sobre imagen_fondo
   en get_base_seccion). Misma idea que .container-overlay: .bg-overlay lleva
   mix-blend-mode:multiply vía ".bloque_datos .bg-overlay", pensado para un
   tinte artístico, pero eso impide que la capa cubra del todo la imagen aunque
   se ponga opacidad 100% (multiply nunca oculta, solo oscurece). Con una clase
   propia sin blend-mode la opacidad se comporta como una tapadera normal. */
.section-overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    z-index: 0;
}

#overlay-trans {
    background: rgba(0, 0, 0, 0) linear-gradient(to bottom, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%) repeat scroll 0 0;
    z-index: 1;
    opacity:0.5;
}

.container {
    max-width: var(--container-width);
}

/* Sección marcada como "Fullscreen" (ver get_base_seccion() en
   funciones_html.php): usa el límite ancho global de 2400px (mismo que
   ".bloque_datos"/".body-inner", pensado para pantallas muy anchas) en vez
   del --container-width configurado para esta web, para que ocupe más
   ancho que el contenido normal sin llegar a ser borde a borde. Selector de
   dos clases (más específico que ".container" a secas) para ganarle a la
   regla de arriba sin depender del orden en el CSS. */
.container.container-fullscreen {
    max-width: 2400px;
}

/* Cards en fullscreen: sin el padding lateral que trae ".container" de
   Bootstrap (independiente del max-width de arriba), para que las cards
   lleguen justo hasta el borde de esos 2400px en vez de dejar un margen en
   blanco a los lados. Solo para tipo "cards" (".bloque_cards", clase que
   pone get_base_seccion() en la sección): otros tipos fullscreen (p.ej.
   marquesina) sí quieren conservar ese padding. */
.bloque_cards .container-fullscreen {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

#fondo_color{
    position: relative;
    z-index: 1;
}

#topbar img{
    height: auto;
}

.w-30{
    width: 30% !important;
}

.w-40{
    width: 40% !important;
}

/* Evita que cualquier elemento que se salga del ancho de la sección
   (sombras, formas decorativas, columnas con márgenes negativos, etc.)
   provoque scroll horizontal en la página. */
.bloque_datos{
    overflow-x: hidden;
}

#portada-section .container .portada{
    margin-top: 30px;
    border-radius: 50px;
}

#portada-section .margen{
    margin: 0px 25px;
}

#portada-section .margen .portada{
    border-radius: 60px 0 0 0;
}

/* BUG (corregido): el selector de abajo llevaba ".margen" (clase de
   "Tamaño portada", una opción de ANCHO totalmente aparte) en vez de
   ".overlay-left" (clase real de "Posición capa" = "capa_posicion", ver
   dropdown en portada.php) — así que el recuadro pequeño de "Arriba
   izquierda" (radio/max-width, ver ".overlay-left .bg-overlay" más abajo)
   se aplicaba también con "Pantalla completa" en cuanto "Tamaño portada"
   era "margen", dejando la capa como un recuadro en la esquina superior
   izquierda en vez de a pantalla completa. Con ".overlay-left" añadido al
   selector, este ajuste de altura (necesario solo en la combinación
   "Arriba izquierda" + "Tamaño portada" = margen: top:0/bottom:0 ya
   heredados de .bg-overlay, y al fijar aquí una altura el trío
   top+height+bottom queda sobrerrestringido e ignora "bottom", dejando la
   capa anclada arriba con un hueco debajo en vez de estirarse hasta abajo)
   ya no se cuela en "Pantalla completa". */
#portada-section.overlay-left .margen .bg-overlay {
    height: 100%;
}

@media screen and (max-width: 768px) {
    #portada-section .margen{
        margin: 0px 15px;
    }

    #portada-section .margen .portada{
        border-radius: 30px 0 0 0;
    }

    /* En móvil la capa necesita su propio tamaño (no el heredado de
       escritorio, pensado para una portada mucho más ancha): más baja y
       ocupando casi todo el ancho, en vez de un recuadro estrecho y muy
       alto. Igual que arriba, solo para "Arriba izquierda" (ver el "BUG
       corregido" más arriba) — con "Pantalla completa" no debe reducirse. */
    #portada-section.overlay-left .margen .bg-overlay {
        height: 72%;
        max-width: 90%;
        border-radius: 0 0 280px 0;
    }

    /* El tema no trae un reset global de imágenes responsivas (solo lo
       aplica quien use la clase ".img-fluid" de Bootstrap explícitamente),
       así que cualquier <img> con un ancho intrínseco mayor que la pantalla
       se salía de su contenedor en móvil. */
    img {
        max-width: 100%;
        height: auto;
    }

    /* Primer container de cada sección (ver get_base_seccion() en
       funciones_html.php): en móvil, px-3 (mismo valor que la utilidad de
       Bootstrap). Scope a ".bloque_datos > .container" (hijo directo) para
       no afectar a containers anidados más adentro del contenido del
       bloque, ni a otros .container del sitio (header, portada, topbar...). */
    .bloque_datos > .container {
        padding-left: 1rem;
        padding-right: 1rem;
    }
}

.inspiro-slider.dots-creative .flickity-page-dots .is-selected, .carousel.dots-creative .flickity-page-dots .is-selected, .flickity-button:hover, .inspiro-slider.dots-creative .flickity-page-dots .dot:after, .carousel.dots-creative .flickity-page-dots .dot:after{
    background-color: var(--body-items-color) !important;
}

#header.sombra{
    box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
}

.top-menu i{
    opacity: 50%;
}

#mainMenu > .container > nav > ul > li > a {
    padding: 10px 8px;
    font-weight: var(--menu-font-weight);
    letter-spacing: var(--menu-letter-spacing);
    text-transform: none;
}

/* Mismos selectores que abajo pero SIN ".container" en la cadena (a
   propósito): con ".container" esta regla quedaba más específica que la de
   html_header() (font-size: menu_size !important), que va después en el
   documento pero con una especificidad ligeramente menor — y por
   especificidad, no por orden, esta ganaba siempre pase lo que pase,
   dejando fijo el tamaño "de fábrica" de la tipografía (--menu-font-size)
   en vez del "Tamaño fuente" configurado en el admin. Igualando la
   especificidad, vuelve a decidir el orden y gana la de html_header(); esta
   se queda solo de red de seguridad por si esa variable no llegara a
   definirse. */
#mainMenu nav > ul > li > a, #header .item-menu a > i, #mainMenu nav > ul > li .dropdown-menu > li > a, #mainMenu button, #mainMenu nav > ul > li:hover > a, #header .header-extras nav > ul > li a {
    font-size: var(--menu-font-size) !important;
}

/* Submenú de opciones (#mainMenu nav > ul > li .dropdown-menu): su "top:auto"
   de fábrica (style.css) posiciona el desplegable donde caería en el flujo
   normal justo después del <a> de la opción, y ese <a> lleva un min-height
   igual a la altura configurada del menú (@media min-width:1025px, ver
   html_header()); con una altura de menú grande, el punto de esa caída
   queda muy por debajo del propio <a>, no pegado a su borde inferior. Fijar
   top:100% lo ancla de forma determinista al borde inferior de la opción de
   menú (su <li>, que ya es position:relative en style.css), sea cual sea la
   altura configurada. */
#mainMenu nav > ul > li .dropdown-menu {
    top: 100% !important;
}

/* El logo, header-extras, mainMenu-trigger y el <nav> del menú están en
   float. Sin "clearfix" su contenedor no crece para contenerlos y, si las
   opciones del menú pasan a dos líneas por falta de espacio, la segunda
   línea se sale del fondo de la barra y queda sobre la portada. Con esto el
   fondo crece con el contenido. */
#header .header-inner > .container::after,
#mainMenu > .container::after {
    content: "";
    display: table;
    clear: both;
}
#mainMenu > .container > nav > ul > li > a {
    display: flex;
    align-items: center;
}
/* El logotipo puede sobresalir bastante por debajo de su altura configurada
   (ver #logo img más abajo); si el menú no cabe en una línea, el propio
   #mainMenu debe pintarse por encima para que el texto no quede tapado. */
#mainMenu {
    position: relative;
    z-index: 2;
}

/* Los "campos extra" del menú (idiomas, RRSS...) van dentro de
   .header-extras, que se centraba con line-height en vez de con flexbox
   como el resto de la barra, así que no quedaban alineados con las
   opciones del menú. Igualamos el criterio de centrado. */
.header-extras {
    display: flex;
    align-items: center;
}
.header-extras > ul {
    align-items: center;
}
.header-extras nav {
    display: flex;
    align-items: center;
    height: 100%;
}
.header-extras nav > ul {
    display: flex;
    align-items: center;
    height: 100%;
}
.header-extras nav > ul > li {
    display: flex;
    align-items: center;
}
.header-extras .social-icons {
    display: flex;
    align-items: center;
}

.bloque_fotos .swiper {
    width: 100%;
    height: 100%;
}

.bloque_fotos .swiper-slide {
    text-align: center;
    font-size: 18px;
    background: #444;
    display: flex;
    justify-content: center;
    align-items: center;
}

.bloque_fotos img {
    display: block;
    width: 100%;
    object-fit: cover;
}

.portfolio-item .portfolio-description i {
    background-color: #fff;
    color: #484848;
    border-radius: 50%;
    color: #444;
    font-size: 18px;
    height: 40px;
    line-height: 40px !important;
    width: 40px;
    transition: all 250ms ease-in-out 0s;
    border: 1px solid #ededed;
}

.play-icon {
  position: absolute; /* Posiciona el icono de forma absoluta dentro de su padre */
  top: 50%; /* Mueve el icono a la mitad vertical */
  left: 50%; /* Mueve el icono a la mitad horizontal */
  transform: translate(-50%, -50%); /* Centra el icono perfectamente */
  width: 50px; /* Ajusta el tamaño del icono */
  height: 50px; /* Ajusta el tamaño del icono */
  background-color: rgba(0, 0, 0, 0.5); /* Fondo semi-transparente para el círculo del icono */
  border-radius: 50%; /* Hace que el fondo sea un círculo */
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer; /* Indica que es interactivo */
  z-index: 11;
}

/* O si usas un <i> con un icono de librería como FontAwesome */
.play-icon::before {
  content: "\f04b"; /* Código del icono de Play de FontAwesome */
  font-family: "Font Awesome 5 Free"; /* O la familia de tu librería */
  font-weight: 900; /* Peso del icono */
  color: white; /* Color del icono */
  font-size: 24px; /* Tamaño del icono */
}

button.btn.btn-outline:hover, button.btn.btn-outline:focus, button.btn.btn-outline:active, button.btn.btn-outline.active,
.btn:not(.close):not(.mfp-close).btn-outline:hover,
.btn:not(.close):not(.mfp-close).btn-outline:focus,
.btn:not(.close):not(.mfp-close).btn-outline:active,
.btn:not(.close):not(.mfp-close).btn-outline.active,
a.btn:not([href]):not([tabindex]).btn-outline:hover,
a.btn:not([href]):not([tabindex]).btn-outline:focus,
a.btn:not([href]):not([tabindex]).btn-outline:active,
a.btn:not([href]):not([tabindex]).btn-outline.active {
  background-color: transparent;
}

button.btn, .btn:not(.close):not(.mfp-close), a.btn:not([href]):not([tabindex]){
    font-weight: 500;
    letter-spacing: 0.3px;
}

.lista_idioma li span{
    line-height: 32px;
}

.header-extras nav > ul, #topbar nav > ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

.header-extras nav > ul > li, #topbar nav > ul > li {
    float: left;
    border: 0;
    transition: all 0.3s ease;
    margin-left: 10px;
    position: relative;
}

.lista_idioma span {
    /* position: absolute;
    top: -9px;
    font-size: 9px;
    opacity: 1;
    right: -9px; */
    font-size: 15px;
}

.capa_superior{
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    width: 100%;
    height: 100%;
    content: " ";
    z-index: 0;
}

#topbar a {
    color: #3c4043 !important;
}

#topbar.dark a {
    color: #fff !important;
}

#topbar .lista_idioma ul > li a {
    color: #3c4043 !important;
}

#topbar .lista_idioma ul > li a:hover{
    opacity: 0.8;
}

#topbar a:hover {
    opacity: 0.8;
}

.social-icons.social-icons-colored-hover li a:hover {
    background-color: transparent !important;
}

.overlay-left .bg-overlay {
    border-radius: 0 0 706px 0;
    max-width: 650px;
}

/* ".container-fluid > .container" (no ".container" a secas): ese selector
   más amplio pillaba también el ".container" EXTERIOR que envuelve toda la
   portada cuando "Tamaño portada" = "Reducir al tamaño del container" (ver
   html_portada() en funciones_html.php, la clase de ese div es literalmente
   "full"/"margen"/"container") — con "data-fullwidth" activo (Contenido
   fullscreen, o Capa superior en "Arriba izquierda") esa regla ganaba a
   ".container{max-width:var(--container-width)}" y dejaba la portada
   siempre a ancho completo pese a haber elegido "Reducir al tamaño del
   container". Esta regla es solo para que el TEXTO no quede apretado en un
   container estrecho cuando la portada es fullscreen — ese es el
   ".container" de dentro de ".container-fluid", no el de fuera. */
#portada-section[data-fullwidth=true] .container-fluid > .container {
    max-width: 100%;
    padding: 0 30px;
}

/* Secciones de la portada dentro de la capa curva "Arriba izquierda"
   (capa_posicion = overlay-left, ver portada.php): el contenido debe
   ocupar el mismo ancho que la propia capa curva (".bg-overlay-izquierda",
   max-width:650px) y quedar centrado verticalmente dentro de ella. Antes
   usaba el ".container" normal de Bootstrap (responsive, mucho más ancho
   que la curva, centrado en toda la pantalla) y nunca llegaba a centrarse
   verticalmente porque la regla del tema para eso (".fullscreen
   .container-fullscreen .text-middle") no encuentra esos dos ancestros
   juntos en el HTML real de la portada — así que el bloque se quedaba
   donde cayera en el flujo normal, no centrado en la curva.
   ".container-fluid" ya es "position:relative" (tipo Vídeo) o
   "position:absolute" (tipo Fotos/Color) puesto inline en html_portada();
   con "inset:0" (o "top:0; height:100%" para el caso "relative", que no
   admite "inset" con la misma naturalidad) más flex, queda estirado a
   toda la altura de la capa y centra su contenido verticalmente.

   "position:relative" en "#portada-section" en general (antes solo lo
   llevaba con ".overlay-left"): todo lo que cuelga dentro con
   "position:absolute" (capa superior, separador inferior, y el
   ".container-fluid" del texto en los tipos Fotos/Color) necesita un
   ancestro posicionado para anclarse a los límites de la PORTADA — sin
   ninguno, el navegador usa el "contenedor inicial" (el documento entero)
   como referencia. Con "top/left/bottom/right:0" eso coincide por suerte
   con la esquina superior de la página (la portada es lo primero), pero con
   solo "bottom:0" (el separador inferior, sin ningún "top" que lo
   compense) el navegador lo ancla al final del DOCUMENTO entero en vez de
   al final de la portada — confirmado con una prueba real: con
   capa_posicion distinto de "overlay-left" (el único caso que antes tenía
   este position:relative) el separador no se veía por ningún lado, aunque
   estuviera bien configurado. */
#portada-section {
    position: relative;
}

/* "position:absolute!important": html_portada() (funciones_html.php) pone
   ".container-fluid" en línea como "position:relative" para los tipos
   Vídeo/Vídeo propio y "position:absolute" para Fotos/Color. El "inset:0" +
   "height:100%" de aquí abajo (para centrar el texto verticalmente en toda
   la curva) solo funciona con "absolute" — con "relative" ambas propiedades
   quedan casi sin efecto (inset:0 en relative es un simple offset de 0, no
   "estirar a los 4 bordes"; height:100% no tiene de qué altura definida
   partir, ya que ningún ancestro intermedio la fija), así que el texto se
   quedaba con la altura de su propio contenido y no centraba nada —
   confirmado con una prueba real (Vídeo propio, arriba izquierda, en
   móvil: el texto salía arriba en vez de centrado). Forzarlo aquí a
   "absolute" iguala el comportamiento al de Fotos/Color sin tocar el PHP,
   que tendrá sus propios motivos para usar "relative" fuera de este caso
   ("overlay-left"), el único al que afecta esta regla. */
#portada-section.overlay-left .container-fluid {
    position: absolute !important;
    inset: 0;
    height: 100%;
    display: flex;
    align-items: center;
}

/* Misma especificidad que la regla de arriba ("#portada-section.overlay-left
   .container-fluid"): en CSS, entre dos reglas con igual especificidad gana
   la que aparece MÁS TARDE en el archivo, sin importar si está dentro de un
   @media o no. Por eso este ajuste móvil va aquí, DESPUÉS de la regla base
   de arriba, y no dentro del primer bloque "@media (max-width:768px)" (que
   está antes en el archivo): allí quedaba sobrescrito por la regla base de
   más abajo y no llegaba a aplicarse — confirmado con una prueba real.

   En escritorio el texto SÍ se centra verticalmente ("align-items:center"
   de la regla base). En móvil, la referencia que se está imitando aquí
   (ver ".hero .content" en la maqueta de ejemplo para "capa arriba
   izquierda") no lo centra: lo ancla arriba con un margen superior fijo
   ("padding: 3rem 1rem 0" en esa maqueta) — confirmado comparando el CSS
   real de esa referencia. Con el texto centrado, en móvil quedaba más abajo
   de lo esperado y con un hueco vacío por debajo. */
@media screen and (max-width: 768px) {
    #portada-section.overlay-left .container-fluid {
        align-items: flex-start;
        padding-top: 3rem;
    }
}

#portada-section.overlay-left .container-fluid > .container {
    max-width: 650px;
    /* Bootstrap centra ".container" con "margin:0 auto" por defecto, lo que
       gana al "justify-content" del flex de arriba y lo centraba en vez de
       dejarlo pegado a la izquierda (sobre la propia curva). */
    margin: 0 !important;
    /* Fijo en vez de heredar el "padding-left/right:var(--bs-gutter-x,1rem)"
       de Bootstrap (ver ".container-fluid,.container,..." en plugins.css):
       en la práctica ese cálculo no daba 1rem sino ~30px (una variable
       "--bs-gutter-x" heredada de algún ".row" de más arriba, no aislada con
       certeza) — así que se fija aquí directamente. Este es el valor de
       ESCRITORIO de la referencia ("p-3 p-sm-5" de Bootstrap sobre
       ".hero .content": 3rem a partir de 576px) — en móvil se reduce a 1rem
       más abajo, en el "@media" de después (tiene que ir DESPUÉS: misma
       especificidad, gana la regla que aparece más tarde en el archivo). */
    padding-left: 3rem !important;
    padding-right: 3rem !important;
}

/* Valor de MÓVIL de la referencia (".hero .content" con "max-width:575px":
   "padding: 3rem 1rem 0") — más reducido que el de escritorio de arriba.
   Se había dejado el mismo 1rem para todos los tamaños, con lo que en PC
   quedaba con mucho menos margen izquierdo del que tiene la maqueta de
   ejemplo — confirmado por el usuario comparando ambas. */
@media screen and (max-width: 768px) {
    #portada-section.overlay-left .container-fluid > .container {
        padding-left: 1rem !important;
        padding-right: 1rem !important;
    }
}

/* ".container-fluid" (padding-left/right:1rem de Bootstrap, ver
   plugins.css) + ".container" que cuelga dentro (fijado arriba a 1rem) +
   ".col-12" de "resolver_widgets_portada()" (funciones_html.php: su
   padding-left/right de columna, pensado para compensar el margen NEGATIVO
   de un ".row" que aquí no existe) se sumaban los tres, dejando el texto con
   muchísimo más margen izquierdo del previsto — confirmado con una prueba
   real comparando contra la referencia. Solo dejamos el padding de
   ".container" (fijado arriba) y anulamos los otros dos. */
#portada-section.overlay-left .container-fluid {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

#portada-section.overlay-left .text-middle.portada_texto > .col-12.contenido-html {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* La propia sección (bloque) y su ".container" interior vuelven a traer su
   propio ancho/padding responsive de Bootstrap (pensado para páginas
   normales a pantalla completa): aquí deben ceder todo el ancho disponible
   (ya acotado a 650px arriba) sin añadir más margen lateral propio. */
#portada-section.overlay-left .text-middle.portada_texto section[id^="bloque_portada_"] {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

#portada-section.overlay-left .text-middle.portada_texto section[id^="bloque_portada_"] > .container {
    max-width: 100% !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
}

.bloque_marquesina{
    padding-top:0px;
    padding-bottom:0px;
}

.particles canvas {
    z-index: 9;
}

.marquee-container {
   width: 100%;
   padding: 15px 0;
 }

 .marquee-content {
    display: flex;
    white-space: nowrap;
    will-change: transform;
    animation: marquee 20s linear infinite;
    font-size: 30px;

    font-weight: 400;
    color: #D1D700;       
 }

 .marquee-item {
   flex: 0 0 auto;
   padding: 0 20px;
   font-size: 1.2rem;
 }

 @keyframes marquee {
   0% {
     transform: translateX(100%);
   }

   100% {
     transform: translateX(-100%);
   }
 }

 /* Optional: Pause animation on hover */
 .marquee-container:hover .marquee-content {
   animation-play-state: paused;
 }

 .portada *{
    color: var(--portada-text-color);
 }

.inspiro-slider .flickity-page-dots {
    z-index: 99;
}

/* Sombreado opcional de la imagen del bloque de texto (checkbox "Sombreado"
   en el admin). Antes iba ligado a la clase "rounded" de Bootstrap y se
   aplicaba siempre; ahora es una clase propia, independiente del admin. */
.imagen-sombra{
    box-shadow: 40px 80px 120px -40px rgba(0, 0, 0, 0.16);
}

/* Vídeo de YouTube/Vimeo asociado a una imagen (bloque de texto o galería):
   el popup de tipo "inline" de magnific-popup no trae, a diferencia del
   tipo "iframe", un ancho máximo por defecto, así que el vídeo salía a todo
   el ancho de la pantalla en vez de en un recuadro tipo modal.
   "position:relative" además de "max-width": con "closeBtnInside:true" (ver
   js/functions.js) el botón de cerrar (.mfp-close, position:absolute) se
   inyecta DENTRO de este mismo div; sin position:relative aquí, ese
   position:absolute se resuelve contra ".mfp-content" (que ocupa casi todo
   el ancho de la pantalla) en vez de contra el recuadro de 900px del
   vídeo, y la X aparecía pegada al borde derecho de la pantalla en vez de
   la esquina del vídeo. */
.video-embed-popup{
    max-width: 900px;
    margin: 40px auto;
    position: relative;
}

/* No fuerza "text-align:center" (como antes): el contenido de la portada
   ahora son secciones completas (ver html_portada() en funciones_html.php),
   con su propia alineación configurable igual que en cualquier otra página
   — forzarlo aquí ganaba siempre a lo que el usuario configurara dentro de
   la sección. */
.portada_texto *{
    line-height: normal;
}

.portada p{
    margin: 0;
}

.portada .shape-divider {
    z-index: 100 !important;
}

#particles-dots {
    z-index: 1;
}

.portada.portada2{
    max-height: 200px;
    min-height: 200px;
}




/* ============================================================== 
// JAVASCRIPT 
// ==============================================================  */

.permanent-marker {
    font-family: "Permanent Marker", cursive;
    font-weight: 400;
    font-style: normal;
}

.notable {
    font-family: "Notable", sans-serif;
    font-weight: 400;
    font-style: normal;
}
.germania {
    font-family: "Germania One", system-ui;
    font-weight: 400;
    font-style: normal;
}
.rubik {
    font-family: "Rubik Glitch", system-ui;
    font-weight: 400;
    font-style: normal;
}
.bungee{
    font-family: "Bungee Inline", sans-serif;
    font-weight: 400;
    font-style: normal;
}

.inter {
    font-family: "Inter", sans-serif;
    font-optical-sizing: auto;
    font-weight: 400;
    font-style: normal;
}
.oswald{
    font-family: "Oswald", sans-serif;
    font-optical-sizing: auto;
    font-weight: 400;
    font-style: normal;
}

.arvo{
    font-family: "Arvo", serif;
    font-weight: 400;
    font-style: normal;
}

.arvo-italic {
    font-family: "Arvo", serif;
    font-weight: 400;
    font-style: italic;
}
.maven {
    font-family: "Maven Pro", sans-serif;
    font-optical-sizing: auto;
    font-weight: 400;
    font-style: normal;
}

/* La altura del logotipo se configura en el admin (el ancho es siempre
   automático, proporcional a la imagen). Esa altura puede ser mayor que la
   altura configurada del menú: el contenedor #logo tiene overflow visible y
   centra la imagen verticalmente con flexbox (en vez de con position:
   absolute, para que la imagen siga aportando su ancho real al contenedor,
   que ya no tiene un ancho fijo en px), así que si el logo es más alto
   sobresale por igual arriba y abajo en vez de empujar el contenido
   siguiente. */
#header .header-inner #logo, #header #header-wrap #logo {
    display: flex;
    align-items: center;
    overflow: visible;
    width: auto;
}
/* La imagen es "inline" por defecto, así que dentro del span .logo-default
   (que hereda font-size: 40px de style.css) el navegador reserva una caja de
   línea del alto de ese texto y la alinea sobre su línea base, dejando un
   hueco fantasma (el descendente de la fuente) debajo. Eso hacía que
   .logo-default fuera más alto que la propia imagen y que ésta quedara
   pegada abajo en vez de centrada. Con display:block la imagen deja de
   participar en ese cálculo de línea y .logo-default se ajusta exactamente
   a su altura. */
#header .header-inner #logo img, #header #header-wrap #logo img {
    display: block;
    width: auto;
    max-width: none;
}

.bloque_datos .bg-overlay{
    mix-blend-mode: multiply;
}

.js-background-video, .js-background-video #yt-player {
    top: -100%;
    height: 300%;
}

.bg-overlay-izquierda {
    border-radius: 0 0 706px 0;
    max-width: 650px;
}

.custom_boton{
    font-weight: 500;
}

.header-extras  ul{
    column-gap : 6px;
}

/* El borde real (una versión aclarada del color de texto configurado, fija
   y ajena al hover) lo fuerza html_header() con !important; aquí solo
   queda un valor de respaldo por si esa variable no estuviera definida.
   Sin sombreado ni ningún otro efecto propio en :hover: el cambio a
   hover_color en el texto/icono ya lo cubre la regla compartida con el
   resto de opciones del menú ("#header .header-extras nav > ul > li
   a:hover", en html_header()), que alcanza a .boton-idioma por ser
   descendiente de esa lista. */
.boton-idioma{
    padding: 7px;
    border: solid 1px rgba(0, 0, 0, .15);
    border-radius: 50px;
}

/* El botón de idioma con banderas (lista_idioma) reutiliza el componente
   ".p-dropdown" del tema, que por defecto también se abre al pasar el ratón
   (":hover"), además de al hacer clic (functions.js ya alterna la clase
   "dropdown-active" en el clic). Aquí anulamos esa apertura por hover: solo
   con ":not(.dropdown-active)" para no interferir si además está abierto
   por clic (con el ratón encima, cosa muy habitual justo después de
   pulsar). Clic para abrir Y cerrar, nunca hover. */
.lista_idioma:hover:not(.dropdown-active) .p-dropdown-content{
    opacity: 0 !important;
    visibility: hidden !important;
}

.fondo_fijo{
    background-attachment: fixed;
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;    
}

.titulo-seccion{
    font-size: 18px;
    font-weight: 600;
    margin-bottom: 0;
    text-align: center;
}
/* 2px menos que el tamaño configurado en móvil. "!important" para ganar al
   "font-size" inline (el tamaño real, dinámico por web, ver
   html_titulo_seccion() en funciones_html.php) — calc() sobre
   "--titulo-seccion-font-size", esa misma variable puesta inline en cada
   título junto al font-size, en vez de un valor fijo aquí. Mismo punto de
   corte que el resto del sitio (767.98px, ver css_dinamico.php). */
@media (max-width: 767.98px) {
    .titulo-seccion{
        font-size: calc(var(--titulo-seccion-font-size) - 2px) !important;
    }
}

/* Secciones de tipo "Título" (cabecera, ver html_cabecera()) y la cabecera
   por defecto de páginas secundarias (Noticias, Contacto...) — ambas
   reutilizan html_portada_subpaginas(), de ahí la clase compartida. En
   móvil, el 75% del tamaño configurado ("--titulo-cabecera-font-size",
   puesta inline junto al font-size real, dinámico por web). */
@media (max-width: 767.98px) {
    .pagina-secundaria-titulo{
        font-size: calc(var(--titulo-cabecera-font-size) * 0.75) !important;
    }
}

/* Tipo "Círculo": círculo fijo de 56x56 sin overflow:hidden ni ancho
   flexible; el texto (nowrap) empieza dentro del círculo y, al no caber,
   continúa visualmente fuera de él hacia la derecha, sin recortarse. */
.titulo-seccion-circulo {
    display: inline-flex;
    align-items: center;
    flex-shrink: 0;
    white-space: nowrap;
    width: 56px;
    height: 56px;
    padding: 0 0 0 18px;
    border: 1px solid #dee2e6;
    border-radius: 50%;
    margin: 0;
}

/* Tipo "Línea coloreada": barra corta bajo el título, con el color de items
   de Personalización. Por defecto centrada; los modificadores -izquierda/
   -derecha la anclan al mismo lado que la alineación del título. */
.titulo-seccion-linea {
    position: relative;
    padding-bottom: 12px;
    margin: 0;
}
.titulo-seccion-linea::after {
    content: "";
    position: absolute;
    left: 50%;
    bottom: 0;
    transform: translateX(-50%);
    width: 60px;
    height: 4px;
    border-radius: 2px;
    background-color: var(--titulo-linea-color, currentColor);
}
.titulo-seccion-linea-izquierda::after {
    left: 0;
    transform: none;
}
.titulo-seccion-linea-derecha::after {
    left: auto;
    right: 0;
    transform: none;
}

section td, section th{
    padding-right: calc(1.5rem * 0.5);
    padding-left: calc(1.5rem * 0.5);
}

.noticia .card-text {
    color: #FFF;
    background-color: rgba(17, 17, 17, 0.5);
    position: absolute;
    padding: 25px;
    z-index: 10;
    height: 100%;
    display: flex;
    flex-wrap: wrap;
    align-content: flex-end;
    -moz-transition: all 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
    -o-transition: all 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
    -webkit-transition: all 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
    transition: all 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
    top: 0;
}

.noticia .card-title {
    margin: 8px 0;
    font-weight: 400;
    font-size: 1.375em;
    color:#FFF;
}

.noticia .post-date {
    font-size: 0.875em;
    color:#FFF;
    opacity: 0.6;
}



/* ============================================================== 
// FOOTER 
// ==============================================================  */
footer{
    background-color: var(--footer-bg-color) !important;
    font-size: 16px;
}

footer, footer strong{
    color: var(--footer-text-color) !important;
}

footer .nav-link{
    color: var(--footer-link-color) !important;
    font-size: 16px;
}

footer .nav-link:hover, footer svg:hover{
    color: var(--footer-link-hover-color) !important;
}

footer svg{
    color: var(--footer-rrss-color) !important;
}

/* Selector de idioma (topbar y menú principal / header-extras): anclar el
   desplegable siempre justo debajo del botón. Dentro de contenedores flex
   (como el "header-extras" del menú, un <ul class="d-flex">) el cálculo de
   posición "automática" (top:auto) de .p-dropdown-content no es fiable y el
   desplegable puede aparecer mucho más abajo de lo esperado. Fijar top:100%
   lo ancla de forma determinista al borde inferior del botón, y el
   margin-top añade una separación visible respecto a ese botón. */
.p-dropdown .p-dropdown-content,
.p-dropdown ul.p-dropdown-content {
    top: 100% !important;
    margin-top: 16px !important;
    /* El desplegable trae de fábrica un borde gris fijo (#e4e6ef, ver
       style.css) ajeno a los colores configurados del sitio; lo sustituimos
       por el color de acento configurado (el mismo que usan otros detalles
       del sitio, como .separador) para que no desentone. */
    border-color: var(--body-items-color);
}

/* Topbar: el tema aplica un borde inferior por defecto que queda visible
   incluso con fondo de color propio; lo quitamos siempre. */
#topbar {
    border-bottom: 0;
}


/* Centrado vertical del contenido del topbar con flexbox en vez de
   line-height. Con line-height = altura configurada, cualquier elemento
   anidado (como el desplegable de idioma) heredaba esa altura como su
   propia caja de línea, y "top: 100%" se calculaba sobre esa caja inflada
   en vez de sobre el botón visible, dejando el desplegable muy por debajo.
   Con flexbox el topbar mantiene su altura fija y el contenido —incluida
   una imagen más alta que el topbar— se centra sin inflar las cajas de
   los elementos hijos. */
#topbar {
    /* !important necesario: las clases Bootstrap "d-xl-block"/"d-lg-block"
       que ya lleva #topbar para su visibilidad responsive imponen
       "display: block !important", que si no ganaría a esta regla. */
    display: flex !important;
    align-items: center;
    overflow: visible;
}
#topbar > .container:not(.d-none) {
    width: 100%;
}

/* Efecto hover automático a partir del color de texto configurado: no se
   pide un color de hover aparte, simplemente se atenúa el original. */
#topbar a:hover,
#topbar .top-menu > li > a:hover,
#topbar nav > ul > li a:hover,
#topbar .social-icons li a:hover {
    opacity: .65;
    transition: opacity .15s ease;
}

/* El icono de X es un <svg> (los demás iconos de redes son <i> de la fuente
   de iconos). El tema solo anima el "salto" en hover sobre <i>, así que X se
   quedaba quieto mientras el resto saltaba; le aplicamos la misma animación
   para que se comporte igual que los demás. */
#topbar .social-icons li:hover svg {
    animation: toTopFromBottom 0.3s forwards;
}

/* Topbar — bloque "Fecha + redes sociales": fecha arriba, iconos redondeados
   debajo, sin la animación de "salto" del icono al pasar el ratón. Día y mes
   van con el mismo formato marcado (como antes), solo con un pequeño espacio
   entre ambos para que no queden pegados. */
#topbar .topbar-fecha-rrss {
    line-height: 1.1;
    gap: 4px !important;
}
#topbar .topbar-fecha-rrss-fecha .dia {
    font-weight: 800;
}
#topbar .topbar-fecha-rrss-fecha .mes {
    font-weight: 800;
    margin-left: .12em;
}
#topbar .topbar-fecha-rrss-fecha .anio {
    font-weight: 500;
}
#topbar .topbar-fecha-rrss .social-icons {
    height: auto;
}
#topbar .topbar-fecha-rrss .social-icons ul {
    display: flex;
    justify-content: center;
}
#topbar .topbar-fecha-rrss .social-icons li {
    float: none;
}
/* Medidas exactas del ejemplo real (rocknrollmadridrun.com, widget Social
   Icons de Elementor): círculo de 35px de ancho, medido directamente en la
   web (no por cálculo), y 12px de separación entre botones. */
#topbar .topbar-fecha-rrss .social-icons li a {
    border-radius: 50%;
    height: 35px;
    width: 35px;
    line-height: 35px;
    font-size: 17px;
    margin: 0 12px 0 0;
    color: #fff !important;
}
#topbar .topbar-fecha-rrss .social-icons li:last-child a {
    margin-right: 0;
}
#topbar .topbar-fecha-rrss .social-icons li:hover i,
#topbar .topbar-fecha-rrss .social-icons li:hover svg {
    animation: none !important;
}
/* ".top-menu i { opacity: 50% }" (más arriba en este fichero) apaga por
   defecto cualquier icono dentro de un bloque .top-menu (pensada para los
   iconos de email/teléfono). Como este bloque también lleva la clase
   "top-menu", se lo aplicaba a los iconos de RRSS también. */
#topbar .topbar-fecha-rrss .social-icons i,
#topbar .topbar-fecha-rrss .social-icons svg {
    opacity: 1 !important;
}
/* Colores de marca actuales: X ya no es azul, es negro; Instagram se muestra
   en negro para que el conjunto luzca uniforme salvo Facebook. */
#topbar .topbar-fecha-rrss .social-icons .social-facebook a {
    background-color: #1877F2 !important;
}
#topbar .topbar-fecha-rrss .social-icons .social-twitter a {
    background-color: #000 !important;
}
#topbar .topbar-fecha-rrss .social-icons .social-instagram a {
    background: #000 !important;
}

/* Imagen de la barra superior: posición absoluta pegada arriba del todo
   (#topbar tiene position:relative por defecto en el tema), para que si es
   más alta que el topbar sobresalga solo por abajo en vez de centrarse. */
#topbar .topbar-imagen {
    position: absolute;
    top: 0;
}

/* ==============================================================
// BLOQUE TESTIMONIOS (blog-slider)
// ============================================================== */

.blog-slider {
    width: 95%;
    position: relative;
    max-width: 800px;
    margin: auto;
    background: #fff;
    box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2);
    padding: 25px;
    border-radius: 25px;
    height: 400px;
    transition: all 0.3s;
    /* Swiper añade la clase "swiper" a este mismo elemento y trae
       overflow:hidden (swiper-bundle.css), lo que recorta la foto que
       debe sobresalir por la izquierda (.blog-slider__img). Lo forzamos
       a visible para que se vea igual que en la referencia. */
    overflow: visible !important;
}
@media screen and (max-width: 992px) {
    .blog-slider {
        max-width: 680px;
        height: 400px;
    }
}
@media screen and (max-width: 768px) {
    .blog-slider {
        min-height: 400px;
        width: 100%;
        height: auto;
        margin: 80px auto 0px;
    }
}
@media screen and (max-width: 575px) {
    .blog-slider {
        min-height: 0;
        width: 100%;
        height: auto;
        margin: 80px auto 0px;
    }
}
@media screen and (max-height: 500px) and (min-width: 992px) {
    .blog-slider {
        height: 350px;
    }
}

/* Selector compuesto (.blog-slider__item.swiper-slide) a propósito: swiper
   -bundle.min.css define ".swiper-slide{display:block}" y se carga DESPUÉS
   de este fichero, así que con la misma especificidad (una sola clase)
   ganaba esa regla y anulaba el display:flex, apilando foto y texto. */
.blog-slider__item.swiper-slide {
    display: flex;
    align-items: center;
}
@media screen and (max-width: 768px) {
    .blog-slider__item.swiper-slide {
        flex-direction: column;
    }
}

.blog-slider__img {
    width: 300px;
    flex-shrink: 0;
    height: 300px;
    box-shadow: 4px 13px 30px 1px rgba(var(--body-items-color-rgb), 0.2);
    border-radius: 20px;
    transform: translateX(-80px);
    z-index: 1;
    overflow: hidden;
    background: #f5f5f5;
}
.blog-slider__img img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    border-radius: 20px;
}
@media screen and (max-width: 768px) {
    /* El "peek" de la foto sobre la tarjeta es intencional (mismo efecto
       que en escritorio, ahí hacia la izquierda con translateX), pero
       menos agresivo que antes (era -60%) y ya no se compensa con OTRO
       transform negativo en .blog-slider__content (ver más abajo): entre
       los dos se comían el hueco y la foto quedaba pegada al nombre. */
    .blog-slider__img {
        transform: translateY(-30%);
        width: 220px;
        height: 220px;
    }
}
@media screen and (max-width: 576px) {
    .blog-slider__img {
        width: 180px;
        height: 180px;
    }
}

.blog-slider__content {
    /* 50px se quedaba corto en la práctica (el texto llegaba a solaparse
       con la columna de paginación de la derecha, confirmado con una
       prueba real) — más margen de separación para que no vuelva a pasar. */
    padding-right: 90px;
    margin-left: -2rem;
}
@media screen and (max-width: 768px) {
    /* Ya no lleva transform propio (antes translateY(-80px), que sumado al
       de la foto de arriba dejaba título y foto casi pegados). El único
       desplazamiento hacia arriba lo pone la foto; aquí solo el padding
       para separar el texto del borde de la tarjeta. */
    .blog-slider__content {
        text-align: left;
        padding: 1rem;
        margin-left: 0rem;
    }
    .blog-slider__content p {
        font-size: 1.05rem !important;
    }
}
@media screen and (max-width: 576px) {
    .blog-slider__content {
        padding: 1rem 0.5rem;
    }
    .blog-slider__content p {
        font-size: 1rem !important;
    }
}

.blog-slider__title {
    font-size: 24px;
    font-weight: 700;
    color: #0d0925;
    margin-bottom: 20px;
}
@media screen and (max-width: 576px) {
    .blog-slider__title {
        font-size: 18px;
        margin-bottom: 15px;
        margin-top: 1rem;
    }
}

.blog-slider__text {
    color: #4e4a67;
    margin-bottom: 10px;
    line-height: 1.5em;
}
.blog-slider__text a.nav-link {
    padding: 0;
    color: inherit;
}

.blog-slider__pagination {
    position: absolute !important;
    z-index: 21;
    right: 20px !important;
    width: 11px !important;
    text-align: center;
    left: auto !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%);
}
@media screen and (max-width: 768px) {
    /* "top" en píxeles fijos, posicionado justo debajo de la foto (como en
       la referencia, circuitos/vihalf) — pero NO es el mismo valor que la
       referencia: allí la foto sube un 60% de su alto (translateY(-60%)),
       aquí solo un 30% (ver ".blog-slider__img", más suave a propósito), así
       que el hueco libre entre el borde inferior visible de la foto y el
       inicio del texto queda en otro sitio. Recalculado para la geometría
       real de aquí: foto de 220px con -30% deja el hueco entre ~179px y
       ~245px (desde el borde superior de ".blog-slider", que tiene 25px de
       padding) — 200px cae cómodo en medio, sin tocar ni la foto ni el
       texto, sea cual sea la longitud del testimonio (no depende del texto,
       solo del tamaño/desplazamiento fijos de la foto). Antes se probó
       position:static (paginación al final de la tarjeta) y luego copiar el
       145px de la referencia tal cual (se solapaba con el texto, por el
       desajuste de geometría) — ver conversación. */
    .blog-slider__pagination {
        transform: translateX(-50%);
        left: 50% !important;
        top: 165px !important;
        width: 100% !important;
        display: flex;
        justify-content: center;
        align-items: center;
    }
}
@media screen and (max-width: 575px) {
    /* Mismo recálculo que arriba: foto de 180px con -30% deja el hueco
       entre ~151px y ~205px; 170px cae en medio. */
    .blog-slider__pagination {
        transform: translateX(-50%);
        left: 50% !important;
        top: 170px;
        width: 100% !important;
        display: flex;
        justify-content: center;
        align-items: center;
    }
}
.blog-slider__pagination.swiper-pagination-bullets .swiper-pagination-bullet {
    margin: 8px 0;
}
@media screen and (max-width: 768px) {
    .blog-slider__pagination.swiper-pagination-bullets .swiper-pagination-bullet {
        margin: 0 5px;
    }
}
.blog-slider__pagination .swiper-pagination-bullet {
    width: 11px;
    height: 11px;
    display: block;
    border-radius: 10px;
    background: #062744;
    opacity: 0.2;
    transition: all 0.3s;
}
.blog-slider__pagination .swiper-pagination-bullet-active {
    opacity: 1;
    background: var(--body-items-color);
    height: 30px;
    box-shadow: 0px 0px 20px rgba(var(--body-items-color-rgb), 0.3);
}
@media screen and (max-width: 768px) {
    .blog-slider__pagination .swiper-pagination-bullet-active {
        height: 11px;
        width: 30px;
    }
}

/* Efectos hover de "Varias columnas" / "Cards". */

/* Capa superpuesta para oscurecer/aclarar: por encima de cualquier fondo
   (color o imagen), en vez de un background-color que una imagen taparía. */
.columna-hover-capa {
    position: absolute;
    inset: 0;
    z-index: 0;
    opacity: 0;
    transition: opacity 0.3s ease;
    pointer-events: none;
}
.columna-hover-capa-oscurecer {
    background-color: rgba(46, 60, 95, 0.5);
}
.columna-hover-capa-aclarar {
    background-color: rgba(255, 255, 255, 0.35);
}
.columna-hover-oscurecer:hover .columna-hover-capa-oscurecer,
.columna-hover-aclarar:hover .columna-hover-capa-aclarar {
    opacity: 1;
}

/* La capa superior propia de la tarjeta (.section-overlay) se ve por
   defecto; mientras dura el hover de "Oscurecer" la sustituye la capa fija
   de arriba, y al salir el ratón vuelve a verse la capa superior propia.
   ".columna-capa-hover" (capa superior COMÚN de sección, tipo "Cards" — ver
   html_columna_item()) es la excepción: en vez de ocultarse y dejar paso a
   un tinte fijo sin relación con su color, sube su propia opacidad (más
   específico que la regla de aquí arriba, para ganarle pese al !important
   de ambas). */
.columna-hover-oscurecer .section-overlay {
    transition: opacity 0.3s ease;
}
.columna-hover-oscurecer:hover .section-overlay {
    opacity: 0 !important;
}
.columna-capa-uniforme {
    opacity: var(--capa-opacidad-normal, 1);
}
.columna-hover-oscurecer:hover .section-overlay.columna-capa-hover {
    opacity: var(--capa-opacidad-hover, 1) !important;
}

.columna-hover-ampliar {
    overflow: hidden;
}
.columna-hover-ampliar .columna-bg {
    transition: transform 0.4s ease;
}
.columna-hover-ampliar:hover .columna-bg {
    transform: scale(1.08);
}
.columna-hover-elevar {
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.columna-hover-elevar:hover {
    transform: translateY(-8px);
    box-shadow: 0 16px 30px rgba(0, 0, 0, 0.2);
}
.columna-hover-grises .columna-bg {
    transition: filter 0.4s ease;
    filter: grayscale(100%);
}
.columna-hover-grises:hover .columna-bg {
    filter: grayscale(0%);
}

/* "Sombreado": atributo permanente del bloque tipo Cards, no un hover — un
   leve sombreado alrededor de cada tarjeta con el color de items. */
.columna-sombreado {
    box-shadow: 0 8px 20px rgba(0, 0, 0, 0.25);
}

/* ----------------------------------------------------------------
   Menú: ajustes específicos para móvil (mismo breakpoint que el resto del
   menú responsive del tema, ver style.css).
   - El icono del menú (mainMenu-trigger-group) no ocupa más del 70% del
     ancho. Es lo único que hay en esa fila de la cabecera, cerrada o
     abierta: no cambia de sitio al abrir el panel.
   - .header-extras (idiomas, RRSS...) no se muestra en móvil: esos mismos
     campos se reubican DENTRO del panel del menú móvil, no en la cabecera
     (ver más abajo). El idioma NO va en la cabecera/mainMenu-trigger-group
     a propósito: esa fila comparte ancho con el logo y, con varios idiomas
     en texto (IDIOMA_TX), no le cabía y saltaba de línea invadiendo visualmente
     la cabecera. Dentro del panel tiene todo su ancho (hasta 420px) sin
     competir con nada.
   - El container del header lleva el padding horizontal de un "px-2".
   - La altura del menú es la configurada (#header ya la fuerza sin media
     query, ver html_header()); aquí solo centramos verticalmente todos los
     elementos de esa fila.
   - El logo respeta su altura configurada (logo_height, ver css_dinamico.php)
     igual que en escritorio: #logo usa flex + overflow:visible para poder
     sobresalir por igual arriba y abajo de la fila del menú en vez de
     recortarse con el max-height:80px que impone style.css (tema base) en
     este mismo breakpoint.
   - El logo se sitúa en la posición configurada (igual que en escritorio) y
     el icono va al lado contrario (izquierda si el logo está a la derecha;
     derecha en cualquier otro caso).
----------------------------------------------------------------- */

/* Menú extra y RRSS (dentro de "#mainMenu > .container > nav") e idioma
   (dentro de "#mainMenu > .container > .mainMenu-panel-top"), todos
   reubicados DENTRO del panel del menú móvil y nunca en la cabecera/
   mainMenu-trigger-group: ocultos por defecto (escritorio); la media query
   de abajo los muestra solo con el panel abierto. Van antes de la media
   query para que esas reglas más específicas los puedan
   mostrar sin pelear por especificidad. */
.mainMenu-extra-movil,
.mainMenu-rrss-movil,
.mainMenu-idioma-movil,
.mainMenu-panel-top {
    display: none;
}

@media (max-width: 1024px) {
    #header .header-inner > .container::after,
    #mainMenu > .container::after {
        content: none;
    }

    #header .header-inner,
    #header .header-inner > .container {
        display: flex;
        align-items: center;
        flex-wrap: wrap;
    }

    #header .header-inner > .container {
        position: relative;
        padding-left: 1rem !important;
        padding-right: 1rem !important;
    }

    #header #logo {
        position: static !important;
        float: none !important;
        width: auto !important;
        margin: 0 !important;
        padding: 0 !important;
        text-align: left !important;
        left: auto !important;
        right: auto !important;
        display: flex !important;
        align-items: center;
        overflow: visible;
    }
    #header #logo > a img {
        max-height: none;
        padding-bottom: 0 !important;
    }

    .header-extras {
        display: none !important;
    }

    #mainMenu-trigger-group {
        /* position:relative (no "static") + z-index para que el icono se
           mantenga siempre por encima del panel: es hermano de #mainMenu
           dentro de #header, así que su z-index compite directamente con
           el de #mainMenu (ver más abajo), no con el de #header como
           ancestro común. */
        position: relative !important;
        z-index: 10070 !important;
        float: none !important;
        height: auto !important;
        max-width: 70%;
        display: flex;
        align-items: center;
        gap: 24px;
    }

    #mainMenu-trigger {
        /* En escritorio #mainMenu-trigger lleva "height: 80px" (ver
           style.css), pensado para cuando era él mismo el hijo directo del
           flex de la cabecera. Ahora que vive dentro de #mainMenu-trigger-group
           hay que neutralizarlo aquí igual que antes, o el icono (42px)
           queda arriba del todo de esa caja de 80px en vez de centrado. */
        height: auto !important;
        flex-shrink: 0;
    }

    /* Con el panel abierto, el icono de la cabecera se oculta (sigue
       ocupando su sitio, para que el logo no salte, pero no se ve ni se
       puede pulsar): el cierre pasa a ser cosa exclusiva de .mainMenu-close,
       dentro del propio panel. Si no, se veían dos X a la vez (esta,
       convertida en X por "toggle-active" en style.css, y la del panel).
       pointer-events:none también en el CONTENEDOR (no solo en el <a> de
       dentro): #mainMenu-trigger-group tiene z-index:10070 (por encima del
       panel, z-index:10050) y, aunque su contenido esté invisible, el propio
       div seguía "robando" el clic en esa zona (comprobado con
       elementFromPoint) en vez de dejarlo pasar al botón de cerrar de
       debajo. */
    body.mainMenu-open #mainMenu-trigger-group {
        pointer-events: none;
    }
    body.mainMenu-open #mainMenu-trigger {
        visibility: hidden;
        pointer-events: none;
    }

    /* Idioma: DENTRO de .mainMenu-panel-top (ver funciones_html.php y más
       arriba en este mismo fichero), a la izquierda del botón de cerrar,
       ambos dentro de #mainMenu. No tiene relación con la cabecera/icono
       de apertura, que no cambia de sitio al abrir. Solo tiene sentido con
       el panel abierto (ver también "display:none" por defecto, arriba
       del todo de este fichero). */
    body.mainMenu-open .mainMenu-idioma-movil {
        display: flex !important;
        align-items: center;
        gap: 14px;
    }
    /* El <nav><ul> que envuelve el botón de idioma es marcado reutilizado
       del selector de escritorio (pensado para vivir dentro de
       ".header-extras", con su propio contexto de flex/float ya resuelto
       ahí). Metido tal cual aquí dentro, esa cadena nav>ul>li>.p-dropdown
       (con "float:left" de fábrica en .p-dropdown, ver style.css) generaba
       una descoordinación real entre el layout calculado y lo pintado en
       pantalla (comprobado con getBoundingClientRect + muestreo de
       píxeles: el botón "existía" con posición y color correctos pero no
       llegaba a pintarse). display:contents en nav/ul/li los saca de la
       ecuación por completo — dejan de generar caja propia y su contenido
       (el <li> con el botón, o varios <li> en el caso de Idioma-Texto)
       pasa a comportarse como hijo directo de este flex container, sin
       ninguna capa intermedia con float de por medio. */
    .mainMenu-idioma-movil nav,
    .mainMenu-idioma-movil nav > ul {
        display: contents !important;
    }
    .mainMenu-idioma-movil nav > ul > li {
        list-style: none;
        float: none !important;
    }
    /* .p-dropdown (el botón con desplegable, variantes IDIOMA/IDIOMA_BANDERAS)
       es hijo del <li> — no un flex item directo de .mainMenu-idioma-movil
       — así que su "float:left" de fábrica (style.css) no queda neutralizado
       solo por el flex de más arriba; hay que anularlo aquí explícitamente. */
    .mainMenu-idioma-movil .p-dropdown {
        float: none !important;
    }

    #mainMenu {
        order: 3;
        flex: 0 0 100%;
    }

    /* Logo a la izquierda (por defecto) o centro: el icono va a la derecha. */
    #header:not(.header-logo-right) #logo {
        order: 1;
    }
    #header:not(.header-logo-right) #mainMenu-trigger-group {
        order: 2;
        margin-left: auto;
    }

    /* Logo a la derecha: el icono va a la izquierda. */
    #header.header-logo-right #mainMenu-trigger-group {
        order: 1;
        margin-left: auto;
    }
    #header.header-logo-right #logo {
        order: 2;
        margin-left: auto;
    }

    /* Logo centrado: se centra de forma independiente al icono, que sigue a
       la derecha (caso "resto de casos" anterior). */
    #header.header-logo-center #logo {
        position: absolute;
        left: 50%;
        transform: translateX(-50%);
    }

    /* ------------------------------------------------------------
       Panel deslizante del menú (sustituye al acordeón que despliega el
       tema por defecto debajo de la cabecera; ver js/custom.js, que
       sustituye el manejador de click del icono para abrir/cerrar este
       panel en vez de animar el "min-height" original).
       - Se abre desde el mismo lado en el que está el icono que lo abre
         (en #header), pero una vez abierto es autosuficiente: su propia
         cabecera interna (.mainMenu-panel-top, con el idioma y el botón de
         cerrar .mainMenu-close) y el <nav> con las opciones no dependen en
         nada de #header/el logo (antes sí, vía una altura medida por JS).
       - Ocupa casi toda la pantalla (ancho 88vw, con un máximo en pantallas
         grandes) y toda la altura.
       - #mainMenu > .container es una columna flex: .mainMenu-panel-top
         (alto fijo a su contenido) arriba y <nav> (el resto: opciones +
         extra + RRSS) ocupando el resto con su propio scroll, que nunca
         puede "subir" por detrás de la cabecera del panel.
       ------------------------------------------------------------ */
    body.mainMenu-open {
        /* position:fixed (no solo overflow:hidden) para bloquear también el
           scroll táctil de fondo en iOS/Android; ver js/custom.js, que fija
           "top" a la posición de scroll actual y la restaura al cerrar. */
        position: fixed !important;
        left: 0;
        right: 0;
        width: 100%;
        overflow: hidden;
    }

    body.mainMenu-open #header {
        position: fixed !important;
        top: 0 !important;
        left: 0 !important;
        right: 0 !important;
        z-index: 10060 !important;
    }

    #mainMenu {
        /* El fondo (mismo color que el menú) se fija en funciones_html.php,
           ya que depende de la configuración de cada web. */
        position: fixed !important;
        top: 0 !important;
        bottom: 0 !important;
        height: 100vh !important;
        max-height: none !important;
        width: 88vw !important;
        max-width: 420px !important;
        z-index: 10050 !important;
        overflow: hidden !important;
        transition: transform .35s ease !important;
        box-shadow: 0 0 25px rgba(0, 0, 0, .25);
    }

    /* "#header .container { position: relative }" (style.css) también
       alcanza a este .container, por ser #mainMenu descendiente de #header:
       eso lo convertía en el ancestro posicionado de nav (más abajo). Lo
       convertimos en columna flex propia: .mainMenu-panel-top (idioma + X,
       altura fija a su contenido) arriba y nav (el resto, con scroll
       propio) ocupando el resto — así el panel es autosuficiente, sin
       depender de la altura de #header/el logo para nada (antes se leía
       por JS, ver actualizarAlturaCabeceraMenuMovil en custom.js). */
    #mainMenu > .container {
        position: static !important;
        display: flex;
        flex-direction: column;
        height: 100%;
        overflow: hidden;
    }

    .mainMenu-panel-top {
        flex: 0 0 auto;
        display: flex;
        align-items: center;
        gap: 16px;
        padding: 20px 28px;
    }

    .mainMenu-close {
        margin-left: auto;
        padding: 8px;
        flex-shrink: 0;
        display: flex;
        align-items: center;
    }
    /* .lines-button trae "height:100%" de fábrica (style.css), pensado
       para heredar la altura de #mainMenu-trigger; aquí, sin ese
       contenedor, se le da una altura fija propia para que las líneas se
       vean con un tamaño razonable. */
    .mainMenu-close .lines-button {
        height: 24px;
    }

    #mainMenu > .container > nav {
        /* ">" en vez de espacio: el idioma trae su propio <nav> anidado
           (por su marcado, reutilizado del selector de idioma de
           escritorio); un selector descendiente "#mainMenu nav" también le
           pegaría a ESE nav interior. Ya no necesita position:absolute ni
           un "top" calculado: como hermano flex de .mainMenu-panel-top
           dentro de la columna de arriba, ocupa automáticamente todo el
           espacio restante y su overflow-y:auto le da scroll propio, sin
           que ese scroll pueda "subir" por detrás de la X ni del idioma. */
        flex: 1 1 auto;
        min-height: 0;
        margin: 0;
        padding: 0 28px 40px !important;
        overflow-y: auto !important;
        overflow-x: hidden !important;
        display: flex !important;
        flex-direction: column;
        /* El tema solo revela el <nav> (opacity/transform) cuando #mainMenu
           lleva la clase "menu-animate", añadida por la animación de
           acordeón original (js/functions.js). Nuestro panel ya no la usa
           (ver js/custom.js), así que se fuerza aquí directamente. */
        opacity: 1 !important;
        transform: none !important;
    }

    /* Lado por el que se despliega: el mismo en el que está el icono.
       Las reglas de apertura repiten el mismo selector "#header ... #mainMenu"
       (en vez de solo "body.mainMenu-open #mainMenu") para igualar su
       especificidad (dos ID) y poder ganarles siempre, tanto cerrado como
       abierto, independientemente del orden en la hoja. */
    #header:not(.header-logo-right) #mainMenu {
        right: 0 !important;
        left: auto !important;
        transform: translateX(100%) !important;
    }
    #header.header-logo-right #mainMenu {
        left: 0 !important;
        right: auto !important;
        transform: translateX(-100%) !important;
    }

    body.mainMenu-open #header:not(.header-logo-right) #mainMenu {
        transform: translateX(0) !important;
    }
    body.mainMenu-open #header.header-logo-right #mainMenu {
        transform: translateX(0) !important;
    }

    /* Menú extra y RRSS: solo tienen sentido dentro del panel abierto. */
    body.mainMenu-open .mainMenu-extra-movil {
        display: flex;
    }
    body.mainMenu-open .mainMenu-rrss-movil {
        display: block;
    }

    /* Fondo oscuro detrás del panel (no cierra al pulsarlo, es solo para dar
       contraste/foco; cerrar sigue siendo cosa del icono-X). Un pseudo-
       elemento de body evita tener que añadir un div nuevo solo para esto. */
    body.mainMenu-open::before {
        content: "";
        position: fixed;
        inset: 0;
        background: rgba(0, 0, 0, .45);
        z-index: 10040;
    }

    /* ------------------------------------------------------------
       Aspecto del contenido del panel: separación clara entre el bloque de
       opciones normales del menú, el menú extra (botones) y las RRSS, con
       líneas divisorias sutiles en vez de que todo quede pegado.
       ------------------------------------------------------------ */
    #mainMenu > .container > nav > ul > li {
        border-bottom: 1px solid rgba(0, 0, 0, .06);
    }
    #mainMenu > .container > nav > ul > li:last-child {
        border-bottom: none;
    }
    #mainMenu > .container > nav > ul > li > a {
        font-weight: 500;
    }

    .mainMenu-extra-movil {
        flex-direction: column;
        gap: 14px;
        margin-top: 20px !important;
        padding-top: 24px !important;
        border-top: 1px solid rgba(0, 0, 0, .08);
    }
    .mainMenu-extra-movil > li {
        margin-bottom: 0 !important;
    }
    .mainMenu-extra-movil .custom_boton {
        width: 100%;
    }

    .mainMenu-rrss-movil {
        padding-top: 24px;
        border-top: 1px solid rgba(0, 0, 0, .08);
    }
    .mainMenu-rrss-movil .rrss-movil-titulo {
        display: block;
        font-size: 12px;
        font-weight: 600;
        letter-spacing: .04em;
        text-transform: uppercase;
        color: #9a9a9a;
        margin-bottom: 12px;
    }
    .mainMenu-rrss-movil .social-icons ul {
        display: flex;
        gap: 18px;
        list-style: none;
        margin: 0;
        padding: 0;
    }
}
.mainMenu-rrss-movil {
    margin-top: auto;
}

/* ----------------------------------------------------------------
   Icono del menú móvil (#mainMenu-trigger): variantes seleccionables desde
   el admin (campo menu_icono_movil). El HTML/JS de base (tema) siempre es
   el mismo <a class="lines-button x [icono-XXX]"><span class="lines">, con
   el span .lines + sus pseudo-elementos ::before/::after formando las 3
   rayas, y la clase toggle-active (añadida por functions.js al hacer clic)
   transformándolas en una X — eso no se toca, solo se re-skinea su aspecto
   en reposo.
   - "clasico": sin clase extra, usa el aspecto por defecto del tema.
   - El resto de variantes usan ":not(.toggle-active)" para que sus reglas
     dejen de aplicarse en cuanto se añade esa clase; así la animación a "X"
     (definida en style.css como ".x.toggle-active .lines[::before/::after]")
     no compite en especificidad con estas reglas (que al ir con #id la
     ganarían siempre) y el morfismo a X queda intacto en las 4 variantes.
   - Todas las variantes comparten el mismo tamaño de botón (42x42, ver
     regla base justo abajo), tengan borde/fondo o no: así el icono queda
     siempre en la misma posición al cambiar de variante, en vez de que las
     que sí fijaban width/height (círculo, cuadrado, relleno) ocupen un
     hueco distinto al de las que no lo hacían.
----------------------------------------------------------------- */

/* Base común a las 8 variantes: mismo tamaño de botón siempre. */
#mainMenu-trigger a.lines-button {
    width: 42px;
    height: 42px;
    box-sizing: border-box;
}

/* El tema base desplaza .lines "top: -4px" (ver style.css): un ajuste
   pensado para el botón pequeño/ajustado al contenido de origen, que con
   las 3 rayas (o antes/después) queda descentrado dentro de nuestro botón
   fijo de 42px. Como ::before/::after se posicionan respecto a la caja de
   .lines, basta con recentrar .lines (top: 0) para que las 3 rayas/puntos
   se centren en bloque, sin tocar su separación relativa entre sí. */
#mainMenu-trigger a .lines {
    top: 0;
}

/* Círculo: mismas rayas de siempre, dentro de un botón circular. Solo en
   reposo: al abrir el panel (toggle-active) se quita el borde y se ve solo
   la X en color. */
#mainMenu-trigger a.icono-circulo:not(.toggle-active) {
    border-radius: 50%;
    border: 1.5px solid currentColor;
}

/* Rayas decrecientes: ancho decreciente de arriba a abajo (before = raya
   inferior, .lines = raya central, after = raya superior; ver style.css). */
#mainMenu-trigger a.icono-decreciente:not(.toggle-active) .lines {
    width: 18px;
}
#mainMenu-trigger a.icono-decreciente:not(.toggle-active) .lines::before {
    width: 12px;
}
#mainMenu-trigger a.icono-decreciente:not(.toggle-active) .lines::after {
    width: 24px;
}

/* Grueso redondeado: rayas más gruesas y muy redondeadas; se separan un
   poco más (8px en vez de 6px) para mantener el mismo hueco visual entre
   ellas al doblar su grosor. */
#mainMenu-trigger a.icono-grueso:not(.toggle-active) .lines,
#mainMenu-trigger a.icono-grueso:not(.toggle-active) .lines::before,
#mainMenu-trigger a.icono-grueso:not(.toggle-active) .lines::after {
    height: 4px;
    border-radius: 4px;
}
#mainMenu-trigger a.icono-grueso:not(.toggle-active) .lines {
    top: 0;
}
#mainMenu-trigger a.icono-grueso:not(.toggle-active) .lines::before {
    top: 8px;
}
#mainMenu-trigger a.icono-grueso:not(.toggle-active) .lines::after {
    top: -8px;
}

/* Rayas crecientes: lo contrario de "decreciente", ancho creciente de
   arriba a abajo (before = raya inferior, .lines = raya central, after =
   raya superior; ver comentario de "decreciente" más arriba). */
#mainMenu-trigger a.icono-creciente:not(.toggle-active) .lines {
    width: 18px;
}
#mainMenu-trigger a.icono-creciente:not(.toggle-active) .lines::before {
    width: 24px;
}
#mainMenu-trigger a.icono-creciente:not(.toggle-active) .lines::after {
    width: 12px;
}

/* Cuadrado: mismo tratamiento que "círculo" pero con esquinas redondeadas
   en vez de circulares. Solo en reposo: al abrir el panel (toggle-active)
   se quita el borde y se ve solo la X en color. */
#mainMenu-trigger a.icono-cuadrado:not(.toggle-active) {
    border-radius: 10px;
    border: 1.5px solid currentColor;
}

/* Puntos: las 3 rayas se convierten en 3 puntos apilados (mismo reajuste
   de separación vertical que "grueso" al cambiar su grosor). */
#mainMenu-trigger a.icono-puntos:not(.toggle-active) .lines,
#mainMenu-trigger a.icono-puntos:not(.toggle-active) .lines::before,
#mainMenu-trigger a.icono-puntos:not(.toggle-active) .lines::after {
    width: 5px;
    height: 5px;
    border-radius: 50%;
}
#mainMenu-trigger a.icono-puntos:not(.toggle-active) .lines {
    top: 0;
}
#mainMenu-trigger a.icono-puntos:not(.toggle-active) .lines::before {
    top: 8px;
}
#mainMenu-trigger a.icono-puntos:not(.toggle-active) .lines::after {
    top: -8px;
}

/* Relleno: círculo con fondo sólido (color del menú) y rayas en blanco
   para mantener el contraste sobre ese fondo. Solo en reposo: al abrir el
   panel (toggle-active) se quita el círculo y se ve solo la X en color,
   directamente sobre el fondo blanco del panel. */
#mainMenu-trigger a.icono-relleno:not(.toggle-active) {
    border-radius: 50%;
    background-color: currentColor;
}
#mainMenu-trigger a.icono-relleno:not(.toggle-active) .lines,
#mainMenu-trigger a.icono-relleno:not(.toggle-active) .lines::before,
#mainMenu-trigger a.icono-relleno:not(.toggle-active) .lines::after {
    background-color: #fff;
}

/* resultados.php: mismo estilo que la página de referencia
   (circuitos/vihalf/resultados.php) pero con el color de items configurable
   de la web en vez de los colores fijos del tema (--bs-primary/secondary). */

/* Este tema no incluye el CSS del componente ".accordion" de Bootstrap (solo
   el JS de collapse, vía plugins.js): sin estas reglas, ".accordion-button"
   se ve como un <button> nativo sin estilo (ancho ajustado al contenido, sin
   flex ni padding) en vez de una barra completa con flecha. */
/* Sin ".accordion-item": cada ejercicio va sin borde ni tarjeta alrededor
   (como en la referencia), el espaciado entre ejercicios lo da el "gap" de
   ".resultados-listado" en vez de un margin-bottom por ejercicio (que
   dejaría más hueco tras el último que antes del primero). */
.resultados-listado {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    /* Además del padding simétrico del <section> (p-t-40/p-b-40, 40px cada
       uno): con esto el margen antes del primer ejercicio queda en 48px y el
       de después del último en 64px, como en la página de referencia. */
    margin-top: 8px;
    margin-bottom: 24px;
}
.accordion-header {
    margin: 0;
}
.accordion-button {
    display: flex;
    align-items: center;
    width: 100%;
    /* Tamaño de letra en px (no rem): el rem de esta web equivale a 14px, no
       a los 16px "de fábrica" de la página de referencia — con rem el texto
       saldría más pequeño que en ella pese a ser "el mismo" valor. Padding a
       0 como en la referencia: el aire alrededor de la insignia lo pone su
       propio padding/margin (ver ".resultados-year-mark" más abajo), no el
       botón. */
    padding: 0;
    font-size: 16px;
    text-align: left;
    /* Un tono apenas distinto del fondo configurado de la web: lo justo para
       diferenciar la barra de cada ejercicio del fondo de la página, sin que
       destaque como un elemento propio. */
    background-color: color-mix(in srgb, var(--body-bg-color) 94%, #000) !important;
    border: 0;
    cursor: pointer;
    transition: background-color .2s ease;
}
/* Sin flecha: la página de referencia no la tiene (no carga el CSS del
   componente ".accordion" de Bootstrap, así que su ".accordion-button::after"
   no pinta nada); la de aquí era una adición propia, no algo que copiar. */
.accordion-body {
    padding: 1.25rem;
}

/* Año destacado dentro del <mark> del acordeón: el más reciente usa el color
   de items principal, el resto el secundario. rgba+variable "-rgb" para
   reproducir el mismo look "--bs-bg-opacity:.75" (fondo semitransparente)
   que usaba el <mark class="bg-primary"> de la referencia. */
/* El color (fondo/texto) lo pone la clase "boton1"/"boton2" que se añade
   junto a esta en el HTML (mismos colores que "Botón tipo 1"/"Botón tipo 2"
   de Otras configuraciones, ver css_boton() en css_dinamico.php); aquí solo
   el aspecto de insignia. */
.resultados-year-mark,
.resultados-year-mark-secundario {
    display: inline-block;
    /* 8px fijos en vez de las clases "p-2 mx-2 m-2" del HTML (0.5rem cada
       una): esta web tiene el rem a 14px en vez de los 16px "de fábrica" de
       la referencia, así que 0.5rem no da los mismos 8px que allí. Con
       !important porque esas clases también llevan !important. */
    padding: 1px 8px !important;
    margin: 8px !important;
}
/* Sin esquinas redondeadas en la insignia del año, aunque "Botón tipo
   1"/"Botón tipo 2" (clases "boton1"/"boton2", ver css_boton() en
   css_dinamico.php) tengan configurado su propio radio — su regla de
   border-radius lleva !important, así que hace falta iguales o más clases
   en el selector para ganarle. */
.resultados-year-mark.boton1,
.resultados-year-mark-secundario.boton2 {
    border-radius: 0 !important;
}
.resultados-year-mark h5,
.resultados-year-mark-secundario h5 {
    font-size: 20px;
    margin: 0 0 8px;
    /* El tema fija "h5{color:#1e2022}" (propio del elemento, no heredado):
       sin esto anulaba el blanco/oscuro de "boton1"/"boton2" puesto en el
       <mark> padre, porque un color declarado en el propio h5 gana siempre
       a la herencia, tenga o no !important el del padre. */
    color: inherit;
}

/* Nombre del ranking (cabecera de la tabla de podio): en la referencia usa
   ".text-primary" (color fijo del tema); aquí el color de items. Negrita más
   marcada que el "bold" por defecto del <th> — pedido explícitamente para
   que el título del podio destaque más sobre el resto de la tabla.
   ".resultados-listado .table th.resultados-ranking-nombre" (no solo
   ".resultados-ranking-nombre"): ese selector de más abajo
   (".resultados-listado .table th", con font-weight:700 !important) tiene
   más especificidad que una sola clase — con las dos declaraciones en
   "!important", gana la de más especificidad, así que sin este añadido el
   700 le seguía ganando al 800 de aquí. */
.resultados-ranking-nombre,
.resultados-listado .table th.resultados-ranking-nombre {
    color: var(--body-items-color);
}

/* ".table" de Bootstrap fija su propio "color" (gris fijo del tema, ver
   plugins.css) en vez de heredar el de "body" — sin esto, el texto de las
   tablas de podio (posición, nombre, club, tiempo) no seguía el color de
   texto configurado para la web. Tamaño de letra al 90% (pedido
   explícitamente): la tabla de podio se veía grande en comparación con el
   resto de la página. */
.resultados-listado .table {
    color: var(--body-text-color) !important;
    font-size: 90%;
    /* 24px como en la referencia: aquí ".mb-4" (1.5rem) se queda en 21px por
       el rem a 14px de esta web en vez de los 16px de allí. */
    margin-bottom: 24px !important;
}
/* Padding de celda a 8px (como en la referencia: allí ".table" usa 0.5rem
   sobre una base de 16px; aquí ".table" trae 1rem de fábrica, que además
   sobre una base de 14px da 14px, no los 8px de la referencia). Grosor de la
   línea normal igual que en la referencia (1px); el color, en vez del gris
   fijo del tema, en función del color de texto configurado para la web. */
.resultados-listado .table > :not(caption) > * > * {
    padding: 8px !important;
    border-bottom-width: 1px !important;
    border-bottom-color: color-mix(in srgb, var(--body-text-color) 20%, transparent) !important;
}
/* Cabeceras de columna de la tabla de podio ("#", "Nombre", "Club",
   "Tiempo"), pedido explícitamente. */
.resultados-listado .table th {
    font-weight: 700 !important;
}
/* Línea divisoria entre cabecera y cuerpo (clase "table-group-divider" del
   HTML): en la referencia es más gruesa (2px) y más marcada que las líneas
   normales entre filas; este tema no trae CSS propio para esa clase, así
   que sin esto no se veía ninguna línea ahí. */
.resultados-listado .table tbody.table-group-divider {
    border-top: 2px solid var(--body-text-color) !important;
}

/* Botón de clasificación (enlace/archivo pdf): mismo patrón que
   ".btn-outline-secondary" en la referencia (fondo transparente, borde de
   color, el texto solo cambia de color en hover) pero con los colores de la
   web en vez del secondary fijo del tema, y el mismo radio que "Botón tipo
   1" (--boton1-radius, ver css_boton() en css_dinamico.php). !important
   porque "all.min.css" (bundle de Bootstrap) se carga DESPUÉS de este
   fichero y redefine ".btn" con la misma especificidad — la propia página
   de referencia necesita el mismo !important para el mismo problema. */
.btn-resultados-clasificacion {
    background-color: transparent !important;
    color: var(--body-text-color) !important;
    border-color: var(--body-hover-color) !important;
    border-radius: var(--boton1-radius) !important;
    text-transform: none !important;
    /* 90% del tamaño de letra de la web (pedido explícitamente), igual que
       las tablas de podio de más abajo. */
    font-size: calc(var(--body-font-size) * 0.9) !important;
}
.btn-resultados-clasificacion:hover,
.btn-resultados-clasificacion:focus {
    background-color: transparent !important;
    color: var(--body-hover-color) !important;
    border-color: var(--body-hover-color) !important;
}

/* multimedia.php: card de la rejilla (imagen + capa oscurecida + texto en
   blanco + icono de vídeo/álbum), mismo patrón que la página de referencia
   (circuitos/vihalf/multimedia.php, clase ".gallery-item") pero con el
   color de items/hover configurables de la web en vez de los fijos del
   tema. La foto en sí ya queda oscurecida por su opacidad reducida sobre el
   fondo negro del propio ".gallery-item" (no hace falta una capa aparte). */
.gallery-item {
    position: relative;
    height: 220px;
    background: #000;
    cursor: pointer;
    display: flex;
    overflow: hidden;
    padding: 0;
    border-radius: .5rem;
}
.gallery-item img {
    position: relative;
    display: block;
    width: 105%;
    height: 100%;
    object-fit: cover;
    opacity: .5;
    transition: all 350ms ease-in-out;
}
.gallery-item:hover img {
    opacity: .3;
    transform: translate3d(10px, 0, 0) scale(1.15);
}
.gallery-item .gallery-item-caption {
    position: absolute;
    inset: 0;
    padding: 20px;
    color: #fff;
    text-align: left;
}
.gallery-item .gallery-item-caption > a {
    position: absolute;
    inset: 0;
}
.gallery-item h2 {
    position: relative;
    top: 1.75rem;
    margin: 0;
    z-index: 1;
    pointer-events: none;
    font-weight: 600;
    font-size: 1.4rem;
    color: #fff !important;
    overflow: hidden;
    text-shadow: -2px 1px 7px rgba(0, 0, 0, .8);
    padding: 12px 0;
    transition: all 350ms ease-in-out;
}
.gallery-item h2::after {
    content: "";
    position: absolute;
    bottom: 0;
    left: 0;
    width: 15%;
    height: 1px;
    background: var(--body-items-color);
    transition: transform .3s;
    transform: translate3d(-100%, 0, 0);
}
.gallery-item:hover h2 {
    top: .25rem;
}
.gallery-item:hover h2::after {
    transform: translate3d(0, 0, 0);
}
.gallery-item p {
    position: relative;
    margin: 0;
    z-index: 1;
    pointer-events: none;
    letter-spacing: 1px;
    font-size: 13px;
    color: #fff !important;
    padding: 12px 0;
    opacity: 0;
    transition: opacity .35s, transform .35s;
    transform: translate3d(10%, 0, 0);
}
.gallery-item:hover p {
    opacity: 1;
    transform: translate3d(0, 0, 0);
}
.gallery-item-icon {
    position: absolute;
    bottom: .35rem;
    right: .35rem;
    padding: .75rem;
    background: #fff;
    color: var(--body-items-color);
    font-size: 1.1rem;
    line-height: 1;
    transition: all 150ms ease-in;
}
.gallery-item:hover .gallery-item-icon {
    color: var(--body-hover-color);
    bottom: 1rem;
    right: 1rem;
}
.gallery-item.video .gallery-item-icon {
    background: var(--body-items-color);
    color: #fff;
    border-radius: 50%;
    box-shadow: 1px 0 20px 0 rgba(0, 0, 0, .75);
}
.gallery-item.video:hover .gallery-item-icon {
    background: var(--body-hover-color);
}

/* Sección "Pestañas" (html_pestanas()): el componente ".tabs .nav-tabs" ya
   viene del tema (ver css/style.css) con el azul de la demo fijo; aquí se
   sustituye por el color de items configurable de la web, igual que el
   resto de componentes con acento de marca. */
.tabs .nav-tabs .nav-link.active {
    color: var(--body-items-color);
    /* El tema fija 2px (ver ".tabs .nav-tabs .nav-link.active" en
       style.css); aquí se engrosa un poco más para que se note más quién es
       la pestaña activa. */
    border-bottom-width: 3px;
    border-bottom-color: var(--body-items-color);
}

/* Título de cada pestaña un poco más grande que el tamaño de la demo del
   tema (sin font-size propio, hereda el general). */
.tabs .nav-tabs .nav-link {
    font-size: 1.15em;
}

/* El título de cada pestaña es un control de navegación (data-bs-toggle=
   "tab"), no un enlace de texto — pero al llevar la etiqueta <a> recibe
   igualmente el "a:hover{color:var(--body-hover-color) !important}"
   genérico de más arriba, que lo deja con el mismo aspecto de enlace que
   el resto del contenido. Se restaura aquí el color propio de cada estado
   (el gris del tema si no está activa, el color de items configurado si
   lo está) para que el hover no se confunda con un enlace de texto. */
.tabs .nav-tabs .nav-link:hover {
    color: rgba(60, 64, 67, 0.8) !important;
}
.tabs .nav-tabs .nav-link.active:hover {
    color: var(--body-items-color) !important;
}

.noticia-detalle-volver {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 1.25rem;
    font-size: .9rem;
    font-weight: 600;
    color: color-mix(in srgb, var(--body-text-color) 65%, transparent) !important;
    text-decoration: none !important;
}
.noticia-detalle-volver:hover {
    color: var(--body-items-color) !important;
}

.noticia-detalle-imagen {
    width: 100%;
    max-height: 480px;
    object-fit: cover;
    border-radius: 12px;
    box-shadow: 0 10px 30px rgba(0, 0, 0, .1);
    margin-bottom: 1.5rem;
}
.noticia-detalle .post-date {
    display: inline-flex;
    align-items: center;
    padding: 5px 14px;
    border-radius: 999px;
    font-size: .8rem;
    font-weight: 600;
    letter-spacing: .02em;
    background-color: color-mix(in srgb, var(--body-items-color) 12%, transparent);
    color: var(--body-items-color);
    margin-bottom: .75rem;
}
.noticia-detalle h1 {
    margin-bottom: 1.25rem;
    line-height: 1.25;
}
.noticia-detalle-resumen {
    font-size: 1.15rem;
    font-weight: 600;
    line-height: 1.5;
    padding-left: 1.1rem;
    border-left: 3px solid var(--body-items-color);
    margin-bottom: 1.75rem;
}
.noticia-detalle-cuerpo {
    font-size: var(--body-font-size);
    line-height: 1.7;
}
.noticia-detalle-cuerpo img {
    max-width: 100%;
    height: auto;
    border-radius: 8px;
}

/* Columna derecha del detalle de noticia: mismo lenguaje visual que
   ".reglamento-indice" (fondo sutil con color-mix, sticky en escritorio)
   para no introducir un tercer estilo de "caja con lista" en el sitio. */
.noticia-sidebar {
    padding: 24px;
    border-radius: 12px;
    background-color: color-mix(in srgb, var(--body-text-color) 4%, transparent);
    border: 1px solid color-mix(in srgb, var(--body-text-color) 10%, transparent);
}
@media (min-width: 992px) {
    .noticia-sidebar {
        position: sticky;
        /* "--sticky-top" (ver html_style_head() en funciones_html.php) es
           la altura del menú fijo + topbar si los hay, más un margen — sin
           esto, con el menú superior en modo "fijo" (Menús > Comportamiento
           > "Menú siempre visible") el sidebar quedaba tapado al hacer
           scroll. Sin menú fijo, el valor por defecto (24px) es el de
           siempre. */
        top: var(--sticky-top, 24px);
    }
}
.noticia-sidebar-titulo {
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: color-mix(in srgb, var(--body-text-color) 60%, transparent);
    margin-bottom: 16px;
}
.noticia-sidebar-lista {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.noticia-sidebar-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px;
    border-radius: 8px;
    text-decoration: none !important;
    transition: background-color .15s ease;
}
.noticia-sidebar-item:hover {
    background-color: color-mix(in srgb, var(--body-text-color) 7%, transparent);
}
.noticia-sidebar-item img,
.noticia-sidebar-item-sin-imagen {
    flex: 0 0 auto;
    width: 64px;
    height: 64px;
    border-radius: 8px;
    object-fit: cover;
}
.noticia-sidebar-item-sin-imagen {
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: color-mix(in srgb, var(--body-text-color) 10%, transparent);
    color: color-mix(in srgb, var(--body-text-color) 45%, transparent);
    font-size: 1.3rem;
}
.noticia-sidebar-item-texto {
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
}
.noticia-sidebar-item-titulo {
    font-size: .9rem;
    font-weight: 600;
    line-height: 1.3;
    color: var(--body-text-color);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.noticia-sidebar-item-fecha {
    font-size: .78rem;
    color: color-mix(in srgb, var(--body-text-color) 55%, transparent);
}
.noticia-sidebar-ver-todas {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    margin-top: 16px;
    padding-top: 16px;
    border-top: 1px solid color-mix(in srgb, var(--body-text-color) 10%, transparent);
    font-size: .85rem;
    font-weight: 600;
    color: var(--body-items-color) !important;
    text-decoration: none !important;
}
.noticia-sidebar-ver-todas:hover {
    color: var(--body-hover-color) !important;
}

/* Listado de noticias (noticias.php): buscador, toggle de vista, cards de
   igual tamaño y vista en lista horizontal. */
.noticias-buscador {
    position: relative;
    max-width: 380px;
    width: 100%;
}
.noticias-buscador .noticias-buscador-icono {
    position: absolute;
    left: 1.1rem;
    top: 50%;
    transform: translateY(-50%);
    color: rgba(0, 0, 0, .35);
    font-size: 1rem;
    pointer-events: none;
}
.noticias-buscador input.form-control {
    width: 100%;
    height: 48px;
    padding: .5rem 2.75rem .5rem 2.75rem;
    border-radius: 999px;
    border: 1px solid rgba(0, 0, 0, .12);
    background-color: #fff;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .06);
    transition: border-color 150ms ease-in, box-shadow 150ms ease-in;
}
.noticias-buscador input.form-control:focus {
    outline: none;
    border-color: var(--body-items-color);
    box-shadow: 0 0 0 3px rgba(var(--body-items-color-rgb), .15);
}
.noticias-buscador-clear {
    position: absolute;
    right: .6rem;
    top: 50%;
    transform: translateY(-50%);
    width: 26px;
    height: 26px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 50%;
    background: rgba(0, 0, 0, .08);
    color: rgba(0, 0, 0, .5);
    font-size: 18px;
    line-height: 1;
    cursor: pointer;
    transition: all 150ms ease-in;
}
.noticias-buscador-clear:hover {
    background: rgba(0, 0, 0, .18);
    color: rgba(0, 0, 0, .8);
}
.noticias-listado.cargando {
    opacity: .5;
    transition: opacity 150ms ease-in;
}
.noticias-vista-toggle {
    display: flex;
    gap: .5rem;
    flex-shrink: 0;
}
.noticias-vista-btn {
    width: 42px;
    height: 42px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid rgba(0, 0, 0, .15);
    border-radius: 4px;
    background: #fff;
    color: var(--body-text-color);
    cursor: pointer;
    transition: all 150ms ease-in;
}
.noticias-vista-btn:hover,
.noticias-vista-btn.active {
    background: var(--body-items-color);
    border-color: var(--body-items-color);
    color: #fff;
}

/* Vista cuadrícula: todas las imágenes con la misma relación de aspecto
   para que las cards midan siempre igual, sin depender del tamaño de la
   imagen subida — más una elevación sutil al pasar el ratón, para que se
   note que son tarjetas y no solo fotos sueltas. */
.noticias-listado .portfolio-image {
    aspect-ratio: 4 / 3;
}
.noticias-listado .portfolio-image img {
    height: 100%;
    object-fit: cover;
}
.noticias-listado .portfolio-item-wrap {
    border-radius: 12px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, .08);
    transition: transform 200ms ease, box-shadow 200ms ease;
}
.noticias-listado .portfolio-item:hover .portfolio-item-wrap {
    transform: translateY(-3px);
    box-shadow: 0 12px 28px rgba(0, 0, 0, .14);
}

/* Las 2 primeras noticias (página 1, sin búsqueda) se ven más grandes y con
   una presentación más "de portada": relación de aspecto más panorámica,
   texto más grande y degradado en vez de la capa oscura plana de siempre.
   Todo esto vive bajo ".noticias-listado" a propósito — no toca el
   carrusel de noticias de la portada, que reutiliza la misma función. */
.noticia-col-destacada .portfolio-image {
    aspect-ratio: 16 / 10;
}
.noticia-col-destacada .card-text {
    background: linear-gradient(to top, rgba(0, 0, 0, .85) 0%, rgba(0, 0, 0, .35) 55%, rgba(0, 0, 0, 0) 100%) !important;
    padding: 28px !important;
}
/* La fecha con fondo de color (antes solo en las 2 destacadas) se aplica a
   todas las tarjetas del listado en vista cuadrícula, para que sea
   consistente en toda la página — la vista lista ya tiene su propia regla
   equivalente más abajo (".noticias-listado.vista-lista .post-date"). */
.noticias-listado:not(.vista-lista) .post-date {
    display: inline-block;
    padding: 4px 12px;
    border-radius: 999px;
    background-color: var(--body-items-color);
    color: #fff !important;
    opacity: 1 !important;
    font-weight: 600;
    margin-bottom: 10px;
}
.noticia-col-destacada .card-title {
    font-size: 1.6rem;
    font-weight: 700;
    margin: 0 !important;
}
@media (max-width: 767px) {
    .noticia-col-destacada .card-title {
        font-size: 1.3rem;
    }
}

/* Vista lista: la columna pasa a ocupar todo el ancho y la card se
   convierte en una fila horizontal (imagen a la izquierda, texto a la
   derecha, sin la superposición oscura que usa la vista cuadrícula) — con
   el mismo lenguaje de tarjeta con sombra que la vista cuadrícula. */
.noticias-listado.vista-lista .noticia-col {
    flex: 0 0 100%;
    max-width: 100%;
    /* Menos separación que en cuadrícula (Bootstrap "mb-4" de la propia
       columna, 1.5rem) para que se vean más noticias sin hacer scroll. */
    margin-bottom: .75rem !important;
}
.noticias-listado.vista-lista .portfolio-item-wrap {
    display: flex;
    align-items: stretch;
    background: #fff;
}
.noticias-listado.vista-lista .portfolio-image {
    flex: 0 0 140px;
    width: 140px;
    aspect-ratio: 4 / 3;
    border-radius: 12px 0 0 12px;
}
.noticias-listado.vista-lista .card-text {
    position: static;
    height: auto;
    width: 100%;
    background: #fff !important;
    color: var(--body-text-color);
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 4px;
    padding: .85rem 1.25rem !important;
}
.noticias-listado.vista-lista .card-title {
    color: var(--body-text-color) !important;
    font-size: 1.05rem !important;
    font-weight: 700;
    margin: 0 !important;
}
.noticias-listado.vista-lista .post-date {
    display: inline-block;
    align-self: flex-start;
    padding: 3px 10px;
    border-radius: 999px;
    background-color: color-mix(in srgb, var(--body-items-color) 12%, transparent);
    color: var(--body-items-color) !important;
    opacity: 1 !important;
    font-weight: 600;
    font-size: .8rem;
}
@media (max-width: 576px) {
    .noticias-listado.vista-lista .portfolio-item-wrap {
        flex-direction: column;
    }
    .noticias-listado.vista-lista .portfolio-image {
        width: 100%;
        flex-basis: auto;
        border-radius: 12px 12px 0 0;
    }
}

/* Paginación con los colores de marca del sitio */
.pagination .page-link {
    color: var(--body-text-color);
}
.pagination .page-item.active .page-link {
    background-color: var(--body-items-color);
    border-color: var(--body-items-color);
    color: #fff;
}
.pagination .page-item.disabled .page-link {
    opacity: .5;
}

/* Reglamento en modo "texto" (reglamento.php): índice a la izquierda +
   apartados a la derecha. El índice queda "pegado" (sticky) al hacer scroll
   y resalta el apartado visible mediante Scrollspy de Bootstrap (ver
   "data-bs-spy" en el <body> de reglamento.php, que usa js/plugins.js, ya
   cargado en toda la web pública). En móvil/tablet (por debajo de "lg") el
   índice pierde el sticky y pasa a ir apilado encima de los apartados, como
   cualquier otra columna Bootstrap. */
.reglamento-indice {
    border-radius: 14px;
    overflow: hidden;
    background-color: color-mix(in srgb, var(--body-text-color) 4%, transparent);
    border: 1px solid color-mix(in srgb, var(--body-text-color) 10%, transparent);
    box-shadow: 0 10px 30px -18px rgba(0, 0, 0, .35);
}
@media (min-width: 992px) {
    .reglamento-indice {
        position: sticky;
        /* Mismo motivo que ".noticia-sidebar" (ver más arriba): con el menú
           superior en modo "fijo" este índice quedaba tapado al hacer
           scroll — "--sticky-top" ya tiene en cuenta esa altura. */
        top: var(--sticky-top, 24px);
    }
}

/* Cabecera del índice a color de marca (--body-items-color), en vez de un
   simple rótulo gris: da al bloque el aspecto de "tarjeta" con la que se
   presenta el reglamento en la referencia de diseño de este apartado, sin
   fijar ningún color propio (se adapta al de cada web). */
.reglamento-indice-titulo {
    margin: 0;
    padding: 16px 22px;
    font-size: .8rem;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
    color: #fff;
    background-color: var(--body-items-color);
}

.reglamento-indice-nav {
    padding: 8px;
}

.reglamento-indice-nav .nav-link,
#reglamento-indice-nav .nav-link {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 14px;
    border-radius: 8px;
    color: var(--body-text-color) !important;
    text-decoration: none !important;
    line-height: 1.35;
    transition: background-color .15s ease, color .15s ease;
}

.reglamento-indice-texto {
    font-size: 1.05rem;
    text-transform: uppercase;
    letter-spacing: .03em;
}
/* Separador entre apartados del índice (salvo el primero): con el propio
   padding de ".reglamento-indice-nav" alrededor, un simple borde superior
   entre enlaces consecutivos basta, sin depender de ":last-child". */
#reglamento-indice-nav .nav-link + .nav-link {
    margin-top: 2px;
}
#reglamento-indice-nav .nav-link:hover {
    background-color: color-mix(in srgb, var(--body-text-color) 7%, transparent);
}
#reglamento-indice-nav .nav-link.active {
    background-color: color-mix(in srgb, var(--body-items-color) 12%, transparent);
    color: var(--body-items-color) !important;
    font-weight: 600;
}

/* Flechita que solo aparece (con un pequeño desplazamiento) al pasar el
   ratón o cuando Scrollspy marca el apartado como activo — un detalle sutil
   en vez de mostrarla siempre en las 6-10 filas del índice. */
.reglamento-indice-flecha {
    margin-left: auto;
    flex: 0 0 auto;
    font-size: .7rem;
    opacity: 0;
    transform: translateX(-4px);
    transition: opacity .15s ease, transform .15s ease;
}
#reglamento-indice-nav .nav-link:hover .reglamento-indice-flecha,
#reglamento-indice-nav .nav-link.active .reglamento-indice-flecha {
    opacity: .7;
    transform: translateX(0);
}

.reglamento-apartado {
    scroll-margin-top: 110px;
}
.reglamento-apartado + .reglamento-apartado {
    padding-top: 40px;
    border-top: 1px solid color-mix(in srgb, var(--body-text-color) 10%, transparent);
}

/* Listas, tablas y citas dentro del texto de cada apartado (contenido de
   TinyMCE, plugin "table" incluido): sin esto heredaban el estilo por
   defecto del navegador, plano y sin relación con los colores de marca de
   la web, muy distinto del resto de la página. */
.reglamento-apartado .contenido-html ol,
.reglamento-apartado .contenido-html ul {
    padding-left: 1.3em;
    margin-bottom: 1.2rem;
}
.reglamento-apartado .contenido-html li {
    margin-bottom: .5rem;
}
.reglamento-apartado .contenido-html li::marker {
    color: var(--body-items-color);
    font-weight: 700;
}
.reglamento-apartado .contenido-html table {
    width: 100%;
    border-collapse: collapse;
    margin: 1.6rem 0;
    font-size: .95rem;
    overflow: hidden;
    border-radius: 10px;
}
.reglamento-apartado .contenido-html table th {
    background-color: var(--body-items-color);
    color: #fff;
    text-align: left;
    padding: 12px 18px;
    font-weight: 700;
}
.reglamento-apartado .contenido-html table td {
    padding: 11px 18px;
    border-bottom: 1px solid color-mix(in srgb, var(--body-text-color) 12%, transparent);
}
.reglamento-apartado .contenido-html table tbody tr:nth-child(even) td {
    background-color: color-mix(in srgb, var(--body-text-color) 3%, transparent);
}
.reglamento-apartado .contenido-html blockquote {
    margin: 1.2rem 0;
    padding: 4px 20px;
    border-left: 3px solid var(--body-items-color);
    color: color-mix(in srgb, var(--body-text-color) 80%, transparent);
    font-style: italic;
}

/* Formulario de contacto (contacto.php): una única tarjeta con el
   formulario a la izquierda y un panel con el email/teléfono de contacto a
   la derecha en color de marca, a todo alto — mismo lenguaje visual que la
   referencia de diseño de este formulario. ".row.g-0" (sin gutter) para que
   las dos columnas se toquen y el "overflow:hidden" del contenedor recorte
   las esquinas de ambas al radio de la tarjeta, sin que cada una necesite
   su propio border-radius. */
.contacto-card {
    border-radius: 20px;
    overflow: hidden;
    background-color: color-mix(in srgb, var(--body-text-color) 3%, var(--body-bg-color));
    border: 1px solid color-mix(in srgb, var(--body-text-color) 8%, transparent);
    box-shadow: 0 25px 60px -25px rgba(0, 0, 0, .3);
}

.contacto-form-wrap {
    padding: 48px 44px;
}
@media (max-width: 767px) {
    .contacto-form-wrap {
        padding: 32px 24px;
    }
}

.contacto-form-titulo {
    font-weight: 700;
    margin-bottom: 6px;
}
.contacto-form-subtitulo {
    color: color-mix(in srgb, var(--body-text-color) 65%, transparent);
    margin-bottom: 28px;
}

.contacto-contenido .form-label {
    font-weight: 600;
    margin-bottom: 6px;
    font-size: .92rem;
}
.contacto-contenido .form-control,
.contacto-contenido .form-select {
    border-radius: 8px;
    border: 1px solid color-mix(in srgb, var(--body-text-color) 20%, transparent);
    padding: 11px 14px;
    color: var(--body-text-color);
    background-color: color-mix(in srgb, var(--body-text-color) 1%, var(--body-bg-color));
}
.contacto-contenido .form-control:focus,
.contacto-contenido .form-select:focus {
    border-color: var(--body-items-color);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--body-items-color) 20%, transparent);
}

.contacto-contenido .form-check-label {
    font-size: .9rem;
    color: color-mix(in srgb, var(--body-text-color) 80%, transparent);
}
.contacto-contenido .form-check-label a {
    color: inherit;
    text-decoration: underline;
}

#contacto_enviar {
    margin-top: 6px;
}

.contacto-datos {
    height: 100%;
    padding: 48px 40px;
    /* Degradado a partir del propio color de marca (135deg, hacia una
       versión más oscura vía color-mix con negro): se adapta solo al color
       configurado de cada web, sin necesidad de un segundo color propio. */
    background: linear-gradient(135deg, var(--body-items-color), color-mix(in srgb, var(--body-items-color) 55%, black));
    color: #fff;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
}
.contacto-datos-titulo {
    margin-bottom: 26px;
    font-weight: 700;
    color: #fff;
}
.contacto-datos-item {
    display: flex;
    align-items: center;
    gap: 14px;
    margin-bottom: 16px;
    font-size: 1.05rem;
}
.contacto-datos-icono {
    flex: 0 0 auto;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.1rem;
    background-color: rgba(255, 255, 255, .15);
}
.contacto-datos-item a {
    color: #fff !important;
    text-decoration: none !important;
    word-break: break-word;
}
.contacto-datos-item a:hover {
    text-decoration: underline !important;
}

/* Iconos de RRSS (html_rrss_iconos(), compartidos con el pie de página):
   sin estilo propio a propósito — mismo aspecto "desnudo" que en el pie
   (sin círculo de fondo ni hover a color sólido), solo la maquetación en
   fila junto al texto "Síguenos". El color/hover de los iconos en sí los
   pone la regla genérica de enlaces del sitio (ver "a:hover" más arriba). */
.contacto-form-rrss {
    display: flex;
    align-items: center;
    gap: 14px;
    margin-top: 28px;
    padding-top: 24px;
    border-top: 1px solid color-mix(in srgb, var(--body-text-color) 12%, transparent);
}
.contacto-form-rrss-texto {
    font-size: .85rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: color-mix(in srgb, var(--body-text-color) 65%, transparent);
}

/* Pestañas con foto (html_pestanas() -> html_texto_con_imagen(), misma fila
   ".row align-items-center" que usa "Texto libre"): aquí el texto debe
   empezar siempre arriba en vez de centrarse con la imagen. Acotado a
   ".tab-pane" (propio de cada pestaña) para no afectar a "Texto libre",
   que reutiliza la misma función sin ese contenedor. */
.tab-pane > .row.align-items-center {
    /* "!important": la utilidad ".align-items-center" de Bootstrap
       (plugins.css) ya lleva "!important" de fábrica; sin esto aquí, esta
       regla nunca podría ganarle aunque sea más específica. */
    align-items: flex-start !important;
}

/* Botón "Volver arriba" (#scrollTop, ver style.css): el círculo que se ve al
   pasar el ratón trae fijo el azul de la demo del tema (#2250fc) y el icono
   se queda blanco fijo (color heredado de "#scrollTop{color:#fff}", sin
   relación con los colores configurados de la web) — mismos fondo/color que
   "Botón 1" en su propio hover (--boton1-hover-bg/-color, ver css_boton()
   en css_dinamico.php). */
#scrollTop:after {
    background-color: var(--boton1-hover-bg);
}
#scrollTop:hover {
    color: var(--boton1-hover-color) !important;
}

