/* =========================================================
   OSCAR GARAY — DARK PREMIUM TECH
   Tokens
   ========================================================= */
:root{
  --bg:            #080C14;
  --bg-surface:    #0D1420;
  --bg-surface-2:  #111A28;
  --border:        rgba(248,250,252,0.08);
  --border-strong: rgba(248,250,252,0.14);

  --cyan:          #00D4FF;
  --cyan-dim:      rgba(0,212,255,0.12);
  --gold:          #D4AF37;
  --gold-dim:      rgba(212,175,55,0.12);

  --text:          #F8FAFC;
  --text-muted:    #8B96A8;
  --text-faint:    #566072;

  --font-headline: 'Anton', sans-serif;
  --font-body:     'General Sans', sans-serif;
  --font-mono:     'JetBrains Mono', monospace;

  /* spacing scale — every padding/margin/gap in this file resolves
     to one of these. Pick the nearest step, don't introduce a raw
     px value for a one-off case. */
  --space-1:   4px;
  --space-2:   8px;
  --space-3:  12px;
  --space-4:  16px;
  --space-5:  20px;
  --space-6:  24px;
  --space-7:  32px;
  --space-8:  40px;
  --space-9:  48px;
  --space-10: 64px;
  --space-11: 88px;
  --space-12: 96px;
  --space-13: 120px;
  --space-14: 150px;

  --max-w:         1240px;
  --radius:        14px;
  --radius-sm:     8px;

  --ease:          cubic-bezier(.16,.84,.44,1);
}

*,*::before,*::after{ box-sizing:border-box; }
/* overflow-x:hidden belongs on both html and body as a hard backstop —
   some browsers only honor it on one or the other depending on quirks
   mode / scroll-anchoring behavior. This is a safeguard on top of (not
   instead of) actually containing runaway content, see .hero-portrait
   and js/portrait.js for the real fix to the mobile scroll bug. */
html{ scroll-behavior:smooth; overflow-x:hidden; }

@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior:auto; }
  *,*::before,*::after{ animation-duration:0.01ms !important; animation-iteration-count:1 !important; transition-duration:0.01ms !important; }
}

body{
  margin:0;
  background:var(--bg);
  color:var(--text);
  font-family:var(--font-body);
  font-size:16px;
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}

h1,h2,h3,h4{
  font-family:var(--font-body);
  margin:0;
  font-weight:600;
  letter-spacing:-0.02em;
}

p{ margin:0; }
a{ color:inherit; text-decoration:none; }
ul{ list-style:none; margin:0; padding:0; }
button{ font-family:inherit; cursor:pointer; }

::selection{ background:var(--cyan); color:var(--bg); }

:focus-visible{
  outline:2px solid var(--cyan);
  outline-offset:3px;
  border-radius:4px;
}

/* =========================================================
   CUSTOM CURSOR — desktop/mouse only, JS adds .cursor-active
   to <html> once it confirms (hover:hover) and (pointer:fine)
   ========================================================= */
.cursor-dot, .cursor-ring{
  position:fixed; top:0; left:0; pointer-events:none; z-index:9999;
  border-radius:50%; transform:translate(-50%,-50%);
  opacity:0;
}
.cursor-dot{ width:6px; height:6px; background:var(--cyan); }
.cursor-ring{
  width:34px; height:34px; border:1px solid var(--cyan);
  transition:width .2s var(--ease), height .2s var(--ease), border-color .2s var(--ease), background .2s var(--ease);
}
.cursor-ring.is-hovering{ width:56px; height:56px; background:var(--cyan-dim); border-color:var(--text); }

html.cursor-active{ cursor:none; }
html.cursor-active a, html.cursor-active button, html.cursor-active summary{ cursor:none; }
html.cursor-active .cursor-dot, html.cursor-active .cursor-ring{ opacity:1; }
/* text inputs keep a normal caret — custom cursor is for pointer navigation, not typing */
input, textarea, select{ cursor:auto; }

/* =========================================================
   BACKGROUND — circuit grid + glow (CSS only, no images)
   ========================================================= */
.bg-grid{
  position:fixed; inset:0; z-index:0; pointer-events:none;
  background-image:
    linear-gradient(var(--border) 1px, transparent 1px),
    linear-gradient(90deg, var(--border) 1px, transparent 1px);
  background-size:64px 64px;
  mask-image: radial-gradient(ellipse 80% 60% at 50% 0%, black 20%, transparent 75%);
  opacity:0.5;
}

.bg-glow{
  position:fixed; inset:0; z-index:0; pointer-events:none;
  background:
    radial-gradient(600px 400px at 12% 8%, var(--cyan-dim), transparent 60%),
    radial-gradient(500px 380px at 92% 18%, var(--gold-dim), transparent 60%);
}

main, header, footer{ position:relative; z-index:1; }

/* =========================================================
   NAV
   ========================================================= */
.nav{
  position:sticky; top:0; z-index:50;
  backdrop-filter:blur(14px);
  -webkit-backdrop-filter:blur(14px);
  background:rgba(8,12,20,0.72);
  border-bottom:1px solid var(--border);
}

.nav-inner{
  max-width:var(--max-w);
  margin:0 auto;
  padding:var(--space-4) var(--space-7);
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-6);
}

.nav-logo{
  display:flex; align-items:center; gap:var(--space-2);
}
.nav-logo-mark{
  width:34px; height:34px;
  display:flex; align-items:center; justify-content:center;
  font-family:var(--font-mono); font-weight:600; font-size:13px;
  border:1px solid var(--cyan); border-radius:8px;
  color:var(--cyan);
  background:var(--cyan-dim);
}
.nav-logo-text{
  font-family:var(--font-body); font-weight:600; font-size:15px;
  letter-spacing:-0.01em;
}

.nav-links{
  display:flex; gap:var(--space-2);
}
.nav-link{
  font-size:14px; color:var(--text-muted);
  padding:var(--space-2) var(--space-3); border-radius:8px;
  transition:color .2s var(--ease), background .2s var(--ease);
}
.nav-link:hover{ color:var(--text); background:rgba(248,250,252,0.04); }
.nav-link.is-active{ color:var(--cyan); }

.nav-actions{ display:flex; align-items:center; gap:var(--space-4); }

.lang-toggle{
  background:none; border:1px solid var(--border-strong); border-radius:20px;
  padding:var(--space-1) var(--space-3); font-family:var(--font-mono); font-size:12px;
  color:var(--text-muted); display:flex; align-items:center; gap:var(--space-1);
}
.lang-toggle .is-active{ color:var(--cyan); }
.lang-sep{ opacity:.4; }

.nav-burger{
  display:none; background:none; border:none;
  width:32px; height:24px; position:relative;
}
.nav-burger span{
  position:absolute; left:0; width:100%; height:1.5px; background:var(--text);
  transition:transform .25s var(--ease), opacity .25s var(--ease);
}
.nav-burger span:nth-child(1){ top:0; }
.nav-burger span:nth-child(2){ top:11px; }
.nav-burger span:nth-child(3){ top:22px; }

/* =========================================================
   BUTTONS
   ========================================================= */
.btn{
  display:inline-flex; align-items:center; gap:var(--space-2);
  font-family:var(--font-body); font-weight:600; font-size:14px;
  padding:var(--space-3) var(--space-5); border-radius:10px;
  border:1px solid transparent;
  transition:transform .2s var(--ease), background .2s var(--ease), border-color .2s var(--ease), box-shadow .2s var(--ease);
  white-space:nowrap;
}
.btn svg{ transition:transform .2s var(--ease); }
.btn:hover svg{ transform:translateX(3px); }

.btn-primary{
  background:var(--cyan); color:#03131A;
  box-shadow:0 0 0 0 rgba(0,212,255,0.4);
}
.btn-primary:hover{ box-shadow:0 0 24px 0 rgba(0,212,255,0.35); transform:translateY(-1px); }

.btn-outline{
  border-color:var(--border-strong); color:var(--text);
}
.btn-outline:hover{ border-color:var(--cyan); color:var(--cyan); }

.btn-ghost{
  color:var(--text); font-size:13px; padding:var(--space-2) var(--space-4);
  border:1px solid var(--border-strong);
}
.btn-ghost:hover{ border-color:var(--gold); color:var(--gold); }

.btn-lg{ padding:var(--space-4) var(--space-7); font-size:15px; }

/* =========================================================
   TYPO UTILITIES
   ========================================================= */
.eyebrow{
  font-family:var(--font-body); font-size:11px; letter-spacing:0.06em;
  color:var(--cyan); display:flex; align-items:center; gap:var(--space-2);
  margin-bottom:var(--space-5); text-transform:uppercase;
}
.eyebrow-dot{
  width:6px; height:6px; border-radius:50%; background:var(--cyan);
  box-shadow:0 0 8px 1px var(--cyan);
  animation:pulse 2s ease-in-out infinite;
}
@keyframes pulse{ 0%,100%{ opacity:1; } 50%{ opacity:.35; } }

/* =========================================================
   HERO
   ========================================================= */
.hero{
  max-width:var(--max-w);
  margin:0 auto;
  padding:var(--space-7) var(--space-7) var(--space-6);
  min-height:calc(100vh - 68px);
  display:flex; flex-direction:column; justify-content:safe center;
}

.hero-inner{
  display:grid;
  grid-template-columns:1.05fr 0.95fr;
  gap:var(--space-10);
  align-items:start;
}
/* Grid items default to min-width:auto, which means a track can never
   shrink below its content's min-content size — so a wide unshrinkable
   row inside .hero-copy (e.g. .hero-metrics with several unwrapped
   columns) can force this column past its 1.05fr share, starving
   .hero-portrait's 0.95fr share down to a sliver. min-width:0 lets the
   fr proportions actually hold regardless of content width; see the
   matching minmax(0,1fr) fix on .hero-metrics below, which is what
   lets the metrics row itself compress into whatever width this
   column ends up with instead of overflowing it. */
.hero-copy{ min-width:0; }

/* ---- dot-portrait: floats in the hero's right column, no card/border ---- */
.hero-portrait{
  position:relative;
  width:100%;
  max-width:100%;
  aspect-ratio:5 / 6;
  max-height:72vh;
  border-radius:var(--radius);
  overflow:hidden;
}
.hero-portrait canvas{
  position:absolute; inset:0;
  width:100%; height:100%;
  display:block;
}

/* Fluid clamp, width-only (no vh term — see below), calibrated so the
   PREFERRED branch is what's actually rendering at every width from
   320 to 1920px: it hits MIN exactly at 320px and MAX exactly at
   1920px, linear in between. A clamp with a vh or a loose vw
   coefficient looks "stuck" for a wide range and then "jumps" once
   the preferred value crosses the min/max boundary — the fix isn't a
   better number, it's making sure the boundaries only bind at the
   two true endpoints instead of a wide chunk of common viewport
   widths (real bug: previously flat from ~1450px all the way to
   1920px — every laptop/desktop width in between rendered the exact
   same title size).
   slope = (MAXpx - MINpx) / (1920 - 320), intercept = MIN - slope*320
   MIN=2.6rem(41.6px), MAX=3.7rem(59.2px). MAX is not decorative, it's
   the real ceiling: .hero-copy caps at 584px past --max-w, and above
   ~62px "while you don't have to." wraps onto an extra line (measured
   with canvas.measureText(), see CONTEXT.md) — do not raise it without
   re-measuring that phrase.

   MIN was raised from 2.2rem to 2.6rem in the mobile-dominance pass
   (sesión 6). At this MIN, each of the 3 phrases below no longer
   reliably fits on one line under ~430px viewports (measured against
   a hidden nowrap clone of each phrase, not the live span's own
   getBoundingClientRect() — a wrapped inline span's box is bounded by
   its container by definition, so that measurement can never detect
   its own wrapping). That's an intentional trade: forcing every
   phrase onto a single line capped MIN at ~35px, barely bigger than
   before and not what "the title must always read as dominant" asked
   for. text-wrap:balance (below) is what makes wrapping-when-needed
   look intentional instead of ragged — without it the browser's
   default greedy wrap left a lone orphan word on the last line ("while
   you don't have" / "to."); with it, wrapped phrases split into even,
   readable halves. */
.hero-title{
  font-family:var(--font-headline);
  text-transform:uppercase;
  font-weight:400;
  font-size:clamp(2.6rem, 2.38rem + 1.1vw, 3.7rem);
  line-height:0.98;
  letter-spacing:-0.01em;
  color:var(--text);
}
/* text-wrap:balance only takes effect on a block-level (or
   inline-block) box — plain inline spans ignore it. inline-block here
   doesn't change desktop rendering (each phrase already fits on one
   line there, so there's nothing to balance) and doesn't disturb the
   <br>-driven stacking between phrases. */
.hero-title > span{
  display:inline-block;
  max-width:100%;
  text-wrap:balance;
}
.hero-title-accent{
  color:var(--cyan);
}
/* Spanish phrases run longer than their English source ("mientras tú
   no tienes que hacerlo." is the longest, not the one that looks
   worst at a glance — measured, not eyeballed) — same fluid-clamp
   method, MIN=1.85rem/MAX=2.55rem at the same 320/1920 endpoints,
   raised from 1.55rem alongside the EN MIN above, same wrap-when-
   needed-but-balanced trade-off. */
[data-lang="es"] .hero-title{
  font-size:clamp(1.85rem, 1.71rem + 0.7vw, 2.55rem);
}

.hero-sub{
  margin-top:var(--space-6); max-width:52ch;
  font-size:17px; color:var(--text-muted); line-height:1.65;
}

.hero-actions{
  display:flex; gap:var(--space-3); margin-top:var(--space-6); flex-wrap:wrap;
}

/* ---- stack marquee: infinite horizontal ticker, not static pills ----
   .marquee-track holds two identical .marquee-group children back to
   back; animating translateX(-50%) moves exactly one group-width, so
   the moment the first group scrolls fully off, the second is sitting
   exactly where the first started — a seamless loop, standard CSS
   marquee technique. The second group is aria-hidden (screen readers
   only need the tool list once); both get data-i18n so the ES/EN
   toggle updates both copies identically, no JS changes needed. */
.hero-tags-marquee{
  margin-top:var(--space-7);
  overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg, transparent, black 6%, black 94%, transparent);
  mask-image:linear-gradient(90deg, transparent, black 6%, black 94%, transparent);
}
.marquee-track{
  display:flex; width:max-content;
  animation:marquee-scroll 26s linear infinite;
}
.hero-tags-marquee:hover .marquee-track{ animation-play-state:paused; }
.marquee-group{
  display:flex; align-items:center; flex-shrink:0;
  gap:var(--space-4);
  padding-right:var(--space-4);
}
@keyframes marquee-scroll{
  from{ transform:translateX(0); }
  to{ transform:translateX(-50%); }
}
.tag{
  font-family:var(--font-mono); font-size:12px; letter-spacing:.04em;
  color:var(--text-faint); white-space:nowrap;
  transition:color .2s var(--ease);
}
.hero-tags-marquee:hover .tag{ color:var(--text-muted); }
.tag-sep{
  color:rgba(0,212,255,0.4); font-size:9px;
  display:inline-flex; align-items:center;
}

/* prefers-reduced-motion: no loop — freeze at the natural (untranslated)
   position, hide the aria-hidden duplicate entirely so it doesn't just
   sit there duplicated, and let the single real row wrap like a normal
   static list instead of forcing the marquee's single-line max-content
   width (which would overflow narrow viewports with nothing to scroll
   it back into view). */
@media (prefers-reduced-motion: reduce){
  .hero-tags-marquee{ overflow:visible; -webkit-mask-image:none; mask-image:none; }
  .marquee-track{ animation:none; transform:none; width:auto; flex-wrap:wrap; }
  .marquee-group{ flex-wrap:wrap; }
  .marquee-group[aria-hidden="true"]{ display:none; }
  .marquee-group:not([aria-hidden]) .tag-sep:last-child{ display:none; }
}

.hero-scroll{
  display:flex; flex-direction:column; align-items:center; gap:var(--space-2);
  margin:var(--space-6) auto 0; width:fit-content;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.15em;
  color:var(--text-faint);
}
.scroll-line{
  width:1px; height:34px;
  background:linear-gradient(var(--cyan), transparent);
}

/* ---- hero metrics row: floats directly on the hero background, no panel ---- */
.hero-metrics{
  display:grid; grid-template-columns:repeat(4, minmax(0, 1fr));
  gap:var(--space-6) var(--space-6);
  margin-top:var(--space-7);
}
/* container-type lets .metric-value size itself off THIS cell's real
   width (cqi below), not the viewport — the grid gives each .metric a
   different width depending on column count and how much the desktop
   two-column hero-inner split has squeezed .hero-copy, and neither of
   those tracks any viewport breakpoint 1:1 */
.metric{ display:flex; flex-direction:column; gap:var(--space-1); container-type:inline-size; }
.metric-label{
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.06em; color:var(--text-faint);
}
/* white-space:nowrap is the actual fix for the bug (a number and its
   unit suffix — "100"+"%", "24H"+"/7D" — separating onto two lines at
   in-between desktop widths that don't match any breakpoint): flex's
   own default is already nowrap for the *items*, but without this the
   TEXT inside a shrinking .odo-static suffix span can still reflow
   internally once the cell gets narrower than its content. The cqi
   clamp is what makes that safe to enforce — it shrinks the font to
   the cell's real width instead of letting nowrap content overflow. */
.metric-value{
  font-family:var(--font-body); font-weight:600;
  font-size:clamp(16px, 22cqi, 34px); color:var(--text);
  display:inline-flex; align-items:baseline; white-space:nowrap;
}
/* odometer: slot-machine digit strips, see js/main.js runOdometers() */
.odo-digit{
  display:inline-block; overflow:hidden; height:1em; position:relative;
  width:0.62em; text-align:center; vertical-align:bottom;
}
.odo-strip{ position:absolute; left:0; top:0; width:100%; }
.odo-strip span{ display:block; height:1em; line-height:1; }
.odo-static{ display:inline-block; }
/* letters/% inside a data-target ("24H/7D", "100%") read as unit
   suffixes and get the accent color — set in buildOdometer(), see
   js/main.js. Punctuation like "/" is left the default text color. */
.odo-suffix{ color:var(--cyan); }

/* =========================================================
   FACTS STRIP
   ========================================================= */
.facts{
  border-top:1px solid var(--border); border-bottom:1px solid var(--border);
  background:var(--bg-surface);
}
.facts-inner{
  max-width:var(--max-w); margin:0 auto; padding:var(--space-9) var(--space-7);
  display:grid; grid-template-columns:repeat(3,1fr); gap:var(--space-8);
}
.fact{ display:flex; flex-direction:column; gap:var(--space-3); }
.fact-index{
  font-family:var(--font-mono); font-size:12px; color:var(--gold);
}
.fact-text{ font-size:14.5px; color:var(--text-muted); line-height:1.6; }

/* =========================================================
   SERVICES TEASER
   ========================================================= */
.services-teaser{
  max-width:var(--max-w); margin:0 auto; padding:var(--space-13) var(--space-7);
}
.section-head{ max-width:640px; margin-bottom:var(--space-9); }
.section-title{
  font-size:clamp(1.7rem, 3vw, 2.3rem); line-height:1.2;
}

.services-grid{
  display:grid; grid-template-columns:repeat(4,1fr); gap:var(--space-5);
}
.service-card{
  background:var(--bg-surface); border:1px solid var(--border); border-radius:var(--radius);
  padding:var(--space-6) var(--space-5); display:flex; flex-direction:column; gap:var(--space-3);
  transition:border-color .25s var(--ease), transform .25s var(--ease), background .25s var(--ease);
}
.service-card:hover{
  border-color:var(--cyan); transform:translateY(-4px);
  background:var(--bg-surface-2);
}
.service-card-top{
  display:flex; align-items:center; justify-content:space-between;
}
.service-num{
  font-family:var(--font-mono); font-size:12px; color:var(--text-faint);
}
.service-price{
  font-family:var(--font-mono); font-size:12px; color:var(--gold);
}
.service-card h3{
  font-size:17px; font-weight:600; line-height:1.3;
}
.service-card p{
  font-size:13.5px; color:var(--text-muted); line-height:1.6;
}

.services-teaser-cta{
  margin-top:var(--space-8); display:flex; justify-content:center;
}

/* =========================================================
   FINAL CTA
   ========================================================= */
.final-cta{
  border-top:1px solid var(--border);
  background:
    radial-gradient(700px 300px at 50% 0%, var(--cyan-dim), transparent 70%),
    var(--bg-surface);
}
.final-cta-inner{
  max-width:680px; margin:0 auto; padding:var(--space-13) var(--space-7);
  text-align:center; display:flex; flex-direction:column; align-items:center;
}
.final-cta-inner .eyebrow{ justify-content:center; }
.final-cta-inner h2{
  font-size:clamp(1.8rem, 3.6vw, 2.6rem); margin-bottom:var(--space-4);
}
.final-cta-sub{
  color:var(--text-muted); font-size:15.5px; margin-bottom:var(--space-7);
}

/* =========================================================
   PAGE HEADER (services / other inner pages)
   ========================================================= */
.page-header{
  max-width:var(--max-w); margin:0 auto;
  padding:var(--space-14) var(--space-7) var(--space-10);
}
.page-header-inner{ max-width:680px; }
.page-title{
  font-size:clamp(2rem, 3.8vw, 3rem); line-height:1.15;
  color:var(--text); margin-bottom:var(--space-5);
}
.page-sub{
  font-size:16.5px; color:var(--text-muted); line-height:1.65; max-width:58ch;
}

/* =========================================================
   SERVICES DETAIL
   ========================================================= */
.services-detail{
  max-width:var(--max-w); margin:0 auto; padding:0 var(--space-7) var(--space-11);
  display:flex; flex-direction:column; gap:var(--space-5);
}
.service-detail{
  background:var(--bg-surface); border:1px solid var(--border); border-radius:var(--radius);
  padding:var(--space-7);
  display:grid; grid-template-columns:1fr 240px; gap:var(--space-8);
  transition:border-color .25s var(--ease);
}
.service-detail:hover{ border-color:var(--border-strong); }

.service-detail-head{
  display:flex; align-items:baseline; gap:var(--space-4); margin-bottom:var(--space-4);
}
.service-detail-head h2{
  font-size:22px; font-weight:600;
}
.service-detail-desc{
  font-size:15px; color:var(--text-muted); line-height:1.7; margin-bottom:var(--space-5); max-width:60ch;
}
.service-detail-list{
  display:flex; flex-direction:column; gap:var(--space-2);
}
.service-detail-list li{
  position:relative; padding-left:var(--space-6);
  font-size:14px; color:var(--text-muted); line-height:1.55;
}
.service-detail-list li::before{
  content:"";
  position:absolute; left:0; top:7px;
  width:8px; height:8px; border-radius:2px;
  background:var(--cyan-dim); border:1px solid var(--cyan);
}

.service-detail-meta{
  border-left:1px solid var(--border);
  padding-left:var(--space-7);
  display:flex; flex-direction:column; gap:var(--space-5);
}
.meta-row{ display:flex; flex-direction:column; gap:var(--space-1); }
.meta-label{
  font-family:var(--font-mono); font-size:10.5px; letter-spacing:.08em; color:var(--text-faint);
}
.meta-value{ font-family:var(--font-body); font-size:17px; font-weight:600; color:var(--text); }
.meta-value.price{ color:var(--gold); }
.meta-tags{ display:flex; flex-wrap:wrap; gap:var(--space-2); }

/* =========================================================
   PROCESS
   ========================================================= */
.process{
  max-width:var(--max-w); margin:0 auto; padding:var(--space-11) var(--space-7);
  border-top:1px solid var(--border);
}
.process-grid{
  display:grid; grid-template-columns:repeat(4,1fr); gap:var(--space-6);
}
.process-step{
  display:flex; flex-direction:column; gap:var(--space-2);
  padding-top:var(--space-5); border-top:1px solid var(--border-strong);
}
.process-num{
  font-family:var(--font-mono); font-size:13px; color:var(--gold);
}
.process-step h3{ font-size:16px; font-weight:600; }
.process-step p{ font-size:13.5px; color:var(--text-muted); line-height:1.6; }

/* =========================================================
   FAQ
   ========================================================= */
.faq{
  max-width:820px; margin:0 auto; padding:0 var(--space-7) var(--space-12);
}
.faq-list{
  display:flex; flex-direction:column; gap:var(--space-3);
}
.faq-item{
  background:var(--bg-surface); border:1px solid var(--border); border-radius:var(--radius-sm);
  padding:var(--space-4) var(--space-5);
}
.faq-item summary{
  font-family:var(--font-body); font-size:15px; font-weight:600; color:var(--text);
  cursor:pointer; list-style:none; display:flex; align-items:center; justify-content:space-between;
  gap:var(--space-4);
}
.faq-item summary::-webkit-details-marker{ display:none; }
.faq-item summary::after{
  content:"+";
  font-family:var(--font-mono); font-size:18px; color:var(--cyan); flex-shrink:0;
  transition:transform .2s var(--ease);
}
.faq-item[open] summary::after{ transform:rotate(45deg); }
.faq-item p{
  font-size:14px; color:var(--text-muted); line-height:1.65;
  margin-top:var(--space-3); max-width:62ch;
}

/* =========================================================
   FOOTER
   ========================================================= */
.footer{
  border-top:1px solid var(--border);
}
.footer-inner{
  max-width:var(--max-w); margin:0 auto; padding:var(--space-7);
  display:flex; align-items:center; justify-content:space-between;
  flex-wrap:wrap; gap:var(--space-4);
}
.footer-left{
  display:flex; align-items:center; gap:var(--space-3);
  font-size:13px; color:var(--text-faint);
}
.footer-links{ display:flex; gap:var(--space-6); }
.footer-links a{
  font-size:13px; color:var(--text-muted);
  transition:color .2s var(--ease);
}
.footer-links a:hover{ color:var(--cyan); }

/* =========================================================
   RESPONSIVE
   ========================================================= */
@media (max-width:980px){
  .services-grid{ grid-template-columns:repeat(2,1fr); }
  .facts-inner{ grid-template-columns:1fr; gap:var(--space-7); }
  .service-detail{ grid-template-columns:1fr; }
  .service-detail-meta{ border-left:none; border-top:1px solid var(--border); padding-left:0; padding-top:var(--space-6); }
  .process-grid{ grid-template-columns:repeat(2,1fr); gap:var(--space-7) var(--space-6); }
}

/* Tablet tier, 761-900px: the two-column hero grid gets too narrow for
   the title to hold its 3 lines without an extra wrap (real bug, found
   at 768px in English). Collapses to the same single-column reorder as
   mobile, just with the portrait kept larger since there's more room.
   The nav also moves to the burger menu here, not at 760px — the link
   row fits in English down to 768px, but the longer Spanish labels
   ("Agendar llamada" etc.) overflow starting at 799px (verified: no
   overflow from 800px up), so the breakpoint has to clear the longer
   language's content, not just the shorter one. */
@media (max-width:900px){
  .hero-inner{ grid-template-columns:1fr; }
  /* unwraps hero-copy so its children and .hero-portrait (its grid
     sibling) share one reorderable stack — lets the portrait slot in
     between the CTA buttons and the stack tags without moving DOM */
  .hero-copy{ display:contents; }
  .hero-inner .eyebrow{ order:1; }
  .hero-title{ order:2; }
  .hero-sub{ order:3; }
  .hero-metrics{ order:4; }
  .hero-actions{ order:5; }
  .hero-portrait{
    order:6;
    width:100%; max-width:360px;
    margin:var(--space-8) auto 0;
  }
  .hero-tags-marquee{ order:7; }
  .nav-links{
    display:flex; flex-direction:column; gap:var(--space-1);
    position:fixed; top:66px; left:0; right:0;
    background:rgba(8,12,20,0.98);
    border-bottom:1px solid var(--border);
    padding:var(--space-3) var(--space-5) var(--space-5);
    transform:translateY(-12px); opacity:0; pointer-events:none;
    transition:transform .25s var(--ease), opacity .25s var(--ease);
  }
  .nav-links.is-open{ transform:translateY(0); opacity:1; pointer-events:auto; }
  .nav-link{ padding:var(--space-3) var(--space-2); border-bottom:1px solid var(--border); border-radius:0; }
  .nav-actions .nav-cta{ display:none; }
  .nav-burger{ display:block; }
  .nav-burger.is-open span:nth-child(1){ transform:translateY(11px) rotate(45deg); }
  .nav-burger.is-open span:nth-child(2){ opacity:0; }
  .nav-burger.is-open span:nth-child(3){ transform:translateY(-11px) rotate(-45deg); }
}

@media (max-width:760px){
  .hero-portrait{ max-width:280px; }
  .hero{ padding:var(--space-10) var(--space-5) var(--space-8); }
  .services-teaser{ padding:var(--space-10) var(--space-5); }
  .final-cta-inner{ padding:var(--space-10) var(--space-5); }
  .services-grid{ grid-template-columns:1fr; }
  .hero-metrics{ display:grid; grid-template-columns:repeat(2, 1fr); gap:var(--space-6) var(--space-4); }
  /* keeps .metric-value comfortably smaller than .hero-title's floor
     (2.2rem/35.2px) — see the comment on .hero-title above */
  .metric-value{ font-size:26px; }
  .page-header{ padding:var(--space-13) var(--space-5) var(--space-9); }
  .services-detail{ padding:0 var(--space-5) var(--space-10); }
  .service-detail{ padding:var(--space-6) var(--space-5); }
  .process{ padding:var(--space-10) var(--space-5); }
  .process-grid{ grid-template-columns:1fr; gap:var(--space-6); }
  .faq{ padding:0 var(--space-5) var(--space-10); }
}

@media (max-width:420px){
  .nav-inner{ padding:var(--space-3) var(--space-4); }
  .hero-actions{ flex-direction:column; align-items:stretch; }
  .hero-actions .btn{ justify-content:center; }
}
