:root{--ink:#080908;--paper:#f5f3e9;--acid:#e8ff55;--line:rgba(245,243,233,.75);--muted:rgba(245,243,233,.72);--display:Impact,Haettenschweiler,"Arial Narrow Bold","Arial Black",sans-serif;--sans:Inter,Arial,Helvetica,sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth;background:var(--ink)}body{margin:0;color:var(--paper);background:var(--ink);font-family:var(--sans);font-size:16px;line-height:1.45;overflow-x:hidden}button,a{font:inherit}a{color:inherit}.skip-link{position:fixed;z-index:100;top:1rem;left:1rem;transform:translateY(-200%);padding:.75rem 1rem;color:var(--ink);background:var(--acid)}.skip-link:focus{transform:translateY(0)}
.topbar{position:fixed;z-index:50;top:0;left:0;width:100%;height:52px;padding:0 clamp(18px,3vw,48px);display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.15);background:linear-gradient(180deg,rgba(8,9,8,.88),rgba(8,9,8,.15));backdrop-filter:blur(8px)}.brand{color:var(--acid);font-weight:900;letter-spacing:.08em;text-decoration:none}.topbar nav{display:flex;gap:clamp(14px,3vw,38px)}.topbar nav a{color:var(--paper);font-size:.78rem;letter-spacing:.12em;text-decoration:none;text-transform:uppercase}.topbar nav a:hover,.topbar nav a:focus-visible{color:var(--acid)}
.hero{position:relative;min-height:780px;display:grid;place-items:center;isolation:isolate;overflow:hidden;border-bottom:1px solid var(--line)}.hero:before{content:"";position:absolute;inset:0;z-index:-1;background:radial-gradient(circle at 50% 45%,rgba(95,48,22,.34),transparent 32%),linear-gradient(90deg,transparent,rgba(8,9,8,.45) 35%,rgba(8,9,8,.45) 65%,transparent)}.hero-meta{position:absolute;top:72px;font-size:.8rem;letter-spacing:.18em}.hero-meta--left{left:3vw}.hero-meta--center{left:50%;transform:translateX(-50%)}.hero-meta--right{right:3vw}.hero-content{position:relative;width:min(930px,92vw);padding-top:44px;text-align:center}.hero h1{margin:0;color:var(--acid);font-family:var(--display);font-size:clamp(6rem,15vw,12.8rem);line-height:.72;letter-spacing:-.035em;text-transform:uppercase}.hero h1 span{display:block}.age{position:absolute;top:4%;left:57%;z-index:2;font-family:Georgia,serif;font-style:italic;font-size:clamp(5.5rem,10vw,9rem);font-weight:400;transform:rotate(-7deg)}.hero-date{margin:2.4rem 0 .4rem;font-size:clamp(.9rem,1.8vw,1.15rem);letter-spacing:.28em}.hero-route{margin:0;font-size:clamp(1rem,2vw,1.35rem);letter-spacing:.08em}.hero-route i{padding:0 .55rem;font-style:normal;color:var(--acid)}.handwritten{font-family:"Bradley Hand","Comic Sans MS",cursive;font-style:italic;letter-spacing:.07em}.hero-note{margin:1.65rem 0 0;color:rgba(255,255,255,.9);font-size:clamp(.9rem,1.8vw,1.15rem);transform:rotate(-2deg)}.scroll-cue{position:absolute;right:3vw;bottom:30px;color:var(--muted);font-size:.75rem;letter-spacing:.12em;text-decoration:none;text-transform:uppercase}.scroll-cue span{padding-left:.5rem;color:var(--acid)}
.section-grid{display:grid;grid-template-columns:minmax(300px,.92fr) 1.38fr minmax(280px,.78fr);min-height:620px;border-bottom:1px solid var(--line)}.section-grid>*{position:relative;min-width:0;border-right:1px solid var(--line)}.section-grid>*:last-child{border-right:0}.content-panel{padding:clamp(34px,5vw,72px)}.section-number{position:absolute;top:18px;left:24px;font-size:.8rem;letter-spacing:.08em;color:var(--muted)}h2{margin:0;color:var(--acid);font-family:var(--display);font-size:clamp(3.3rem,6vw,6rem);line-height:.82;letter-spacing:-.02em;text-transform:uppercase}.workout-copy h2,.bar-copy h2{margin-top:24px}.content-panel p{max-width:38ch}.time{margin:1.35rem 0 1.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:1.05rem;letter-spacing:.03em}.location{position:relative;display:block;margin-top:2rem;max-width:360px;padding:1rem 3.5rem 1rem 0;border-top:1px solid rgba(255,255,255,.3);text-decoration:none}.location strong{display:block;color:var(--acid);font-size:1.02rem}.location span{display:block;margin-top:.25rem;color:var(--muted);font-size:.86rem}.location b{position:absolute;right:0;top:50%;color:var(--acid);font-size:1.6rem;transform:translateY(-50%)}.location:hover b,.location:focus-visible b{transform:translate(4px,-54%)}
.childhood-photo{position:relative;margin:0;min-height:620px;overflow:hidden;background:#141816}.childhood-photo:after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,rgba(8,9,8,.28),transparent 35%),linear-gradient(0deg,rgba(8,9,8,.3),transparent 35%);mix-blend-mode:multiply}.childhood-photo img{width:100%;height:100%;object-fit:cover;object-position:50% 34%;filter:saturate(.72) contrast(1.05) brightness(.84)}.childhood-photo figcaption{position:absolute;z-index:1;right:26px;bottom:24px;color:white;font-size:1rem;transform:rotate(-4deg)}.packing{padding:72px 30px 0;overflow:hidden}.packing h2{font-size:clamp(2.8rem,4.7vw,4.7rem)}.packing p{font-size:1.05rem}.packing-image{position:absolute;left:0;right:0;bottom:0;height:52%;background:linear-gradient(0deg,rgba(8,9,8,.12),rgba(8,9,8,.5)),url("assets/gear.jpg") center/cover}
.ticker{overflow:hidden;padding:.8rem 0 .7rem;color:var(--ink);background:var(--acid);font-family:var(--display);font-size:1.15rem;letter-spacing:.05em;white-space:nowrap}.ticker div{width:max-content;animation:ticker 24s linear infinite}@keyframes ticker{to{transform:translateX(-50%)}}
.bar-section{display:grid;grid-template-columns:minmax(320px,.72fr) 1.5fr;min-height:560px;border-bottom:1px solid var(--line)}.bar-copy{position:relative;border-right:1px solid var(--line)}.bar-photo{position:relative;min-height:560px;background:linear-gradient(90deg,rgba(8,9,8,.12),rgba(8,9,8,.28)),url("assets/bar-table.jpg") center/cover}.bar-photo .handwritten{position:absolute;right:4vw;top:50px;font-size:1.35rem;line-height:1.5;transform:rotate(-8deg)}
.details-grid{display:grid;grid-template-columns:1fr .72fr 1.05fr;min-height:520px;border-bottom:1px solid var(--line)}.details-grid>*{position:relative;border-right:1px solid var(--line)}.details-grid>*:last-child{border-right:0}.gift h2,.rsvp h2{margin-top:20px;font-size:clamp(3rem,4.5vw,4.8rem)}.gift h3{margin:2rem 0;color:var(--acid);font-size:clamp(1.15rem,2vw,1.6rem);line-height:1.18}.cake-photo{min-height:520px;background:linear-gradient(0deg,rgba(8,9,8,.18),transparent),url("assets/cake.jpg") center/cover}.rsvp-options{display:grid;gap:10px;margin-top:1.3rem}.rsvp button{min-height:48px;padding:.7rem 1rem;border:1px solid var(--paper);border-radius:999px;color:var(--paper);background:transparent;cursor:pointer;transition:.2s ease}.rsvp-options button:hover,.rsvp-options button:focus-visible,.rsvp-options button[aria-pressed=true]{color:var(--ink);border-color:var(--acid);background:var(--acid)}.rsvp .share-answer{margin-top:12px;width:100%;color:var(--ink);border-color:var(--paper);background:var(--paper);font-weight:800}.rsvp .share-answer:disabled{opacity:.35;cursor:not-allowed}.response-status{min-height:1.4em;color:var(--acid);font-size:.85rem}
.finale{position:relative;min-height:610px;display:grid;grid-template-columns:1.2fr 1fr;overflow:hidden}.party-photo{min-height:610px;background:linear-gradient(90deg,transparent 40%,var(--ink)),linear-gradient(0deg,rgba(8,9,8,.5),transparent),url("assets/party.jpg") center/cover;filter:grayscale(1) contrast(1.15)}.finale-content{align-self:center;padding:60px 6vw 60px 0}.finale-content h2{font-size:clamp(4.8rem,8vw,8rem)}.finale-content .handwritten{margin:2rem 0;font-size:1.2rem;text-align:center;transform:rotate(-3deg)}.calendar-button{padding:.85rem 1.25rem;border:1px solid var(--paper);border-radius:999px;color:var(--paper);background:transparent;cursor:pointer;letter-spacing:.05em}.calendar-button:hover,.calendar-button:focus-visible{color:var(--ink);border-color:var(--acid);background:var(--acid)}.finale-meta{position:absolute;right:26px;top:24px;text-align:right;font-size:.75rem;letter-spacing:.15em}
.reveal{opacity:1;transform:none}.reveal.is-visible{animation:fade-up .7s ease both}@keyframes fade-up{from{opacity:0;transform:translateY(22px)}to{opacity:1;transform:none}}:focus-visible{outline:3px solid var(--acid);outline-offset:4px}
@media(max-width:900px){.hero{min-height:700px}.hero h1{font-size:clamp(5.3rem,19vw,9rem)}.section-grid{grid-template-columns:1fr 1.25fr}.packing{grid-column:1/-1;min-height:420px;border-top:1px solid var(--line)}.packing-image{left:50%;height:100%}.bar-section{grid-template-columns:1fr 1.15fr}.details-grid{grid-template-columns:1fr 1fr}.rsvp{grid-column:1/-1;border-top:1px solid var(--line)}}
@media(max-width:640px){body{font-size:16px}.topbar{height:48px}.topbar nav{gap:14px}.topbar nav a{font-size:.68rem}.hero{min-height:720px;padding:80px 16px 45px}.hero-meta{top:66px;font-size:.62rem}.hero-meta--center{display:none}.hero h1{font-size:clamp(5.3rem,25vw,8rem);line-height:.76}.age{top:8%;left:60%;font-size:5.8rem}.hero-date{margin-top:2rem}.hero-note{margin-top:2rem}.scroll-cue{display:none}.section-grid,.bar-section,.details-grid,.finale{display:block}.section-grid>*,.bar-section>*,.details-grid>*{border-right:0;border-bottom:1px solid var(--line)}.content-panel{padding:56px 24px 42px}h2{font-size:clamp(3.4rem,16vw,5.5rem)}.childhood-photo{min-height:520px}.packing{min-height:520px;padding:70px 24px 0}.packing-image{left:0;height:55%}.bar-photo{min-height:420px}.bar-photo .handwritten{top:28px}.cake-photo{min-height:380px}.finale{min-height:auto}.party-photo{min-height:360px;background:linear-gradient(0deg,var(--ink),transparent 55%),url("assets/party.jpg") center/cover}.finale-content{padding:12px 24px 86px}.finale-content h2{font-size:clamp(4.2rem,18vw,6.8rem)}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.ticker div{animation:none}.reveal{opacity:1;transform:none;transition:none}}

/* Softer editorial joins, drawn arrows, and integrated portrait treatment. */
.topbar{border-bottom-color:rgba(232,255,85,.12)}
.hero{border-bottom:10px solid #111410}
.section-grid,.bar-section,.details-grid{gap:10px;background:#111410;border-bottom:10px solid #111410}
.section-grid>*,.details-grid>*,.bar-copy{border-right:0;background:var(--ink)}
.location{border-top:0;background:linear-gradient(90deg,rgba(232,255,85,.2),transparent) top left/100% 1px no-repeat}
.location b{width:42px;height:42px;display:grid;place-items:center;color:var(--paper);font-size:1rem}
.location:hover b,.location:focus-visible b{transform:translate(4px,-54%)}
.drawn-arrow{position:relative;display:inline-block;width:2.15em;height:1em;color:var(--paper);vertical-align:-.15em;transform-origin:center}
.drawn-arrow:before{content:"";position:absolute;left:.08em;right:.08em;top:50%;border-top:1.6px solid currentColor}
.drawn-arrow:after{content:"";position:absolute;right:.08em;top:calc(50% - .25em);width:.48em;height:.48em;border-top:1.6px solid currentColor;border-right:1.6px solid currentColor;transform:rotate(45deg)}
.drawn-arrow--up-right{transform:rotate(-45deg)}
.drawn-arrow--down{width:2.4em;transform:rotate(90deg)}
.hero-route .drawn-arrow{margin:0 .6rem;width:2.7em}
.scroll-cue .drawn-arrow{margin-left:.5rem;width:2.2em;color:#fff!important}
.location .drawn-arrow{color:#fff!important}

@media(max-width:640px){
  .section-grid,.bar-section,.details-grid{min-height:0}
  .section-grid>*,.bar-section>*,.details-grid>*{min-height:0}
  .content-panel{padding:48px 22px 32px}
  .workout-copy,.bar-copy,.gift,.rsvp{min-height:0}
  .location{margin-top:1.35rem;padding-top:.85rem;padding-bottom:.2rem}
  .childhood-photo{min-height:0;height:auto;aspect-ratio:5/4}
  .childhood-photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 35%}
  .childhood-photo figcaption{right:18px;bottom:14px;font-size:.86rem}
  .packing{min-height:0;padding:52px 22px 0}
  .packing-image{position:relative;left:auto;right:auto;bottom:auto;height:245px;margin:26px -22px 0}
  .bar-photo{min-height:0;height:auto;aspect-ratio:5/4}
  .gift{padding-bottom:34px}
  .cake-photo{min-height:0;height:auto;aspect-ratio:4/3;margin:0;overflow:hidden;background:none}
  .cake-photo img{display:block;width:100%;height:100%;object-fit:cover;object-position:center}
  .rsvp{padding-top:48px;padding-bottom:42px}
  .finale-content{padding-top:20px}
}
.childhood-photo{background:#080908;isolation:isolate}
.childhood-photo:before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:radial-gradient(ellipse at 51% 45%,transparent 52%,rgba(8,9,8,.05) 72%,rgba(8,9,8,.42) 100%),linear-gradient(90deg,rgba(8,9,8,.55) 0%,transparent 10%,transparent 90%,rgba(8,9,8,.55) 100%),linear-gradient(0deg,rgba(8,9,8,.48) 0%,transparent 14%,rgba(8,9,8,.1) 100%)}
.childhood-photo:after{z-index:1;background:linear-gradient(135deg,rgba(232,255,85,.055),transparent 42%);mix-blend-mode:screen}
.childhood-photo img{filter:saturate(.7) contrast(1.06) brightness(.96);object-position:50% 32%;transform:scale(1.025)}
.childhood-photo figcaption{z-index:2;text-shadow:0 2px 12px #000}
.ticker i{display:inline-block;margin:0 .85em;font-family:Arial,sans-serif;font-size:.8em;font-style:normal;transform:translateY(-.08em)}
@media(max-width:900px){.packing,.rsvp{border-top:10px solid #111410}}
@media(max-width:640px){.section-grid,.bar-section,.details-grid{gap:0;padding:0}.section-grid>*,.bar-section>*,.details-grid>*{border-right:0;border-bottom:10px solid #111410}.childhood-photo:before{background:radial-gradient(ellipse at 52% 42%,transparent 52%,rgba(8,9,8,.08) 72%,rgba(8,9,8,.58) 100%),linear-gradient(0deg,rgba(8,9,8,.58) 0%,transparent 14%,rgba(8,9,8,.12) 100%)}.hero-route .drawn-arrow{margin:0 .3rem;width:1.6em}}

/* Mobile joins rely on rhythm and image contrast, without separator bars. */
@media(max-width:640px){
  .hero,.section-grid,.bar-section,.details-grid{border-bottom:0}
  .section-grid,.bar-section,.details-grid{gap:0;background:var(--ink)}
  .section-grid>*,.bar-section>*,.details-grid>*,.packing,.rsvp{border:0}
  .childhood-photo{background:var(--ink)}
  .childhood-photo:before{background:radial-gradient(ellipse at 52% 42%,transparent 56%,rgba(8,9,8,.04) 78%,rgba(8,9,8,.28) 100%)}
  .childhood-photo img{filter:saturate(.76) contrast(1.03) brightness(1.02);transform:scale(1.015)}
  .packing-image{height:260px;background-image:linear-gradient(0deg,rgba(8,9,8,.08),rgba(8,9,8,.18)),url("assets/gear.jpg");background-position:center 54%}
  .cake-photo img{object-position:center 48%}
  .calendar-button{display:block;margin:0 auto}
}

/* Latest local refinement: stronger portrait, typographic accents, clean cake crop. */
.hero-note-highlight{color:var(--acid);font-weight:800;text-shadow:0 0 18px rgba(232,255,85,.22)}
.childhood-photo img{filter:saturate(.92) contrast(1.06) brightness(1.03)}
.ticker i{margin:0 .72em;font-family:Georgia,"Times New Roman",serif;font-size:.92em;transform:translateY(-.02em)}
.cake-photo{position:relative;margin:0;overflow:hidden;background:var(--ink)}
.cake-photo img{display:block;width:100%;height:100%;object-fit:cover;object-position:center}
.cake-photo:after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(8,9,8,.12),transparent 22%,transparent 74%,rgba(8,9,8,.3)),linear-gradient(90deg,rgba(8,9,8,.14),transparent 18%,transparent 82%,rgba(8,9,8,.14))}
.rsvp-note{padding-left:14px;border-left:2px solid var(--acid);color:var(--muted);font-size:.94rem}
@media(max-width:640px){
  .childhood-photo img{filter:saturate(.98) contrast(1.06) brightness(1.06)}
  .cake-photo img{object-position:center}
  .cake-photo:after{background:linear-gradient(180deg,rgba(8,9,8,.1),transparent 20%,transparent 78%,rgba(8,9,8,.24))}
}

/* Full boxing-gym hero, uncropped finale lettering, Y2K sparkles in the ticker. */
.hero-photo{position:absolute;inset:0;z-index:-2;background:url("assets/hero.jpg") center/cover;filter:saturate(.95) contrast(1.08) brightness(1.08)}
.hero:before{background:radial-gradient(ellipse 34% 52% at 50% 50%,rgba(8,9,8,.78),rgba(8,9,8,.5) 55%,transparent 100%),linear-gradient(0deg,rgba(8,9,8,.55),transparent 28%),linear-gradient(180deg,rgba(8,9,8,.5),transparent 18%)}
.hero-aside{position:absolute;top:30%;right:5vw;margin:0;color:rgba(245,243,233,.85);font-size:1.05rem;line-height:1.35;text-align:center;transform:rotate(-8deg)}
.finale{min-height:520px}
.party-photo{min-height:520px;background:linear-gradient(90deg,transparent 78%,var(--ink)),linear-gradient(0deg,rgba(8,9,8,.4),transparent 35%),url("assets/party.jpg") 32% center/cover}
.ticker i.y2k-star{width:1.6em;height:1.75em;margin:-.3em .55em;vertical-align:-.4em;transform:none;background:currentColor;-webkit-mask:var(--y2k-star) center/contain no-repeat;mask:var(--y2k-star) center/contain no-repeat}
.ticker{--y2k-star:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 50'%3E%3Cpath d='M20 0C21 17 24 23 40 25C24 27 21 33 20 50C19 33 16 27 0 25C16 23 19 17 20 0Z'/%3E%3Cellipse cx='20' cy='25' rx='18.5' ry='6.5' transform='rotate(-24 20 25)' fill='none' stroke='%23000' stroke-width='2.6'/%3E%3Cpath d='M34 5C34.4 8.4 35.2 9.3 38 9.6C35.2 10 34.4 10.8 34 14C33.6 10.8 32.8 10 30 9.6C32.8 9.3 33.6 8.4 34 5Z'/%3E%3C/svg%3E")}
@media(max-width:900px){.hero-aside{display:none}.finale{display:block;min-height:0}.party-photo{min-height:0;aspect-ratio:16/9;background:linear-gradient(0deg,var(--ink),transparent 30%),url("assets/party.jpg") 32% center/cover}.finale-content{padding:24px 6vw 80px}}
@media(max-width:640px){
  .hero{place-items:end center}
  .hero-photo{background-size:230% auto;background-position:6% 48px;background-repeat:no-repeat;filter:saturate(.95) contrast(1.05) brightness(1.1)}
  .hero:before{background:linear-gradient(180deg,rgba(8,9,8,.3),rgba(8,9,8,.05) 20%,rgba(8,9,8,.3) 40%,var(--ink) 58%)}
  .party-photo{min-height:0;aspect-ratio:4/3;background:linear-gradient(0deg,var(--ink),transparent 30%),url("assets/party.jpg") 32% center/cover}
}

/* Venue: the courtyard gym, as a small film-photo collage next to the boxing block. */
.venue{display:grid;grid-template-columns:minmax(300px,.92fr) 2.16fr;gap:10px;background:#111410;border-bottom:10px solid #111410}
.venue>*{position:relative;min-width:0;background:var(--ink)}
.venue-copy h2{margin-top:24px;font-size:clamp(2.6rem,3.7vw,4.3rem)}
.venue-copy p{color:rgba(245,243,233,.86)}
.venue-address{margin-top:1.6rem;padding-top:.9rem;background:linear-gradient(90deg,rgba(232,255,85,.2),transparent) top left/100% 1px no-repeat;color:var(--acid)!important;font-size:.9rem;letter-spacing:.04em}
.venue-gallery{display:grid;grid-template-columns:1fr 1.3fr 1fr;gap:clamp(14px,2vw,26px);align-items:start;padding:clamp(34px,4vw,60px) clamp(20px,3vw,44px)}
.venue-shot{position:relative;margin:0;aspect-ratio:2/3;overflow:hidden;background:#141816;box-shadow:0 18px 40px rgba(0,0,0,.45);outline:1px solid rgba(245,243,233,.14);outline-offset:6px}
.venue-shot img{display:block;width:100%;height:100%;object-fit:cover;filter:saturate(.82) contrast(1.08) brightness(.95) sepia(.12);transition:transform .6s ease}
.venue-shot:hover img{transform:scale(1.035)}
.venue-shot:before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:radial-gradient(ellipse at 50% 45%,transparent 55%,rgba(8,9,8,.5) 100%),linear-gradient(0deg,rgba(8,9,8,.55),transparent 32%)}
.venue-shot:after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;opacity:.22;mix-blend-mode:overlay;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.venue-shot figcaption{position:absolute;z-index:2;left:16px;bottom:14px;color:#fff;font-size:1rem;text-shadow:0 2px 10px #000;transform:rotate(-3deg)}
.venue-shot--entrance{margin-top:48px;aspect-ratio:3/4}
.venue-shot--entrance img{object-position:58% center}
.venue-shot--entrance figcaption{color:var(--acid)}
.venue-shot--locker{margin-top:18px}
@media(max-width:900px){.venue{grid-template-columns:1fr}.venue-copy{padding-bottom:10px}}
@media(max-width:640px){
  .venue{gap:0;background:var(--ink);border-bottom:0}
  .venue-copy{padding:48px 22px 8px}
  .venue-gallery{grid-template-columns:1fr 1fr;gap:12px;padding:24px 16px 48px}
  .venue-shot{outline-offset:4px}
  .venue-shot--entrance{grid-column:1/-1;grid-row:1;margin-top:0;aspect-ratio:4/3}
  .venue-shot--locker{margin-top:0}
  .venue-shot figcaption{font-size:.9rem}
}
.venue .section-number{color:var(--acid);letter-spacing:.24em}

/* Crisp drop icon, CTA in the nav, starburst in the ticker, more air above block 02 on phones. */
.drop-icon{display:block;width:22px;height:30px;margin-top:18px;fill:none;stroke:var(--paper);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.topbar nav{align-items:center}
.topbar nav a.nav-cta{padding:.5rem 1rem;border-radius:999px;color:var(--ink);background:var(--acid);font-weight:700;box-shadow:0 0 18px rgba(232,255,85,.25);transition:transform .2s ease,box-shadow .2s ease}
.topbar nav a.nav-cta:hover,.topbar nav a.nav-cta:focus-visible{color:var(--ink);transform:translateY(-1px);box-shadow:0 0 26px rgba(232,255,85,.45)}
.ticker i.y2k-star{width:1.15em;height:1.15em;margin:0 .7em;vertical-align:-.16em}
.ticker{--y2k-star:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cg transform='translate(20 20)'%3E%3Crect x='-1.9' y='-20' width='3.8' height='40'/%3E%3Crect x='-1.9' y='-20' width='3.8' height='40' transform='rotate(30)'/%3E%3Crect x='-1.9' y='-20' width='3.8' height='40' transform='rotate(60)'/%3E%3Crect x='-1.9' y='-20' width='3.8' height='40' transform='rotate(90)'/%3E%3Crect x='-1.9' y='-20' width='3.8' height='40' transform='rotate(120)'/%3E%3Crect x='-1.9' y='-20' width='3.8' height='40' transform='rotate(150)'/%3E%3C/g%3E%3C/svg%3E")}
@media(max-width:900px){.packing{padding-top:96px}}
@media(max-width:640px){
  .topbar nav{gap:12px}
  .topbar nav a.nav-cta{padding:.42rem .75rem}
  .packing{margin-top:28px;padding-top:64px}
}
/* RSVP note: a hand-drawn, wobbly acid underline instead of the straight bar on the left. */
.rsvp-note{padding:0 0 20px;border-left:0;color:rgba(245,243,233,.88);background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 16' preserveAspectRatio='none'%3E%3Cpath d='M3 10C38 5 64 13 104 8S178 3 222 9 282 11 297 5' fill='none' stroke='%23e8ff55' stroke-width='2.2' stroke-linecap='round' vector-effect='non-scaling-stroke'/%3E%3Cpath d='M28 14C86 10 150 15 214 11S268 10 286 12' fill='none' stroke='%23e8ff55' stroke-width='1.4' stroke-linecap='round' opacity='.7' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") left bottom/100% 16px no-repeat}
/* Courtyard photo: a hand-drawn arrow from the caption to the Backyard door (photo is exactly 3:4, so the overlay lines up). */
.venue-shot--entrance,.venue-shot--entrance img{aspect-ratio:3/4}
.venue-shot--entrance img{object-position:center}
.entrance-arrow{position:absolute;inset:0;z-index:2;width:100%;height:100%;fill:none;stroke:var(--acid);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 1px 4px rgba(0,0,0,.7))}
@media(max-width:640px){.venue-shot--entrance{aspect-ratio:3/4}}

/* Desktop photo fixes: hero keeps (almost) the whole gym, the small source photos are shown
   as framed prints at close to their real size instead of being cropped and blown up. */
@media(min-width:901px){
  .hero{min-height:max(640px,37.6vw)}
  .hero-photo{background-position:center 40%}
  .childhood-photo,.cake-photo{display:flex;align-items:center;justify-content:center;padding:clamp(28px,3vw,48px);background:var(--ink)}
  .childhood-photo:before,.childhood-photo:after,.cake-photo:after{content:none}
  .childhood-photo img,.cake-photo img{position:static;width:100%;height:auto;object-fit:contain;transform:none;box-shadow:0 18px 40px rgba(0,0,0,.45);outline:1px solid rgba(245,243,233,.14);outline-offset:6px}
  .childhood-photo img{max-width:748px}
  .cake-photo img{max-width:420px}
  .childhood-photo figcaption{right:clamp(40px,4vw,64px);bottom:clamp(40px,4vw,64px)}
}
@media(min-width:901px){
  .childhood-photo{flex-direction:column;padding:28px}
  .childhood-photo figcaption{position:static;align-self:flex-end;margin:22px 8px 0 0;font-size:1.05rem}
}

/* Ticker: each half is four times the word set, wider than any screen, so the loop never shows a gap. */
.ticker div{animation-duration:96s}
.ticker span{display:inline}

/* Scroll-in motion. Content only starts hidden once the inline script has marked <html class="js">,
   so without JS (or with reduced motion) everything is simply visible. */
@media(prefers-reduced-motion:no-preference){
  .js .reveal,.js .reveal.is-visible{animation:none}
  .js .reveal{opacity:0;transform:translateY(34px);transition:opacity .9s cubic-bezier(.2,.7,.2,1),transform .9s cubic-bezier(.2,.7,.2,1)}
  .js .reveal.is-visible{opacity:1;transform:none}

  /* Text panels: children rise one after another. */
  .js .content-panel.reveal>*,.js .packing.reveal>*{opacity:0;transform:translateY(18px);transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.2,1)}
  .js .content-panel.reveal.is-visible>*,.js .packing.reveal.is-visible>*{opacity:1;transform:none}
  .js .content-panel.is-visible>:nth-child(2),.js .packing.is-visible>:nth-child(2){transition-delay:.08s}
  .js .content-panel.is-visible>:nth-child(3),.js .packing.is-visible>:nth-child(3){transition-delay:.16s}
  .js .content-panel.is-visible>:nth-child(4),.js .packing.is-visible>:nth-child(4){transition-delay:.24s}
  .js .content-panel.is-visible>:nth-child(5),.js .packing.is-visible>:nth-child(5){transition-delay:.32s}
  .js .content-panel.is-visible>:nth-child(6),.js .packing.is-visible>:nth-child(6){transition-delay:.4s}
  .js .content-panel.is-visible>:nth-child(n+7),.js .packing.is-visible>:nth-child(n+7){transition-delay:.48s}

  /* Photos: wipe open from the bottom while the picture settles from a slight zoom. */
  .js .reveal-photo{opacity:1;transform:none;clip-path:inset(100% 0 0 0);transition:clip-path 1.1s cubic-bezier(.7,0,.2,1)}
  .js .reveal-photo.is-visible{clip-path:inset(-40px)}
  .js .reveal-photo img{transform:scale(1.14);transition:transform 1.6s cubic-bezier(.2,.7,.2,1)}
  .js .reveal-photo.is-visible img{transform:none}
  .js .venue-shot--entrance.is-visible{transition-delay:.15s}
  .js .venue-shot--locker.is-visible{transition-delay:.3s}
  .js .venue-shot--entrance .entrance-arrow path{stroke-dasharray:400;stroke-dashoffset:400;transition:stroke-dashoffset 1s ease 1.2s}
  .js .venue-shot--entrance.is-visible .entrance-arrow path{stroke-dashoffset:0}
  .js .packing-image{clip-path:inset(100% 0 0 0);transition:clip-path 1.1s cubic-bezier(.7,0,.2,1) .35s}
  .js .packing.is-visible .packing-image{clip-path:inset(0)}
  .js .rsvp-note{background-size:0 16px;transition:background-size .9s ease .7s}
  .js .rsvp.is-visible .rsvp-note{background-size:100% 16px}

  /* Hero: title lines rise on load, the "26" drops in with a little swing. */
  .js .hero-content.reveal{opacity:1;transform:none}
  .js .hero h1 span{opacity:0;transform:translateY(60%);transition:opacity .8s ease,transform 1s cubic-bezier(.2,.8,.2,1)}
  .js .hero h1 span+span{transition-delay:.12s}
  .js .hero .age{opacity:0;transform:rotate(-30deg) scale(.6);transition:opacity .6s ease .55s,transform .9s cubic-bezier(.3,1.6,.5,1) .55s}
  .js .hero-content>p{opacity:0;transform:translateY(14px);transition:opacity .7s ease,transform .7s ease}
  .js .hero-content>.hero-date{transition-delay:.7s}
  .js .hero-content>.hero-route{transition-delay:.82s}
  .js .hero-content>.hero-note{transition-delay:.95s}
  .js .hero-content.is-visible h1 span,.js .hero-content.is-visible>p{opacity:1;transform:none}
  .js .hero-content.is-visible .age{opacity:1;transform:rotate(-7deg)}
  .js .hero-content.is-visible>.hero-note{transform:rotate(-2deg)}
  .js .hero-photo{transform:scale(1.08);transition:transform 2.4s cubic-bezier(.2,.7,.2,1)}
  .js .hero:has(.hero-content.is-visible) .hero-photo{transform:none}
}
