/**
Theme Name: Astra Child
Author: Adrian Crespo
Author URI: http://wpastra.com/about/
Description: Astra is the fastest, fully customizable & beautiful theme suitable for blogs, personal portfolios and business websites. It is very lightweight (less than 50KB on frontend) and offers unparalleled speed. Built with SEO in mind, Astra comes with schema.org code integrated so search engines will love your site. Astra offers plenty of sidebar options and widget areas giving you a full control for customizations. Furthermore, we have included special features and templates so feel free to choose any of your favorite page builder plugin to create pages flexibly. Some of the other features: # WooCommerce Ready # Responsive # Compatible with major plugins # Translation Ready # Extendible with premium addons # Regularly updated # Designed, Developed, Maintained & Supported by Brainstorm Force. Looking for a perfect base theme? Look no further. Astra is fast, fully customizable and beautiful theme!
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: astra-child
Template: astra
*/

/*
  ============================================================================
  SPORA 2026 — Tokens globales (design tokens)
  ----------------------------------------------------------------------------
  Extraídos de las páginas "01. Home" / "01. Home — HOVER" en Figma.
  Ver spora-style-audit.md para el detalle de inconsistencias del archivo Figma.

  FUENTE ÚNICA DE VERDAD = theme.json (mismo directorio).
  Los valores hex/px de la paleta y la escala tipográfica viven SOLO en
  theme.json, que los expone al editor de bloques y genera automáticamente:
    var(--wp--preset--color--<slug>)
    var(--wp--preset--font-size--<slug>)
    var(--wp--preset--font-family--<slug>)

  Este :root NO redefine esos valores: solo crea alias --spora-* cortos que
  apuntan a los presets de theme.json (para escribir CSS a mano más legible) y
  define lo que WordPress NO genera como preset: los interlineados por escala
  y los radios. Cambiar un color o un tamaño se hace en theme.json; aquí no.
  ============================================================================
*/

:root {
    /* ---------- Alias de color -> presets de theme.json ---------- */
    --spora-color-primary-dark-green:    var(--wp--preset--color--spora-dark-green);
    --spora-color-primary-dark-green-40: var(--wp--preset--color--spora-dark-green-40);
    --spora-color-accent-yellow:         var(--wp--preset--color--spora-yellow);
    --spora-color-accent-green:          var(--wp--preset--color--spora-green);
    --spora-color-neutral-white:         var(--wp--preset--color--spora-white);
    --spora-color-neutral-light-gray:    var(--wp--preset--color--spora-light-gray);
    --spora-color-neutral-black:         var(--wp--preset--color--spora-black);
    --spora-color-neutral-black-40:      var(--wp--preset--color--spora-black-40);

    /* ---------- Alias de familia -> preset de theme.json ---------- */
    --spora-font-family-display: var(--wp--preset--font-family--spora-display);

    /* ---------- Alias de tamaño -> presets de theme.json ---------- */
    --spora-text-display-xl-size:   var(--wp--preset--font-size--spora-display-xl);
    --spora-text-heading-lg-size:   var(--wp--preset--font-size--spora-heading-lg);
    --spora-text-heading-md-size:   var(--wp--preset--font-size--spora-heading-md);
    --spora-text-heading-sm-size:   var(--wp--preset--font-size--spora-heading-sm);
    --spora-text-body-regular-size: var(--wp--preset--font-size--spora-body);
    --spora-text-body-label-size:   var(--wp--preset--font-size--spora-body);
    --spora-text-caption-regular-size: var(--wp--preset--font-size--spora-caption);
    --spora-text-caption-label-size:   var(--wp--preset--font-size--spora-caption);
    --spora-text-small-regular-size:   var(--wp--preset--font-size--spora-small);
    --spora-text-comentaris-size:      var(--wp--preset--font-size--spora-comentaris);

    /* ---------- Interlineados (NO son preset de WP; viven aquí) ---------- */
    --spora-text-display-xl-line-height:   110%;
    --spora-text-heading-lg-line-height:   110%;
    --spora-text-heading-md-line-height:   120%;
    --spora-text-heading-sm-line-height:   120%;
    --spora-text-body-regular-line-height: 120%;
    --spora-text-body-label-line-height:   110%;
    --spora-text-caption-regular-line-height: 140%;
    --spora-text-caption-label-line-height:   110%;
    --spora-text-small-regular-line-height:   140%;
    --spora-text-comentaris-line-height:      110%;

    /* ---------- Radios (NO son preset de WP; viven aquí) ---------- */
    --spora-radius-card: 8px; /* [CONFIRMADO en una tarjeta; verificar si es constante] */
}

/*
  ----------------------------------------------------------------------------
  Foco: sin contorno de puntitos al hacer CLIC (ratón/táctil)
  ----------------------------------------------------------------------------
  Al pinchar en enlaces/botones (el logo, las bolitas del anchor, etc.) el
  navegador deja el outline de foco. Se quita SOLO para el foco por puntero
  (`:focus:not(:focus-visible)`); el anillo de foco por TECLADO (`:focus-visible`)
  se conserva por accesibilidad.
*/
:focus:not(:focus-visible) {
    outline: none;
}

/*
  ----------------------------------------------------------------------------
  Seleccion de texto: siempre groc Spora
  ----------------------------------------------------------------------------
  Fondo groc de marca con texto en verd fosc (el groc es muy claro y necesita
  texto oscuro para leerse). Va en TODO el sitio, tambien sobre fondos oscuros.

  ::selection y ::-moz-selection van en reglas SEPARADAS a proposito: si se
  agrupan en una sola lista de selectores, los navegadores que no entienden
  uno de los dos descartan la regla entera.

  !important para ganar a cualquier ::selection de Astra o de plugins.
*/
::selection {
    background-color: var(--spora-color-accent-yellow) !important;
    color: var(--spora-color-primary-dark-green) !important;
}

::-moz-selection {
    background-color: var(--spora-color-accent-yellow) !important;
    color: var(--spora-color-primary-dark-green) !important;
}

/*
  Reparto de líneas (text-wrap: balance en títulos, pretty en párrafos): vive
  en blocks/_shared/text-wrap.css para que el editor lo vea igual que el front.
*/

/*
  ----------------------------------------------------------------------------
  Tipografía base del tema
  ----------------------------------------------------------------------------
  Las @font-face de STK Bureau Serif se declaran en functions.php
  (astra_child_font_faces_css) para frontend y editor.
*/


b, strong {
    font-weight: 600 !important; 
}

h1 {
    font-family: var(--spora-font-family-display) !important;
}

h1, h2, h3 {
    font-family: var(--spora-font-family-display);
    font-weight: 300;
}

/* h4: excepción -> Geist 48. Sus <strong>/<em> vuelven a STK itálica 400
   (regla más específica que la de abajo para h4). */
h4 {
    font-family: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif !important;
    font-weight: 300;
    font-size: var(--spora-text-heading-lg-size); /* 48px */
    line-height: var(--spora-text-heading-lg-line-height);
}

h4 strong, h4 b, h4 em, h4 i {
    font-family: var(--spora-font-family-display) !important;
    font-style: italic;
    font-weight: 400;
}

em, i {
    font-family: var(--spora-font-family-display) !important;
    font-style: italic;
    font-weight: 400;
}

h4 a {
    font-family: var(--spora-font-family-display) !important;
    color: #001A17 !important;
}

h4 a:hover {
    font-family: var(--spora-font-family-display) !important;
    color: #001A17 !important;
}

.heading-whithout-bold em {
    font-family: 'STK Bureau Serif Light', Georgia, serif !important;
    font-style: italic;   /* Light Italic 300 real (hasta 2026-10-01 era sintética) */
    font-weight: 300 !important;
}

.hover-bold:hover {
    font-weight: 500 !important;
}

.light-text h3 strong,
.light-text h3 b,
.light-text h3 em,
.light-text h1 strong,
.light-text h1 b,
.light-text h1 em,
.light-text h2 strong,
.light-text h2 b,
.light-text h2 em,
.light-text h4 strong,
.light-text h4 b,
.light-text h4 em {
    font-weight: 300 !important;
}

.heading-stk h1, .stk h1,
.heading-stk h2, .stk h2,
.heading-stk h3, .stk h3,
.heading-stk h4, .stk h4,
.heading-stk h5, .stk h5,
.heading-stk h6, .stk h6,
.heading-stk p {
    font-family: var(--spora-font-family-display) !important;
}

.hover-stk-italic:hover {
    /*
      Usamos la alias "STK Bureau Serif Light" (solo peso 300) para garantizar
      la itálica FINA. Hasta 2026-10-01 no había Light Italic y el navegador la
      sintetizaba; ahora coge la cara real (ver astra_child_font_faces_css).
    */
    font-family: "STK Bureau Serif Light", var(--spora-font-family-display);
    font-style: italic;
    font-weight: 300 !important;
    font-synthesis: weight style; /* solo actúa si la woff2 no ha cargado */
}

.text-justificat {
  text-align: justify !important;
  text-justify: inter-word !important; /* ayuda en algunos navegadores */
  hyphens: auto !important;            /* parte las palabras correctamente */
}

.text-geist h1.uagb-heading-text {
    font-family: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif !important;
    font-weight: 300;
}

ol, ul {
    margin: 0 0 0 3em;
}

li {
    font-weight: 300;
}

body .ast-container .wp-block-uagb-container>.uagb-container-inner-blocks-wrap ol {
    margin-left: 0 !important;
}

/* mobile */
@media (max-width: 767.98px) {
	ol,
	ul {
		margin: 0;
		padding-left: 1.25rem; /* o 20px */
	}

    .sh-amagat .uagb-desc-text {
        display: none !important;
    }

    .spora-pd__subheading,
    .spora-pd__heading {
        text-align: start;
    }

    .spora-pd__heading {
        margin-bottom: 30px !important;
    }

    .spora-pd__area {
        display: none;
    }

    .spora-logos-carousel {
        gap: 10px !important;
    }

    /* El resum s'amaga a mòbil només si la targeta té imatge: sense imatge
       (--noimg) la targeta es quedaria només amb subtítol i títol. */
    .spora-insights__card:not(.spora-insights__card--noimg) .spora-insights__resum {
        display: none !important;
    }
}

/*
  ----------------------------------------------------------------------------
  Clases de utilidad de tipografía (reutilizables en bloques y clases CSS
  personalizadas de Spectra/Gutenberg)
  ----------------------------------------------------------------------------
*/

.spora-text-display-xl {
    font-family: var(--spora-font-family-display);
    font-size: var(--spora-text-display-xl-size);
    line-height: var(--spora-text-display-xl-line-height);
}

.spora-text-heading-lg {
    font-family: var(--spora-font-family-display);
    font-size: var(--spora-text-heading-lg-size);
    line-height: var(--spora-text-heading-lg-line-height);
}

.spora-text-heading-md {
    font-family: var(--spora-font-family-display);
    font-size: var(--spora-text-heading-md-size);
    line-height: var(--spora-text-heading-md-line-height);
}

.spora-text-heading-sm {
    font-family: var(--spora-font-family-display);
    font-size: var(--spora-text-heading-sm-size);
    line-height: var(--spora-text-heading-sm-line-height);
}

.spora-text-body-regular {
    font-size: var(--spora-text-body-regular-size);
    line-height: var(--spora-text-body-regular-line-height);
}

.spora-text-body-label {
    font-size: var(--spora-text-body-label-size);
    line-height: var(--spora-text-body-label-line-height);
}

.spora-text-caption-regular {
    font-size: var(--spora-text-caption-regular-size);
    line-height: var(--spora-text-caption-regular-line-height);
}

.spora-text-caption-label {
    font-size: var(--spora-text-caption-label-size);
    line-height: var(--spora-text-caption-label-line-height);
}

.spora-text-small-regular {
    font-size: var(--spora-text-small-regular-size);
    line-height: var(--spora-text-small-regular-line-height);
}

.spora-text-comentaris {
    font-size: var(--spora-text-comentaris-size);
    line-height: var(--spora-text-comentaris-line-height);
}

/*
  ----------------------------------------------------------------------------
  Utilidades de color (opcional, para aplicar rápido desde clases CSS)
  ----------------------------------------------------------------------------
*/

.spora-bg-dark-green { background-color: var(--spora-color-primary-dark-green); }
.spora-bg-yellow     { background-color: var(--spora-color-accent-yellow); }
.spora-bg-green      { background-color: var(--spora-color-accent-green); }
.spora-bg-light-gray { background-color: var(--spora-color-neutral-light-gray); }
.spora-bg-white      { background-color: var(--spora-color-neutral-white); }

.spora-text-dark-green { color: var(--spora-color-primary-dark-green); }
.spora-text-yellow     { color: var(--spora-color-accent-yellow); }
.spora-text-green      { color: var(--spora-color-accent-green); }
.spora-text-white      { color: var(--spora-color-neutral-white); }
.spora-text-black      { color: var(--spora-color-neutral-black); }

/*
  ============================================================================
  NOTA — cómo usar el sistema (fuente única = theme.json)
  ----------------------------------------------------------------------------
  Para cambiar un COLOR o un TAMAÑO de fuente: edita theme.json. Se propaga
  solo a todo: al editor de bloques, a las clases .has-* que genera WordPress
  y a los alias --spora-* / utilidades .spora-* de este archivo (que apuntan a
  var(--wp--preset--*)).

  Tres formas equivalentes de aplicar la marca, según el contexto:

    1) Editor de bloques (Gutenberg/Spectra): elige el color o el tamaño en el
       panel lateral. WordPress escribe la clase .has-*-color / .has-*-font-size.

    2) HTML/clases a mano: usa las utilidades .spora-text-* / .spora-bg-* /
       .spora-text-<color> de abajo.

    3) CSS personalizado: usa el alias corto var(--spora-color-accent-yellow)
       o directamente el preset var(--wp--preset--color--spora-yellow).

  Lo único que NO gestiona theme.json (no existe como preset en WordPress) y
  por eso vive aquí: los INTERLINEADOS por escala y el radio de tarjeta.
  ============================================================================
*/

/*
  ============================================================================
  HOME HERO — definiciones que solo aparecen en hover
  ----------------------------------------------------------------------------
  Cada texto (#home-hero-text-*) vive DENTRO de su disparador (#home-hero-*).
  Por defecto se ocultan con visibility:hidden + opacity:0, que MANTIENEN el
  hueco en el layout (el bloque sigue ocupando su espacio; no hay salto al
  mostrarse). Al hacer hover sobre el disparador, el texto aparece con un fade.

  El delay en la transición de "visibility" mantiene el elemento renderizado
  durante el fundido de salida y luego lo oculta; en la entrada es inmediato.
  ============================================================================
*/

#home-hero-sostenibilidad,
#home-hero-creativa {
    margin-top: -28px !important;
    align-items: start;
}

#home-hero-text-hub,
#home-hero-text-sostenibilidad,
#home-hero-text-creativa {
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s ease, visibility 0s linear 0.3s;
}

#home-hero-hub:hover #home-hero-text-hub,
#home-hero-sostenibilidad:hover #home-hero-text-sostenibilidad,
#home-hero-creativa:hover #home-hero-text-creativa {
    opacity: 1;
    visibility: visible;
    transition: opacity 0.3s ease, visibility 0s;
}

/* ---------- Responsive ---------- */
@media (max-width: 1023.98px) {
    #home-hero-creativa {
        align-items: end;
    }
}

/*
  ============================================================================
  CURSOR PERSONALIZADO
  ----------------------------------------------------------------------------
  Bolita amarilla (24px) como cursor por defecto en todo el sitio. El círculo
  "+ INFO" (96px) es OPT-IN: solo aparece cuando el puntero está dentro de un
  contenedor con la clase .spora-cursor-info (ya NO crece solo sobre clicables).
  La lógica (crear el nodo, seguir el ratón, decidir el estado is-info según
  .spora-cursor-info) está en assets/js/utils.js (Spora.customCursor); aquí solo
  el aspecto. Se activa vía la clase .spora-cursor-active que añade el JS, y solo
  en dispositivos con ratón (media query), para no afectar al táctil.

  Las URLs de los SVG son relativas a este archivo (wp-content/themes/astra-child/).
  ============================================================================
*/

@media (hover: hover) and (pointer: fine) {

    /* Oculta el cursor nativo solo cuando el cursor propio está activo. */
    html.spora-cursor-active,
    html.spora-cursor-active * {
        cursor: none !important;
    }

    #spora-cursor {
        position: fixed;
        top: 0;
        left: 0;
        /* El máximo posible: tiene que quedar por encima de TODO, también del
           banner y el modal de CookieYes (z-index 9999999 / 999999999), que
           si no tapaban la bolita y el cursor «desaparecía» sobre ellos. */
        z-index: 2147483647;
        width: 15px;
        height: 15px;
        margin: -7.5px 0 0 -7.5px; /* centra la bolita en la punta del ratón */
        background: url('assets/img/cursor-dot.svg') center / contain no-repeat;
        pointer-events: none; /* nunca intercepta clics */
        opacity: 1;
        transition: width 0.18s ease, height 0.18s ease, margin 0.18s ease, opacity 0.15s ease;
        will-change: transform;
    }

    /* Estado sobre cualquier CLICABLE: la bolita crece de 15px a 30px. NO pisa
       el "+ INFO": is-info y is-hover son excluyentes (los decide el JS,
       Spora.customCursor) y is-info va después, así que gana si coincidieran. */
    #spora-cursor.is-hover {
        width: 30px;
        height: 30px;
        margin: -15px 0 0 -15px;
    }

    /* Estado sobre clicable fuera del menú: círculo grande "+ INFO". */
    #spora-cursor.is-info {
        width: 80px;
        height: 80px;
        margin: -40px 0 0 -40px;
        background-image: url('assets/img/cursor-info.svg');
    }

    /* Fuera de la ventana. */
    #spora-cursor.is-hidden {
        opacity: 0;
    }

    /* Sobre un fondo ya pintado de color (p. ej. la marquesina al llegar al
       centro): la bolita se pone NEGRA para que contraste. brightness(0) la pinta
       de negro sea cual sea el color del SVG. Lo activa/desactiva el JS. */
    #spora-cursor.is-dark {
        filter: brightness(0);
    }

}

.ast-builder-grid-row.ast-grid-center-col-layout {
    display: flex;
    justify-content: space-between;
    align-items: center;
    width: 100%;
}

/*
  ============================================================================
  HEADER STICKY CON AUTO-OCULTADO
  ----------------------------------------------------------------------------
  El #masthead se pega arriba (position: sticky; top: 0) manteniendo SOLO su
  posición natural en el documento:
    - Home: el header está recolocado bajo el hero 1 (ver functions.php +
      Spora.relocateHomeHeader), así que su posición máxima es justo bajo el
      hero y no sube por encima.
    - Resto del sitio: el header está arriba del todo, así que se pega desde 0.

  Al hacer scroll hacia abajo (ya pegado) se oculta deslizándose hacia arriba;
  al hacer scroll hacia arriba reaparece. La dirección la decide el JS
  (Spora.stickyHeader), que añade/quita la clase .spora-header-hidden. El
  centinela .spora-header-sentinel (altura 0) marca la posición natural del
  header para saber cuándo está pegado.

  #masthead es un id: gana a las reglas de cabecera transparente de Astra
  (solo clases) sin necesidad de !important.
  ============================================================================
*/

#masthead {
    position: sticky;
    top: 0;
    z-index: 99;
    transition: transform 0.35s ease;
}

#masthead.spora-header-hidden {
    transform: translateY(-100%);
}

.spora-header-sentinel {
    height: 0;
    margin: 0;
    padding: 0;
    border: 0;
}

/*
  ============================================================================
  MENÚ DE CABECERA — color verde oscuro + atenuado por hover (escritorio)
  ----------------------------------------------------------------------------
  Nuevo diseño del header (solo escritorio, >=922px; el desplegable móvil
  tiene su propia sección, «MENÚ MÓVIL A PANTALLA COMPLETA», más abajo):

    - En reposo (sin hover) TODOS los enlaces se ven en verde oscuro #001A17.
    - Al pasar el ratón por el menú, los que NO tienen el ratón se atenúan a
      #001A1730 y el que sí lo tiene se queda en verde oscuro + subrayado.
    - Al pasar por un "padre" desplegable: el padre queda verde oscuro y sus
      hijos (el submenú abierto) también en verde oscuro.
    - Al pasar por un "hijo": ese hijo queda verde oscuro, sus hermanos se
      atenúan y el padre SE MANTIENE en verde oscuro (porque su <li> sigue
      en :hover al contener al hijo).

  El efecto "los demás se atenúan" se consigue con .main-header-menu:hover /
  .sub-menu:hover (atenúa todo el grupo) y luego .menu-item:hover (rescata el
  que tiene el ratón). El orden importa: la regla del ítem con hover va DESPUÉS
  de la de atenuado para ganar el desempate de especificidad.

  Los ítems desplegables NO muestran la flecha de Astra (se oculta el
  .ast-header-navigation-arrow) y el submenú se abre SIN caja (sin borde ni
  sombra) y con los enlaces centrados bajo el padre.

  El subrayado (primer nivel) usa currentColor y se coloca respecto al centro
  del enlace (line-height:70px), a left/right:1em = el padding del enlace.

  En la HOME la cabecera va recolocada y Astra fija los colores con más
  especificidad; ese mismo esquema de color se replica en functions.php
  (spora_home_header_below_hero). Lo estructural (flecha/caja/subrayado) de
  aquí sirve igual en la home.
  ============================================================================
*/
@media (min-width: 922px) {
	/* Base: todos los enlaces (primer nivel y submenú) en verde oscuro. */
	#masthead .main-header-menu .menu-item > .menu-link {
		position: relative;
		color: var(--spora-header-ink, #001A17) !important;
		-webkit-text-fill-color: var(--spora-header-ink, #001A17) !important;
		transition: color 0.3s ease, -webkit-text-fill-color 0.3s ease;
	}

	/* Ítems desplegables: sin la flecha SVG de Astra. */
	#masthead .main-header-menu .ast-header-navigation-arrow {
		display: none !important;
	}

	/* Subrayado: barra propia en currentColor, oculta (scaleX(0)) y que crece
	   desde la izquierda. Misma curva y duración que .spora-text-link--hover.
	   El primer nivel lo posiciona respecto al centro (line-height:70px) y los
	   hijos respecto al fondo del enlace, que ya ciñe su texto. */
	#masthead .main-header-menu > .menu-item > .menu-link::after,
	#masthead .main-header-menu .sub-menu > .menu-item > .menu-link::after {
		content: "";
		position: absolute;
		left: 1em;
		right: 1em;
		height: 1px;
		background-color: currentColor;
		transform-origin: left center;
		transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
	}

	#masthead .main-header-menu > .menu-item > .menu-link::after {
		top: 45%;
		transform: translateY(0.8em) scaleX(0);
	}

	#masthead .main-header-menu .sub-menu > .menu-item > .menu-link::after {
		bottom: 5px;
		transform: scaleX(0);
	}

	@media (prefers-reduced-motion: reduce) {
		#masthead .main-header-menu > .menu-item > .menu-link::after,
		#masthead .main-header-menu .sub-menu > .menu-item > .menu-link::after {
			transition: none;
		}
	}

	/* Página actual: subrayado persistente (mientras no se navegue el menú). */
	#masthead .main-header-menu > .menu-item.current-menu-item > .menu-link::after,
	#masthead .main-header-menu > .menu-item.current-menu-parent > .menu-link::after,
	#masthead .main-header-menu > .menu-item.current-menu-ancestor > .menu-link::after {
		transform: translateY(0.8em) scaleX(1);
	}

	/* --- Atenuado por hover: PRIMER NIVEL --- */
	#masthead .main-header-menu:hover > .menu-item > .menu-link {
		color: var(--spora-header-ink-soft, #001A1730) !important;
		-webkit-text-fill-color: var(--spora-header-ink-soft, #001A1730) !important;
	}
	#masthead .main-header-menu > .menu-item:hover > .menu-link {
		color: var(--spora-header-ink, #001A17) !important;
		-webkit-text-fill-color: var(--spora-header-ink, #001A17) !important;
	}
	/* Mientras se navega el menú, oculta el subrayado de los no-hover (incluido
	   el de página actual) y dibújalo solo en el que tiene el ratón. */
	#masthead .main-header-menu:hover > .menu-item:not(:hover) > .menu-link::after {
		transform: translateY(0.8em) scaleX(0);
	}
	#masthead .main-header-menu > .menu-item:hover > .menu-link::after {
		transform: translateY(0.8em) scaleX(1);
	}

	/* --- Atenuado por hover: SUBMENÚ --- */
	#masthead .main-header-menu .sub-menu:hover > .menu-item > .menu-link {
		color: var(--spora-header-ink-soft, #001A1730) !important;
		-webkit-text-fill-color: var(--spora-header-ink-soft, #001A1730) !important;
	}
	#masthead .main-header-menu .sub-menu > .menu-item:hover > .menu-link {
		color: var(--spora-header-ink, #001A17) !important;
		-webkit-text-fill-color: var(--spora-header-ink, #001A17) !important;
	}
	#masthead .main-header-menu .sub-menu > .menu-item:hover > .menu-link::after {
		transform: scaleX(1);
	}

	/* --- Submenú desplegado: sin caja (borde/sombra), compacto y centrado. --- */
	#masthead .main-header-menu .sub-menu {
		box-shadow: none !important;
		border: 0 !important;
		background: transparent !important;
		width: auto !important;
		min-width: 0 !important;   /* que la caja se ciña al hijo más ancho */
		padding-top: 2px;
		text-align: center;
	}

	/* Menos espaciado entre hijos: Astra les pone 12.6px arriba/abajo.
	   Además el enlace se ciñe a su texto (width:fit-content + márgenes auto)
	   para que el subrayado abarque solo las letras y no toda la fila. Los <li>
	   son flex por defecto; se pasan a block para que fit-content funcione. */
	#masthead .main-header-menu .sub-menu > .menu-item {
		display: block;
		text-align: center;
	}
	#masthead .main-header-menu .sub-menu > .menu-item > .menu-link {
		display: block;
		width: fit-content;
		margin-left: auto;
		margin-right: auto;
		padding-top: 3px !important;
		padding-bottom: 3px !important;
		text-align: center;
	}
	#masthead .main-header-menu > .menu-item:hover > .sub-menu,
	#masthead .main-header-menu > .menu-item.focus > .sub-menu {
		left: 50% !important;
		transform: translateX(-50%);
	}

	/* --- Apertura hacia ARRIBA -------------------------------------------
	   Cuando no cabe el desplegable por debajo (p. ej. en la home, con el
	   header aún abajo del todo antes de pegarse arriba), el JS marca el ítem
	   con .spora-submenu-up y el submenú se ancla al borde superior del enlace
	   en vez de al inferior. Astra lo posiciona con top:70px; aquí se anula
	   (top:auto) y se usa bottom:100%. La decisión la toma
	   Spora.submenuDirection() en assets/js/utils.js. */
	#masthead .main-header-menu > .menu-item.spora-submenu-up > .sub-menu {
		top: auto !important;
		bottom: 100%;
		padding-top: 0;
		padding-bottom: 2px;
	}

	/* --- El header CRECE al abrir un desplegable (header pegado) ----------
	   Pegado arriba, el desplegable se abre sobre el contenido de la página.
	   En vez de una cajita blanca alrededor del submenú, se pinta de blanco
	   TODA la franja: una barra a ancho completo del header que crece justo
	   por debajo, de modo que el header parece estirarse para alojar a los
	   hijos. Sin pegar (home, sobre el hero) se queda transparente. En el resto de
	   páginas el header en su posición natural (sin pegar; p. ej. con la barra
	   de admin, que lo deja a 32px, o a scroll 0) también lleva la barra: si no,
	   el submenú se abría sin fondo y dejaba ver el contenido debajo (2026-09-29).

	   La barra es un ::after del propio #masthead (por eso va a ancho
	   completo) y crece de alto con la misma duración y easing que el header
	   sticky al aparecer (0.35s ease). Su altura la publica el JS en la
	   variable --spora-submenu-h al entrar en cada padre, porque el alto
	   depende de cuántos hijos tenga cada menú.

	   Clases: .spora-header-stuck (pegado) y .spora-submenu-open (hay un
	   desplegable abierto) las pone assets/js/utils.js. */
	body:not(.home) #masthead::after,
	#masthead.spora-header-stuck::after {
		content: "";
		position: absolute;
		left: 0;
		right: 0;
		top: 100%;                 /* justo debajo de la barra del header */
		height: 0;
		z-index: 0;                /* por debajo del submenú (z-index: 100) */
		background: var(--spora-header-bg, var(--wp--preset--color--spora-white, #FFFFFF));
		transition: height 0.35s ease;
		pointer-events: none;      /* no debe robar el hover al menú */
	}

	body:not(.home) #masthead.spora-submenu-open::after,
	#masthead.spora-header-stuck.spora-submenu-open::after {
		height: calc(var(--spora-submenu-h, 0px));
	}

	/* El submenú va SIN fondo propio (lo pone la barra) y por encima de ella.
	   Su contenido se descubre con la barra, con el mismo tiempo y easing. */
	body:not(.home) #masthead .main-header-menu > .menu-item > .sub-menu,
	#masthead.spora-header-stuck .main-header-menu > .menu-item > .sub-menu {
		z-index: 100;
		clip-path: inset(0 0 100% 0);          /* oculto: recortado por abajo */
		transition: clip-path 0.35s ease;
	}
	body:not(.home) #masthead .main-header-menu > .menu-item:hover > .sub-menu,
	body:not(.home) #masthead .main-header-menu > .menu-item.focus > .sub-menu,
	#masthead.spora-header-stuck .main-header-menu > .menu-item:hover > .sub-menu,
	#masthead.spora-header-stuck .main-header-menu > .menu-item.focus > .sub-menu {
		clip-path: inset(0 0 0 0);             /* se despliega hacia abajo */
	}

	@media (prefers-reduced-motion: reduce) {
		body:not(.home) #masthead::after,
		#masthead.spora-header-stuck::after,
		body:not(.home) #masthead .main-header-menu > .menu-item > .sub-menu,
		#masthead.spora-header-stuck .main-header-menu > .menu-item > .sub-menu {
			transition: none;
		}
	}
}

/*
  ============================================================================
  MENÚ MÓVIL A PANTALLA COMPLETA (tablet y móvil, <=921px)
  ----------------------------------------------------------------------------
  Diseño 2026-10-02: al abrir la hamburguesa, la cabecera se convierte en un
  panel verd fosc que ocupa toda la pantalla, en TODAS las páginas (antes era
  la lista blanca de Astra con bordes y flechas, y solo las páginas fosques la
  oscurecían):
    - logo en blanco y aspa fina blanca (sin la píldora de la hamburguesa);
    - enlaces grandes (28px) en blanco al 50 %; el abierto o el de la página
      actual, en blanco y subrayado;
    - el submenú se despliega debajo, pequeño (15px) y algo sangrado;
    - el selector de idioma, abajo a la derecha.

  Es el desplegable «dropdown» de Astra (no el off-canvas): Astra pone
  .ast-main-header-nav-open en <body> al abrirlo, y todo cuelga de esa clase.
  Lo que se hace es pasar #masthead a position:fixed a pantalla completa
  mientras está abierto; al cerrarlo vuelve a su sticky normal sin tocar nada.

  ESPECIFICIDAD: los selectores llevan dos ids (#masthead #ast-mobile-header)
  a propósito. Compiten con el CSS en línea de Astra (Personalizador), con el
  de la home en functions.php (spora_home_header_below_hero, que fuerza texto
  negro y fondo blanco con !important) y con el del modo oscuro de abajo.

  PADRES SIN ENLACE: los padres del menú (Serveis, Projectes…) son enlaces
  personalizados sin URL, y Astra solo abre el submenú desde su botón de
  flecha (.ast-menu-toggle), no desde el texto. Como el diseño no lleva
  flechas, ese botón se estira, invisible, sobre toda la fila del padre. Si
  algún padre tiene URL propia, se le deja la flecha (fina) para no tapar el
  enlace.
  ============================================================================
*/
@media (max-width: 921px) {
	body.ast-main-header-nav-open {
		--spora-mmenu-bg: var(--wp--preset--color--spora-dark-green, #001A17);
		--spora-mmenu-ink: var(--wp--preset--color--spora-white, #FFFFFF);
		--spora-mmenu-ink-soft: #FFFFFF80;
	}

	/* La página de detrás no se desplaza mientras el panel está abierto. */
	html:has(> body.ast-main-header-nav-open) {
		overflow: hidden;
	}

	/* --- Panel a pantalla completa --- */
	body.ast-main-header-nav-open.ast-header-break-point #masthead {
		position: fixed !important;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
		height: 100vh;
		height: 100dvh;
		margin: 0;
		z-index: 100000;             /* por encima de la barra de admin */
		/* Anula el auto-ocultado (.spora-header-hidden). Sin quitar también la
		   transición, abrir con el header oculto lo hacía bajar deslizándose
		   desde -100 % de la pantalla entera. */
		transform: none !important;
		transition: none !important;
		display: flex;
		flex-direction: column;
		overflow-y: auto;
		overscroll-behavior: contain;
		/* El fondo NO va en #masthead: un background-color con !important no se
		   puede animar (la cascada pone !important por encima de @keyframes) y
		   el verde entraba de golpe. Va en el ::before, que se funde sobre la
		   página (2026-10-02, «que se abra más suave»). */
		background-color: transparent !important;
		box-shadow: none !important;
	}
	body.ast-main-header-nav-open.ast-header-break-point #masthead::before {
		content: "";
		position: fixed;
		inset: 0;
		z-index: -1;                 /* detrás del contenido del panel */
		background-color: var(--spora-mmenu-bg);
		animation: spora-mmenu-fade 0.5s cubic-bezier(0.33, 1, 0.68, 1) both;
		pointer-events: none;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header {
		flex: 1 0 auto;
		display: flex;
		flex-direction: column;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-main-header-wrap,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-primary-header-bar {
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
	}

	/* Logo en blanco. Con logo blanco propio (modo fosc) PHP ya lo sirve. */
	body.ast-main-header-nav-open:not(.spora-has-dark-logo) #masthead #ast-mobile-header .custom-logo {
		filter: brightness(0) invert(1);
		animation: spora-mmenu-logo 0.5s cubic-bezier(0.33, 1, 0.68, 1) both;
	}

	/* --- Botón de abrir: dos rayas del mismo tamaño que el aspa ---
	   Con el menú CERRADO (en cualquier página, no solo con el panel abierto).
	   La hamburguesa de Astra (icono pequeño dentro de una píldora verd fosc)
	   no casaba con el aspa fina: se quita la píldora y se dibujan dos rayas
	   de 23px × 1.5px (como en el diseño), el mismo ancho y grosor que el
	   aspa, separadas 6px entre centros, en una caja de 24px igual que la
	   suya para que el botón no salte al abrir/cerrar (2026-10-02). La raya
	   de arriba es el ::before y la de abajo, su box-shadow. El color es el
	   de la cabecera: verd fosc, o blanco en las páginas fosques
	   (--spora-header-ink). */
	#masthead #ast-mobile-header .menu-toggle:not(.toggled) {
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		color: var(--spora-header-ink, #001A17) !important;
		-webkit-text-fill-color: var(--spora-header-ink, #001A17) !important;
	}
	#masthead #ast-mobile-header .menu-toggle:not(.toggled) .ast-menu2-svg {
		display: none !important;
	}
	#masthead #ast-mobile-header .menu-toggle:not(.toggled) .mobile-menu-toggle-icon {
		position: relative;
		display: block;
		width: 24px;
		height: 24px;
	}
	#masthead #ast-mobile-header .menu-toggle:not(.toggled) .mobile-menu-toggle-icon::before {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 23px;
		height: 1.5px;
		background-color: currentColor;
		box-shadow: 0 6px 0 currentColor;
		transform: translate(-50%, calc(-50% - 3px));
	}

	/* --- Botón de cierre: aspa fina, sin la píldora ---
	   El aspa de Astra es gruesa; se oculta y se dibuja con dos líneas de
	   1.5px (32px de largo = 23px de ancho girada 45°, como en el diseño). */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled {
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		color: var(--spora-mmenu-ink) !important;
		-webkit-text-fill-color: var(--spora-mmenu-ink) !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled .ast-close-svg {
		display: none !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled .mobile-menu-toggle-icon {
		position: relative;
		display: block;
		width: 24px;
		height: 24px;
		animation: spora-mmenu-close 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled .mobile-menu-toggle-icon::before,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled .mobile-menu-toggle-icon::after {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 32px;
		height: 1.5px;
		background-color: currentColor;
		transform: translate(-50%, -50%) rotate(45deg);
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled .mobile-menu-toggle-icon::after {
		transform: translate(-50%, -50%) rotate(-45deg);
	}

	/* --- Contenido: menú arriba, idioma al pie --- */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-mobile-header-content {
		flex: 1 0 auto;
		display: flex !important;
		flex-direction: column;
		padding: 28px 0 max(22px, env(safe-area-inset-bottom)) !important;
		background: transparent !important;
		border: 0 !important;
	}

	/* --- Entrada escalonada ---
	   Mientras el fondo se funde, los enlaces suben y aparecen uno tras otro
	   (--spora-mmenu-i = posición en la lista) y el idioma llega al final.
	   Misma curva que los subrayados. */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item {
		animation: spora-mmenu-in 0.7s cubic-bezier(0.16, 1, 0.3, 1) both;
		animation-delay: calc(0.12s + var(--spora-mmenu-i, 10) * 0.045s);
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(1) { --spora-mmenu-i: 0; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(2) { --spora-mmenu-i: 1; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(3) { --spora-mmenu-i: 2; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(4) { --spora-mmenu-i: 3; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(5) { --spora-mmenu-i: 4; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(6) { --spora-mmenu-i: 5; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(7) { --spora-mmenu-i: 6; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(8) { --spora-mmenu-i: 7; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item:nth-child(9) { --spora-mmenu-i: 8; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-header-html-1 {
		animation: spora-mmenu-fade 0.6s ease 0.45s both;
	}

	/* --- Salida ---
	   .spora-mmenu-closing la pone Spora.mobileMenuClose() (utils.js) durante
	   los 350ms previos a dejar que Astra cierre: el contenido se apaga
	   subiendo un poco, el fondo se funde y el logo vuelve a su color. Si se
	   alargan estas duraciones, subir también CLOSE_MS en el JS. */
	body.spora-mmenu-closing.ast-main-header-nav-open.ast-header-break-point #masthead::before {
		animation: spora-mmenu-fade-out 0.35s cubic-bezier(0.65, 0, 0.35, 1) both;
	}
	body.spora-mmenu-closing.ast-main-header-nav-open #masthead #ast-mobile-header .ast-mobile-header-content {
		animation: spora-mmenu-out 0.25s ease both;
	}
	body.spora-mmenu-closing.ast-main-header-nav-open:not(.spora-has-dark-logo) #masthead #ast-mobile-header .custom-logo {
		animation: spora-mmenu-logo-out 0.35s ease both;
	}
	body.spora-mmenu-closing.ast-main-header-nav-open #masthead #ast-mobile-header .menu-toggle.toggled .mobile-menu-toggle-icon {
		animation: spora-mmenu-close-out 0.3s ease both;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-mobile-header-content > .ast-builder-menu {
		padding: 0 !important;
	}

	/* --- Lista --- */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu {
		display: block;
		padding: 0 20px;
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item {
		display: block;
		position: relative;
		border: 0 !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-link {
		display: block;
		padding: 0 !important;
		border: 0 !important;
		background: transparent !important;
		font-weight: 300;
		color: var(--spora-mmenu-ink-soft) !important;
		-webkit-text-fill-color: var(--spora-mmenu-ink-soft) !important;
		text-decoration: underline;
		text-decoration-color: transparent;
		text-decoration-thickness: 1px;
		text-underline-offset: 0.2em;
		transition: color 0.3s ease, -webkit-text-fill-color 0.3s ease, text-decoration-color 0.3s ease;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item > .menu-link {
		font-size: 32px !important;
		line-height: 47px !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .dropdown-menu-toggle {
		display: none !important;
	}

	/* Abierto, página actual (o su padre) y toque: blanco. Subrayado solo en
	   los dos primeros, no en el hover. */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.ast-submenu-expanded > .menu-link,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.current-menu-item > .menu-link,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.current-menu-ancestor > .menu-link,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-link:hover,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-link:focus-visible,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item:hover > .menu-link {
		color: var(--spora-mmenu-ink) !important;
		-webkit-text-fill-color: var(--spora-mmenu-ink) !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.ast-submenu-expanded > .menu-link,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.current-menu-item > .menu-link,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.current-menu-ancestor > .menu-link {
		text-decoration-color: currentColor;
	}

	/* --- Submenú --- */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu {
		position: static;
		margin: 0;
		padding: 0 0 0 16px;
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu .menu-link {
		font-size: 16px !important;
		line-height: 28px !important;
	}

	/* --- Submenú: se despliega y se pliega deslizándose ---
	   Astra lo abre y cierra con display:block/none en línea, que no se puede
	   animar: el submenú aparecía de golpe y empujaba de golpe al resto. Aquí
	   se deja siempre en display:block (el !important gana al estilo en línea)
	   y se pliega con max-height. La altura abierta es exacta (n.º de hijos ×
	   28px, contados con :has()): con un max-height genérico tipo 500px la
	   curva no coincide con la altura real y al cerrar tardaba en arrancar.
	   visibility:hidden (con retardo al cerrar, para no cortar la animación)
	   impide que el teclado entre en los hijos plegados. */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu {
		--spora-mmenu-n: 10;
		display: block !important;
		max-height: 0;
		overflow: hidden;
		visibility: hidden;
		transition: max-height 0.45s cubic-bezier(0.65, 0, 0.35, 1), visibility 0s linear 0.45s;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(1):last-child) { --spora-mmenu-n: 1; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(2):last-child) { --spora-mmenu-n: 2; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(3):last-child) { --spora-mmenu-n: 3; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(4):last-child) { --spora-mmenu-n: 4; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(5):last-child) { --spora-mmenu-n: 5; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(6):last-child) { --spora-mmenu-n: 6; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(7):last-child) { --spora-mmenu-n: 7; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu:has(> .menu-item:nth-child(8):last-child) { --spora-mmenu-n: 8; }
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.ast-submenu-expanded > .sub-menu {
		max-height: calc(var(--spora-mmenu-n) * 28px);
		visibility: visible;
		transition: max-height 0.6s cubic-bezier(0.16, 1, 0.3, 1), visibility 0s;
	}
	/* Un tercer nivel abierto dentro haría crecer al submenú: sin tope. */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.ast-submenu-expanded > .sub-menu:has(.ast-submenu-expanded) {
		max-height: none;
	}
	/* Los hijos aparecen mientras baja la cortina y se apagan al plegarse. */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu > .menu-item {
		opacity: 0;
		transform: translateY(-6px);
		transition: opacity 0.25s ease, transform 0.45s cubic-bezier(0.65, 0, 0.35, 1);
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item.ast-submenu-expanded > .sub-menu > .menu-item {
		opacity: 1;
		transform: none;
		transition: opacity 0.5s ease 0.1s, transform 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.05s;
	}

	/* --- Botón que abre el submenú (ver PADRES SIN ENLACE arriba) --- */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item-has-children > .ast-menu-toggle {
		top: 0 !important;
		right: 0 !important;
		left: auto !important;
		height: 47px;
		padding: 0 0 0 12px;
		background: transparent !important;
		border: 0 !important;
		box-shadow: none !important;
		color: var(--spora-mmenu-ink-soft) !important;
		-webkit-text-fill-color: var(--spora-mmenu-ink-soft) !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item-has-children > .ast-menu-toggle .ast-arrow-svg {
		width: 16px;
		height: auto;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item-has-children > .menu-link:not([href]) + .ast-menu-toggle,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .menu-item-has-children > .menu-link[href="#"] + .ast-menu-toggle {
		left: 0 !important;
		width: 100%;
		padding: 0;
		opacity: 0;
	}
	/* Los hijos de 2º nivel (si los hubiera) van a la altura de su fila. */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu .menu-item-has-children > .ast-menu-toggle {
		height: 28px;
	}

	/* --- Selector de idioma, abajo a la derecha --- */
	body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-header-html-1 {
		margin-top: auto;
		align-self: flex-end;
		padding: 32px 24px 0 !important;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .spora-lang {
		font-size: 14px;
		line-height: 1;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .spora-lang__item,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .spora-lang__sep {
		color: var(--spora-mmenu-ink) !important;
		-webkit-text-fill-color: var(--spora-mmenu-ink) !important;
		opacity: 1;
	}
	body.ast-main-header-nav-open #masthead #ast-mobile-header .spora-lang__item:hover,
	body.ast-main-header-nav-open #masthead #ast-mobile-header .spora-lang__item:focus {
		opacity: 0.55;
	}

	@media (prefers-reduced-motion: reduce) {
		body.ast-main-header-nav-open.ast-header-break-point #masthead::before,
		body.ast-main-header-nav-open #masthead #ast-mobile-header .custom-logo,
		body.ast-main-header-nav-open #masthead #ast-mobile-header .mobile-menu-toggle-icon,
		body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu > .menu-item,
		body.ast-main-header-nav-open #masthead #ast-mobile-header .ast-header-html-1 {
			animation: none !important;
		}
		body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu,
		body.ast-main-header-nav-open #masthead #ast-mobile-header .main-header-menu .sub-menu > .menu-item {
			transition: none !important;
		}
	}
}

@keyframes spora-mmenu-fade {
	from {
		opacity: 0;
	}
}

@keyframes spora-mmenu-in {
	from {
		opacity: 0;
		transform: translateY(18px);
	}
}

/* El logo pasa de su color al blanco a la vez que entra el fondo. */
@keyframes spora-mmenu-logo {
	from {
		filter: none;
	}
}

@keyframes spora-mmenu-close {
	from {
		opacity: 0;
		transform: rotate(-90deg) scale(0.6);
	}
}

/* Salida (body.spora-mmenu-closing). */
@keyframes spora-mmenu-fade-out {
	to {
		opacity: 0;
	}
}

@keyframes spora-mmenu-out {
	to {
		opacity: 0;
		transform: translateY(-10px);
	}
}

@keyframes spora-mmenu-logo-out {
	to {
		filter: none;
	}
}

@keyframes spora-mmenu-close-out {
	to {
		opacity: 0;
		transform: rotate(90deg) scale(0.6);
	}
}

/*
  ============================================================================
  MODO OSCURO DE PÁGINA (body.spora-dark-mode)
  ----------------------------------------------------------------------------
  Se activa por página con el checkbox «Mode fosc» (meta box «Aparença»); la
  clase y el logo blanco salen de inc/dark-mode.php.

  CABECERA: no se repinta con selectores más fuertes. Las reglas del menú
  (sección anterior, y el CSS en línea de functions.php para la home y el
  selector de idioma) leen estas variables con el color claro como fallback;
  aquí solo se redefinen. Así funciona también en la home recolocada, donde
  cualquier selector nuestro perdía contra #masthead + 5 clases.

  CUERPO: fondo oscuro y texto base (body, títulos, enlaces de párrafo) en
  blanco. Los bloques que fijan su propio color de texto oscuro (#001A17 a
  pelo) NO se invierten solos: hay que revisarlos en cada página fosca.

  --spora-dark-bg es el fondo del cuerpo; por defecto el mismo verd fosc que
  la cabecera. Para separarlos, cambiar solo esa variable.
  ============================================================================
*/
body.spora-dark-mode {
	--spora-header-bg: var(--wp--preset--color--spora-dark-green, #001A17);
	--spora-header-ink: var(--wp--preset--color--spora-white, #FFFFFF);
	--spora-header-ink-soft: #FFFFFF30;
	--spora-dark-bg: var(--wp--preset--color--spora-dark-green, #001A17);
	--spora-dark-ink: var(--wp--preset--color--spora-white, #FFFFFF);

	background-color: var(--spora-dark-bg);
	color: var(--spora-dark-ink);
}

/* --- Cabecera: fondo ---
   Fuera de la home el fondo va en #masthead y la barra de Astra (blanca desde
   el Personalizador) se vuelve transparente. En la home NO se toca #masthead
   aquí: antes de recolocarse va transparente sobre el hero, y una vez
   recolocado ya lee --spora-header-bg (spora_home_header_below_hero). */
body.spora-dark-mode:not(.home) #masthead {
	background-color: var(--spora-header-bg);
}
body.spora-dark-mode #masthead .ast-primary-header-bar,
body.spora-dark-mode #masthead .main-header-bar {
	background-color: transparent;
}
body.spora-dark-mode #masthead .ast-mobile-header-wrap .ast-mobile-header-content,
body.spora-dark-mode #masthead .ast-desktop-header-content {
	background-color: var(--spora-header-bg);
}

/* --- Logo ---
   Con «Logo clar (mode fosc)» subido, PHP ya sirve ese archivo. Sin él, se
   pinta de blanco el logo normal (es de un solo color). */
body.spora-dark-mode:not(.spora-has-dark-logo) #masthead .custom-logo {
	filter: brightness(0) invert(1);
}

/* --- Cabecera en tablet/móvil: menú desplegable de Astra ---
   En escritorio el color sale de las variables; el desplegable móvil usa los
   colores del Personalizador de Astra y hay que fijarlos. */
@media (max-width: 921px) {
	body.spora-dark-mode #masthead .main-header-menu .menu-link,
	body.spora-dark-mode #masthead .main-header-menu .menu-item:hover > .menu-link,
	body.spora-dark-mode #masthead .main-header-menu .current-menu-item > .menu-link,
	body.spora-dark-mode #masthead .main-header-menu .current-menu-ancestor > .menu-link,
	body.spora-dark-mode #masthead .menu-item > .ast-menu-toggle,
	body.spora-dark-mode #masthead .spora-lang__item {
		color: var(--spora-header-ink) !important;
		-webkit-text-fill-color: var(--spora-header-ink) !important;
	}
	/* La <ul> del desplegable lleva su propio gris claro (#F9F9F9) de Astra. */
	body.spora-dark-mode #masthead .main-header-menu,
	body.spora-dark-mode #masthead .main-header-menu .sub-menu {
		background-color: transparent;
	}
	body.spora-dark-mode #masthead .main-header-menu .menu-item .menu-link {
		border-color: rgba(255, 255, 255, 0.15) !important;
	}
}

/* Botón hamburguesa: Astra lo pinta como píldora verd fosc con icono blanco,
   que desaparece sobre la cabecera verd fosc. Se deja sin fondo, solo icono. */
body.spora-dark-mode #masthead .ast-mobile-menu-trigger-fill {
	background: transparent !important;
	color: var(--spora-header-ink) !important;
	-webkit-text-fill-color: var(--spora-header-ink) !important;
}

/* --- Cuerpo --- */
body.spora-dark-mode .site-content,
body.spora-dark-mode .ast-separate-container {
	background-color: var(--spora-dark-bg);
}
body.spora-dark-mode :where(h1, h2, h3, h4, h5, h6),
body.spora-dark-mode .entry-title a,
body.spora-dark-mode .entry-content :where(h1, h2, h3, h4, h5, h6) {
	color: var(--spora-dark-ink);
}
/* h4 a lleva #001A17 !important en la sección de tipografía. */
body.spora-dark-mode h4 a,
body.spora-dark-mode h4 a:hover {
	color: var(--spora-dark-ink) !important;
}
body.spora-dark-mode .entry-content :where(p, li) a {
	color: inherit;
}

/*
  ============================================================================
  Fichas de servei (CPT `servei`) — cabecera d'Administració
  ----------------------------------------------------------------------------
  Solo Administració: la estructura la pinta
  template-parts/servei-header-admin.php (ver single-servei.php), a dos columnas
  (texto + imagen). Las fichas d'Empresa NO usan cabecera de plantilla: se
  componen por bloques (ver la sección «SINGLE DE SERVEI EMPRESA» al final).
  Colores y tipografía salen de los tokens Spora (--spora-* / presets WP).
  ============================================================================
*/

.spora-servei__eyebrow {
    display: inline-block;
    margin-bottom: 8px;
    font-size: var(--spora-text-caption-regular-size);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--spora-color-accent-green);
}

.spora-servei__title {
    margin: 0 0 16px;
    font-size: var(--spora-text-heading-lg-size);
    line-height: var(--spora-text-heading-lg-line-height);
}

.spora-servei__resum {
    margin: 0 0 24px;
    font-size: var(--spora-text-body-regular-size);
    line-height: var(--spora-text-body-regular-line-height);
    max-width: 60ch;
}

.spora-servei__cta {
    display: inline-block;
    padding: 12px 24px;
    border-radius: var(--spora-radius-card);
    background-color: var(--spora-color-accent-green);
    color: var(--spora-color-primary-dark-green);
    font-weight: 600;
    text-decoration: none;
    transition: opacity 0.18s ease;
}

.spora-servei__cta:hover {
    opacity: 0.85;
}

/* El `a:focus, a:hover { color }` de Astra pisaba el color del CTA. */
.spora-servei__cta:hover,
.spora-servei__cta:focus {
    color: var(--spora-color-primary-dark-green);
}

/* --- Administració: dos columnas (texto + imagen) ----------------------- */
.spora-servei__header--admin {
    display: grid;
    grid-template-columns: 1.2fr 1fr;
    gap: 40px;
    align-items: center;
    margin-bottom: 48px;
}

.spora-servei__header--admin .spora-servei__header-media img {
    width: 100%;
    height: auto;
    border-radius: var(--spora-radius-card);
    display: block;
}

/* --- Responsive --------------------------------------------------------- */
@media (max-width: 921px) {
    .spora-servei__header--admin {
        grid-template-columns: 1fr;
    }
}

/*
  Fichas de projecte d'agència (CPT `agencia`): usan el hero de projecte con el
  modificador --agencia. Ver «Ficha de projecte d'agència» más abajo, tras el
  hero de projecte.
*/

/*
  ============================================================================
  FOOTER SPORA  +  EFECTO "REVEAL" (patrón de Olivier Larose)
  ----------------------------------------------------------------------------
  Markup en template-parts/footer-spora.php; se pinta fuera de #page desde el
  footer.php del child (reemplaza al footer de Astra). Fondo BLANCO.

  El efecto "reveal" (el contenido de la página se desliza por encima y el
  footer se descubre desde abajo) es CSS PURO: clip-path + position:sticky.
  No hay JS de scroll. Estructura obligatoria de 3 capas:

    .spora-footer-reveal        alto = --footer-h; clip-path recorta.
      .spora-footer-reveal__track  alto = 100vh + --footer-h; top:-100vh.
        .spora-footer-reveal__pin  sticky; top: calc(100vh - --footer-h).
          .spora-footer            contenido real (define la altura).

  El track mide 100vh más que el footer y se sube 100vh (top:-100vh); el
  clip-path del contenedor recorta ese sobrante para que solo se vea el
  footer. El __pin va sticky pegado abajo, de modo que queda "fijo" mientras
  la página pasa por encima y se va descubriendo.

  TODO depende de --footer-h (alto real del footer). Lo fija en JS
  Spora.stickyFooter() midiendo .spora-footer (ver assets/js/utils.js); aquí
  hay un valor por defecto por si el JS no corre. En móvil (<=921px) el efecto
  se desactiva y el footer queda estático en el flujo normal.
  ============================================================================
*/

/* --- Capas del efecto reveal -------------------------------------------- */
.spora-footer-reveal {
    --footer-h: 640px; /* fallback; Spora.stickyFooter lo pone al alto real */
    position: relative;
    height: var(--footer-h);
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}

.spora-footer-reveal__track {
    position: relative;
    height: calc(100vh + var(--footer-h));
    top: -100vh;
}

.spora-footer-reveal__pin {
    position: sticky;
    top: calc(100vh - var(--footer-h));
    height: var(--footer-h);
}

/* --- Lienzo del footer -------------------------------------------------- */
.spora-footer {
    background-color: var(--spora-color-neutral-white);
    color: var(--spora-color-neutral-black);
    /* Geist Light por defecto en todo el footer (la STK se fuerza donde toca:
       títulos de columna y "newsletter"). Los .is-strong suben a bold. */
    font-family: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
    font-weight: 300;
}

.spora-footer__inner {
    max-width: 1440px;
    margin: 0 auto;
    padding: 56px clamp(32px, 5vw, 0px) 10px;
    box-sizing: border-box;
}

/* --- Fila superior: 3 columnas de enlaces + newsletter ------------------ */
.spora-footer__top {
    display: flex;
    justify-content: space-between;
    gap: 48px;
    flex-wrap: wrap;
}

.spora-footer__cols {
    display: flex;
    gap: clamp(48px, 7vw, 130px);
    min-width: 0; /* permite encoger: si no, un texto largo desborda la fila */
}

/* min-width:0 en las columnas para que un texto largo HAGA WRAP en vez de
   estirar la fila y tirar la newsletter a la fila de abajo. */
.spora-footer__col {
    min-width: 0;
}

/* Título de columna (Menu / Contacte / Segueix-nos): STK Bureau Serif Light 14.
   NO es un heading (es un <div>) a propósito: no queremos <h*> en el footer,
   así que la familia serif se fija aquí explícitamente. */
.spora-footer__heading {
    margin: 0;
    font-family: var(--spora-font-family-display);
    font-weight: 300; /* STK Bureau Light */
    font-size: var(--spora-text-caption-regular-size); /* 14px */
    line-height: 1.2;
    color: var(--spora-color-neutral-black);
}

.spora-footer__list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.spora-footer__list--group {
    margin-top: 22px;
}

.spora-footer__list a,
.spora-footer__list span {
    display: inline-block;
    font-size: var(--spora-text-caption-regular-size);
    line-height: 1.1;
    color: var(--spora-color-neutral-black);
    text-decoration: none;
}

/* El hover NO añade text-decoration: el subrayado lo dibuja la barra animada
   de .spora-text-link (evita doble subrayado). */

/* Ítem sin URL (título de grupo tipo Empresa/Administració): no clicable. */
.spora-footer__list span {
    cursor: default;
}

.is-strong {
    font-weight: 500;
}

/* Aviso "asigna un menú" (solo visible para administradores; ver inc/footer.php). */
.spora-footer__hint {
    margin: 0;
    font-size: var(--spora-text-caption-regular-size);
    color: var(--spora-color-neutral-black-40);
}

.spora-footer__hint a {
    color: inherit;
    text-decoration: underline;
}

/* Contacte: teléfono/email + bloques de dirección */
.spora-footer__address {
    margin-top: 16px;
    font-size: var(--spora-text-caption-regular-size);
    line-height: 1.6;
}

.spora-footer__address p {
    margin: 0;
}

/* Teléfonos detectados en las oficinas (spora_footer_office_line): heredan el
   color del texto, así valen igual en el footer claro y en el verd fosc. */
.spora-footer__address a {
    color: inherit;
    text-decoration: none;
}

/* --- Newsletter ---------------------------------------------------------- */
/* Ancho de diseño 437px, pero PUEDE encoger. Antes iba con `flex: none`
   (= 0 0 auto), así que no encogía nunca: cuando las tres columnas + el gap +
   437px dejaban de caber, la fila hacía wrap y el footer pasaba de ~678px a
   ~1256px de alto, con lo que el reveal se rompía entre ~922 y ~1100 (medido:
   a 1035px, footer de 1256 contra una ventana de 800). Con `flex: 1 1 320px`
   se estrecha hasta 320 antes de partir la fila (a 1035 el footer queda en
   793px), y el max-width le mantiene el ancho de diseño cuando hay sitio.
   min-width: 0 es lo que permite encoger de verdad: sin él, el contenido
   (campos, texto de los checks) marca un mínimo y vuelve el wrap. */
.spora-footer__newsletter {
    flex: 1 1 320px;
    width: auto;
    max-width: 437px;
    min-width: 0;
}

/* "Subscriu-te al" en Geist Light 32 (hereda la familia de .spora-footer). */
.spora-footer__newsletter-title {
    margin: 0 0 25px;
    font-weight: 300; /* Geist Light */
    font-size: 32px;
    line-height: 1.1;
    color: var(--spora-color-neutral-black);
}

/* "newsletter" en STK Bureau Serif, itálica y "bold" (peso 500) a 32. */
.spora-footer__newsletter-title em {
    font-family: var(--spora-font-family-display);
    font-style: italic;
    font-weight: 500;
    font-size: 32px;
}

/* ---------- Formulario newsletter ----------
   Campos SIN caja: solo un separador inferior de 1px negro (opacidad 1).
   El reset (appearance/box-shadow/border-radius) es para ganar a los estilos
   globales de Astra sobre input[type="email"] (elemento+atributo, (0,2,1)). */
.spora-footer .spora-footer__input {
    -webkit-appearance: none;
    appearance: none;
    box-sizing: border-box;
    display: block;
    width: 100%;
    padding: 12px 20px;
    border: 0;
    border-bottom: 1px solid var(--spora-color-neutral-black);
    border-radius: 0;
    background: transparent;
    box-shadow: none;
    font-family: inherit; /* Geist */
    font-weight: 300;     /* Light */
    font-size: 16px;
    line-height: 1.2;     /* 120% */
    letter-spacing: 0;
    color: var(--spora-color-neutral-black);
}

/* Placeholder: Geist Light 16 / 120% / 0 / opacidad 0.50. */
.spora-footer .spora-footer__input::placeholder {
    color: var(--spora-color-neutral-black);
    opacity: 0.5;
    font-weight: 300;
    font-size: 16px;
    line-height: 1.2;
    letter-spacing: 0;
}

/* Foco: no cambia la caja (mismo separador), asi no hay salto. El color se
   repite aqui porque Astra pisa input[type="email"]:focus con (0,2,1). */
.spora-footer .spora-footer__input:focus,
.spora-footer .spora-footer__input:focus-visible {
    outline: none;
    box-shadow: none;
    background: transparent;
    color: var(--spora-color-neutral-black);
    /* IMPORTANTE: `border: 0` va aqui, DENTRO del :focus.
       La opcion de accesibilidad de Astra pinta en input:focus
       `border-style: dotted; border-width: thin` a los CUATRO lados. Como el
       campo solo lleva borde inferior, al enfocar reaparecian los otros tres
       como puntitos. Redeclarar solo border-bottom no bastaba: hay que resetear
       los cuatro lados con la especificidad de esta regla y volver a poner el
       separador. */
    border: 0;
    border-bottom: 2px solid var(--spora-color-neutral-black);
    /* -1px de padding para compensar el grosor extra: el campo no cambia de
       alto y no salta nada al enfocar. */
    padding-bottom: 9px;
}

/* ---------- Checkboxes ---------- */
.spora-footer__checks {
    margin: 24px 0 0;
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.spora-footer__form .wpcf7-acceptance label {
    display: flex;
    align-items: center;
    gap: 10px;
    cursor: pointer;
}

.spora-footer .spora-footer__form .wpcf7-acceptance input[type="checkbox"] {
    -webkit-appearance: none;
    appearance: none;
    flex: none;
    box-sizing: border-box;
    width: 16px;
    height: 16px;
    /* El navegador impone su propio min-width/min-height (1.4em) a las casillas
       con appearance:none: sin fijarlos, la casilla salia de 17-19px de ancho
       (segun el font-size heredado) por 16 de alto, es decir NO cuadrada. */
    min-width: 16px;
    max-width: 16px;
    min-height: 16px;
    aspect-ratio: 1 / 1;
    margin: 0;
    padding: 0;
    border: 1px solid rgba(0, 0, 0, 0.3);
    border-radius: 0;
    background: transparent;
    box-shadow: none;
    cursor: pointer;
}

.spora-footer .spora-footer__form .wpcf7-acceptance input[type="checkbox"]:checked {
    background-color: var(--spora-color-neutral-black);
    border-color: var(--spora-color-neutral-black);
    /* Check en SVG inline (data URI): se pinta como background, no con ::after,
       porque los pseudo-elementos en <input> no son fiables entre navegadores. */
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.5l3 3 5-6.5' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 12px 12px;
}

/* Mismo motivo que en los campos de texto: al enfocar, Astra pone el borde
   punteado. Se mantiene el cuadro solido. */
.spora-footer .spora-footer__form .wpcf7-acceptance input[type="checkbox"]:focus {
    outline: none;
    border: 1px solid rgba(0, 0, 0, 0.3);
}

/* Mismo motivo que en los campos de texto: al enfocar, Astra pone el borde
   punteado. Se mantiene el cuadro solido. */
.spora-footer--dark .spora-footer__form .wpcf7-acceptance input[type="checkbox"]:focus {
    outline: none;
    border: 1px solid rgba(255, 255, 255, 0.7);
}

/* Texto del checkbox: Geist Light 14 / 120% / 0 / opacidad 0.30. */
.spora-footer__form .wpcf7-acceptance .wpcf7-list-item-label {
    font-weight: 300;
    font-size: 14px;
    line-height: 1.2;
    letter-spacing: 0;
    color: var(--spora-color-neutral-black);
    opacity: 0.3;
}

/* ---------- Boton ENVIAR ----------
   Solo texto con separador debajo. SIN ninguna animacion en hover: lo unico
   que reacciona es el cursor personalizado del sitio. */
.spora-footer .spora-footer__submit {
    -webkit-appearance: none;
    appearance: none;
    display: block;
    width: 100%;
    margin: 34px 0 0;
    padding: 0 0 12px;
    border: 0;
    border-bottom: 1px solid var(--spora-color-neutral-black);
    border-radius: 0;
    background: transparent;
    box-shadow: none;
    color: var(--spora-color-neutral-black);
    font-family: inherit;
    font-weight: 500;
    font-size: 16px;
    line-height: 1.2;
    letter-spacing: 0;
    text-align: left;
    text-transform: none;
    cursor: pointer;
}

/* Hover/foco: identicos al reposo (nada de animacion). */
.spora-footer .spora-footer__submit:hover,
.spora-footer .spora-footer__submit:focus {
    background: transparent;
    color: var(--spora-color-neutral-black);
    border-bottom-color: var(--spora-color-neutral-black);
}


/* ---------- Formulari newsletter — Contact Form 7 ----------
   El formulari ya no va a mano: lo pinta CF7 con
   [contact-form-7 id="X" html_class="spora-footer__form"]. Los campos llevan
   class:spora-footer__input y el boton class:spora-footer__submit, asi que TODO
   lo de arriba se les aplica igual. Aqui solo se neutraliza el marcado extra
   que anade CF7 (spans envoltorio, avisos de validacion y spinner) para que se
   vea exactamente como el formulario anterior. */

/* CF7 envuelve cada campo en un <span> inline; sin esto los campos se pondrian
   uno al lado del otro y se perderia el apilado de separadores. */
.spora-footer__form .wpcf7-form-control-wrap {
    display: block;
}

/* Los <span class="wpcf7-list-item"> de los acceptance traen margen propio. */
.spora-footer__form .wpcf7-list-item {
    margin: 0;
}

/* Selector de idioma: misma caja que un campo de texto (la hereda de
   .spora-footer__input) + flecha propia, porque `appearance: none` quita la del
   navegador. El desplegable abierto lo pinta el sistema: no es estilable. */
.spora-footer .spora-footer__form select.spora-footer__input {
    padding-right: 44px;
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5L6 6.5l5-5' fill='none' stroke='%23001A17' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 20px center;
    background-size: 12px 8px;
    cursor: pointer;
}

/* Opciones: el color se fija porque algunos navegadores heredan el del campo
   (blanco en el footer oscuro) y las dejarian ilegibles sobre fondo blanco. */
.spora-footer .spora-footer__form select.spora-footer__input option {
    color: var(--spora-color-neutral-black);
}

/* Campo con error: solo cambia el color del separador (misma caja, sin salto). */
.spora-footer .spora-footer__form .wpcf7-not-valid {
    border-bottom-color: #dc3232;
}

/* Aviso bajo el campo. Geist Light 12, sin ocupar mas de lo necesario. */
.spora-footer__form .wpcf7-not-valid-tip {
    display: block;
    margin: 6px 0 0 20px;
    font-weight: 300;
    font-size: 12px;
    line-height: 1.2;
    color: #dc3232;
}

/* Mensaje final de CF7 (enviado / error): sin la caja con borde del plugin. */
.spora-footer__form .wpcf7-response-output {
    margin: 20px 0 0;
    padding: 0;
    border: 0;
    font-weight: 300;
    font-size: 14px;
    line-height: 1.3;
    color: var(--spora-color-neutral-black);
}

/* Spinner: CF7 lo inserta justo despues del [submit]. Va debajo del boton,
   alineado a la izquierda como el texto ENVIAR. */
.spora-footer__form .wpcf7-spinner {
    margin: 12px 0 0;
}

/* Mensaje final en estados de ERROR: el mismo rojo que los avisos por campo. */
.spora-footer__form.invalid .wpcf7-response-output,
.spora-footer__form.unaccepted .wpcf7-response-output,
.spora-footer__form.spam .wpcf7-response-output,
.spora-footer__form.aborted .wpcf7-response-output,
.spora-footer__form.failed .wpcf7-response-output {
    color: #dc3232;
}


/* Casilla con error (solo la obligatoria, y solo si el formulario lleva
   `acceptance_as_validation: on` en su configuración adicional: sin esa opción
   CF7 no valida las aceptaciones, se limita a DESACTIVAR el botón de enviar y
   no se ve ningún aviso). */
.spora-footer .spora-footer__form .wpcf7-acceptance.wpcf7-not-valid input[type="checkbox"] {
    border-color: #dc3232;
}

/* ---------- Selector de idioma: desplegable propio ----------
   La lista de un <select> nativo la pinta el sistema y no hay CSS que la
   alcance, así que Spora.customSelect (utils.js) monta un componente propio y
   deja el <select> real fuera de la vista (lo sigue enviando CF7). Sin JS se ve
   el <select> nativo con la flecha de arriba, que sigue siendo válido. */
.spora-select {
    position: relative;
}

/* El <select> real: invisible pero DENTRO del formulario (lo envía y lo valida
   CF7, y su <label for> sigue asociada). No se usa display:none para no
   sacarlo del formulario a efectos de accesibilidad. */
.spora-footer .spora-select .spora-select__native {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: 0;
    padding: 0;
    border: 0;
    opacity: 0;
    pointer-events: none;
}

/* Activador: la caja ya la trae de .spora-footer__input (el JS le copia las
   clases del <select>); aquí solo lo que un <button> no hereda. Los `hover` y
   `focus` se repiten en plano porque Astra pinta fondo y sombra en todo
   <button>. */
.spora-footer .spora-select__toggle {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    min-height: 0;
    text-align: left;
    text-transform: none;
    cursor: pointer;
}

.spora-footer .spora-select__toggle,
.spora-footer .spora-select__toggle:hover,
.spora-footer .spora-select__toggle:focus,
.spora-footer .spora-select__toggle:active {
    background: transparent;
    box-shadow: none;
    color: var(--spora-color-neutral-black);
}

/* Flecha: la misma del <select> nativo, pero en un ::after para poder girarla
   al abrir. */
.spora-footer .spora-select__toggle::after {
    content: "";
    flex: none;
    width: 12px;
    height: 8px;
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5L6 6.5l5-5' fill='none' stroke='%23001A17' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 12px 8px;
    transition: transform 0.2s ease;
}

.spora-select.is-open .spora-select__toggle::after {
    transform: rotate(180deg);
}

/* Lista: cuelga del campo, con el mismo 1px de la web y sin esquinas
   redondeadas. Va en absolute para no empujar los checkboxes al abrirse. */
.spora-select__list {
    position: absolute;
    z-index: 5;
    top: 100%;
    left: 0;
    right: 0;
    max-height: 224px;
    margin: 0;
    padding: 0;
    overflow-y: auto;
    list-style: none;
    background-color: var(--spora-color-neutral-white);
    border: 1px solid var(--spora-color-neutral-black);
    border-top: 0;
}

.spora-select__opt {
    margin: 0;
    padding: 12px 20px;
    font-weight: 300; /* Light, como los campos */
    font-size: 16px;
    line-height: 1.2;
    letter-spacing: 0;
    color: var(--spora-color-neutral-black);
    cursor: pointer;
}

.spora-select__opt + .spora-select__opt {
    border-top: 1px solid rgba(0, 26, 23, 0.15);
}

/* Opción activa: subrayada y en Medium (mismo recurso que el filtro de
   projectes). El peso se queda fijo: cambiarlo en hover movería el texto. */
.spora-select__opt.is-selected {
    font-weight: 500;
    text-decoration: underline;
    text-underline-offset: 2px;
}

/* Hover/foco: solo subrayado, sin fondo (el resto del footer tampoco usa
   cajas de color). */
.spora-select__opt:hover,
.spora-select__opt:focus {
    outline: none;
    text-decoration: underline;
    text-underline-offset: 2px;
}

/* --- Zona inferior: logo + copyright + sellos + legal ------------------- */
.spora-footer__bottom {
    margin-top: clamp(5px, 1vh, 150px);
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    gap: 40px;
    flex-wrap: wrap;
}

.spora-footer__brand {
    display: flex;
    align-items: flex-end;
    gap: 30px;
}

/* El logo enlaza a la home; el <a> envuelve la imagen sin hueco extra. */
.spora-footer__logo-link {
    display: block;
    line-height: 0;
}

.spora-footer__logo {
    display: block;
    width: clamp(150px, 26vw, 223px);
    height: auto;
}

/* Copyright alineado a la base del logo, levantado un poco para descansar
   sobre su línea de base tipográfica. */
.spora-footer__copy {
    padding-bottom: 14px;
    font-size: var(--spora-text-caption-regular-size);
    color: var(--spora-color-neutral-black);
    white-space: nowrap;
}

.spora-footer__legal {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 18px;
    text-align: right;
}

.spora-footer__certs {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: clamp(10px, 1.5vw, 16px); /* separacion entre logos de la galeria */
    justify-content: flex-end;     /* al plegarse, las filas siguen a la derecha */
}

/* Sellos de certificación (ISO 9001, ISO 14001, ENS): imagen única
   assets/img/logos-ens.png, a su altura nativa de 92px. */
.spora-footer__cert-img {
    display: block;
    /* Alto fluido: 46px en escritorio y se reduce en pantallas pequenas.
       Al fijar SOLO el alto, todos los logos quedan a la misma escala y cada
       uno conserva su proporcion (width:auto). */
    height: clamp(24px, 3.25vw, 46px);
    width: auto;
    /* Red de seguridad en moviles estrechos: si un logo muy ancho no cupiera,
       se limita al contenedor. object-fit evita que se deforme al hacerlo. */
    max-width: 100%;
    object-fit: contain;
    flex: 0 1 auto;
}

.spora-footer__legal-links {
    margin: 0;
    font-size: var(--spora-text-caption-regular-size);
    color: var(--spora-color-neutral-black);
}

.spora-footer__legal-links a {
    color: inherit;
    text-decoration: none;
}
/* Sin text-decoration en hover: el subrayado lo hace la barra de .spora-text-link. */

/*
  ----------------------------------------------------------------------------
  VARIANTE VERD FOSC  ·  .spora-footer--dark
  ----------------------------------------------------------------------------
  Opción por página (meta box "Footer" -> _spora_footer_dark). Fondo verd fosc
  con texto/enlaces/input/botón en claro (invertido). El subrayado animado usa
  currentColor, así que se adapta solo. El logo lo cambia el PHP por el "Logo
  clar" (spora_footer_logo_light_url).
  ----------------------------------------------------------------------------
*/
.spora-footer--dark {
    background-color: var(--spora-color-primary-dark-green);
    color: var(--spora-color-neutral-white);
}

/* Títulos de columna -> blanco. */
.spora-footer--dark .spora-footer__heading {
    color: var(--spora-color-neutral-white);
}

/* Enlaces, direcciones, copyright y legal -> blanco. */
.spora-footer--dark .spora-footer__newsletter-title,
.spora-footer--dark .spora-footer__list a,
.spora-footer--dark .spora-footer__list span,
.spora-footer--dark .spora-footer__address,
.spora-footer--dark .spora-footer__copy,
.spora-footer--dark .spora-footer__legal-links,
.spora-footer--dark .spora-footer__legal-links a {
    color: var(--spora-color-neutral-white);
}

/* Formulario: separadores, texto y placeholder en claro sobre el verde. */
.spora-footer--dark .spora-footer__input {
    background: transparent;
    border-bottom-color: var(--spora-color-neutral-white);
    color: var(--spora-color-neutral-white);
}

.spora-footer--dark .spora-footer__input::placeholder {
    color: var(--spora-color-neutral-white);
    /* Sobre el verd fosc, el 0.5 del modo claro se lee mal: se sube a 0.7. */
    opacity: 0.7;
}

/* El color se repite en :focus porque Astra lo pisa con (0,2,1). */
.spora-footer--dark .spora-footer__input:focus,
.spora-footer--dark .spora-footer__input:focus-visible {
    background: transparent;
    border-bottom-color: var(--spora-color-neutral-white);
    color: var(--spora-color-neutral-white);
}

/* Checkboxes: cuadro y texto en claro. */
.spora-footer--dark .spora-footer__form .wpcf7-acceptance input[type="checkbox"] {
    /* Al 0.3 el cuadro era casi invisible sobre el verde; se sube a 0.7 para
       que acompane al texto de su etiqueta. */
    border-color: rgba(255, 255, 255, 0.7);
    background: transparent;
}

.spora-footer--dark .spora-footer__form .wpcf7-acceptance input[type="checkbox"]:checked {
    background-color: var(--spora-color-neutral-white);
    border-color: var(--spora-color-neutral-white);
    /* Caja blanca -> el check va en verd fosc para que se vea. */
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.5l3 3 5-6.5' fill='none' stroke='%23001A17' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

.spora-footer--dark .spora-footer__form .wpcf7-acceptance .wpcf7-list-item-label {
    color: var(--spora-color-neutral-white);
    /* El 0.3 del modo claro es ilegible en blanco sobre verd fosc: 0.7. */
    opacity: 0.7;
}

/* Boton ENVIAR: texto y separador en blanco. Sigue SIN animacion en hover. */
.spora-footer--dark .spora-footer__submit,
.spora-footer--dark .spora-footer__submit:hover,
.spora-footer--dark .spora-footer__submit:focus {
    background: transparent;
    color: var(--spora-color-neutral-white);
    border-bottom-color: var(--spora-color-neutral-white);
}


/* Formulari CF7: flecha del selector y mensajes sobre el verd fosc. */
.spora-footer--dark .spora-footer__form select.spora-footer__input {
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5L6 6.5l5-5' fill='none' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* Errores: el mismo rojo brillante que en .spora-form--invert (el #dc3232 de
   CF7 no se lee sobre el verd fosc). */
.spora-footer--dark .spora-footer__form .wpcf7-not-valid {
    border-bottom-color: #ff5a5a;
}

.spora-footer--dark .spora-footer__form .wpcf7-not-valid-tip {
    color: #ff5a5a;
}

/* Mensaje final: blanco en exito/estado neutro, rojo en cualquier error. */
.spora-footer--dark .spora-footer__form .wpcf7-response-output {
    color: var(--spora-color-neutral-white);
}

.spora-footer--dark .spora-footer__form.invalid .wpcf7-response-output,
.spora-footer--dark .spora-footer__form.unaccepted .wpcf7-response-output,
.spora-footer--dark .spora-footer__form.spam .wpcf7-response-output,
.spora-footer--dark .spora-footer__form.aborted .wpcf7-response-output,
.spora-footer--dark .spora-footer__form.failed .wpcf7-response-output {
    color: #ff5a5a;
}


/* Casilla obligatoria con error: rojo brillante, como los avisos. */
.spora-footer--dark .spora-footer__form .wpcf7-acceptance.wpcf7-not-valid input[type="checkbox"] {
    border-color: #ff5a5a;
}

/* Desplegable propio del selector: activador y flecha en claro. */
.spora-footer--dark .spora-select__toggle,
.spora-footer--dark .spora-select__toggle:hover,
.spora-footer--dark .spora-select__toggle:focus,
.spora-footer--dark .spora-select__toggle:active {
    background: transparent;
    color: var(--spora-color-neutral-white);
}

.spora-footer--dark .spora-select__toggle::after {
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5L6 6.5l5-5' fill='none' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* Lista: fondo verd fosc (el del footer) para que no aparezca un rectángulo
   blanco encima; separadores y contorno en blanco al 20/100%. */
.spora-footer--dark .spora-select__list {
    background-color: var(--spora-color-primary-dark-green);
    border-color: var(--spora-color-neutral-white);
}

.spora-footer--dark .spora-select__opt {
    color: var(--spora-color-neutral-white);
}

.spora-footer--dark .spora-select__opt + .spora-select__opt {
    border-top-color: rgba(255, 255, 255, 0.2);
}

/* --- Efecto DESACTIVADO: footer estático en el flujo normal ---------------
   Dos casos, con las mismas declaraciones:

     · .is-static  -> el footer NO CABE en la ventana. Lo marca
       Spora.stickyFooter() midiendo footer vs window.innerHeight. Si mide más
       que la ventana, el pin queda con `top` negativo: su mitad de arriba se
       va fuera de la pantalla y NO hay forma de llegar a ella (un sticky no se
       puede scrollear por dentro). Antes solo pasaba en móvil; con el
       formulario del newsletter el footer creció y también pasa en pantallas
       intermedias o poco altas (p. ej. 1035x800: footer de 1256px).

     · <=767px -> en móvil el footer apilado nunca cabe: se desactiva de
       entrada, sin esperar a la medida del JS (evita el parpadeo del primer
       pintado si el JS tarda).
   ------------------------------------------------------------------------- */
.spora-footer-reveal.is-static {
    height: auto;
    clip-path: none;
}

.spora-footer-reveal.is-static .spora-footer-reveal__track {
    height: auto;
    top: 0;
}

.spora-footer-reveal.is-static .spora-footer-reveal__pin {
    position: static;
    height: auto;
}

@media (max-width: 767px) {
    .spora-footer-reveal {
        height: auto;
        clip-path: none;
    }

    .spora-footer-reveal__track {
        height: auto;
        top: 0;
    }

    .spora-footer-reveal__pin {
        position: static;
        height: auto;
    }
}

/* --- Responsive: apila el contenido (tablet y móvil, <=921px). ------------ */
@media (max-width: 921px) {
    .spora-footer__top {
        flex-direction: column;
        gap: 40px;
    }

    .spora-footer__cols {
        flex-wrap: wrap;
        gap: 40px;
    }

    .spora-footer__newsletter {
        width: 100%;
        /* Apilado: a ancho completo como hasta ahora (sin el tope de 437px,
           que solo tiene sentido cuando comparte fila con las columnas). */
        max-width: none;
    }

    .spora-footer__bottom {
        flex-direction: column;
        align-items: flex-start;
    }

    .spora-footer__legal {
        align-items: flex-start;
        text-align: left;
    }

    .spora-footer__certs {
        justify-content: flex-start;
    }

    .spora-footer__brand {
        flex-wrap: wrap;
        gap: 20px;
    }
}
/*
  ============================================================================
  MIGAS DE PAN (breadcrumbs)  ·  .spora-breadcrumbs
  ----------------------------------------------------------------------------
  Rastro de migas en estilo Spora: mayúsculas, gris neutro, letra pequeña con
  tracking, separador «/». Lo pinta spora_render_breadcrumbs() (inc/breadcrumbs.php),
  que usan tanto las fichas (single-*.php) como el bloque spora/breadcrumbs.
  Los estilos viven aquí (y no en el bloque) porque las fichas los necesitan
  aunque el bloque no esté en la página.
  ============================================================================
*/

.spora-breadcrumbs {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5em;
    font-size: 12px;
    line-height: 1;
    letter-spacing: 0;
    text-transform: uppercase;
    color: var(--spora-color-neutral-black-40);
    margin-bottom: 20px;
}

.spora-breadcrumbs--left   { justify-content: flex-start; }
.spora-breadcrumbs--center { justify-content: center; }
.spora-breadcrumbs--right  { justify-content: flex-end; }

.spora-breadcrumbs__item,
.spora-breadcrumbs__current {
    color: inherit;
}

.spora-breadcrumbs__sep {
    opacity: 0.6;
}

/* Rastro inyectado automáticamente en las fichas de CPT (single-*.php): margen
   propio, ya que ahí no hay controles de espaciado del editor. */
.spora-breadcrumbs--ficha {
    margin: 100px 0 8px;
}


/*
  ============================================================================
  SPORA — Formulario de contacto (Contact Form 7)
  ----------------------------------------------------------------------------
  Plantilla en inc/cf7-formulari-contacte.txt. Todo scopeado bajo .spora-form.
  El autop de CF7 se desactiva en functions.php (wpcf7_autop_or_not) para que
  este marcado no reciba <p>/<br> automáticos.

  Estructura de cada campo (simple): INPUT en una sola línea (con subrayado)
  y LABEL justo debajo.

  Tipografías (peso 300 = Light):
    - radios ......... Geist Light 16 / 1.2 / 0
    - labels ......... STK Bureau Serif Light 12 / 1.2 / 0
    - checkbox label . STK Bureau Serif Light 12 / 1.2 / 0
    - botón Enviar ... Geist Light 16 / 1.2 / 0
  ============================================================================
*/

.spora-form {
    --sf-dark:  var(--spora-color-primary-dark-green);    /* #001A17 */
    --sf-line:  var(--spora-color-primary-dark-green-40); /* línea suave */
    --sf-geist: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;

    display: flex;
    flex-direction: column;
    color: var(--sf-dark);
}

/* ---------- Selectores (radios) ---------- */
.spora-form .spora-form__radios {
    max-height: 45px;
}
.spora-form .wpcf7-radio {
    display: flex;
    flex-wrap: wrap;
    gap: 48px;
    margin-bottom: 40px;
}
.spora-form .wpcf7-radio .wpcf7-list-item {
    margin: 0;
}
.spora-form .wpcf7-radio .wpcf7-list-item label {
    display: inline-flex;
    align-items: center;
    gap: 14px;
    cursor: pointer;
}
.spora-form .wpcf7-radio .wpcf7-list-item-label {
    font-family: var(--sf-geist);
    font-weight: 300;
    font-size: 16px;
    line-height: 1.2;
    letter-spacing: 0;
}
.spora-form input[type="radio"] {
    appearance: none !important;
    -webkit-appearance: none !important;
    box-sizing: border-box !important;
    width: 20px !important;
    height: 20px !important;
    min-width: 20px !important;
    flex: 0 0 20px;
    aspect-ratio: 1 / 1;          /* círculo perfecto */
    padding: 0 !important;
    margin: 0 !important;
    border: 1px solid var(--sf-dark) !important;
    border-radius: 50% !important;
    background: transparent;
    cursor: pointer;
    transition: background-color .15s ease;
}
.spora-form input[type="radio"]:checked {
    background-color: var(--sf-dark);
}

/* ---------- Campos: INPUT una línea (subrayado) + LABEL debajo ---------- */
.spora-form .spora-field {
    display: flex;
    flex-direction: column;
    margin-bottom: 8px;
}
/* Línea separadora POR ENCIMA del primer campo (falta la de arriba, porque el
   subrayado de cada input solo dibuja la de abajo). Cubre ambos formularios:
   - trabaja: el primer campo es el primer hijo de .spora-form.
   - contacto: el primer campo va justo después de .spora-form__radios. */
.spora-form > .spora-field:first-child,
.spora-form .spora-form__radios + .spora-field {
    border-top: 1px solid var(--sf-line);
    padding-top: 16px;
}
.spora-form .wpcf7-form-control-wrap {
    display: block;
}
.spora-form input[type="text"],
.spora-form input[type="email"],
.spora-form input[type="tel"],
.spora-form textarea {
    width: 100%;
    box-sizing: border-box;
    margin: 0;
    border: 0;
    border-bottom: 1px solid var(--sf-line);   /* el subrayado = la línea */
    border-radius: 0;
    background: transparent;
    padding: 6px 0;
    color: var(--sf-dark);
    font-family: var(--sf-geist);
    font-weight: 300;
    font-size: 16px;
    line-height: 1.4;
    letter-spacing: 0;
    box-shadow: none;
}
.spora-form textarea {
    min-height: 84px;
    resize: vertical;
    display: block;
}
.spora-form input:focus,
.spora-form textarea:focus {
    outline: none;
    border-bottom-color: var(--sf-dark);
    box-shadow: none;
}
.spora-form ::placeholder {
    color: var(--sf-dark);
    opacity: 0.5;
}
.spora-form .spora-label {
    order: 0;                     /* label ARRIBA del input (primero en el DOM) */
    font-family: var(--spora-font-family-display);  /* STK Bureau Serif */
    font-weight: 300;
    font-size: 12px;
    line-height: 1.2;
    letter-spacing: 0;
    text-transform: uppercase;
    margin-bottom: 8px;
}

/* ---------- Fila inferior: aceptación (izq) + botón (der), MISMA línea ---------- */
.spora-form .spora-form__bottom {
    display: flex;
    align-items: start;
    justify-content: space-between;
    gap: 150px;
    flex-wrap: nowrap;
    margin-top: 65px;
}

/* ---------- Checkbox de aceptación: casilla ARRIBA, texto DEBAJO ---------- */
.spora-form .wpcf7-acceptance .wpcf7-list-item {
    margin: 0;
}
.spora-form .wpcf7-acceptance label {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
    cursor: pointer;
}
.spora-form .wpcf7-acceptance .wpcf7-list-item-label {
    font-family: var(--spora-font-family-display);  /* STK Bureau Serif */
    font-weight: 300;
    font-size: 12px;
    line-height: 1.4;
    letter-spacing: 0;
    color: var(--sf-dark);
}
/* Enlace política: subrayado SOLO en hover */
.spora-form .wpcf7-acceptance a {
    color: inherit;
    text-decoration: none;
}
.spora-form input[type="checkbox"] {
    appearance: none !important;
    -webkit-appearance: none !important;
    box-sizing: border-box !important;
    flex: 0 0 20px;
    width: 20px !important;
    height: 20px !important;
    min-width: 20px !important;
    aspect-ratio: 1 / 1;
    margin: 0 !important;
    padding: 0 !important;
    border: 1px solid var(--sf-dark) !important;
    border-radius: 0 !important;
    background: transparent;
    cursor: pointer;
    transition: background-color .15s ease;
}
.spora-form input[type="checkbox"]:checked {
    background-color: var(--sf-dark);
    background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2012%2012'%3E%3Cpath%20d='M2.5%206.2l2.2%202.2%204.8-5'%20fill='none'%20stroke='%23fff'%20stroke-width='1.4'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 12px 12px;
}

/* ---------- Botón Enviar (relleno deslizante con skew) ----------
   Se usa !important en las propiedades de caja para ganar a los estilos
   por defecto de Astra sobre input[type=submit] (padding/min-height). */
.spora-form .spora-submit {
    position: relative;
    display: inline-block;
    overflow: hidden;
    border: 1px solid var(--sf-dark);
    isolation: isolate;
    flex: 0 0 auto;
}
.spora-form .spora-submit::before {
    content: "";
    position: absolute;
    top: -2px;
    left: -2px;
    width: calc(100% + 4px);
    height: calc(100% + 4px);
    background-color: var(--sf-dark);
    transform: translate3d(0, 0, 0) skewY(0deg);
    transition: transform .5s cubic-bezier(.24, .69, .12, .9);
    z-index: 1;
    pointer-events: none;
}
.spora-form .spora-submit:hover::before {
    transform: translate3d(0, 205%, 0) skewY(10deg);
    transition: transform .5s cubic-bezier(.17, .21, 0, .96);
}
.spora-form .spora-submit input[type="submit"] {
    position: relative;
    z-index: 2;
    display: block;
    width: 203px !important;
    height: auto !important;
    min-height: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent !important;
    cursor: pointer;
    margin: 0 !important;
    padding: 9px 0px !important;
    color: var(--spora-color-neutral-white) !important;
    font-family: var(--sf-geist);
    font-weight: 300;
    font-size: 16px;
    line-height: 1 !important;    /* texto centrado verticalmente, sin alto extra */
    letter-spacing: 0;
    text-align: center;
    box-shadow: none !important;
    transition: color .3s ease;
}
.spora-form .spora-submit:hover input[type="submit"] {
    color: var(--sf-dark) !important;
}
/* CF7 inserta un <span class="wpcf7-spinner"> justo tras el [submit], DENTRO de
   .spora-submit. Aunque va con visibility:hidden, ocupa 24px en el flujo y
   engordaba el botón. Además .spora-submit lleva overflow:hidden (recorta el
   relleno deslizante), así que un spinner a su izquierda se recortaría.
   Solución: un wrapper SIN recorte alrededor del botón; un poco de JS
   (Spora.relocateFormSpinner) mueve el spinner del interior del botón a este
   wrapper, y aquí lo colocamos a la IZQUIERDA, fuera del botón y en absolute
   (no desplaza el botón). */
.spora-form .spora-submit-wrap {
    position: relative;
    display: inline-flex;         /* ajusta al botón SIN hueco de línea base */
    align-items: center;
    flex: 0 0 auto;               /* item de la fila inferior */
    line-height: 0;               /* refuerzo anti-hueco */
}
.spora-form .spora-submit-wrap .wpcf7-spinner {
    position: absolute;
    top: 50%;
    right: calc(100% + 16px);     /* a la izquierda del botón, fuera de él */
    transform: translateY(-50%);
    margin: 0;
    background-color: var(--sf-dark);   /* visible sobre el fondo claro */
}

/* ---------- Mensajes de validación de CF7 ---------- */
.spora-form .wpcf7-not-valid-tip {
    font-family: var(--sf-geist);
    font-weight: 300;
    font-size: 12px;
    margin-top: 4px;
}

/* ---------- Responsive ---------- */
@media (max-width: 600px) {
    /* En móvil los radios no caben en una línea y saltan a otra; el tope de
       45px los recortaba y la 2ª línea se solapaba con el campo Nombre. Se
       libera SOLO en móvil para que el contenedor crezca y empuje el campo. */
    .spora-form .spora-form__radios {
        max-height: none;
    }
    .spora-form .wpcf7-radio {
        gap: 28px;
    }
    .spora-form .spora-form__bottom {
        flex-wrap: wrap;
        gap: 24px;
    }
}


/*
  ============================================================================
  SPORA — Formulario: botón de ADJUNTAR archivo + variante "trabaja"/oscuro
  ----------------------------------------------------------------------------
  Reutiliza toda la base .spora-form. Aquí se añade:
    1) Estilo compartido del texto de botón (.spora-btn-text) y el input file
       oculto, para que el botón "Adjuntar archivo pdf" tenga el mismo relleno
       deslizante que el de Enviar.
    2) La fila del campo CV (.spora-field--file).
    3) La variante .spora-form--invert (fondo oscuro): todo en blanco (#FFFFFF)
       y botones con efecto INVERSO (base blanco/texto oscuro; hover: negro,
       contorno blanco, texto blanco).
  Plantilla: inc/cf7-formulari-treballa.txt
  ============================================================================
*/

/* ---------- Texto de botón compartido (Enviar e input file) ---------- */
.spora-form .spora-submit .spora-btn-text {
    position: relative;
    z-index: 2;
    display: block;
    padding: 9px 0px;
    color: var(--spora-color-neutral-white);
    font-family: var(--sf-geist);
    font-weight: 300;
    font-size: 16px;
    line-height: 1;
    letter-spacing: 0;
    text-align: center;
    transition: color .3s ease;
    pointer-events: none;         /* el clic pasa al input file (por encima) */
    width: 203px;
}

/* Input file real: cubre el botón, invisible pero clicable */
/* CF7 declara .wpcf7-form-control-wrap con position:relative; si se deja, el
   input file (absolute) se ancla a ese wrapper —que colapsa a 0×0— y la zona
   clicable desaparece. Lo neutralizamos para que el input se ancle al botón. */
.spora-form .spora-file .wpcf7-form-control-wrap {
    position: static;
    display: block;
}
.spora-form .spora-submit input[type="file"] {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    opacity: 0;
    cursor: pointer;
    z-index: 3;
}

/* ---------- Campo CV: label a la izquierda, botón a la derecha ---------- */
.spora-form .spora-field--file {
    flex-direction: row;
    justify-content: space-between;
    gap: 24px;
    border-bottom: 1px solid var(--sf-line);
    padding-bottom: 40px;
}
.spora-form .spora-field--file .spora-label {
    order: 0;
    margin: 0;
}
.spora-form .spora-file {
    flex: 0 0 auto;
}

/* ============================================================================
   VARIANTE .spora-form--invert (fondo oscuro, todo en blanco)
   ============================================================================ */
.spora-form.spora-form--invert {
    --sf-line: rgba(255, 255, 255, 0.4);   /* líneas/subrayados en blanco */
    color: var(--spora-color-neutral-white);
}

/* Textos en blanco */
.spora-form--invert .wpcf7-radio .wpcf7-list-item-label,
.spora-form--invert .spora-label,
.spora-form--invert input[type="text"],
.spora-form--invert input[type="email"],
.spora-form--invert input[type="tel"],
.spora-form--invert textarea,
.spora-form--invert .wpcf7-acceptance .wpcf7-list-item-label,
.spora-form--invert .wpcf7-acceptance a {
    color: var(--spora-color-neutral-white);
}
.spora-form--invert ::placeholder {
    color: var(--spora-color-neutral-white);
    opacity: 0.5;
}
.spora-form--invert input:focus,
.spora-form--invert textarea:focus {
    border-bottom-color: var(--spora-color-neutral-white);
}

/* Radios en blanco (relleno blanco al marcar) */
.spora-form--invert input[type="radio"] {
    border-color: var(--spora-color-neutral-white) !important;
}
.spora-form--invert input[type="radio"]:checked {
    background-color: var(--spora-color-neutral-white);
}

/* Checkbox en blanco: relleno blanco + check OSCURO */
.spora-form--invert input[type="checkbox"] {
    border-color: var(--spora-color-neutral-white) !important;
}
.spora-form--invert input[type="checkbox"]:checked {
    background-color: var(--spora-color-neutral-white);
    background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2012%2012'%3E%3Cpath%20d='M2.5%206.2l2.2%202.2%204.8-5'%20fill='none'%20stroke='%23001A17'%20stroke-width='1.4'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* Botones INVERSOS: base relleno blanco + texto oscuro;
   al hover el relleno blanco se desliza y queda negro con contorno y texto
   blancos (el contorno blanco ya está siempre; en reposo queda oculto por el
   relleno blanco). */
.spora-form--invert .spora-submit {
    border-color: var(--spora-color-neutral-white);
}
.spora-form--invert .spora-submit::before {
    background-color: var(--spora-color-neutral-white);
}
.spora-form--invert .spora-submit input[type="submit"],
.spora-form--invert .spora-submit .spora-btn-text {
    color: var(--sf-dark) !important;      /* texto oscuro sobre relleno blanco */
}
.spora-form--invert .spora-submit:hover input[type="submit"],
.spora-form--invert .spora-submit:hover .spora-btn-text {
    color: var(--spora-color-neutral-white) !important;   /* texto blanco al hover */
}

/* Spinner visible sobre el fondo oscuro */
.spora-form--invert .spora-submit-wrap .wpcf7-spinner {
    background-color: var(--spora-color-neutral-white);
}

/* Mensajes de CF7 sobre fondo oscuro.
   El aviso general (.wpcf7-response-output) se coloca dentro del formulario con
   el tag [response] en la plantilla, para que este CSS lo alcance.
   Éxito/estado neutro -> blanco. Errores -> rojo (más brillante que el #dc3232
   de CF7 para que se lea sobre el verde oscuro). */
.spora-form--invert .wpcf7-response-output {
    color: var(--spora-color-neutral-white);
    border-color: rgba(255, 255, 255, 0.4);
}
/* Avisos por campo: siempre en rojo */
.spora-form--invert .wpcf7-not-valid-tip {
    color: #ff5a5a;
}
/* Aviso general en estados de ERROR: rojo (texto y borde) */
.wpcf7-form.invalid    .spora-form--invert .wpcf7-response-output,
.wpcf7-form.unaccepted .spora-form--invert .wpcf7-response-output,
.wpcf7-form.spam       .spora-form--invert .wpcf7-response-output,
.wpcf7-form.aborted    .spora-form--invert .wpcf7-response-output,
.wpcf7-form.failed     .spora-form--invert .wpcf7-response-output {
    color: #ff5a5a;
    border-color: #ff5a5a;
}

/* ---------- Dos aceptaciones (newsletter + privacidad) en fila ---------- */
.spora-form .spora-acceptances {
    display: flex;
    gap: 50px;
}
.spora-form .spora-acceptances .wpcf7-list-item-label {
    max-width: 240px;             /* envuelve en varias líneas como el diseño */
}
/* El bloque del newsletter lleva más texto: le damos más ancho que el de
   privacidad (apuntando a su data-name). Ajusta el valor a tu gusto. */
.spora-form .spora-acceptances [data-name="newsletter"] .wpcf7-list-item-label {
    max-width: 340px;
}

/* ==========================================================================
   Slider responsive REUTILIZABLE (Spora.responsiveSlider)
   --------------------------------------------------------------------------
   Markup GENÉRICO que monta el JS (assets/js/utils.js) SOLO en tablet/móvil
   (<=921px) sobre cualquier contenedor con la clase `spora-slider`. Cada
   bloque solo se marca; el aspecto se afina con variables CSS por bloque:

     --spora-slider-slide      ancho de cada diapositiva (deja "asomar" la
                               siguiente). Por defecto 80%.
     --spora-slider-gap        separación entre diapositivas. Por defecto 16px.
     --spora-slider-track-bg   color del carril de la barra de progreso y,
                               si no hay --spora-slider-dot-color, de los
                               puntos inactivos.
     --spora-slider-bar-bg     color de la barra de progreso y, si no hay
                               --spora-slider-dot-active-color, del punto activo.
     --spora-slider-progress   `none` (por defecto) o `block`: muestra la barra
                               de progreso. Oculta desde 2026-10-08, cuando los
                               puntos la sustituyeron en todos los sliders.
     --spora-slider-arrow-color  color de las flechas (opt-in con el atributo
                                 `data-slider-arrows`). Por defecto, el del texto.
     --spora-slider-nav-gap      espacio entre las flechas y el carrusel.
     --spora-slider-dot-color         punto inactivo. Los puntos salen en todos
                                      los sliders; `data-slider-dots="off"` los quita.
     --spora-slider-dot-active-color  punto activo.
     --spora-slider-dots-gap          espacio entre el carrusel y los puntos.

   Ejemplo en un bloque:  .mi-bloque { --spora-slider-slide: 72%; }
   ========================================================================== */

/* Viewport = ventana con scroll horizontal + snap táctil. La barra de scroll
   nativa se oculta (la posición la comunica nuestra barra de progreso). */
.spora-slider__viewport {
	overflow-x: auto;
	overflow-y: hidden;
	scroll-snap-type: x mandatory;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;              /* Firefox */
	-ms-overflow-style: none;           /* IE/Edge antiguo */
}

.spora-slider__viewport::-webkit-scrollbar {
	display: none;                      /* Chrome/Safari */
}

/* Pista = fila flex con las diapositivas. */
.spora-slider__track {
	display: flex;
	gap: var(--spora-slider-gap, 16px);
	align-items: stretch;
}

/* Cada diapositiva: ancho fijo (deja asomar la siguiente) y punto de anclaje
   del snap. min-width:0 evita que el contenido las estire. */
.spora-slider__track > * {
	flex: 0 0 var(--spora-slider-slide, 80%);
	min-width: 0;
	scroll-snap-align: start;
}

/* Barra de progreso: carril fino con un pulgar que refleja la posición. El JS
   fija width/translateX del pulgar en píxeles. */
.spora-slider__progress {
	position: relative;
	height: 3px;
	margin-top: 22px;
	border-radius: 100px;
	background: var(--spora-slider-track-bg, rgba(0, 0, 0, 0.12));
	overflow: hidden;
	/* Oculta por defecto: la sustituyen los puntos. `block` la recupera, en un
	   bloque o aquí para todos. */
	display: var(--spora-slider-progress, none);
}

.spora-slider__bar {
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	width: 40px;                        /* valor inicial; lo ajusta el JS */
	border-radius: 100px;
	background: var(--spora-slider-bar-bg, var(--wp--preset--color--spora-black, #000000));
	will-change: transform;
}

/* Flechas anterior / siguiente (solo si el contenedor lleva data-slider-arrows).
   Alineadas a la derecha, encima del carrusel. Los resets de fondo, borde y
   sombra son contra los estilos de <button> de Astra, que pintan un botón de
   color en :hover/:focus. Apagada (extremo del carrusel) = gris tenue. */
.spora-slider__nav {
	display: flex;
	justify-content: flex-end;
	gap: 8px;
	margin-bottom: var(--spora-slider-nav-gap, 24px);
}

.spora-slider__nav .spora-slider__arrow,
.spora-slider__nav .spora-slider__arrow:hover,
.spora-slider__nav .spora-slider__arrow:focus {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	padding: 0;
	margin: 0;
	border: 0;
	border-radius: 0;
	background: transparent;
	box-shadow: none;
	color: var(--spora-slider-arrow-color, currentColor);
	cursor: pointer;
	transition: opacity 0.2s ease;
}

.spora-slider__nav .spora-slider__arrow:focus-visible {
	outline: 1px solid currentColor;
	outline-offset: 2px;
}

.spora-slider__nav .spora-slider__arrow:disabled {
	opacity: 0.3;
	cursor: default;
}

/* Puntos estilo Instagram (en todos los sliders salvo data-slider-dots="off"). El JS
   solo pone clases: is-active, is-md / is-sm (encogidos por la distancia a la
   ventana visible) e is-hidden. Los ocultos van a ancho y margen 0 en vez de
   display:none para que entren y salgan animados y la fila se recentre sola. */
.spora-slider__dots {
	display: flex;
	justify-content: center;
	align-items: center;
	height: 6px;
	margin-top: var(--spora-slider-dots-gap, 32px);
}

.spora-slider__dot {
	flex: 0 0 auto;
	width: 6px;
	height: 6px;
	margin: 0 4px;
	border-radius: 50%;
	background: var(--spora-slider-dot-color, var(--spora-slider-track-bg, rgba(0, 0, 0, 0.15)));
	transition: width 0.25s ease, height 0.25s ease, margin 0.25s ease, background-color 0.25s ease;
}

.spora-slider__dot.is-active {
	background: var(--spora-slider-dot-active-color, var(--spora-slider-bar-bg, var(--wp--preset--color--spora-black, #000000)));
}

.spora-slider__dot.is-md {
	width: 4px;
	height: 4px;
}

.spora-slider__dot.is-sm {
	width: 2.5px;
	height: 2.5px;
}

.spora-slider__dot.is-hidden {
	width: 0;
	height: 0;
	margin: 0;
}

@media (prefers-reduced-motion: reduce) {
	.spora-slider__dot {
		transition: none;
	}
}

/*
  ============================================================================
  Override del gutter de Astra
  ----------------------------------------------------------------------------
  Astra pone padding-left/right: 20px a todos sus .ast-container /
  .ast-container-fluid (assets/css/minified/main.min.css). Aquí lo anulamos
  globalmente. Esta hoja depende de 'astra-theme-css', así que carga después y
  gana por orden con la misma especificidad.
  ============================================================================
*/
.ast-container,
.ast-container-fluid {
	padding-left: 0;
	padding-right: 0;
}

/* Astra calcula el max-width de .ast-container como ancho de contenido + 40px
   (class-astra-dynamic-css.php), porque contaba con esos 20px de padding a cada
   lado. Al anularlo arriba, los 40px pasaban a ser contenido y el header medía
   1480px en vez de los 1440px del diseño (detectado el 2026-10-01). */
.ast-container {
	max-width: 1440px;
}

/*
  ============================================================================
  ENLACE DE TEXTO — subrayado animado  ·  .spora-text-link
  ----------------------------------------------------------------------------
  Utilidad OPT-IN para enlaces DENTRO de texto (en un <h1>, <p>, <li>…), al
  estilo del <a class="u-text-link"> de forgooddesignlab.com. El subrayado se
  DIBUJA de izquierda a derecha la PRIMERA vez que el enlace entra en pantalla
  (IntersectionObserver en assets/js/utils.js -> Spora.textLinkUnderline, que
  añade .is-underlined una sola vez por enlace). Al pasar el ratón, el subrayado
  hace un "barrido": sale por la derecha y vuelve a entrar por la izquierda.

  Uso:
    <h1>… idea que va a <a href="#" class="spora-text-link"><em>cambiar el
    mundo.</em></a></h1>

  Degradación: sin JS (o sin IntersectionObserver) el subrayado se muestra fijo
  desde el principio, para que el enlace SIEMPRE se reconozca como tal. La
  animación solo se activa cuando <html> lleva la clase .spora-underline-anim,
  que un script en línea de <head> (functions.php -> spora_underline_anim_head)
  añade ANTES del primer render, evitando parpadeos. Con prefers-reduced-motion
  el subrayado aparece sin animación.
  ============================================================================
*/

.spora-text-link {
	position: relative;
	color: inherit;
	text-decoration: none;
}

/* El subrayado es una barra propia (::after), no text-decoration, para poder
   animar su escala. currentColor -> hereda el color del texto del enlace. */
.spora-text-link::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 100%;
	height: 1px;
	background-color: currentColor;
	transform: scaleX(1);            /* por defecto (sin JS): subrayado visible */
	transform-origin: left center;
}

/* Variante con subrayado doble: una linea FINA fija (::after, la de siempre)
   y encima una linea GRUESA (::before) que es la que se mueve: entra barriendo
   por la izquierda al hacer hover, con la misma curva que el resto de
   subrayados. Las dos comparten eje central (bottom + height/2 = 4.5px) para
   que la gruesa tape a la fina justo por el centro. Enteros para evitar el
   antialiasing que hacia parecer unas lineas mas gruesas que otras. */
html.spora-underline-anim .spora-stk-underlined.spora-text-link::after,
.spora-stk-underlined.spora-text-link::after {
    bottom: 4px;
    height: 1px;
}

/* La fina no barre en hover: se queda fija. */
html.spora-underline-anim .spora-stk-underlined.spora-text-link.is-underlined:hover::after,
.spora-stk-underlined.spora-text-link:hover::after {
    animation: none;
}

.spora-stk-underlined.spora-text-link::before {
	content: "";
	position: absolute;
	left: 0;
	bottom: 3px;
	width: 100%;
	height: 3px;
	background-color: currentColor;
	transform: scaleX(0);
	transform-origin: left center;
	transition: transform 0.55s cubic-bezier(0.16, 1, 0.3, 1);
}

.spora-stk-underlined.spora-text-link:hover::before {
	transform: scaleX(1);
}

@media (prefers-reduced-motion: reduce) {
	.spora-stk-underlined.spora-text-link::before {
		transition: none;
	}
}

/* Con JS + IntersectionObserver: parte oculto y se dibuja al entrar en pantalla. */
html.spora-underline-anim .spora-text-link::after {
	transform: scaleX(0);
	transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
}

html.spora-underline-anim .spora-text-link.is-underlined::after {
	transform: scaleX(1);
}

/* Hover: barrido (sale por la derecha, entra por la izquierda). Solo cuando ya
   está dibujado (.is-underlined), para no pisar la animación de aparición. */
html.spora-underline-anim .spora-text-link.is-underlined:hover::after {
	animation: spora-underline-rewipe 1s cubic-bezier(0.16, 1, 0.3, 1);
}

@keyframes spora-underline-rewipe {
	0%    { transform: scaleX(1); transform-origin: right center; }
	45%   { transform: scaleX(0); transform-origin: right center; } /* fuera por la derecha */
	45.1% { transform: scaleX(0); transform-origin: left center; }  /* salta el origen */
	100%  { transform: scaleX(1); transform-origin: left center; }  /* entra por la izquierda */
}

/* Accesibilidad: sin movimiento si el usuario lo ha desactivado. El subrayado
   se muestra igual, pero sin dibujarse ni barrer. */
@media (prefers-reduced-motion: reduce) {
	html.spora-underline-anim .spora-text-link::after {
		transition: none;
	}
	html.spora-underline-anim .spora-text-link.is-underlined:hover::after {
		animation: none;
	}
}

/* Modificador reutilizable: subrayado SOLO en hover.
   Añádelo junto a .spora-text-link (p. ej. class="spora-text-link
   spora-text-link--hover") en cualquier enlace donde NO quieras el subrayado
   dibujado al entrar en pantalla, sino que aparezca (creciendo desde la
   izquierda) únicamente al pasar el ratón. Se usa en todo el footer. */
html.spora-underline-anim .spora-text-link.spora-text-link--hover.is-underlined::after {
	transform: scaleX(0);
	transform-origin: left center;
}

html.spora-underline-anim .spora-text-link.spora-text-link--hover:hover::after,
html.spora-underline-anim .spora-text-link.spora-text-link--hover.is-underlined:hover::after {
	transform: scaleX(1);
	transform-origin: left center;
	animation: none;
}

/*
  ============================================================================
  SPORA — Reveal escalonat (aparició en scroll)   [reutilitzable, tot el lloc]
  ----------------------------------------------------------------------------
  Sistema genèric d'aparició d'elements en entrar al viewport, amb escalonat.
  L'usa qualsevol bloc que marqui (des del seu render.php):
    · el contenidor amb  data-spora-reveal="<mode>"  (+ data-reveal-dir i
      l'estil en línia --reveal-stagger, en ms).
    · cada element a animar amb la classe  .spora-reveal-item  i un índex en
      línia --reveal-i (0,1,2…) per a l'escalonat.
  Modes: fade · slide · zoom · blur · mask · flip · drop. Direccions: up/down/left/right
  (slide, mask i flip; zoom l'aplica subtilment; fade, blur i drop no en fan cas).

  El JS (assets/js/utils.js -> Spora.reveal) observa el contenidor i, en entrar,
  li afegeix .is-revealed; el retard de cada element = --reveal-i * --reveal-stagger.

  PROGRESSIU: l'estat ocult només s'aplica sota html.spora-reveal-anim (la posa
  un script de <head> només si hi ha IntersectionObserver). Sense JS/suport, o
  amb «prefers-reduced-motion», els elements es veuen normals des del principi.
  ============================================================================
*/
html.spora-reveal-anim [data-spora-reveal]:not([data-spora-reveal="none"]) .spora-reveal-item {
	--reveal-duration: 800ms;
	--reveal-ease: cubic-bezier(0.16, 1, 0.3, 1);
	--reveal-delay: calc(var(--reveal-i, 0) * var(--reveal-stagger, 90) * 1ms);
	opacity: 0;
	transition:
		opacity var(--reveal-duration) var(--reveal-ease) var(--reveal-delay),
		transform var(--reveal-duration) var(--reveal-ease) var(--reveal-delay),
		filter var(--reveal-duration) var(--reveal-ease) var(--reveal-delay),
		clip-path var(--reveal-duration) var(--reveal-ease) var(--reveal-delay);
	will-change: opacity, transform;
}

/* --- Mode: lliscar (translació + fosa) ----------------------------------- */
html.spora-reveal-anim [data-spora-reveal="slide"][data-reveal-dir="up"]    .spora-reveal-item { transform: translateY(44px); }
html.spora-reveal-anim [data-spora-reveal="slide"][data-reveal-dir="down"]  .spora-reveal-item { transform: translateY(-44px); }
html.spora-reveal-anim [data-spora-reveal="slide"][data-reveal-dir="left"]  .spora-reveal-item { transform: translateX(44px); }
html.spora-reveal-anim [data-spora-reveal="slide"][data-reveal-dir="right"] .spora-reveal-item { transform: translateX(-44px); }

/* --- Mode: zoom (escala + fosa), amb lliscar subtil segons direcció ------ */
html.spora-reveal-anim [data-spora-reveal="zoom"] .spora-reveal-item { transform: scale(0.86); }
html.spora-reveal-anim [data-spora-reveal="zoom"][data-reveal-dir="up"]    .spora-reveal-item { transform: scale(0.9) translateY(30px); }
html.spora-reveal-anim [data-spora-reveal="zoom"][data-reveal-dir="down"]  .spora-reveal-item { transform: scale(0.9) translateY(-30px); }
html.spora-reveal-anim [data-spora-reveal="zoom"][data-reveal-dir="left"]  .spora-reveal-item { transform: scale(0.9) translateX(30px); }
html.spora-reveal-anim [data-spora-reveal="zoom"][data-reveal-dir="right"] .spora-reveal-item { transform: scale(0.9) translateX(-30px); }

/* --- Mode: desenfoc (blur + fosa + lleu escala) — sense direcció --------- */
html.spora-reveal-anim [data-spora-reveal="blur"] .spora-reveal-item { filter: blur(16px); transform: scale(1.04); }

/* --- Mode: cortina (clip-path) — la direcció marca cap on descobreix ----- */
html.spora-reveal-anim [data-spora-reveal="mask"] .spora-reveal-item { opacity: 1; }
html.spora-reveal-anim [data-spora-reveal="mask"][data-reveal-dir="up"]    .spora-reveal-item { clip-path: inset(100% 0 0 0); }
html.spora-reveal-anim [data-spora-reveal="mask"][data-reveal-dir="down"]  .spora-reveal-item { clip-path: inset(0 0 100% 0); }
html.spora-reveal-anim [data-spora-reveal="mask"][data-reveal-dir="right"] .spora-reveal-item { clip-path: inset(0 100% 0 0); }
html.spora-reveal-anim [data-spora-reveal="mask"][data-reveal-dir="left"]  .spora-reveal-item { clip-path: inset(0 0 0 100%); }

/* --- Mode: gir 3D (rotació + lliscar + fosa) ----------------------------- */
html.spora-reveal-anim [data-spora-reveal="flip"] .spora-reveal-item { transform-origin: center; }
html.spora-reveal-anim [data-spora-reveal="flip"][data-reveal-dir="up"]    .spora-reveal-item { transform: perspective(900px) rotateX(-20deg) translateY(30px); }
html.spora-reveal-anim [data-spora-reveal="flip"][data-reveal-dir="down"]  .spora-reveal-item { transform: perspective(900px) rotateX(20deg) translateY(-30px); }
html.spora-reveal-anim [data-spora-reveal="flip"][data-reveal-dir="left"]  .spora-reveal-item { transform: perspective(900px) rotateY(20deg) translateX(30px); }
html.spora-reveal-anim [data-spora-reveal="flip"][data-reveal-dir="right"] .spora-reveal-item { transform: perspective(900px) rotateY(-20deg) translateX(-30px); }

/* --- Mode: caiguda (drop) — cada element cau des de dalt fins al seu lloc --
   Pensat per a graelles de targetes (equip-grid, 2026-09-30: el client volia
   que les fotos «caiguessin» primer les del centre i després les laterals, en
   forma de V). Recorregut llarg i durada més alta que la resta perquè es
   llegeixi com una caiguda i no com un lliscar; l'easing és de desacceleració
   pura (sense rebot) perquè aterri suau. La fosa va més curta que el moviment:
   si durés igual, la targeta seria invisible a dalt de tot i semblaria que
   apareix ja a baix. Sense direcció (sempre avall).

   Ordre: si el bloc dona --reveal-drop-i (equip-grid el calcula per distància
   a la columna central, vegeu el seu render.php), s'usa aquest índex; si no,
   el --reveal-i seqüencial de sempre.

   El selector repeteix [data-spora-reveal] a propòsit: la regla base del
   sistema té especificitat (0,4,1) i, sense això, la seva `transition` i les
   seves variables trepitjaven les d'aquest mode. */
html.spora-reveal-anim [data-spora-reveal][data-spora-reveal="drop"] .spora-reveal-item {
	--reveal-duration: 1400ms;
	--reveal-ease: cubic-bezier(0.22, 1, 0.36, 1);
	--reveal-delay: calc(var(--reveal-drop-i, var(--reveal-i, 0)) * var(--reveal-stagger, 90) * 1ms);
	transform: translate3d(0, -160px, 0);
	transition:
		opacity 700ms ease-out var(--reveal-delay),
		transform var(--reveal-duration) var(--reveal-ease) var(--reveal-delay);
}

/* Estat final (revelat): tot torna a la posició/nitidesa natural. Va DESPRÉS de
   tots els modes perquè, a igualtat d'especificitat, guanyi per ordre de font. */
html.spora-reveal-anim [data-spora-reveal].is-revealed .spora-reveal-item {
	opacity: 1;
	transform: none;
	filter: none;
	clip-path: inset(0 0 0 0);
}

/* Accessibilitat: sense moviment si l'usuari ho demana. */
@media (prefers-reduced-motion: reduce) {
	html.spora-reveal-anim [data-spora-reveal] .spora-reveal-item {
		opacity: 1 !important;
		transform: none !important;
		filter: none !important;
		clip-path: none !important;
		transition: none !important;
	}
}

/*
  ============================================================================
  SINGLE DE SERVEI EMPRESA — lienzo base de las fichas por bloques
  ----------------------------------------------------------------------------
  El single d'Empresa se compone con bloques propios insertados en el contenido
  de cada servei (hero, dues columnes, acordió, metodologia, projectes
  relacionats). single-servei.php marca esas fichas con .spora-servei--blocs en
  el <article> y NO pinta ni migas ni cabecera: manda la composición de bloques.

  Aquí solo se prepara el LIENZO: contenido a sangre, sin gutter ni max-width
  heredados. Los anchos y los paddings de cada sección los pone el CONTENEDOR
  DE SPECTRA (legacy) dentro del cual va cada bloque; los bloques de Spora no
  llevan caja propia y ocupan el 100% de lo que ese contenedor les dé.
  ============================================================================
*/

/* Contenido a sangre: cada contenedor de Spectra se pinta a ancho completo y
   se encarga por su cuenta de fondo, márgenes y paddings. */
.spora-servei--blocs .spora-servei__content {
	max-width: none;
	margin: 0;
	padding: 0;
}

/* Los bloques traen sus propios márgenes verticales: el <article> no añade
   separación por arriba (el hero arranca pegado a la cabecera del sitio). */
.spora-servei--blocs {
	margin-top: 0;
}

/*
  ============================================================================
  SINGLE DE PROJECTE EMPRESA — lienzo base de las fichas por bloques
  ----------------------------------------------------------------------------
  El single d'Empresa se compone con CONTENEDORES DE SPECTRA insertados en el
  contenido de cada projecte, con bloques de Spora dentro (las cites son
  spora/scroll-opacity-text y el índice es spora/anchor-flotante).
  single-projecte.php marca esas fichas con .spora-projecte--blocs en el
  <article> y no pinta migas desde la plantilla: las lleva dentro el hero,
  centradas con el título.

  Aquí solo se prepara el LIENZO: contenido a sangre, sin gutter ni max-width
  heredados. Los anchos, fondos y paddings de cada sección los pone el
  contenedor de Spectra correspondiente (igual que en las fichas de servei);
  los bloques de Spora no llevan caja propia y ocupan el 100% de lo que ese
  contenedor les dé.
  ============================================================================
*/

/* Contenido a sangre: cada contenedor de Spectra se pinta a ancho completo y
   se encarga por su cuenta de fondo, márgenes y paddings. */
.spora-projecte--blocs .spora-projecte__content {
	max-width: none;
	margin: 0;
	padding: 0;
}

/* Los contenedores traen sus propios márgenes verticales: el <article> no añade
   separación por arriba (el hero arranca pegado a la cabecera del sitio). */
.spora-projecte--blocs {
	margin-top: 0;
}

/* (.hentry { margin-bottom: 0 } ya está declarado más abajo, global.) */

/*
  ============================================================================
  Ficha de projecte — hero editorial centrado (LAS DOS ÁREAS)
  ----------------------------------------------------------------------------
  Estructura en template-parts/projecte-header.php: migas (con el servei) +
  título + cliente + subtítulo, apilados y centrados, y debajo la imagen
  destacada.

  Empresa y Administració comparten TODO el hero. Lo único que cambia es el
  formato de la imagen, marcado en el <figure>:
    · .spora-projecte-hero__media--empresa -> casi a sangre (formato de base).
    · .spora-projecte-hero__media--admin   -> cuadrada de 320x320, centrada.

  El <figure> es HERMANO del <header>, no hijo: es lo que permite que la
  cabecera se quede fija en toda la ficha (ver «Cabecera FIJA» más abajo). Sin
  imagen destacada no se pinta y no se reserva hueco.
  ============================================================================
*/

.spora-projecte-hero__head {
	box-sizing: border-box;
	width: 100%;
	max-width: 1440px;
	margin-inline: auto;
	/* padding-top (no margin en las migas) para que el hueco superior viaje
	   dentro de la caja cuando el bloque se queda fijo; ver __breadcrumbs. */
	padding: clamp(56px, 7vw, 100px) clamp(32px, 5vw, 72px) 0;
	text-align: center;
}

/* Las migas ya vienen centradas por 'align' => 'center'; aquí solo el aire.
   OJO: el hueco de ARRIBA lo pone el padding-top del __head, no el margin de
   las migas. Con margin, al ser el primer hijo, se colapsaba FUERA de la caja
   del __head: al pegarse arriba (sticky) ese hueco desaparecía de golpe y las
   migas daban un salto. Como padding va dentro de la caja y viaja con ella. */
.spora-projecte-hero__breadcrumbs {
	margin: 0 0 clamp(24px, 3vw, 40px);
}

.spora-projecte-hero__title {
	margin: 0 auto;
	/* Rotura natural a dos líneas: se limita la medida y se equilibran las
	   líneas, en vez de meter un <br> a mano en el título del post. */
	max-width: 30ch;
	/* Geist Light, no la display. El !important es necesario, no decorativo:
	   hay una regla global `h1 { font-family: var(--spora-font-family-display)
	   !important }` (más arriba en esta hoja) y un selector de clase la pierde.
	   Mismo caso que la excepción de h4. */
	font-family: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif !important;
	font-size: 48px;
	font-weight: 300;
	line-height: 100%;
	letter-spacing: -1px;
	text-wrap: balance;
	color: var(--spora-color-primary-dark-green);
}

.spora-projecte-hero__client {
	margin: 15px 0 0;
	font-size: var(--spora-text-caption-regular-size);
	font-weight: 500;
	text-transform: uppercase;
	color: var(--spora-color-primary-dark-green);
}

/* Subtítulo (campo ACF `subtitol`), en la serif display y gris. Ocupa el hueco
   donde antes iban los serveis relacionats, que ahora van en las migas. Medida
   corta + balance para que rompa en dos líneas parejas, como en el diseño. */
.spora-projecte-hero__subtitol {
	max-width: 44ch;
	margin: 15px auto 0;
	font-family: var(--spora-font-family-display);
	font-size: var(--spora-text-body-regular-size);
	font-weight: 300;
	line-height: 1.25;
	text-wrap: balance;
	color: var(--spora-color-neutral-black-40);
}

/* Imagen destacada: casi a sangre, con márgenes laterales pequeños. Es el
   formato de EMPRESA y el de base; Administració lo pisa más abajo. */
.spora-projecte-hero__media {
	margin: clamp(40px, 8vw, 140px) 0 0;
	padding-inline: 32px;
}

.spora-projecte-hero__img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--spora-radius-card);
}

/* --- Administració: imagen cuadrada de 320x320, centrada ------------------
   Único cambio de formato entre las dos áreas; todo lo demás del hero (y la
   plantilla, y el lienzo) es idéntico. Se recorta con object-fit en vez de
   deformar, así que sirve cualquier proporción de origen.

   El área se marca en el propio <figure> (__media--admin) y NO se hereda del
   <header>: el <figure> va fuera del <header> para que la persiana funcione
   (ver «Cabecera FIJA» más abajo), así que un selector de descendencia desde
   .spora-projecte-hero--admin no lo alcanzaría. */
.spora-projecte-hero__media--admin {
	display: flex;
	justify-content: center;
}

.spora-projecte-hero__media--admin .spora-projecte-hero__img {
	width: 320px;
	/* En pantallas más estrechas que la propia imagen manda el ancho
	   disponible; con object-fit sigue recortando y no se deforma. */
	max-width: 100%;
	height: 320px;
	object-fit: cover;
}

/*
  --- Cabecera FIJA — EFECTO PERSIANA ---------------------------------------
  La cabecera (migas + título + cliente + subtítulo) se queda QUIETA y no se mueve
  NUNCA en toda la ficha. Primero sube la imagen destacada por encima, y después
  el contenido, que ya la tapa del todo. Como una persiana. Es el espejo del
  efecto del footer (.spora-footer-reveal), pero aquí no hace falta clip-path ni
  track: basta position:sticky y apilado explícito.

    · <header>  -> sticky, z-index 0: se queda pegado.
    · __media   -> position:relative, z-index 1 y SIN FONDO: sube la imagen sola
                   por encima de la cabecera. Nada de fondo opaco aquí, o se
                   vería subir un bloque blanco en vez de la imagen.
    · content   -> position:relative, z-index 1 y FONDO OPACO: es lo que tapa la
                   cabecera de verdad. El fondo es imprescindible; sin él el
                   texto de la cabecera se vería por los huecos entre secciones.

  DÓNDE ESTÁ EL TRUCO: el sticky lo limita el PADRE del elemento pegado, y el
  padre del <header> es el <article> —toda la ficha—, así que aguanta hasta el
  final. Para eso el <figure> de la imagen tiene que ir FUERA del <header>
  (ver template-parts/projecte-header.php). Cuando estaba dentro, el padre era
  el <header>, que crecía con la imagen, y la cabecera se soltaba en cuanto la
  imagen acababa de pasar: el efecto solo se veía al principio.

  Sin imagen destacada no hay <figure> ni hueco reservado, y la tapa
  directamente el contenido. Mismo CSS, sin caso especial.

  Lo único que el CSS no puede calcular es DÓNDE pegarse: lo publica
  Spora.projecteStickyHead en --spora-hero-head-top (ver assets/js/utils.js).
*/
.spora-projecte-hero {
	position: sticky;
	/* Se pega EN SU SITIO: --spora-hero-head-top es la distancia natural del
	   hero al top del documento (la barra del sitio, que va en flujo), medida
	   por Spora.projecteStickyHead. Así la cabecera no se mueve NI UN PÍXEL al
	   hacer scroll; con top:0 subiría primero hasta el borde y solo entonces se
	   quedaría, y se vería el salto. */
	top: var(--spora-hero-head-top, 0px);
	z-index: 0;
}

.spora-projecte-hero__media {
	position: relative;
	z-index: 1;
}

.spora-projecte--blocs .spora-projecte__content {
	position: relative;
	z-index: 1;
	background-color: var(--spora-color-neutral-white, #FFFFFF);
}

/* --- Administració: FUNDIDO en el borde superior del contenido -------------
   Con la imagen pequeña (320x320) quedan a los lados grandes huecos por donde
   se ve la cabecera fija, y el borde recto del fondo blanco del contenido se
   veía CORTANDO el texto al subir (petición del 2026-09-30). Se sustituye ese
   corte por un degradado transparente -> blanco pegado encima del contenido.

   El degradado es un ::before del contenido que sobresale POR ARRIBA
   (bottom:100%), así que se solapa con el <figure> sin mover nada de sitio.
   Para que no lave la parte baja de la foto, el <figure> sube a z-index 2: la
   imagen queda por encima del degradado y este solo se ve a sus lados, sobre
   la cabecera. En Empresa no hace falta: la imagen va casi a sangre y ya tapa
   la cabecera de lado a lado. */
.spora-projecte--administracio .spora-projecte-hero__media {
	z-index: 2;
}

.spora-projecte--administracio {
	--spora-projecte-fade-h: clamp(96px, 12vw, 180px);
}

.spora-projecte--administracio.spora-projecte--blocs .spora-projecte__content::before {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: 100%;
	height: var(--spora-projecte-fade-h);
	background: linear-gradient(
		to bottom,
		rgba(255, 255, 255, 0),
		var(--spora-color-neutral-white, #FFFFFF)
	);
	pointer-events: none;
}

/* SIN IMAGEN DESTACADA (bug del 2026-10-03): el fundido sobresale por arriba
   del contenido, y sin el <figure> de por medio caía JUSTO encima del título y
   el cliente y los dejaba medio borrados en reposo. Se separa el contenido
   exactamente la altura del fundido: en reposo el degradado queda sobre el
   hueco vacío y, al hacer scroll, sigue tapando la cabecera con el mismo
   fundido. Con imagen no cambia nada. La clase la pone single-projecte.php. */
.spora-projecte--administracio.spora-projecte--sense-imatge .spora-projecte__content {
	margin-top: var(--spora-projecte-fade-h);
}

/* En MÓVIL se desactiva, igual que el reveal del footer (<=767px): la cabecera
   apilada ocupa casi toda la pantalla y el efecto se come la ficha. Sin
   persiana tampoco hay corte que disimular, así que fuera el fundido (y el
   hueco que se le reserva cuando no hay imagen). */
@media (max-width: 767px) {
	.spora-projecte-hero {
		position: static;
	}

	.spora-projecte--administracio.spora-projecte--blocs .spora-projecte__content::before {
		content: none;
	}

	.spora-projecte--administracio.spora-projecte--sense-imatge .spora-projecte__content {
		margin-top: 0;
	}
}

/*
  ============================================================================
  Ficha de projecte d'agència (CPT `agencia`) — hero de projecte en OSCURO
  ----------------------------------------------------------------------------
  template-parts/agencia-header.php reutiliza el marcado y las clases del hero
  de projecte (layout centrado, imagen casi a sangre y cabecera FIJA con
  persiana, todo lo de arriba), así que aquí solo va lo que cambia:

    · Tipografía del diseño (2026-10-01), siempre:
        migas    Geist 300 12px / 1.3 / 0
        título   Geist 300 48px / 0.9 / -1%
        cliente  Geist 600 14px / 1.3 / 0
        subtítol Geist 400 14px / 1.3 / 0   (pegado debajo del cliente)
    · Colores (migas en groc Spora, título blanco, meta en blanco al 40%):
      SOLO con body.spora-dark-mode. Las agències nacen en oscuro
      (inc/dark-mode.php), pero si alguien lo desactiva en una ficha no puede
      quedar texto blanco sobre fondo blanco: cae a los colores del projecte.
  ============================================================================
*/
.spora-projecte-hero--agencia .spora-projecte-hero__breadcrumbs {
	font-family: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
	font-size: 12px;
	font-weight: 300;
	line-height: 1.3;
	letter-spacing: 0;
}

.spora-projecte-hero--agencia .spora-projecte-hero__title {
	/* La familia (Geist con !important) ya la pone .spora-projecte-hero__title. */
	line-height: 0.9;
	letter-spacing: -0.01em;
}

.spora-projecte-hero--agencia .spora-projecte-hero__meta {
	margin-top: 32px;
}

.spora-projecte-hero--agencia .spora-projecte-hero__client,
.spora-projecte-hero--agencia .spora-projecte-hero__subtitol {
	max-width: none;
	margin: 0;
	font-family: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
	font-size: 14px;
	line-height: 1.3;
	letter-spacing: 0;
	text-transform: uppercase;
}

.spora-projecte-hero--agencia .spora-projecte-hero__client {
	font-weight: 600;
}

.spora-projecte-hero--agencia .spora-projecte-hero__subtitol {
	font-weight: 400;
}

/* --- Imagen destacada: mismo formato que en projectes d'Empresa ---
   En Empresa el alto sale de la propia foto (height:auto), y allí se suben
   apaisadas de 1376x641. En agència se reaprovechan las fotos de las tarjetas,
   que son cuadradas (874x874), y a todo el ancho salían casi tan altas como
   anchas (2026-10-01). Se fija la proporción de Empresa y se recorta con
   object-fit, así cualquier foto queda igual. El selector va por el <article>
   porque el <figure> está FUERA del <header> (ver agencia-header.php). */
.spora-projecte--agencia .spora-projecte-hero__img {
	aspect-ratio: 1376 / 641;
	object-fit: cover;
}

/* --- Colores en modo oscuro --- */
body.spora-dark-mode .spora-projecte-hero--agencia .spora-projecte-hero__breadcrumbs {
	color: var(--spora-color-accent-yellow);
}

body.spora-dark-mode .spora-projecte-hero--agencia .spora-projecte-hero__title {
	color: var(--spora-dark-ink);
}

body.spora-dark-mode .spora-projecte-hero--agencia .spora-projecte-hero__client,
body.spora-dark-mode .spora-projecte-hero--agencia .spora-projecte-hero__subtitol {
	color: rgba(255, 255, 255, 0.4);
}

/* El contenido es lo que TAPA la cabecera fija y por eso lleva fondo opaco
   blanco (ver «Cabecera FIJA»). En una ficha oscura ese blanco se vería como
   una franja: pasa al fondo oscuro de la página. Vale para cualquier ficha por
   bloques en modo oscuro, no solo agències. */
body.spora-dark-mode .spora-projecte--blocs .spora-projecte__content {
	background-color: var(--spora-dark-bg);
}

.hentry {
    margin-bottom: 0 !important;
}

/* =========================================================================
   SCROLL SUAVE GLOBAL (Lenis)
   =========================================================================
   Hoja de estilos mínima que necesita Lenis (dist/lenis.css, vendorizada aquí
   para no añadir otra petición). La librería se encola en functions.php y
   arranca en assets/js/utils.js -> Spora.smoothScroll(); mientras está activa,
   marca <html> con .lenis / .lenis-smooth / .lenis-scrolling / .lenis-stopped.

   - height:auto en html/body: Lenis necesita que el documento crezca con su
     contenido (un alto fijo del 100% rompería el cálculo del recorrido).
   - .lenis-stopped: bloquea el scroll cuando se llama a lenis.stop().
   - [data-lenis-prevent]: zonas con su propio scroll interno (p. ej. el modal
     de guías o la ficha del bloque expertise-map). Lenis ignora ahí el
     gesto y lo deja al navegador; overscroll-behavior evita que el rebote
     arrastre la página.
   - iframes inertes mientras se scrollea: si no, se comen el gesto y el
     desplazamiento se detiene al pasar por encima (mapas, vídeos embebidos).
   ========================================================================= */

html.lenis,
html.lenis body {
	height: auto;
}

.lenis:not(.lenis-autoToggle).lenis-stopped {
	overflow: clip;
}

.lenis [data-lenis-prevent],
.lenis [data-lenis-prevent-wheel],
.lenis [data-lenis-prevent-touch] {
	overscroll-behavior: contain;
}

.lenis.lenis-smooth iframe {
	pointer-events: none;
}

.lenis.lenis-autoToggle {
	transition-property: overflow;
	transition-duration: 1ms;
	transition-behavior: allow-discrete;
}

/* =========================================================================
   PÀGINA D'ENTRADES — llistat d'insights  ·  .spora-insl
   -------------------------------------------------------------------------
   Estils del template-part `template-parts/insights-llistat.php`, que pinta el
   cos de la pàgina d'entrades (home.php): barra de filtres per categoria +
   cercador, i graella de targetes d'insight.

   FONS I CONTENIDOR. La secció replica el contenidor «fons» del disseny (un
   uagb/container a sang): ample complet, degradat vertical de transparent a
   negre 5%, marge superior de 150px i 32px de padding lateral (10px en mòbil).

   LA TARGETA NO ÉS AQUÍ. Les seves regles (i les de la graella que les col·loca,
   amb les variables afinables: alçada, gap, columnes, ample de la imatge) viuen
   a `blocks/_shared/insight-card.css`, perquè les comparteix amb el bloc
   «Insights destacats» i han de sortir idèntiques. Aquí queda només el que és
   PROPI d'aquesta pàgina: el fons i l'aire de la secció. La barra de filtres,
   el cercador i l'estat buit són a `blocks/_shared/filter-bar.css` (els
   comparteix amb els blocs de projectes).

   Interacció:
   · Filtres: subratllat animat del tema (.spora-text-link--hover, veure la
     secció «ENLACE DE TEXTO» d'aquest mateix fitxer). L'actiu el manté fix.
   · Cercador: es veu «fluix» fins que s'enfoca o té text (.is-filled).
   ========================================================================= */

/* --- Secció de la pàgina d'entrades (fons i aire) ------------------------
   Només .spora-insl: el bloc no pinta fons ni aire de secció (el posa el
   contenidor de Spectra on el col·loquin). */
.spora-insl {
	/* Fons de secció, en TRES trams verticals:
	     1. Entrada: de transparent (el blanc de la capçalera) al gris inicial.
	        Ocupa exactament l'aire de sobre del contingut, de manera que el gris
	        no arrenca amb un cantell dur sota el header: hi entra fonent-se.
	     2. Gris inicial, just on comença la barra de filtres.
	     3. D'aquí a baix s'enfosqueix molt poc, prou perquè es noti la caiguda i
	        les targetes blanques retallin, sense que el peu es vegi brut.
	   Els extrems són negre amb molt poca opacitat, així el degradat funciona
	   sobre qualsevol fons de pàgina. */
	--spora-insl-bg-top: rgba(0, 0, 0, 0.03);
	--spora-insl-bg-bottom: rgba(0, 0, 0, 0.06);
	--spora-insl-bg: linear-gradient(
		180deg,
		rgba(0, 0, 0, 0) 0,
		var(--spora-insl-bg-top) var(--spora-insl-fade-top),
		var(--spora-insl-bg-bottom) 100%
	);
	/* Alçada del tram d'entrada (el fos blanc -> gris). És alhora l'aire que
	   queda sobre la barra de filtres: el fos i l'aire són el mateix tram, per
	   això és padding i no margin —amb margin el degradat començaria per sota i
	   el cantell tornaria a veure's. */
	--spora-insl-fade-top: 150px;
	/* Aire sota l'última fila de targetes, dins del degradat. */
	--spora-insl-pad-bottom: 200px;

	/* Ample: el que li doni el contenidor, que a la pàgina d'entrades és la
	   finestra sencera. NO es fa servir el truc habitual del 100vw + marges
	   negatius per treure la secció de la .ast-container d'Astra: el 100vw
	   inclou l'ample de la barra de desplaçament, la caixa sobresortia i, per
	   evitar la barra horitzontal, calia un `overflow` a l'arrel que ROMPIA el
	   `position: sticky` del reveal del footer (el footer desapareixia).

	   En comptes d'això, qui deixa anar el contenidor és el PHP: a la pàgina
	   d'entrades es força el layout «page-builder» d'Astra (veure
	   spora_insights_full_width_container() a functions.php), de manera que el
	   #primary ja ocupa tota la finestra i aquí no cal cap truc. */
	margin-top: 0;
	margin-bottom: 0;
	padding: var(--spora-insl-fade-top) 32px var(--spora-insl-pad-bottom);
	background: var(--spora-insl-bg);
}

/* --- Barra de filtres, cercador i estat buit -----------------------------
   Viuen a `blocks/_shared/filter-bar.css` (2026-10-06): la mateixa barra la fan
   servir ara també els blocs «Listado de projectes» (graella i taula), i
   l'editor no carrega aquest style.css, així que la previsualització dels blocs
   sortiria sense estils. Aquí només queda el fons i l'aire de la secció. */

/* --- Responsive ---------------------------------------------------------- */
@media (max-width: 600px) {
	.spora-insl {
		--spora-insl-pad-bottom: 120px;
		--spora-insl-fade-top: 100px;
		padding: var(--spora-insl-fade-top) 10px var(--spora-insl-pad-bottom);
	}
}

/* =========================================================================
   FICHA D'INSIGHT — capçalera sobre reixa de 12 columnes  ·  .spora-insight
   -------------------------------------------------------------------------
   Estils de single.php i de template-parts/insight-header.php (la ficha de les
   entrades del blog).

   LIENZO. Igual que a les fitxes de projecte i de servei, la plantilla només
   prepara el llenç: el CONTINGUT va a sang i cada contenidor de Spectra hi posa
   el seu ample, el seu fons i els seus paddings. La capçalera, en canvi, sí que
   porta caixa pròpia: s'encaixa a 1440px i es centra.

   REIXA. La capçalera es maqueta sobre 12 columnes dins d'aquests 1440px menys
   32px de padding a cada costat (1376 útils) i amb gutters de 24px —el mateix
   llenç que fa servir la resta del lloc:

     · data + temps de lectura -> apilats, a la COLUMNA 2.
     · títol                   -> de la COLUMNA 5 fins a la 12.

   Els dos blocs arrenquen a la mateixa alçada (align-items: start).

   Tipografia del disseny:
     · data / temps ... Geist 14 / 100% / 0, en tinta fluixa.
     · títol .......... STK Bureau Serif Light 48 / 100% / -1px, en majúscules.

   A la ficha NO es pinta la imatge destacada (només surt a les targetes del
   llistat) ni les molles de pa.
   ========================================================================= */

.spora-insight-hero {
	--spora-ih-cols: 12;
	--spora-ih-gap: 24px;
	--spora-ih-max-w: 1440px;
	--spora-ih-pad-x: 32px;
	--spora-ih-pad-top: clamp(96px, 12vw, 180px);
	--spora-ih-pad-bottom: clamp(56px, 6vw, 96px);
	/* Tinta principal (títol) i la seva versió «fluixa» (data i temps), les
	   mateixes que al llistat d'insights. */
	--spora-ih-ink: var(--wp--preset--color--spora-dark-green, #001A17);
	--spora-ih-ink-soft: #001A1730;
	--spora-ih-geist: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
	/* Alias amb NOMÉS la cara fina (Light 300); veure astra_child_font_faces_css. */
	--spora-ih-stk: 'STK Bureau Serif Light', 'STK Bureau Serif', Georgia, serif;
}

.spora-insight-hero__head {
	box-sizing: border-box;
	display: grid;
	grid-template-columns: repeat(var(--spora-ih-cols), minmax(0, 1fr));
	gap: var(--spora-ih-gap);
	/* Data i títol arrenquen a la mateixa línia de dalt. */
	align-items: start;
	width: 100%;
	max-width: var(--spora-ih-max-w);
	margin-inline: auto;
	padding: var(--spora-ih-pad-top) var(--spora-ih-pad-x) var(--spora-ih-pad-bottom);
}

/* --- Data + temps de lectura: apilats, a la columna 2 --------------------
   Ocupa DUES columnes: «19 / 12 / 2026» a Geist 14 mesura gairebé el mateix
   que una columna sencera i amb una sola es partiria de línia en algunes
   amplades. Com que el text va alineat a l'esquerra, visualment no canvia res. */
.spora-insight-hero__meta {
	grid-column: 2 / span 2;
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.spora-insight-hero__data,
.spora-insight-hero__temps {
	font-family: var(--spora-ih-geist);
	font-size: 14px;
	font-weight: 400;
	line-height: 1;
	letter-spacing: 0;
	color: var(--spora-ih-ink-soft);
}

.spora-insight-hero__temps {
	text-transform: uppercase;
}

/* --- Títol: de la columna 5 a la 12 -------------------------------------- */
.spora-insight-hero__title {
	grid-column: 5 / -1;
	margin: 0;
	/* STK Bureau Serif Light. El !important és necessari, no decoratiu: hi ha
	   una regla global `h1 { font-family: var(--spora-font-family-display)
	   !important }` (més amunt en aquesta fulla) i un selector de classe la
	   perdria. Mateix cas que el títol del hero de projecte. */
	font-family: var(--spora-ih-stk) !important;
	font-size: 48px;
	font-weight: 300;
	line-height: 100%;
	letter-spacing: -1px;
	text-transform: uppercase;
	color: var(--spora-ih-ink);
}

/* --- Apartat lliure: contingut a sang -----------------------------------
   Cada contenidor de Spectra es pinta a ample complet i hi posa el seu propi
   ample i els seus paddings (igual que a .spora-projecte--blocs). */
.spora-insight--blocs .spora-insight__content {
	max-width: none;
	margin: 0;
	padding: 0;
}

/* Els contenidors ja porten els seus marges verticals: l'<article> no afegeix
   separació per dalt (la capçalera arrenca enganxada a la barra del lloc). */
.spora-insight--blocs {
	margin-top: 0;
}

/* --- Responsive ---------------------------------------------------------- */
@media (max-width: 921px) {
	/* La reixa es desmunta: data i títol passen a ample complet, apilats. */
	.spora-insight-hero__meta,
	.spora-insight-hero__title {
		grid-column: 1 / -1;
	}

	.spora-insight-hero__title {
		margin-top: 32px;
	}
}

@media (max-width: 600px) {
	.spora-insight-hero {
		--spora-ih-pad-x: 10px;
		--spora-ih-pad-top: 80px;
	}

	.spora-insight-hero__title {
		font-size: 32px;
	}
}


/* =========================================================================
   MODAL DE GUIES — formulari abans de descarregar  ·  .spora-guia-modal
   -------------------------------------------------------------------------
   El pinta inc/guies.php (al peu, només a les pàgines que enllacen alguna
   guia) i el governa Spora.guies (utils.js). El formulari és CF7 amb
   html_class="spora-guia-form": mateix llenguatge que el del newsletter
   (camps sense caixa, només separador inferior), però en blanc sobre fosc.

   z-index 99999: per sobre del header sticky i per sota del cursor propi
   (#spora-cursor, al màxim), que s'ha de continuar veient al modal.
   ========================================================================= */
html.spora-guia-modal-open,
html.spora-guia-modal-open body {
    overflow: hidden;
}

.spora-guia-modal {
    --spora-gm-text: var(--spora-color-neutral-white);
    position: fixed;
    inset: 0;
    z-index: 99999;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: 120px 32px 80px;
    background: rgba(30, 30, 30, 0.88);
    -webkit-backdrop-filter: blur(14px);
    backdrop-filter: blur(14px);
    color: var(--spora-gm-text);
    opacity: 0;
    transition: opacity 0.25s ease;
}

.spora-guia-modal[hidden] {
    display: none;
}

.spora-guia-modal.is-open {
    opacity: 1;
}

.spora-guia-modal__inner {
    width: 100%;
    max-width: 712px;
    margin: auto 0;
}

/* Tancar: creu groga a dalt a la dreta. Els hover/focus en pla perquè Astra
   pinta fons i ombra a tot <button>. */
.spora-guia-modal .spora-guia-modal__close,
.spora-guia-modal .spora-guia-modal__close:hover,
.spora-guia-modal .spora-guia-modal__close:focus {
    position: fixed;
    top: 36px;
    right: 22px;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    padding: 0;
    border: 0;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
    color: var(--spora-color-accent-yellow);
    cursor: pointer;
}

.spora-guia-modal .spora-guia-modal__close:focus-visible {
    outline: 1px solid var(--spora-color-accent-yellow);
    outline-offset: 2px;
}

/* Títol: Geist Light amb trams en STK Bureau Serif cursiva (els <em>). */
.spora-guia-modal .spora-guia-modal__title {
    margin: 0 0 64px;
    font-family: inherit;
    font-weight: 300;
    font-size: 34px;
    line-height: 1.1;
    letter-spacing: 0;
    text-align: center;
    color: var(--spora-gm-text);
}

.spora-guia-modal__title em {
    font-family: var(--spora-font-family-display);
    font-style: italic;
    font-weight: 400;
}

.spora-guia-modal__titular {
    display: block;
}

.spora-guia-modal__hint {
    font-size: 14px;
    text-align: center;
    color: var(--spora-color-accent-yellow);
}

/* ---------- Camps ---------- */
.spora-guia-form .wpcf7-form-control-wrap {
    display: block;
}

.spora-guia-modal .spora-guia-form__input,
.spora-guia-modal .spora-guia-form__input:focus,
.spora-guia-modal .spora-guia-form__input:focus-visible {
    -webkit-appearance: none;
    appearance: none;
    box-sizing: border-box;
    display: block;
    width: 100%;
    margin: 0;
    padding: 12px 0;
    /* `border: 0` a tots els estats: l'opció d'accessibilitat d'Astra pinta
       un borde puntejat als quatre costats a input:focus (mateix cas que al
       formulari del newsletter). */
    border: 0;
    border-bottom: 1px solid var(--spora-gm-text);
    border-radius: 0;
    outline: none;
    background: transparent;
    box-shadow: none;
    font-family: inherit;
    font-weight: 400;
    font-size: 16px;
    line-height: 1.2;
    color: var(--spora-gm-text);
}

.spora-guia-modal .spora-guia-form__input:focus {
    border-bottom-width: 2px;
    padding-bottom: 11px; /* compensa el gruix: el camp no salta */
}

.spora-guia-modal .spora-guia-form__input::placeholder {
    color: var(--spora-gm-text);
    opacity: 1;
}

/* Autocompletar de Chrome: sense això omple el camp de fons blanc/groc. */
.spora-guia-modal .spora-guia-form__input:-webkit-autofill {
    -webkit-text-fill-color: var(--spora-gm-text);
    -webkit-box-shadow: 0 0 0 1000px #262626 inset;
    transition: background-color 9999s ease-out;
}

/* ---------- Tipus d'organització (radio) ---------- */
.spora-guia-form__tipus {
    padding: 14px 0;
    border-bottom: 1px solid var(--spora-gm-text);
}

.spora-guia-form__tipus .wpcf7-radio {
    display: flex;
    flex-wrap: wrap;
    gap: 10px 34px;
}

.spora-guia-form .wpcf7-list-item {
    margin: 0;
}

.spora-guia-form__tipus label {
    display: flex;
    align-items: center;
    gap: 9px;
    font-size: 16px;
    line-height: 1.2;
    cursor: pointer;
}

.spora-guia-modal .spora-guia-form__tipus input[type="radio"] {
    -webkit-appearance: none;
    appearance: none;
    flex: none;
    box-sizing: border-box;
    width: 14px;
    height: 14px;
    min-width: 14px;
    min-height: 14px;
    margin: 0;
    padding: 0;
    border: 1px solid var(--spora-gm-text);
    border-radius: 50%;
    background: transparent;
    box-shadow: none;
    cursor: pointer;
}

.spora-guia-modal .spora-guia-form__tipus input[type="radio"]:checked {
    background: radial-gradient(circle, var(--spora-gm-text) 0 3px, transparent 3.5px);
}

.spora-guia-modal .spora-guia-form__tipus input[type="radio"]:focus-visible {
    outline: 1px solid var(--spora-gm-text);
    outline-offset: 2px;
}

/* ---------- Consentiments ---------- */
.spora-guia-form__checks {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin: 40px 0 0;
}

.spora-guia-form .wpcf7-acceptance label {
    display: flex;
    align-items: center;
    gap: 14px;
    cursor: pointer;
}

.spora-guia-modal .spora-guia-form .wpcf7-acceptance input[type="checkbox"],
.spora-guia-modal .spora-guia-form .wpcf7-acceptance input[type="checkbox"]:focus {
    -webkit-appearance: none;
    appearance: none;
    flex: none;
    box-sizing: border-box;
    /* min/max: el navegador imposa 1.4em a les caselles amb appearance:none
       (mateix problema que al newsletter). */
    width: 26px;
    min-width: 26px;
    max-width: 26px;
    height: 16px;
    min-height: 16px;
    margin: 0;
    padding: 0;
    border: 1px solid rgba(255, 255, 255, 0.3);
    border-radius: 0;
    outline: none;
    background: transparent;
    box-shadow: none;
    cursor: pointer;
}

.spora-guia-modal .spora-guia-form .wpcf7-acceptance input[type="checkbox"]:checked {
    border-color: var(--spora-gm-text);
    background: var(--spora-gm-text) url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.5l3 3 5-6.5' fill='none' stroke='%23262626' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 12px 12px no-repeat;
}

.spora-guia-modal .spora-guia-form .wpcf7-acceptance input[type="checkbox"]:focus-visible {
    outline: 1px solid var(--spora-gm-text);
    outline-offset: 2px;
}

.spora-guia-form .wpcf7-acceptance .wpcf7-list-item-label {
    font-weight: 300;
    font-size: 14px;
    line-height: 1.2;
    color: rgba(255, 255, 255, 0.4);
}

.spora-guia-form .wpcf7-list-item-label a {
    color: inherit;
    text-decoration: underline;
}

/* ---------- Botó ---------- */
.spora-guia-modal .spora-guia-form__submit,
.spora-guia-modal .spora-guia-form__submit:hover,
.spora-guia-modal .spora-guia-form__submit:focus {
    -webkit-appearance: none;
    appearance: none;
    display: block;
    width: 100%;
    margin: 34px 0 0;
    padding: 29px 24px;
    border: 0;
    border-radius: 6px;
    background: var(--spora-color-neutral-white);
    box-shadow: none;
    color: var(--spora-color-neutral-black);
    font-family: inherit;
    font-weight: 500;
    font-size: 16px;
    line-height: 1.2;
    text-align: center;
    text-transform: none;
    cursor: pointer;
}

/* Mateix gest que els botons de les targetes de Recursos: serif cursiva. */
.spora-guia-modal .spora-guia-form__submit:hover {
    font-family: var(--spora-font-family-display);
    font-style: italic;
    font-weight: 400;
}

.spora-guia-modal .spora-guia-form__submit:disabled {
    opacity: 0.5;
    cursor: default;
}

/* ---------- Avisos de CF7 ---------- */
.spora-guia-modal .spora-guia-form .wpcf7-not-valid {
    border-bottom-color: #ff6b6b;
}

.spora-guia-form .wpcf7-not-valid-tip {
    display: block;
    margin: 6px 0 0;
    font-weight: 300;
    font-size: 12px;
    line-height: 1.2;
    color: #ff6b6b;
}

.spora-guia-modal .spora-guia-form .wpcf7-acceptance.wpcf7-not-valid input[type="checkbox"] {
    border-color: #ff6b6b;
}

.spora-guia-form .wpcf7-response-output {
    margin: 20px 0 0;
    padding: 0;
    border: 0;
    font-weight: 300;
    font-size: 14px;
    line-height: 1.3;
    text-align: center;
    color: var(--spora-gm-text);
}

.spora-guia-form.invalid .wpcf7-response-output,
.spora-guia-form.unaccepted .wpcf7-response-output,
.spora-guia-form.spam .wpcf7-response-output,
.spora-guia-form.aborted .wpcf7-response-output,
.spora-guia-form.failed .wpcf7-response-output {
    color: #ff6b6b;
}

.spora-guia-form .wpcf7-spinner {
    display: block;
    margin: 12px auto 0;
}

.spora-guia-form .wpcf7-turnstile {
    margin: 24px 0 0;
}

/* Honeypot de TOTS els formularis CF7 (inc/formularis.php): fora de la vista
   però no `display:none` (alguns bots se'l salten precisament si està amagat
   així). */
.spora-hp {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* --- Responsive ---------------------------------------------------------- */
@media (max-width: 600px) {
    .spora-guia-modal {
        padding: 88px 16px 48px;
    }

    .spora-guia-modal .spora-guia-modal__close,
    .spora-guia-modal .spora-guia-modal__close:hover,
    .spora-guia-modal .spora-guia-modal__close:focus {
        top: 20px;
        right: 10px;
    }

    .spora-guia-modal .spora-guia-modal__title {
        margin-bottom: 40px;
        font-size: 26px;
    }

    .spora-guia-modal .spora-guia-form__submit,
    .spora-guia-modal .spora-guia-form__submit:hover,
    .spora-guia-modal .spora-guia-form__submit:focus {
        padding: 22px 16px;
    }
}


/* =========================================================================
   COOKIEYES — banner i preferències amb l'estil Spora  ·  .cky-*
   -------------------------------------------------------------------------
   El plugin (cookie-law-info) pinta el banner amb els seus colors (blau
   #1863DC, cantonades rodones, ombra) i molts els posa INLINE als botons
   (style="color:…;background-color:…"), per això aquí van amb !important.

   · Banner (avís inicial): verd fosc, text blanc, botons quadrats en Geist
     Light. «Rebutjar» i «Acceptar» són IDÈNTICS (mateix pes visual: ho
     demana la guia de cookies de l'AEPD); «Personalitzar» en contorn.
   · Modal de preferències: blanc, text verd fosc, botons verd fosc.
   · Botó flotant de «revisitar consentiment» (la galeta amb el logo de
     CookieYes): AMAGAT. El substitueix l'enllaç «Configuració de cookies»
     del peu (spora_footer_render_legal, inc/footer.php): porta la classe
     body .cky-banner-element i el JS del plugin hi torna a obrir les preferències.
   · El cursor propi (#spora-cursor) queda per sobre de tot això (vegeu el
     seu z-index a CURSOR PERSONALIZADO).
   · Tots els selectors porten `body` davant: el CSS del plugin l'injecta el
     seu JS al <head> DESPRÉS d'aquest fitxer i, a igual especificitat,
     guanyaria ell.
   ========================================================================= */
body .cky-consent-container,
body .cky-modal {
    --spora-cky-geist: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
    font-family: var(--spora-cky-geist);
}

/* ---------- Botó flotant amb el logo de CookieYes: fora ---------- */
body .cky-btn-revisit-wrapper {
    display: none !important;
}

/* ---------- Fons fosc darrere del modal (com el modal de guies) ---------- */
body .cky-overlay {
    background: rgba(30, 30, 30, 0.88) !important;
    opacity: 1 !important;
    -webkit-backdrop-filter: blur(14px);
    backdrop-filter: blur(14px);
}

/* ---------- Banner ---------- */
body .cky-consent-container {
    border-radius: 0;
}

body .cky-consent-container .cky-consent-bar {
    padding: 28px 28px 24px;
    border: 0 !important;
    border-radius: 0;
    background-color: var(--spora-color-primary-dark-green) !important;
    box-shadow: 0 16px 48px rgba(0, 0, 0, 0.25);
    color: var(--spora-color-neutral-white);
}

body .cky-consent-container .cky-notice .cky-title {
    margin: 0 0 14px;
    font-family: var(--spora-font-family-display);
    font-style: italic;
    font-weight: 400;
    font-size: 26px;
    line-height: 1.1;
    color: var(--spora-color-neutral-white) !important;
}

body .cky-consent-container .cky-notice-des,
body .cky-consent-container .cky-notice-des p {
    font-family: var(--spora-cky-geist);
    font-weight: 300;
    font-size: 14px;
    line-height: 1.4;
    color: var(--spora-color-neutral-white) !important;
}

body .cky-consent-container .cky-notice-des a.cky-policy,
body .cky-consent-container .cky-notice-des button.cky-policy {
    border: 0 !important;
    color: var(--spora-color-accent-yellow) !important;
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* ---------- Botons (banner i modal) ----------
   Quadrats, Geist Light 14, sense l'opacity del hover del plugin. Astra pinta
   fons i ombra a tot <button>, per això també els :hover/:focus. */
body .cky-consent-container .cky-btn,
body .cky-modal .cky-btn {
    margin: 0 !important;
    padding: 10px 14px;
    border: 1px solid !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    font-family: var(--spora-cky-geist);
    font-weight: 300;
    font-size: 14px;
    line-height: 1.2;
    letter-spacing: 0;
    text-transform: none;
    opacity: 1 !important;
    transition: background-color .25s ease, color .25s ease, border-color .25s ease;
}

body .cky-consent-container .cky-notice-btn-wrapper {
    gap: 8px;
    margin-top: 20px;
}

/* Rebutjar i Acceptar: groc ple, text verd fosc. Hover: invers. */
body .cky-consent-container .cky-btn-reject,
body .cky-consent-container .cky-btn-accept {
    border-color: var(--spora-color-accent-yellow) !important;
    background-color: var(--spora-color-accent-yellow) !important;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-consent-container .cky-btn-reject:hover,
body .cky-consent-container .cky-btn-accept:hover,
body .cky-consent-container .cky-btn-reject:focus-visible,
body .cky-consent-container .cky-btn-accept:focus-visible {
    background-color: transparent !important;
    color: var(--spora-color-accent-yellow) !important;
}

/* Personalitzar: contorn blanc. Hover: blanc ple. */
body .cky-consent-container .cky-btn-customize {
    border-color: var(--spora-color-neutral-white) !important;
    background-color: transparent !important;
    color: var(--spora-color-neutral-white) !important;
}

body .cky-consent-container .cky-btn-customize:hover,
body .cky-consent-container .cky-btn-customize:focus-visible {
    background-color: var(--spora-color-neutral-white) !important;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-consent-container .cky-btn:focus-visible {
    outline: 1px solid var(--spora-color-accent-yellow);
    outline-offset: 2px;
}

/* ---------- Modal de preferències ---------- */
body .cky-modal {
    border-radius: 0;
    background: var(--spora-color-neutral-white);
}

/* Les línies interiors (capçalera, acordions, peu) hereten aquest
   border-color; el plugin el posa inline a #F4F4F4. */
body .cky-modal .cky-preference-center {
    border-radius: 0;
    border-color: var(--spora-color-primary-dark-green-40) !important;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-modal .cky-preference-header {
    padding: 22px 28px;
}

body .cky-modal .cky-preference-header .cky-preference-title {
    font-family: var(--spora-font-family-display);
    font-style: italic;
    font-weight: 400;
    font-size: 24px;
    line-height: 1.1;
    color: var(--spora-color-primary-dark-green) !important;
}

/* La creu del plugin és un SVG gris: la passem a negre. */
body .cky-modal .cky-btn-close,
body .cky-modal .cky-btn-close:hover,
body .cky-modal .cky-btn-close:focus {
    background: transparent !important;
    box-shadow: none !important;
}

body .cky-modal .cky-btn-close img {
    width: 14px;
    height: 14px;
    filter: brightness(0);
}

body .cky-modal .cky-preference-body-wrapper {
    padding-left: 28px;
    padding-right: 28px;
}

body .cky-modal .cky-preference-content-wrapper,
body .cky-modal .cky-preference-content-wrapper p,
body .cky-modal .cky-accordion-header-des,
body .cky-modal .cky-accordion-header-des p,
body .cky-modal .cky-audit-table {
    font-family: var(--spora-cky-geist);
    font-weight: 300;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-modal .cky-preference-content-wrapper .cky-show-desc-btn,
body .cky-modal .cky-preference-content-wrapper .cky-show-desc-btn:hover,
body .cky-modal .cky-preference-content-wrapper .cky-show-desc-btn:focus {
    background: transparent !important;
    box-shadow: none !important;
    font-weight: 400;
    color: var(--spora-color-primary-dark-green) !important;
    text-decoration: underline;
    text-underline-offset: 3px;
}

body .cky-modal .cky-accordion-header .cky-accordion-btn {
    font-family: var(--spora-cky-geist);
    font-weight: 400;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-modal .cky-accordion-header .cky-always-active {
    font-weight: 400;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-modal .cky-accordion .cky-accordion-chevron i::before {
    border-color: var(--spora-color-primary-dark-green);
}

body .cky-modal .cky-audit-table {
    border-radius: 0;
    background-color: var(--spora-color-neutral-light-gray) !important;
    border-color: var(--spora-color-neutral-light-gray) !important;
}

/* Interruptors: verd fosc actiu, verd fosc al 40 % inactiu (el plugin hi
   posa el blau inline). */
body .cky-modal .cky-switch input[type="checkbox"] {
    background-color: var(--spora-color-primary-dark-green-40) !important;
}

body .cky-modal .cky-switch input[type="checkbox"]:checked {
    background-color: var(--spora-color-primary-dark-green) !important;
}

/* Degradat que tapa el final de la llista: al blanc del modal. */
body .cky-modal .cky-footer-shadow {
    background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, var(--spora-color-neutral-white) 100%);
}

/* Peu del modal: tres botons iguals verd fosc. Hover: invers. */
body .cky-modal .cky-prefrence-btn-wrapper {
    gap: 8px;
    padding: 20px 28px;
}

body .cky-modal .cky-prefrence-btn-wrapper .cky-btn {
    border-color: var(--spora-color-primary-dark-green) !important;
    background-color: var(--spora-color-primary-dark-green) !important;
    color: var(--spora-color-neutral-white) !important;
}

body .cky-modal .cky-prefrence-btn-wrapper .cky-btn:hover,
body .cky-modal .cky-prefrence-btn-wrapper .cky-btn:focus-visible {
    background-color: transparent !important;
    color: var(--spora-color-primary-dark-green) !important;
}

body .cky-modal .cky-btn:focus-visible,
body .cky-modal .cky-btn-close:focus-visible,
body .cky-modal .cky-accordion-btn:focus-visible {
    outline: 1px solid var(--spora-color-primary-dark-green);
    outline-offset: 2px;
}

/* Mòbil: fins a 440px el plugin posa el padding lateral a cada peça del
   banner (0 24px) i apila els botons; aquí només el vertical. */
@media (max-width: 440px) {
    body .cky-consent-container .cky-consent-bar {
        padding: 24px 0 20px;
    }

    body .cky-consent-container .cky-notice-btn-wrapper {
        margin-top: 16px;
    }
}

@media (max-width: 576px) {
    body .cky-modal .cky-preference-header,
    body .cky-modal .cky-prefrence-btn-wrapper,
    body .cky-modal .cky-preference-body-wrapper {
        padding-left: 16px;
        padding-right: 16px;
    }
}
