@font-face{font-family:BeVietnam;src:url('/assets/be-vietnam-400.ttf') format('truetype');font-weight:400;font-display:swap}@font-face{font-family:BeVietnam;src:url('/assets/be-vietnam-600.ttf') format('truetype');font-weight:600;font-display:swap}@font-face{font-family:DMSerif;src:url('/assets/dm-serif.ttf') format('truetype');font-style:normal;font-display:swap}@font-face{font-family:DMSerif;src:url('/assets/dm-serif-italic.ttf') format('truetype');font-style:italic;font-display:swap}
:root{--paper:#f5eddf;--ink:#3b2b23;--muted:#725846;--clay:#9e4d36;--card:rgba(255,252,245,.91)}*{box-sizing:border-box}html{scroll-snap-type:y mandatory;scroll-behavior:smooth;background:var(--paper)}body{margin:0;color:var(--ink);font-family:BeVietnam,sans-serif;overflow-x:hidden}#map{position:fixed;inset:0;width:100%;height:100%;z-index:0}.paper-grain{position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.36;mix-blend-mode:multiply;background-image:radial-gradient(rgba(75,54,40,.14) .7px,transparent .7px);background-size:7px 7px}.site-header{position:fixed;z-index:20;top:0;left:0;right:0;padding:28px 42px;pointer-events:none}.brand-mark span{display:block;font-size:9px;letter-spacing:.21em;text-transform:uppercase;color:#795e4b}.brand-mark strong{font:400 20px/1.2 DMSerif,serif}.chapter{position:relative;z-index:2;min-height:100svh;scroll-snap-align:start;scroll-snap-stop:always;padding:96px 4vw 72px;display:flex;align-items:center}.intro{justify-content:center;text-align:center}.intro-copy{max-width:620px}.eyebrow{margin:0 0 12px;color:var(--clay);font-size:11px;font-weight:600;letter-spacing:.22em;text-transform:uppercase}.intro h1{margin:0;font:400 clamp(66px,8vw,116px)/.86 DMSerif,serif;letter-spacing:-.045em}.intro h1 em,h2 em{color:#a95339;font-weight:400}.lead{max-width:520px;margin:28px auto 0;font:400 22px/1.5 DMSerif,serif;color:#664e3d}.city{display:grid;grid-template-columns:minmax(260px,.7fr) minmax(540px,1.4fr);gap:8vw}.city-title{align-self:end;padding-bottom:4vh;max-width:390px}.city-title h2,.gift h2{margin:0;font:400 clamp(42px,4.2vw,64px)/.98 DMSerif,serif}.city-title>p:last-child{font-size:13px;line-height:1.7;color:var(--muted)}.wish-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;max-height:76vh;align-content:center}.wish-card{display:flex;gap:11px;align-items:center;min-height:74px;padding:10px 12px;border:1px solid rgba(104,75,55,.13);border-radius:10px;background:var(--card);box-shadow:0 14px 34px rgba(74,47,31,.11);opacity:0;transform:translateY(22px) rotate(-1deg);transition:opacity .5s ease,transform .65s cubic-bezier(.2,.8,.2,1);transition-delay:var(--delay)}.chapter.active .wish-card{opacity:1;transform:translateY(0) rotate(0)}.avatar{position:relative;flex:0 0 43px;width:43px;height:43px;border-radius:50%;background:linear-gradient(145deg,#ffe1c4 10%,#d59670 83%);box-shadow:inset -7px -8px 11px rgba(89,49,30,.2),inset 4px 4px 8px rgba(255,255,255,.65),0 7px 13px rgba(69,41,27,.16)}.avatar:before{content:'';position:absolute;left:6px;right:6px;top:-2px;height:19px;border-radius:22px 22px 9px 9px;background:var(--hair)}.avatar:after{content:'••';position:absolute;inset:18px 0 auto;text-align:center;padding-left:7px;letter-spacing:7px;font:700 12px/1 sans-serif;color:#493229;text-shadow:0 10px 0 #aa5b55}.avatar.female-long:before{left:2px;right:2px;height:34px;box-shadow:-3px 8px 0 -1px var(--hair),3px 8px 0 -1px var(--hair)}.avatar.female-bun:before{box-shadow:12px -8px 0 -5px var(--hair)}.avatar.male-short:before{top:0;height:13px;border-radius:15px 15px 4px 4px}.avatar.male-wave:before{height:16px;border-radius:70% 30% 50% 20%;transform:rotate(-4deg)}.wish-text{min-width:0}.wish-text strong{display:block;color:var(--clay);font-size:10px;margin-bottom:3px}.wish-text p{margin:0;color:#4f3b2f;font-size:9px;line-height:1.38}.saigon .wish-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.saigon .wish-card{min-height:63px;padding:7px}.saigon .avatar{flex-basis:34px;width:34px;height:34px}.saigon .wish-text p{font-size:7.7px}.gift{flex-direction:column;justify-content:center;text-align:center}.gift-copy{z-index:2}.tickets{position:relative;width:min(900px,76vw);height:330px;margin:32px auto 0}.ticket{position:absolute;margin:0;width:82%;padding:9px;background:#fffaf0;border:1px solid rgba(87,57,39,.16);border-radius:12px;box-shadow:0 28px 70px rgba(78,45,27,.22)}.ticket img{display:block;width:100%;border-radius:7px}.ticket-out{left:0;top:5px;transform:rotate(-3deg)}.ticket-return{right:0;bottom:0;transform:rotate(3deg)}.seal{position:absolute;z-index:4;left:50%;top:52%;transform:translate(-50%,-50%) rotate(-8deg);width:76px;height:76px;border:7px solid var(--paper);border-radius:50%;display:grid;place-items:center;background:var(--clay);color:#fff8ed;font:36px DMSerif;box-shadow:0 12px 28px rgba(83,45,28,.25)}.gift-note{margin:20px 0 0;font:19px/1.45 DMSerif,serif}.reveal{opacity:0;transform:translateY(24px);transition:opacity .7s ease,transform .8s cubic-bezier(.2,.8,.2,1)}.chapter.active .reveal{opacity:1;transform:none}.scroll-cue{position:fixed;z-index:25;left:50%;bottom:20px;transform:translateX(-50%);display:flex;align-items:center;gap:10px;color:#71594a;font-size:9px;letter-spacing:.17em;text-transform:uppercase}.scroll-cue i{width:18px;height:30px;border:1px solid rgba(75,55,42,.4);border-radius:999px;position:relative}.scroll-cue i:after{content:'';position:absolute;left:7px;top:6px;width:3px;height:6px;border-radius:99px;background:var(--clay);animation:scroll 1.8s infinite}.dots{position:fixed;z-index:25;right:24px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:10px}.dots button{width:10px;height:10px;border:1px solid var(--clay);border-radius:50%;padding:0;background:transparent;cursor:pointer}.dots button.active{background:var(--clay)}@keyframes scroll{50%{transform:translateY(7px);opacity:.4}}
@media(max-width:760px){html{scroll-snap-type:y mandatory}.site-header{padding:18px 18px}.brand-mark strong{font-size:17px}.chapter{padding:76px 12px 68px;min-height:100svh}.intro h1{font-size:62px}.lead{font-size:17px;max-width:310px}.city{display:flex;flex-direction:column;gap:12px;align-items:stretch}.city-title{align-self:auto;padding:0}.city-title h2{font-size:32px}.city-title>p:last-child{display:none}.wish-grid,.saigon .wish-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:5px;max-height:none;flex:1}.wish-card,.saigon .wish-card{min-height:58px;padding:5px;gap:6px;border-radius:7px}.avatar,.saigon .avatar{flex-basis:28px;width:28px;height:28px}.avatar:before{left:3px;right:3px;height:12px}.avatar:after{inset:11px 0 auto;font-size:7px;letter-spacing:4px;padding-left:4px;text-shadow:0 7px 0 #aa5b55}.wish-text strong{font-size:7px}.wish-text p,.saigon .wish-text p{font-size:6.4px;line-height:1.2}.saigon .wish-grid{gap:4px}.saigon .wish-card{min-height:45px}.saigon .city-title h2{font-size:27px}.gift h2{font-size:36px}.tickets{width:360px;height:290px;margin-top:26px}.ticket{width:410px;padding:6px}.ticket-out{left:-40px;top:30px;transform:rotate(-6deg)}.ticket-return{right:-40px;bottom:20px;transform:rotate(6deg)}.seal{width:58px;height:58px;font-size:27px}.gift-note{font-size:16px;max-width:330px}.dots{right:8px}.scroll-cue span{display:none}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.reveal,.wish-card{transition:none}.scroll-cue i:after{animation:none}}

/* Vietnamese display copy uses the complete local Vietnamese glyph set. */
.brand-mark strong{font-family:BeVietnam,sans-serif;font-weight:600}
.lead{max-width:560px;font-family:BeVietnam,sans-serif;font-size:20px;font-weight:600;line-height:1.55}
.city-title{max-width:410px}
.city-title h2,.gift h2{font-family:BeVietnam,sans-serif;font-weight:600;line-height:1.08;letter-spacing:-.035em}
.intro h1 em,h2 em{font-weight:600}
.gift-note{font-family:BeVietnam,sans-serif;font-weight:400;line-height:1.55}
@media(max-width:760px){.lead{font-size:16px}.city-title h2{font-size:30px}.saigon .city-title h2{font-size:26px}.gift h2{font-size:34px}}

.intro{justify-content:flex-start;text-align:left;padding-left:10vw}
.intro-copy{position:relative;z-index:4;max-width:560px}
.intro .lead{margin-left:0;margin-right:0;max-width:510px}
.birthday-girl{position:absolute;z-index:3;right:5vw;bottom:0;width:min(43vw,620px);height:91svh;margin:0;display:flex;align-items:flex-end;justify-content:center;pointer-events:none;filter:drop-shadow(0 28px 42px rgba(62,37,24,.18))}
.birthday-girl:before{content:'';position:absolute;z-index:-1;right:3%;bottom:8%;width:75%;height:70%;border-radius:50%;background:rgba(218,143,93,.18);filter:blur(1px)}
.birthday-girl img{display:block;max-width:100%;max-height:100%;object-fit:contain;object-position:center bottom}
@media(max-width:900px){.intro{justify-content:center;text-align:center;padding-left:18px;padding-right:18px;align-items:flex-start;padding-top:19svh}.intro-copy{z-index:5}.intro .lead{margin-left:auto;margin-right:auto;max-width:330px}.birthday-girl{right:-18vw;width:92vw;height:61svh;opacity:.48}.birthday-girl:after{content:'';position:absolute;inset:-10% -20% 0;background:linear-gradient(180deg,var(--paper) 0%,rgba(245,237,223,.38) 45%,transparent 76%)}.birthday-girl img{position:relative;z-index:-1}}

.city:before{content:'';position:absolute;z-index:-1;inset:8% 2.5%;border-radius:28px;background:linear-gradient(90deg,rgba(245,237,223,.94) 0%,rgba(245,237,223,.7) 45%,rgba(245,237,223,.25) 100%);pointer-events:none}
.city-title{position:relative;z-index:4;padding-left:1vw}
.wish-grid{position:relative;z-index:4}
@media(max-width:760px){.city:before{inset:7% 7px 6%;border-radius:18px;background:rgba(245,237,223,.82)}.city-title{padding-left:4px}}

/* Birthday-card hero: the Vietnam map remains behind Thu Trang. */
.intro:before{content:'';position:absolute;z-index:1;left:50%;top:50%;width:min(58vw,820px);aspect-ratio:1;border:1px solid rgba(158,77,54,.15);border-radius:50%;transform:translate(-50%,-48%);box-shadow:0 0 0 48px rgba(255,247,232,.16),0 0 0 96px rgba(158,77,54,.035);pointer-events:none}
.celebration-decor{position:absolute;z-index:5;inset:0;pointer-events:none;overflow:hidden}.spark{position:absolute;width:18px;height:18px;animation:twinkle 2.8s ease-in-out infinite}.spark:before,.spark:after{content:'';position:absolute;left:8px;top:0;width:2px;height:18px;border-radius:99px;background:#c58b3f}.spark:after{transform:rotate(90deg)}.spark-one{left:7vw;top:24vh}.spark-two{right:7vw;top:20vh;transform:scale(.7);animation-delay:-1.1s}.spark-three{left:43vw;bottom:13vh;transform:scale(.55);animation-delay:-2s}.ribbon{position:absolute;width:54px;height:24px;border-top:3px solid #b75c3d;border-radius:50%;transform:rotate(-24deg)}.ribbon-one{left:29vw;top:16vh}.ribbon-two{right:3vw;bottom:19vh;transform:rotate(34deg)}
@keyframes twinkle{0%,100%{opacity:.45}50%{opacity:1}}
.chapter.active .wish-card{opacity:0!important;transform:translateY(22px) rotate(-1deg)!important;transition-delay:0s!important}.chapter.active .wish-card.shown{opacity:1!important;transform:translateY(0) rotate(0)!important}
.wish-card.shown{opacity:1!important;transform:translateY(0) rotate(0)!important}
@media(max-width:900px){.intro{padding-top:15svh}.intro:before{width:108vw;top:55%}.birthday-girl{right:-13vw;width:88vw;height:62svh;opacity:.72}.spark-one{left:8vw;top:35vh}.spark-two{right:9vw;top:29vh}.spark-three{left:18vw;bottom:15vh}.ribbon-one{left:5vw;top:19vh}.ribbon-two{right:2vw;bottom:11vh}}
@media(prefers-reduced-motion:reduce){.chapter.active .wish-card{opacity:1!important;transform:none!important}}
.avatar.real{background-image:var(--avatar);background-size:cover;background-position:center;border:2px solid rgba(255,252,245,.92);box-shadow:0 6px 15px rgba(69,41,27,.2)}.avatar.real:before,.avatar.real:after{display:none}
.card-cover{position:fixed;z-index:100;inset:0;display:grid;place-items:center;overflow:hidden;background:#f5eddf;transition:opacity .8s ease,visibility .8s ease}.card-cover.opened{opacity:0;visibility:hidden;pointer-events:none}.cover-sun{position:absolute;width:min(68vw,760px);aspect-ratio:1;border-radius:50%;background:#d68454;opacity:.2;box-shadow:0 0 0 48px rgba(214,132,84,.08),0 0 0 96px rgba(214,132,84,.04)}.cover-copy{position:relative;text-align:center;padding:28px}.cover-copy>p{margin:0 0 18px;color:#8e5038;font-size:11px;font-weight:600;letter-spacing:.2em;text-transform:uppercase}.cover-copy h1{margin:0;font:600 clamp(42px,5vw,72px)/1.07 BeVietnam,sans-serif;letter-spacing:-.045em}.cover-copy h1 em{color:#a95339;font-style:normal}.open-card{margin-top:36px;min-height:52px;padding:0 25px;border:1px solid #8f4a34;border-radius:999px;background:#9e4d36;color:#fff8ed;font:600 14px BeVietnam,sans-serif;cursor:pointer;box-shadow:0 14px 30px rgba(92,48,32,.2);transition:transform .25s ease,box-shadow .25s ease}.open-card:hover{transform:translateY(-2px);box-shadow:0 18px 38px rgba(92,48,32,.26)}.open-card span{display:inline-block;margin-left:12px}.card-cover:not(.opened)~#map,.card-cover:not(.opened)~main,.card-cover:not(.opened)~.scroll-cue,.card-cover:not(.opened)~.dots{visibility:hidden}
@media(max-width:760px){.cover-sun{width:125vw}.cover-copy{padding:24px}.cover-copy h1{font-size:42px}.open-card{margin-top:30px}}
body:not(.card-opened){overflow:hidden}
.boho-logo{display:block;object-fit:contain}.cover-logo{width:130px;max-height:42px;margin:0 auto 27px}.gift-logo{width:82px;max-height:26px;margin:17px auto 0;opacity:.72}.save-tickets{display:inline-flex;align-items:center;gap:12px;min-height:48px;margin-top:18px;padding:0 21px;border:1px solid #8f4a34;border-radius:999px;background:#9e4d36;color:#fff8ed;text-decoration:none;font-size:13px;font-weight:600;box-shadow:0 12px 26px rgba(92,48,32,.18)}.save-tickets:hover{transform:translateY(-2px)}
.general-wish{max-width:560px;margin:25px 0 0;font-size:20px;font-weight:600;line-height:1.5;color:#4f382c}.intro .lead{margin-top:13px;font-size:14px;font-weight:400;line-height:1.55;color:#7a5a47}
@media(max-width:760px){.cover-logo{width:112px;margin-bottom:24px}.save-tickets{margin-top:14px}.gift-logo{margin-top:12px}}
@media(max-width:760px){.general-wish{max-width:330px;margin:20px auto 0;font-size:16px}.intro .lead{margin-top:10px;font-size:12px}}
.wish-text p{white-space:pre-line}
.saigon .wish-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
/* Keep the map as atmosphere on the gift reveal, never over the tickets. */
#map{transition:opacity .7s ease}
body[data-stage="3"] #map{opacity:.13}
body[data-stage="3"] .scroll-cue{opacity:0;pointer-events:none}
.gift:before{content:'';position:absolute;z-index:-1;inset:5% 8%;border-radius:32px;background:rgba(245,237,223,.9);box-shadow:0 24px 80px rgba(86,50,31,.08);pointer-events:none}
.city-title{align-self:center;padding-bottom:0}
@media(max-width:760px){
  html{scroll-snap-type:none;scroll-behavior:auto}
  .chapter{scroll-snap-align:none;scroll-snap-stop:normal}
  .city{gap:18px;padding-top:78px;padding-bottom:54px}
  .city-title{align-self:auto;padding:0 4px}
  .city-title h2,.saigon .city-title h2{font-size:28px;line-height:1.08}
  .wish-grid,.saigon .wish-grid{grid-template-columns:1fr;overflow:visible;max-height:none;align-content:start;padding-right:0;flex:none}
  .wish-card,.saigon .wish-card{min-height:72px;padding:10px;gap:10px}
  .avatar,.saigon .avatar{flex-basis:42px;width:42px;height:42px}
  .wish-text strong{font-size:10px}
  .wish-text p,.saigon .wish-text p{font-size:9px;line-height:1.42}
  .gift{min-height:100svh;padding-top:70px;padding-bottom:70px}
  .gift:before{inset:5% 8px}
  .scroll-cue{transition:opacity .25s ease}
}
/* Prevent restored horizontal offsets and oversized decorative layers on phones. */
html,body{width:100%;max-width:100%;overflow-x:clip;overscroll-behavior-x:none}
body{touch-action:pan-y pinch-zoom}
main,.chapter,.gift{max-width:100vw;overflow-x:clip}
#map{pointer-events:none;touch-action:none}
@media(max-width:760px){
  .tickets{width:min(350px,92vw);max-width:92vw}
  .ticket{width:112%;max-width:none}
  .ticket-out{left:-6%;top:30px}
  .ticket-return{right:-6%;bottom:20px}
}
