/* ==========================================================================
   Julian Reyes — Graduation Celebration
   Deep navy · warm gold · frosted glass. One stylesheet, banner-organised.
   ========================================================================== */

/* ─────────────────────────── Tokens ─────────────────────────── */
:root{
  --navy-900:#050e1d;
  --navy-850:#08152a;
  --navy-800:#0b1a33;
  --navy-700:#0f2039;
  --navy-600:#132845;
  --navy-500:#1b3860;

  --gold:#c8a24a;
  --gold-lt:#e8cf95;
  --gold-dp:#8b6c28;

  --off:#f4f1e9;
  --dim:rgba(238,235,226,.66);
  --dimmer:rgba(238,235,226,.42);

  --glass:rgba(255,255,255,.045);
  --glass-2:rgba(255,255,255,.075);
  --brd:rgba(232,207,149,.16);
  --brd-hi:rgba(232,207,149,.42);

  --ff-d:"Playfair Display",Georgia,"Times New Roman",serif;
  --ff-b:"Jost","Trebuchet MS",system-ui,-apple-system,sans-serif;

  --pad:clamp(1.25rem,5vw,5.5rem);
  --maxw:1280px;
  --r:14px;

  --ease:cubic-bezier(.22,.61,.36,1);
  --ease-out:cubic-bezier(.16,1,.3,1);

  /* motion tokens — the calm variant re-declares these, nothing else */
  --rv-y:46px;
  --rv-blur:9px;
  --rv-dur:1.05s;
  --tilt:7deg;
  --lift:-8px;
  --spot-travel:1;
  --spot-blur:34px;
  --drift:1;
  --hero-par:1;
  --count-dur:1900;
}

html[data-motion="calm"]{
  --rv-y:14px;
  --rv-blur:0px;
  --rv-dur:.82s;
  --tilt:2.2deg;
  --lift:-3px;
  --spot-travel:.5;
  --spot-blur:18px;
  --drift:.55;
  --hero-par:0;
  --count-dur:1250;
}

/* ─────────────────────────── Base ───────────────────────────── */
*,*::before,*::after{box-sizing:border-box}

html{
  scroll-behavior:smooth;
  -webkit-text-size-adjust:100%;
}
section[id]{scroll-margin-top:5.5rem}
html.is-loading{overflow:hidden}

body{
  margin:0;
  background:var(--navy-800);
  background-image:
    radial-gradient(120% 78% at 50% -12%, #1b3860 0%, #102340 34%, #0b1a33 62%, #071224 100%);
  background-attachment:fixed;
  color:var(--off);
  font-family:var(--ff-b);
  font-weight:300;
  font-size:clamp(15px,1vw + 12px,17px);
  line-height:1.72;
  letter-spacing:.012em;
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
}

img,svg{display:block;max-width:100%}
h1,h2,h3{margin:0;font-family:var(--ff-d);font-weight:500;line-height:1.06}
p{margin:0}
ol,ul{margin:0;padding:0;list-style:none}

a{color:inherit;text-decoration:none}

::selection{background:rgba(200,162,74,.32);color:#fff}

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

.skip{
  position:fixed;top:10px;left:10px;z-index:200;
  padding:.6rem 1rem;border-radius:8px;
  background:var(--gold);color:#0a1830;font-weight:500;
  transform:translateY(-160%);
  transition:transform .3s var(--ease);
}
.skip:focus-visible{transform:none}

/* shared type helpers */
.eyebrow{
  font-size:.68rem;font-weight:400;
  letter-spacing:.42em;text-transform:uppercase;
  color:var(--gold);
  margin-bottom:1.1rem;
}
.h-sect{
  font-size:clamp(2.2rem,5.2vw,4.1rem);
  letter-spacing:-.012em;
}
.h-sect em{
  font-style:italic;font-weight:400;
  background:linear-gradient(100deg,var(--gold-lt) 0%,var(--gold) 46%,var(--gold-dp) 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.sect-lede{
  margin-top:1.4rem;max-width:46ch;
  color:var(--dim);font-size:1.02rem;
}
.sect-head{margin-bottom:clamp(2.5rem,5vw,4.5rem)}
.sect-head--c{text-align:center}
.sect-head--c .sect-lede{margin-left:auto;margin-right:auto}

/* ─────────────────────────── Buttons ────────────────────────── */
.btn{
  --bg:transparent;
  display:inline-flex;align-items:center;justify-content:center;gap:.6em;
  padding:.95em 2.1em;
  border:1px solid var(--brd-hi);
  border-radius:999px;
  background:var(--bg);
  color:var(--off);
  font-family:var(--ff-b);font-size:.8rem;font-weight:400;
  letter-spacing:.2em;text-transform:uppercase;
  cursor:pointer;position:relative;overflow:hidden;
  transition:color .45s var(--ease),border-color .45s var(--ease),
             letter-spacing .45s var(--ease),transform .45s var(--ease);
}
.btn::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 55%,var(--gold-dp));
  transform:translate3d(0,101%,0);
  transition:transform .55s var(--ease-out);
  z-index:-1;
}
.btn > *{position:relative}
.btn:hover,.btn:focus-visible{
  color:#0a1830;border-color:transparent;letter-spacing:.26em;
}
.btn:hover::before,.btn:focus-visible::before{transform:translate3d(0,0,0)}
.btn:active{transform:scale(.985)}

.btn--gold{
  border-color:transparent;color:#0a1830;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 55%,var(--gold-dp));
}
.btn--gold::before{
  background:linear-gradient(100deg,#fff3d8,var(--gold-lt));
}
.btn--gold:hover,.btn--gold:focus-visible{color:#0a1830}

.btn--ghost{background:rgba(255,255,255,.03)}
.btn--sm{padding:.7em 1.5em;font-size:.7rem}

/* ══════════════════════════ Loader ══════════════════════════════ */
.loader{
  position:fixed;inset:0;z-index:150;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:1.6rem;
  background:radial-gradient(90% 70% at 50% 44%,#14294a 0%,#0b1a33 46%,#050e1d 100%);
  opacity:0;visibility:hidden;
  transition:opacity .9s var(--ease),visibility 0s linear .9s;
}
html.is-loading .loader{opacity:1;visibility:visible;transition:none}
html.is-loading .loader__art svg{overflow:visible}

.loader__art{width:min(46vw,190px)}
.loader__art svg{width:100%;height:auto;overflow:visible}

.ld-p{stroke-dasharray:100;stroke-dashoffset:100}
html.is-loading .ld-p1{animation:draw .62s var(--ease-out) .12s forwards}
html.is-loading .ld-p2{animation:draw .55s var(--ease-out) .62s forwards}
html.is-loading .ld-p3{animation:draw .38s var(--ease-out) 1.08s forwards}
@keyframes draw{to{stroke-dashoffset:0}}

.ld-btn{opacity:0;transform:scale(.4);transform-origin:110px 72px}
html.is-loading .ld-btn{animation:pop .5s var(--ease-out) 1.02s forwards}
@keyframes pop{to{opacity:1;transform:scale(1)}}

.ld-tuft{opacity:0}
html.is-loading .ld-tuft{animation:fadeIn .4s var(--ease) 1.38s forwards}
@keyframes fadeIn{to{opacity:1}}

.ld-tassel{transform-box:fill-box;transform-origin:100% 0;}
html.is-loading .ld-tassel{animation:swing 2.4s var(--ease) 1.32s 2}
@keyframes swing{
  0%{transform:rotate(0deg)}
  22%{transform:rotate(calc(9deg * var(--drift)))}
  55%{transform:rotate(calc(-7deg * var(--drift)))}
  80%{transform:rotate(calc(3deg * var(--drift)))}
  100%{transform:rotate(0deg)}
}

.loader__word{
  font-family:var(--ff-b);
  font-size:.7rem;letter-spacing:.5em;text-transform:uppercase;
  color:var(--dimmer);
  opacity:0;
}
.loader__word span{color:var(--gold)}
html.is-loading .loader__word{animation:fadeIn .8s var(--ease) 1.15s forwards}

.loader__bar{
  width:min(52vw,190px);height:1px;
  background:rgba(232,207,149,.16);
  overflow:hidden;
}
.loader__bar span{
  display:block;height:100%;
  background:linear-gradient(90deg,transparent,var(--gold),transparent);
  transform:scaleX(0);transform-origin:0 50%;
}
html.is-loading .loader__bar span{animation:fill 2.05s var(--ease-out) .1s forwards}
@keyframes fill{to{transform:scaleX(1)}}

/* ═══════════════════ Tracking spotlight & ambience ══════════════ */
.spot{
  position:fixed;left:50%;top:0;
  width:150vmax;height:150vmax;
  margin-left:-75vmax;margin-top:-75vmax;
  z-index:0;pointer-events:none;
  transform:translate3d(0,0,0);
  will-change:transform;
}
.spot__core{
  position:absolute;inset:0;
  background:
    radial-gradient(closest-side,rgba(200,162,74,.17) 0%,rgba(200,162,74,.07) 34%,rgba(200,162,74,0) 66%),
    radial-gradient(closest-side,rgba(120,170,255,.09) 0%,rgba(120,170,255,0) 58%);
  filter:blur(var(--spot-blur));
  animation:spotBreath 11s ease-in-out infinite alternate;
}
@keyframes spotBreath{
  from{transform:scale(1);opacity:.86}
  to{transform:scale(calc(1 + .09 * var(--drift)));opacity:1}
}

.shafts{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;opacity:.5}
.shafts i{
  position:absolute;top:-30vh;
  width:34vw;height:170vh;
  background:linear-gradient(180deg,rgba(200,162,74,.11),rgba(200,162,74,0) 62%);
  transform-origin:50% 0;
}
.shafts i:nth-child(1){left:-6vw;transform:rotate(14deg);animation:shaft 17s ease-in-out infinite alternate}
.shafts i:nth-child(2){left:44vw;transform:rotate(-9deg);animation:shaft 21s ease-in-out infinite alternate-reverse}
.shafts i:nth-child(3){left:78vw;transform:rotate(7deg);animation:shaft 25s ease-in-out infinite alternate}
@keyframes shaft{
  from{transform:rotate(11deg) translate3d(calc(-2vw * var(--drift)),0,0);opacity:.5}
  to{transform:rotate(-6deg) translate3d(calc(3vw * var(--drift)),0,0);opacity:.95}
}

.grain{
  position:fixed;inset:0;z-index:1;pointer-events:none;
  opacity:.28;mix-blend-mode:overlay;
  background-image:
    repeating-linear-gradient(0deg,rgba(255,255,255,.045) 0 1px,transparent 1px 3px),
    repeating-linear-gradient(90deg,rgba(255,255,255,.03) 0 1px,transparent 1px 4px);
}

main,.nav,.foot{position:relative;z-index:2}

/* ════════════════════════════ Nav ═══════════════════════════════ */
.nav{
  position:fixed;top:0;left:0;right:0;z-index:60;
  display:flex;align-items:center;gap:1.5rem;
  padding:1.1rem var(--pad);
  transform:translate3d(0,-102%,0);
  transition:transform .6s var(--ease-out),background-color .5s var(--ease),
             border-color .5s var(--ease);
  border-bottom:1px solid transparent;
  background:rgba(8,21,42,0);
}
.nav.is-on{
  transform:translate3d(0,0,0);
  background:rgba(8,21,42,.72);
  border-bottom-color:var(--brd);
  -webkit-backdrop-filter:blur(16px) saturate(140%);
  backdrop-filter:blur(16px) saturate(140%);
}
.nav__mark{
  display:flex;align-items:center;gap:.6rem;
  color:var(--gold);
  font-family:var(--ff-d);font-size:1.05rem;letter-spacing:.18em;
  transition:letter-spacing .4s var(--ease)
}
.nav__mark svg{width:30px;height:30px}
.nav__mark:hover{letter-spacing:.3em}
.nav__links{display:flex;gap:2rem;margin-left:auto}
.nav__links a{
  position:relative;
  font-size:.74rem;letter-spacing:.24em;text-transform:uppercase;
  color:var(--dim);
  transition:color .4s var(--ease),letter-spacing .4s var(--ease);
}
.nav__links a::after{
  content:"";position:absolute;left:0;right:0;bottom:-7px;height:1px;
  background:var(--gold);
  transform:scaleX(0);transform-origin:0 50%;
  transition:transform .45s var(--ease-out);
}
.nav__links a:hover,.nav__links a:focus-visible,.nav__links a.is-here{color:var(--off);letter-spacing:.3em}
.nav__links a:hover::after,.nav__links a:focus-visible::after,.nav__links a.is-here::after{transform:scaleX(1)}
.nav .btn{margin-left:.5rem}

@media (max-width:860px){
  .nav__links{display:none}
  .nav .btn{margin-left:auto}
}

/* ════════════════════════════ Hero ══════════════════════════════ */
.hero{
  position:relative;
  min-height:100svh;min-height:100vh;
  display:flex;flex-direction:column;
  align-items:center;justify-content:center;
  text-align:center;
  padding:8rem var(--pad) 6rem;
  overflow:hidden;
}
/* The cursor offset rides the standalone `translate` property so that the
   ambient breathing keyframes can keep the `transform` channel to themselves
   — in calm mode JS never touches translate, and the breathing still runs. */
.hero__glow{
  position:absolute;left:50%;top:44%;
  width:min(120vw,1100px);aspect-ratio:1;
  margin-left:min(-60vw,-550px);margin-top:min(-60vw,-550px);
  background:radial-gradient(closest-side,rgba(200,162,74,.19),rgba(200,162,74,.05) 45%,transparent 70%);
  translate:0 0;
  transition:translate 1.5s var(--ease-out);
  animation:glowBreath 15s ease-in-out infinite alternate;
  pointer-events:none;
}
@keyframes glowBreath{
  from{transform:scale(.94);opacity:.72}
  to{transform:scale(calc(1 + .06 * var(--drift)));opacity:1}
}
.hero__inner{position:relative;max-width:56rem}

.hero__name{
  font-size:clamp(3.6rem,13.5vw,11rem);
  line-height:.86;
  letter-spacing:-.03em;
  margin:.2em 0 0;
}
.hero__line{display:block}
.hero__line--em{
  font-style:italic;font-weight:400;
  background:linear-gradient(96deg,#fff6e2 0%,var(--gold-lt) 26%,var(--gold) 58%,var(--gold-dp) 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  padding-right:.06em;
}

.hero__rule{display:flex;align-items:center;justify-content:center;gap:1rem;margin:2.2rem auto 0;max-width:26rem}
.hero__rule span{flex:1;height:1px;background:linear-gradient(90deg,transparent,var(--brd-hi))}
.hero__rule span:last-child{background:linear-gradient(90deg,var(--brd-hi),transparent)}
.hero__rule b{
  width:7px;height:7px;background:var(--gold);
  transform:rotate(45deg);
  animation:diamond 6s ease-in-out infinite;
}
@keyframes diamond{
  0%,100%{transform:rotate(45deg) scale(1);opacity:.75}
  50%{transform:rotate(45deg) scale(calc(1 + .35 * var(--drift)));opacity:1}
}

.hero__sub{
  margin:1.9rem auto 0;max-width:40rem;
  color:var(--dim);font-size:clamp(.98rem,1.6vw,1.1rem);
  font-weight:200;
}
.hero__date{
  display:flex;align-items:center;justify-content:center;gap:1rem;
  flex-wrap:wrap;
  margin-top:2.1rem;
  font-size:.74rem;letter-spacing:.34em;text-transform:uppercase;
  color:var(--gold-lt);
}
.hero__date i{width:4px;height:4px;background:var(--gold);transform:rotate(45deg);opacity:.7}
.hero__cta{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-top:3rem}

.scroll-cue{
  position:absolute;bottom:2rem;left:50%;
  transform:translateX(-50%);
  display:flex;flex-direction:column;align-items:center;gap:.8rem;
  color:var(--dimmer);
}
.scroll-cue__txt{font-size:.62rem;letter-spacing:.42em;text-transform:uppercase}
.scroll-cue__line{
  width:1px;height:56px;
  background:linear-gradient(180deg,var(--gold),transparent);
  transform-origin:50% 0;
  animation:cue 2.6s ease-in-out infinite;
}
@keyframes cue{
  0%,100%{transform:scaleY(.35);opacity:.5}
  50%{transform:scaleY(1);opacity:1}
}
.scroll-cue:hover{color:var(--gold-lt)}

/* hero entrance — staged, runs once */
html.js .hero .rv{opacity:0;transform:translate3d(0,var(--rv-y),0)}
html.is-loaded .hero .rv{animation:heroIn 1.15s var(--ease-out) forwards}
html.is-loaded .hero [data-rv="1"]{animation-delay:.06s}
html.is-loaded .hero [data-rv="2"]{animation-delay:.18s}
html.is-loaded .hero [data-rv="3"]{animation-delay:.30s}
html.is-loaded .hero [data-rv="4"]{animation-delay:.46s}
html.is-loaded .hero [data-rv="5"]{animation-delay:.56s}
html.is-loaded .hero [data-rv="6"]{animation-delay:.66s}
html.is-loaded .hero [data-rv="7"]{animation-delay:.76s}
@keyframes heroIn{
  from{opacity:0;transform:translate3d(0,var(--rv-y),0)}
  to{opacity:1;transform:translate3d(0,0,0)}
}

/* ═══════════════════════ Scroll reveal ══════════════════════════ */
/* Reveal offset travels in a custom property rather than in `transform`
   directly, so a card can be revealed AND pointer-tilted at once — writing
   `transform:none` on `.in` silently cancelled the tilt. Hero items opt out
   via [data-rv]; they are driven by the entrance keyframes above. */
html.js .rv:not([data-rv]){
  --rv-off:var(--rv-y);
  opacity:0;
  transition:opacity var(--rv-dur) var(--ease-out),
             transform var(--rv-dur) var(--ease-out),
             filter var(--rv-dur) var(--ease-out);
}
html.js .rv:not([data-rv]):not(.tilt){
  transform:translate3d(0,var(--rv-off),0);
  filter:blur(var(--rv-blur));
}
html.js .rv:not([data-rv]).in{--rv-off:0px;opacity:1}
html.js .rv:not([data-rv]):not(.tilt).in{filter:blur(0)}

/* ═════════════ Sticky graduate profile + timeline ═══════════════ */
.split{padding:clamp(4rem,11vw,9rem) var(--pad)}
.split__inner{
  max-width:var(--maxw);margin:0 auto;
  display:grid;
  grid-template-columns:minmax(0,.86fr) minmax(0,1.14fr);
  gap:clamp(2rem,6vw,6rem);
  align-items:start;
}
.profile__sticky{position:sticky;top:clamp(4rem,10vh,7rem)}

.portrait{
  position:relative;
  width:min(100%,340px);
  margin-bottom:2.4rem;
  border-radius:200px 200px var(--r) var(--r);
  overflow:hidden;
}
.portrait svg{width:100%;height:auto}
.portrait__sheen{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(112deg,transparent 34%,rgba(255,255,255,.11) 48%,transparent 62%);
  transform:translate3d(-110%,0,0);
  animation:sheen 9s var(--ease-out) 2.2s infinite;
}
@keyframes sheen{
  0%{transform:translate3d(-110%,0,0)}
  26%,100%{transform:translate3d(115%,0,0)}
}
.portrait__tassel{
  transform-box:fill-box;transform-origin:100% 0%;
  animation:tasselIdle 7s ease-in-out infinite;
}
@keyframes tasselIdle{
  0%,100%{transform:rotate(0deg)}
  30%{transform:rotate(calc(4.5deg * var(--drift)))}
  65%{transform:rotate(calc(-3deg * var(--drift)))}
}
.portrait__rings{
  transform-box:fill-box;transform-origin:50% 50%;
  animation:ringPulse 9s ease-in-out infinite alternate;
}
@keyframes ringPulse{
  from{opacity:.32;transform:scale(1)}
  to{opacity:.6;transform:scale(calc(1 + .035 * var(--drift)))}
}

.profile__name{
  font-size:clamp(2.4rem,4.6vw,3.5rem);
  letter-spacing:-.015em;
}
.profile__name em{
  display:block;font-style:italic;font-weight:400;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 52%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.profile__degree{
  margin-top:1rem;
  font-family:var(--ff-d);font-style:italic;
  font-size:1.16rem;color:var(--off);
}
.profile__uni{
  margin-top:.5rem;
  font-size:.86rem;letter-spacing:.1em;
  color:var(--dim);line-height:1.9;
}
.profile__uni b{color:var(--off);font-weight:400}
.honour{color:var(--gold-lt)}

.stats{
  display:grid;grid-template-columns:1fr 1fr;
  gap:1px;margin-top:2.4rem;
  background:var(--brd);
  border:1px solid var(--brd);
  border-radius:var(--r);
  overflow:hidden;
}
.stats li{
  padding:1.2rem 1rem;
  background:rgba(11,26,51,.66);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  transition:background-color .5s var(--ease);
}
.stats li:hover{background:rgba(27,56,96,.6)}
.stats__n{
  display:block;
  font-family:var(--ff-d);font-size:clamp(1.7rem,3.4vw,2.3rem);
  line-height:1;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 60%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  font-variant-numeric:tabular-nums;
}
.stats__k{
  display:block;margin-top:.5rem;
  font-size:.64rem;letter-spacing:.19em;text-transform:uppercase;
  color:var(--dimmer);
}

/* timeline */
.track{position:relative;padding-left:clamp(1.6rem,3vw,2.6rem)}
.track__head{margin-bottom:clamp(2.4rem,5vw,4rem)}

.rail{
  position:absolute;left:0;top:0;bottom:0;
  width:2px;
  background:linear-gradient(180deg,transparent,rgba(232,207,149,.16) 8%,rgba(232,207,149,.16) 92%,transparent);
}
.rail__fill{
  position:absolute;left:0;top:0;width:100%;height:100%;
  background:linear-gradient(180deg,var(--gold-lt),var(--gold) 40%,var(--gold-dp));
  transform:scaleY(0);transform-origin:50% 0;
  box-shadow:0 0 14px rgba(200,162,74,.55);
  will-change:transform;
}

.tl__item{
  position:relative;
  padding:0 0 clamp(2.6rem,5vw,4.2rem);
}
.tl__item:last-child{padding-bottom:0}
.tl__dot{
  position:absolute;
  left:calc(-1 * clamp(1.6rem,3vw,2.6rem) - 5px);
  top:.6rem;
  width:12px;height:12px;
  border-radius:50%;
  background:var(--navy-800);
  border:1.5px solid var(--brd-hi);
  transition:background-color .5s var(--ease),box-shadow .5s var(--ease),transform .5s var(--ease-out);
}
.tl__item.in .tl__dot{
  background:var(--gold);
  box-shadow:0 0 0 4px rgba(200,162,74,.14),0 0 18px rgba(200,162,74,.6);
  transform:scale(1.12);
}
.tl__year{
  font-family:var(--ff-b);
  font-size:.68rem;letter-spacing:.42em;
  color:var(--gold);
  margin-bottom:.55rem;
}
.tl__title{
  font-size:clamp(1.35rem,2.6vw,1.85rem);
  letter-spacing:-.005em;
  transition:letter-spacing .5s var(--ease);
}
.tl__item:hover .tl__title{letter-spacing:.028em}
.tl__body{
  margin-top:.7rem;max-width:44ch;
  color:var(--dim);font-size:.97rem;
}
.tl__item--gold .tl__title{
  font-style:italic;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 55%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}

/* ═══════════════════════ Quote moment ═══════════════════════════ */
.quote{
  position:relative;
  padding:clamp(5rem,15vw,11rem) var(--pad);
  text-align:center;
  overflow:hidden;
}
.quote::before{
  content:"";position:absolute;inset:0;
  background:
    linear-gradient(180deg,transparent,rgba(5,14,29,.62) 22%,rgba(5,14,29,.62) 78%,transparent),
    radial-gradient(60% 50% at 50% 50%,rgba(200,162,74,.1),transparent 70%);
  pointer-events:none;
}
.quote__mark{
  position:absolute;left:50%;top:clamp(1rem,6vw,4rem);
  width:clamp(90px,16vw,190px);height:auto;
  margin-left:calc(clamp(90px,16vw,190px) / -2);
  color:rgba(200,162,74,.13);
  animation:markFloat 12s ease-in-out infinite alternate;
}
@keyframes markFloat{
  from{transform:translate3d(0,0,0);opacity:.7}
  to{transform:translate3d(0,calc(-12px * var(--drift)),0);opacity:1}
}
/* The measure MUST live on the element that carries the display font-size.
   It was 22ch on this box, but `ch` resolves against the box's own inherited 16px body
   font — not the 96px on .quote__text inside it — so 22ch came out at ~217px. The quote
   then set 96px type into a 217px column: one word per line, forty lines, 1681px tall.
   Using em on .quote__text ties the measure to the type actually being set. */
.quote__box{position:relative;margin:0 auto;max-width:none}
.quote__text{
  display:block;
  max-width:13em;
  margin-inline:auto;
  text-wrap:balance;
  font-family:var(--ff-d);
  font-size:clamp(2.3rem,7.4vw,6rem);
  line-height:1.03;
  letter-spacing:-.022em;
}
.quote__text em{
  font-style:italic;
  background:linear-gradient(100deg,#fff6e2,var(--gold-lt) 30%,var(--gold) 70%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.qw{display:inline-block}
.quote__cite{
  display:block;margin-top:clamp(2rem,5vw,3.4rem);
  font-family:var(--ff-b);font-style:normal;
  font-size:.7rem;letter-spacing:.44em;text-transform:uppercase;
  color:var(--gold);
}
.quote__cite::before{content:"— "}

/* ═══════════════════ Frosted glass + tilt ═══════════════════════ */
.glass{
  position:relative;
  background:linear-gradient(148deg,var(--glass-2),var(--glass) 46%,rgba(255,255,255,.02));
  border:1px solid var(--brd);
  border-radius:var(--r);
  -webkit-backdrop-filter:blur(18px) saturate(135%);
  backdrop-filter:blur(18px) saturate(135%);
  box-shadow:0 22px 60px -34px rgba(0,0,0,.85), inset 0 1px 0 rgba(255,255,255,.06);
}
.card__edge{
  position:absolute;inset:-1px;
  border-radius:inherit;
  padding:1px;
  background:linear-gradient(128deg,var(--gold-lt),var(--gold) 32%,transparent 56%,transparent 74%,var(--gold-dp));
  /* Order matters. The `mask` shorthand RESETS mask-composite to `add`, so the composite
     mode has to come AFTER it. Declared before (as it was), the reset wins, the two mask
     layers add instead of excluding, nothing is cut out — and the whole gold gradient
     paints across the card on hover, burying the artwork and caption under a solid orange
     wash instead of drawing the 1px rim it is meant to. */
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask-composite:exclude;
  opacity:0;
  transition:opacity .5s var(--ease);
  pointer-events:none;
}
.glass:hover .card__edge,.glass:focus-within .card__edge{opacity:.9}

.tilt{
  transform:
    perspective(900px)
    rotateX(calc(var(--ry,0) * var(--tilt)))
    rotateY(calc(var(--rx,0) * var(--tilt)))
    translate3d(0,calc(var(--ty,0px) + var(--rv-off,0px)),0);
  transition:transform .62s var(--ease-out),box-shadow .5s var(--ease),border-color .5s var(--ease);
}
.tilt:hover,.tilt:focus-within{
  --ty:var(--lift);
  border-color:var(--brd-hi);
  box-shadow:0 34px 70px -34px rgba(0,0,0,.9),
             0 0 44px -14px rgba(200,162,74,.34),
             inset 0 1px 0 rgba(255,255,255,.09);
}
.tilt.is-pointing{transition:transform .1s linear,box-shadow .5s var(--ease),border-color .5s var(--ease)}

/* ═══════════════════════ Event details ══════════════════════════ */
.details{padding:clamp(4rem,10vw,8rem) var(--pad);max-width:var(--maxw);margin:0 auto}
.cards{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:clamp(1rem,2.2vw,1.6rem);
}
.card{padding:clamp(1.6rem,2.6vw,2.2rem)}
.card__icon{width:34px;height:34px;color:var(--gold);margin-bottom:1.5rem}
.card__icon svg{width:100%;height:100%}
.card__k{
  font-size:.64rem;letter-spacing:.4em;text-transform:uppercase;
  color:var(--dimmer);margin-bottom:.7rem;
}
.card__v{
  font-family:var(--ff-d);font-size:1.24rem;line-height:1.42;
}
.card__v em{
  font-style:italic;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 60%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.card__v--2{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--brd)}
.card__sub{
  display:block;font-family:var(--ff-b);
  font-size:.66rem;letter-spacing:.24em;text-transform:uppercase;
  color:var(--dimmer);margin-top:.3rem;
}
.card__note{
  margin-top:1.1rem;
  font-size:.85rem;color:var(--dim);line-height:1.7;
}

/* ═══════════════════════ Memory gallery ═════════════════════════ */
.memories{padding:clamp(4rem,10vw,8rem) var(--pad);max-width:var(--maxw);margin:0 auto}
.mem-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(270px,1fr));
  gap:clamp(1rem,2.2vw,1.6rem);
}
.mem{padding:1.2rem 1.2rem 1.5rem;overflow:hidden}
.mem__art{
  border-radius:10px;
  background:radial-gradient(120% 100% at 50% 0%,rgba(27,56,96,.75),rgba(8,21,42,.85));
  border:1px solid rgba(232,207,149,.1);
  color:var(--gold-lt);
  padding:.4rem;
  overflow:hidden;
}
.mem__art svg{
  width:100%;height:auto;
  transform:scale(1);
  transition:transform .8s var(--ease-out);
}
.mem:hover .mem__art svg{transform:scale(1.045)}
.mem__wash{opacity:.9}
.mem figcaption{
  display:flex;flex-direction:column;gap:.3rem;
  margin-top:1.1rem;
}
.mem figcaption b{
  font-family:var(--ff-d);font-weight:500;font-size:1.1rem;
  transition:letter-spacing .5s var(--ease);
}
.mem:hover figcaption b{letter-spacing:.03em}
.mem figcaption span{
  font-size:.64rem;letter-spacing:.22em;text-transform:uppercase;
  color:var(--dimmer);
}

/* ════════════════════════════ RSVP ══════════════════════════════ */
.rsvp{padding:clamp(4rem,10vw,8rem) var(--pad) clamp(5rem,10vw,8rem)}
.rsvp__wrap{max-width:820px;margin:0 auto}
.rsvp__panel{padding:clamp(1.6rem,4vw,3.2rem);overflow:hidden}

.form{display:grid;grid-template-columns:1fr 1fr;gap:1.3rem 1.4rem}
.field{display:flex;flex-direction:column;gap:.5rem;min-width:0}
.field--wide,.form__foot,.form__err--top{grid-column:1 / -1}

.field label{
  font-size:.66rem;letter-spacing:.26em;text-transform:uppercase;
  color:var(--dim);
}
.req{color:var(--gold)}

.field input,.field textarea,.field select{
  width:100%;
  padding:.85rem 1rem;
  background:rgba(5,14,29,.5);
  border:1px solid var(--brd);
  border-radius:9px;
  color:var(--off);
  font-family:var(--ff-b);font-size:.95rem;font-weight:300;
  transition:border-color .4s var(--ease),background-color .4s var(--ease),box-shadow .4s var(--ease);
}
.field textarea{resize:vertical;min-height:6.5rem;line-height:1.65}
.field input::placeholder,.field textarea::placeholder{color:rgba(238,235,226,.3)}
.field input:hover,.field textarea:hover,.field select:hover{border-color:rgba(232,207,149,.3)}
.field input:focus,.field textarea:focus,.field select:focus{
  outline:none;
  border-color:var(--gold);
  background:rgba(5,14,29,.75);
  box-shadow:0 0 0 3px rgba(200,162,74,.16);
}
.field input:focus-visible,.field textarea:focus-visible,.field select:focus-visible{outline:none}

.select{position:relative}
.select select{
  appearance:none;-webkit-appearance:none;
  padding-right:2.6rem;cursor:pointer;
}
.select select option{background:var(--navy-800);color:var(--off)}
.select__arrow{
  position:absolute;right:1.1rem;top:50%;
  width:8px;height:8px;
  border-right:1.5px solid var(--gold);
  border-bottom:1.5px solid var(--gold);
  transform:translateY(-70%) rotate(45deg);
  pointer-events:none;
}

.form__hint{font-size:.74rem;color:var(--dimmer)}
.form__err{
  font-size:.76rem;color:#f0a8a0;letter-spacing:.02em;
}
.form__err--top{
  padding:.8rem 1rem;
  border:1px solid rgba(240,168,160,.34);
  border-radius:9px;
  background:rgba(240,168,160,.07);
}
.field.has-err input,.field.has-err textarea,.field.has-err select{
  border-color:rgba(240,168,160,.6);
}
.field.has-err{animation:nudge .4s var(--ease)}
@keyframes nudge{
  0%,100%{transform:translate3d(0,0,0)}
  25%{transform:translate3d(calc(-5px * var(--drift)),0,0)}
  75%{transform:translate3d(calc(5px * var(--drift)),0,0)}
}

.form__foot{
  display:flex;align-items:center;gap:1.4rem;flex-wrap:wrap;
  margin-top:.6rem;padding-top:1.4rem;
  border-top:1px solid var(--brd);
}
.form__fine{font-size:.74rem;color:var(--dimmer);max-width:30ch}

/* confirmation state */
.done{
  display:flex;flex-direction:column;align-items:center;text-align:center;
  gap:1.1rem;padding:1.5rem 0 .5rem;
}
.done__seal{width:96px;height:96px;color:var(--gold)}
.done__ring{stroke-dasharray:100;stroke-dashoffset:100;animation:draw 1.15s var(--ease-out) .05s forwards}
.done__tick{stroke-dasharray:100;stroke-dashoffset:100;animation:draw .55s var(--ease-out) .6s forwards}
.done__title{font-size:clamp(1.7rem,4vw,2.5rem)}
.done__title span{
  font-style:italic;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 60%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
.done__body{max-width:44ch;color:var(--dim)}
.done > *{opacity:0;animation:doneIn .8s var(--ease-out) forwards}
.done > *:nth-child(1){animation-delay:.02s}
.done > *:nth-child(2){animation-delay:.5s}
.done > *:nth-child(3){animation-delay:.62s}
.done > *:nth-child(4){animation-delay:.74s}
@keyframes doneIn{
  from{opacity:0;transform:translate3d(0,calc(var(--rv-y) * .5),0)}
  to{opacity:1;transform:translate3d(0,0,0)}
}

/* ═══════════════════════════ Footer ═════════════════════════════ */
.foot{
  padding:clamp(3rem,7vw,5rem) var(--pad) clamp(2.5rem,5vw,4rem);
  text-align:center;
}
.foot__rule{
  width:min(100%,var(--maxw));height:1px;margin:0 auto clamp(2.5rem,5vw,3.5rem);
  background:linear-gradient(90deg,transparent,var(--brd-hi) 50%,transparent);
}
.foot__mono{
  font-family:var(--ff-d);font-style:italic;
  font-size:2rem;letter-spacing:.14em;
  background:linear-gradient(100deg,var(--gold-lt),var(--gold) 55%,var(--gold-dp));
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  margin-bottom:1rem;
}
.foot__line{font-size:.78rem;letter-spacing:.2em;text-transform:uppercase;color:var(--dim)}
.foot__line--dim{color:var(--dimmer);margin-top:.4rem}
.foot__motto{
  margin-top:1.8rem;
  font-family:var(--ff-d);font-size:1rem;
  color:var(--gold);opacity:.8;
}

/* ═════════════════════════ Responsive ═══════════════════════════ */
@media (max-width:1024px){
  .split__inner{grid-template-columns:1fr;gap:3.5rem}
  .profile__sticky{position:static}
  .portrait{margin-inline:auto}
  .profile__name,.profile__degree,.profile__uni,.profile .eyebrow{text-align:center}
  .stats{max-width:520px;margin-inline:auto}
}

@media (max-width:640px){
  .form{grid-template-columns:1fr}
  .hero{padding-top:6.5rem}
  .hero__date{gap:.7rem;font-size:.66rem;letter-spacing:.24em}
  .quote__box{max-width:100%}
  .stats{grid-template-columns:1fr 1fr}
  .form__foot{flex-direction:column;align-items:stretch}
  .form__foot .btn{width:100%}
}

@media (max-width:380px){
  :root{--pad:1rem}
  .hero__name{font-size:3.1rem}
  .stats li{padding:1rem .7rem}
  .card{padding:1.3rem}
  .btn{padding:.9em 1.5em;font-size:.72rem;letter-spacing:.16em}
}

/* Coarse pointers get no tilt-follow — the hover state alone is enough. */
@media (hover:none){
  .tilt{--rx:0;--ry:0}
}

/* Print — a plain, legible invitation. */
@media print{
  .loader,.spot,.shafts,.grain,.nav,.scroll-cue{display:none !important}
  body{background:#fff;color:#111}
  .h-sect em,.hero__line--em,.stats__n,.card__v em{-webkit-text-fill-color:#8b6c28;color:#8b6c28}
}
