/* Hoja compartida por todas las fichas de proyecto.
   Un cambio aquí se aplica a los 10. Generadas por generar.mjs. */
*,*::before,*::after{box-sizing:border-box}
:root{
  --paper:#e9e9e7; --paper-2:#dedcd8; --ink:#000; --void:#141017;
  --mute:#6f6b76; --line:rgba(0,0,0,.14); --accent:#d6ff3f;
  --sans:'Plus Jakarta Sans',system-ui,-apple-system,'Segoe UI',sans-serif;
  --fs-display:clamp(2.6rem,7vw,7rem);
  --fs-h2:clamp(1.5rem,2.4vw,2.4rem);
  --fs-body:clamp(1rem,1.25vw,1.25rem);
  --fs-micro:.875rem;
  --r-lg:60px; --r-md:20px; --r-pill:100px;
  --gut:clamp(1.25rem,3.4vw,3.4rem);
  --max:1600px; --medida:1120px; --sec:clamp(3.5rem,9vh,7rem);
}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--sans);font-size:1rem;line-height:1.6;
  -webkit-font-smoothing:antialiased;overflow-x:hidden
}
a{color:inherit;text-decoration:none}
h1,h2{margin:0;font-weight:300;letter-spacing:normal;line-height:1}
p{margin:0}
body::after{
  content:'';position:fixed;inset:0;z-index:999;pointer-events:none;opacity:.035;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E")
}
.wrap{max-width:var(--max);margin-inline:auto;padding-inline:var(--gut)}
main.wrap{padding-bottom:var(--r-lg)}
.eyebrow{font-size:var(--fs-micro);font-weight:600;letter-spacing:.15em;text-transform:uppercase;line-height:1.3}
.arrow{width:1em;height:1em;stroke:currentColor;fill:none;stroke-width:1.8;flex:0 0 auto}

/* ── barra superior ── */
.top{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:clamp(1.1rem,2.4vw,1.9rem) var(--gut)}
.logo{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;
      font-size:1.5rem;font-weight:500;letter-spacing:-.1em;text-transform:lowercase}
.volver{display:inline-flex;align-items:center;min-height:44px;gap:.5rem;font-weight:500;
        border-bottom:1px solid transparent;transition:border-color .3s}
.volver:hover{border-color:var(--ink)}
.volver .arrow{transition:transform .3s}
.volver:hover .arrow{transform:translateX(-3px)}

/* El idioma y el enlace de volver van juntos a la derecha. Sueltos, el
   space-between de .top dejaba el selector flotando en mitad de la barra. */
.top-der{display:flex;align-items:center;gap:.2rem}

/* selector de idioma en la barra superior de las paginas interiores */
.idioma{display:inline-flex;align-items:center;margin-right:.9rem;padding-right:.9rem;
        border-right:1px solid var(--line)}
.idioma a{display:inline-flex;align-items:center;min-height:44px;padding:0 .45rem;
          font-size:.75rem;font-weight:500;letter-spacing:.06em;
          color:rgba(0,0,0,.4);transition:color .3s}
.idioma a.on,.idioma a:hover{color:var(--ink)}

/* ── portada ── */
.hero{padding:clamp(2rem,7vh,5rem) 0 var(--sec)}
.hero .eyebrow{color:rgba(0,0,0,.5);margin-bottom:1.4rem}
.hero h1{font-size:var(--fs-display);margin-bottom:2rem}
.lead{font-size:var(--fs-body);line-height:1.55;color:rgba(0,0,0,.68);max-width:44rem}

/* Aviso de atribucion bajo la entradilla: tiene que leerse, no esconderse. */
.hero .aviso{margin-top:1rem;max-width:44rem;
             font-size:var(--fs-micro);line-height:1.55;color:rgba(0,0,0,.62)}

/* ── bloque de datos ── */
.meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:1.6rem;
      border-top:1px solid var(--line);padding-top:1.8rem;margin-bottom:var(--sec)}
.meta .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.5rem}
.meta b{font-weight:500;font-size:1rem}
.meta a{display:inline-flex;align-items:center;min-height:44px;gap:.4rem;font-weight:500;
        border-bottom:1px solid transparent;transition:border-color .3s}
.meta a:hover{border-color:var(--ink)}

/* ── imágenes ── */
/* Medida de las imagenes. A los 1491px del ancho completo cada plancha
   se comia la pantalla y obligaba a hacer scroll para ver una sola foto.
   1120 no es un numero redondo por gusto: es el ancho nativo de los
   archivos mas pequenos, asi que ninguna se amplia y todas se ven
   nitidas. Van centradas dentro del ancho general. */
.shot.ancho,.par,.galeria{max-width:var(--medida);margin-inline:auto}
.shot{margin:0 0 clamp(1.4rem,3vw,2.4rem)}
.shot .frame{
  border-radius:var(--r-md);overflow:hidden;aspect-ratio:16/10;
  display:grid;place-items:center;color:rgba(255,255,255,.5);
  font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase
}
.shot img,.shot video,.shot iframe{width:100%;height:100%;object-fit:cover;display:block;border:0}
.shot figcaption{margin-top:.9rem;font-size:var(--fs-micro);color:rgba(0,0,0,.5)}
.par{display:grid;grid-template-columns:1fr 1fr;gap:clamp(1rem,2.4vw,2rem);margin-bottom:clamp(1.4rem,3vw,2.4rem)}
.par .shot{margin-bottom:0}
@media(max-width:760px){.par{grid-template-columns:1fr}}
/* marcadores de color mientras no hay imagen real */
.f1{background:linear-gradient(155deg,#1d2b26,#2f5147 48%,#4d7d6e)}
.f2{background:linear-gradient(155deg,#75391a,#b56732 48%,#dc9d5f)}
.f3{background:linear-gradient(155deg,#101218,#282d35 55%,#474e5a)}
.f4{background:linear-gradient(155deg,#2a2140,#4b3a72 48%,#7a63ad)}

/* ── imagen a sangre ── */
/* calc(50% - 50vw) en el margen la saca de la medida hasta el borde del
   viewport sin tocar el ancho. El body ya lleva overflow-x:hidden, asi
   que no aparece barra horizontal. El pie se queda dentro de la medida:
   una linea de texto pegada al borde de la pantalla no se lee. */
.shot.sangrado{max-width:none;margin-inline:calc(50% - 50vw);
  margin-bottom:clamp(1.4rem,3vw,2.4rem)}
.shot.sangrado .frame{border-radius:0}
.shot.sangrado figcaption{max-width:var(--medida);margin-inline:auto;padding-inline:var(--gut)}

/* ── vertical con texto al lado ── */
.vertical{max-width:var(--medida);margin:0 auto var(--sec);
  display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1fr);
  gap:clamp(1.6rem,4vw,3.4rem);align-items:center}
.vertical.derecha .shot{order:2}
.vertical .shot{margin-bottom:0}
.vertical-txt h2{font-size:var(--fs-h2);font-weight:300;margin-bottom:1.2rem}
.vertical-txt p{color:rgba(0,0,0,.72);line-height:1.65;margin-bottom:1rem;max-width:34rem}
.vertical-txt p:last-child{margin-bottom:0}
@media(max-width:760px){
  .vertical{grid-template-columns:1fr;gap:1.6rem}
  .vertical.derecha .shot{order:0}
}

/* ── mosaico ── */
.mosaico{max-width:var(--medida);margin:0 auto var(--sec);
  display:grid;grid-template-columns:repeat(12,1fr);
  gap:clamp(1rem,2.4vw,2rem);align-items:start}
.mosaico .shot{margin-bottom:0}
.mosaico .bajo{margin-top:clamp(2rem,6vw,5rem)}
/* En movil el mosaico se deshace: una columna y sin descuelgue. El
   !important pisa el grid-column que va en linea, que es donde vive el
   ancho de cada pieza. */
@media(max-width:760px){
  .mosaico{grid-template-columns:1fr;gap:1.4rem}
  .mosaico .shot{grid-column:1/-1!important}
  .mosaico .bajo{margin-top:0}
}

/* ── paleta de marca ── */
.paleta{max-width:var(--medida);margin:0 auto var(--sec)}
.paleta .eyebrow{color:rgba(0,0,0,.42);margin-bottom:1.2rem}
/* Cuatro columnas y filas de igual alto: el primer color ocupa 2x2 y los
   demas se reparten lo que queda. Con cinco colores la rejilla cierra
   exacta; con otros numeros la ultima fila queda corta, que es preferible
   a estirar un swatch hasta deformarlo. */
.paleta-grid{display:grid;grid-template-columns:repeat(4,1fr);
  grid-auto-rows:minmax(148px,1fr);gap:clamp(.6rem,1.4vw,1rem)}
.paleta-color{border-radius:var(--r-md);padding:clamp(1rem,2vw,1.4rem);
  display:flex;flex-direction:column;justify-content:space-between;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.06)}
.paleta-color.destacado{grid-column:span 2;grid-row:span 2}
.paleta-color.ancho{grid-column:span 2}
.paleta-nombre{font-size:var(--fs-micro);font-weight:500}
.paleta-hex{font-size:var(--fs-micro);letter-spacing:.08em;font-variant-numeric:tabular-nums;opacity:.85}
@media(max-width:760px){
  .paleta-grid{grid-template-columns:repeat(2,1fr)}
  .paleta-color.destacado{grid-row:span 1;min-height:200px}
}

/* ── vídeo ── */
.video .frame{aspect-ratio:16/9;background:#000}

/* ── galería en carrusel ── */
.galeria{margin-bottom:var(--sec)}
.galeria .track{
  display:grid;grid-auto-flow:column;grid-auto-columns:min(46%,520px);
  gap:clamp(1rem,2vw,1.6rem);overflow-x:auto;scroll-snap-type:x mandatory;
  scrollbar-width:none;cursor:grab;padding-bottom:.5rem
}
.galeria .track::-webkit-scrollbar{display:none}
.galeria .track.drag{cursor:grabbing;scroll-snap-type:none}
.galeria .slide{scroll-snap-align:start;user-select:none;margin:0}
.galeria .slide .frame{border-radius:var(--r-md);overflow:hidden;display:grid;place-items:center;
  color:rgba(255,255,255,.5);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase}
.galeria .slide img{width:100%;height:100%;object-fit:cover;display:block}
.galeria .slide figcaption{margin-top:.8rem;font-size:var(--fs-micro);color:rgba(0,0,0,.5)}
@media(max-width:760px){.galeria .track{grid-auto-columns:86%}}
.bullets{display:flex;justify-content:center;margin-top:1.4rem}
.bullets button{width:44px;height:44px;padding:0;border:0;background:none;cursor:pointer;display:grid;place-items:center}
.bullets button::before{content:'';width:7px;height:7px;border-radius:50%;
  background:rgba(0,0,0,.2);transition:background .3s,transform .3s}
.bullets button.on::before{background:var(--ink);transform:scale(1.35)}

 /* ── rejilla del índice: 2 por fila ── */
.pgrid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(1.4rem,3vw,2.6rem);margin-bottom:var(--sec)}
@media(max-width:820px){.pgrid{grid-template-columns:1fr}}
.pcard{position:relative;display:block;transition:transform .35s}
.pcard:hover{transform:translateY(-4px)}
.pcard-img{
  border-radius:var(--r-md);overflow:hidden;aspect-ratio:4/3;margin-bottom:1.2rem;
  display:grid;place-items:center;color:rgba(255,255,255,.5);
  font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase
}
.pcard-img img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .5s}
.pcard:hover .pcard-img img{transform:scale(1.04)}
.pcard-txt .eyebrow{color:rgba(0,0,0,.45);display:block;margin-bottom:.5rem}
.pcard-txt h2{font-size:clamp(1.4rem,2.2vw,2.1rem);font-weight:300;line-height:1.15}
.pcard-tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.9rem}
.pcard-tags span{font-size:.8125rem;border:1px solid var(--line);border-radius:var(--r-pill);padding:.28rem .75rem}
.pcard-go{
  position:absolute;top:1rem;right:1rem;width:46px;height:46px;border-radius:50%;
  background:rgba(255,255,255,.9);backdrop-filter:blur(8px);display:grid;place-items:center;
  transition:background-color .3s,color .3s
}
.pcard:hover .pcard-go{background:var(--ink);color:var(--paper)}

/* ── bloque de texto ── */
.cierre{max-width:44rem;margin-bottom:var(--sec)}
.cierre h2{font-size:var(--fs-h2);line-height:1.3;margin-bottom:1.2rem;font-weight:400}
.cierre p{color:rgba(0,0,0,.68);font-size:var(--fs-body);line-height:1.55;margin-bottom:1rem}

/* ── espina del caso: reto / enfoque / resultado ── */
.caso{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(1.4rem,2.8vw,2.4rem);
      border-top:1px solid var(--line);padding-top:2rem;margin-bottom:var(--sec)}
@media(max-width:1100px){.caso{grid-template-columns:1fr 1fr;gap:2rem}}
@media(max-width:620px){.caso{grid-template-columns:1fr;gap:1.8rem}}
/* el numero de tiempo delante: deja leer el caso como una secuencia */
.caso-col{counter-increment:paso}
.caso-col .eyebrow::before{content:counter(paso,decimal-leading-zero) ' · ';opacity:.5}
.caso{counter-reset:paso}
.caso .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.9rem}
.caso p{color:rgba(0,0,0,.72);line-height:1.6;margin-bottom:.8rem}
.caso p:last-child{margin-bottom:0}

/* ── el caso en una nota ── */
/* Caja centrada y estrecha: la medida corta es la que hace que un parrafo
   centrado se lea: a 1120px el ojo pierde el renglon al volver. El radio
   escala con el ancho, porque 60px fijos en movil se comen la esquina. */
.nota{max-width:46rem;margin:0 auto var(--sec);
      padding:clamp(2rem,5vw,3.4rem) clamp(1.8rem,5vw,3.4rem);
      border:1px solid var(--line);border-radius:clamp(28px,6vw,var(--r-lg));
      text-align:center}
.nota .eyebrow{color:rgba(0,0,0,.42);margin-bottom:1rem}
.nota p{color:rgba(0,0,0,.72);font-size:var(--fs-body);line-height:1.6;margin-bottom:1rem}
.nota p:last-child{margin-bottom:0}

/* ── cifras del proyecto ── */
.cifras-p{border-top:1px solid var(--line);padding-top:2.2rem;margin-bottom:var(--sec)}
.cifras-rej{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
            gap:clamp(1.4rem,3vw,2.4rem)}
/* min-width y el corte de palabra son la red de seguridad: un valor de
   texto largo encoge dentro de su columna en vez de desbordarla sobre la
   de al lado, que es como "Nacional" acababa escrito sobre "24/7". */
.cifra{min-width:0}
.cifra b{display:block;font-size:clamp(2.2rem,4.5vw,3.6rem);font-weight:300;line-height:1;
         overflow-wrap:break-word}
.cifra span{display:block;margin-top:.6rem;font-size:var(--fs-micro);
            color:rgba(0,0,0,.5);line-height:1.4}
.cifras-fuente{margin-top:clamp(1.4rem,3vw,2.4rem);font-size:var(--fs-micro);
               color:rgba(0,0,0,.42)}

/* Pie legal del caso: mismo cuerpo que el aviso, al final del contenido
   y antes de la navegacion entre proyectos. */
.caso-legal{max-width:44rem;margin:0 0 var(--sec);
            font-size:var(--fs-micro);line-height:1.55;color:rgba(0,0,0,.62)}

/* ── saltos entre proyectos ── */
/* Dos columnas, anterior y siguiente. Con una sola direccion, llegar al
   proyecto 2 desde el 3 obligaba a dar la vuelta entera por el 4 y el 1.
   El enlace de Volver existe, pero vive arriba del todo y para cuando
   has bajado hasta aqui ya no esta a la vista. */
.saltos{display:grid;grid-template-columns:1fr 1fr;gap:clamp(1rem,2vw,1.6rem);
  margin-bottom:var(--sec);align-items:stretch}
.saltos .next{margin-bottom:0}
/* En el de vuelta la flecha va delante, pegada al texto: con
   space-between quedaria en la otra punta y apuntando a ningun sitio. */
.next.atras{justify-content:flex-start}
@media(max-width:760px){.saltos{grid-template-columns:1fr}}

.next{
  background:#fff;border-radius:var(--r-lg);padding:clamp(2rem,5vw,3.5rem);
  display:flex;justify-content:space-between;align-items:center;gap:1.5rem;flex-wrap:wrap;
  margin-bottom:var(--sec);transition:transform .3s
}
.next:hover{transform:translateY(-3px)}
.next .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.6rem}
.next strong{display:block;font-size:var(--fs-h2);font-weight:300;line-height:1.1}
.next .go{width:56px;height:56px;flex:0 0 56px;border-radius:50%;border:1px solid var(--line);
          display:grid;place-items:center;font-size:1.1rem;transition:background-color .3s,color .3s}
.next:hover .go{background:var(--ink);color:var(--paper)}

/* ── pie completo, mismo panel blanco que la portada ── */
.foot{
  background:#fff;color:var(--ink);
  border-radius:var(--r-lg) var(--r-lg) 0 0;
  margin-top:calc(var(--r-lg) * -1);   /* monta sobre el hueso: si no, la
                                          esquina recortada deja ver el fondo */
  /* el mismo respiro que el pie de la portada: alli --sec es mayor que aqui,
     asi que el pie lleva su propia medida y no la del ritmo de la ficha */
  padding:clamp(4rem,11vh,9rem) 0 6rem;position:relative;z-index:2
}
.foot-top{
  display:flex;justify-content:space-between;align-items:flex-end;gap:2rem;flex-wrap:wrap;
  padding-bottom:2rem;border-bottom:1px solid var(--line);margin-bottom:clamp(2rem,6vh,4rem)
}
.foot-id .eyebrow{color:rgba(0,0,0,.42)}
.foot-id b{display:block;font-size:1rem;font-weight:500;margin-top:.45rem}
.avatar{
  width:96px;height:96px;flex:0 0 96px;border-radius:50%;overflow:hidden;
  background:linear-gradient(160deg,var(--paper-2),#c9c6c0);display:grid;place-items:center;
  font-size:.6rem;letter-spacing:.12em;color:rgba(0,0,0,.38);text-transform:uppercase;text-align:center
}
.avatar img{width:100%;height:100%;object-fit:cover}
.big{font-size:clamp(3rem,8.92vw,8.92rem);font-weight:300;line-height:1;
     display:flex;align-items:flex-end;flex-wrap:wrap;gap:clamp(1.2rem,3vw,2.4rem)}
.big span{display:block}

/* redes junto al titular del pie, alineadas a su linea base */
/* .big span{display:block} es mas especifica que .redes y la dejaba
   en block: los iconos se apilaban en columna. De ahi el .big .redes */
.big .redes{display:flex;align-items:center;gap:.35rem;
            padding-bottom:clamp(.5rem,1.2vw,1.2rem)}
.big .redes a{display:grid;place-items:center;width:46px;height:46px;border-radius:50%;
  border:1px solid var(--line);color:var(--ink);
  transition:background-color .3s,color .3s,border-color .3s,transform .3s}
.big .redes a:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);transform:translateY(-2px)}
.big .redes svg{width:17px;height:17px;fill:currentColor;display:block}
@media(max-width:620px){.big .redes a{width:42px;height:42px}.big .redes svg{width:16px;height:16px}}
.contact-grid{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:1.6rem;margin-top:clamp(2.5rem,7vh,4.5rem)
}
.contact-grid .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.5rem}
.contact-grid a,.contact-grid span.v{
  display:inline-flex;align-items:center;min-height:44px;
  font-size:1rem;font-weight:500;border-bottom:1px solid transparent;transition:border-color .3s
}
.contact-grid a:hover{border-color:var(--ink)}
.foot-bar{
  display:flex;justify-content:space-between;gap:1.4rem;flex-wrap:wrap;
  margin-top:clamp(2.5rem,7vh,5rem);padding-top:1.5rem;
  border-top:1px solid var(--line);font-size:var(--fs-micro);color:rgba(0,0,0,.5)
}

/* ── curriculum ── */
.top-acciones{display:flex;align-items:center;gap:1rem}
.cv-cabecera{display:flex;justify-content:space-between;align-items:flex-end;gap:2rem;
             flex-wrap:wrap;padding:clamp(2rem,6vh,4rem) 0 2rem;
             border-bottom:1px solid var(--line)}
.cv-cabecera .eyebrow{color:rgba(0,0,0,.5);margin-bottom:1rem}
.cv-cabecera h1{font-size:clamp(2.4rem,5.5vw,4.4rem);margin-bottom:1.1rem}
.cv-cabecera .lead{max-width:34rem}
.cv-cabecera .avatar{width:120px;height:120px;flex:0 0 120px}

.cv-contacto{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
             gap:1.4rem;padding:1.8rem 0;border-bottom:1px solid var(--line)}
.cv-contacto .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.4rem}
.cv-contacto a,.cv-contacto span{font-size:.9375rem;font-weight:500}
.cv-contacto a{border-bottom:1px solid transparent;transition:border-color .3s}
.cv-contacto a:hover{border-color:var(--ink)}

/* etiqueta a la izquierda y contenido a la derecha: se escanea de un vistazo */
.cv-bloque{display:grid;grid-template-columns:minmax(140px,180px) 1fr;
           gap:clamp(1.2rem,3vw,3rem);padding:clamp(2rem,5vh,3.2rem) 0;
           border-bottom:1px solid var(--line)}
.cv-bloque h2{font-size:var(--fs-micro);font-weight:600;letter-spacing:.15em;
              text-transform:uppercase;color:rgba(0,0,0,.42);line-height:1.3;padding-top:.3rem}
@media(max-width:760px){.cv-bloque{grid-template-columns:1fr;gap:1rem}}
.cv-cuerpo p{color:rgba(0,0,0,.72);line-height:1.65;margin-bottom:1rem;max-width:44rem}
.cv-cuerpo p:last-child{margin-bottom:0}

.cv-row{display:grid;grid-template-columns:130px 1fr;gap:.4rem 1.4rem;
        padding:.85rem 0;border-bottom:1px solid rgba(0,0,0,.07)}
.cv-row:last-child{border-bottom:0;padding-bottom:0}
.cv-yr{font-size:.8125rem;color:rgba(0,0,0,.45);padding-top:.15rem}
.cv-nm{font-weight:500}
.cv-dt{grid-column:2;font-size:.9375rem;color:rgba(0,0,0,.6)}
@media(max-width:560px){.cv-row{grid-template-columns:1fr}.cv-dt{grid-column:1}}

.cv-fig-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:1.6rem}
.cv-fig b{display:block;font-size:clamp(1.8rem,3.2vw,2.6rem);font-weight:300;line-height:1}
.cv-fig span{display:block;margin-top:.45rem;font-size:.8125rem;color:rgba(0,0,0,.5);line-height:1.4}
.cv-stack{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:1.6rem}
.cv-stack .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.6rem}
.cv-stack ul{margin:0;padding:0;list-style:none}
.cv-stack li{font-size:.9375rem;color:rgba(0,0,0,.7);padding:.16rem 0}
.cv-idiomas{display:flex;gap:2.4rem;flex-wrap:wrap}
.cv-idiomas b{display:block;font-weight:500}
.cv-idiomas span{font-size:.875rem;color:rgba(0,0,0,.5)}
.cv-pie-nota{margin:2rem 0 var(--sec);font-size:var(--fs-micro);color:rgba(0,0,0,.42)}

/* ── hoja de impresion: esto es lo que sale al hacer PDF ──
   Fuera todo lo que no es documento y el fondo a blanco puro, que si no
   las impresoras se comen medio cartucho en el gris del sitio. */
@media print{
  @page{size:A4;margin:14mm 14mm 16mm}
  body,body.doc{background:#fff!important;font-size:10.5pt}
  body::after{display:none!important}                 /* el grano */
  .top,.wa,.foot,.ck,.top-acciones{display:none!important}
  [data-in]{visibility:visible!important;animation:none!important}
  .wrap{max-width:none;padding-inline:0}
  main.wrap{padding-bottom:0}
  .cv-cabecera{padding-top:0}
  .cv-cabecera h1{font-size:24pt}
  .cv-cabecera .avatar{width:82px;height:82px;flex:0 0 82px}
  .cv-bloque{break-inside:avoid;page-break-inside:avoid;padding:12pt 0}
  .cv-row{break-inside:avoid;page-break-inside:avoid}
  h2,h1{break-after:avoid;page-break-after:avoid}
  a{text-decoration:none;color:#000}
  /* la URL detras de cada enlace: en papel un enlace sin destino no sirve */
  .cv-contacto a::after{content:' (' attr(href) ')';font-size:8pt;color:#555;word-break:break-all}
  .cv-contacto a[href^="mailto:"]::after,.cv-contacto a[href^="tel:"]::after{content:''}
}

/* ── whatsapp ── */
/* --cookie-h lo publica cookies.js: es el alto que ocupa el aviso.
   Vale 0 mientras no hay aviso, asi que en reposo no cambia nada. */
.wa{position:fixed;right:22px;bottom:calc(26px + var(--cookie-h,0px));z-index:78;width:54px;height:54px;border-radius:50%;
    background:var(--ink);color:var(--paper);display:grid;place-items:center;
    box-shadow:0 6px 24px rgba(0,0,0,.3);transition:transform .3s,background-color .3s,color .3s,bottom .5s cubic-bezier(.2,.8,.2,1)}
.wa:hover{transform:translateY(-3px);background:var(--accent);color:var(--ink)}
.wa svg{width:27px;height:27px;fill:currentColor}
@media(max-width:820px){.wa{right:12px;bottom:calc(16px + var(--cookie-h,0px));width:50px;height:50px}}

/* ── paginas legales ── */
.legal{max-width:46rem;margin-bottom:var(--sec)}
.legal h2{font-size:clamp(1.25rem,1.9vw,1.6rem);font-weight:500;line-height:1.3;
          margin:clamp(2.2rem,5vh,3.2rem) 0 .9rem}
.legal h2:first-child{margin-top:0}
.legal p{color:rgba(0,0,0,.72);line-height:1.65;margin-bottom:1rem}
.legal a{border-bottom:1px solid var(--line);transition:border-color .3s}
.legal a:hover{border-color:var(--ink)}
.legal code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;
            background:rgba(0,0,0,.055);border-radius:5px;padding:.12em .4em}
.legal .nota{font-size:var(--fs-micro);color:rgba(0,0,0,.5);line-height:1.6}

/* la tabla se desborda sola en movil en vez de romper la pagina */
.tabla{width:100%;border-collapse:collapse;margin:1.2rem 0 1.4rem;
       display:block;overflow-x:auto;white-space:nowrap}
.tabla th,.tabla td{text-align:left;padding:.85rem 1.1rem .85rem 0;
                    border-bottom:1px solid var(--line);vertical-align:top}
.tabla th{font-size:var(--fs-micro);font-weight:600;letter-spacing:.1em;
          text-transform:uppercase;color:rgba(0,0,0,.45)}
.tabla td{font-size:.9375rem;color:rgba(0,0,0,.72)}
@media(min-width:700px){.tabla{display:table;white-space:normal}}

/* panel para cambiar la decision desde la propia politica */
.ck-panel{background:#fff;border-radius:var(--r-md);padding:clamp(1.3rem,3vw,1.9rem);
          margin:1.4rem 0 1.6rem}
.ck-panel .eyebrow{color:rgba(0,0,0,.42);margin-bottom:.5rem}
.ck-panel b{display:block;font-size:1.0625rem;font-weight:500;margin-bottom:1.2rem}
.ck-panel-btns{display:flex;gap:.5rem;flex-wrap:wrap}
.btn-linea,.btn-solido{font:inherit;font-weight:500;font-size:.875rem;cursor:pointer;
  min-height:44px;padding:0 1.3rem;border-radius:var(--r-pill);
  transition:background-color .3s,color .3s,border-color .3s}
.btn-linea{background:transparent;color:var(--ink);border:1px solid var(--line)}
.btn-linea:hover{border-color:var(--ink)}
.btn-solido{background:var(--ink);color:var(--paper);border:1px solid var(--ink)}
.btn-solido:hover{background:#2b2b2b;border-color:#2b2b2b}

/* el enlace legal del pie: presente, pero sin pedir turno */
.foot-legal a{border-bottom:1px solid transparent;transition:border-color .3s}
.foot-legal a:hover{border-color:rgba(0,0,0,.5)}

/* ── entradas ── */
@keyframes subir{from{opacity:0;transform:translate3d(0,40px,0)}to{opacity:1;transform:none}}
[data-in]{visibility:hidden}
[data-in].is-in{visibility:visible;animation:subir 1s both;animation-delay:var(--retardo,0s)}
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important}
  [data-in]{visibility:visible!important}
}
:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:4px}
::selection{background:var(--accent);color:var(--ink)}


/* ── visor de documento paginado ─────────────────────────────
   El giro necesita perspectiva en el contenedor y transform-style
   preserve-3d en la escena: sin las dos, la hoja rota en plano y parece
   que se encoge en vez de pasar. */
.visor{max-width:var(--medida);margin:0 auto var(--sec)}
.visor-caja{
  position:relative;perspective:2200px;border-radius:var(--r-md);
  background:#0b0b0d;overflow:hidden;outline-offset:3px
}
.visor-escena{position:relative;aspect-ratio:16/9;transform-style:preserve-3d}
.visor-pag{
  position:absolute;inset:0;width:100%;height:100%;object-fit:contain;
  display:block;background:#0b0b0d
}
/* El display:block de arriba pisa al [hidden] del navegador, que es una regla
   de agente de usuario y pierde contra cualquier clase. Sin esto la hoja que
   gira nunca se oculta: al cargar es un rectangulo negro sin src tapando la
   pagina, y despues de cada giro vuelve a caer encima con la pagina anterior,
   que se lee como que avanza y retrocede. */
.visor-pag[hidden]{display:none}
.visor-pag.gira{
  transform-origin:left center;backface-visibility:hidden;
  transition:transform .62s cubic-bezier(.42,0,.28,1);z-index:2;
  box-shadow:0 0 40px rgba(0,0,0,.45)
}
.visor-caja.girando{cursor:progress}

.visor-nav{
  position:absolute;top:50%;transform:translateY(-50%);z-index:4;
  width:46px;height:46px;border-radius:50%;border:0;cursor:pointer;
  display:grid;place-items:center;color:#0b0b0d;
  background:rgba(255,255,255,.9);backdrop-filter:blur(8px);
  box-shadow:0 4px 18px rgba(0,0,0,.3);
  opacity:0;transition:opacity .3s,background-color .3s
}
.visor-caja:hover .visor-nav,.visor-nav:focus-visible{opacity:1}
@media(hover:none){.visor-nav{opacity:1}}
.visor-nav.atras{left:14px}
.visor-nav.alante{right:14px}
.visor-nav:hover{background:#fff}
.visor-nav[disabled]{opacity:0!important;pointer-events:none}
.visor-nav svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}

.visor-barra{
  display:flex;align-items:center;justify-content:space-between;gap:1rem;
  margin-top:.9rem;font-size:var(--fs-micro);color:rgba(0,0,0,.5)
}
.visor-cuenta{font-variant-numeric:tabular-nums}
.visor-cuenta b{color:var(--ink);font-weight:600}
.visor-pdf{display:inline-flex;align-items:center;gap:.4rem;min-height:44px;font-weight:500;
  color:rgba(0,0,0,.55);border-bottom:1px solid transparent;transition:color .3s,border-color .3s}
.visor-pdf:hover{color:var(--ink);border-color:var(--ink)}

@media(max-width:620px){
  .visor-nav{width:40px;height:40px}
  .visor-nav.atras{left:8px}
  .visor-nav.alante{right:8px}
}
/* Sin animacion, el cambio es seco y ya esta: la hoja que gira ni se usa. */
@media(prefers-reduced-motion:reduce){
  .visor-pag.gira{transition:none}
}
@media print{.visor-nav,.visor-barra{display:none}}

/* ── servicios ──────────────────────────────────
   Rejilla de cuatro tarjetas, una por servicio, cada una apoyada en la
   portada de un proyecto que lo demuestra. Una pagina de servicios sin
   obra es una lista de afirmaciones; con obra es una prueba.

   Cuatro contenidos, cuatro celdas: la rejilla no lleva huecos vacios.
   Y la tarjeta entera lleva radio, asi que el estado activo ya no pinta
   un rectangulo gris detras de unos bordes curvos. */
.serv-rej{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(.9rem,2vw,1.6rem);
  margin-bottom:var(--sec)
}
.serv{
  display:flex;flex-direction:column;
  background:var(--paper-2);
  /* --r-lg son 60px: pensado para bloques grandes. En una tarjeta de este
     tamano se come las esquinas y parece un boton gigante. */
  border-radius:var(--r-md);
  overflow:hidden;                 /* la foto se recorta con el radio */
  transition:transform .55s cubic-bezier(.2,.8,.2,1),box-shadow .55s ease
}
/* La sombra va tintada con el oscuro de la marca, no en negro puro:
   un negro plano sobre papel calido se ve sucio. */
.serv:hover{transform:translateY(-4px);box-shadow:0 20px 48px rgba(20,16,23,.13)}

.serv-img{display:block;aspect-ratio:16/10;overflow:hidden;background:var(--paper)}
.serv-img img{width:100%;height:100%;object-fit:cover;display:block;
              transition:transform .9s cubic-bezier(.2,.8,.2,1)}
.serv:hover .serv-img img{transform:scale(1.045)}

.serv-txt{
  display:flex;flex-direction:column;flex:1;
  padding:clamp(1.3rem,2.2vw,2rem)
}

/* El icono se dibuja solo al entrar en pantalla, sobre el gancho .is-in
   que ya usa el resto del sitio. */
.serv-ico{
  display:block;width:30px;color:var(--ink);margin-bottom:1rem;
  transition:transform .6s cubic-bezier(.2,.8,.2,1)
}
.serv-ico svg{display:block;width:100%;height:auto}
.serv-ico :is(path,circle,rect){
  fill:none;stroke:currentColor;stroke-width:1.5;
  stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:220;stroke-dashoffset:220;
  transition:stroke-dashoffset 1.3s cubic-bezier(.25,.85,.3,1)
}
.serv.is-in .serv-ico :is(path,circle,rect){stroke-dashoffset:0}
.serv.is-in .serv-ico :nth-child(2){transition-delay:.2s}
.serv.is-in .serv-ico :nth-child(3){transition-delay:.38s}
.serv:hover .serv-ico{transform:translateY(-2px)}

.serv h2{
  font-size:clamp(1.45rem,2.5vw,2.15rem);font-weight:600;line-height:1.12;
  letter-spacing:-.025em;text-transform:none;color:var(--ink);
  margin:0 0 .85rem;padding:0;text-wrap:balance
}
.serv-claim{
  font-size:clamp(1rem,1.2vw,1.15rem);line-height:1.45;
  color:rgba(0,0,0,.8);margin:0 0 .8rem;text-wrap:pretty
}
.serv-txt>p:last-of-type{color:rgba(0,0,0,.58);line-height:1.6;
                         font-size:.9375rem;margin:0}

.serv-lista{margin:1.2rem 0 0;padding:0;list-style:none;
            display:flex;flex-wrap:wrap;gap:.35rem}
.serv-lista li{
  font-size:.75rem;font-weight:500;color:rgba(0,0,0,.6);
  border:1px solid rgba(0,0,0,.13);border-radius:var(--r-pill);
  padding:.3rem .7rem;opacity:0;transform:translateY(6px);
  transition:opacity .5s ease,transform .5s cubic-bezier(.2,.8,.2,1),
             background-color .3s,color .3s,border-color .3s
}
.serv.is-in .serv-lista li{opacity:1;transform:none}
.serv-lista li:hover{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.serv.is-in .serv-lista li:nth-child(1){transition-delay:.30s}
.serv.is-in .serv-lista li:nth-child(2){transition-delay:.36s}
.serv.is-in .serv-lista li:nth-child(3){transition-delay:.42s}
.serv.is-in .serv-lista li:nth-child(4){transition-delay:.48s}
.serv.is-in .serv-lista li:nth-child(5){transition-delay:.54s}

@media(max-width:780px){
  .serv-rej{grid-template-columns:1fr}
}

/* ── cierre ────────────────────────────────────
   Bloque oscuro con el acento, que estaba declarado y sin usar. */
.serv-cta{
  background:var(--void);color:var(--paper);
  border-radius:var(--r-lg);
  padding:clamp(2rem,5.5vw,4rem);
  margin:0 0 var(--sec);
  display:grid;grid-template-columns:1fr auto;
  gap:clamp(1.5rem,4vw,3rem);align-items:end
}
.caso-cta{background:var(--ink);color:var(--paper);border-radius:var(--r-lg);padding:clamp(2rem,5vw,3.5rem);margin:0 0 var(--sec)}
.caso-cta h2{font-size:var(--fs-h2);font-weight:400;line-height:1.15;margin:.5rem 0 .8rem;color:var(--paper)}
.caso-cta p:not(.eyebrow){max-width:42rem;line-height:1.6;color:rgba(255,255,255,.7);margin:0 0 1.4rem}
.serv-cta h2{font-size:var(--fs-h2);font-weight:400;line-height:1.2;
             margin:0 0 .7rem;color:var(--paper)}
.serv-cta p{color:rgba(255,255,255,.62);line-height:1.6;margin:0;max-width:32rem}
.serv-cta-btns{display:flex;flex-wrap:wrap;gap:.5rem}
.lead-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem;max-width:42rem}
.lead-form label{display:grid;gap:.35rem;font-size:var(--fs-micro);font-weight:500;color:var(--paper)}
.lead-form label:nth-of-type(3),.lead-form label:nth-of-type(4){grid-column:1/-1}
.lead-form input,.lead-form select,.lead-form textarea{width:100%;border:1px solid rgba(255,255,255,.28);border-radius:.55rem;background:rgba(255,255,255,.08);color:var(--paper);font:inherit;padding:.7rem .8rem}
.lead-form select option{color:var(--ink)}
.lead-form textarea{resize:vertical;min-height:5rem}
.lead-form input::placeholder,.lead-form textarea::placeholder{color:rgba(255,255,255,.52)}
.lead-form input:focus,.lead-form select:focus,.lead-form textarea:focus{outline:2px solid var(--accent);outline-offset:2px}
.lead-form-note{grid-column:1/-1;font-size:.75rem!important;margin:0!important}
.btn-acento,.btn-hueco{
  display:inline-flex;align-items:center;min-height:44px;
  padding:.7rem 1.4rem;border-radius:var(--r-pill);
  font-size:var(--fs-micro);font-weight:500;white-space:nowrap;
  transition:background-color .3s,color .3s,border-color .3s,transform .3s
}
.btn-acento{background:var(--accent);color:var(--void);border:1px solid var(--accent)}
.btn-acento:hover{background:#e4ff70;border-color:#e4ff70;transform:translateY(-2px)}
.btn-hueco{background:none;color:var(--paper);border:1px solid rgba(255,255,255,.26)}
.btn-hueco:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.45)}
@media(max-width:760px){.serv-cta{grid-template-columns:1fr;align-items:start}.lead-form{grid-template-columns:1fr}.lead-form label{grid-column:1/-1}}

/* Sin movimiento y en papel, todo visible de entrada. */
@media(prefers-reduced-motion:reduce){
  .serv-ico :is(path,circle,rect){stroke-dashoffset:0!important}
  .serv-lista li{opacity:1!important;transform:none!important}
  .serv:hover{transform:none}
}
@media print{
  .serv-ico :is(path,circle,rect){stroke-dashoffset:0!important}
  .serv-lista li{opacity:1!important;transform:none!important}
  .serv{box-shadow:none;border:1px solid var(--line)}
}
