/* ============ TOKENS ============ */
:root{
  --navy-950:#081627;
  --navy-900:#0A1F33;
  --navy-800:#102D4A;
  --blue-600:#1B4B7A;
  --blue-500:#22598F;
  --sky-400:#56B4D3;
  --paper:#F7F9FC;
  --white:#FFFFFF;
  --ink:#2A3844;
  --muted:#6E7F8D;
  --line:#DEE6EE;
  --line-dark:rgba(255,255,255,.10);
  --serif:'Cormorant Garamond',Georgia,'Times New Roman',serif;
  --serif-text:'Source Serif 4',Georgia,serif;
  --sans:'Source Sans 3','Segoe UI',Arial,sans-serif;
  --ease:cubic-bezier(.22,1,.36,1);
  --maxw:1200px;
}

/* ============ BASE ============ */
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;
  font-family:var(--sans);
  font-size:17px;
  line-height:1.75;
  color:var(--ink);
  background:var(--white);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
img{max-width:100%;display:block}
a{color:var(--blue-600);text-decoration:none}
::selection{background:rgba(86,180,211,.32)}
a:focus-visible,button:focus-visible,input:focus-visible{outline:2px solid var(--sky-400);outline-offset:3px;border-radius:2px}
.wrap{max-width:var(--maxw);margin:0 auto;padding-inline:28px}

/* Eyebrow: sobretítulo en caps espaciadas */
.eyebrow{
  margin:0 0 18px;
  font-size:12px;
  font-weight:600;
  letter-spacing:.24em;
  text-transform:uppercase;
  color:var(--sky-400);
}
.eyebrow--dark{color:var(--sky-400)}
h1,h2,h3{font-family:var(--serif);font-weight:500;color:var(--navy-900);margin:0}
h2{font-size:clamp(36px,4.4vw,54px);line-height:1.08;letter-spacing:-.01em}

/* Reveal on scroll */
.rv{opacity:0;transform:translateY(18px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
.rv.in{opacity:1;transform:none}
@media (prefers-reduced-motion: reduce){
  .rv{opacity:1;transform:none;transition:none}
  html{scroll-behavior:auto}
}

/* ============ HEADER ============ */
.site-header{
  position:fixed;inset:0 0 auto 0;z-index:60;
  padding:22px 0;
  transition:background .35s var(--ease),padding .35s var(--ease),box-shadow .35s var(--ease);
}
.site-header.scrolled{
  padding:12px 0;
  background:rgba(8,22,39,.86);
  -webkit-backdrop-filter:blur(14px);
  backdrop-filter:blur(14px);
  box-shadow:0 1px 0 var(--line-dark);
}
.header-in{display:flex;align-items:center;justify-content:space-between;gap:24px}
.logo img{height:34px;width:auto}
.nav{display:flex;align-items:center;gap:30px}
.nav a{
  font-size:13px;font-weight:600;letter-spacing:.10em;text-transform:uppercase;
  color:rgba(255,255,255,.78);
  padding:6px 0;position:relative;
  transition:color .25s ease;
}
.nav a::after{
  content:"";position:absolute;left:0;bottom:0;height:1px;width:0;
  background:var(--sky-400);transition:width .3s var(--ease);
}
.nav a:hover{color:#fff}
.nav a:hover::after{width:100%}
.btn-wa{
  font-size:13px;font-weight:600;letter-spacing:.10em;text-transform:uppercase;
  color:var(--navy-950)!important;background:#fff;
  padding:11px 22px;border-radius:2px;
  transition:background .25s ease,transform .25s ease;
}
.btn-wa:hover{background:var(--sky-400);transform:translateY(-1px)}
.btn-wa::after{display:none}
.burger{display:none;background:none;border:0;cursor:pointer;padding:8px}
.burger span{display:block;width:24px;height:2px;background:#fff;margin:5px 0;transition:transform .3s var(--ease),opacity .3s ease}
.mobile-nav{display:none}

/* ============ HERO ============ */
.hero{
  position:relative;min-height:94vh;
  display:flex;align-items:center;
  background:var(--navy-950);
  overflow:hidden;
}
.hero-media{position:absolute;inset:0}
.hero-media img{
  width:100%;height:100%;object-fit:cover;
  filter:grayscale(1) contrast(1.05) brightness(.9);
  opacity:.34;
  transform:scale(1.06);
  animation:heroZoom 2.6s var(--ease) forwards;
}
@keyframes heroZoom{to{transform:scale(1)}}
.hero-media::after{
  content:"";position:absolute;inset:0;
  background:
    linear-gradient(180deg, rgba(8,22,39,.42) 0%, rgba(8,22,39,.18) 45%, rgba(8,22,39,.94) 100%),
    linear-gradient(90deg, rgba(8,22,39,.86) 0%, rgba(8,22,39,.34) 60%, rgba(8,22,39,.55) 100%),
    linear-gradient(0deg, rgba(27,75,122,.28), rgba(27,75,122,.28));
}
.hero.noimg .hero-media{background:
  radial-gradient(1100px 560px at 82% -10%, rgba(86,180,211,.12), transparent 60%),
  repeating-linear-gradient(90deg, rgba(255,255,255,.035) 0 1px, transparent 1px 190px),
  var(--navy-950)}
.hero-in{position:relative;z-index:2;width:100%;padding-block:170px 120px}
.hero-meta{
  display:flex;align-items:center;gap:16px;
  margin:0 0 30px;
  font-size:12px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;
  color:var(--sky-400);
}
.hero-meta::before{content:"";width:44px;height:1px;background:var(--sky-400);opacity:.7}
.hero h1{
  color:#fff;
  font-size:clamp(54px,8.6vw,112px);
  line-height:.98;
  letter-spacing:-.02em;
  max-width:18ch;
  text-wrap:balance;
}
.hero h1 em{font-style:italic;font-weight:500;color:rgba(255,255,255,.94)}
.hero-sub{
  margin:34px 0 0;
  max-width:560px;
  font-size:19px;line-height:1.72;
  color:rgba(255,255,255,.74);
  text-wrap:pretty;
}
.hero-pains{margin:30px 0 0;font-family:var(--serif-text);font-style:italic;font-size:15.5px;line-height:2;color:rgba(255,255,255,.58);max-width:660px}
.hero-cta{margin-top:44px;display:flex;flex-wrap:wrap;gap:18px;align-items:center}
.btn-primary{
  display:inline-block;
  background:#fff;color:var(--navy-950);
  font-size:13px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  padding:17px 38px;border-radius:2px;
  transition:background .25s ease,transform .25s ease,box-shadow .25s ease;
}
.btn-primary:hover{background:var(--sky-400);color:var(--navy-950);transform:translateY(-2px);box-shadow:0 14px 34px rgba(0,0,0,.35)}
.btn-ghost{
  display:inline-flex;align-items:center;gap:10px;
  color:rgba(255,255,255,.72);
  font-size:13px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  padding:17px 4px;
  transition:color .25s ease;
}
.btn-ghost:hover{color:#fff}
.btn-ghost .arr{transition:transform .3s var(--ease)}
.btn-ghost:hover .arr{transform:translateY(3px)}
/* Entrada orquestada del hero */
.hero .stag{opacity:0;transform:translateY(26px)}
.hero.loaded .stag{opacity:1;transform:none;transition:opacity .9s var(--ease),transform .9s var(--ease)}
.hero.loaded .stag.d1{transition-delay:.08s}
.hero.loaded .stag.d2{transition-delay:.2s}
.hero.loaded .stag.d3{transition-delay:.34s}
.hero.loaded .stag.d4{transition-delay:.46s}
@media (prefers-reduced-motion: reduce){
  .hero .stag{opacity:1;transform:none}
  .hero-media img{animation:none;transform:none}
}

/* ============ AUTORIDAD: tesis SCJN + prensa ============ */
.authority{background:var(--navy-900);border-top:1px solid var(--line-dark)}
.authority-in{
  padding-block:78px 64px;
  display:grid;grid-template-columns:auto 1fr;gap:48px;align-items:start;
}
.seal{
  font-family:var(--serif);font-style:italic;
  font-size:15px;line-height:1.5;color:var(--sky-400);
  border:1px solid rgba(86,180,211,.35);
  padding:18px 20px;border-radius:2px;
  text-align:center;min-width:170px;
}
.seal strong{
  display:block;font-style:normal;font-family:var(--sans);
  font-size:11px;font-weight:600;letter-spacing:.22em;text-transform:uppercase;
  color:rgba(255,255,255,.55);margin-bottom:8px;
}
.seal .reg{display:block;margin-top:8px;font-family:var(--sans);font-style:normal;font-size:12px;letter-spacing:.14em;color:rgba(255,255,255,.45)}
.authority blockquote{
  margin:0;
  font-family:var(--serif);
  font-size:clamp(21px,2.5vw,29px);
  line-height:1.42;
  color:rgba(255,255,255,.92);
  text-wrap:pretty;
}
.authority blockquote small{
  display:block;margin-top:18px;
  font-family:var(--sans);font-size:13px;letter-spacing:.06em;
  color:rgba(255,255,255,.5);
}
.press{
  border-top:1px solid var(--line-dark);
  padding-block:34px 40px;
}
.press-label{display:block;margin-bottom:24px;font-size:11px;font-weight:600;letter-spacing:.22em;text-transform:uppercase;color:rgba(255,255,255,.42)}
.press-wall{display:flex;flex-wrap:wrap;align-items:center;gap:22px 56px}
.pm{color:rgba(255,255,255,.56);white-space:nowrap;line-height:1;transition:color .25s ease}
.pm:hover{color:rgba(255,255,255,.88)}
.pm-reforma{font-family:Georgia,'Times New Roman',serif;font-weight:700;font-size:25px;letter-spacing:.03em}
.pm-aristegui{font-family:'Segoe UI',Arial,sans-serif;font-weight:300;font-size:23px;letter-spacing:-.01em}
.pm-aristegui b{font-weight:700}
.pm-proceso{font-family:'Arial Narrow',Impact,'Segoe UI',sans-serif;font-weight:700;font-size:27px;letter-spacing:.02em}
.pm-excelsior{font-family:Cambria,Georgia,serif;font-style:italic;font-weight:600;font-size:26px}
.pm-indigo{font-family:'Segoe UI',Arial,sans-serif;font-weight:600;font-size:20px;letter-spacing:.18em;text-transform:uppercase}
.pm-eje{font-family:'Arial Black',Arial,sans-serif;font-weight:900;font-size:19px;letter-spacing:.02em}

/* ============ QUIÉNES SOMOS ============ */
.about{background:var(--paper)}
.about-in{
  padding-block:clamp(96px,11vw,150px);
  display:grid;grid-template-columns:minmax(240px,.9fr) minmax(300px,1.6fr);gap:64px;
}
.about-head h2{max-width:9ch}
.about-head .rule{width:56px;height:2px;background:var(--sky-400);margin-top:30px}
.lead{
  font-family:var(--serif);
  font-size:clamp(22px,2.3vw,27px);
  line-height:1.55;color:var(--navy-900);
  margin:0;text-wrap:pretty;
}
.about-body p:not(.lead){margin:26px 0 0;max-width:62ch;font-family:var(--serif-text);font-size:17.5px;line-height:1.85}
.link-line{
  display:inline-flex;align-items:center;gap:10px;
  margin-top:36px;
  font-size:13px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  color:var(--blue-600);
  border-bottom:1px solid var(--sky-400);
  padding-bottom:6px;
  transition:color .25s ease,gap .3s var(--ease);
}
.link-line:hover{color:var(--navy-900);gap:16px}

/* ============ ÁREAS DE PRÁCTICA: índice editorial ============ */
.practice{background:var(--white)}
.practice-in{padding-block:clamp(96px,11vw,150px)}
.practice-head{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:64px}
.practice-head p{margin:0;font-size:15px;color:var(--muted);max-width:34ch}
.index{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.index li{border-bottom:1px solid var(--line)}
.index a{
  display:grid;
  grid-template-columns:minmax(250px,.95fr) minmax(280px,1.55fr) auto;
  align-items:center;gap:10px 56px;
  padding:38px 6px;
  position:relative;
  transition:padding .35s var(--ease);
}
.index a::before{
  content:"";position:absolute;left:0;bottom:-1px;height:1px;width:0;
  background:var(--sky-400);transition:width .45s var(--ease);
}
.index a:hover{padding-left:18px}
.index a:hover::before{width:100%}
.index .t{
  display:block;
  font-family:var(--serif);font-weight:500;
  font-size:clamp(24px,2.4vw,30px);line-height:1.15;color:var(--navy-900);
  transition:color .25s ease;text-wrap:balance;
}
.index a:hover .t{color:var(--blue-600)}
.index .d{display:block;font-family:var(--serif-text);font-size:15.5px;line-height:1.7;color:var(--muted);max-width:56ch;text-wrap:pretty}
.index .arr{
  font-size:22px;color:var(--line);justify-self:end;
  transition:color .25s ease,transform .3s var(--ease);
}
.index a:hover .arr{color:var(--sky-400);transform:translateX(6px)}

/* ============ CONTADORES ============ */
.stats{background:var(--navy-950);position:relative;overflow:hidden}
.stats::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(900px 480px at 88% 0%, rgba(86,180,211,.10), transparent 55%),
    radial-gradient(800px 520px at -6% 110%, rgba(27,75,122,.35), transparent 55%);
}
.stats-in{position:relative;padding-block:clamp(88px,10vw,130px)}
.stats-head{margin-bottom:58px;max-width:520px}
.stats-head h2{color:#fff}
.stats-grid{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(190px,1fr));
  gap:44px 36px;
}
.stat{border-left:1px solid var(--line-dark);padding-left:20px}
.stat b{
  display:block;
  font-family:var(--serif);font-weight:500;
  font-size:clamp(46px,4.6vw,64px);line-height:1;
  color:#fff;font-variant-numeric:lining-nums;
}
.stat span{
  display:block;margin-top:10px;
  font-size:12.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(255,255,255,.52);
}
.stat.hi b{color:var(--sky-400)}

/* ============ CASOS: carrusel editorial ============ */
.cases{background:var(--paper)}
.cases-in{padding-block:clamp(96px,11vw,150px)}
.cases-head{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:22px;margin-bottom:54px}
.cases-nav{display:flex;gap:10px}
.cnav{
  width:52px;height:52px;border-radius:2px;
  border:1px solid var(--line);background:var(--white);
  color:var(--navy-900);font-size:18px;cursor:pointer;
  transition:background .25s ease,border-color .25s ease,color .25s ease,transform .2s ease;
}
.cnav:hover{background:var(--navy-900);border-color:var(--navy-900);color:#fff;transform:translateY(-2px)}
.rail{
  display:flex;gap:26px;
  overflow-x:auto;
  scroll-snap-type:x mandatory;
  padding-bottom:14px;
  cursor:grab;
  scrollbar-width:none;
}
.rail::-webkit-scrollbar{display:none}
.rail.dragging{cursor:grabbing;scroll-snap-type:none}
.case-card{
  flex:0 0 min(430px,86vw);
  scroll-snap-align:start;
  background:var(--white);
  border:1px solid var(--line);
  border-radius:3px;
  padding:38px 34px 34px;
  display:flex;flex-direction:column;
  min-height:360px;
  transition:transform .35s var(--ease),box-shadow .35s var(--ease),border-color .35s ease;
}
.case-card:hover{transform:translateY(-6px);box-shadow:0 26px 54px rgba(10,31,51,.12);border-color:transparent}
.case-meta{
  display:flex;align-items:center;gap:12px;
  font-size:11.5px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;
  color:var(--sky-400);
  margin-bottom:20px;
}
.case-meta .dot{width:4px;height:4px;border-radius:50%;background:var(--line)}
.case-meta time{color:var(--muted);letter-spacing:.12em}
.case-card h3{font-size:24px;line-height:1.3;font-weight:600;text-wrap:pretty}
.case-card p{margin:16px 0 0;font-family:var(--serif-text);font-size:15px;line-height:1.75;color:var(--muted);flex:1}
.case-card .link-line{margin-top:26px;align-self:flex-start}

/* ============ CONTACTO ============ */
.contact{background:var(--navy-900);position:relative;overflow:hidden}
.contact::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(1000px 540px at 100% 0%, rgba(86,180,211,.09), transparent 58%);
}
.contact-in{
  position:relative;
  padding-block:clamp(96px,11vw,150px);
  display:grid;grid-template-columns:1.1fr .9fr;gap:70px;
}
.contact h2{color:#fff;max-width:12ch}
.contact .lead-sub{margin:26px 0 0;font-family:var(--serif-text);font-size:17.5px;color:rgba(255,255,255,.66);max-width:46ch}
.c-list{margin:44px 0 0;padding:0;list-style:none}
.c-list li{
  display:flex;gap:16px;align-items:baseline;
  padding:15px 0;border-top:1px solid var(--line-dark);
  font-size:15.5px;color:rgba(255,255,255,.78);
}
.c-list li:last-child{border-bottom:1px solid var(--line-dark)}
.c-list .k{flex:0 0 96px;font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:rgba(255,255,255,.4)}
.c-list a{color:rgba(255,255,255,.85);border-bottom:1px solid rgba(86,180,211,.4);transition:color .2s ease,border-color .2s ease}
.c-list a:hover{color:var(--sky-400);border-color:var(--sky-400)}
.form-card{
  background:var(--navy-950);
  border:1px solid var(--line-dark);
  border-radius:3px;
  padding:44px 40px;
  align-self:start;
}
.form-card h3{color:#fff;font-size:26px;font-weight:500}
.form-card .hint{margin:10px 0 26px;font-size:14px;color:rgba(255,255,255,.5)}
.field{margin-bottom:18px}
.field label{
  display:block;margin-bottom:8px;
  font-size:11px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;
  color:rgba(255,255,255,.45);
}
.field input{
  width:100%;padding:14px 16px;
  background:rgba(255,255,255,.045);
  border:1px solid var(--line-dark);
  border-radius:2px;
  color:#fff;font-size:15.5px;font-family:var(--sans);
  transition:border-color .25s ease,background .25s ease;
}
.field input::placeholder{color:rgba(255,255,255,.28)}
.field input:focus{border-color:var(--sky-400);background:rgba(255,255,255,.07);outline:none}
.btn-send{
  width:100%;margin-top:8px;
  background:var(--sky-400);color:var(--navy-950);
  border:0;border-radius:2px;cursor:pointer;
  font-family:var(--sans);font-size:13px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  padding:17px 20px;
  transition:background .25s ease,transform .2s ease;
}
.btn-send:hover{background:#fff;transform:translateY(-2px)}
.alt-mail{margin:16px 0 0;text-align:center;font-size:13.5px;color:rgba(255,255,255,.45)}
.alt-mail a{color:rgba(255,255,255,.7);border-bottom:1px solid rgba(255,255,255,.25)}
.alt-mail a:hover{color:var(--sky-400)}

/* ============ FOOTER ============ */
footer{background:var(--navy-950);border-top:1px solid var(--line-dark)}
.foot-in{
  padding-block:64px 30px;
  display:flex;flex-wrap:wrap;justify-content:space-between;gap:40px;
}
.foot-brand img{height:30px;width:auto}
.foot-brand p{margin:20px 0 0;font-size:14px;line-height:1.7;color:rgba(255,255,255,.5);max-width:32ch}
.foot-col h4{
  margin:0 0 16px;
  font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:rgba(255,255,255,.4);font-family:var(--sans);
}
.foot-col ul{list-style:none;margin:0;padding:0}
.foot-col li{margin-bottom:10px}
.foot-col a{font-size:14.5px;color:rgba(255,255,255,.72);transition:color .2s ease}
.foot-col a:hover{color:var(--sky-400)}
.foot-base{
  border-top:1px solid var(--line-dark);
  padding-block:22px 26px;
  display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px;
  font-size:13px;color:rgba(255,255,255,.38);
}
.foot-base a{color:rgba(255,255,255,.55)}
.foot-base a:hover{color:var(--sky-400)}

/* ============ RESPONSIVE ============ */
@media (max-width:960px){
  .authority-in{grid-template-columns:1fr;gap:34px}
  .about-in,.contact-in{grid-template-columns:1fr;gap:48px}
  .index a{grid-template-columns:1fr auto;grid-template-areas:"t arr" "d d";gap:10px 18px;padding:28px 4px}
  .index .t{grid-area:t}
  .index .d{grid-area:d}
  .index .arr{grid-area:arr}
}
@media (max-width:760px){
  .nav{display:none}
  .burger{display:block}
  .mobile-nav{
    display:flex;flex-direction:column;
    position:fixed;inset:0;z-index:55;
    background:var(--navy-950);
    padding:120px 32px 40px;gap:6px;
    transform:translateY(-100%);
    transition:transform .5s var(--ease);
  }
  .mobile-nav.open{transform:none}
  .mobile-nav a{
    font-family:var(--serif);font-size:32px;color:#fff;
    padding:12px 0;border-bottom:1px solid var(--line-dark);
  }
  .mobile-nav .btn-wa{
    font-family:var(--sans);text-align:center;margin-top:26px;border-bottom:0;font-size:13px;
  }
  body.nav-open{overflow:hidden}
  body.nav-open .burger span:nth-child(1){transform:translateY(7px) rotate(45deg)}
  body.nav-open .burger span:nth-child(2){opacity:0}
  body.nav-open .burger span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
  .hero-in{padding-block:150px 90px}
  .hero-sub{font-size:17px}
  .stats-grid{gap:34px 24px;grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
  .form-card{padding:34px 26px}
}

/* ================================================================
   PÁGINAS INTERNAS
   Continuación del sistema de la maqueta. base.css no se toca: todo
   lo de aquí se apoya en sus tokens y sólo redefine uno, --muted, por
   accesibilidad. El porqué está en el bloque siguiente.
   ================================================================ */

/* ============ AJUSTE DE CONTRASTE AA (FASE 7.1) ============
   El --muted de la maqueta, #6E7F8D, da 3.92:1 sobre --paper y 4.13:1 sobre
   blanco. WCAG 2.1 AA pide 4.5:1 para texto normal, y TODOS los usos de este
   token son texto de 13.5 a 15.5px: extractos de listados, descripciones del
   índice, fechas, pies de recorte y fichas de contacto. Ninguno llega a
   "texto grande", así que ninguno se acoge al 3:1.

   #657582 es el mismo tono y la misma saturación al 92 % de luminosidad:
   4.50:1 sobre papel y 4.75:1 sobre blanco. Lo comprueba tools/contraste.js.

   Se redefine AQUÍ y no en base.css a propósito: base.css tiene que seguir
   siendo byte a byte el CSS de la maqueta aprobada —comparar-home.js lo
   verifica carácter a carácter— y como styles.css concatena base + páginas,
   esta declaración gana por orden de origen con la misma especificidad, sin
   !important y sin duplicar el resto del bloque de tokens.

   Queda declarada como desviación autorizada 6 en tools/comparar-home.js.
   ================================================================ */
/* ============ CELESTE LEGIBLE SOBRE FONDO CLARO (FASE 13) ============
   El celeste de la maqueta, #56B4D3, da 2.37:1 sobre blanco y 2.25:1 sobre el
   papel: es un color pensado para fondo navy, donde da 7.05:1. Sobre superficie
   clara lo usaban los sobretítulos, las fechas de los listados, los rótulos de
   documentos y el descriptor de las alianzas, todos de 11 a 12px, y ninguno se
   leía. El nuevo token es el mismo tono (194 grados) con la luminosidad bajada:
   5.66:1 sobre blanco y 5.37:1 sobre papel. Lo comprueba tools/contraste.js.

   El bloque va aparte del :root de arriba a propósito: un comentario dentro de una
   declaración de tokens confunde a los verificadores que los leen del CSS servido. */
:root{
  --muted:#657582;
}
:root{
  --sky-700:#1F6F8C;
}

/* ============ PAGE-HERO ============ */
.page-hero{position:relative;background:var(--navy-950);overflow:hidden}
.page-hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(900px 460px at 88% -20%, rgba(86,180,211,.12), transparent 60%),
    radial-gradient(760px 480px at -6% 120%, rgba(27,75,122,.32), transparent 58%);
}
.page-hero-in{position:relative;z-index:2;padding-block:190px 74px}
.page-hero h1{
  color:#fff;
  font-size:clamp(40px,5.4vw,72px);line-height:1.04;letter-spacing:-.015em;
  max-width:20ch;text-wrap:balance;
}
.page-hero .bajada{
  margin:26px 0 0;max-width:60ch;
  font-family:var(--serif-text);font-size:17.5px;line-height:1.8;
  color:rgba(255,255,255,.7);text-wrap:pretty;
}
/* Con imagen destacada de fondo: la legibilidad manda sobre la foto. */
.page-hero.con-media .media{position:absolute;inset:0;z-index:0}
.page-hero.con-media .media img{
  width:100%;height:100%;object-fit:cover;
  filter:grayscale(1) contrast(1.04) brightness(.86);
  opacity:.30;
}
.page-hero.con-media .media::after{
  content:"";position:absolute;inset:0;
  background:
    linear-gradient(180deg, rgba(8,22,39,.62) 0%, rgba(8,22,39,.44) 40%, rgba(8,22,39,.96) 100%),
    linear-gradient(90deg, rgba(8,22,39,.88) 0%, rgba(8,22,39,.46) 70%, rgba(8,22,39,.6) 100%),
    linear-gradient(0deg, rgba(27,75,122,.26), rgba(27,75,122,.26));
}

/* Migas de pan */
.breadcrumb{margin:0 0 24px;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.44)}
.breadcrumb ol{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.breadcrumb li{display:flex;align-items:center;gap:10px}
.breadcrumb li+li::before{content:"/";color:rgba(255,255,255,.24)}
.breadcrumb a{color:rgba(255,255,255,.6);transition:color .2s ease}
.breadcrumb a:hover{color:var(--sky-400)}
.breadcrumb [aria-current="page"]{color:rgba(255,255,255,.44)}

/* Meta del page-hero (fecha + categoría) */
.hero-tags{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin:0 0 20px;
  font-size:11.5px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--sky-400)}
.hero-tags .dot{width:4px;height:4px;border-radius:50%;background:rgba(255,255,255,.3)}
.hero-tags time{color:rgba(255,255,255,.5);letter-spacing:.12em}

/* ============ CUERPO EDITORIAL ============ */
.seccion{padding-block:clamp(72px,8vw,110px)}
.prosa{max-width:68ch;font-family:var(--serif-text);font-size:17.5px;line-height:1.85;color:var(--ink)}
.prosa.grande{font-size:18px;line-height:1.9}
.prosa p{margin:0 0 26px}
.prosa p:last-child{margin-bottom:0}
.prosa strong{font-weight:600;color:var(--navy-900)}
.prosa a{border-bottom:1px solid var(--line);transition:border-color .2s ease}
.prosa a:hover{border-color:var(--sky-400)}

/* Título documental bajo el H1 de un caso */
.titulo-doc{
  margin:0 0 34px;max-width:76ch;
  font-size:13.5px;line-height:1.7;letter-spacing:.02em;
  color:var(--muted);
}
.titulo-doc b{display:block;margin-bottom:5px;font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:var(--sky-700)}

/* ============ FRANJA CTA REUTILIZABLE ============ */
.cta-franja{background:var(--navy-900);position:relative;overflow:hidden}
.cta-franja::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(900px 440px at 92% 0%, rgba(86,180,211,.10), transparent 60%);
}
.cta-in{
  position:relative;padding-block:clamp(58px,6.5vw,86px);
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:28px;
}
.cta-in h2{color:#fff;font-size:clamp(28px,3.2vw,40px);line-height:1.15;max-width:18ch}
.cta-in p{margin:12px 0 0;font-family:var(--serif-text);font-size:16px;color:rgba(255,255,255,.6);max-width:44ch}

/* Enlace al listado completo, al pie del carrusel de la home. */
.cases-in>.link-line{margin-top:34px}

/* ============ ÍNDICE DE SERVICIOS RELACIONADOS ============ */
.relacionados{background:var(--paper)}
.rel-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0;border-top:1px solid var(--line)}
.rel-grid a{
  display:block;padding:30px 26px 30px 0;border-bottom:1px solid var(--line);
  transition:padding-left .3s var(--ease);
}
.rel-grid a:hover{padding-left:14px}
.rel-grid .t{display:block;font-family:var(--serif);font-size:23px;line-height:1.2;color:var(--navy-900);transition:color .2s ease}
.rel-grid a:hover .t{color:var(--blue-600)}
.rel-grid .d{display:block;margin-top:9px;font-family:var(--serif-text);font-size:14.5px;line-height:1.65;color:var(--muted)}

/* ============ EQUIPO ============ */
/* FASE 11. Cada persona tiene página propia en /equipo/<nombre>/ y /equipo/ es el
   índice: el fundador solo y centrado, y el resto del equipo en una cuadrícula con
   nombre, cargo, correo y —quien lo tiene— teléfono a la vista. La tarjeta entera es
   un enlace a la página; la ficha de contacto va fuera del enlace, porque un <a> no
   puede contener otros <a>. El modal de semblanza de la fase 5 se retiró. */

/* EL MARCO MANDA, LAS FOTOS OBEDECEN.
   `display:block` es obligatorio y no decorativo: .retrato es un <span>, y dentro de
   un enlace no es ítem de grid, así que sin esta línea se queda `inline` e ignora
   aspect-ratio, width, height y overflow — que fue exactamente el fallo de la fase 5.
   El marco tiene dimensión propia siempre, aunque la imagen no haya cargado, no
   exista o el JS no corra. */
.retrato{
  position:relative;
  display:block;
  aspect-ratio:4/5;
  overflow:hidden;
  border-radius:3px;
  /* Mientras carga, el marco es del color del fondo de la silueta y no navy: así no hay
     un rectángulo oscuro que aparezca y desaparezca. */
  background:var(--paper);
}
/* FASE 12: los retratos llegan ya compuestos desde el build (src/retratos.js): silueta
   sobre un fondo común, con el tono unificado en la propia imagen. Aquí no se aplica
   ningún filtro: un contrast() sobre un fondo plano lo desplaza y, en el hero del
   perfil, dibujaría una costura contra la banda. Tampoco hay foto alternativa al pasar
   el cursor: se retiró por decisión del cliente. Las imágenes de casos y noticias
   conservan su duotono navy, que uniforma el material de stock heredado. */
.retrato img{
  position:absolute;inset:0;
  width:100%;height:100%;object-fit:cover;object-position:center top;
}
/* Las fotografías de las alianzas no pasan por la composición: conservan la
   normalización sutil de color que tenían (decisión del GATE 2: rostros a color). */
.aliado .retrato img{filter:saturate(.88) contrast(1.03)}
/* Placeholder de iniciales: exactamente el mismo marco .retrato, de modo que mide lo
   mismo que cualquier foto vecina. Las iniciales se centran en capa aparte para no
   tocar el display del marco. */
.retrato.iniciales span{
  position:absolute;inset:0;
  display:grid;place-items:center;
  font-family:var(--serif);font-size:clamp(38px,7vw,58px);font-weight:500;
  letter-spacing:.06em;color:rgba(255,255,255,.62);
}

/* La tarjeta-enlace: retrato, nombre, cargo y la pista "Ver semblanza". Todo dentro
   del <a> es <span> con display:block: los márgenes verticales no aplican a las cajas
   en línea (fallo de la fase 5.1). */
.tarjeta-enlace{display:block;color:inherit}
.tarjeta-enlace .nombre{
  display:block;margin-top:18px;
  font-family:var(--serif);font-weight:600;font-size:21px;line-height:1.25;
  color:var(--navy-900);transition:color .25s ease;
}
.tarjeta-enlace:hover .nombre{color:var(--blue-600)}
.tarjeta-enlace .cargo{
  display:block;margin:8px 0 0;font-size:11.5px;font-weight:600;letter-spacing:.2em;
  text-transform:uppercase;color:var(--blue-600);
}
.tarjeta-enlace .ver{
  display:inline-flex;align-items:center;gap:7px;margin-top:12px;
  font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--blue-600);
  transition:gap .3s var(--ease);
}
.tarjeta-enlace:hover .ver{gap:13px}
.tarjeta-enlace:focus-visible{outline:2px solid var(--sky-400);outline-offset:6px;border-radius:2px}

/* El fundador: solo, centrado y con el retrato más grande del índice. */
.eyebrow--centro{text-align:center}
.fundador{max-width:560px;margin:0 auto;text-align:center}
.fundador .retrato{max-width:400px;margin:0 auto;background:var(--white)} /* su silueta va sobre blanco */
.fundador .nombre{margin-top:26px;font-size:clamp(30px,3.6vw,42px);font-weight:500;letter-spacing:-.01em;line-height:1.1}
.fundador .cargo{margin-top:12px;font-size:12.5px;letter-spacing:.24em}
/* Primera frase de su semblanza, tal cual está en los datos. */
.fundador-lead{
  display:block;margin:20px auto 0;max-width:48ch;
  font-family:var(--serif-text);font-size:17.5px;line-height:1.7;color:var(--ink);
}
.fundador .ver{margin-top:16px}
.fundador .ficha-contacto{
  display:flex;flex-wrap:wrap;justify-content:center;gap:8px 30px;
  margin-top:24px;padding-top:18px;border-top:1px solid var(--line);font-size:15.5px;
}
.fundador .ficha-contacto li{padding:0;border:0}

.equipo-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,250px),1fr));
  gap:48px 34px;
}
.miembro .retrato{max-width:340px}
.miembro .ficha-contacto{margin-top:14px;font-size:14px}
.equipo-nota{margin:0 0 46px;font-size:15px;color:var(--muted);max-width:56ch}

.ficha-contacto{margin:20px 0 0;padding:0;list-style:none;font-size:14.5px}
.ficha-contacto li{padding:7px 0;border-top:1px solid var(--line);color:var(--muted)}
.ficha-contacto a{border-bottom:1px solid var(--line)}
.ficha-contacto a:hover{border-color:var(--sky-400)}

/* ============ PÁGINA DE PERFIL (fase 11) ============ */
/* Banda clara con el nombre en grande y el retrato apoyado en el borde inferior,
   barra de contacto y semblanza en columna de lectura con ficha lateral. El fondo de
   la banda es --paper y no un gris propio: es la única superficie clara sobre la que
   --muted cumple AA (tools/contraste.js lo exige en toda superficie clara). */
/* Banda PLANA: la silueta del hero viene sobre --paper exacto y se funde con ella; un
   degradado detrás dibujaría el rectángulo de la imagen. */
.perfil-hero{position:relative;background:var(--paper);overflow:hidden}
.perfil-hero-in{position:relative;z-index:1;padding-top:160px}
.perfil-hero .breadcrumb{color:var(--muted)}
.perfil-hero .breadcrumb a{color:var(--muted)}
.perfil-hero .breadcrumb a:hover{color:var(--blue-600)}
.perfil-hero .breadcrumb li+li::before{color:var(--line)}
.perfil-hero .breadcrumb [aria-current="page"]{color:var(--muted)}
.perfil-presentacion{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,400px);gap:48px;
  align-items:end;margin-top:16px;
}
.perfil-titulo{padding-bottom:64px}
.perfil-hero h1{
  font-size:clamp(42px,6.4vw,88px);line-height:1;letter-spacing:-.02em;
  color:var(--navy-900);text-wrap:balance;
}
.perfil-cargo{margin:20px 0 0;font-size:13px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;color:var(--blue-600)}
/* El retrato termina exactamente donde termina la banda: la barra de contacto
   arranca justo debajo de él. */
/* Sin sombra, sin radio, sin borde: la persona se apoya en la banda, como en la
   referencia; el marco sólo fija la proporción. */
.perfil-retrato{width:100%;max-width:400px;justify-self:end;border-radius:0}

.perfil-contacto{background:var(--white);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.perfil-contacto-in{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:12px 32px;padding-block:20px;
}
.perfil-datos{
  list-style:none;margin:0;padding:0;
  display:flex;flex-wrap:wrap;align-items:center;gap:8px 0;
  font-size:17px;color:var(--ink);
}
.perfil-datos li{display:flex;align-items:center}
.perfil-datos li+li::before{content:"";width:1px;height:18px;margin:0 18px;background:var(--line)}
.perfil-datos .lugar{font-weight:600;color:var(--navy-900)}
.perfil-datos a{color:var(--navy-900);border-bottom:1px solid var(--line);transition:border-color .2s ease,color .2s ease}
.perfil-datos a:hover{color:var(--blue-600);border-color:var(--sky-400)}

.perfil-cuerpo-in{display:grid;grid-template-columns:minmax(0,200px) minmax(0,1fr);gap:56px 72px;align-items:start}
.perfil-aside{position:sticky;top:110px}
.perfil-aside .eyebrow{margin-bottom:6px}
.perfil-aside dl{margin:0;font-size:14.5px;line-height:1.55}
.perfil-aside dt{margin-top:18px;font-size:11px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
.perfil-aside dd{margin:4px 0 0;color:var(--ink)}
.perfil-aside dd a{border-bottom:1px solid var(--line)}
.perfil-aside dd a:hover{border-color:var(--sky-400)}
.perfil-semblanza{max-width:70ch}
.perfil-semblanza .perfil-lead{font-size:clamp(20px,2.1vw,23px);line-height:1.6;color:var(--navy-900)}

/* Zona táctil de 44px en móvil, con el mismo criterio del bloque de accesibilidad de
   más abajo: los enlaces con vecinos verticales (la barra de contacto, que en móvil
   se apila) crecen con padding real; el enlace suelto de la ficha lateral, con una
   capa invisible centrada sobre el texto. */
@media (max-width:760px){
  .perfil-datos a{display:inline-block;padding:10px 0}
  .perfil-aside dd a{position:relative}
  .perfil-aside dd a::before{
    content:"";position:absolute;left:0;right:0;
    top:50%;transform:translateY(-50%);height:44px;
  }
}

@media (max-width:960px){
  .perfil-presentacion{grid-template-columns:1fr;gap:28px}
  .perfil-titulo{padding-bottom:0}
  .perfil-retrato{max-width:300px;justify-self:start}
  .perfil-cuerpo-in{grid-template-columns:1fr;gap:36px}
  .perfil-aside{position:static}
}
@media (max-width:560px){
  .perfil-hero-in{padding-top:124px}
  .perfil-datos{flex-direction:column;align-items:flex-start;gap:10px}
  .perfil-datos li+li::before{display:none}
  .fundador .ficha-contacto{flex-direction:column;gap:10px}
}

/* ============ SALTAR AL CONTENIDO ============ */
/* Primer elemento enfocable de la página. Sólo se ve al recibir el foco. */
.saltar{
  position:fixed;top:0;left:0;z-index:100;
  transform:translateY(-120%);
  padding:14px 24px;
  background:var(--white);color:var(--navy-950);
  font-size:13px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  border-radius:0 0 3px 0;
  box-shadow:0 8px 24px rgba(8,22,39,.28);
  transition:transform .2s var(--ease);
}
.saltar:focus{transform:none}
@media (prefers-reduced-motion: reduce){.saltar{transition:none}}

/* ============ BOTÓN FLOTANTE DE WHATSAPP ============ */
/* No es el verde genérico: usa el navy y el celeste del sistema para que parezca
   parte del sitio y no un adhesivo pegado encima. */
.wa-flotante{
  position:fixed;right:22px;bottom:22px;z-index:80;
  width:56px;height:56px;
  display:grid;place-items:center;
  border-radius:50%;
  background:var(--navy-800);
  border:1px solid rgba(86,180,211,.45);
  color:#fff;
  box-shadow:0 10px 30px rgba(8,22,39,.34);
  opacity:0;transform:translateY(10px) scale(.94);
  /* `visibility:hidden` lo saca del orden de tabulación y del árbol de accesibilidad
     mientras no toca mostrarlo, y a diferencia de `display:none` deja que la
     transición funcione. El estado oculto es el del CSS, no el que ponga el JS: si el
     script no llegara a correr, el botón simplemente no aparece — nunca queda
     ocupando sitio sin verse. */
  visibility:hidden;
  transition:opacity .3s var(--ease),transform .3s var(--ease),
             background .25s ease,color .25s ease,visibility 0s linear .3s;
}
.wa-flotante.visible{
  opacity:1;transform:none;visibility:visible;
  transition:opacity .3s var(--ease),transform .3s var(--ease),
             background .25s ease,color .25s ease,visibility 0s;
}
.wa-flotante:hover{
  background:var(--sky-400);color:var(--navy-950);
  transform:translateY(-3px);
  box-shadow:0 16px 38px rgba(8,22,39,.42);
}
.wa-flotante:focus-visible{outline:2px solid var(--sky-400);outline-offset:4px}
@media (prefers-reduced-motion: reduce){
  .wa-flotante{transition:none;transform:none}
  .wa-flotante:hover{transform:none}
}
@media (max-width:560px){
  .wa-flotante{right:16px;bottom:16px}
}

/* ============ LISTADOS EDITORIALES ============ */
.lista{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.lista li{border-bottom:1px solid var(--line)}
.lista a{
  display:grid;
  grid-template-columns:132px minmax(0,1fr) auto;
  align-items:start;gap:8px 34px;
  padding:32px 6px;position:relative;
  transition:padding .35s var(--ease);
}
.lista a::before{
  content:"";position:absolute;left:0;bottom:-1px;height:1px;width:0;
  background:var(--sky-400);transition:width .45s var(--ease);
}
.lista a:hover{padding-left:16px}
.lista a:hover::before{width:100%}
.lista .miniatura{
  aspect-ratio:4/3;overflow:hidden;border-radius:2px;background:var(--navy-900);
}
.lista .miniatura img{
  width:100%;height:100%;object-fit:cover;
  filter:grayscale(1) contrast(1.04) brightness(.92);
  transition:filter .4s ease,transform .5s var(--ease);
}
.lista a:hover .miniatura img{filter:grayscale(.55) contrast(1.05) brightness(.98);transform:scale(1.04)}
.lista .meta{
  display:flex;flex-wrap:wrap;align-items:center;gap:11px;margin-bottom:11px;
  font-size:11.5px;font-weight:600;letter-spacing:.17em;text-transform:uppercase;color:var(--sky-700);
}
.lista .meta time{color:var(--muted);letter-spacing:.11em}
.lista .meta .dot{width:4px;height:4px;border-radius:50%;background:var(--line)}
.lista .t{
  display:block;font-family:var(--serif);font-weight:500;
  font-size:clamp(22px,2.2vw,28px);line-height:1.2;color:var(--navy-900);
  transition:color .25s ease;text-wrap:pretty;
}
.lista a:hover .t{color:var(--blue-600)}
.lista .d{display:block;margin-top:11px;max-width:62ch;font-family:var(--serif-text);font-size:15.5px;line-height:1.72;color:var(--muted);text-wrap:pretty}
.lista .arr{font-size:22px;color:var(--line);justify-self:end;align-self:center;transition:color .25s ease,transform .3s var(--ease)}
.lista a:hover .arr{color:var(--sky-400);transform:translateX(6px)}

/* ============ DETALLE DE CASO / NOTICIA ============ */
.fuente-cita{
  margin:46px 0 0;padding:24px 0 0;border-top:1px solid var(--line);
  font-family:var(--serif-text);font-style:italic;font-size:15.5px;line-height:1.75;color:var(--muted);
}
.fuente-cita ul{list-style:none;margin:10px 0 0;padding:0}
.fuente-cita li{margin-top:6px}
.fuente-cita a{font-style:normal;border-bottom:1px solid var(--line)}
.fuente-cita a:hover{border-color:var(--sky-400)}
.recorte{margin:40px 0 0}
.recorte img{width:100%;height:auto;border:1px solid var(--line);border-radius:2px}
.recorte figcaption{margin-top:12px;font-size:13.5px;color:var(--muted)}

.nav-entradas{border-top:1px solid var(--line);display:grid;grid-template-columns:1fr 1fr;gap:0}
.nav-entradas a{
  display:block;padding:34px 30px 34px 0;
  transition:padding .3s var(--ease);
}
.nav-entradas a.sig{text-align:right;padding:34px 0 34px 30px;border-left:1px solid var(--line)}
.nav-entradas a:hover{padding-left:14px}
.nav-entradas a.sig:hover{padding-left:30px;padding-right:14px}
.nav-entradas .k{display:block;font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:var(--sky-700);margin-bottom:10px}
.nav-entradas .t{display:block;font-family:var(--serif);font-size:20px;line-height:1.28;color:var(--navy-900);transition:color .2s ease}
.nav-entradas a:hover .t{color:var(--blue-600)}

/* ============ DOCUMENTOS ============ */
.doc-bloque+.doc-bloque{margin-top:76px}
.doc-bloque h2{font-size:clamp(28px,3.2vw,40px)}
.doc-bloque .sub{margin:12px 0 34px;font-size:15px;color:var(--muted);max-width:56ch}
.docs{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.docs li{border-bottom:1px solid var(--line)}
.docs a{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:20px;
  padding:19px 6px;transition:padding .3s var(--ease),background .25s ease;
}
.docs a:hover{padding-left:14px;background:rgba(86,180,211,.05)}
.docs .ico{width:19px;height:19px;flex:none;color:var(--muted);transition:color .25s ease}
.docs a:hover .ico{color:var(--sky-700)}
.docs .t{font-family:var(--serif-text);font-size:16.5px;line-height:1.5;color:var(--ink);text-wrap:pretty}
.docs .f{font-size:13px;letter-spacing:.05em;color:var(--muted);white-space:nowrap}
.docs .n{
  display:inline-block;min-width:2.2em;margin-right:2px;
  font-size:12.5px;font-weight:600;color:var(--sky-700);
  font-variant-numeric:tabular-nums;
}

/* ============ ALIANZAS ============ */
.aliado{
  display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.6fr);gap:52px;align-items:start;
}
.aliado+.aliado{margin-top:clamp(64px,7vw,96px);padding-top:clamp(64px,7vw,96px);border-top:1px solid var(--line)}
.aliado .retrato{max-width:380px}
.aliado h2{font-size:clamp(30px,3.4vw,42px)}
.aliado .descriptor{margin:10px 0 26px;font-size:11.5px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:var(--sky-700)}
/* Sin fotografía: marca tipográfica sobria en vez de un hueco. */
.marca-aliado{
  display:grid;place-items:center;aspect-ratio:4/5;max-width:380px;
  background:var(--navy-900);border-radius:2px;padding:30px;text-align:center;
}
.marca-aliado span{font-family:var(--serif);font-size:clamp(30px,4vw,42px);line-height:1.15;color:rgba(255,255,255,.9)}
.marca-aliado small{display:block;margin-top:14px;font-family:var(--sans);font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;color:rgba(255,255,255,.42)}

/* ============ CONTACTO ============ */
.mapa{margin-top:0;border:1px solid var(--line-dark);border-radius:3px;overflow:hidden;background:var(--navy-950)}
.mapa iframe{display:block;width:100%;height:420px;border:0;filter:grayscale(1) contrast(1.05) invert(.92)}
@media (prefers-color-scheme: dark){.mapa iframe{filter:grayscale(1) contrast(1.05) invert(.92)}}

/* ============ 404 ============ */
.e404{min-height:76vh;display:grid;place-items:center;background:var(--navy-950);position:relative;overflow:hidden}
.e404::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(900px 500px at 70% -10%, rgba(86,180,211,.12), transparent 60%);
}
.e404-in{position:relative;text-align:center;padding:130px 28px 90px;max-width:620px}
.e404 .num{font-family:var(--serif);font-size:clamp(72px,12vw,140px);line-height:1;color:rgba(255,255,255,.14)}
.e404 h1{margin-top:8px;color:#fff;font-size:clamp(30px,4.4vw,48px);line-height:1.1}
.e404 p{margin:22px auto 0;max-width:44ch;font-family:var(--serif-text);font-size:17px;line-height:1.8;color:rgba(255,255,255,.66)}
.e404 .acciones{margin-top:38px;display:flex;flex-wrap:wrap;gap:16px;justify-content:center}

/* ============ RESPONSIVE ============ */
@media (max-width:960px){
  .aliado{grid-template-columns:1fr;gap:32px}
  .aliado .retrato,.marca-aliado{max-width:340px}
}
@media (max-width:960px){
  .lista a{grid-template-columns:100px minmax(0,1fr);grid-template-areas:"mini cuerpo";gap:8px 22px;padding:26px 4px}
  .lista .miniatura{grid-area:mini}
  .lista .cuerpo{grid-area:cuerpo}
  .lista .arr{display:none}
  .nav-entradas{grid-template-columns:1fr}
  .nav-entradas a.sig{text-align:left;padding:34px 30px 34px 0;border-left:0;border-top:1px solid var(--line)}
  .nav-entradas a.sig:hover{padding-left:14px;padding-right:30px}
}
@media (max-width:760px){
  .page-hero-in{padding-block:150px 58px}
  .cta-in{flex-direction:column;align-items:flex-start;gap:22px}
  .docs a{grid-template-columns:auto minmax(0,1fr);gap:14px}
  .docs .f{grid-column:2;white-space:normal}
  .mapa iframe{height:320px}
}
@media (max-width:560px){
  .lista a{grid-template-columns:1fr;grid-template-areas:"mini" "cuerpo";gap:16px}
  .lista .miniatura{max-width:200px}
}

/* ============ SECCIONES CON FONDO ============
   Sustituyen a los style en línea que llevaban estas dos secciones. */
.seccion-papel{background:var(--paper)}
.seccion-mapa{padding-top:0;background:var(--navy-900)}

/* ============ TÍTULOS DE COLUMNA DEL FOOTER ============
   La maqueta los marcaba como <h4>, lo que dejaba un salto de nivel en las 48
   páginas (h1 o h2 y de golpe h4). Pasan a <h2>, que es su sitio real bajo el título
   de la página, y aquí se repiten los estilos que base.css les daba como h4: ese
   archivo es el CSS de la maqueta y no se toca. El aspecto es idéntico. */
.foot-col h2{
  margin:0 0 16px;
  font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:rgba(255,255,255,.4);font-family:var(--sans);
}

/* ============ TARGETS TÁCTILES ============
   En pantallas táctiles todo lo pulsable debe medir al menos 44x44. Se corrige sólo
   por debajo de 760px, que es donde importa, para no alterar el escritorio.

   Donde el enlace vive solo en su fila (migas) se agranda el área con padding y se
   compensa con margen negativo: el área táctil crece y la posición no se mueve.
   Donde hay vecinos verticales (footer, fichas de contacto) no se usa esa compensación
   a propósito: áreas solapadas provocan pulsaciones equivocadas, así que se separa de
   verdad reasignando el espacio que ya tenían los márgenes de la lista. */
@media (max-width:760px){
  .logo{display:inline-flex;align-items:center;min-height:44px}

  /* Vecinos verticales: se separan de verdad reasignando el margen de la lista. */
  .foot-col li{margin-bottom:0}
  .foot-col a{display:block;padding:11.5px 0}
  .ficha-contacto li{padding:0}
  .ficha-contacto a{display:inline-block;padding:11px 0}

  /* Enlaces sueltos: el área crece con una capa invisible centrada sobre el texto,
     así que la posición no se mueve ni un píxel. Sólo se aplica donde no hay otro
     enlace justo encima o debajo, para no solapar áreas. */
  .link-line,.c-list a,.alt-mail a,.foot-base a,.breadcrumb a{position:relative}
  .link-line::before,.c-list a::before,.alt-mail a::before,
  .foot-base a::before,.breadcrumb a::before{
    content:"";position:absolute;left:0;right:0;
    top:50%;transform:translateY(-50%);height:44px;
  }
  /* Las migas quedan 2px por debajo del mínimo a lo ancho por lo corto del texto. */
  .breadcrumb a::before{left:-2px;right:-2px}
}

/* ============ ALTURAS ESTABLES EN MÓVIL ============
   En iOS la unidad `vh` mide con la barra de direcciones retraída, así que un
   `min-height:94vh` deja el hero más alto que la pantalla y empuja el contenido.
   `svh` usa el viewport pequeño —el que ve el usuario al llegar— y no salta cuando
   la barra aparece o desaparece.

   Se declara primero en `vh` y después en `svh`: un navegador que no conozca `svh`
   ignora la segunda y conserva la primera.

   El hero vive en base.css, que es el CSS de la maqueta y no se toca; se corrige
   aquí, que se concatena después. */
.hero{min-height:94vh;min-height:94svh}
.e404{min-height:76vh;min-height:76svh}

/* ============ SOBRETÍTULOS LEGIBLES SOBRE FONDO CLARO (FASE 13) ============
   .eyebrow nace en base.css con --sky-400 y se usa en las dos clases de superficie:
   navy en los page-hero y en la franja de cifras, papel o blanco en el resto. Pasa a
   --sky-700 por defecto —que es donde más aparece y donde no se leía— y el celeste
   claro se restituye ahí donde el fondo es navy. Así un sobretítulo nuevo sobre fondo
   claro nace accesible sin que nadie tenga que acordarse. */
.eyebrow{color:var(--sky-700)}
.page-hero .eyebrow,.stats .eyebrow,.eyebrow--dark{color:var(--sky-400)}

/* ============ LA PÁGINA SE LEE SIN JAVASCRIPT (FASE 13) ============
   .rv parte de opacity:0 y sólo la clase .in que añade main.js la revela: sin
   JavaScript la home quedaba en blanco de la primera sección hacia abajo. El script
   de una línea del <head> cambia no-js por js antes del primer pintado, así que esta
   regla sólo actúa cuando de verdad no hay JavaScript y no provoca ningún parpadeo. */
html.no-js .rv{opacity:1;transform:none}

/* ================================================================
   REDISEÑO INSTITUCIONAL DE LA HOME (FASE 10)
   Se concatena después de base.css y paginas.css. base.css sigue
   siendo byte a byte el CSS de la maqueta: todo lo nuevo vive aquí y
   gana por orden de origen con la misma especificidad, sin !important.
   En el GATE A sólo la home lleva el rediseño —header mínimo, menú
   overlay, hero de marca, muro de prensa, mosaico y contacto formal—;
   las 47 internas conservan su header hasta el GATE B.
   ================================================================ */

/* ============ HEADER MÍNIMO ============ */
.site-header--nuevo .header-in{gap:32px}
.site-header--nuevo .logo{transition:opacity .35s var(--ease),visibility 0s}
/* En la home el logo pequeño vive oculto sobre el hero —el grande está en el
   bloque de marca— y aparece con el fondo navy al pasar los 60px de scroll. */
.site-header--home .logo{opacity:0;visibility:hidden;transition:opacity .35s var(--ease),visibility 0s linear .35s}
.site-header--home.scrolled .logo{opacity:1;visibility:visible;transition:opacity .35s var(--ease),visibility 0s}
/* Páginas internas: navy sólido desde el inicio. */
.site-header--solido{background:var(--navy-950)}
/* En las internas el header ya nace navy: al pasar los 60px .scrolled sólo cambiaba
   el relleno, y ese salto de 22 a 12px desplazaba el contenido fijo de debajo.
   Compactar el header es un recurso de la home, donde nace transparente sobre el
   hero. De paso se ahorra un backdrop-filter que aquí no tiene nada que difuminar. */
.site-header--solido.scrolled{padding:22px 0;background:var(--navy-950);-webkit-backdrop-filter:none;backdrop-filter:none}
.hdr-acciones{display:flex;align-items:center;gap:36px}
.hdr-contacto{
  position:relative;padding:8px 0;
  font-size:12px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:rgba(255,255,255,.78);transition:color .25s ease;
}
.hdr-contacto::after{content:"";position:absolute;left:0;bottom:4px;height:1px;width:0;background:var(--sky-400);transition:width .3s var(--ease)}
.hdr-contacto:hover,.hdr-contacto[aria-current="page"]{color:#fff}
.hdr-contacto:hover::after,.hdr-contacto[aria-current="page"]::after{width:100%}
.menu-btn{
  display:inline-flex;align-items:center;gap:12px;
  min-height:44px;padding:8px 0 8px 4px;background:none;border:0;cursor:pointer;
  font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:rgba(255,255,255,.9);transition:color .25s ease;
}
.menu-btn:hover{color:#fff}
.menu-btn-lineas{display:block;width:22px}
.menu-btn-lineas span{display:block;height:1.5px;background:currentColor;margin:5px 0;transition:width .3s var(--ease)}
.menu-btn-lineas span:nth-child(2){width:16px}
.menu-btn:hover .menu-btn-lineas span:nth-child(2){width:22px}
@media (max-width:760px){
  .site-header--nuevo .logo img{height:26px}
  /* El overlay ya lleva Contacto: en móvil el header queda logo + Menú. */
  .hdr-contacto{display:none}
}

/* ============ MENÚ OVERLAY ============ */
.menu-overlay{
  position:fixed;inset:0;z-index:90;
  background:rgba(8,22,39,.96);
  -webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);
  overflow-y:auto;-webkit-overflow-scrolling:touch;
  opacity:0;transition:opacity .35s var(--ease);
}
.menu-overlay[hidden]{display:none}
.menu-overlay.abierto{opacity:1}
.menu-in{
  position:relative;min-height:100%;
  display:grid;grid-template-columns:minmax(0,1.5fr) minmax(250px,.75fr);gap:72px;
  padding-block:118px 70px;
  transform:translateY(12px);transition:transform .5s var(--ease);
}
.menu-overlay.abierto .menu-in{transform:none}
.menu-cerrar{
  position:absolute;top:22px;right:28px;
  width:44px;height:44px;border-radius:50%;
  border:1px solid rgba(255,255,255,.28);background:none;color:#fff;
  font-size:18px;line-height:1;cursor:pointer;
  transition:background .25s ease,color .25s ease,border-color .25s ease;
}
.menu-cerrar:hover{background:#fff;color:var(--navy-950);border-color:#fff}
.menu-lista,.menu-sub{list-style:none;margin:0;padding:0}
.menu-lista>li{border-bottom:1px solid var(--line-dark)}
.menu-entrada{
  display:flex;align-items:center;justify-content:space-between;gap:20px;width:100%;
  padding:16px 0;background:none;border:0;cursor:pointer;text-align:left;
  font-family:var(--serif);font-weight:500;font-size:clamp(32px,3.6vw,46px);line-height:1.1;letter-spacing:-.01em;
  color:#fff;transition:color .25s ease;
}
.menu-entrada:hover,.menu-entrada[aria-current="page"],.menu-grupo.activo>.menu-entrada{color:var(--sky-400)}
.menu-entrada .chev{
  width:12px;height:12px;flex:none;margin-right:6px;
  border-right:1.5px solid rgba(255,255,255,.5);border-bottom:1.5px solid rgba(255,255,255,.5);
  transform:translateY(-4px) rotate(45deg);transition:transform .3s var(--ease);
}
.menu-entrada[aria-expanded="true"] .chev{transform:translateY(2px) rotate(-135deg)}
.menu-sub{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:0 36px;
  padding:2px 0 18px;
}
/* Cerrado quiere decir cerrado. El atributo hidden que pone main.js no bastaba: la
   regla de arriba declara display:grid y una hoja de autor gana siempre al
   [hidden]{display:none} del navegador, así que las sub-entradas seguían visibles y
   tabulables mientras aria-expanded decía "false". Mismo patrón que .menu-overlay. */
.menu-sub[hidden]{display:none}
.menu-sub a{
  display:block;padding:7px 0;
  font-family:var(--sans);font-size:15px;line-height:1.5;color:rgba(255,255,255,.72);
  transition:color .2s ease,padding-left .25s var(--ease);
}
.menu-sub a:hover{color:#fff;padding-left:6px}
.menu-sub a[aria-current="page"]{color:var(--sky-400)}
.menu-datos{
  padding:8px 0 0 48px;border-left:1px solid var(--line-dark);
  font-size:14.5px;line-height:1.7;color:rgba(255,255,255,.72);
}
.menu-k{margin:0 0 6px;font-size:11px;font-weight:600;letter-spacing:.22em;text-transform:uppercase;color:rgba(255,255,255,.42)}
.menu-datos p{margin:0 0 26px}
.menu-datos a{color:rgba(255,255,255,.85);border-bottom:1px solid rgba(86,180,211,.4);transition:color .2s ease,border-color .2s ease}
.menu-datos a:hover{color:var(--sky-400);border-color:var(--sky-400)}
body.menu-abierto{overflow:hidden}
@media (max-width:960px){
  .menu-in{grid-template-columns:1fr;gap:36px;padding-block:96px 50px}
  .menu-entrada{font-size:32px;padding:13px 0}
  .menu-sub{grid-template-columns:1fr}
  .menu-sub a{padding:10px 0}
  .menu-datos{padding:26px 0 0;border-left:0;border-top:1px solid var(--line-dark)}
}
@media (prefers-reduced-motion: reduce){
  .menu-overlay,.menu-in,.menu-entrada .chev,.menu-sub a,.menu-btn-lineas span{transition:none}
  .menu-in{transform:none}
}

/* ============ HERO: VIDEO + MARCA ============ */
.hero--marca{
  min-height:100vh;min-height:100svh;
  display:flex;align-items:center;justify-content:center;
}
/* El poster y el video van sin `filter`: el tratamiento está horneado en los
   archivos, y un filter sobre un video en reproducción es costoso. La opacidad sí es
   barata, y deja pasar el navy del fondo. El overlay es el ::after de .hero-media,
   los degradados navy de la maqueta. */
.hero--marca .hero-media img,.hero--marca .hero-media video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:none;animation:none;transform:none;
  opacity:.82;
}
.hero--marca .hero-media video{opacity:0;transition:opacity 1.2s var(--ease)}
.hero--marca.video-activo .hero-media video{opacity:.82}
/* Cuando el video ya reproduce, el poster se retira: si se quedara debajo al 82 %
   se transparentaría como imagen fija bajo la imagen en movimiento. El tono no
   cambia, porque el navy del fondo sigue pasando por la opacidad del video. */
.hero--marca .hero-media img{transition:opacity 1.2s var(--ease)}
.hero--marca.video-activo .hero-media img{opacity:0}
/* Si ninguna <source> sirvió, main.js marca .video-fallido: el <video> vacío se
   retira y el poster se queda solo, que es exactamente lo que debe verse. */
.hero--marca.video-fallido .hero-media video{display:none}
.hero-marca{
  position:relative;z-index:2;
  display:flex;flex-direction:column;align-items:center;text-align:center;
  padding:120px 28px 110px;
  animation:heroMarca 1.1s var(--ease) both;
}
@keyframes heroMarca{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.hero-logo{margin:0;line-height:0}
.hero-logo img{width:clamp(280px,37vw,640px);height:auto}
.hero-descriptor{
  margin:28px 0 0;
  font-size:12px;font-weight:600;letter-spacing:.28em;text-transform:uppercase;
  color:rgba(255,255,255,.72);
}
.hero-scroll{
  position:absolute;left:50%;bottom:22px;z-index:2;transform:translateX(-50%);
  display:flex;flex-direction:column;align-items:center;gap:12px;
  padding:10px 16px;min-height:44px;
  font-size:11px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;white-space:nowrap;
  color:rgba(255,255,255,.55);transition:color .25s ease;
}
.hero-scroll:hover{color:#fff}
.hero-chevron{
  width:10px;height:10px;
  border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;
  transform:rotate(45deg);animation:heroChevron 2.4s ease-in-out infinite;
}
@keyframes heroChevron{0%,100%{transform:translateY(0) rotate(45deg)}50%{transform:translateY(7px) rotate(45deg)}}
@media (max-width:760px){
  .hero-logo img{width:78vw}
  .hero-marca{padding:110px 24px 100px}
  .hero-descriptor{font-size:11px;letter-spacing:.22em;line-height:1.8;max-width:30ch}
}
@media (prefers-reduced-motion: reduce){
  .hero-chevron{animation:none}
  .hero-marca{animation:none}
  .hero--marca .hero-media video,.hero--marca .hero-media img{transition:none}
}

/* ============ EN LA PRENSA: logotipos reales ============ */
/* Los seis logotipos ocupan el ancho completo del bloque: extremos pegados a los
   bordes y huecos iguales entre ellos. Por debajo de 900px caben en dos filas y se
   centran, porque space-between dejaría la última fila descompensada. */
.press-wall{gap:26px 52px;justify-content:space-between}
@media (max-width:960px){.press-wall{justify-content:center;gap:22px 40px}}
/* Cada marca es un enlace a la portada del medio: blanco al 60 %, 88 % al pasar el
   puntero. La altura se normaliza por marca (24–28px) para que las seis lean con el
   mismo tamaño aparente; el área táctil se completa hasta 44px con el propio enlace. */
.prensa-logo{display:inline-flex;align-items:center;min-height:44px;opacity:.6;transition:opacity .25s ease}
.prensa-logo:hover,.prensa-logo:focus-visible{opacity:.88}
.prensa-logo img{width:auto;height:24px}
.prensa-logo.alto-26 img{height:26px}
.prensa-logo.alto-28 img{height:28px}
@media (max-width:760px){
  .press-wall{gap:14px 34px}
}

/* Las cifras ("Presencia") usan la franja navy .stats de base.css tal cual: el
   cliente prefirió los números grandes y animados de la maqueta. */

/* ============ DESTACADOS: mosaico ============ */
.destacados{background:var(--paper)}
.destacados-in{padding-block:clamp(96px,11vw,150px)}
.destacados-head{margin-bottom:54px}
.mosaico{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));grid-template-rows:440px 320px;gap:18px}
.mosaico-card{
  position:relative;display:block;overflow:hidden;
  grid-column:span 4;
  border-radius:3px;background:var(--navy-900);color:#fff;
}
.mosaico-card:nth-child(1){grid-column:span 6}
.mosaico-card:nth-child(2),.mosaico-card:nth-child(3){grid-column:span 3}
.mosaico-media{position:absolute;inset:0;display:block}
.mosaico-media img{
  width:100%;height:100%;object-fit:cover;
  filter:grayscale(1) contrast(1.04) brightness(.86);
  transform:scale(1);transition:transform .6s var(--ease);
}
.mosaico-media::after{
  content:"";position:absolute;inset:0;
  background:
    linear-gradient(180deg, rgba(8,22,39,.10) 0%, rgba(8,22,39,.34) 40%, rgba(8,22,39,.93) 100%),
    linear-gradient(0deg, rgba(27,75,122,.36), rgba(27,75,122,.36));
}
.mosaico-card:hover .mosaico-media img,.mosaico-card:focus-visible .mosaico-media img{transform:scale(1.03)}
.mosaico-texto{position:absolute;left:0;right:0;bottom:0;z-index:1;display:block;padding:24px 26px 26px}
.mosaico-meta{display:block;margin-bottom:12px;font-size:11.5px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--sky-400)}
.mosaico-titular{margin:0;font-family:var(--serif);font-weight:500;font-size:24px;line-height:1.22;color:#fff;text-wrap:pretty;max-width:30ch}
.mosaico-card.grande .mosaico-titular{font-size:34px;line-height:1.15;max-width:22ch}
.mosaico-regla{display:block;width:36px;height:2px;margin-top:16px;background:var(--sky-400);transition:width .5s var(--ease)}
.mosaico-card:hover .mosaico-regla,.mosaico-card:focus-visible .mosaico-regla{width:72px}
.mosaico-card:focus-visible{outline:2px solid var(--sky-400);outline-offset:4px}
.destacados-pie{display:flex;flex-wrap:wrap;gap:0 44px}
@media (max-width:960px){
  .mosaico{grid-template-columns:1fr 1fr;grid-template-rows:none;grid-auto-rows:300px;gap:14px}
  .mosaico-card:nth-child(n){grid-column:span 1}
  .mosaico-card:nth-child(1){grid-column:span 2}
  .mosaico-card.grande .mosaico-titular{font-size:30px}
}
@media (max-width:560px){
  .mosaico{grid-template-columns:1fr;grid-auto-rows:auto}
  .mosaico-card:nth-child(n){grid-column:span 1;aspect-ratio:4/3}
  .mosaico-card.grande .mosaico-titular{font-size:26px}
  .mosaico-titular{font-size:22px}
  .mosaico-texto{padding:20px 20px 22px}
}
@media (prefers-reduced-motion: reduce){
  .mosaico-media img,.mosaico-regla{transition:none}
  .prensa-logo{transition:none}
}

/* ============ CONTACTO FORMAL ============ */
.contact--formal h2{max-width:none}
.contact--formal .lead-sub{margin-top:22px}

/* ================================================================
   SISTEMA VISUAL Y ALINEACIÓN (FASE 14)

   Cuarta y última capa de la hoja servida: base.css (la maqueta, intacta
   y verificada por hash) + paginas.css + rediseno.css + ésta. Gana por
   orden de origen con la misma especificidad, sin !important.

   Resuelve tres cosas que la auditoría señaló como la diferencia con las
   referencias del socio director (skadden.com, sullcrom.com):

   1. No había sistema. Cuatro escalas distintas de relleno de sección,
      siete puntos de corte, dos radios, catorce medidas de lectura y ocho
      variantes de sobretítulo conviviendo sin criterio. Aquí se declaran
      los tokens que faltaban y se aplican.
   2. Las rejillas no estaban alineadas entre sí. Las filas de los índices
      iban 6px a la derecha de sus títulos y se desplazaban al pasar el
      puntero; en la página de perfil la semblanza no caía bajo el nombre;
      en la cuadrícula del equipo la fotografía era más estrecha que su
      propio texto; el pie no compartía rejilla con nada.
   3. La portada era demasiado larga. A 1280x720 medía 7304px y la
      evidencia —los destacados— no empezaba hasta el píxel 4740. Se
      compacta el ritmo, sin ocultar nada ni encoger el texto: las once
      áreas siguen visibles con su descripción completa y las diez cifras
      siguen grandes sobre la franja navy.
   ================================================================ */

:root{
  /* --- Espaciado. Una serie, no una colección de números sueltos. --- */
  --s-1:8px;
  --s-2:16px;
  --s-3:24px;
  --s-4:32px;
  --s-5:48px;
  --s-6:64px;
  --s-7:96px;

  /* --- Ritmo vertical de sección: dos alturas, no cuatro escalas. ---
     La estándar la usan las secciones de contenido; la corta, las franjas
     de apoyo (autoridad, prensa, cierre de llamada, barra del perfil). */
  --sec-y:clamp(64px,7vw,104px);
  --sec-y-s:clamp(40px,5vw,64px);

  /* --- Escala tipográfica --- */
  --t-1:11px;                        /* pies y notas             */
  --t-2:12px;                        /* sobretítulos y rótulos   */
  --t-3:13.5px;                      /* secundario               */
  --t-4:15.5px;                      /* apoyo                    */
  --t-5:17.5px;                      /* cuerpo de lectura        */
  --t-6:clamp(21px,2.2vw,26px);      /* entradilla               */
  --t-7:24px;                        /* h3                       */
  --t-8:clamp(36px,4.4vw,54px);      /* h2                       */
  --t-9:clamp(40px,5.4vw,72px);      /* h1                       */
  --t-10:clamp(42px,6.4vw,88px);     /* display (perfil)         */

  /* --- Medidas de lectura --- */
  --medida-prosa:68ch;
  --medida-lead:56ch;
  --medida-corta:44ch;

  /* --- Radios --- */
  --r-1:2px;                         /* controles y miniaturas   */
  --r-2:3px;                         /* tarjetas y paneles       */

  /* --- Capas --- */
  --z-header:60;
  --z-flotante:80;
  --z-menu:90;
  --z-saltar:100;

  /* Altura real del header fijo (relleno 22 + logo 34 + relleno 22). Los
     heroes se separaban de él con números escritos a mano —190, 170, 160—
     que no se movían cuando el header cambiaba. */
  --altura-header:78px;

  /* --- Menú (FASE 18) --- ---------------------------------------
     La escala --t-* no servía aquí: el menú necesita un título que baje
     de 46 a 40 —no a 36— y una sub-entrada de 22px, que cae entre --t-6
     y --t-7. Se declaran como tokens propios para que el tamaño del menú
     se lea en un sitio y no dentro de una regla. */
  --menu-t-1:clamp(40px,3.6vw,46px);   /* entradas principales, escritorio */
  --menu-t-1-m:32px;                   /* entradas principales, móvil      */
  --menu-t-2:22px;                     /* sub-entradas, escritorio         */
  --menu-t-2-m:19px;                   /* sub-entradas, móvil              */
  --menu-tap:48px;                     /* alto mínimo de lo pulsable       */
}

/* ================================================================
   1. SOBRETÍTULOS: UNA SOLA DEFINICIÓN
   Había ocho variantes de lo mismo, entre 11 y 13px y entre .17em y .28em
   de espaciado. Y el de "Áreas de práctica" ni siquiera parecía un
   sobretítulo: `.practice-head p` lo pintaba a 15px en gris de texto.
   El color lo fija la fase 13 según la superficie; aquí sólo la forma.
   ================================================================ */
.eyebrow,
.practice-head .eyebrow,
.press-label,
.menu-k,
.mosaico-meta,
.hero-tags,
.lista .meta,
.titulo-doc b,
.nav-entradas .k,
.aliado .descriptor,
.perfil-cargo,
.tarjeta-enlace .cargo,
.c-list .k,
.stat span,
.foot-col h2{
  font-family:var(--sans);
  font-weight:600;
  font-size:var(--t-2);
  letter-spacing:.2em;
  text-transform:uppercase;
}
/* El de la sección de áreas competía con `.practice-head p`, de la maqueta. */
.practice-head .eyebrow{color:var(--sky-700);margin-bottom:14px}

/* ================================================================
   2. RITMO VERTICAL
   ================================================================ */
.about-in,
.practice-in,
.stats-in,
.destacados-in,
.contact-in{padding-block:var(--sec-y)}
.seccion{padding-block:var(--sec-y)}
.authority-in{padding-block:var(--sec-y-s)}
.cta-in{padding-block:var(--sec-y-s)}
.press{padding-block:var(--s-4) var(--s-4)}
.press-label{margin-bottom:18px}

/* Los encabezados de sección respiran igual en toda la portada. */
.about-in{gap:var(--s-5)}
.about-body p:not(.lead){margin-top:20px}
.about-head .rule{margin-top:var(--s-3)}
.link-line{margin-top:28px}
.practice-head{margin-bottom:var(--s-5)}
.stats-head{margin-bottom:var(--s-5)}
.destacados-head{margin-bottom:var(--s-5)}

/* ================================================================
   3. ÍNDICE DE ÁREAS EN DOS COLUMNAS
   Once filas de 38px de relleno con la descripción a un lado ocupaban
   1900px: la sección más alta de la portada, y la que empujaba la
   evidencia por debajo del píxel 4700. En dos columnas, con el título y
   la descripción apilados —el mismo patrón que la maqueta ya usa en
   pantallas medianas—, las once áreas caben en seis filas sin ocultar
   ninguna ni encoger su texto.
   ================================================================ */
@media (min-width:961px){
  .index{
    display:grid;grid-template-columns:1fr 1fr;
    column-gap:var(--s-6);
    border-bottom:1px solid var(--line);
  }
  .index a{
    grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:"t arr" "d d";
    gap:var(--s-1) var(--s-3);
    align-items:start;
    padding:var(--s-3) 0;
  }
  .index .t{grid-area:t;font-size:26px}
  .index .d{grid-area:d;max-width:none;font-size:15px}
  .index .arr{grid-area:arr;align-self:start;line-height:1.15}
}

/* ================================================================
   4. ALINEACIÓN HORIZONTAL
   Las filas de los tres índices llevaban 6px de relleno lateral: su texto
   caía 6px a la derecha del H2 de su propia sección. Y al pasar el puntero
   sumaban entre 14 y 18px más, así que la columna se movía a cada paso del
   ratón. El realce se conserva donde no desplaza nada: la línea celeste
   que crece bajo la fila, la flecha que avanza y el fondo del renglón.
   ================================================================ */
.index a,.lista a,.docs a{padding-inline:0}
.index a:hover,.lista a:hover,.docs a:hover{padding-left:0}
.nav-entradas a:hover{padding-left:0}
.nav-entradas a.sig:hover{padding-left:30px;padding-right:0}

/* ================================================================
   5. PÁGINA DE PERFIL: LA SEMBLANZA BAJO EL NOMBRE
   La banda superior reparte 1fr / 400px —nombre a la izquierda, retrato a
   la derecha— y el cuerpo repartía 200px / 1fr, así que la semblanza
   arrancaba 272px a la derecha del nombre que la encabeza. Con la misma
   rejilla en las dos bandas, el texto cae bajo el nombre y la ficha bajo
   el retrato. El orden del marcado cambia en src/templates/perfil.js.
   ================================================================ */
.perfil-hero-in{padding-top:calc(var(--altura-header) + var(--s-6))}
.perfil-cuerpo-in{grid-template-columns:minmax(0,1fr) minmax(0,400px);gap:var(--s-5) var(--s-5)}
.perfil-aside{justify-self:end;width:100%;max-width:400px}
.perfil-semblanza{max-width:var(--medida-prosa)}

/* Encabezado de página interna: separado del header por su altura real. */
.page-hero-in{padding-block:calc(var(--altura-header) + var(--s-7)) var(--s-6)}

/* ================================================================
   6. CUADRÍCULA DEL EQUIPO
   Las columnas eran elásticas hasta el ancho disponible pero el retrato
   se detenía en 340px: la fotografía quedaba más estrecha que el nombre y
   la ficha de debajo, con el borde derecho distinto en cada fila. Ahora la
   columna mide lo que mide el retrato.
   ================================================================ */
.equipo-grid{
  grid-template-columns:repeat(auto-fill,minmax(min(100%,250px),340px));
  justify-content:space-between;
  column-gap:var(--s-4);
}

/* ================================================================
   7. PIE
   Repartía sus cuatro bloques con space-between, sin relación con ninguna
   de las rejillas de encima. Pasa a rejilla: la marca ocupa vez y media
   una columna y los tres bloques de datos, una cada uno.
   ================================================================ */
.foot-in{
  display:grid;
  grid-template-columns:minmax(0,1.4fr) repeat(3,minmax(0,1fr));
  gap:var(--s-5) var(--s-4);
}

/* ================================================================
   8. MOSAICO DE DESTACADOS
   Las filas tenían altura fija (440 y 320px) y el texto iba absoluto
   contra el borde inferior con la tarjeta en overflow:hidden: un titular
   de cinco líneas en una tarjeta de 273px crecía hacia arriba y se cortaba
   por el borde superior. Ahora el texto está en el flujo, apoyado abajo, y
   la fila crece si hace falta. El degradado inferior sube un punto para
   sostener las imágenes de menor resolución hasta que lleguen las nuevas.
   ================================================================ */
.mosaico{grid-template-rows:minmax(400px,auto) minmax(260px,auto)}
.mosaico-card{display:flex;flex-direction:column;justify-content:flex-end;border-radius:var(--r-2)}
.mosaico-texto{position:relative}
.mosaico-titular{max-width:none}
.mosaico-card.grande .mosaico-titular{max-width:none}
.mosaico-media img{filter:grayscale(1) contrast(1.04) brightness(.84)}
.mosaico-media::after{
  background:
    linear-gradient(180deg, rgba(8,22,39,.12) 0%, rgba(8,22,39,.38) 40%, rgba(8,22,39,.96) 100%),
    linear-gradient(0deg, rgba(27,75,122,.36), rgba(27,75,122,.36));
}

/* ================================================================
   9. RESPONSIVE: UNA SOLA SERIE DE CORTES
   560 / 760 / 960 / 1200. Los cortes en 600, 860, 900 y 1000 que habían
   ido apareciendo se reasignan a los de la serie en sus propias hojas.
   ================================================================ */
@media (max-width:960px){
  .index{border-bottom:0}
  .perfil-cuerpo-in{grid-template-columns:1fr;gap:var(--s-5)}
  .perfil-aside{justify-self:start;max-width:none}
  .foot-in{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
}
@media (max-width:760px){
  :root{--altura-header:70px}
  .page-hero-in{padding-block:calc(var(--altura-header) + var(--s-6)) var(--s-5)}
  .perfil-hero-in{padding-top:calc(var(--altura-header) + var(--s-5))}
}
@media (max-width:560px){
  .foot-in{grid-template-columns:1fr}
}

/* Excepción medida: en las tarjetas estrechas del mosaico (273px a 1280) el
   sobretítulo unificado no cabe en una línea y "Cuentas bloqueadas · Feb 2024" se
   partía en dos. Sólo ahí baja un punto y afloja el espaciado. */
.mosaico-card:not(.grande) .mosaico-meta{font-size:var(--t-1);letter-spacing:.16em}

/* ================================================================
   10. <picture> (FASE 15)
   El elemento es sólo un envoltorio para que el navegador elija formato y ancho.
   Con display:contents desaparece de la caja y la <img> queda como hija directa de
   su contenedor, que es lo que esperan las reglas de .mosaico-media, .miniatura,
   .retrato y .page-hero .media.
   ================================================================ */
picture{display:contents}

/* ================================================================
   11. TIPOGRAFÍAS PROPIAS (FASE 15)

   Las tres familias se servían desde fonts.googleapis.com con una hoja de
   estilos externa que bloquea el render: antes de pintar una sola letra el
   navegador tenía que resolver un dominio ajeno, descargar un CSS y sólo
   entonces empezar a pedir los archivos. Ahora viajan con el sitio.

   Son las mismas de siempre —Cormorant Garamond, Source Sans 3 y Source Serif 4,
   con licencia OFL— en el subconjunto latino, que cubre íntegro el español
   (acentos, eñe y los signos de apertura). Los tres archivos verticales son
   fuentes variables: el mismo archivo sirve al 500 y al 600, y cada @font-face
   fija la instancia que le toca. Seis archivos, 173 KB en total.
   ================================================================ */
@font-face{
  font-family:'Cormorant Garamond';
  font-style:normal;
  font-weight:500;
  font-display:swap;
  src:url('/assets/tipografias/cormorant-garamond.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Cormorant Garamond';
  font-style:normal;
  font-weight:600;
  font-display:swap;
  src:url('/assets/tipografias/cormorant-garamond.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Cormorant Garamond';
  font-style:italic;
  font-weight:500;
  font-display:swap;
  src:url('/assets/tipografias/cormorant-garamond-italica.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Source Sans 3';
  font-style:normal;
  font-weight:400;
  font-display:swap;
  src:url('/assets/tipografias/source-sans-3.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Source Sans 3';
  font-style:normal;
  font-weight:600;
  font-display:swap;
  src:url('/assets/tipografias/source-sans-3.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Source Sans 3';
  font-style:italic;
  font-weight:400;
  font-display:swap;
  src:url('/assets/tipografias/source-sans-3-italica.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Source Serif 4';
  font-style:normal;
  font-weight:400;
  font-display:swap;
  src:url('/assets/tipografias/source-serif-4.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Source Serif 4';
  font-style:normal;
  font-weight:600;
  font-display:swap;
  src:url('/assets/tipografias/source-serif-4.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Source Serif 4';
  font-style:italic;
  font-weight:400;
  font-display:swap;
  src:url('/assets/tipografias/source-serif-4-italica.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}

/* ================================================================
   12. FICHA DE CONTACTO INSTITUCIONAL (FASE 16)
   Mismo panel navy que tenía el formulario, con el correo y el teléfono de la
   firma como vía principal y WhatsApp declarado como alternativa. Los campos y
   el <input> ya no existen; el botón conserva la clase .btn-send porque es el
   mismo elemento visual y porque geometria-home.js mide su área táctil.
   ================================================================ */
.ficha-directa .vias{list-style:none;margin:0 0 var(--s-3);padding:0}
.ficha-directa .vias li{padding:14px 0;border-top:1px solid var(--line-dark)}
.ficha-directa .vias li:last-child{border-bottom:1px solid var(--line-dark)}
/* Las dos vías van en grande y sin rótulo: el rótulo lo lleva el directorio de la
   columna de al lado, y aquí repetirlo sólo duplicaba la misma información. */
.ficha-directa .vias .principal{
  display:inline-block;font-family:var(--serif-text);font-size:18px;line-height:1.4;
  color:#fff;border-bottom:1px solid rgba(86,180,211,.45);
  transition:color .2s ease,border-color .2s ease;
}
.ficha-directa .vias .principal:hover{color:var(--sky-400);border-color:var(--sky-400)}
/* El botón es un enlace, no un <button>: hay que devolverle la caja. */
a.btn-send{display:block;box-sizing:border-box;text-align:center;min-height:44px}

/* La franja del precedente pasa a ser enlace (fase 16): mismo bloque, con la
   respuesta al puntero que corresponde a algo en lo que se puede pulsar. */
a.seal{display:block;text-decoration:none;transition:border-color .25s ease,background .25s ease}
a.seal:hover{border-color:var(--sky-400);background:rgba(86,180,211,.06)}
a.seal:focus-visible{outline:2px solid var(--sky-400);outline-offset:4px}
.authority blockquote small a{color:rgba(255,255,255,.72);border-bottom:1px solid rgba(86,180,211,.4);transition:color .2s ease,border-color .2s ease}
.authority blockquote small a:hover{color:var(--sky-400);border-color:var(--sky-400)}

/* ================================================================
   13. BLANCOS TRANSLÚCIDOS SOBRE NAVY (FASE 17)

   Lighthouse encontró dos textos del pie por debajo de AA y, al revisarlos,
   otros seis rótulos compartían el problema: el blanco al 38-45 % sobre el navy
   da entre 3,5 y 4,1:1 y todos son texto pequeño, de 11 a 13,5px. Ninguno se
   acoge al umbral de texto grande.

   El 58 % da 6,29:1 sobre --navy-900 y 6,60:1 sobre --navy-950, y conserva la
   jerarquía: siguen siendo secundarios frente al blanco pleno de los datos. Se
   corrigen aquí porque casi todos nacen en base.css, que no se toca.
   ================================================================ */
.seal .reg,
.press-label,
.c-list .k,
.alt-mail,
.foot-col h2,
.foot-col h4,
.foot-base,
.marca-aliado small,
.menu-k,
.breadcrumb li+li::before,
.field input::placeholder,
.field label{color:rgba(255,255,255,.58)}
/* Las migas son navegación: por encima de los rótulos, por debajo del contenido. */
.breadcrumb,
.breadcrumb [aria-current="page"]{color:rgba(255,255,255,.68)}
/* El "404" es un número de marca de agua de 72 a 140px. Como texto grande le
   basta 3:1, y el 35 % da 3,16:1. */
.e404 .num{color:rgba(255,255,255,.35)}

/* ================================================================
   14. MAPA BAJO DEMANDA (FASE 17)
   El iframe de Google Maps deja dos cookies de terceros en cuanto se carga y era
   el único punto del sitio que lo hacía. La sección muestra la dirección y dos
   acciones —cargar el mapa aquí o abrirlo en Google Maps— y el iframe entra sólo
   si el visitante lo pide. Sin JavaScript queda el enlace, que es la vía que de
   todos modos usa quien quiere llegar.
   ================================================================ */
.mapa-aviso{padding:clamp(32px,5vw,56px)}
.mapa-aviso .k{
  margin:0 0 var(--s-2);
  font-size:var(--t-2);font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--sky-400);
}
.mapa-aviso .dir{
  margin:0;max-width:var(--medida-corta);
  font-family:var(--serif);font-size:var(--t-6);line-height:1.4;color:#fff;
}
.mapa-aviso .nota{
  margin:var(--s-3) 0 0;max-width:var(--medida-lead);
  font-size:var(--t-4);line-height:1.7;color:rgba(255,255,255,.66);
}
.mapa-aviso .acciones{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s-3) var(--s-5);margin-top:var(--s-4)}
.btn-mapa{
  min-height:44px;padding:14px 26px;
  background:var(--sky-400);color:var(--navy-950);
  border:0;border-radius:var(--r-1);cursor:pointer;
  font-family:var(--sans);font-size:13px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  transition:background .25s ease;
}
.btn-mapa:hover{background:#fff}
.btn-mapa:focus-visible{outline:2px solid #fff;outline-offset:3px}
.mapa-aviso .link-line{margin-top:0;color:rgba(255,255,255,.85);border-bottom-color:var(--sky-400)}
.mapa-aviso .link-line:hover{color:#fff}
@media (prefers-reduced-motion: reduce){.btn-mapa{transition:none}}

/* ================================================================
   15. MENÚ LEGIBLE Y PULSABLE  (FASE 18)

   La auditoría 2.0 midió lo que ya se veía: el título principal llega a
   46px y la sub-entrada se queda en 15px, tres veces más pequeña, con lo
   que las once áreas de práctica —el contenido real del menú— parecen
   una nota al pie. Y el destino que más se busca en un despacho, el
   equipo, vivía en esa letra pequeña.

   Tres cambios, ninguno de ellos decorativo:
     · La distancia entre los dos niveles baja de 46/15 a 46/22. El
       título sigue mandando; la sub-entrada ya se lee de pie.
     · Todo lo pulsable mide 48px de alto. El proyecto ya tenía la regla
       de los 44px (paginas.css:558) pero el menú se había quedado fuera:
       36,5px en escritorio y 42,5px en móvil.
     · Se retira el desplazamiento lateral al pasar el cursor. La FASE 14
       lo había eliminado del índice, las listas y los documentos porque
       la columna se movía a cada paso del ratón; .menu-sub y .rel-grid
       fueron los dos que se quedaron atrás.
   ================================================================ */

.menu-entrada{
  font-size:var(--menu-t-1);
  padding:14px 0;min-height:var(--menu-tap);
}

/* Un grupo de dos entradas en dos columnas deja un hueco a la derecha que
   se lee como un error de maqueta. Sólo Servicios, con once, las necesita:
   layout.js marca con --columnas los submenús de más de seis. */
.menu-sub{grid-template-columns:1fr;gap:0 var(--s-5);padding:4px 0 20px}
.menu-sub--columnas{grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}

.menu-sub a{
  display:flex;align-items:center;
  min-height:var(--menu-tap);padding:6px 0;
  font-size:var(--menu-t-2);line-height:1.3;
  transition:color .2s ease;
}
.menu-sub a:hover{color:#fff;padding-left:0}

/* El menú se recorre con el teclado y hasta ahora el foco sólo se veía por
   el cambio de color, que en la entrada activa ya era celeste. */
.menu-entrada:focus-visible,
.menu-sub a:focus-visible{outline:2px solid var(--sky-400);outline-offset:4px}

@media (max-width:960px){
  .menu-entrada{font-size:var(--menu-t-1-m);padding:12px 0}
  .menu-sub{grid-template-columns:1fr}
  .menu-sub a{font-size:var(--menu-t-2-m);padding:8px 0}
}
@media (prefers-reduced-motion: reduce){
  .menu-sub a{transition:none}
}

/* El desplazamiento que faltaba retirar en la FASE 14 (premium.css:157). */
.rel-grid a{transition:color .25s ease,border-color .25s ease}
.rel-grid a:hover{padding-left:0}

/* ================================================================
   16. "QUIÉNES SOMOS" COMO PÁGINA  (FASE 18)

   La sección de la portada respira con 96–150px arriba y abajo porque
   ahí es una parada dentro de un recorrido largo. Como página tiene su
   propio encabezado encima, y ese mismo aire la despegaba del título.
   ================================================================ */
.about--pagina .about-in{padding-block:var(--sec-y)}
.about--pagina .about-head h2{max-width:none}
/* Tres salidas seguidas, no una: se separan entre sí y comparten la
   línea de base en vez de apilar tres márgenes de 36px. */
.about-salidas{
  display:flex;flex-wrap:wrap;align-items:center;gap:0 var(--s-5);
  margin:0;max-width:none;
}
.about--pagina .about-salidas .link-line{margin-top:var(--s-4)}

/* La entrada de la rama en la que está el visitante, cuando la página actual es una
   hija: /equipo/<persona>/ resalta "Equipo", /noticias/<nota>/ resalta "Noticias".
   Se distingue de aria-current sólo semánticamente; el color es el mismo, porque para
   el ojo ambas cosas responden a la misma pregunta: dónde estoy. */
.menu-entrada.en-rama,
.menu-sub a.en-rama{color:var(--sky-400)}

/* ================================================================
   17. EL FUNDADOR, EN HORIZONTAL  (FASE 18)

   La tarjeta de la fase 11 lo presentaba centrado: retrato de 400px
   arriba, y debajo el nombre, el cargo, la primera frase y el contacto,
   todo en una columna de 560px. La auditoría 2.0 pidió la composición de
   sullcrom.com —quién es a la izquierda, retrato a la derecha— y tiene
   razón en el motivo: centrado, el nombre entraba después de la
   fotografía, y una silueta recortada flotando sobre el texto deja ver
   sus bordes.

   El retrato se apoya en el borde inferior de la sección con un margen
   negativo del alto del ritmo vertical, que es el truco de la página de
   perfil: así el corte del marco 4:5 coincide con el cambio de fondo y
   la persona parece salir de la banda, no estar pegada encima.
   ================================================================ */
.fundador{
  max-width:none;margin:0;text-align:left;
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(280px,400px);
  column-gap:var(--s-6);
  align-items:end;
}
.fundador-texto{max-width:var(--medida-lead);padding-bottom:var(--s-4)}
/* La sección cede su relleno inferior al retrato en vez de restárselo con un margen
   negativo: el margen tenía que adivinar el relleno y fallaba por 18px, y esos 18px
   eran un filo blanco del marco 4:5 asomando sobre el fondo de la sección siguiente.
   Así el corte de la silueta cae EXACTAMENTE en la línea entre los dos fondos. El
   texto conserva su propio aire porque lo lleva él (.fundador-texto). */
.seccion-fundador{padding-bottom:0}
.fundador-retrato{display:block;justify-self:end;width:100%;max-width:400px}
.fundador .retrato{margin:0;max-width:400px}
.fundador .nombre{margin-top:0}
.fundador-lead{margin:20px 0 0;max-width:none}
.fundador .ver{margin-top:20px}
.fundador .ficha-contacto{justify-content:flex-start;margin-top:22px}

@media (max-width:760px){
  .fundador{grid-template-columns:1fr;row-gap:var(--s-4)}
  .fundador-texto{max-width:none;padding-bottom:var(--s-4)}
  .fundador-retrato{justify-self:start;max-width:300px}
}

/* La cuadrícula del equipo: tres, dos y una columna.
   La regla de la fase 14 (sección 6) usaba auto-fill con un tope de 340px
   y space-between: a según qué anchos entraban cuatro columnas estrechas
   o quedaban dos con un hueco de 300px entre ellas. Con un número fijo de
   columnas por tramo, las seis personas caen siempre en 3+3, 2+2+2 o una
   sola fila por persona. */
.equipo-grid{
  /* El tope de 340px es el ancho del retrato: sin él, por encima de 1400px la columna
     crecía y el nombre y la ficha quedaban 9px más anchos que la fotografía, con el
     borde derecho de cada tarjeta desalineado. Por debajo, las columnas encogen. */
  grid-template-columns:repeat(3,minmax(0,340px));
  justify-content:start;
  column-gap:var(--s-5);
}
@media (max-width:960px){.equipo-grid{grid-template-columns:repeat(2,minmax(0,340px))}}
@media (max-width:560px){.equipo-grid{grid-template-columns:minmax(0,340px)}}

/* ================================================================
   18. ALIANZAS: DOS BLOQUES QUE PESAN LO MISMO  (FASE 18)

   La rejilla anterior era .85fr / 1.6fr: el visual ocupaba un tercio y
   el texto dos, con seis párrafos en el primer aliado y tres en el
   segundo. El resultado es el que describió la auditoría: una alianza
   con retrato y biografía extensa y otra que parecía una nota.

   Ahora las dos tarjetas tienen la misma caja visual —340px, 4:5, tenga
   dentro un retrato o la marca tipográfica— y las mismas piezas en el
   mismo orden. La bio completa está en la página de cada aliado.
   ================================================================ */
.aliados{display:grid;gap:var(--sec-y-s)}
.aliado{
  display:grid;
  grid-template-columns:minmax(0,340px) minmax(0,1fr);
  gap:var(--s-6);
  align-items:start;
}
.aliado-visual{display:block}
/* El punto separador del sobretítulo. Existía para .case-meta, .hero-tags y .lista,
   cada uno con su regla: sin una para este contexto salía un <span> sin caja y el
   rótulo se leía "FIRMA ASOCIADA INDIA", como si fuera una sola cosa. */
.aliado .eyebrow .dot{
  display:inline-block;vertical-align:middle;
  width:4px;height:4px;margin:0 4px;border-radius:50%;background:var(--line);
}
.aliado .retrato,
.marca-aliado{max-width:340px;width:100%}
.aliado-cuerpo h2{margin:6px 0 0;font-size:var(--t-8);line-height:1.1}
/* El nombre es el enlace principal del bloque: a 390px su caja medía 43px, uno menos
   del mínimo táctil del proyecto. El relleno se compensa en el margen del h2 para que
   el ritmo vertical no cambie. */
.aliado-cuerpo h2 a{display:inline-block;padding-block:4px;color:inherit}
.aliado-cuerpo h2 a:hover{color:var(--blue-600)}
.aliado .descriptor{margin:12px 0 0;font-family:var(--serif-text);font-size:var(--t-5);color:var(--muted)}
.aliado-resumen{
  margin:20px 0 0;max-width:var(--medida-prosa);
  font-family:var(--serif-text);font-size:var(--t-5);line-height:1.8;
}

/* Rótulo de bloque dentro de una tarjeta o del aside. */
.aliado-k{
  margin:26px 0 10px;
  font-size:var(--t-2);font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--muted);
}
.capacidades{
  display:flex;flex-wrap:wrap;gap:8px;
  margin:0;padding:0;list-style:none;
}
.capacidades li{
  padding:6px 12px;border:1px solid var(--line);border-radius:var(--r-1);
  font-size:var(--t-3);color:var(--navy-900);background:var(--white);
}
.capacidades li.mas{border-style:dashed;color:var(--muted)}

/* El representante: identificado, pequeño y separado de la marca. Nunca
   sustituye al nombre de la firma. */
.representante{
  display:flex;align-items:center;gap:14px;
  margin:26px 0 0;padding-top:20px;border-top:1px solid var(--line);
}
.representante-foto{display:block;flex:none;width:72px;height:72px;overflow:hidden;border-radius:50%}
.representante-foto img{width:100%;height:100%;object-fit:cover;filter:saturate(.88) contrast(1.03)}
.representante b{display:block;font-family:var(--serif);font-size:var(--t-7);font-weight:500;line-height:1.2;color:var(--navy-900)}
.representante small{
  display:block;margin-top:4px;
  font-size:var(--t-2);letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
}

@media (max-width:760px){
  .aliado{grid-template-columns:1fr;gap:var(--s-4)}
  .aliado .retrato,.marca-aliado{max-width:300px}
}

/* ================================================================
   19. LA PÁGINA DE CADA ALIANZA  (FASE 18)

   Misma anatomía que la página de una persona —banda de presentación,
   barra de datos, cuerpo con aside—, con clases propias porque un
   despacho asociado no tiene retrato y tools/geometria.js mide
   .perfil-presentacion dando por hecho que sí.

   El aside va a la izquierda, como en el perfil, pero el orden del
   documento deja primero la biografía: quien navega con teclado o
   lector de pantalla llega al texto antes que a la ficha.
   ================================================================ */
.aliado-hero{position:relative;background:var(--paper);overflow:hidden}
.aliado-hero-in{position:relative;z-index:1;padding-top:160px}
.aliado-hero .breadcrumb,
.aliado-hero .breadcrumb a{color:var(--muted)}
.aliado-hero .breadcrumb a:hover{color:var(--blue-600)}
.aliado-hero .breadcrumb li+li::before{color:var(--line)}
.aliado-hero .breadcrumb [aria-current="page"]{color:var(--muted)}
.aliado-presentacion{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,340px);gap:48px;
  align-items:end;margin-top:16px;
}
.aliado-titulo{padding-bottom:64px}
.aliado-hero h1{
  font-size:var(--t-10);line-height:1;letter-spacing:-.02em;
  color:var(--navy-900);text-wrap:balance;
}
.aliado-hero .eyebrow{margin-bottom:14px}
.aliado-descriptor{
  margin:22px 0 0;max-width:var(--medida-lead);
  font-family:var(--serif-text);font-size:var(--t-6);line-height:1.6;color:var(--muted);
}
/* El retrato se apoya en la banda y termina donde ella termina, igual que
   en el perfil: sin sombra, sin radio y sin borde. */
.aliado-retrato{width:100%;max-width:340px;justify-self:end;border-radius:0}
.aliado-presentacion .marca-aliado{justify-self:end;margin-bottom:0}

.aliado-datos{background:var(--white);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.aliado-datos-in{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:12px 32px;padding-block:20px;
}
.aliado-datos .ficha-contacto{
  display:flex;flex-wrap:wrap;align-items:center;gap:8px 32px;
  margin:0;padding:0;list-style:none;font-size:var(--t-4);
}
.aliado-datos .ficha-contacto li{padding:0;border:0}
.aliado-datos .ficha-contacto .k{
  margin-right:8px;
  font-size:var(--t-1);font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);
}
.aliado-datos .link-line{margin-top:0}

.aliado-cuerpo-in{display:grid;grid-template-columns:minmax(0,220px) minmax(0,1fr);gap:56px 72px;align-items:start}
.aliado-cuerpo-in .prosa{grid-column:2;grid-row:1;max-width:70ch}
.aliado-aside{grid-column:1;grid-row:1;position:sticky;top:110px}
.aliado-aside .eyebrow{margin-bottom:6px}
.aliado-aside dl{margin:0;font-size:var(--t-4);line-height:1.55}
.aliado-aside dt{margin-top:18px;font-size:var(--t-1);font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
.aliado-aside dd{margin:4px 0 0;color:var(--ink)}
.aliado-aside .aliado-k{margin-top:26px}
.aliado-aside .capacidades li{background:var(--paper)}
.aliado-aside .representante{display:block}
.aliado-aside .representante-foto{width:120px;height:120px;margin-bottom:12px}

@media (max-width:960px){
  .aliado-cuerpo-in{grid-template-columns:1fr}
  .aliado-cuerpo-in .prosa{grid-column:1;grid-row:1}
  .aliado-aside{grid-column:1;grid-row:2;position:static}
}
@media (max-width:760px){
  .aliado-hero-in{padding-top:120px}
  .aliado-presentacion{grid-template-columns:1fr;gap:0}
  .aliado-titulo{padding-bottom:32px}
  .aliado-retrato{justify-self:start;max-width:300px}
  .aliado-presentacion .marca-aliado{justify-self:start}
}

/* La columna de datos del menú: dirección, teléfonos, correos y redes. Son enlaces en
   línea de 22px de alto, la mitad de lo que el proyecto exige a cualquier cosa
   pulsable (paginas.css:558). En escritorio se pulsan con el ratón y no hay problema;
   en móvil son seis destinos de dedo dentro de un panel a pantalla completa.
   Se pasan a bloque —el <br> que los separaba deja de hacer falta— y cada uno recibe
   el mismo alto que las entradas del menú. */
@media (max-width:960px){
  .menu-datos br{display:none}
  .menu-datos a{display:block;padding-block:13px}
  .menu-datos p{margin-bottom:18px}
}

/* ================================================================
   20. NOTICIAS: APERTURA, FILTROS Y FECHAS  (FASE 19)

   El listado eran quince renglones idénticos en el orden en que se
   cargaron al WordPress viejo. Nada destacaba, la actualidad no se veía
   —once entradas llevaban la misma fecha del 11 de enero de 2024, que es
   el día de la carga— y no había forma de buscar por tipo ni por año.

   La apertura pone la entrada más reciente a dos tercios de ancho y dos
   secundarias al lado. El texto va sobre blanco, debajo de la imagen, y
   no encima de ella: sobre la fotografía habría que oscurecerla, y la
   auditoría pedía justo lo contrario para el material de prensa.
   ================================================================ */
.apertura-sec{padding-bottom:0}
.apertura{
  display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);
  gap:var(--s-5);align-items:start;
}
.apertura-lado{display:grid;gap:var(--s-5);align-content:start}

.apertura-principal,
.apertura-secundaria{display:block;color:inherit}
.apertura-media{
  display:block;overflow:hidden;border-radius:var(--r-2);
  background:var(--navy-900);aspect-ratio:3/2;
}
.apertura-secundaria .apertura-media{aspect-ratio:16/9}
.apertura-media img{
  width:100%;height:100%;object-fit:cover;
  /* El mismo duotono del mosaico de la portada: el sistema visual es uno. */
  filter:grayscale(1) contrast(1.04) brightness(.9);
  transition:filter .4s ease,transform .5s var(--ease);
}
.apertura-principal:hover .apertura-media img,
.apertura-secundaria:hover .apertura-media img{filter:grayscale(.5) contrast(1.05) brightness(.98);transform:scale(1.03)}
.apertura-texto{display:block;padding-top:18px}
.apertura .meta{
  display:flex;flex-wrap:wrap;align-items:center;gap:11px;margin-bottom:11px;
  font-size:11.5px;font-weight:600;letter-spacing:.17em;text-transform:uppercase;color:var(--sky-700);
}
.apertura .meta time{color:var(--muted);letter-spacing:.11em}
.apertura .meta .dot{width:4px;height:4px;border-radius:50%;background:var(--line)}
.apertura .t{
  display:block;font-family:var(--serif);font-weight:500;line-height:1.15;
  color:var(--navy-900);transition:color .25s ease;text-wrap:pretty;
}
.apertura-principal .t{font-size:var(--t-8)}
.apertura-secundaria .t{font-size:var(--t-7)}
.apertura a:hover .t{color:var(--blue-600)}
.apertura .d{
  display:block;margin-top:14px;max-width:62ch;
  font-family:var(--serif-text);font-size:var(--t-4);line-height:1.72;color:var(--muted);
}

/* Los filtros. Enlaces, no controles: funcionan sin JavaScript y cada uno
   tiene su URL. El número de entradas va al lado para que el visitante
   sepa qué va a encontrar antes de pulsar. */
.filtros{
  display:grid;grid-template-columns:auto minmax(0,1fr);
  gap:6px var(--s-3);align-items:baseline;
  margin-bottom:var(--s-4);padding-bottom:var(--s-3);border-bottom:1px solid var(--line);
}
.filtros-k{
  margin:0;font-size:var(--t-1);font-weight:600;letter-spacing:.2em;
  text-transform:uppercase;color:var(--muted);
}
.filtros ul{display:flex;flex-wrap:wrap;gap:0 var(--s-2);margin:0;padding:0;list-style:none}
.filtros a{
  display:inline-flex;align-items:center;gap:7px;min-height:44px;
  font-size:var(--t-3);letter-spacing:.04em;color:var(--sky-700);
  border-bottom:1px solid transparent;
}
.filtros a:hover{color:var(--navy-900);border-bottom-color:var(--sky-400)}
.filtros a[aria-current="page"]{color:var(--navy-900);border-bottom-color:var(--navy-900)}
.filtros .n{font-size:var(--t-1);color:var(--muted);letter-spacing:.08em}
.filtros a[aria-current="page"] .n{color:var(--navy-900)}

/* El medio, dentro del meta de un renglón o de la apertura. */
.lista .meta .medio,
.apertura .meta .medio{color:var(--navy-900)}

/* Las fechas que no son la principal, al pie del encabezado de una nota. */
.fechas-nota{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:4px var(--s-4);
  margin:0 0 var(--s-3);padding-bottom:var(--s-3);border-bottom:1px solid var(--line);
}
.fechas-nota dt{
  font-size:var(--t-1);font-weight:600;letter-spacing:.18em;
  text-transform:uppercase;color:var(--muted);
}
.fechas-nota dd{margin:0 var(--s-4) 0 0;font-size:var(--t-3);color:var(--ink)}

@media (max-width:960px){
  .apertura{grid-template-columns:1fr;gap:var(--s-4)}
  .apertura-secundaria .apertura-media{aspect-ratio:3/2}
  .filtros{grid-template-columns:1fr;gap:0}
  .filtros-k{margin-top:var(--s-2)}
}

/* La caja de la apertura cuando no hay fotografía: el nombre del medio sobre navy.
   No es un placeholder: dice quién publicó, que es justo lo que el visitante quiere
   saber de una cobertura, y conserva la altura de la fila. */
.apertura-media--marca{
  display:grid;place-items:center;padding:24px;text-align:center;
  background:var(--navy-900);
}
.apertura-media--marca span{
  font-family:var(--serif);font-size:clamp(26px,3vw,40px);line-height:1.15;
  color:rgba(255,255,255,.9);
}
.apertura-secundaria .apertura-media--marca span{font-size:clamp(21px,2.4vw,26px)}

/* Miniatura sin fotografía: el nombre del medio en la misma caja 4:3. */
.miniatura--marca{
  display:grid;place-items:center;padding:8px;text-align:center;
}
.miniatura--marca span{
  font-family:var(--serif);font-size:15px;line-height:1.2;
  color:rgba(255,255,255,.82);text-wrap:balance;
}

/* Dos áreas táctiles que se quedaban cortas en el archivo de noticias (FASE 19).

   El año del filtro medía 42px de ancho: son cuatro cifras y no dan para 44 sin
   ayuda. Se le da relleno lateral, que además lo separa de su vecino.

   El enlace del medio en el pie de una nota —"Publicado originalmente en X"— medía
   22px de alto. Es un enlace suelto dentro de una frase, así que recibe el mismo
   tratamiento que el proyecto ya da a .link-line y a las migas: una capa invisible
   centrada sobre el texto, que agranda el área sin mover un solo píxel. */
.filtros a{padding-inline:8px}
.filtros ul{margin-inline:-8px}
@media (max-width:760px){
  .fuente-cita a{position:relative}
  .fuente-cita a::before{
    content:"";position:absolute;left:0;right:0;
    top:50%;transform:translateY(-50%);height:44px;
  }
}

/* ================================================================
   21. LAS TRES ÁREAS TÁCTILES QUE FALTABAN EN LA PORTADA  (FASE 20)

   La validación de la fase 20 las encontró a 390px: el enlace a la tesis
   en el Semanario Judicial (37px de alto) y las dos vías de contacto de
   la franja de cierre, el correo y el teléfono de la firma (26px). Son
   anteriores a la auditoría 2.0 y estaban fuera del alcance de las fases
   18 y 19, que no debían tocar la portada; se corrigen aquí, que es la
   fase de validación, y sólo con relleno: ni una clase ni un texto
   cambian, así que tools/comparar-home.js sigue viendo la misma portada.

   Las dos vías van una encima de otra: se separan de verdad con relleno
   en vez de solaparlas con una capa invisible, que es el criterio que el
   proyecto ya aplica al pie y a las fichas de contacto.
   ================================================================ */
@media (max-width:760px){
  .authority blockquote small a{
    display:inline-block;padding-block:4px;   /* 37 + 8 = 45 */
  }
  .ficha-directa .vias li{padding:9px 0}
  .ficha-directa .vias .principal{padding-block:9px}   /* 26 + 18 = 44 */
}

/* Movimiento reducido: las dos imágenes que se acercan al pasar el cursor.
   La de la apertura es de la fase 19; la de la miniatura del archivo venía de antes y
   se había quedado fuera del bloque que el proyecto ya tiene para el mosaico de la
   portada. Quien pide menos movimiento no debería recibir un zoom por pasar el ratón. */
@media (prefers-reduced-motion: reduce){
  .apertura-media img,
  .lista .miniatura img{transition:none;transform:none}
  .apertura-principal:hover .apertura-media img,
  .apertura-secundaria:hover .apertura-media img,
  .lista a:hover .miniatura img{transform:none}
}

/* ================================================================
   22. LA NAVEGACIÓN A LA VISTA  (FASE 23)

   El cliente pidió que el menú dejara de esconderse tras un botón: en
   escritorio las seis entradas van en una fila a la derecha del logo,
   con la misma letra que llevaban "Contacto" y "Menú" (sans, 12px,
   versalitas espaciadas) y separación uniforme, para que el visitante
   vea de un vistazo a dónde puede ir. Las tres entradas con sub-entradas
   —La firma, Servicios, Publicaciones— despliegan un panel navy bajo el
   header; Servicios, con once áreas, a dos columnas y alineado al borde
   derecho de la barra para no salirse del ancho de página.

   La barra existe desde 1024px. Por debajo no caben seis entradas
   espaciadas junto al logo sin partir la fila, así que ahí sigue el
   disparador "Menú" y el overlay de la fase 10, que no cambian: el HTML
   lleva las dos navegaciones y cada corte muestra una sola.

   El header mide lo mismo que antes (78px): los enlaces de la barra
   tienen la misma caja que tenía "Contacto", así que --altura-header y
   los heroes que dependen de ella no se mueven.
   ================================================================ */
.nav-barra{display:none}
.nav-barra-lista{list-style:none;margin:0;padding:0;display:flex;align-items:center;gap:clamp(18px,2.2vw,34px)}
.nav-barra-item{position:relative}
.nav-barra-enlace{
  position:relative;display:inline-flex;align-items:center;gap:9px;
  padding:8px 0;margin:0;background:none;border:0;cursor:pointer;
  font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;
  line-height:1.5;color:rgba(255,255,255,.78);white-space:nowrap;
  transition:color .25s ease;
}
/* El mismo subrayado de cielo que tenía "Contacto": crece al pasar el cursor y
   queda fijo en la página actual, en la rama que la contiene y en el grupo abierto. */
.nav-barra-enlace::after{
  content:"";position:absolute;left:0;right:0;bottom:4px;height:1px;
  background:var(--sky-400);transform:scaleX(0);transform-origin:left;
  transition:transform .3s var(--ease);
}
.nav-barra-item--grupo .nav-barra-enlace::after{right:18px}   /* no subraya el chevron */
.nav-barra-enlace:hover,
.nav-barra-enlace[aria-current="page"],
.nav-barra-enlace.en-rama,
.nav-barra-enlace[aria-expanded="true"]{color:#fff}
.nav-barra-enlace:hover::after,
.nav-barra-enlace[aria-current="page"]::after,
.nav-barra-enlace.en-rama::after,
.nav-barra-enlace[aria-expanded="true"]::after{transform:scaleX(1)}
.nav-barra-enlace .chev{
  width:7px;height:7px;flex:none;margin-top:-3px;
  border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;
  transform:rotate(45deg);transition:transform .3s var(--ease);opacity:.7;
}
.nav-barra-enlace[aria-expanded="true"] .chev{transform:translateY(3px) rotate(-135deg)}

/* Panel desplegable. Cuelga del enlace y baja hasta el borde inferior del header
   (22px de relleno; 12 cuando la home ya hizo scroll). Un ::before invisible
   cubre ese hueco para que el cursor pueda bajar del enlace al panel sin cerrarlo. */
.nav-barra-panel{
  position:absolute;left:50%;top:calc(100% + 22px);z-index:1;
  width:max-content;min-width:250px;padding:14px 26px 16px;
  background:rgba(8,22,39,.96);
  -webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);
  border-top:1px solid var(--sky-400);
  box-shadow:0 18px 40px rgba(0,0,0,.28);
  opacity:0;transform:translate(-50%,-6px);
  transition:opacity .22s var(--ease),transform .28s var(--ease);
}
.nav-barra-panel::before{content:"";position:absolute;left:0;right:0;bottom:100%;height:22px}
.site-header--home.scrolled .nav-barra-panel{top:calc(100% + 12px)}
.site-header--home.scrolled .nav-barra-panel::before{height:12px}
/* Cerrado quiere decir cerrado: mismo patrón que .menu-sub[hidden]. */
.nav-barra-panel[hidden]{display:none}
.nav-barra-panel.abierto{opacity:1;transform:translateX(-50%)}
.nav-barra-panel ul{list-style:none;margin:0;padding:0}
.nav-barra-panel a{
  display:block;padding:9px 0;
  font-family:var(--sans);font-size:15px;line-height:1.45;letter-spacing:0;text-transform:none;
  color:rgba(255,255,255,.78);white-space:nowrap;
  transition:color .2s ease;
}
.nav-barra-panel a:hover{color:#fff}
.nav-barra-panel a[aria-current="page"],
.nav-barra-panel a.en-rama{color:var(--sky-400)}
.nav-barra-panel a:focus-visible{outline:2px solid var(--sky-400);outline-offset:2px}
/* Cada panel va CENTRADO bajo su entrada: left:50% y translateX(-50%) —los márgenes
   auto no sirven, porque cuando el panel es más ancho que la entrada el navegador
   pone a cero el margen izquierdo en vez de repartir el sobrante—. Así cae en el mismo sitio con el logo a la vista y sin él; anclado al
   borde derecho de la barra, Servicios se abría lejos de su entrada en la portada,
   donde las entradas se reparten por todo el ancho (23-b). Servicios: once áreas
   en dos columnas. */
.nav-barra-panel--columnas{min-width:0}
/* En los extremos de la barra un panel centrado se saldría de la pantalla: el de la
   primera entrada se alinea a su borde izquierdo (en la portada arranca en el borde
   de la página) y el de la última, si algún día la hay, a su borde derecho. */
.nav-barra-item:first-child .nav-barra-panel{left:0;transform:translateY(-6px)}
.nav-barra-item:last-child .nav-barra-panel{left:auto;right:0;transform:translateY(-6px)}
.nav-barra-item:first-child .nav-barra-panel.abierto,
.nav-barra-item:last-child .nav-barra-panel.abierto{transform:none}
.nav-barra-panel--columnas ul{display:grid;grid-template-columns:repeat(2,minmax(230px,max-content));gap:0 40px}

/* De 1024px en adelante: barra a la vista y sin botón "Menú". */
@media (min-width:1024px){
  .nav-barra{display:block;margin-left:auto}
  .hdr-acciones{display:none}
}
@media (prefers-reduced-motion: reduce){
  .nav-barra-enlace,.nav-barra-enlace::after,.nav-barra-enlace .chev,.nav-barra-panel,.nav-barra-panel a{transition:none}
  .nav-barra-panel{transform:translateX(-50%)}
  .nav-barra-item:first-child .nav-barra-panel,.nav-barra-item:last-child .nav-barra-panel{transform:none}
}

/* ---- 22-b. Repartida por todo el ancho -------------------------------------
   La primera versión apilaba las seis entradas a la derecha con un hueco fijo, y
   en la portada —donde el logo pequeño está oculto— dejaba vacía toda la mitad
   izquierda. Ahora la barra ocupa todo el ancho que el logo no usa y reparte
   las entradas a espacios iguales de borde a borde (space-between): la primera
   arranca donde termina el logo y la última cierra en el borde derecho de la
   página. En la portada, mientras el logo está oculto, además no ocupa sitio
   (max-width 0 y margen que absorbe el hueco de la fila, --hueco-logo), así que las entradas
   se reparten de un extremo al otro, simétricas sobre el hero; al pasar los
   60px el logo aparece y recupera su ancho con la misma transición que su
   opacidad, y la barra se reacomoda a la derecha sin saltos. */
@media (min-width:1024px){
  /* Hueco entre el logo y la primera entrada: del orden del hueco entre entradas
     (28px a 1024, 57 a partir de 1256), para que la primera no se pegue al logo. */
  .site-header--nuevo{--hueco-logo:clamp(32px,5vw,64px)}
  .site-header--nuevo .header-in{gap:var(--hueco-logo)}
  .site-header--nuevo .logo{flex:none}
  .nav-barra{flex:1 1 auto;min-width:0;margin-left:0}
  .nav-barra-lista{justify-content:space-between;gap:18px}
  .site-header--home .logo{
    max-width:0;margin-right:calc(-1 * var(--hueco-logo));overflow:hidden;
    transition:opacity .35s var(--ease),visibility 0s linear .35s,max-width .35s var(--ease),margin-right .35s var(--ease);
  }
  .site-header--home.scrolled .logo{
    max-width:254px;margin-right:0;
    transition:opacity .35s var(--ease),visibility 0s,max-width .35s var(--ease),margin-right .35s var(--ease);
  }
}
@media (prefers-reduced-motion: reduce){
  .site-header--home .logo,.site-header--home.scrolled .logo{transition:none}
}

/* ================================================================
   23. EL BOTÓN DE WHATSAPP  (FASE 25)
   El socio director marcó WhatsApp como vía prioritaria. Hasta aquí era una
   línea de 13,5px al 45 % de blanco bajo el botón de la ficha, y un disco navy
   de 56px que aparece al dejar atrás el hero. Ninguno de los dos se retira ni
   cambia de sitio; los dos suben de peso sin salirse de la paleta: nada del
   verde de WhatsApp, que sobre el navy parecería un adhesivo pegado encima.

   23-a. Segundo botón de la ficha. Mismo ancho, altura y tipografía que
   «Escribir a la firma»; el correo conserva el relleno celeste porque es la vía
   institucional, y WhatsApp lleva borde celeste, glifo celeste y rótulo en
   blanco. Al pasar el puntero se rellena igual que el primero, así que los dos
   se leen como una pareja y no como un botón y su sombra.
   ================================================================ */
a.btn-whatsapp{
  display:flex;align-items:center;justify-content:center;gap:12px;
  box-sizing:border-box;width:100%;min-height:44px;margin-top:12px;
  /* Misma altura de línea que .btn-send y un píxel menos de padding por cada
     lado, que es lo que ocupa el borde: los dos miden exactamente lo mismo
     (56,75px a 13px) y no se nota un escalón. */
  padding:16px 20px;
  background:transparent;color:#fff;
  border:1px solid rgba(86,180,211,.55);border-radius:2px;
  font-family:var(--sans);font-size:13px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  line-height:1.75;text-decoration:none;
  transition:background .25s ease,color .25s ease,border-color .25s ease,transform .2s ease;
}
a.btn-whatsapp svg{width:20px;height:20px;flex:none;color:var(--sky-400);transition:color .25s ease}
a.btn-whatsapp:hover{
  background:var(--sky-400);border-color:var(--sky-400);color:var(--navy-950);
  transform:translateY(-2px);
}
a.btn-whatsapp:hover svg{color:var(--navy-950)}
a.btn-whatsapp:focus-visible{outline:2px solid var(--sky-400);outline-offset:4px}

/* 23-b. El flotante pasa de disco a pastilla. En reposo mide lo mismo que antes
   (56px), con el glifo en celeste sobre navy y un halo fino del mismo celeste;
   con el puntero o el foco del teclado se alarga hacia la izquierda y descubre
   el rótulo «WhatsApp», y se rellena de celeste como el resto de los botones. En
   pantallas sin puntero (hover:none) el rótulo no existe: un dedo no pasa por
   encima, y una pastilla siempre abierta taparía contenido en 375px. Sólo se
   tocan la forma y el color: la transición de visibilidad que gobierna cuándo
   aparece sigue siendo la de paginas.css, y el JS no cambia. */
.wa-flotante{
  width:auto;min-width:56px;height:56px;
  display:inline-flex;align-items:center;justify-content:center;
  padding:0 15px;
  border-radius:28px;
  background:var(--navy-900);
  border:1px solid rgba(86,180,211,.5);
  color:var(--sky-400);
  box-shadow:0 12px 32px rgba(8,22,39,.38),0 0 0 4px rgba(86,180,211,.08);
}
.wa-flotante svg{flex:none}
.wa-flotante-texto{
  display:block;max-width:0;margin-left:0;overflow:hidden;
  white-space:nowrap;opacity:0;
  font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;
  transition:max-width .35s var(--ease),margin-left .35s var(--ease),opacity .25s ease;
}
.wa-flotante:hover,
.wa-flotante:focus-visible{
  background:var(--sky-400);border-color:var(--sky-400);color:var(--navy-950);
  box-shadow:0 16px 38px rgba(8,22,39,.42),0 0 0 4px rgba(86,180,211,.14);
}
@media (hover:hover){
  .wa-flotante:hover .wa-flotante-texto,
  .wa-flotante:focus-visible .wa-flotante-texto{max-width:140px;margin-left:12px;opacity:1}
}
@media (prefers-reduced-motion: reduce){
  a.btn-whatsapp{transition:none}
  a.btn-whatsapp:hover{transform:none}
  .wa-flotante-texto{transition:none}
}

/* Versión editorial discreta, compartida por todas las páginas. */
.foot-base{align-items:center}
.foot-meta{display:flex;align-items:center;flex-wrap:wrap;gap:16px;padding-right:72px}
.site-version{
  display:inline-flex;align-items:center;white-space:nowrap;
  padding:3px 9px;border:1px solid rgba(255,255,255,.18);border-radius:999px;
  color:rgba(255,255,255,.65);background:rgba(255,255,255,.04);
  font-family:var(--sans);font-size:10px;font-weight:500;
  line-height:1.5;letter-spacing:.06em;font-variant-numeric:tabular-nums;
}

/* Aviso integral: índice navegable y lectura cómoda en cualquier pantalla. */
.privacidad-layout{display:grid;grid-template-columns:minmax(220px,1fr) minmax(0,2.3fr);gap:64px;align-items:start}
.privacidad-indice{padding:26px;background:var(--paper);border:1px solid var(--line);font-size:14px;line-height:1.6}
.privacidad-indice h2{font-family:var(--sans);font-size:13px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;margin:0 0 18px}
.privacidad-indice ol{margin:0;padding-left:22px}
.privacidad-indice li+li{margin-top:12px}
.privacidad-indice a{color:var(--navy-900);text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--line)}
.privacidad-indice a:hover{color:var(--ink);text-decoration-color:currentColor}
.privacidad-texto{max-width:72ch;overflow-wrap:anywhere}
.privacidad-intro{font-size:19px}
.privacidad-seccion{margin-top:48px}
.privacidad-texto h2{font-family:var(--serif);font-size:29px;line-height:1.25;font-weight:500;color:var(--navy-900);margin:0 0 24px;scroll-margin-top:130px}
.privacidad-texto h3{font-family:var(--sans);font-size:16px;line-height:1.5;font-weight:600;color:var(--navy-900);margin:26px 0 16px}
.privacidad-texto ul{padding-left:24px;margin:0 0 26px}
.privacidad-texto li+li{margin-top:12px}
.privacidad-texto .privacidad-seccion>div+div{margin-top:26px}
.privacidad-autorizacion{padding:24px;border-left:3px solid var(--sky-400);background:var(--paper)}
.privacidad-autorizacion h3{margin-top:0}
.privacidad-contacto{margin-top:48px;padding-top:32px;border-top:1px solid var(--line)}
@media(max-width:960px){
  .privacidad-layout{grid-template-columns:1fr;gap:40px}
  .privacidad-indice ol{columns:2;column-gap:36px}
  .privacidad-indice li{break-inside:avoid}
}
@media(max-width:560px){
  .privacidad-indice ol{columns:auto}
  .privacidad-texto h2{font-size:25px}
  .privacidad-autorizacion{padding:20px}
}
