/* WofferLab — Woffer Loop.
   Se apoya en style.css y servicios.css: aquí solo va lo propio de la
   vertical. Registro más social que el resto de páginas de servicio —
   radios mayores, más aire, gradiente de marca en los remates — sin salirse
   del sistema de escenas ni de las tipografías del sitio.

   Ojo: --accent NO se fija aquí. Lo escribe applyTheme() en js/servicios.js
   como estilo inline sobre <html>, leyendo <html data-accent>. */
:root{
  --loop-1:#22a999;
  --loop-2:#63ca6a;
  --loop-3:#ff914d;
  --loop-grad:linear-gradient(90deg,var(--loop-1),var(--loop-2));
  --loop-radius:20px;
}

/* El logo 3D por encima de la trama de semitono. Ambos viven dentro del
   .backdrop, y .sv-bg lleva z-index:1 para pisar al color sólido; sin esto el
   logo quedaría por debajo de la trama y se vería punteado. */
.backdrop__logo{z-index:2}

/* ---------- remates de marca ---------- */
.loop-grad{
  background:var(--loop-grad);
  -webkit-background-clip:text;background-clip:text;
  color:transparent;
}
/* CTA principal en el teal de la vertical. El texto va OSCURO, no blanco:
   #ffffff sobre #22a999 da 2.92:1 y no cumple AA, mientras que #0b0d11 da
   6.67:1. Es el único botón del sitio con texto oscuro y es deliberado —
   esta vertical es de marketing y el botón tiene que mandar. */
.btn:not(.btn--ghost){
  background:var(--loop-1);
  border-color:var(--loop-1);
  color:#0b0d11;
}
.btn:not(.btn--ghost):hover{
  background:var(--loop-2);
  border-color:var(--loop-2);
  box-shadow:0 14px 34px -12px rgba(34,169,153,.55);
}

/* ---------- 0 · mock de campaña ---------- */
.loop-mock__rows{display:grid;gap:14px;padding:4px 2px}
.loop-mock__row{display:grid;grid-template-columns:1fr auto;gap:6px 12px;align-items:baseline}
.loop-mock__row b{font-family:var(--font-m);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-dim);font-weight:500}
.loop-mock__row span{font-family:var(--font-d);font-weight:700;font-size:1.05rem;color:var(--ink)}
.loop-mock__bar{grid-column:1/-1;height:5px;border-radius:3px;background:var(--surface);overflow:hidden}
.loop-mock__bar i{display:block;height:100%;width:calc(var(--v)*100%);background:var(--loop-grad);border-radius:3px}
/* remate puntual en --loop-3: el indicador "en curso" del mock de campaña.
   Selector con el padre porque .sv-mock__dot i de servicios.css pinta el punto
   con var(--accent) y gana por especificidad a una clase suelta. */
.sv-mock__dot i.loop-mock__live-dot{background:var(--loop-3);box-shadow:0 0 10px var(--loop-3)}

/* ---------- 1 · enfoque ---------- */
/* Sin tope de ancho: lo llevaba de cuando todo iba apilado en una columna, y
   con la cita y las cifras enfrentadas dejaba la ficha 200px corta. Cada hijo
   controla su propia medida (la cita 22ch, los párrafos 80ch). */
.loop-focus{display:grid;gap:34px}
.loop-focus__quote{
  font-family:var(--font-d);font-weight:500;font-size:clamp(1.35rem,3vw,2.1rem);
  line-height:1.28;margin:0;padding-left:22px;border-left:3px solid transparent;
  border-image:var(--loop-grad) 1;
}
.loop-focus p{max-width:62ch;color:var(--ink-dim)}
.loop-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:16px}
.loop-stat{
  padding:22px 20px;border-radius:var(--loop-radius);background:var(--surface);
  border:1px solid var(--line);transition:transform .3s,border-color .3s;
}
.loop-stat:hover{transform:translateY(-3px);border-color:var(--loop-1)}
.loop-stats--single{grid-template-columns:minmax(min(100%,200px),300px)}
.loop-stat b{display:block;font-family:var(--font-d);font-weight:800;font-size:clamp(1.9rem,4vw,2.6rem);line-height:1}
.loop-stat span{display:block;margin-top:8px;font-size:.92rem;color:var(--ink-dim)}

/* ---------- 2 · servicios ---------- */
/* El mínimo va envuelto en min(100%, …): un minmax(300px,1fr) pelado no baja
   de 300px aunque el contenedor mida menos, y por debajo de 375px de ancho
   esta rejilla estiraba la escena entera 25px fuera de pantalla. */
.loop-svc__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));gap:18px;margin-top:34px}
.loop-svc__card{
  padding:30px 28px;border-radius:var(--loop-radius);background:var(--surface);
  border:1px solid var(--line);display:flex;flex-direction:column;gap:14px;
  transition:transform .3s,border-color .3s,box-shadow .3s;
}
.loop-svc__card:hover{transform:translateY(-4px);border-color:var(--loop-1);box-shadow:0 18px 40px rgba(34,169,153,.13)}
.loop-svc__no{font-family:var(--font-m);font-size:12px;letter-spacing:.1em;color:var(--accent)}
.loop-svc__card h3{font-family:var(--font-d);font-weight:700;font-size:1.3rem;margin:0;line-height:1.2}
.loop-svc__card>p{margin:0;color:var(--ink-dim);font-size:.96rem}
.loop-svc__list{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.loop-svc__list li{position:relative;padding-left:20px;font-size:.93rem;color:var(--ink-dim);line-height:1.5}
.loop-svc__list li::before{
  content:"";position:absolute;left:0;top:.55em;width:9px;height:9px;border-radius:50%;
  background:var(--loop-grad);
}
.loop-svc__foot{margin:0;margin-top:auto;padding-top:6px;font-size:.88rem;font-style:italic;color:var(--ink-faint)}

/* ---------- 3 · puente a WofferLab ----------
   El bloque ocupa todo el ancho de .scene__inner. Tenía un max-width:860px
   heredado de cuando el puente era una sola columna: al pasar a rejilla de
   dos, ese tope seguía ahí y estrangulaba las dos columnas contra el borde
   izquierdo, dejando un hueco muerto de 320px a la derecha. */
.loop-bridge{display:grid;gap:38px}

/* ---------- 4 · proceso ---------- */
.loop-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:18px;margin-top:30px;counter-reset:loopstep}
.loop-step{
  position:relative;overflow:hidden;
  padding:28px 24px;border-radius:var(--loop-radius);background:var(--surface);
  border:1px solid var(--line);
}
.loop-step::before{
  content:"";position:absolute;inset:0 0 auto 0;height:3px;
  background:var(--loop-grad);
}
.loop-step b{display:block;font-family:var(--font-m);font-size:12px;letter-spacing:.1em;color:var(--accent);margin-bottom:10px}
.loop-step h3{font-family:var(--font-d);font-weight:700;font-size:1.15rem;margin:0 0 8px}
.loop-step p{margin:0;color:var(--ink-dim);font-size:.94rem}

/* ---------- 5 · marcas ---------- */
.loop-brands__list{
  list-style:none;margin:28px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:10px 12px;
}
.loop-brands__list li{
  padding:10px 18px;border-radius:999px;border:1px solid var(--line);
  font-family:var(--font-d);font-weight:500;font-size:1rem;color:var(--ink-dim);
  transition:border-color .3s,color .3s;
}
.loop-brands__list li:hover{border-color:var(--loop-1);color:var(--ink)}

/* ---------- 6 · testimonios ---------- */
/* dos columnas en escritorio: con minmax(340px) caben tres y la cuarta queda huérfana; el spec §4 pide dos */
.loop-tst__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));gap:18px;margin-top:32px}
.loop-tst__card{
  padding:30px 28px;border-radius:var(--loop-radius);background:var(--surface);
  border:1px solid var(--line);display:flex;flex-direction:column;gap:18px;
}
.loop-tst__quote{margin:0;font-size:.97rem;line-height:1.62;color:var(--ink-dim)}
.loop-tst__quote p{margin:0 0 .85em}
.loop-tst__quote p:last-child{margin-bottom:0}
.loop-tst__who{margin-top:auto;display:grid;gap:2px;padding-top:4px;border-top:1px solid var(--line)}
.loop-tst__who b{font-family:var(--font-d);font-weight:700;font-size:.98rem;padding-top:14px}
.loop-tst__who span{font-size:.85rem;color:var(--ink-faint)}
.loop-tst__note{margin:18px 0 0;font-size:.84rem;color:var(--ink-faint);max-width:70ch}

/* ---------- móvil ---------- */
@media (max-width:920px){
  .loop-svc__card,.loop-tst__card{padding:24px 20px}
  .loop-focus{gap:26px}
  .loop-focus__quote{padding-left:16px}
}

/* ---------- reduced motion ---------- */
@media (prefers-reduced-motion:reduce){
  .loop-stat,.loop-svc__card,.loop-brands__list li{transition:none}
  .loop-stat:hover,.loop-svc__card:hover{transform:none}
}

/* ================================================================
   03 · PUENTE — argumento arriba, catálogo en una banda aparte
   Dos piezas apiladas en vez de dos columnas desiguales:

     [ titular + lead ][ cuatro destinos ]   <- la decisión
     [ ------- banda de capacidades ------ ]  <- el detalle

   Antes los ocho bullets colgaban de la columna del titular. Como esa
   columna medía la mitad del ancho, cada bullet partía en tres líneas y la
   columna crecía hasta casi el doble que la de destinos: quedaba un hueco
   muerto en forma de L abajo a la derecha. Sacándolos a una banda propia
   las dos columnas quedan a la par y la lista respira en cuatro carriles.

   Los bullets no son enlaces: tener unos linkados y otros no obligaba a
   adivinar cuáles llevaban a algún sitio. Los destinos son los enlaces.
   ================================================================ */
.loop-bridge__grid{display:grid;grid-template-columns:minmax(0,1.02fr) minmax(0,.98fr);gap:54px;align-items:start}
.loop-bridge__copy{display:grid;gap:20px;align-content:start}
/* display--lg (hasta 5rem) se desborda en una columna de media pantalla:
   aquí el titular convive con los destinos, no manda solo */
.loop-bridge__copy .display{font-size:clamp(1.9rem,3vw,3rem)}
/* .lead corta a 34ch en todo el sitio. Aquí ese ancho deja el párrafo en ocho
   líneas contra un titular de tres y la columna se queda flaca y alta. */
.loop-bridge__copy .lead{max-width:44ch}

/* ---- banda de capacidades ---- */
.loop-bridge__caps{
  display:grid;gap:20px;padding:30px 0 0;
  border-top:1px solid var(--line);
}
.loop-bridge__caps-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px 24px}
.loop-bridge__caps-h{
  margin:0;font-family:var(--font-m);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ink-faint);
}
.loop-bridge__list{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px 26px}
.loop-bridge__list li{position:relative;padding:0 0 0 20px;font-size:.95rem;line-height:1.5;color:var(--ink-dim)}
.loop-bridge__list li::before{content:"";position:absolute;left:0;top:.62em;width:9px;height:1px;background:var(--loop-1)}
.loop-bridge__foot{margin:0;font-size:.9rem;font-style:italic;color:var(--ink-faint)}

/* ---- destinos ---- */
.loop-bridge__dest{display:grid;gap:12px;align-content:start}
.loop-bridge__dest-h{margin:0;font-family:var(--font-m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint)}
.loop-dests{display:grid;gap:10px}
/* En fila, no en tarjeta cuadrada: a media pantalla los títulos de dos
   palabras se partían ("Departamento de / IA") y las cuatro cajas parecían
   un formulario. Como lista de cuatro entradas se leen de un vistazo. */
.loop-dest{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;
  gap:4px 20px;text-decoration:none;
  padding:16px 20px;border-radius:var(--loop-radius);
  background:var(--surface);border:1px solid var(--line);
  transition:transform .3s,border-color .3s,box-shadow .3s;
}
.loop-dest:hover{transform:translateY(-3px);border-color:var(--loop-1);box-shadow:0 18px 40px rgba(34,169,153,.13)}
.loop-dest b{grid-column:1;font-family:var(--font-d);font-weight:700;font-size:1.05rem;letter-spacing:-.02em;color:var(--ink)}
.loop-dest span{grid-column:1;font-size:.86rem;line-height:1.45;color:var(--ink-faint)}
.loop-dest em{
  grid-column:2;grid-row:1/3;align-self:center;
  font-style:normal;font-family:var(--font-m);font-size:1rem;color:var(--loop-1);
  transition:transform .3s;
}
.loop-dest:hover em{transform:translateX(4px)}
.loop-bridge__all{justify-content:center}

/* ================================================================
   04 · PROCESO — cinta que se dibuja con el scroll
   ================================================================ */
.loop-ribbon{margin:26px 0 6px}
.loop-ribbon svg{display:block;width:100%;height:auto}
.loop-ribbon__halo{opacity:.20}
.loop-ribbon__stop{fill:var(--loop-1)}
.loop-ribbon__stop:nth-of-type(2){fill:var(--loop-2)}
/* el trazo se revela con --draw, que conduce js/loop.js desde ScrollTrigger */
.loop-ribbon__line,.loop-ribbon__halo{
  stroke-dasharray:var(--len,1400);
  stroke-dashoffset:calc(var(--len,1400) * (1 - var(--draw,1)));
}
/* cada parada aparece cuando el trazo la alcanza, no todas a la vez:
   con una sola opacidad compartida el último punto flotaba por delante */
.loop-ribbon__stop{opacity:0}
.loop-ribbon__stop:nth-of-type(1){opacity:clamp(0,calc((var(--draw,1) - .04) * 12),1)}
.loop-ribbon__stop:nth-of-type(2){opacity:clamp(0,calc((var(--draw,1) - .42) * 12),1)}
.loop-ribbon__stop:nth-of-type(3){opacity:clamp(0,calc((var(--draw,1) - .80) * 12),1)}

.loop-steps{list-style:none;counter-reset:none}
.loop-step{border-top:3px solid transparent}

/* ================================================================
   05 · TRAYECTORIA — marquesina a sangre
   ================================================================ */
.loop-brands__head{display:flex;align-items:flex-end;justify-content:space-between;gap:40px;flex-wrap:wrap}
/* el titular manda pero deja sitio al dato; sin el min-width:0 el bloque de
   texto empuja la cifra a la línea siguiente y se pierde el contraste */
.loop-brands__head > :first-child{flex:1 1 58%;min-width:0}
.loop-brands__stat{flex:0 0 auto}
.loop-brands__stat{text-align:right}
.loop-brands__stat b{display:block;font-family:var(--font-d);font-weight:800;font-size:clamp(2.4rem,5vw,4.2rem);line-height:1;color:var(--accent)}
.loop-brands__stat span{display:block;margin-top:4px;font-family:var(--font-m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint)}

.loop-marquee{margin-top:34px;display:grid;gap:18px}
.loop-marquee__row{
  overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
}
.loop-marquee__track{display:flex;gap:56px;width:max-content;will-change:transform;animation:loopSlide 38s linear infinite}
.loop-marquee__row--rev .loop-marquee__track{animation-duration:46s;animation-direction:reverse}
.loop-marquee__row:hover .loop-marquee__track{animation-play-state:paused}
@keyframes loopSlide{from{transform:translateX(0)}to{transform:translateX(-50%)}}

.loop-marquee__name{
  font-family:var(--font-d);font-weight:700;letter-spacing:-.03em;
  font-size:clamp(2rem,4.4vw,3.6rem);line-height:1.1;white-space:nowrap;
  color:var(--ink);opacity:.26;transition:opacity .35s,color .35s;
}
.loop-marquee__name.is-on{opacity:1;color:var(--accent)}
.loop-marquee__row:hover .loop-marquee__name{opacity:.18}
.loop-marquee__name:hover{opacity:1;color:var(--accent)}

/* La banda de capacidades pierde carriles antes que el resto del layout:
   con cuatro columnas por debajo de 1080px cada bullet parte en cuatro
   líneas y la banda pesa más que la sección entera. */
@media (max-width:1080px){
  .loop-bridge__list{grid-template-columns:repeat(3,minmax(0,1fr))}
}

@media (max-width:920px){
  .loop-bridge__grid{grid-template-columns:1fr;gap:34px}
  .loop-bridge__list{grid-template-columns:repeat(2,minmax(0,1fr))}
  .loop-brands__head{align-items:flex-start}
  .loop-brands__stat{text-align:left}

  /* La marquesina sigue corriendo en móvil: es el único efecto de la página que
     se mantiene ahí, y la sección se queda sin nada sin él.

     Pero más despacio. El carril mide lo que mide su contenido, no el viewport,
     así que un recorrido del 50% en 38s avanza los mismos píxeles por segundo en
     un móvil que en un portátil — sólo que en 375px de ancho cada nombre cruza
     la pantalla casi cuatro veces antes y se lee a la carrera. Compensarlo del
     todo pediría más de dos minutos por vuelta, que ya parece parada; a 56s el
     paso se sigue notando y da tiempo a leer. */
  .loop-marquee__track{animation-duration:56s}
  .loop-marquee__row--rev .loop-marquee__track{animation-duration:68s}
  .loop-marquee__name{font-size:1.75rem}
}

/* En móvil todo .act--flow mide como mínimo una pantalla (style.css:623), lo
   que da el ritmo de escenas. Trayectoria es la excepción: son un titular,
   una cifra y dos filas de marquesina —229px de contenido— dentro de 844px,
   así que quedaban dos pantallas casi vacías seguidas entre el proceso y los
   testimonios. Aquí la escena mide lo que ocupa. */
@media (max-width:920px){
  .loop-brands-act{min-height:0}
}

@media (max-width:560px){
  .loop-bridge__list{grid-template-columns:1fr}
  .loop-bridge__caps{padding-top:24px}
  .loop-dest{padding:15px 17px;gap:4px 14px}
}

@media (prefers-reduced-motion:reduce){
  .loop-ribbon__stop,.loop-ribbon__stop:nth-of-type(1),.loop-ribbon__stop:nth-of-type(2),.loop-ribbon__stop:nth-of-type(3){opacity:1}
  .loop-marquee__track{animation:none}
  .loop-dest{transition:none}
  .loop-dest:hover{transform:none}
  .loop-ribbon__line,.loop-ribbon__halo{stroke-dashoffset:0}
  .loop-ribbon__stop{opacity:1}
}

/* ================================================================
   01 · ENFOQUE — la cita rompe el margen izquierdo
   El resto de la página vive dentro de .scene__inner (1180 px máx.).
   La cita se sale de esa caja para que el ojo note el cambio de escala
   sin necesidad de subir el cuerpo de texto.
   ================================================================ */
.loop-focus__quote{
  font-size:clamp(1.5rem,3.4vw,2.9rem);
  margin-left:calc(var(--pad) * -1);
  padding-left:calc(var(--pad) - 3px);
  max-width:22ch;
}
.loop-focus__cols{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px 46px;max-width:80ch}
.loop-focus__cols p{margin:0;color:var(--ink-dim)}

/* La cita a la izquierda, las cifras a su derecha. La cita corta a 22ch, así
   que la mitad derecha de la escena quedaba en blanco de arriba abajo; las
   cifras estaban debajo, en fila, y arrastraban el mismo hueco. */
.loop-focus__top{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,.8fr);gap:0 64px;align-items:start}
.loop-focus__creds{display:grid;gap:10px;align-content:start;padding-top:8px}
.loop-focus__creds-h{
  margin:0;font-family:var(--font-m);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ink-faint);
}

/* Ficha, no tres tarjetas. En caja, "+15 años" y "+15 países" quedaban una al
   lado de la otra y el número repetido se leía como una errata; en columna y
   con filete se leen como lo que son, tres credenciales de una lista. */
.loop-stats--stack{grid-template-columns:1fr;gap:0}
.loop-stats--stack .loop-stat{
  background:none;border:0;border-radius:0;padding:16px 0 14px;
  border-top:1px solid var(--line);
  display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline;gap:0 18px;
}
.loop-stats--stack .loop-stat:hover{transform:none}
.loop-stats--stack .loop-stat b{font-size:clamp(1.9rem,3vw,2.7rem);line-height:1;color:var(--accent)}
.loop-stats--stack .loop-stat span{
  margin-top:0;font-family:var(--font-m);font-size:11px;line-height:1.5;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);
}

@media (max-width:920px){
  .loop-focus__quote{margin-left:0;padding-left:16px;max-width:none}
  .loop-focus__top{grid-template-columns:1fr;gap:32px}
  .loop-focus__cols{grid-template-columns:1fr}
}

/* ================================================================
   02 · SERVICIOS — carril horizontal
   El carril vive FUERA de .scene__inner: así su ancho es el de la sección
   y no el de la caja de contenido, y las tarjetas entran desde el borde de
   la pantalla en vez de desde el margen del texto.

   Sin JS, en móvil o con reduced-motion la clase .is-rail no se pone y esto
   queda como la rejilla de tarjetas de siempre.
   ================================================================ */
.loop-rail{width:100%;max-width:1180px;margin:0 auto;padding:0 var(--pad);box-sizing:border-box}

.loop-rail__cue{
  display:none;margin:14px 0 0;align-items:center;gap:10px;
  font-family:var(--font-m);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ink-faint);
}
.loop-rail__cue i{display:block;width:46px;height:1px;background:currentColor;position:relative;opacity:.5}
.loop-rail__cue i::after{
  content:"";position:absolute;top:-2px;right:0;width:5px;height:5px;
  border-top:1px solid currentColor;border-right:1px solid currentColor;transform:rotate(45deg);
}
.loop-rail-act.is-rail .loop-rail__cue{display:flex}

.loop-rail-act.is-rail .loop-rail{
  max-width:none;margin:38px 0 0;padding:0 0 0 var(--pad);
  /* recorta el carril para que no genere scroll horizontal en el documento */
  overflow:hidden;
}
.loop-rail-act.is-rail .loop-svc__grid{
  display:flex;gap:22px;width:max-content;will-change:transform;
}
/* anchas a propósito: con tarjetas de 380 px las cuatro caben en un monitor
   de 1920 y no habría nada que desplazar. Además el contenido de cada
   servicio respira, que era la otra queja de la sección. */
.loop-rail-act.is-rail .loop-svc__card{width:clamp(340px,33vw,540px);flex:0 0 auto;margin:0}

@media (prefers-reduced-motion:reduce){
  .loop-rail-act.is-rail .loop-svc__grid{transform:none !important}
}

/* Al fijar la sección, todo tiene que caber en una pantalla: medido en un
   viewport de 889 px, la suma daba 1222 y las tarjetas se cortaban por abajo.
   Se recorta en los tres sitios que sobran — relleno, titular y tarjeta — en
   vez de encoger solo uno hasta deformarlo. */
/* la sección deja de centrar y de rellenar: quien ocupa la pantalla y se fija
   es el envoltorio, para que la posición natural de la sección —y con ella el
   disparador de tema de servicios.js— siga siendo la de siempre */
.loop-rail-act.is-rail{display:block;padding:0;min-height:0}
.loop-rail-act.is-rail .loop-rail-pin{
  min-height:100vh;display:flex;flex-direction:column;
  justify-content:center;align-items:center;   /* align-items: .scene__inner
    tiene max-width 1180 y, sin centrar, el envoltorio flex lo pegaba a la
    izquierda — el centrado se lo daba .act, que aquí ya no lo envuelve */
  min-height:100svh;
  padding:clamp(28px,5vh,64px) 0 clamp(20px,3vh,48px);
}
.loop-rail-act.is-rail .display{font-size:clamp(1.8rem,3.4vw,3.3rem)}
.loop-rail-act.is-rail .loop-svc__card{padding:24px 26px;gap:11px}
.loop-rail-act.is-rail .loop-svc__card h3{font-size:1.15rem}
.loop-rail-act.is-rail .loop-svc__card > p{font-size:.9rem}
.loop-rail-act.is-rail .loop-svc__list{gap:7px}
.loop-rail-act.is-rail .loop-svc__list li{font-size:.86rem;line-height:1.42}
.loop-rail-act.is-rail .loop-svc__foot{font-size:.82rem}
/* pantallas bajas (≤820): a 1280×720 y 1024×768 el pin medía 752/783 px */
@media (max-height:820px){
  .loop-rail-act.is-rail .display{font-size:clamp(1.6rem,min(3.4vw,5vh),3.3rem)}
  .loop-rail-act.is-rail .loop-rail{margin-top:clamp(18px,3vh,38px)}
  .loop-rail-act.is-rail .loop-svc__card{padding:18px 20px;gap:9px;width:clamp(340px,36vw,540px)}
  .loop-rail-act.is-rail .loop-svc__list li{font-size:.82rem;line-height:1.38}
}

/* ---- proceso: pill "vuelta a empezar" (bucle) + nota ---- */
.loop-loopback{
  display:inline-flex;align-items:center;gap:10px;margin-top:24px;
  font-family:var(--font-m);font-size:12px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--accent);background:rgba(34,169,153,.14);
  border:1px solid rgba(34,169,153,.34);border-radius:99px;padding:9px 18px;
}
.loop-loopback span[aria-hidden]{font-size:15px;line-height:1}
.loop-hownote{
  margin-top:14px;font-family:var(--font-m);font-size:11px;letter-spacing:.03em;color:var(--ink-faint);
}

/* ---- hero: sobretítulo SEO dentro del H1 ---- */
.loop-hero__over{
  display:block;font-family:var(--font-m);font-weight:500;font-size:clamp(11px,1.3vw,13px);
  letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:16px;
}

/* ---- punto de partida (problema) ---- */
.loop-start{display:flex;flex-direction:column;gap:clamp(22px,3.2vh,34px);width:100%;max-width:74rem}
.loop-start__sub{margin-top:16px;font-family:var(--font-d);font-weight:600;color:var(--ink);max-width:52ch}
.loop-start__pains{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:15px 40px}
.loop-start__pains li{position:relative;padding-left:26px;color:var(--ink-dim);line-height:1.55}
.loop-start__pains li::before{content:"";position:absolute;left:0;top:.55em;width:15px;height:3px;border-radius:2px;background:var(--loop-1)}
.loop-start__badge{
  border:1px solid rgba(34,169,153,.34);background:rgba(34,169,153,.10);border-radius:var(--loop-radius);
  padding:18px 22px;color:var(--accent);font-family:var(--font-d);font-weight:600;line-height:1.35;
  font-size:clamp(1.02rem,1.5vw,1.28rem);max-width:64ch;
}
@media(max-width:760px){ .loop-start__pains{grid-template-columns:1fr} }

/* ---- contacto (cierre) ---- */
.loop-contact{
  display:flex;flex-wrap:wrap;justify-content:center;gap:clamp(20px,3vw,44px);margin-top:30px;
}
.loop-contact__item{display:flex;flex-direction:column;gap:6px;align-items:center}
.loop-contact__l{font-family:var(--font-m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
.loop-contact__item a{font-family:var(--font-b);font-size:1.02rem;color:var(--ink);text-decoration:none}
.loop-contact__item a:hover{color:var(--accent)}
