/* ═══════════════════════════════════════════════════════════════
   Mark Anthony Guerra — Portfolio
   Dark editorial / condensed-display aesthetic.
   Palette: Facebook blue (#1877F2) on a deep-navy gradient.
   Type:    Big Shoulders Display (headings) · Kanit (body)
   ═══════════════════════════════════════════════════════════════ */
:root{
  --bg:#0a1526;
  --bg2:#0f2036;
  --card:#142842;
  --line:rgba(120,170,255,.12);
  --line2:rgba(120,170,255,.22);
  --acc:#1877f2;
  --acc-2:#4599ff;
  --acc-btn:#1668d8;   /* solid fills under white text — passes WCAG AA */
  --tx:#eaf1fb;
  --tx2:#9bb0cc;
  --tx3:#6b819e;
  --disp:'Big Shoulders Display',Impact,sans-serif;
  --body:'Kanit',system-ui,sans-serif;
  --pad:120px;
  --max:1320px;
}
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  margin:0;color:var(--tx2);
  /* Deep Facebook-blue gradient wash rather than a flat fill. */
  background:
    radial-gradient(1200px 720px at 50% -12%, rgba(24,119,242,.20), transparent 62%),
    linear-gradient(180deg, #0b1a2e 0%, #071120 52%, #0a1526 100%);
  background-attachment:fixed;background-color:var(--bg);
  font-family:var(--body);font-weight:300;font-size:16px;line-height:1.7;
  overflow-x:hidden;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
ul{list-style:none;margin:0;padding:0}
h1,h2,h3{font-family:var(--disp);font-weight:700;color:var(--tx);margin:0;line-height:.95;text-transform:uppercase;letter-spacing:-.01em}
::selection{background:var(--acc);color:#fff}

.wrap{max-width:var(--max);margin:0 auto;padding:0 24px;width:100%}
.sec{padding:var(--pad) 0;position:relative}
.sec--alt{background:linear-gradient(180deg,rgba(24,119,242,.07),rgba(24,119,242,.025))}
.sec__head{margin-bottom:64px;max-width:900px}

/* ── custom cursor ── */
.cursor{position:fixed;top:0;left:0;width:26px;height:26px;border:1px solid var(--acc);border-radius:50%;
  pointer-events:none;z-index:9999;transform:translate(-50%,-50%);transition:width .25s,height .25s,background .25s;
  mix-blend-mode:difference;will-change:transform}
.cursor.is-hot{width:56px;height:56px;background:rgba(24,119,242,.18)}
@media (hover:none){.cursor{display:none}}

/* ── preloader ── */
.preloader{position:fixed;inset:0;background:var(--bg);z-index:10000;display:grid;place-items:center;
  transition:opacity .6s ease,visibility .6s;
  /* Self-dismiss on a pure-CSS timer. app.js normally removes this far sooner,
     but if the CDN stalls or JS throws, the overlay must NEVER trap the page. */
  animation:pl-out .4s 4.2s forwards}
@keyframes pl-out{to{opacity:0;visibility:hidden;pointer-events:none}}
/* `display:none` (not just opacity/visibility) so the overlay can NEVER trap
   scroll — a reduced-motion visitor zeroes the transition, and an opacity-only
   hide left this fixed layer sitting over the page and blocking every scroll. */
.preloader.is-done{opacity:0;visibility:hidden;display:none!important;pointer-events:none}
.preloader__inner{text-align:center}
/* "MARK" builds letter by letter, then holds with a soft glow pulse — the
   preloader is deliberately held ~2s (app.js) so this reads as an intro
   rather than a flash. */
.preloader__mark{font-family:var(--disp);font-size:clamp(58px,9vw,104px);font-weight:900;
  color:var(--acc);display:flex;gap:.06em;justify-content:center;letter-spacing:.06em;
  animation:pl-glow 1.7s ease-in-out .5s infinite}
.preloader__mark i{display:inline-block;font-style:normal;opacity:0;transform:translateY(26px) scale(.9);
  animation:pl-letter .7s cubic-bezier(.16,1,.3,1) forwards}
.preloader__mark i:nth-child(1){animation-delay:.06s}
.preloader__mark i:nth-child(2){animation-delay:.16s}
.preloader__mark i:nth-child(3){animation-delay:.26s}
.preloader__mark i:nth-child(4){animation-delay:.36s}
@keyframes pl-letter{to{opacity:1;transform:none}}
@keyframes pl-glow{
  0%,100%{text-shadow:0 0 22px rgba(24,119,242,.35)}
  50%    {text-shadow:0 0 46px rgba(69,153,255,.85)}
}
.preloader__bar{display:block;width:180px;height:2px;background:rgba(255,255,255,.12);margin:18px auto 0;overflow:hidden}
.preloader__bar i{display:block;height:100%;width:0;background:var(--acc);transition:width .4s ease}

/* ── header ── */
.hdr{position:fixed;top:0;left:0;right:0;z-index:900;padding:18px 0;
  transition:background .3s,padding .3s,border-color .3s;border-bottom:1px solid transparent}
.hdr.is-stuck{background:rgba(10,21,38,.92);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  padding:10px 0;border-bottom-color:var(--line)}
.hdr__in{max-width:var(--max);margin:0 auto;padding:0 24px;display:flex;align-items:center;gap:28px}
.logo{display:flex;align-items:center;gap:12px;flex:0 0 auto}
.logo__mk{font-family:var(--disp);font-weight:900;font-size:30px;color:#fff;background:var(--acc-btn);
  width:44px;height:44px;display:grid;place-items:center;letter-spacing:.02em}
.logo__tx{font-family:var(--disp);font-weight:700;font-size:17px;line-height:1;color:var(--tx);
  text-transform:uppercase;letter-spacing:.02em}
.logo__tx em{display:block;font-style:normal;color:var(--acc)}
.nav{display:flex;gap:26px;margin-left:auto;font-family:var(--disp);font-weight:600;font-size:16px;
  letter-spacing:.06em;text-transform:uppercase}
.nav a{color:var(--tx);position:relative;padding:4px 0;transition:color .2s}
.nav a::after{content:"";position:absolute;left:0;bottom:0;width:0;height:2px;background:var(--acc);transition:width .28s}
.nav a:hover{color:var(--acc)}
.nav a:hover::after{width:100%}
.hdr__cta{display:flex;align-items:center;gap:12px;flex:0 0 auto}

.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  font-family:var(--disp);font-weight:700;font-size:16px;letter-spacing:.06em;text-transform:uppercase;
  padding:0 26px;height:48px;border:1px solid transparent;cursor:pointer;transition:.25s ease;white-space:nowrap}
.btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
.btn--primary{background:var(--acc-btn);color:#fff}
.btn--primary:hover{background:var(--acc-2);color:#fff;transform:translateY(-2px);box-shadow:0 12px 30px -10px rgba(24,119,242,.5)}
.btn--ghost{background:transparent;color:var(--tx);border-color:var(--line2)}
.btn--ghost:hover{border-color:var(--acc);color:var(--acc);transform:translateY(-2px)}
.btn--lg{height:58px;padding:0 34px;font-size:18px}
.burger{display:none;width:46px;height:46px;background:transparent;border:1px solid var(--line2);
  cursor:pointer;flex-direction:column;gap:6px;align-items:center;justify-content:center}
.burger span{width:20px;height:2px;background:var(--tx);transition:.25s}
.burger[aria-expanded="true"] span:first-child{transform:translateY(4px) rotate(45deg)}
.burger[aria-expanded="true"] span:last-child{transform:translateY(-4px) rotate(-45deg)}

/* ── hero ── */
/* Padding + type below are tuned so the whole hero — headline, sub, BOTH CTAs
   and the availability line — fits on a 900px-tall screen. It previously ran
   past the fold and pushed the buttons out of view on load. */
.hero{position:relative;padding:150px 0 70px;overflow:hidden}
.hero__glow{position:absolute;top:-10%;left:50%;transform:translateX(-50%);width:1100px;height:700px;
  background:radial-gradient(ellipse at center,rgba(24,119,242,.20),transparent 62%);pointer-events:none}

/* Two-column hero: copy left, cut-out portrait right. */
.hero__in{display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,.88fr);
  gap:40px;align-items:end;position:relative}
.hero__copy{min-width:0}
.hero__photo{position:relative;justify-self:center;align-self:end;width:100%;max-width:430px}
/* Blue bloom behind the cut-out so it sits IN the gradient rather than on it. */
.hero__photo::before{content:"";position:absolute;left:50%;bottom:-4%;transform:translateX(-50%);
  width:112%;height:88%;border-radius:50%;pointer-events:none;
  background:radial-gradient(ellipse at center,rgba(24,119,242,.42),rgba(24,119,242,.10) 55%,transparent 72%)}
.hero__photo picture,.hero__photo img{position:relative;display:block;width:100%;height:auto}
/* The cut-out ends mid-torso, which reads as a hard horizontal crop on a dark
   background — fade the last stretch so it dissolves into the gradient. */
.hero__photo img{filter:drop-shadow(0 26px 50px rgba(3,10,22,.65));
  -webkit-mask-image:linear-gradient(180deg,#000 72%,rgba(0,0,0,.55) 88%,transparent 100%);
  mask-image:linear-gradient(180deg,#000 72%,rgba(0,0,0,.55) 88%,transparent 100%)}
.eyebrow{font-family:var(--disp);font-weight:700;font-size:17px;letter-spacing:.22em;text-transform:uppercase;
  color:var(--acc);margin:0 0 14px}
.hero__role{font-family:var(--disp);font-weight:600;font-size:20px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--tx2);margin:0 0 22px}
/* Long single words ("ARCHITECTING") must never exceed the viewport, so the
   lower bound stays modest and we allow a break as a last resort. */
.hero__h1{font-size:clamp(40px,6.2vw,96px);line-height:.92;max-width:17ch;margin:0 0 22px;
  overflow-wrap:break-word;word-wrap:break-word}
.hero__sub{max-width:62ch;font-size:17px;color:var(--tx2);margin:0 0 28px}
.hero__act{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:32px}
.hero__meta{display:flex;gap:32px;flex-wrap:wrap;font-family:var(--disp);font-weight:600;font-size:16px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--tx2)}
.hero__meta li{display:flex;align-items:center;gap:9px}
.hero__meta i{width:7px;height:7px;background:var(--acc);border-radius:50%;flex:0 0 auto}

/* ── ticker ── */
.ticker{margin-top:70px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:18px 0;overflow:hidden;background:var(--bg2)}
.ticker__row{display:flex;gap:40px;width:max-content;animation:slide 34s linear infinite}
.ticker__row span{font-family:var(--disp);font-weight:700;font-size:26px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--tx3);white-space:nowrap}
@keyframes slide{from{transform:translateX(-50%)}to{transform:translateX(0)}}

/* ── big words (about) ── */
/* Full-bleed on purpose: this line carries the scroll-scrub word sweep (dim →
   white). Boxed to 26ch it ran inside a ~500px column of a 1320px container,
   which both left the right half empty and made the signature animation too
   small to notice. */
.bigwords{font-size:clamp(26px,4.15vw,58px);line-height:1.12;color:var(--tx3);max-width:none;
  margin:0 0 70px;font-weight:700;letter-spacing:-.01em}
.bigwords .w{color:var(--tx3);transition:color .3s}
.bigwords .w.on{color:var(--tx)}

.h2{font-size:clamp(34px,5vw,64px);line-height:.96}
.h2 em{font-style:normal;color:var(--acc)}
.lede{max-width:62ch;font-size:17px;color:var(--tx2);margin:20px 0 0}

/* ── stats ── */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.stat{background:var(--bg);padding:38px 28px}
.stat b{font-family:var(--disp);font-size:clamp(44px,5.5vw,72px);font-weight:800;color:var(--acc);
  display:block;line-height:1}
.stat span{display:block;margin-top:10px;font-family:var(--disp);font-weight:600;font-size:15px;
  letter-spacing:.1em;text-transform:uppercase;color:var(--tx2);line-height:1.3}
.stat em{display:block;font-style:normal;color:var(--tx3)}

/* ── skill bars ── */
.bars{display:grid;grid-template-columns:repeat(2,1fr);gap:30px 56px;margin-bottom:80px}
.bar__t{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px}
.bar__t span{font-family:var(--disp);font-weight:700;font-size:19px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--tx)}
.bar__t b{font-family:var(--disp);font-weight:500;font-size:30px;color:var(--acc);line-height:1}
.bar__tr{height:3px;background:rgba(255,255,255,.10);overflow:hidden}
.bar__tr i{display:block;height:100%;width:0;background:var(--acc);transition:width 1.4s cubic-bezier(.16,1,.3,1)}

/* ── chips ── */
.chips{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.chipset{background:var(--bg2);padding:30px 26px}
.chipset h3{font-size:20px;letter-spacing:.08em;color:var(--acc);margin-bottom:16px}
.chipset ul{display:flex;flex-wrap:wrap;gap:8px}
.chipset li{font-size:13px;font-weight:300;color:var(--tx2);border:1px solid var(--line2);
  padding:5px 11px;transition:.2s}
.chipset li:hover{border-color:var(--acc);color:var(--acc)}

/* ── cards (services) ── */
.cards{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.card{background:var(--bg);padding:40px 34px;position:relative;transition:background .3s}
.card:hover{background:var(--card)}
.card__n{font-family:var(--disp);font-weight:800;font-size:15px;letter-spacing:.16em;color:var(--acc)}
.card h3{font-size:27px;margin:14px 0 12px;line-height:1.02}
.card h3 em{display:block;font-style:normal;color:var(--tx3)}
.card p{margin:0;font-size:15px;color:var(--tx2)}
.card::after{content:"";position:absolute;left:0;bottom:0;width:0;height:2px;background:var(--acc);transition:width .35s}
.card:hover::after{width:100%}

/* ── steps ── */
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:26px}
.step{border-top:2px solid var(--line2);padding-top:26px;transition:border-color .3s}
.step:hover{border-top-color:var(--acc)}
.step__n{font-family:var(--disp);font-weight:800;font-size:64px;color:rgba(255,255,255,.09);line-height:1;display:block}
.step h3{font-size:clamp(30px,3.2vw,46px);margin:12px 0 14px;line-height:1}
.step h3 em{display:block;font-style:normal;color:var(--acc)}
.step p{margin:0;font-size:15px;color:var(--tx2)}

/* ── timeline / jobs ── */
.tl{display:grid;gap:1px;background:var(--line);border:1px solid var(--line);position:relative}
/* Progress line drawn by GSAP as the timeline scrolls past (injected by app.js;
   absent entirely when GSAP is unavailable, so nothing depends on it). */
.tl__line{position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--acc);
  transform:scaleY(0);transform-origin:top center;pointer-events:none;
  box-shadow:0 0 18px rgba(24,119,242,.55);z-index:2}
@media(max-width:720px){.tl__line{display:none}}
.job{background:var(--bg);display:grid;grid-template-columns:190px 1fr;gap:30px;padding:40px 34px;transition:background .3s}
.job:hover{background:var(--card)}
.job__when b{font-family:var(--disp);font-weight:800;font-size:42px;color:var(--acc);display:block;line-height:1}
.job__when span{font-family:var(--disp);font-weight:600;font-size:15px;letter-spacing:.14em;color:var(--tx3);
  text-transform:uppercase}
.job__body h3{font-size:25px;line-height:1.1;margin-bottom:6px}
.job__body h3 em{font-style:normal;color:var(--tx3);font-size:.86em}
.job__org{font-size:14px;color:var(--acc);margin:0 0 16px}
.job__body ul{display:grid;gap:11px}
.job__body li{position:relative;padding-left:22px;font-size:15px;color:var(--tx2)}
.job__body li::before{content:"›";position:absolute;left:0;top:-1px;color:var(--acc);font-size:19px;line-height:1.2}

/* ── projects ── */
/* Group heading between the card grids ("01 Products & platforms I built"). */
.grp{display:flex;align-items:baseline;gap:14px;margin:56px 0 20px;font-size:23px;
  letter-spacing:.02em;color:var(--tx);text-transform:none}
.grp span{font-family:var(--disp);font-weight:800;font-size:15px;letter-spacing:.18em;color:var(--acc)}
.grp::after{content:"";flex:1;height:1px;background:var(--line);margin-left:6px}

.prj{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.pcard{background:var(--bg2);display:flex;flex-direction:column;
  transition:background .3s,transform .3s;position:relative;overflow:hidden}
a.pcard:hover{background:var(--card);transform:translateY(-3px)}
.pcard__body{padding:26px 24px 24px;display:flex;flex-direction:column;gap:11px;flex:1}

/* Cover screenshot */
.pcard__shot{display:block;overflow:hidden;background:var(--card);
  border-bottom:1px solid var(--line);aspect-ratio:900/563}
.pcard__shot img{width:100%;height:100%;object-fit:cover;object-position:top center;
  display:block;transition:transform .5s cubic-bezier(.16,1,.3,1);filter:saturate(.9)}
a.pcard:hover .pcard__shot img{transform:scale(1.035);filter:saturate(1)}

/* Flagship card — cover beside the copy on desktop. */
.pcard--hero{display:grid;grid-template-columns:1.05fr 1fr;align-items:stretch;
  background:linear-gradient(120deg,rgba(24,119,242,.09),transparent 60%),var(--card);
  border:1px solid var(--line);margin-bottom:8px}
.pcard--hero .pcard__body{padding:44px 40px}
/* Presented as a framed screen rather than a bleed-to-edge crop: inset from
   the card edges, own rounded border, and the image is CONTAINED (never
   stretched or cropped mid-UI). */
.pcard__shot--hero{border-bottom:0;border-left:0;order:2;height:auto;aspect-ratio:auto;
  align-self:center;padding:26px 30px 26px 0;background:none;overflow:visible}
.pcard__shot--hero img{width:100%;height:auto;object-fit:contain;
  border:1px solid var(--line2);border-radius:12px;
  box-shadow:0 26px 60px -22px rgba(3,10,22,.85),0 0 0 1px rgba(24,119,242,.10);
  background:var(--bg)}

/* Tile (no screenshot) — for systems that are login-gated or in development. */
.pcard--tile{background:linear-gradient(180deg,var(--card) 0%,var(--bg2) 100%)}
.pcard--tile .pcard__body{padding:32px 26px}
.pcard--tile::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--acc);opacity:.45}
.pcard--soon::before{background:var(--tx3)}

.pcard__top{display:flex;align-items:center;justify-content:space-between;gap:16px}
.tag{font-family:var(--disp);font-weight:700;font-size:12.5px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--acc);border:1px solid rgba(24,119,242,.34);padding:4px 11px;white-space:nowrap}
.tag--soon{color:var(--tx3);border-color:var(--line2)}
.arrow{font-size:22px;color:var(--tx3);transition:.28s}
a.pcard:hover .arrow{color:var(--acc);transform:translate(4px,-4px)}
.pcard h3,.pcard h4{font-size:26px;line-height:1}
.pcard--hero h3{font-size:clamp(40px,5vw,72px)}
.pcard p{margin:0;font-size:14.5px;line-height:1.55;color:var(--tx2);max-width:70ch}
.pcard__st{display:flex;flex-wrap:wrap;gap:7px;margin-top:2px}
.pcard__st i{font-style:normal;font-size:12px;color:var(--tx2);border:1px solid var(--line2);padding:4px 9px}
.pcard__url{margin-top:auto;padding-top:12px;font-family:var(--disp);font-weight:600;font-size:14px;
  letter-spacing:.1em;text-transform:uppercase;color:var(--tx3);word-break:break-all}

/* ── credentials ── */
.creds{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.cred{background:var(--bg);padding:34px 30px;display:flex;flex-direction:column;gap:12px;transition:background .3s}
.cred:hover{background:var(--card)}
.cred--feat{grid-column:span 3;background:linear-gradient(120deg,rgba(24,119,242,.10),transparent 58%),var(--card)}
.cred__badge{font-family:var(--disp);font-weight:700;font-size:13px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--acc)}
.cred h3{font-size:26px;line-height:1.02}
.cred--feat h3{font-size:clamp(32px,4.4vw,54px)}
.cred h3 em{display:block;font-style:normal;color:var(--tx3)}
.cred p{margin:0;font-size:15px;color:var(--tx2);max-width:80ch}
.cred__lnk{font-family:var(--disp);font-weight:700;font-size:16px;letter-spacing:.1em;color:var(--acc);
  text-transform:uppercase;margin-top:6px;transition:.2s}
.cred__lnk:hover{color:#fff}

/* ── contact ── */
.contact{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:start}
.contact__list{margin:34px 0;display:grid;gap:18px}
.contact__list li{display:grid;gap:3px;border-bottom:1px solid var(--line);padding-bottom:14px}
.contact__list span{font-family:var(--disp);font-weight:600;font-size:13.5px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--tx3)}
.contact__list a,.contact__list b{font-family:var(--disp);font-weight:700;font-size:23px;color:var(--tx);
  transition:color .2s}
.contact__list a:hover{color:var(--acc)}
.contact__act{display:flex;gap:14px;flex-wrap:wrap}
.contact__f{background:var(--bg);border:1px solid var(--line);padding:38px 34px;display:grid;gap:16px}
.contact__f h3{font-size:26px;margin-bottom:4px}
.contact__f label{display:grid;gap:7px;font-family:var(--disp);font-weight:600;font-size:13.5px;
  letter-spacing:.14em;text-transform:uppercase;color:var(--tx3)}
.contact__f input,.contact__f textarea{background:var(--bg2);border:1px solid var(--line);color:var(--tx);
  font-family:var(--body);font-size:15px;font-weight:300;padding:13px 15px;transition:border-color .2s;width:100%}
.contact__f input:focus,.contact__f textarea:focus{outline:none;border-color:var(--acc)}
.contact__f input::placeholder,.contact__f textarea::placeholder{color:var(--tx3)}
.contact__f button{width:100%;margin-top:4px}
.cform__note{margin:0;font-size:14px;color:var(--acc);min-height:20px;font-weight:300}

/* ── cta ── */
.cta{padding:110px 0;background:linear-gradient(120deg,#1668d8 0%,#0d4fb0 100%);text-align:center}
.cta__h{font-size:clamp(38px,7vw,104px);color:#fff;line-height:.9;margin-bottom:34px}
.cta .btn--primary{background:#fff;color:var(--acc)}
.cta .btn--primary:hover{background:#eaf1fb;color:var(--acc);box-shadow:none}

/* ── footer ── */
.ftr{background:var(--bg);border-top:1px solid var(--line);padding:64px 0 26px}
.ftr__in{display:grid;grid-template-columns:1.6fr 1fr 1fr;gap:40px;align-items:start}
.ftr__b p{margin:16px 0 0;font-size:15px;color:var(--tx2);max-width:38ch}
.ftr__nav{display:grid;gap:10px;font-family:var(--disp);font-weight:600;font-size:16px;letter-spacing:.08em;
  text-transform:uppercase}
.ftr__nav a{color:var(--tx2);transition:color .2s}
.ftr__nav a:hover{color:var(--acc)}
.ftr__c{display:grid;gap:10px;font-family:var(--disp);font-weight:700;font-size:18px;color:var(--tx)}
.ftr__c a:hover{color:var(--acc)}
.ftr__bot{margin-top:48px;padding-top:22px;border-top:1px solid var(--line);display:flex;
  justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:14px;color:var(--tx3)}
.ftr__pw{color:var(--tx3);transition:color .2s}
.ftr__pw:hover{color:var(--acc)}

/* ── to top ── */
.totop{position:fixed;right:22px;bottom:22px;width:48px;height:48px;background:var(--acc-btn);color:#fff;
  display:grid;place-items:center;font-size:20px;z-index:800;opacity:0;visibility:hidden;transition:.3s;
  font-weight:700}
.totop.on{opacity:1;visibility:visible}
.totop:hover{background:var(--acc-2)}

/* ── reveal ── */
/* A bit more travel + a touch of scale so the entrance actually reads as motion
   rather than a barely-perceptible fade. */
.reveal{opacity:0;transform:translateY(40px) scale(.985)}
.reveal.in{opacity:1;transform:none;
  transition:opacity .75s ease,transform .85s cubic-bezier(.16,1,.3,1)}
.split .ln{display:block;overflow:hidden}
.split .ln i{display:block;font-style:normal;transform:translateY(104%)}
.split.in .ln i{transform:none;transition:transform .9s cubic-bezier(.16,1,.3,1)}

/* ── responsive ── */
@media(max-width:1100px){
  .nav{display:none}
  .nav.open{display:flex;position:fixed;inset:64px 0 auto;background:rgba(10,21,38,.98);flex-direction:column;
    gap:0;padding:18px 24px 26px;border-bottom:1px solid var(--line);backdrop-filter:blur(14px)}
  .nav.open a{padding:13px 0;border-bottom:1px solid var(--line);font-size:19px}
  .burger{display:flex}
  /* .nav carries margin-left:auto on desktop, which is what pushes the right
     cluster over. Once the nav is hidden here nothing does, so the burger
     drifted in beside the logo — pin the cluster right explicitly. */
  .hdr__cta{margin-left:auto}
  .stats,.cards,.prj,.creds,.chips{grid-template-columns:repeat(2,1fr)}
  .cred--feat{grid-column:span 2}
  /* Flagship card stacks: cover on top, copy below. */
  .pcard--hero{grid-template-columns:1fr}
  .pcard__shot--hero{order:0;border-left:0;border-bottom:1px solid var(--line);aspect-ratio:900/563}
  .pcard--hero .pcard__body{padding:32px 28px}
  .steps{grid-template-columns:repeat(2,1fr)}
  .bars{grid-template-columns:1fr;gap:24px}
  .contact{grid-template-columns:1fr;gap:44px}
  .ftr__in{grid-template-columns:1fr 1fr}
  /* Portrait drops BELOW the copy so the CTAs stay above the fold. */
  .hero__in{grid-template-columns:1fr;gap:8px}
  .hero__photo{order:2;max-width:300px;margin-top:8px}
}
@media(max-width:720px){
  :root{--pad:74px}
  .hdr__cta .btn--primary{display:none}
  .hero{padding:150px 0 60px}
  .hero__h1{font-size:clamp(38px,11vw,58px)}
  .hero__glow{width:100%;max-width:100vw}
  .hero__photo{max-width:250px}
  .cta__h{font-size:clamp(34px,10vw,56px)}
  .hero__meta{gap:14px;flex-direction:column}
  .stats,.cards,.prj,.creds,.chips,.steps{grid-template-columns:1fr}
  .cred--feat{grid-column:span 1;padding:36px 26px}
  .pcard--hero .pcard__body{padding:28px 22px}
  .grp{margin:40px 0 16px;font-size:20px}
  .job{grid-template-columns:1fr;gap:16px;padding:32px 24px}
  .job__when{display:flex;align-items:baseline;gap:10px}
  .job__when b{font-size:34px}
  .ftr__in{grid-template-columns:1fr;gap:32px}
  .ticker__row span{font-size:20px}
  .sec__head{margin-bottom:44px}
}

/* Reduced motion: suppress LARGE, vestibular movement (parallax, float, skew,
   long travel) — not the whole site. The previous blanket
   `*{animation-duration:.01ms}` froze everything, including the marquee, so
   anyone with OS animation effects turned off saw a completely static page. */
@media(prefers-reduced-motion:reduce){
  .reveal{opacity:1;transform:none;transition-duration:.3s}
  .split .ln i{transform:none}
  .hero__photo img{transform:none}
  .ticker__row{animation-duration:56s}          /* keeps moving, calmer */
  .cursor{display:none}
  .btn:hover,.pcard:hover,a.pcard:hover{transform:none}
}

/* Honeypot — off-screen rather than display:none so bots still fill it. */
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
