/* ==========================================================================
   FUNDACIÓN PUNTO 37 — hoja base de Inicio y Nosotros
   --------------------------------------------------------------------------
   Trazada sobre el arte aprobado por el cliente:
     · FP37_WEB_INICIO/DISENOWEB_ajustes tamanos pag inicio.ai   (1440 / 768 / 375)
     · DISENOWEB_NOSOTROS_Carpeta 2/DISENOWEB_NOSOTROS.ai        (1440 / 768 / 375)
   Los colores salen del muestreo directo del arte y coinciden con el
   Punto37_BRANDBOOK.pdf. Las tipografías son las del brandbook —Oliviar Sans y
   Goodkids Rough— servidas desde /fuentes, no sustitutos de Google.
   ========================================================================== */

/* --- 1. TIPOGRAFÍAS DE MARCA ---------------------------------------------
   El sitio anterior declaraba Outfit y Plus Jakarta Sans: parecidas de lejos,
   pero ningún titular calzaba con el arte. Los OTF ya venían en el repo sin
   usar. Pesan 55-67 KB cada uno, así que se sirven tal cual sin convertir. */
@font-face {
   font-family: 'Oliviar Sans';
   src: url('fuentes/OliviarSans-Thin.woff2') format('woff2');
   font-weight: 200;
   font-style: normal;
   font-display: swap;
}

@font-face {
   font-family: 'Oliviar Sans';
   src: url('fuentes/OliviarSans-Light.woff2') format('woff2');
   font-weight: 300;
   font-style: normal;
   font-display: swap;
}

@font-face {
   font-family: 'Oliviar Sans';
   src: url('fuentes/OliviarSans-Regular.woff2') format('woff2');
   font-weight: 400;
   font-style: normal;
   font-display: swap;
}

@font-face {
   font-family: 'Oliviar Sans';
   src: url('fuentes/OliviarSans-Black.woff2') format('woff2');
   font-weight: 900;
   font-style: normal;
   font-display: swap;
}

/* La display manuscrita. En el arte aparece SOLO en cinco lugares: "NO LLEGAN",
   "compromiso", "APOYO", "Misión" y "BOLETÍN". No es una fuente de titulares
   general; usarla de más rompe la jerarquía que propone el diseño. */
@font-face {
   font-family: 'Goodkids';
   src: url('fuentes/Goodkids-Rough.woff2') format('woff2');
   font-weight: 400;
   font-style: normal;
   font-display: swap;
}

/* --- 2. TOKENS ------------------------------------------------------------
   Hex muestreados del .ai con promedio de parche de 28px, para no tomar un
   píxel de grano por color plano. Coinciden con el brandbook. */
:root {
   --rojo-hero: #FE1213;
   /* fondo del hero de Inicio (tonos del .ai) */
   --rojo: #FF3C00;
   /* rojo de marca: botones Dona */
   --rojo-hondo: #C81212;
   /* Rojo de la barra de redes. Se midio sobre la captura de referencia de la
     clienta en tres puntos distintos y da #DE0000 en los tres. No se reusa
     ninguno de los rojos de arriba porque ninguno coincide: --rojo-hero es mas
     claro y --rojo tira a naranja. */
   --rojo-barra: #DE0000;
   --coral: #FF4949;
   /* tile Cultura y Música */
   --azul: #00ACF9;
   /* tile Educación, bandas de cielo, Misión, brochazo NO LLEGAN */
   --azul-chip: #5BC0FB;
   /* chip de cifra del hero: medido sobre el .ai original */
   --rojo-chip: #E64040;
   /* chip del medio del hero de Inicio: Isaías pidió cambiarlo de azul a
     rojo; color muestreado directo del banner nuevo del cliente (centroide
     de los píxeles rojos del chip "1.000+"), no --rojo/--coral a ojo. */
   --azul-hondo: #3A81C7;
   /* centro del degradado del hero de Nosotros */
   --azul-claro: #69B5F0;
   --verde: #70CC03;
   /* tile Deporte */
   --verde-mapa: #97D953;
   --naranja: #FEAB00;
   /* tile Jornadas sociales */
   --morado: #A87DE5;
   /* tile Intervención rural */
   --morado-hondo: #492D91;
   /* Visión 2030 */
   --negro: #000;
   --gris-banda: #EFEFEF;
   --gris-marquee: #D2D2D2;

   --ancho: 1240px;
   --nav-alto: 78px;

   /* Grano: el arte tiene los fondos de color texturizados, no planos. Va como
     data-URI para que la página no dependa de ningún archivo extra. */
   --grano: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='g'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='160' height='160' filter='url(%23g)' opacity='0.5'/></svg>");

   /* Máscara de nube para fotos: unión de nueve círculos sobre un cuadrado.
     Es la forma con la que el arte recorta TODAS las fotos de programas.
     preserveAspectRatio='none' + mask-size:100% 100% la hace elástica. */
   /* Nube de las fotos. Antes los lobulos del medio iban en cy=18 y cy=82 con
     r=19: 18-19 = -1 y 82+19 = 101, o sea SE SALIAN del viewBox 0..100 y el
     recorte los dejaba planos ("la forma sale cortada en los bordes"). Ahora
     todos los circulos cumplen cx-r >= 0 y cy+r <= 100: quedan tangentes al
     borde como mucho, nunca cortados. Ocho lobulos, esquinas r=20 y medios
     r=19, con el cuerpo un poco mas chico para que la silueta no se aplane. */
   --nube-foto: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'><g fill='%23fff'><rect x='20' y='20' width='60' height='60' rx='8'/><circle cx='21' cy='21' r='20'/><circle cx='50' cy='20' r='19'/><circle cx='79' cy='21' r='20'/><circle cx='20' cy='50' r='19'/><circle cx='80' cy='50' r='19'/><circle cx='21' cy='79' r='20'/><circle cx='50' cy='80' r='19'/><circle cx='79' cy='79' r='20'/></g></svg>");

   /* Los chips de cifras del hero NO llevan la misma nube que las fotos: en el
     arte son cuatro lóbulos grandes (2×2), bastante más rotundos. */
   /* Chip de cifra. Tenia 4 circulos de r=29, que dan DOS lobulos por lado y ese
     perfil grueso que la clienta rechazo. En el .ai original cada lado muestra
     TRES lobulos, asi que van 8 circulos (4 esquinas + 4 puntos medios), con el
     radio subido a 23 para que la hendidura entre lobulo y lobulo quede honda y
     en punta como en el arte, no como una ondita. */
   /* Forma de la nube-chip EXTRAÍDA del .ai (DISENOWEB_ajustes tamanos pag inicio):
     cuatro lóbulos grandes en las esquinas y lados ligeramente cóncavos, no los
     mid-bumps convexos de la versión anterior. Se usa la silueta real como
     máscara para que coincida exactamente con el arte. */
   --nube-chip: url("img/cifra-nube.webp");

   /* Nube de tres lóbulos: la silueta con la que el arte de Nosotros presenta
     a los directivos (un lóbulo arriba, dos abajo, base redondeada). */
   /* Los tres lóbulos y la base tienen que SOLAPARSE. Con la base arrancando en
     y=55 quedaba un hueco de cuatro unidades entre los dos lóbulos bajos y el
     borde superior del rectángulo, justo en el centro: por ahí se veía el
     blanco de la página y cada retrato salía con un cuadrito blanco encima.
     La base sube a y=44 y llega hasta abajo. */
   --nube-retrato: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'><g fill='%23fff'><circle cx='50' cy='28' r='26'/><circle cx='24' cy='55' r='25'/><circle cx='76' cy='55' r='25'/><rect x='0' y='44' width='100' height='56' rx='14'/></g></svg>");
   /* Máscara-nube para la tarjeta ANCHA de Misión: lóbulos redondos repartidos
     por todo el perímetro. En el nosotros.ai la tarjeta azul tiene borde de
     nube festoneado blanco, no un contorno a trazos. */
   --nube-tarjeta: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 130' preserveAspectRatio='none'><g fill='%23fff'><rect x='16' y='16' width='168' height='98' rx='14'/><circle cx='16' cy='18' r='18'/><circle cx='16' cy='112' r='18'/><circle cx='40' cy='18' r='18'/><circle cx='40' cy='112' r='18'/><circle cx='64' cy='18' r='18'/><circle cx='64' cy='112' r='18'/><circle cx='88' cy='18' r='18'/><circle cx='88' cy='112' r='18'/><circle cx='112' cy='18' r='18'/><circle cx='112' cy='112' r='18'/><circle cx='136' cy='18' r='18'/><circle cx='136' cy='112' r='18'/><circle cx='160' cy='18' r='18'/><circle cx='160' cy='112' r='18'/><circle cx='184' cy='18' r='18'/><circle cx='184' cy='112' r='18'/><circle cx='18' cy='16' r='18'/><circle cx='182' cy='16' r='18'/><circle cx='18' cy='48.7' r='18'/><circle cx='182' cy='48.7' r='18'/><circle cx='18' cy='81.3' r='18'/><circle cx='182' cy='81.3' r='18'/><circle cx='18' cy='114' r='18'/><circle cx='182' cy='114' r='18'/></g></svg>");
}

/* --- 3. BASE -------------------------------------------------------------- */
*,
*::before,
*::after {
   box-sizing: border-box
}

html {
   scroll-behavior: smooth
}

@media (prefers-reduced-motion:reduce) {
   html {
      scroll-behavior: auto
   }
}

body {
   margin: 0;
   background: #fff;
   color: var(--negro);
   font-family: 'Oliviar Sans', system-ui, -apple-system, sans-serif;
   font-weight: 400;
   font-size: 17px;
   line-height: 1.5;
   -webkit-font-smoothing: antialiased;
   overflow-x: hidden;
   overflow-wrap: break-word;
   word-wrap: break-word;
}

img {
   max-width: 100%;
   display: block
}

a {
   color: inherit;
   text-decoration: none
}

button {
   font: inherit;
   color: inherit
}

h1,
h2,
h3,
h4 {
   margin: 0;
   font-weight: 900;
   line-height: 1.05
}

p {
   margin: 0 0 1em
}

.env {
   width: min(100% - 48px, var(--ancho));
   margin-inline: auto
}

.oculto {
   position: absolute;
   width: 1px;
   height: 1px;
   overflow: hidden;
   clip: rect(0 0 0 0);
   white-space: nowrap
}

.mano {
   font-family: 'Goodkids', cursive;
   font-weight: 400;
   line-height: .92
}

/* Salta al contenido: la nav es fija y sin esto el teclado queda atrapado. */
.saltar {
   position: absolute;
   left: 12px;
   top: -60px;
   z-index: 100;
   background: #fff;
   color: #000;
   padding: 10px 16px;
   border-radius: 10px;
   transition: top .16s;
}

.saltar:focus {
   top: 12px
}

:focus-visible {
   outline: 3px solid var(--azul);
   outline-offset: 3px
}

/* --- 4. BARRA DE REDES + NAV ----------------------------------------------
   La barra fina de redes va en ROJO, no en negro. El arte original la traia
   negra y asi se habia montado, pero la clienta pidio el cambio y mando la
   captura de referencia; el rojo medido ahi es --rojo-barra (#DE0000).
   Debajo va una pildora blanca flotante con los enlaces. La pildora NO ocupa
   todo el ancho: deja ver el fondo de color a ambos lados, y el boton Dona
   vive fuera de ella. */
.social-top {
   background: var(--rojo-barra);
   color: #fff;
   display: flex;
   justify-content: flex-end;
   align-items: center;
   gap: 18px;
   padding: 7px max(24px, calc((100vw - var(--ancho))/2));
   font-size: 13px;
}

.social-top a {
   display: grid;
   place-items: center;
   opacity: .9
}

.social-top a:hover {
   opacity: 1
}

.social-top svg {
   width: 15px;
   height: 15px;
   fill: currentColor
}

.cabecera {
   position: sticky;
   top: 0;
   z-index: 60;
   display: flex;
   align-items: center;
   gap: 20px;
   padding: 14px max(24px, calc((100vw - var(--ancho))/2));
   background: transparent;
   pointer-events: none;
}

.cabecera>* {
   pointer-events: auto
}

.marca {
   display: flex;
   align-items: center;
   flex: none;
   position: relative;
   z-index: 70;
}

.marca img,
.marca picture img {
   height: 52px;
   width: auto;
}

.hero-corte-pincel {
   position: absolute;
   bottom: 0;
   left: 0;
   width: 100%;
   height: 52px;
   background: url('img/hero-corte-pincel.webp') bottom center / 100% 100% no-repeat;
   pointer-events: none;
   z-index: 5;
}

.menu {
   flex: 1;
   display: flex;
   justify-content: center;
   align-items: center;
   gap: 34px;
   background: #fff;
   border-radius: 999px;
   padding: 16px 40px;
   margin: 0;
   list-style: none;
   box-shadow: 0 2px 14px rgba(0, 0, 0, .10);
}

.menu a {
   font-size: 16px;
   font-weight: 400;
   white-space: nowrap;
   padding: 4px 0
}

.menu a:hover {
   color: var(--rojo)
}

/* El enlace de la página actual (o la sección en vista) lleva un subrayado rojo
   corto, como en el arte. Sin JS: subrayado bajo aria-current (la página). Con
   JS (indicador.js marca html.js-nav): el subrayado lo lleva .nav-activo, que
   sigue a la sección en vista y vuelve a la página arriba. Ver indicador.js. */
.menu a[aria-current="page"],
.menu a.nav-activo {
   position: relative;
   font-weight: 400
}

html:not(.js-nav) .menu a[aria-current="page"]::after,
html.js-nav .menu a.nav-activo::after {
   content: "";
   position: absolute;
   left: 0;
   right: 0;
   bottom: -4px;
   height: 2px;
   background: var(--rojo);
}

.btn {
   display: inline-flex;
   align-items: center;
   justify-content: center;
   gap: 9px;
   border: 0;
   border-radius: 12px;
   cursor: pointer;
   font-weight: 900;
   letter-spacing: .01em;
   padding: 15px 26px;
   font-size: 17px;
   transition: transform .14s ease, box-shadow .14s ease;
}

.btn svg {
   width: 19px;
   height: 19px;
   fill: currentColor;
   flex: none
}

.btn-dona {
   background: var(--rojo);
   color: #fff;
   box-shadow: 0 3px 0 var(--rojo-hondo)
}

.btn-dona:hover {
   transform: translateY(-2px);
   box-shadow: 0 5px 0 var(--rojo-hondo)
}

.btn-dona:active {
   transform: translateY(1px);
   box-shadow: 0 1px 0 var(--rojo-hondo)
}

.btn-hueco {
   background: #fff;
   color: var(--negro);
   box-shadow: 0 0 0 2px var(--rojo) inset
}

.btn-hueco:hover {
   transform: translateY(-2px)
}

.cabecera .btn-dona {
   flex: none;
   font-size: 19px;
   padding: 15px 30px;
   border-radius: 14px
}

.hamburguesa {
   display: none
}

/* --- 5. BORDE DE NUBE (separador de secciones) ---------------------------
   El arte separa cada bloque de color con un festón de nubes, no con una
   línea recta. Se dibuja con tres pasadas del mismo trazo en fases distintas:
   la unión de las tres siluetas no tiene periodo, así que el borde se lee
   irregular en vez de repetido. Todas del mismo color, por eso lo que se ve
   es un contorno de nube y no capas superpuestas. */
.nube {
   position: absolute;
   left: -2px;
   width: calc(100% + 4px);
   height: 64px;
   display: block;
   z-index: 3;
   pointer-events: none;
}

/* Arriba: el festón lleva el color de SU sección y muerde hacia la de encima.
   Abajo: lleva el color de la sección SIGUIENTE y se apoya dentro de ésta, de
   modo que el canto lobulado quede mirando hacia abajo. Sin voltearlo: el
   trazo ya tiene la base plana en y=64, que es la que sella contra el borde. */
.nube-arriba {
   top: -62px
}

.nube-abajo {
   bottom: -1px
}

/* El festón del hero de Nosotros va BAJO y sutil (no semicírculos altos): se le
   da una altura corta para que los bumps queden poco pronunciados, como el .ai. */
.hero-nos .nube-feston {
   height: 22px
}

/* --- 6. HERO DE INICIO ---------------------------------------------------- */
.hero-inicio {
   position: relative;
   overflow: hidden;
   /* Fondo = banner real del cliente (FP37_banner_Moto): rojo con su textura/grano
     exactos. Así no hay diferencia de color/textura con la figura (que trae el
     mismo rojo del arte). Respaldo #F03424 por si la imagen tarda. */
   background: #F03424 url('img/hero-banner.webp') top center/cover no-repeat;
   margin-top: calc(-1 * var(--nav-alto) - 26px);
   /* Sin padding inferior: el hero termina justo en la rueda del niño, para que
     el corte de pincel (.hero-corte) y la nube del arte calcen con la figura y
     no quede una franja de rojo muerta debajo. El corte (alto ~60px, anclado al
     fondo) se solapa con la base de la rueda: el niño "entra" en la nube del
     corte, como en el .ai. */
   padding: calc(var(--nav-alto) + 74px) 0 0;
}

.hero-inicio::before {
   content: none;
}

/* el grano ya viene en el banner */
/* Titular y cifras ocupan la columna izquierda en dos filas; la figura ocupa
   la derecha entera. Se coloca explícitamente porque en tablet las cifras
   pasan a cruzar todo el ancho y con flujo automático no se podría. */
.hero-grid {
   position: relative;
   z-index: 2;
   display: grid;
   grid-template-columns: 1fr .84fr;
   gap: 14px 24px;
   /* La fila del titular es `auto` (mide lo que el texto) y la de las cifras es
     `1fr`. Antes ambas eran implicitas y la figura del nino, que abarca las dos,
     las hacia crecer por igual: el sobrante caia como hueco ENTRE el titular y
     las cifras, que es lo que la clienta marco como "demasiado espacio". Ahora
     todo el sobrante lo absorbe la fila 1fr POR DEBAJO de las cifras, asi el
     titular y las cifras quedan pegados arriba a la izquierda y la figura llena
     su columna a la derecha. */
   grid-template-rows: auto 1fr;
   align-items: start;
}

.hero-txt {
   grid-column: 1;
   grid-row: 1;
   /* En el .ai el titular arranca más hacia el centro, no pegado al borde
      izquierdo del hero (ver nota en hero.css sobre la nube y el "cambio 7").
      clamp en vez de un valor fijo: crece con el ancho igual que el resto
      del hero, y se anula en el apilado de móvil (@600px) donde el titular
      vuelve a quedar centrado como el resto de las filas. */
   padding-left: clamp(28px, 8vw, 130px);
   position: relative;
}

/* Titular como imagen (BANNER INICIO_TEXTO.png, recortado a su bbox real:
   es el arte a mano completo "LLEGAMOS A DONDE OTROS NO LLEGAN" en blanco
   sobre transparente, no garabatos sueltos — a simple vista en un visor con
   fondo blanco el texto blanco se pierde y parece que sólo trae los acentos
   de color). El h1 real queda oculto (.oculto en el HTML) para SEO/lectores
   de pantalla, igual que .apoyo-plantilla. */
.hero-titulo-img {
   display: block;
   width: min(100%, clamp(200px, 22vw, 340px));
   height: auto;
   /* -70px: otros 30px más a la izquierda (era -40px) */
   margin-left: -70px;
   /* +30px: bajado 30px total (15+15) según ajuste visual 2026-08-24 */
   margin-top: 30px;
}

.hero-grid .cifras {
   grid-column: 1;
   grid-row: 2;
   /* Las cifras se subieron al reducir el título (la fila auto encogió).
      Se bajan con align-self:end para que queden pegadas al fondo de su fila. */
   align-self: end;
   padding-bottom: 24px;
}

/* La figura sigue abarcando las dos filas para llenar la columna derecha, pero
   se centra sola contra ellas sin estirarlas. */
.hero-figura {
   grid-column: 2;
   grid-row: 1 / span 2;
   align-self: center
}

.hero-capas .capa-arte {
   position: relative !important;
   z-index: 1 !important;
   transform: translateX(-60px);
}

.hero-capas .capa-sombra {
   position: absolute !important;
   top: 0;
   left: 0;
   width: 100%;
   height: auto;
   z-index: 2 !important;
}

.hero-capas .capa-nino {
   position: absolute !important;
   top: 0;
   left: 0;
   width: 100%;
   height: auto;
   z-index: 5 !important;
}

.hero-capas .capa-casco {
   position: absolute !important;
   top: 0;
   left: 0;
   width: 100%;
   height: auto;
   z-index: 6 !important;
}

.hero-inicio h1 {
   color: #fff;
   font-size: clamp(40px, 4.6vw, 66px);
   letter-spacing: -.01em;
}

/* En el arte sólo la primera línea va en Oliviar Black. "otros" y "NO LLEGAN"
   están escritas con la manuscrita Goodkids, y la segunda sobre un brochazo
   azul. Es la jerarquía del titular: dos registros, no uno. */
/* "Llegamos hasta donde" en DOS líneas y compactas, como el arte. line-height
   corto para que las dos líneas queden pegadas. */
.hero-inicio h1 .liviana {
   font-weight: 900;
   display: block;
   font-size: .92em;
   line-height: 1.08
}

/* "otros" y "NO LLEGAN" se meten hacia arriba para encimarse con la línea de
   arriba (el arte los solapa, no los separa). */
.hero-inicio h1 .grande {
   display: block;
   font-size: 1.9em;
   line-height: .82;
   margin-top: -.08em
}

/* El brochazo es el trazo de pincel del propio arte, no un rectángulo con las
   esquinas mordidas: tiene cerdas y bordes rotos que ningún clip-path imita.
   Va como fondo del propio elemento —no en un ::before con insets— para que
   se estire exactamente con la caja del texto, mida lo que mida. */
.brochazo {
   display: inline-block;
   font-size: 1.62em;
   line-height: .92;
   letter-spacing: .012em;
   margin-top: -.14em;
   text-transform: uppercase;
   padding: .02em .2em .18em;
   background: url('img/brochazo.webp') center/100% 100% no-repeat;
}

/* Cada tramo de la palabra sube por su cuenta, con su propio span + transform,
   sin tocar el padding de .brochazo (que estiraría distinto el fondo 100% 100%
   si se usara para esto). "gan" quieto en su ajuste ya aprobado; "no lle" sube
   aparte. */
.brochazo-base {
   display: inline-block;
   transform: translateY(-.1em);
}

.brochazo-alza {
   display: inline-block;
   transform: translateY(-.13em);
}

.cifras {
   display: flex;
   gap: 14px;
   margin-top: 20px;
   flex-wrap: wrap
}

/* La forma de nube va en un ::before (detrás), NO como máscara del contenido.
   Antes se enmascaraba toda la .cifra, así que el texto pegado a los bordes
   cóncavos de la nube se RECORTABA por abajo. Ahora la nube es el fondo y el
   número/etiqueta van encima (z-index 1), sin recortarse nunca. */
.cifra {
   position: relative;
   width: 198px;
   aspect-ratio: 1/.96;
   display: grid;
   place-content: center;
   text-align: center;
   gap: 1px;
   color: var(--azul);
   padding: 10px 20px;
   background: transparent !important;
   background-image: none !important;
   box-shadow: none !important;
}

.cifra::before {
   content: "";
   position: absolute;
   inset: 0;
   z-index: 0;
   background: #fff;
   -webkit-mask-image: var(--nube-chip);
   mask-image: var(--nube-chip);
   -webkit-mask-size: 100% 100%;
   mask-size: 100% 100%;
   -webkit-mask-repeat: no-repeat;
   mask-repeat: no-repeat;
}

.cifra b,
.cifra span {
   position: relative;
   z-index: 1
}

/* El chip del medio iba en azul (--azul-chip); Isaías pidió cambiarlo a rojo
   como único cambio a este bloque — el contador animado y el resto de la
   nube de cifras siguen exactamente igual que siempre. */
.cifra:nth-child(2) {
   color: #fff
}

.cifra:nth-child(2)::before {
   background: var(--rojo-chip)
}

/* La cifra va en la tipografia de brochazo, no en la sans en peso 900. En el
   arte se ven las motas de textura dentro de los trazos, que es justo lo que
   distingue a Goodkids de una geometrica engordada. */
.cifra b {
   display: block;
   font-family: 'Goodkids', cursive;
   font-weight: 400;
   font-size: 47px;
   line-height: .9;
   letter-spacing: .01em;
}

/* La etiqueta va en Oliviar Black (peso 900), como el arte: redondeada y con
   cuerpo, no en regular. */
.cifra span {
   font-size: 15.5px;
   font-weight: 900;
   line-height: 1.12;
   color: var(--negro)
}

.cifra:nth-child(2) span {
   color: #fff
}

/* La figura del hero son dos capas: el line-art del arte original detrás y el
   niño recortado delante. El niño se ancla abajo a la derecha del trazo, que
   es la relación que tienen en el .ai. */
.hero-figura {
   margin: 0;
   justify-self: end;
   align-self: center;
   width: 100%
}

.hero-figura img {
   width: 100%;
   height: auto;
   display: block
}

/* nubes blancas en las esquinas del hero */
.nube-esquina {
   position: absolute;
   z-index: 2;
   color: #fff;
   pointer-events: none
}

.nube-esquina svg {
   display: block;
   width: 100%;
   height: auto
}

/* La nube de arriba a la izquierda es grande: el logo se posa dentro de ella.
   La de abajo a la derecha acompaña al botón Dona flotante y es más chica. */
.nube-esquina.ne-izq {
   top: -14px;
   left: -34px;
   width: min(330px, 34vw)
}

.nube-esquina.ne-der {
   bottom: -30px;
   right: -46px;
   width: min(250px, 26vw)
}

/* --- 7. BANDA "EMPEZÓ CON UN GESTO" --------------------------------------- */
.gesto {
   text-align: center;
   padding: 96px 0 76px;
   background: #fff
}

.gesto h2 {
   font-size: clamp(30px, 3.4vw, 44px);
   font-weight: 400;
   line-height: 1.04
}

.gesto h2 b {
   display: block;
   font-weight: 900;
   font-size: 1.12em;
   margin-top: .02em
}

/* COMPROMISO más grande (pedido de la clienta) y las líneas más juntas: la
   manuscrita Goodkids pesa poco de alto, así que a igual font-size se veía casi
   como "se volvió un". Se sube el tamaño y se le come el interlineado con un
   margin-top negativo para quitar el "mucho espacio entre líneas" que marcó. */
.gesto h2 .mano {
   display: inline-block;
   color: var(--coral);
   font-size: clamp(72px, 9vw, 132px);
   line-height: .9;
   margin-top: -.17em;
   position: relative;
}

/* Estrellita dorada del .ai: una grande + una pequeña de compañía, apoyadas
   SOBRE la última O de "compromiso". */
.chispas {
   position: absolute;
   top: .10em;
   right: -.40em;
   width: .45em;
   height: .120em;
   pointer-events: none;
}

.chispas svg {
   position: absolute;
   fill: var(--naranja, #FFA800);
}

.chispas .chispa-g {
   width: .34em;
   height: .34em;
   top: .08em;
   left: 0;
}

.chispas .chispa-p {
   width: .20em;
   height: .20em;
   top: 0;
   right: 0;
}

.gesto .liga {
   display: inline-block;
   margin-top: 18px;
   font-size: 17px;
   border-bottom: 1.5px solid currentColor;
   padding-bottom: 2px;
}

.chispa {
   color: var(--naranja);
   display: inline-block;
   vertical-align: super
}

.chispa svg {
   width: .5em;
   height: .5em;
   fill: currentColor
}

/* --- 8. TABLERO DE PROGRAMAS ---------------------------------------------
   Damero 3×3: tiles de color plano alternados con fotos recortadas en nube.
   En el arte el orden es tile-foto-tile / foto-tile-foto / tile-foto-tile. */
.programas {
   padding: 20px 0 60px;
   background: #fff
}

.tablero {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 30px 46px;
   align-items: center;
   position: relative;
}

/* Destellos/rombos entre las tarjetas (como el .ai): rojo, cyan, verde, amarillo. */
.prog-chispa {
   position: absolute;
   z-index: 4;
   pointer-events: none;
   height: auto;
}

.prog-chispa use {
   fill: currentColor
}

.pc-roja {
   color: var(--coral);
   width: 34px;
   top: -2.5%;
   left: 65.5%
}

.pc-cyan {
   color: var(--azul);
   width: 28px;
   top: 31.5%;
   left: 32%
}

.pc-verde {
   color: #74D000;
   width: 28px;
   top: 65%;
   left: 65.5%
}

.pc-amarilla {
   color: #FFA800;
   width: 30px;
   top: 97.5%;
   left: 32%
}

@media (max-width:600px) {
   .prog-chispa {
      display: none
   }
}

/* grid distinto en móvil */
.tile {
   border-radius: 26px;
   aspect-ratio: 1/.94;
   display: flex;
   align-items: flex-end;
   padding: 34px;
   color: #fff;
   position: relative;
}

.tile h3 {
   font-size: clamp(20px, 1.8vw, 27px);
   text-transform: uppercase;
   letter-spacing: .005em
}

.t-educacion {
   background: var(--azul)
}

.t-cultura {
   background: var(--coral)
}

.t-deporte {
   background: var(--verde)
}

.t-jornadas {
   background: var(--naranja)
}

.t-rural {
   background: var(--morado)
}

.foto-nube {
   aspect-ratio: 1/.94;
   overflow: hidden;
   /* Marco festoneado del .ai (extraído de la imagen del cliente). */
   -webkit-mask-image: url('img/foto-marco.webp');
   mask-image: url('img/foto-marco.webp');
   -webkit-mask-size: 100% 100%;
   mask-size: 100% 100%;
   -webkit-mask-repeat: no-repeat;
   mask-repeat: no-repeat;
}

.foto-nube img {
   width: 100%;
   height: 100%;
   object-fit: cover
}

/* destellos sueltos entre las piezas, como en el arte */
.tablero .destello {
   position: absolute;
   pointer-events: none
}

.tablero .destello svg {
   width: 100%;
   height: auto;
   fill: currentColor
}

/* El detalle de cada programa vive en un panel que se abre: el arte solo
   muestra el título, pero el contenido del cliente trae las viñetas. */
.detalle {
   margin-top: 14px
}

.detalle summary {
   cursor: pointer;
   list-style: none;
   font-weight: 900;
   font-size: 15px;
   display: inline-flex;
   align-items: center;
   gap: 8px;
}

.detalle summary::-webkit-details-marker {
   display: none
}

.detalle summary::after {
   content: "+";
   font-size: 19px;
   line-height: 1
}

.detalle[open] summary::after {
   content: "–"
}

.detalle ul {
   margin: 12px 0 0;
   padding-left: 18px;
   font-size: 15px;
   line-height: 1.45
}

.detalle li {
   margin-bottom: 5px
}

/* --- 9. BANDA DE CIELO + MAPA -------------------------------------------- */
.territorio {
   position: relative;
   background: var(--azul);
   color: #fff;
   /* Padding superior recortado (104->54) para que el mapa suba y no quede el
     espacio azul vacío que marcó la clienta. El .ai casi no deja intro antes
     del mapa. */
   padding: 54px 0 96px;
   /* Isaías pidió reducir el aire entre "Qué hacemos" y el mapa (venía junto
      con los 110px de padding-bottom de .programas, ~188px de vacío total). */
   margin-top: 24px;
}

.territorio::before {
   content: "";
   position: absolute;
   inset: 0;
   background-image: var(--grano);
   opacity: .22;
   mix-blend-mode: overlay;
   pointer-events: none;
}

.territorio .env {
   position: relative;
   z-index: 2
}

.territorio h2 {
   font-size: clamp(28px, 3.2vw, 42px);
   margin-bottom: 10px
}

.territorio .bajada {
   max-width: 56ch;
   font-weight: 300;
   margin-bottom: 20px
}

.mapa-grid {
   display: grid;
   grid-template-columns: 1.3fr .8fr;
   gap: 38px;
   align-items: start
}

.mapa-arte {
   position: relative
}

.mapa-arte>img {
   width: 100%;
   height: auto
}

/* La brújula vive ahora colgada de la esquina superior derecha del PANEL, como
   en el .ai (antes iba en la esquina del mapa). El panel es su contenedor
   relativo; sobresale por el canto con top/right negativos. */
.panel-veredas {
   position: relative
}

.compas {
   position: absolute;
   top: -40px;
   right: -24px;
   width: 96px;
   height: auto;
   z-index: 4;
}

.panel-veredas {
   background: #fff;
   color: var(--negro);
   border-radius: 22px;
   padding: 26px 28px 28px;
}

/* Borde de pincel blanco de doble línea del panel "Dónde estamos" (extraído del
   .ai de Inicio) — reemplaza la sombra dura por el marco pintado a mano. */
.panel-veredas::after {
   content: "";
   position: absolute;
   inset: -13px;
   z-index: 2;
   pointer-events: none;
   border: 15px solid transparent;
   border-image: url('img/mapa-panel-marco.webp') 66 / 15px / 0 stretch;
}

.panel-veredas h3 {
   font-size: 21px;
   margin-bottom: 12px
}

.panel-veredas ul {
   margin: 0 0 18px;
   padding-left: 18px;
   font-size: 15.5px;
   line-height: 1.6
}

/* Aquí vivía .panel-veredas .veredas, que enmarcaba img/mapa-veredas.webp: la
   foto de un mapa impreso que estaba dentro de este panel. El mapa se rehízo
   ilustrado y esa foto salió del marcado, así que la regla se quedó sin a qué
   engancharse (medido en Inicio ya renderizada: .panel-veredas existe, y
   .panel-veredas .veredas devuelve 0 elementos). Se borra en vez de dejarla:
   una regla que no aplica invita a creer que el panel todavía lleva foto. */
.panel-veredas p {
   font-size: 15px;
   line-height: 1.5;
   margin: 0;
   font-weight: 300
}

/* --- 10. CTA "TU APOYO" --------------------------------------------------- */
.apoyo {
   position: relative;
   text-align: center;
   background: #fff;
   padding: 110px 0 160px;
   overflow-x: clip;
   overflow-y: visible;
}

.apoyo h2 {
   font-size: clamp(20px, 1.8vw, 25px);
   font-weight: 400 !important;
   line-height: 1.15;
}

.apoyo h2 .tu-word {
   font-weight: 400 !important;
   font-size: 1.25em !important;
   color: var(--negro, #141414);
   display: inline-block;
   transform: translate(6px, 5px);
   margin-right: .12em;
}

.apoyo h2 .mano {
   color: var(--coral, #FF4949);
   font-size: 2.7em !important;
   font-weight: 400 !important;
   display: inline-block;
   vertical-align: middle;
   margin-left: .08em;
   line-height: .85;
}

.apoyo p {
   max-width: 44ch;
   margin: 10px auto 24px;
   font-weight: 300;
   font-size: 13px
}

.apoyo .botones {
   display: flex;
   gap: 16px;
   justify-content: center;
   flex-wrap: wrap
}

/* El lazo verde rodea el bloque: va detrás y desbordando el ancho de texto,
   como en el arte, por eso se saca del flujo y se estira más allá del 100%. */
/* Las dos líneas verdes van como piezas SEPARADAS (recortadas del lazo original)
   para poder anclar cada una a su letra, como el .ai: la izquierda pasa por encima
   de la H de "hace" y la derecha cae sobre la O de APOYO. Se posicionan respecto al
   centro (calc(50% ± px)) para seguir al título centrado en distintos anchos; el
   top es fijo (px) calibrado para desktop. overflow:hidden del apoyo recorta lo que
   sobresale por los lados (intencional, como en el arte). */
.apoyo .lazo-izq,
.apoyo .lazo-der {
   position: absolute;
   left: calc(50% + 83px);
   top: -40px;
   width: 760px;
   height: auto;
   z-index: 1;
}

/* Posición calibrada por ancla (botón Dona, fitz get_drawings + CDP
   getBoundingClientRect) — left/top NO se tocan aquí, siguen siendo
   correctos. Lo que sí estaba mal era el tamaño: 720/550 quedaba ~8% más
   grande que el trazo real del .ai (DISENOWEB_ajustes tamanos pag inicio,
   página escritorio). Recalibrado por ajuste de curva, no a ojo: se
   renderizó el .ai a 1:1 (1pt=1px, confirmado con el propio botón Dona:
   183.16pt en el .ai vs 184px en vivo), se extrajo la máscara de alpha del
   propio .webp, y se buscó —para un rango de anchos, con el mismo left/top
   de siempre— el que minimiza la distancia media de cada píxel del trazo
   contra el trazo verde real del .ai (scipy distance_transform_edt). Mínimo
   claro en 664px (lazo-izq) y 506px (lazo-der) — ambos con height:auto para
   no forzar el aspect-ratio del archivo (557×456 / 678×537), que no
   coincide exacto con el bbox del trazo vectorial y no hay que forzarlo
   (ver skill §8.1). Casi el mismo factor de escala en los dos (≈0.92):
   coherente con que ambos se agrandaron juntos en un ajuste anterior. */
.apoyo .lazo-izq {
   left: calc(50% - 1020px);
   top: -210px;
   width: 830px;
   height: auto;
}

.apoyo .lazo-der {
   left: calc(50% + 83px);
   top: -55px;
   width: 760px;
   height: auto;
   z-index: 1;
}

/* Primer grupo de confetti, arriba a la izquierda (junto a Tu APOYO) */
.apoyo .confetti-izq-arriba {
   position: absolute;
   left: calc(50% - 290px);
   top: 50px;
   width: 125px;
   z-index: 1;
}

/* Segundo grupo de confetti, abajo a la derecha (junto a los botones), tal
   como en el .ai: mismo patron de 4 triangulos que el de "Tu APOYO", medido
   y convertido igual (render 1:1 del .ai -> viewBox de esta caja chica). */
.apoyo .confetti-der-abajo {
   position: absolute;
   left: calc(50% + 340px);
   bottom: 240px;
   width: 125px;
   z-index: 1;
}

.apoyo-caja {
   position: relative;
   z-index: 2;
   display: flex;
   align-items: center;
   justify-content: center;
   gap: 10px;
}

.apoyo-txt {
   flex: 0 1 620px
}

/* El título va CENTRADO ("Tu APOYO" centrado sobre "hace la diferencia", como el
   arte) y el muñequito se conecta al final de "diferencia": se mete a la izquierda
   con margen negativo hasta que los globos rozan la última letra y el lápiz queda
   apuntando hacia arriba, hacia la O de APOYO. Así el conjunto queda simétrico y el
   muñeco pegado al texto. El ancho real (180px) lo fija personaje.css. */
.apoyo .personaje {
   width: 180px;
   height: auto;
   position: absolute;
   left: calc(50% + 80px);
   top: -22px;
   z-index: 3;
}

/* El margen negativo (solape con el titular para que el lápiz toque la O) es solo
   de desktop. En tablet la caja sigue en fila pero más angosta: se anula para que
   el muñequito no se monte sobre el texto. En móvil (<600px) ya se centra aparte. */
@media (max-width:900px) {
   .apoyo .personaje {
      /* El comentario de arriba decía "se anula para que el muñequito no se
         monte sobre el texto", pero nunca anulaba position/left/top — sólo
         margin/align-self, que no hacen nada sobre un elemento absolute. El
         muñeco seguía en position:absolute;top:-22px heredado de escritorio
         y quedaba flotando encima de .botones (medido en 768px: se solapaba
         con "Dona"/"Quiero ser voluntario"). En móvil (<600px) esto no se
         nota porque esa otra media query, más abajo, sí pone su propio
         position:absolute!important con coordenadas nuevas y gana por
         !important y por ir después en el archivo. */
      position: static;
      left: auto;
      top: auto;
      align-self: flex-end;
      margin-top: 0;
      margin-left: 0;
      margin-bottom: 12px
   }
}

/* En páginas con rótulo (ul.apoyo-rotulo) el título APOYO baja ~55px dentro de
   la caja; en DESKTOP el muñeco (align-self:flex-start) se baja lo mismo para que
   el lápiz siga tocando la O y no apunte al rótulo. Tablet (<=900) usa flex-end y
   no aplica; móvil (<=600) se ajusta con `top` en su bloque. Se acota a >900 para
   no pisar la regla de tablet (que tiene menor especificidad que :has). */
@media (min-width:901px) {
   .apoyo-caja:has(.apoyo-rotulo) .personaje {
      margin-top: 81px
   }
}

/* --- 11. PIE -------------------------------------------------------------- */
.pie {
   background: var(--negro);
   color: #fff;
   padding: 78px 0 0;
   position: relative;
}

.pie-corte-lineas {
  position: absolute;
  bottom: 100%;
  margin-bottom: -2px;
  left: -2px;
  width: calc(100% + 4px);
  height: auto;
  display: block;
  pointer-events: none;
  z-index: 10;
}

.pie-grid {
   display: grid;
   grid-template-columns: 1.1fr .8fr 1fr 1.1fr;
   gap: 40px;
   align-items: start;
}

.pie img.logo {
   height: 74px;
   width: auto;
   margin-bottom: 26px
}

.pie-redes {
   display: flex;
   gap: 20px
}

.pie-redes a {
   display: grid;
   place-items: center
}

.pie-redes svg {
   width: 26px;
   height: 26px;
   fill: #fff
}

.pie h4 {
   font-size: 16px;
   margin-bottom: 14px;
   letter-spacing: .02em
}

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

.pie ul li {
   margin-bottom: 12px
}

.pie ul a {
   font-weight: 300;
   font-size: 17px
}

.pie ul a:hover {
   color: var(--verde)
}

.sede {
   margin-bottom: 22px;
   font-weight: 300
}

.sede b {
   display: block;
   font-weight: 900;
   letter-spacing: .02em
}

.sede .princ {
   color: var(--verde);
   font-weight: 400
}

/* El .ai trae la tarjeta en dos verdes (--verde de base, --verde-mapa en las
   franjas), no un verde liso. Franjas verticales con un borde suave en vez de
   duro: en el arte ondulan un poco, y el blend de 12px es la aproximación en
   gradiente que más se acerca sin tener que exportar una imagen. */
.boletin {
   background: repeating-linear-gradient(90deg,
         var(--verde-mapa) 0px, var(--verde-mapa) 28px,
         var(--verde) 40px, var(--verde) 68px,
         var(--verde-mapa) 80px);
   border-radius: 14px;
   padding: 20px 22px 22px;
   color: var(--negro);
   position: relative;
   overflow: hidden;
}

.boletin::before {
   content: "";
   position: absolute;
   inset: 0;
   background-image: var(--grano);
   opacity: .3;
   mix-blend-mode: multiply;
   pointer-events: none;
}

.boletin>* {
   position: relative
}

.boletin b {
   display: block;
   font-size: 17px
}

.boletin small {
   display: block;
   font-size: 13px;
   font-weight: 300;
   line-height: 1.3;
   margin-bottom: 2px
}

.boletin .mano {
   display: block;
   color: #fff;
   font-size: 56px;
   margin: 2px 0 12px
}

.boletin form {
   display: flex;
   background: var(--negro);
   border-radius: 999px;
   padding: 6px 6px 6px 20px
}

.boletin input {
   flex: 1;
   border: 0;
   background: transparent;
   color: #fff;
   font: inherit;
   font-size: 15px;
   min-width: 0;
}

.boletin input::placeholder {
   color: #bdbdbd
}

.boletin input:focus {
   outline: none
}

.boletin button {
   flex: none;
   width: 38px;
   height: 38px;
   border: 0;
   border-radius: 50%;
   background: #fff;
   color: var(--negro);
   display: grid;
   place-items: center;
   cursor: pointer;
}

.boletin button svg {
   width: 18px;
   height: 18px;
   fill: currentColor
}

.contacto-pie {
   margin-top: 16px;
   font-weight: 900;
   font-size: 17px;
   line-height: 1.45
}

.pie-legal {
   margin-top: 60px;
   border-top: 1px solid #2c2c2c;
   padding: 18px 0 22px;
   display: flex;
   justify-content: space-between;
   gap: 24px;
   flex-wrap: wrap;
   font-size: 13px;
   font-weight: 300;
}

.pie-legal b {
   font-weight: 900
}

.pie-legal nav {
   display: flex;
   gap: 26px;
   flex-wrap: wrap
}

/* --- 12. HERO DE NOSOTROS ------------------------------------------------- */
/* 2026-08-24: banner nuevo del cliente (BANNER NOSOTROS_FONDO~2.jpg + BANNER
   NOSOTROS TEXTO.png, aplanados en un solo archivo nos-hero-banner-*.webp;
   offset del texto medido por diff de píxeles contra el BANNER NOSOTROS.png
   de referencia: x897,y580 sobre el lienzo 6000×3119 original, sin escalar).
   Reemplaza la composición anterior (título aparte + niño + 6 capas de
   garabatos, cada una animada en nosotros-anim.css) — el fondo azul, la nube
   de esquina y los garabatos ya vienen horneados en la foto nueva. Por eso
   se cae a un solo <img> a ancho completo en vez del grid título|figura:
   ver profundidad.css para el resto de los ajustes de esta sección (fondo
   CSS retirado, festón retirado). */
.hero-nos {
   position: relative;
   overflow: hidden;
   margin-top: calc(-1 * var(--nav-alto) - 26px);
}

.hero-nos .nube-esquina {
   display: none !important;
}

.hero-nos-grid {
   position: relative;
   display: block;
   line-height: 0;
}

.hero-nos-grid img.hero-nos-fondo {
   display: block;
   width: 100%;
   height: auto;
}

/* Texto "Más que un gesto un compromiso" en capa propia sobre el fondo, para
   poder animarlo (gesto rv-mano, ver animaciones.js) — el fondo solo no lo
   trae horneado. Offset por diff de píxeles contra el .ai del cliente (ver
   comentario en nosotros.html): 14.95%/18.62% de left/top, ancho 47.18% del
   lienzo 6000×3115. % en vez de cqw porque .hero-nos-grid no declara
   container-type — como el ancho y el alto escalan juntos vía height:auto
   del fondo, top/left/width en % del propio contenedor caen en el mismo
   punto a cualquier ancho. */
.hero-nos-texto {
   position: absolute;
   left: 14.95%;
   top: 18.62%;
   width: 47.18%;
   height: auto;
   z-index: 2;
}

/* Banner morado con la princesa: solo se muestra en móvil (ver @media 600). */
.nos-hero-movil {
   display: none
}

/* --- 13. HISTORIA (Nosotros) ---------------------------------------------- */
.historia {
   padding: 100px 0 90px;
   background: #fff
}

.historia-grid {
   display: grid;
   grid-template-columns: .85fr 1.15fr;
   gap: 56px;
   align-items: center
}

.historia p {
   font-size: 18px;
   line-height: 1.45;
   font-weight: 300
}

.historia p strong {
   font-weight: 900
}

.historia figure {
   margin: 0;
   text-align: center
}

.historia figure img {
   width: min(100%, 380px);
   height: auto;
   margin-inline: auto
}

/* Los muñequitos se paran SOBRE la tarjeta de Misión, como el nosotros.ai: se
   cierra el hueco entre la historia y M/V y la figura baja para que los pies
   caigan en el borde superior de la nube azul. z-index alto para ir por encima
   de la tarjeta. */
.historia {
   padding-bottom: 0
}

/* Los muñequitos van DELANTE de la tarjeta de Misión: se eleva la sección
   historia por encima de M/V (z-index). Para que eso NO tape el sello de Visión
   —que asoma en M/V— la historia va con fondo TRANSPARENTE: el body es blanco, así
   que se ve idéntico y el sello se transparenta por debajo donde no hay muñeco. */
.historia {
   position: relative;
   z-index: 2;
   background: transparent
}

.mv {
   z-index: 1
}

.historia figure {
   position: relative;
   z-index: 8;
   margin-bottom: -120px
}

/* La columna de texto no lleva el margen negativo de la figura, así que su
   propio borde inferior SÍ marca dónde termina .historia (padding-bottom:0,
   ver arriba). Medido: quedaba pegada a 0px del arranque de la banda azul de
   Misión, sin aire — el texto "se subía" encima de la etiqueta "Misión".
   Este margen es SOLO de la columna de texto: no toca la figura ni su
   solape intencional con la nube. */
.historia-grid>div {
   margin-bottom: 60px
}

/* --- 14. MISIÓN / VISIÓN -------------------------------------------------- */
/* En el .ai el azul NO es una tarjeta: es el fondo de toda la sección, de
   borde a borde (ver los <svg class="nube nube-arriba/abajo"> del HTML para
   el festón arriba/abajo). Antes lo pintaba .mision-nube con border-image
   festoneado en los 4 lados, así que el azul se cortaba antes de llegar a
   Visión — el pedido de "extender la etiqueta de Misión detrás de Visión"
   es justamente mover este color de la tarjeta a la sección. */
.mv {
   position: relative;
   /* 96px→24px: Isaías pidió que la tarjeta de Visión llegue hasta el borde
      blanco de la sección. La tarjeta ya llena el alto de la fila del grid
      (align-items:stretch en .mv-grid) — lo que faltaba era este padding de
      más, que dejaba 96px de azul vacío entre el fondo de la tarjeta y el
      festón. 24px de margen de seguridad para que el festón (64px de alto)
      no le muerda la esquina inferior a la tarjeta. */
   padding: 0 0 24px;
   background: var(--azul)
}

.mv::before {
   content: "";
   position: absolute;
   inset: 0;
   background-image: var(--grano);
   opacity: .12;
   mix-blend-mode: overlay;
   pointer-events: none;
}

/* El sello de Visión y la superposición de tarjetas se salen a propósito de la
   caja de la sección; sin esto el sello aparecía recortado por la derecha. */
.mv {
   overflow: visible
}

/* Festón de Misión vivido dentro de .historia (ver el comentario en el HTML):
   se ancla al canto INFERIOR de .historia en vez de al superior de .mv, con
   el mismo alto de 64px y las puntas hacia arriba (mismo símbolo que
   .nube-arriba en cualquier otra sección, solo que la posición se cuenta
   desde .historia, que es quien manda en el z-index de este empalme). */
.historia {
   overflow: visible;
}

/* feston-uniforme (20 bumps repartidos en un viewBox de 1200 de ancho) usa
   preserveAspectRatio="none": el alto del <svg> NUNCA se escala (.nube fija
   height:64px siempre), sólo el ancho se comprime al angostar la pantalla.
   En desktop (~1440px) esa compresión es leve (escala ~1.2) y los bumps se
   ven redondeados, como el .ai; en móvil (~375px) la escala de ancho cae a
   ~0.3 mientras el alto se queda en 64px sin cambiar, así que cada bump de
   60×44 unidades se aplasta de ancho pero no de alto y termina viéndose como
   un pico afilado en vez de una curva — verificado con captura real en
   nosotros.html (375px). height:16px en el <svg> escala el alto casi en la
   misma proporción que el ancho (64px×375/1440≈16.7px) y devuelve la curva
   redondeada. No toca .nube-arriba/.nube-abajo en general (los festones
   banco-nubes del resto del sitio no tienen este problema). */
@media (max-width:600px) {
   .feston-parejo {
      height: 16px !important;
   }
}

.mv-feston-historia {
   top: auto;
   bottom: -2px;
   /* z-index MENOR que el de los muñecos (.historia figure, z-index:8): antes
      llevaba 9 y ganaba, así que la ola le comia un mordisco al brazo y a las
      piernas justo donde cruza el feston (se veian "cortados"/"detras" ahi).
      El dibujo de los munecos ya es opaco donde hay trazo y transparente
      donde no, asi que con z-index menor el feston sigue asomando por los
      huecos transparentes alrededor de la figura sin taparle ni un pixel
      dibujado: el efecto de "recorte de ola" que buscaba el comentario de
      arriba no lo necesita el personaje, solo el fondo.
      OJO: esto solo no bastaba. .historia-grid tiene isolation:isolate
      (trazos.css), asi que el z-index:8 de los munecos queda encerrado
      DENTRO de ese contexto y no compite hacia afuera contra este festón,
      que es hermano de .historia-grid, no hijo. El z-index:2 que se le
      agregó a .historia-grid en trazos.css es la mitad real del arreglo. */
   z-index: 1;
}

/* Paneles casi contiguos: el gap se cierra y la tarjeta de Visión se SUPERPONE
   sobre la de Misión (margen negativo + z-index por encima), como pidió la
   clienta y como el .ai (las dos cajas se tocan). */
.mv-grid {
   display: grid;
   grid-template-columns: 1.2fr 1fr;
   gap: 0;
   /* stretch (default de grid, antes forzado a "start"): Isaías pidió que la
      tarjeta de Visión se estire hacia abajo hasta tocar el borde blanco de
      la sección — con stretch, .marco-vision llena todo el alto de la fila
      en vez de quedar del tamaño de su propio contenido. */
   align-items: stretch
}

.marco-vision {
   /* -56px → -85px: Isaías pidió correrla más a la izquierda (el borde
      derecho de la tarjeta casi tocaba el borde derecho de .env, sin aire).
      No más que esto: a -85px el sello queda a 26px de "Misión" (medido en
      vivo) — más shift reintroduce el solape que ya se corrigió en la
      sección de Directivos... digo, en esta misma sección (ver §12). */
   margin-left: -85px;
   /* z-index:3 (antes) empataba con .nube (el festón blanco del pie de
      sección, también z-index:3) — en un empate gana quien está DESPUÉS en
      el DOM, y el festón <svg> es hermano de .mv-grid pero se escribe
      DESPUÉS en el HTML, así que se pintaba encima y le mordía la esquina
      inferior a la tarjeta ya estirada (§16/§19). z-index:6 la saca de ese
      empate sin tocar el festón ni ningún otro elemento de la sección. */
   z-index: 6;
   position: relative;
   /* La tarjeta ahora es UNA imagen (fondo+borde+sello horneados,
      FONDO VISION.png) con su propia proporción — ya no tiene sentido
      estirarla a la fuerza (.mv-grid hereda align-items:stretch de arriba,
      pensado para cuando .vision era un <div> con fondo plano). align-self:
      end la saca de ese estirado y la ancla al PIE de la fila del grid —
      con eso el borde inferior de la tarjeta cae justo donde termina
      Misión, o sea justo encima del festón de la sección, sin importar
      cuánto mida cada uno a cada ancho. Isaías lo pidió explícito: "bájala
      para que se coloque por encima del corte de la página", en
      móvil/tablet/escritorio por igual. */
   align-self: end;
}
.vision-fondo{ display:block; width:100%; height:auto }

/* Ya NO es una tarjeta con su propio festón (ver comentario sobre .mv más
   arriba): el azul con bumps en los 4 lados no coincide con el .ai, que solo
   festonea arriba/abajo de TODA la sección. Este wrapper queda como caja de
   posicionamiento simple para .mision. */
.mision-nube {
   position: relative;
   /* Isaías pidió bajar el bloque de Misión: el sello "Visión 2030" (badge
      circular, top:-32px sobre .marco-vision con margin-top:45px) cae casi a
      la altura del grid, y sin este margen su franja vertical se solapaba
      con el título "Misión" completo. */
   margin-top: 70px;
}

.mision {
   position: relative;
   z-index: 1;
   color: #fff;
   padding: 28px 6% 32px 0;
   text-align: left;
}

.mision .mano {
   display: block;
   color: var(--negro);
   font-size: 62px;
   margin-bottom: 10px;
   text-align: left;
}

.mision p {
   font-weight: 300;
   font-size: 18px;
   line-height: 1.45;
   margin: 0;
   text-align: left;
}

/* Contorno a trazos corrido hacia abajo-derecha, como una sombra dibujada a
   mano. Va en un MARCO que envuelve la tarjeta, no en un ::after con z-index
   negativo: un hijo con z-index negativo se pinta por detrás del fondo de su
   sección, así que sobre la banda blanca o la gris el trazo desaparecía. En el
   marco —que no tiene fondo— el trazo se pinta encima de la página y la
   tarjeta, elevada, lo tapa por dentro. */
.marco-punteado {
   position: relative
}

.marco-punteado::after {
   content: "";
   position: absolute;
   pointer-events: none;
   inset: 16px -18px -18px 16px;
   border: 3px dashed var(--trazo, var(--azul));
   border-radius: 28px;
}

.marco-punteado>* {
   position: relative;
   z-index: 1
}

/* .vision ya no es la caja con fondo/borde propios (eso ahora lo pinta
   .vision-fondo, la imagen) — es sólo el texto, superpuesto ENCIMA de la
   imagen. Texto justificado a la izquierda y tamaño igual a Historia (18px). */
.vision {
   position: absolute;
   inset: 0;
   color: #fff;
   padding: 22% 10% 8% 10%;
   display: flex;
   align-items: center;
   justify-content: flex-start;
}

.vision p {
   font-weight: 400;
   font-size: 18px;
   line-height: 1.45;
   margin: 0;
   text-align: left;
}

/* --- 15. EQUIPO ----------------------------------------------------------- */
.equipo {
   padding: 20px 0 90px;
   background: #fff
}

.equipo-intro {
   display: grid;
   grid-template-columns: 1fr 1fr;
   gap: 40px;
   align-items: start;
   position: relative;
   padding-top: 32px;
}

.equipo-intro h2 {
   font-size: clamp(26px, 2.6vw, 34px);
   font-weight: 400;
   max-width: 22ch
}

/* Cluster de puntos morados (adorno del .ai) arriba-izquierda del texto. */
.equipo-intro .puntos-morados {
   position: absolute;
   left: 0;
   top: -10px;
   width: 44px;
   height: auto;
   z-index: 2
}

.rotulo {
   font-size: 24px;
   font-weight: 300;
   letter-spacing: .06em;
   text-transform: uppercase;
   margin: 52px 0 26px;
}

.organigrama-directivos {
   display: flex;
   flex-direction: column;
   align-items: center;
   gap: 38px;
   margin-bottom: 20px;
   position: relative;
}

/* Adorno de trazos amarillos del .ai: se repite varias veces bajando por el
   borde izquierdo de la página (aquí junto a Directivos, y de nuevo más
   abajo junto al FAQ — ver .seccion-faq .adorno-puntos-borde). Sangra fuera
   de la ventana a propósito (body tiene overflow-x:hidden). */
.adorno-puntos-borde {
   position: absolute;
   left: calc(-1 * max(24px, (100vw - var(--ancho))/2)) !important;
   top: -40px;
   width: 90px;
   height: auto;
   z-index: 0;
   pointer-events: none;
}

@media (max-width: 900px) {
   .adorno-puntos-borde {
      width: 60px;
      left: 0 !important;
   }
}

.organigrama-directivos .orga-fila.uno {
   display: flex;
   justify-content: center;
   max-width: 360px;
   width: 100%;
}

.organigrama-directivos .orga-fila.dos {
   display: grid;
   grid-template-columns: repeat(2, minmax(0, 360px));
   gap: 34px;
   justify-content: center;
   width: 100%;
}

/* Igual que .mv-grid y .hero-nos-grid: la mesa de 768 del .ai conserva las
   dos columnas de Sergio/Neyder, sólo se apilan en el móvil real (600). Antes
   este breakpoint estaba en 768px, que ES la mesa tablet, así que la
   colapsaba de más. */
@media (max-width: 600px) {
   .organigrama-directivos .orga-fila.dos {
      grid-template-columns: 1fr;
   }
}

.rejilla {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 38px 34px
}

.persona {
   text-align: center
}

.retrato {
   aspect-ratio: 1/1;
   margin-bottom: 14px;
   position: relative;
   -webkit-mask-image: var(--nube-retrato);
   mask-image: var(--nube-retrato);
   -webkit-mask-size: 100% 100%;
   mask-size: 100% 100%;
   -webkit-mask-repeat: no-repeat;
   mask-repeat: no-repeat;
   background: var(--morado);
   display: grid;
   place-items: end center;
   overflow: hidden;
}

.persona:nth-child(3n+2) .retrato {
   background: var(--morado-hondo)
}

.persona:nth-child(3n) .retrato {
   background: var(--azul)
}

.retrato img {
   width: 88%;
   height: auto;
   object-fit: contain;
   object-position: center bottom
}

/* Sin foto: iniciales sobre la misma silueta, para que la ficha exista igual.
   El cliente pidió que TODOS los voluntarios tengan perfil; Francisco es el
   único cuya foto no vino en el material, así que la ficha se sostiene con la
   inicial en vez de dejar un hueco. */
.retrato.sin-foto {
   place-items: center
}

.retrato .inicial {
   font-size: 64px;
   font-weight: 900;
   color: #fff;
   opacity: .92;
   line-height: 1;
}

.persona h4 {
   font-size: 19px;
   margin-bottom: 2px
}

.persona .rol {
   display: block;
   font-size: 13px;
   font-weight: 900;
   letter-spacing: .08em;
   text-transform: uppercase;
   color: var(--morado-hondo);
   margin-bottom: 8px;
}

.persona p {
   font-size: 15px;
   line-height: 1.45;
   font-weight: 300;
   margin: 0
}

/* --- 16. VALORES ---------------------------------------------------------- */
.valores {
   position: relative;
   background: var(--gris-banda);
   padding: 0 0 96px;
   margin-top: 40px
}

.marquee {
   overflow: hidden;
   padding: 34px 0 26px;
   font-size: clamp(38px, 5vw, 64px);
   font-weight: 900;
   letter-spacing: -.01em;
   color: var(--gris-marquee);
   white-space: nowrap;
}

.marquee span {
   display: inline-block;
   animation: corre 26s linear infinite
}

.marquee b {
   color: var(--negro)
}

@keyframes corre {
   from {
      transform: translateX(0)
   }

   to {
      transform: translateX(-50%)
   }
}

@media (prefers-reduced-motion:reduce) {
   .marquee span {
      animation: none
   }
}

.valores-grid {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 52px
}

.valor {
   border-radius: 26px;
   padding: 38px 34px 44px;
   color: #fff;
   height: 100%
}

.valor h3 {
   font-size: 26px;
   margin-bottom: 16px
}

.valor p {
   font-size: 16px;
   line-height: 1.45;
   font-weight: 400;
   margin: 0
}

/* Cada valor lleva su contorno a trazos del mismo color que el relleno */
.v-compromiso {
   background: var(--morado)
}

.v-transparencia {
   background: var(--azul)
}

.v-sostenibilidad {
   background: var(--verde)
}

.marco-punteado.m-compromiso {
   --trazo: var(--morado)
}

.marco-punteado.m-transparencia {
   --trazo: var(--azul)
}

.marco-punteado.m-sostenibilidad {
   --trazo: var(--verde)
}

/* --- 17. RESPONSIVE ------------------------------------------------------
   El paquete trae mesas de 1440, 768 y 375. Los cortes están puestos donde el
   arte cambia de composición, no en anchos genéricos. */
@media (max-width:1080px) {
   :root {
      --ancho: 100%
   }

   .menu {
      gap: 22px;
      padding: 14px 26px;
      font-size: 15px
   }

   .pie-grid {
      grid-template-columns: 1fr 1fr;
      gap: 44px
   }
}

/* --- tablet: 768 --- */
@media (max-width:900px) {
   .cabecera {
      gap: 12px
   }

   .marca img {
      height: 44px
   }

   .menu {
      position: absolute;
      top: calc(100% - 4px);
      left: 24px;
      right: 24px;
      flex-direction: column;
      align-items: flex-start;
      gap: 2px;
      border-radius: 20px;
      padding: 14px 22px;
      display: none;
   }

   .menu.abierto {
      display: flex
   }

   .menu a {
      display: block;
      width: 100%;
      padding: 11px 0
   }

   .menu li {
      width: 100%;
      border-bottom: 1px solid #eee
   }

   .menu li:last-child {
      border-bottom: 0
   }

   .hamburguesa {
      display: grid;
      place-items: center;
      order: 2;
      margin-left: auto;
      width: 52px;
      height: 52px;
      border: 0;
      border-radius: 14px;
      background: #fff;
      box-shadow: 0 2px 14px rgba(0, 0, 0, .10);
      cursor: pointer;
   }

   .hamburguesa span {
      display: block;
      width: 22px;
      height: 2.4px;
      background: var(--negro);
      border-radius: 2px;
      margin: 2.6px 0;
   }

   .cabecera .btn-dona {
      order: 3;
      font-size: 17px;
      padding: 13px 22px
   }

   /* La mesa de 768 del arte mantiene el titular a la izquierda y la figura a
     la derecha: no apila. Sólo cambia la proporción. */
   /* En 768 las cifras bajan y cruzan todo el ancho, debajo de la figura */
   .hero-grid {
      grid-template-columns: 1fr .96fr;
      gap: 14px 10px
   }

   .hero-figura {
      grid-row: 1
   }

   .hero-grid .cifras {
      grid-column: 1 / -1;
      grid-row: 2;
      justify-content: space-between
   }

   .hero-inicio h1 {
      font-size: clamp(30px, 5vw, 44px)
   }

   .cifra {
      width: 31%;
      min-width: 0
   }

   .tablero {
      grid-template-columns: repeat(2, 1fr);
      gap: 24px
   }

   .mapa-grid {
      grid-template-columns: 1fr
   }

   /* .mv-grid NO entra aquí: la mesa de 768 del .ai conserva las dos columnas
      de Misión/Visión; recién se apila en el móvil de 375 (@media 600). El
      hero-nos-grid de dos columnas que vivía aquí se retiró junto con el
      resto del grid título|figura (ver nota 2026-08-24 arriba en la sección
      12) — el banner nuevo es un solo <img> a ancho completo en todos los
      anchos ≥601px. */
   .historia-grid,
   .equipo-intro {
      grid-template-columns: 1fr;
      gap: 34px
   }

   /* En una columna el TEXTO va primero y los muñecos DESPUÉS, parados sobre la
     nube de Misión (antes la figura iba primero y su margen negativo de desktop
     jalaba el texto hacia arriba, encimándolo con los muñecos). El margen
     negativo ahora hace que la nube de Misión suba y los muñecos caigan sobre su
     borde superior. */
   .historia-grid {
      align-items: start
   }

   .historia-grid>figure {
      order: 2;
      margin-bottom: -46px
   }

   .rejilla {
      grid-template-columns: repeat(2, 1fr)
   }

   .valores-grid {
      grid-template-columns: 1fr;
      gap: 34px
   }

   .valores {
      padding-bottom: 64px
   }

   .pie-grid {
      grid-template-columns: 1fr 1fr
   }
}

/* --- móvil: 375 --- */
@media (max-width:600px) {
   body {
      font-size: 16px
   }

   .env {
      width: calc(100% - 36px)
   }

   .social-top {
      justify-content: center;
      padding: 7px 18px
   }

   .cabecera {
      padding: 12px 18px
   }

   .menu {
      left: 18px;
      right: 18px
   }

   /* En la mesa de 375 el orden se invierte: primero la figura, después el
     titular y al final las cifras, una debajo de otra y centradas. */
   .hero-inicio {
      padding-top: calc(var(--nav-alto) + 34px);
      padding-bottom: 60px
   }

   .hero-grid {
      grid-template-columns: 1fr;
      gap: 0
   }

   .hero-figura {
      grid-column: 1;
      grid-row: 1;
      margin-bottom: 8px
   }

   .hero-txt {
      grid-row: 2;
      padding-left: 0
   }

   .hero-grid .cifras {
      grid-column: 1;
      grid-row: 3
   }

   .hero-figura img {
      width: min(84%, 380px);
      margin-inline: auto
   }

   .hero-inicio h1 {
      font-size: 38px
   }

   .cifras {
      gap: 10px;
      margin-top: 30px;
      justify-content: center
   }

   .cifra {
      width: min(230px, 74%);
      aspect-ratio: 1/.9
   }

   .cifra b {
      font-size: 34px
   }

   .nube-esquina.ne-izq {
      width: 190px
   }

   .nube-esquina.ne-der {
      width: 190px
   }

   .gesto {
      padding: 64px 0 52px
   }

   .tablero {
      grid-template-columns: 1fr;
      gap: 20px
   }

   .tile {
      aspect-ratio: auto;
      min-height: 150px;
      padding: 26px
   }

   .programas {
      padding-bottom: 40px
   }

   .territorio {
      padding: 78px 0 88px;
      margin-top: 44px
   }

   .apoyo {
      padding: 78px 0 84px
   }

   /* HERO DE NOSOTROS EN MÓVIL — banner morado con la niña princesa (según el
     mockup del cliente). El fondo granulado con nubes ya viene horneado en la
     imagen; encima van los garabatos de cuento tenues y la niña. El banner
     deportivo de escritorio/tablet (.hero-nos-grid, un solo <img> desde
     2026-08-24) se oculta; el H1 sigue siendo class="oculto" en el HTML, así
     que no necesita receta sr-only aparte aquí. */
   /* El fondo morado lo pone profundidad.css (@media 600) con !important, porque
     ese archivo es el dueño del banner del hero de Nosotros. */
   .hero-nos {
      min-height: 0;
   }

   .hero-nos::before {
      display: none
   }

   /* el grano ya está en la imagen */
   .hero-nos .nube-esquina,
   .hero-nos .nube-viaje,
   .hero-nos .adorno--asterisco {
      display: none
   }

   /* banner deportivo de escritorio/tablet fuera; el de móvil es nos-hero-movil */
   .hero-nos-grid {
      display: none
   }

   /* Banner deportivo del niño (documento móvil): una sola imagen de bloque que
      define la altura del hero. Reemplaza el overlay morado de la niña de cuento. */
   .nos-hero-movil {
      display: block;
      position: static;
      z-index: 2;
      pointer-events: none;
      line-height: 0;
   }

   .nos-hero-movil .nhm-banner {
      display: block;
      width: 100%;
      height: auto;
   }

   /* El banner ya trae su propio borde de nube inferior: se retira el festón CSS
      para no duplicar el corte. */
   .hero-nos .nube-feston {
      display: none
   }

   /* El documento móvil no lleva botón Dona sobre el banner (Dona queda accesible
      en el menú y en el pie). */
   .hero-nos .hero-dona {
      display: none !important
   }

   .rejilla {
      grid-template-columns: 1fr;
      gap: 34px
   }

   .persona {
      max-width: 340px;
      margin-inline: auto
   }

   .pie-grid {
      grid-template-columns: 1fr;
      gap: 36px
   }

   .pie {
      padding-top: 58px
   }

   .pie-legal {
      margin-top: 40px;
      flex-direction: column;
      gap: 12px
   }

   /* Los muñecos de Historia bajan -46px sobre la tarjeta de Misión, valor
     heredado del @media 900 (tablet, 768). A 375 ese mismo negativo hace que
     los pies invadan el padding-top:36px de .mision y se monten sobre la
     palabra "Misión" (el .ai solo pide que los pies toquen el CANTO del azul,
     no que tapen el rótulo). Se acota aquí a -26px: sigue "parado sobre" el
     azul, pero deja los ~10px de aire que evitan la colisión con el texto. */
   .historia-grid>figure {
      margin-bottom: -26px
   }

   /* Recién aquí (375) Misión/Visión se apila a una columna; en 768 sigue en
      dos como el resto de la mesa tablet (ver el @media 900 más arriba). */
   .mv-grid {
      grid-template-columns: 1fr;
      gap: 34px
   }

   /* Tarjeta de Visión en móvil: la caja no se solapa con Misión (se
      resetea el margen negativo de desktop que la sacaba de pantalla por
      la izquierda). En la columna única de móvil, .mv-grid ya pone su
      propio gap:34px entre Misión y Visión, así que no hace falta ningún
      margin-top extra aquí. */
   .marco-vision {
      margin-left: 0;
      align-self: auto;
   }
   /* El padding-top en % (ver regla base) se calcula sobre el ANCHO del
      contenedor, no el alto — así que despejar el sello "Visión 2030"
      necesita la MISMA proporción a cualquier ancho (~28-30%, ver cuenta
      abajo). El problema real en móvil es otro: la tarjeta es una imagen
      de proporción FIJA (no se estira), así que su alto en px se achica al
      angostarse; el párrafo, en cambio, envuelve en MÁS líneas cuanto más
      angosto — a 320px ya no cabe ni con el mejor padding. Se reduce el
      padding lateral (más ancho útil = menos líneas) y el font-size del
      párrafo específicamente aquí, para que el bloque de texto vuelva a
      caber dentro del alto que da la imagen a este ancho. */
   .vision {
      padding: 29% 5% 6%;
   }
   /* clamp (no un px fijo): a 320px hace falta el mínimo para que el párrafo
      quepa dentro del alto de la imagen; a 600px ese mismo mínimo deja
      demasiado aire arriba (el bloque de texto, centrado, envuelve en menos
      líneas con más ancho disponible). El clamp crece con el viewport para
      que el bloque se mantenga proporcionalmente parecido en todo el rango. */
   .vision p {
      font-size: clamp(10px, 2.6vw, 12px);
      line-height: 1.34;
      text-align: center;
   }
}

/* ==========================================================================
   MÓVIL: CENTRADO Y CONTENCIÓN
   --------------------------------------------------------------------------
   El arte del cliente tiene mesa de 375, pero la maqueta heredaba la
   composición de escritorio: todo alineado a la izquierda y varias piezas
   desbordando por la derecha (el chip de cifras, el brochazo del titular y el
   botón Dona quedaban cortados). En una pantalla de mano eso se lee como una
   página rota, no como una decisión.

   Este bloque va al FINAL de la hoja a propósito: así gana a las reglas de
   escritorio sin tener que subirle especificidad a cada una.
   ========================================================================== */
@media (max-width:600px) {

   /* Nada puede sobresalir del ancho de la pantalla. La barra horizontal en un
     móvil es el síntoma más delator de un diseño sin adaptar.

     Las DOS declaraciones de overflow-x no son una duplicada por descuido.
     `hidden` recorta, pero de paso convierte a body en contenedor de scroll, y
     eso MATA position:sticky en toda la página. Medido a 375 antes de este
     cambio: con la página a 900 de scroll la cabecera estaba en top:-920, o
     sea se había ido del todo, y no volvía por mucho que se subiera hasta no
     llegar arriba del documento. `clip` recorta exactamente igual pero NO crea
     contenedor de scroll, así que la cabecera vuelve a pegarse: mismo caso
     medido, top:-84 estando retirada y top:0 al volver.

     Quien no conozca `clip` (Safari anterior al 16) ignora la segunda línea y
     se queda con `hidden`, que es literalmente lo que había hasta hoy: el
     recorte no se pierde en ningún navegador. Y comprobado en las cinco
     páginas a 375: con `clip`, scrollWidth menos clientWidth sigue siendo 0,
     así que la barra horizontal tampoco vuelve. */
   html,
   body {
      max-width: 100%;
      overflow-x: hidden;
      overflow-x: clip;
   }

   /* --- cabecera: que el botón Dona quepa entero --- */
   .cabecera {
      gap: 10px;
      padding-inline: 14px
   }

   .marca img {
      height: 38px
   }

   .hamburguesa {
      width: 46px;
      height: 46px;
      border-radius: 12px
   }

   .cabecera .btn-dona {
      font-size: 15px;
      padding: 11px 16px;
      border-radius: 12px
   }

   .cabecera .btn-dona svg {
      width: 16px;
      height: 16px
   }

   /* --- hero: la columna entera se centra --- */
   .hero-inicio .hero-txt {
      text-align: center
   }

   .hero-inicio .hero-titulo-img {
      margin-inline: auto
   }

   .hero-inicio h1 {
      font-size: 34px
   }

   .hero-inicio h1 .grande {
      font-size: 1.7em
   }

   /* El brochazo es la pieza que más se desbordaba: al ir en versalitas y con
     la manuscrita, una sola palabra larga empujaba el ancho. Se le baja el
     cuerpo y se le permite partir. */
   .brochazo {
      font-size: 1.34em;
      padding: .1em .14em .16em;
      max-width: 100%;
      overflow-wrap: break-word;
   }

   /* --- cifras: centradas y a un ancho que siempre entra ---
     Va con `.hero-grid .cifras` y no con `.cifras` a secas porque la regla de
     tablet reparte los tres chips con space-between usando ese mismo selector
     de dos niveles: con uno solo pierde la cascada por especificidad, no por
     orden, y el chip se quedaba pegado a la izquierda. */
   .hero-grid .cifras {
      justify-content: center;
      gap: 12px
   }

   .cifra {
      width: min(220px, 78vw);
      aspect-ratio: 1/.9
   }

   .cifra b {
      font-size: 34px
   }

   .cifra span {
      font-size: 13px
   }

   .hero-figura img {
      margin-inline: auto
   }

   /* --- resto de secciones: texto centrado y cajas a ancho cómodo --- */
   .gesto,
   .apoyo,
   .territorio .env {
      text-align: center
   }

   .territorio .bajada {
      margin-inline: auto
   }

   .apoyo-caja {
      flex-direction: column;
      gap: 6px
   }

   .apoyo-txt {
      flex: 1 1 auto;
      width: 100%
   }

   .apoyo .botones {
      justify-content: center
   }

   .apoyo .personaje {
      align-self: center;
      margin: 6px auto 0;
      width: min(150px, 42vw)
   }

   .mapa-grid {
      gap: 22px
   }

   .panel-veredas {
      text-align: left
   }

   /* Botones a lo ancho: en el pulgar, un botón angosto es un blanco difícil */
   .apoyo .btn,
   .gesto .btn {
      min-width: 200px;
      justify-content: center
   }

   /* --- pie: centrado, que es como se lee cómodo en una columna --- */
   .pie-grid {
      text-align: center;
      justify-items: center
   }

   .pie-redes {
      justify-content: center
   }

   .pie .sede {
      text-align: center
   }

   .pie img.logo {
      margin-inline: auto
   }

   .pie ul {
      padding: 0
   }

   .pie-legal {
      text-align: center;
      align-items: center
   }

   .pie-legal nav {
      justify-content: center
   }

   .boletin {
      text-align: left;
      width: min(320px, 100%);
      margin-inline: auto
   }
}


/* ==========================================================================
   ENGASTE DE LAS PIEZAS DEL BRANDBOOK
   --------------------------------------------------------------------------
   Dos reglas, y las dos existen por un choque de cascada concreto, no por
   gusto. marca.css se carga DESPUÉS de esta hoja, así que aquí hay que ganarle
   por especificidad; por eso los selectores llevan dos niveles.
   ========================================================================== */

/* El par de marcos de onda con "37 km" y "2.025 msnm" reutiliza .cifras como
   fila. .cifras nació en el hero, donde su única vecina es la figura, y por eso
   sólo declara margen superior: dentro de la banda de territorio queda pegado
   al mapa. Mismo criterio que paginas.css §11 tomó para .bloque .cifras. */
.territorio .cifras {
   margin: 30px 0 36px
}

/* .panel-veredas ul trae padding-left:18px de la sección (dos niveles) y
   .lista-marca declara padding:0 con uno solo: la sangría de la sección gana y
   la lista salía con DOS sangrías, la vieja más la de la viñeta. */
.panel-veredas ul.lista-marca {
   padding-left: 0
}


/* ==========================================================================
   TABLET: LO QUE NO PUEDE ESPERAR A 600
   ========================================================================== */
@media (max-width:900px) {

   /* El sello del brandbook vive en la mitad derecha de la banda de Contacto,
     que a partir de aquí deja de estar libre: el titular pasa a ocupar el ancho
     completo y el sello se le montaría encima. Es decoración pura y va con
     aria-hidden, así que retirarlo no le quita información a nadie.
     Dos niveles para ganarle a .sello-marca{display:block} de marca.css, que
     se carga después de esta hoja. */
   .cabecera-int .sello-marca {
      display: none
   }
}


/* ==========================================================================
   MÓVIL 375: TODO CENTRADO, DE ARRIBA ABAJO
   --------------------------------------------------------------------------
   El encargo del cliente, con sus palabras: "en vista de celular, todo debe
   estar centrado desde el inicio hasta el final, todas las vistas". Este bloque
   lo cumple en las cinco páginas y, de paso, resuelve las tres cosas que en una
   pantalla de mano se notan enseguida cuando faltan: que nada sobresalga, que
   todo lo pulsable tenga 44px de blanco de toque y que los campos de texto no
   provoquen el zoom automático de iOS.

   POR QUÉ VA AL FINAL DEL ARCHIVO Y CON SELECTORES DE VARIOS NIVELES
   -----------------------------------------------------------------
   Ir al final resuelve los empates contra las reglas de esta misma hoja, pero
   NO contra las de paginas.css, marca.css y cierre.css, que se cargan después.
   Contra ésas sólo se puede ganar por especificidad, y por eso casi todos los
   selectores de aquí llevan "body" delante o dos clases: ya pasó en este
   proyecto que una regla de un nivel perdiera contra una de dos y el elemento
   se quedara pegado a la izquierda.

   Cada bloque dice contra qué está compitiendo. Donde no compite con nada, el
   selector va corto.

   DÓNDE NO SE CENTRA, Y POR QUÉ
   -----------------------------
   Tres piezas conservan su texto a la izquierda dentro de una caja que SÍ está
   centrada, porque centrarlas las rompe de verdad:
     · la casilla de autorización de los formularios: una casilla flotando junto
       a la primera línea de un párrafo centrado no se lee como un control.
     · el pie de la ficha del mapa (lo gobierna mapa.css, no se toca).
     · nada más. Los rótulos, los títulos, los párrafos, los botones, las
       tarjetas, las listas y las cifras van centrados.

   NINGUNA REGLA DE ESTE BLOQUE ESCONDE CONTENIDO
   ----------------------------------------------
   No hay un solo opacity:0 ni visibility:hidden. Los dos display:none que
   aparecen son piezas decorativas con aria-hidden (el sello de Contacto, en el
   bloque de 900 de arriba, y la guirnalda y el rastro que ya retira marca.css).
   Está medido en el DOM, página por página.
   ========================================================================== */
@media (max-width:600px) {

   /* --- 1. CENTRADO GENERAL ------------------------------------------------
     text-align se hereda, así que basta con declararlo en la raíz de cada zona
     y luego devolver a la izquierda lo poco que lo necesita. Lo que sigue son
     los contraejemplos: cada uno de estos selectores existe porque hay una
     regla anterior que fijaba "left" y hay que desactivarla. */
   body main,
   body .pie {
      text-align: center
   }

   /* .panel-veredas{text-align:left} lo fija el bloque de móvil de más arriba */
   body .panel-veredas {
      text-align: center
   }

   /* .boletin{text-align:left} idem */
   body .pie .boletin {
      text-align: center
   }

   /* cierre.css §9 alinea a la izquierda las cinco piezas del pie. Es una
     decisión razonada, pero el cliente pidió lo contrario y manda el cliente:
     las cajas siguen centradas en la columna Y ahora su texto también. */
   body .pie .pie-titulo,
   body .pie .pie-enlaces,
   body .pie .sede-pie,
   body .pie .pie-archivo,
   body .pie .pie-contacto,
   body .pie .pie-legal,
   body .pie .pie-datos {
      text-align: center
   }

   body .pie .pie-contacto li {
      justify-items: center
   }

   body .pie .pie-enlaces a {
      justify-content: center
   }

   body .pie .pie-archivo b {
      justify-content: center
   }

   body .pie .pie-cierre {
      align-items: center
   }

   body .pie-legal nav.pie-legal-nav {
      justify-content: center
   }

   body .pie .sede-pie .etiqueta {
      justify-content: center
   }

   /* paginas.css alinea a la izquierda las celdas de la tabla legal */
   body .tabla-legal th,
   body .tabla-legal td,
   body .tabla-legal caption {
      text-align: center
   }

   /* Los bloques de texto con ancho máximo se centran en la columna en vez de
     quedarse anclados al margen izquierdo. Todos traen ya su max-width; lo que
     les falta es el margen automático. */
   body .cabecera-int h1,
   body .cabecera-int .bajada,
   body .bloque .intro,
   body .bloque h2,
   body .nota-legal,
   body .equipo-intro h2,
   body .apoyo p.apoyo-bajada,
   body .apoyo p.apoyo-canales,
   body .historia p,
   body .mision p,
   body .vision p {
      margin-left: auto;
      margin-right: auto
   }

   /* --- 2. REJILLAS A UNA COLUMNA, CON LA TARJETA CENTRADA -----------------
     Las rejillas ya bajan a 1fr en las hojas anteriores. Lo que faltaba es que
     la tarjeta no se estirara de canto a canto: 340px es el ancho al que el
     resto del sitio ya limita las fichas de persona. */
   body .rejilla>*,
   body .rejilla-eventos>*,
   body .rejilla-docs>*,
   body .sedes>*,
   body .bloque>.env>.ficha,
   body .bloque .pendiente {
      width: min(340px, 100%);
      margin-inline: auto
   }

   /* La ficha de documento es un ícono a la izquierda y un texto a la derecha.
     En una columna centrada el ícono se sube encima, que además le da más
     ancho al texto. */
   body .doc {
      flex-direction: column;
      align-items: center;
      gap: 12px
   }

   /* --- 3. LISTAS: LA VIÑETA TIENE QUE VIAJAR CON EL TEXTO -----------------
     Una lista con la viñeta anclada al borde izquierdo y el texto centrado se
     lee como un error de maqueta. Con list-style-position:inside la marca entra
     en la línea y el conjunto se centra de verdad. */
   body .detalle ul,
   body .panel-veredas ul:not(.lista-marca) {
      padding-left: 0;
      list-style-position: inside
   }

   /* .lista-marca pinta su viñeta en un ::before absoluto a la izquierda, así
     que aquí no se centra el texto: se centra la LISTA, que da el mismo
     resultado a la vista y deja la viñeta pegada a su renglón. */
   body .panel-veredas ul.lista-marca {
      width: max-content;
      max-width: 100%;
      margin-inline: auto;
      text-align: left;
   }

   /* Cada renglón de contacto es un ícono y un enlace: se centra la pareja
     entera, no el texto dentro de ella. */
   body .lista-contacto li {
      justify-content: center
   }

   /* --- 4. BLANCOS DE TOQUE DE 44px ---------------------------------------
     Todo lo pulsable que sea un control por sí mismo llega a 44px. Los enlaces
     metidos DENTRO de una frase son la excepción reconocida: estirarlos a 44
     separaría los renglones del párrafo. A esos se les da el relleno vertical
     que la línea admite, que amplía la zona sensible sin mover el texto. */
   body .social-top {
      gap: 4px;
      padding: 0 10px
   }

   body .social-top a {
      width: 44px;
      height: 44px
   }

   body .cabecera .marca {
      min-height: 44px
   }

   body .detalle summary {
      min-height: 44px;
      align-items: center;
      justify-content: center
   }

   body .gesto .liga {
      min-height: 44px;
      display: inline-flex;
      align-items: center
   }

   body .lista-contacto a {
      min-height: 44px;
      display: inline-flex;
      align-items: center
   }

   body .pie .pie-enlaces a {
      min-height: 44px;
      align-items: center
   }

   body .pie .pie-contacto a {
      min-height: 44px;
      display: inline-flex;
      align-items: center
   }

   body .pie .pie-contacto a.mini {
      min-height: 44px
   }

   body .pie-legal-nav a {
      min-height: 44px;
      display: inline-flex;
      align-items: center
   }

   body .pie .boletin button {
      width: 44px;
      height: 44px
   }

   body .consentimiento input {
      width: 24px;
      height: 24px
   }

   /* Enlaces dentro de una frase: el relleno no altera la caja de línea, así que
     el texto no se mueve y la zona sensible crece. */
   body .apoyo-canales a,
   body .pendiente a,
   body .ficha .enlace-sub,
   body .boletin-aviso a,
   body .bloque .intro a {
      padding-block: 9px
   }

   /* --- 5. FORMULARIOS ------------------------------------------------------
     16px es el mínimo: por debajo de eso iOS hace zoom al enfocar el campo y la
     página se descuadra sola. Los campos de paginas.css ya venían en 16; el del
     boletín estaba en 15 y era el único que disparaba el zoom. */
   body .form {
      width: 100%;
      max-width: 100%
   }

   body .campo input,
   body .campo textarea,
   body .campo select {
      font-size: 16px;
      min-height: 48px
   }

   body .campo textarea {
      min-height: 132px
   }

   body .pie .boletin input {
      font-size: 16px
   }

   body .pie .boletin form {
      padding-left: 18px
   }

   /* La casilla de autorización es el único texto que se queda a la izquierda:
     una casilla junto a la primera línea de un párrafo centrado no se lee como
     un control. La CAJA sí queda centrada. */
   body .consentimiento {
      width: min(320px, 100%);
      margin-inline: auto;
      text-align: left;
      align-items: center;
   }

   /* --- 6. TABLAS QUE SE DESPLAZAN DENTRO DE SU CAJA -----------------------
     paginas.css ya apila la tabla legal en celdas de bloque, así que hoy cabe
     de sobra. Esto es la red de seguridad para el día en que alguien añada una
     fila más ancha: la tabla se desplaza por dentro y nunca empuja la página.
     Hace falta display:block para que overflow tenga efecto sobre una tabla. */
   body .tabla-legal {
      display: block;
      overflow-x: auto;
      -webkit-overflow-scrolling: touch
   }

   body .tabla-legal tbody,
   body .tabla-legal tr {
      display: block
   }

   /* --- 7. QUE NADA SOBRESALGA ---------------------------------------------
     Las dos piezas que se salían de la pantalla, medidas en el DOM. */
   /* El contorno a trazos corre 18px hacia la derecha, que es su gracia. Con
     18px de margen por lado, en 375 ese trazo aterriza justo en el canto. Se
     recorta a la mitad y el dibujo se conserva. */
   body .marco-punteado::after {
      inset: 12px -9px -9px 12px
   }

   /* --- 8. RITMO Y CAJAS DEL CIERRE ---------------------------------------- */
   body .apoyo .apoyo-rotulo {
      justify-content: center
   }

   body .territorio .cifras {
      margin: 24px 0 28px
   }
}


/* ==========================================================================
   PANTALLAS MUY ESTRECHAS (360 y menos)
   --------------------------------------------------------------------------
   El par de marcos de onda es lo único que puede quedarse sin sitio: son dos
   piezas de ancho fijo en una fila. Por debajo de 360 se encogen antes de
   partirse en dos renglones, que es lo que el arte hace con las cifras.
   ========================================================================== */
@media (max-width:360px) {
   .territorio .marco-onda {
      --w: 126px
   }

   .territorio .marco-onda b {
      font-size: 26px
   }

   .territorio .marco-onda span {
      font-size: 11px
   }
}


/* ==========================================================================
   MÓVIL 375: SEGUNDA PASADA DE CENTRADO
   --------------------------------------------------------------------------
   El cliente pidió el centrado dos veces, así que esta pasada no se hizo a
   ojo: se recorrieron las cinco páginas a 375px midiendo en el DOM. Para cada
   bloque visible se comparó su hueco izquierdo contra el derecho DENTRO de su
   contenedor (getBoundingClientRect del hijo contra la caja de contenido del
   padre, descontando borde y relleno), y se marcó como fallo toda diferencia
   mayor a 4px en algo que debía ir centrado.

   El bloque anterior de centrado ya resolvía la mayoría. Lo que quedaba vivo
   eran doce piezas, y ninguna se veía "casi bien": todas estaban pegadas a la
   izquierda con 30 a 230px de hueco a la derecha. Cada apartado de aquí abajo
   dice qué se midió y contra qué regla competía.

   POR QUÉ EL PROBLEMA NO ERA EL ORDEN, SINO LA ESPECIFICIDAD
   ---------------------------------------------------------
   paginas.css, marca.css, mapa.css y cierre.css se cargan DESPUÉS de esta
   hoja. Ir al final del archivo sólo gana empates dentro de estilo.css; contra
   esas cuatro hay que ganar por peso. El caso de libro está en el apartado 4:
   la corrección anterior se escribió sobre el <li> cuando la regla que mandaba
   era de cierre.css y estaba sobre el <ul>, así que el <li> se centraba dentro
   de una rejilla que seguía alineada a la izquierda. Se veía igual de mal y no
   era un error de orden. Por eso aquí cada selector lleva "body" delante o dos
   clases, y el resultado se comprobó volviendo a medir, no suponiendo.

   QUÉ SE DEJÓ A LA IZQUIERDA, A PROPÓSITO
   ---------------------------------------
   Dos piezas, las mismas de la pasada anterior:
     · la casilla de autorización de los dos formularios de Contacto. Su caja
       va centrada; el texto no, porque una casilla flotando junto a la primera
       línea de un párrafo centrado deja de leerse como un control.
     · la lista con el aspa de marca del panel de veredas (.lista-marca--aspa).
       Su viñeta se pinta en un ::before pegado al canto izquierdo del renglón:
       si se centra el texto, la viñeta se queda huérfana a un lado. Se centra
       la LISTA entera y el texto conserva su sangría, que es como se lee una
       lista con viñetas.
   Los párrafos largos SÍ van centrados. Tipográficamente se leerían mejor
   alineados a la izquierda, pero el encargo del cliente es explícito y ya va
   por la segunda vez; entre la preferencia de manual y lo que el cliente pide
   dos veces, manda el cliente.

   ESTE BLOQUE NO ESCONDE NADA
   ---------------------------
   Ni un opacity:0, ni un visibility:hidden, ni un display:none. Sólo cambia
   alineación, anchos y relleno. Tampoco añade ni una transición: el contrato
   de movimiento de animaciones.css se respeta entero.
   ========================================================================== */
@media (max-width:600px) {

   /* --- 1. CABECERA -------------------------------------------------------
     El menú desplegable, el botón Dona y el salto al contenido viven dentro de
     <header>, no de <main> ni de .pie, así que "body main{text-align:center}"
     nunca los alcanzó. Medido: los seis enlaces del menú salían de 295px de
     ancho con el texto en el canto izquierdo. */
   body .cabecera .menu {
      align-items: center;
      text-align: center
   }

   body .cabecera .menu a {
      text-align: center
   }

   body .cabecera .btn-dona {
      text-align: center
   }

   /* El subrayado de la página actual se dibuja con left:0;right:0, que en la
     píldora de escritorio equivale al ancho del enlace. En el desplegable el
     enlace ocupa el renglón entero, así que ese mismo subrayado cruzaba de
     canto a canto por debajo de una palabra centrada. Se recorta a 28px y se
     centra: con left y right en 0 y un ancho definido, margin-inline:auto sí
     centra una caja absoluta. El enlace conserva su ancho completo, que es lo
     que le da el blanco de toque de todo el renglón. */
   body .cabecera .menu a[aria-current="page"]::after,
   body .cabecera .menu a.nav-activo::after {
      width: 28px;
      margin-inline: auto
   }

   /* El salto al contenido sólo aparece con el teclado, pero cuando aparece es
     una caja visible más. Se centra la caja y su texto. */
   body .saltar {
      left: 0;
      right: 0;
      width: max-content;
      margin-inline: auto;
      text-align: center
   }

   /* --- 2. BALDOSAS DE PROGRAMAS (index) ----------------------------------
     .tile es un flex con align-items:flex-end y un único <div> dentro. Ese div
     es un elemento flexible sin ancho propio, así que se encogía al ancho de
     su contenido y se quedaba en el canto izquierdo: medido, 122px de caja en
     287px de tile con el <details> cerrado, y 254px con él abierto. El texto
     iba centrado DENTRO de esa caja estrecha, que es justo lo que hace que el
     fallo pase desapercibido al mirar y salte al medir.
     Se le da el ancho completo, que además le deja sitio a la lista de dentro.
     El justify-content es el cinturón por si algún día entra un segundo hijo. */
   body .tablero .tile {
      justify-content: center
   }

   body .tablero .tile>div {
      width: 100%
   }

   /* --- 3. BOTONES SUELTOS ------------------------------------------------
     .contacto-grid .botones (paginas.css) es un flex que nunca declaró
     justify-content, así que caía en flex-start: el botón "Quiero ser
     voluntario" medía 306px dentro de 339 y dejaba los 33px libres todos a la
     derecha. .apoyo .botones ya venía centrado; esto extiende el mismo
     criterio a los demás. */
   body .contacto-grid .botones,
   body .bloque .botones,
   body .ficha .botones {
      justify-content: center
   }

   /* --- 4. PIE: LA REJILLA DE CONTACTO ------------------------------------
     Éste es el fallo que sobrevivió a la pasada anterior. cierre.css declara
     ".pie .pie-contacto{justify-items:start}" (dos clases) y la corrección se
     escribió sobre ".pie .pie-contacto li": distinto elemento, así que la
     rejilla siguió alineando sus dos fichas a la izquierda. Medido: el grupo
     ocupaba 275px de 320 con los 45px libres a la derecha.
     Con tres niveles gana, y la regla sobre el <li> se queda porque hace otra
     cosa: centra el contenido DENTRO de cada ficha. */
   body .pie .pie-contacto {
      justify-items: center
   }

   /* --- 5. TABLA LEGAL: EL TÍTULO DE LA TABLA -----------------------------
     La tabla pasa a display:block en móvil para poder desplazarse por dentro.
     Su <caption> siguió siendo display:table-caption, y una fila de tabla
     dentro de una caja que ya no es tabla se encoge a su contenido: 111px de
     rótulo en 339 de ancho, todo el hueco a la derecha. Como bloque normal
     ocupa el ancho y hereda el centrado. */
   body .tabla-legal caption {
      display: block;
      width: 100%
   }

   /* --- 6. PIE DEL MAPA ---------------------------------------------------
     Estas reglas se escriben aquí y no en mapa.css a propósito: esa hoja la
     está tocando otra persona. Van con dos clases más "body" para ganarle por
     peso pase lo que pase con el orden de carga, y sólo por debajo de 600.

     .mapa-pie apila sus piezas con align-items:flex-start, que en una columna
     encoge cada hija a su contenido y la deja pegada al canto: la lista de
     resumen medía 179px dentro de 340 con 161px de hueco a la derecha. */
   body .mapa-lienzo .mapa-pie {
      align-items: center
   }

   /* Los dos chips de aviso son un punto (o una chispa) y un texto en fila. El
     adorno se alinea con la PRIMERA línea, que en escritorio es la única y se
     lee como la viñeta que es. En la pantalla de mano el aviso ocupa tres
     renglones centrados y ese mismo adorno se queda solo arriba a la
     izquierda: medido, el texto arrancaba 20px a la derecha del punto y el
     conjunto no leía como un bloque centrado. Puesto en columna, el adorno
     queda centrado encima del texto, que es su sitio natural cuando el texto
     ya no cabe en un renglón. El hueco lo sigue poniendo el gap del chip. */
   body .mapa-pie .mapa-rotulo,
   body .mapa-pie .mapa-invita {
      flex-direction: column;
      align-items: center
   }

   body .mapa-pie .mapa-rotulo::before {
      margin-top: 0
   }

   /* Aquí vivían dos reglas para la barra del recorrido guiado que había debajo
     del mapa: una centraba sus mandos y otra descuadraba cuatro píxeles el
     marcador de posición. Esa barra ya no existe. La reemplazan dos flechas en
     el costado izquierdo del mapa, en posición absoluta sobre lienzo vacío, y
     no pasan por el reparto en columna de .mapa-pie. Ver mapa.css §6.b. */

   /* La leyenda de líneas de trabajo la escribe mapa.js, no el HTML: en el
     marcado el <ul> viene vacío. Por eso hay que medirla DESPUÉS de que el
     JavaScript la rellene, y por eso se escapó de la primera lectura. Es una
     fila que envuelve sin justificar, así que sus cinco chips se apilaban a la
     izquierda dejando hasta 128px de hueco a la derecha en el último renglón.
     Dos clases más el elemento para ganarle a mapa.css, que la define con
     ".panel-veredas ul.leyenda-mapa". */
   body .panel-veredas ul.leyenda-mapa {
      justify-content: center
   }

   /* Mismo caso que la leyenda, y también invisible hasta que alguien toca un
     marcador: la lista de resumen del mapa nace con [hidden] y mapa.js la
     destapa. Cuando lleva dos chips ya no caben en un renglón, así que el <ul>
     pasa a ocupar los 340px y cada chip se queda en el canto izquierdo de su
     fila con 160px de hueco al otro lado. Centrar el <ul> no bastaba: hay que
     centrar el reparto de las filas. */
   body .mapa-pie ul.mapa-resumen {
      justify-content: center
   }

   /* Los tres renglones del panel "Dónde estamos" son botones, y por debajo de
     600 mapa.css los pasa a flex para darles los 44px de alto. El efecto
     lateral es que el <b> con el nombre del sitio y el texto que le sigue se
     vuelven dos columnas: "Cáchira, N. de S." se quedaba en una de 121px y
     ", sede principal" se partía en dos renglones en la de al lado, con el
     hueco entre ambas leyéndose como un error de maqueta.
     Vuelto a bloque, el nombre y su papel fluyen como una sola frase y parten
     por donde les toca. Los 44px se conservan con relleno: 24,8px de renglón
     más 10 por lado dan 44,8. Medido. */
   body .panel-veredas .hito-liga {
      display: block;
      padding-block: 10px
   }

   /* --- 7. BLANCOS DE TOQUE QUE FALTABAN ----------------------------------
     Lo que sigue son las piezas que quedaron por debajo de 44px al medirlas
     con getBoundingClientRect. Los marcadores del mapa NO están aquí: parecen
     de 11px pero mapa.css les monta un aro invisible de 17px por lado, o sea
     45px de zona sensible. Medido y verificado. */

   /* El enlace "Dona" del pie medía 41px de ancho: es el único de la lista con
     una palabra tan corta. El alto ya estaba. */
   body .pie .pie-enlaces a {
      min-width: 44px
   }

   /* Enlaces metidos dentro de una frase. Se les crece el relleno vertical, que
     agranda la zona sensible sin mover ni un renglón del párrafo: la caja de
     línea de un elemento en línea no cuenta su relleno. Los valores no son
     redondos por gusto, salen de la medida: 21px de texto más 12 por lado dan
     45; los 12,5px del aviso del boletín necesitan 14 por lado para llegar.
     Efecto colateral asumido: cuando dos de estos enlaces caen en renglones
     seguidos, sus zonas sensibles se solapan unos milímetros y manda el
     último. Entre eso y dejar blancos de 35px, se prefiere esto. */
   body .apoyo .apoyo-canales a {
      padding-block: 12px
   }

   body .ficha .enlace-sub,
   body .bloque .ficha p a {
      padding-block: 12px
   }

   body .boletin .boletin-aviso a {
      padding-block: 14px
   }

   /* --- 8. FORMULARIOS ----------------------------------------------------
     Los campos de texto ya estaban en 16px, que es el umbral por debajo del
     cual iOS acerca la página al enfocar. La casilla de autorización se había
     quedado en el 13,3px que trae el navegador. No dispara el zoom por ser una
     casilla, pero se iguala para que el formulario entero cumpla la misma
     regla y nadie tenga que acordarse de la excepción.
     El blanco de toque de la casilla lo da su <label>, que la envuelve entera
     junto al texto: medido, 279px de ancho por tres renglones de alto. */
   body .consentimiento input[type="checkbox"] {
      font-size: 16px
   }
}

/* ==========================================================================
   HEADER MÓVIL — alineado al documento de diseño (.ai, mesa de trabajo 375)
   --------------------------------------------------------------------------
   El documento móvil trae la cabecera con SOLO el logo (nube) + la hamburguesa
   verde: sin la barra de redes superior y sin el botón "Dona" en el header.
   El acceso a Dona se conserva en el botón del hero (.hero-dona) y en el pie;
   las redes siguen en el pie. Va al FINAL para ganar a las reglas móviles
   previas (varias con prefijo `body`) sin subir especificidad una a una.
   ========================================================================== */
@media (max-width:600px) {
   body .social-top {
      display: none
   }

   body .cabecera .btn-dona {
      display: none
   }

   /* Hamburguesa como en el documento: trazos verdes de marca, sin caja blanca. */
   body .cabecera .hamburguesa {
      width: auto;
      height: auto;
      padding: 6px 2px;
      margin-left: auto;
      background: transparent;
      box-shadow: none;
      border-radius: 0;
   }

   body .cabecera .hamburguesa span {
      width: 30px;
      height: 3.4px;
      margin: 4px 0;
      background: var(--verde);
   }
}

/* ==========================================================================
   APOYO EN MÓVIL — ajuste al mockup del cliente (2026-08-01)
   ========================================================================== */
@media (max-width:600px) {
   .apoyo {
      padding: 60px 0 70px;
      overflow: hidden;
   }

   .apoyo-caja {
      display: flex;
      flex-direction: column;
      align-items: flex-start;
      position: relative;
      padding-inline: 24px;
      box-sizing: border-box;
   }

   .apoyo-txt {
      width: 100%;
      display: flex;
      flex-direction: column;
      align-items: flex-start;
      text-align: left;
   }

   /* Título en 4 líneas con interlineado estrecho como en el arte */
   .apoyo h2 {
      width: 100%;
      text-align: left;
      font-size: 28px;
      font-weight: 900 !important;
      line-height: 0.85 !important;
      position: relative;
      padding-right: 135px;
      box-sizing: border-box;
      margin: 0;
   }

   .apoyo h2 .tu-word {
      display: block !important;
      font-size: 1em !important;
      font-weight: 900 !important;
      transform: none !important;
      margin: 0 0 -2px 0 !important;
      color: #000;
   }

   .apoyo h2 .mano {
      display: block !important;
      font-size: 1.8em !important;
      line-height: 0.8 !important;
      margin: -4px 0 -4px 0 !important;
      color: var(--rojo-hero, #FE1213);
   }

   /* Muñequito a la derecha del título, SIN encimarse a "APOYO". right:95px
      metía la cabeza del muñeco sobre la última O y el lápiz quedaba pegado
      al header sticky (z-index 60 > el 2 de acá); right:60px seguía
      encimando ~36px sobre la O y la Y (medido con getBoundingClientRect en
      375px: .mano llega a x=183, .personaje empezaba en x=147). El cliente
      lo reportó como "la muñeca tapa la palabra". right:12px deja
      .personaje en x=195, ~12px después de donde termina el texto. */
   .apoyo .personaje {
      position: absolute !important;
      top: -15px !important;
      right: -38px !important;
      left: auto !important;
      width: 135px !important;
      height: auto !important;
      margin: 0 !important;
      z-index: 2;
   }

   /* .lazo-izq nunca tuvo ajuste propio para móvil: seguía con la fórmula de
      escritorio (left:calc(50% - 832px), 720px de ancho), pensada para que
      el confetti cayera lejos, a la derecha del boton Dona en una pantalla
      ancha. En 375px ese cálculo da left:-644px y el recorte que SÍ entra en
      pantalla es justo el de los 5 triángulos, que caían encima de "APOYO"
      (uno reemplazando visualmente la Y — el cliente lo reportó como "la
      información se sale del recuadro"). Subido por encima del título, a la
      altura de la nube: verificado en 320/360/375/390/414px que ni el trazo
      ni los triángulos tocan "Tu"/"APOYO"/"hace la diferencia" en ningún
      ancho.
      height:auto es necesario porque las 6 páginas usan <img width="..."
      height="..."> y esos atributos HTML fijan el alto aunque el CSS sólo
      toque el ancho. Sin height:auto el navegador estira la imagen a su alto
      original (456px o 537px) con el ancho reducido, deformándola y
      alargándola muy por debajo de donde se ve — así fue como el lazo-der
      terminó cruzando "diferencia" y quedó verificado con captura real en
      eventos.html (375px) al arreglarlo. */
   .apoyo .lazo-izq {
      left: -30px !important;
      top: -205px !important;
      width: 280px !important;
      height: auto !important;
   }

   /* .lazo-der: mismo <img> en las 6 páginas (index incluido, desde que se
      reemplazó el SVG calcado a mano por el mismo raster que ya usaban
      eventos/contacto/voluntarios/nosotros/legal) — proporción real 678x537,
      un arco simple + 4 triángulos. Empujado arriba y a la derecha para que
      sólo asome una esquina decorativa, igual que se hizo con .lazo-izq:
      verificado en eventos.html que no toca h2 ni el párrafo. */
   .apoyo img.lazo-der {
      left: auto !important;
      right: -90px !important;
      top: -110px !important;
      width: 380px !important;
      height: auto !important;
      z-index: 1 !important;
   }

   .apoyo p.apoyo-bajada {
      text-align: left;
      width: 100%;
      max-width: 250px;
      margin: 16px 0 24px;
      font-size: 11.5px;
      line-height: 1.35;
      color: #222;
      font-weight: 400;
   }

   /* Botones apilados centrados */
   .apoyo .botones {
      width: 100%;
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 14px;
      margin-top: 30px !important;
      transform: none !important;
   }

   .apoyo .botones .btn {
      width: 100%;
      max-width: 270px;
      min-width: 0;
      justify-content: center;
      text-align: center;
      box-sizing: border-box;
      font-weight: 700;
   }

   .apoyo .botones .btn-dona {
      font-size: 17px;
      padding: 13px 20px;
      border-radius: 12px;
      background: #FF0000;
      color: #fff;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18);
      border: 1px solid rgba(255, 255, 255, 0.4);
      transform: translateX(-60px) !important;
   }

   .apoyo .botones .btn-hueco {
      font-size: 15px;
      padding: 13px 20px;
      border-radius: 12px;
      background: #FF0000;
      color: #fff;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18);
      border: 1px solid rgba(255, 255, 255, 0.4);
      transform: translateX(80px) !important;
   }

}