:root{--red:#c32a29;--ink:#542e08;--paper:#f8f3e0;--gold:#f8c88b}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:#fff;color:var(--ink);font:16px/1.5 Roboto,Arial,sans-serif}button,input,select,textarea{font:inherit}button,a,input,textarea,select{-webkit-tap-highlight-color:transparent}button,a{touch-action:manipulation}button{cursor:pointer}img{max-width:100%;height:auto;display:block}p,h1,h2,h3{margin:0}a{color:inherit}button:focus-visible,a:focus-visible{outline:3px solid #9e5c1b;outline-offset:4px}.sheet{position:relative;isolation:isolate;max-width:480px;margin:auto;overflow:hidden;background:var(--paper)}.sheet:before{content:'';position:absolute;inset:0;z-index:-2;pointer-events:none;background:url('assets/paper.webp') center top/100% auto repeat-y;opacity:.15}
.hero{position:relative;display:flex;flex-direction:column;align-items:center;padding-top:calc(clamp(75px,5vw + 45px,140px) + 30px)}.hero h1{position:relative;z-index:20;max-width:95%;text-align:center;font:400 clamp(20px,5.5vw,40px)/1.2 Bungee,sans-serif;color:var(--red);letter-spacing:.03em;-webkit-text-stroke:1px var(--gold);paint-order:stroke fill;text-transform:uppercase}.hero-art{position:relative;width:100%;max-width:480px;height:min(92vw,420px);margin-top:8px}.hero-art img{width:100%}.hero-art>div{position:absolute;pointer-events:none}.art-happiness{z-index:4;left:50%;top:calc(14% - 35px);width:75%;max-width:736px;transform:translateX(calc(-50% + 35px))}.art-fan{z-index:2;left:calc(18% - 65px);top:36%;width:55%;max-width:398px}.art-cloud{z-index:3;left:50%;top:calc(42% + 100px);width:85%;max-width:892px;transform:translateX(-50%)}.art-couple{z-index:9;left:50%;top:calc(22% + 40px);width:70%;max-width:653px;transform:translateX(-50%)}.art-words{z-index:10;left:calc(3% + 25px);top:calc(52% + 120px);font:400 clamp(28px,5vw,52px)/1 Bungee,sans-serif;text-align:center;color:#cd211c;-webkit-text-stroke:3px #fad9b0;paint-order:stroke fill}.art-flower{z-index:6;width:280px;max-width:100%;left:-40px;top:65px}.art-flower img{transform:scaleY(-1) rotate(20deg);transform-origin:top left}.art-lantern{z-index:7;width:8%;min-width:48px;max-width:63px;top:calc(4% - 180px);right:calc(6% - 15px)}
.body-content{position:relative;padding:280px 16px 32px}.body-content:before,.body-content:after{content:'';position:absolute;width:80%;height:900px;z-index:-1;opacity:.19;pointer-events:none;background:url('assets/may.webp') top center/contain no-repeat}.body-content:before{top:100px;left:-20%;transform:scaleX(-1)}.body-content:after{top:1800px;right:-25%}.section{position:relative;text-align:center;margin:0 auto 70px}.section h2{font:600 30px/1.5 Oswald,sans-serif;letter-spacing:.02em;text-transform:uppercase;color:var(--red);padding-top:10px}.section h3{font:600 16px/1.5 Oswald,sans-serif;text-transform:uppercase}.ceremony{display:flex;flex-direction:column;align-items:center;gap:40px}.families{display:grid;grid-template-columns:1fr 1fr;gap:24px;position:relative;max-width:366px;width:100%;padding:10px 0;text-align:center}.families:after{content:'';width:1px;height:50px;background:var(--ink);position:absolute;left:50%;top:calc(50% - 25px)}.families p{font-size:15px;margin-bottom:6px}.families strong{font-size:clamp(15px,4vw,20px);line-height:1.65;font-weight:700;overflow-wrap:anywhere}.families .family-address{font-size:13px;font-weight:400;margin-top:8px}.couple{font:400 clamp(24px,7vw,40px)/1.4 Bungee,sans-serif;color:var(--red);text-transform:uppercase;-webkit-text-stroke:3px var(--gold);paint-order:stroke fill;letter-spacing:.025em;padding:10px 0;width:100%}.couple span{display:block;font:58px/1.5 'Brush Ampersand',cursive;-webkit-text-stroke:0;margin:4px 0}.uppercase{font-size:16px;font-weight:700;text-transform:uppercase;line-height:1.8}.time{font-size:26px;line-height:1.5}.big-date{display:flex;align-items:center;justify-content:center;gap:12px;font-size:15px;font-weight:700;text-transform:uppercase}.big-date b{padding:0 16px;border-inline:1px solid var(--ink);font-size:38px;line-height:1}.year{font-size:23px;font-weight:700}.lunar{font-size:15px;font-weight:600}.ceremony .time{margin-top:-20px}.ceremony .big-date,.ceremony .year,.ceremony .lunar{margin-top:-20px}.ceremony:before,.ceremony:after,.party:before,.party:after{content:'';position:absolute;width:clamp(45px,15vw,80px);height:120px;background:url('assets/corner.webp') top left/contain no-repeat;pointer-events:none;z-index:-1;top:0}.ceremony:before,.party:before{left:0}.ceremony:after,.party:after{right:0;transform:scaleX(-1)}.party{display:flex;flex-direction:column;align-items:center;gap:20px;padding:10px 8px 35px}.party h2{margin-bottom:12px}.party .lunar{font-weight:400;letter-spacing:.15em;text-transform:uppercase}.calendar{width:296px;max-width:100%;border:1px solid #542e0845;border-radius:8px;overflow:hidden;margin:4px auto}.calendar h3{padding:10px;font:600 13px Roboto,sans-serif;border-bottom:1px solid #542e0845;text-transform:none}.week,.days{display:grid;grid-template-columns:repeat(7,1fr)}.week{font-size:10px;opacity:.65;border-bottom:2px solid var(--ink);padding:6px 0}.days{padding:8px 4px;row-gap:2px}.days>span{height:30px;display:grid;place-items:center;font-size:12px;position:relative}.days .selected{color:#fff;isolation:isolate;font-weight:700}.days .selected:before{content:'♥';position:absolute;font-size:33px;line-height:1;color:var(--ink);z-index:-1;top:0;left:50%;transform:translateX(-50%)}.button{display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:10px 24px;border:0;border-radius:6px;background:var(--red);color:var(--paper);font:500 14px/1.5 Roboto,sans-serif;text-transform:uppercase;letter-spacing:.025em;text-decoration:none;cursor:pointer}.party .button{margin:0}.party #rsvp-open{margin-top:3px}.location h2{font-size:30px}.location h3{margin:22px 0 12px;font-size:20px}.location p{font-size:15px;white-space:normal;line-height:1.7}.map{display:block;border:0;width:100%;height:300px;margin:24px auto 16px;border-radius:8px}.directions{background:var(--ink)}.dress-code p{margin:16px 0 20px;font-size:14px}.swatches{display:flex;justify-content:center;gap:16px}.swatches i{width:42px;height:42px;border-radius:50%;border:1px solid #542e0833}.timeline ol{list-style:none;padding:0;margin:40px auto 0;max-width:520px;text-align:left}.timeline li{display:grid;grid-template-columns:120px 1fr;gap:20px;position:relative;padding:0 0 42px 22px;border-left:1px solid #542e0844}.timeline li:before{content:'';position:absolute;left:-5px;top:5px;background:var(--red);width:9px;height:9px;border-radius:50%}.timeline b{font-family:Oswald,sans-serif;font-size:17px}.timeline span{font-size:14px}.wishes>p{margin:16px auto 20px;font-size:14px}.wishes form{max-width:560px;margin:auto;text-align:left}.wishes label{display:block;font-size:13px;margin:12px 0 6px}.wishes input,.wishes textarea,dialog input,dialog select{width:100%;border:1px solid #542e0855;background:#fff8;color:var(--ink);padding:12px;border-radius:8px;outline-offset:3px}.wishes .button{display:flex;margin:16px auto 0;background:var(--ink)}#wish-status,#rsvp-status{font-size:13px;margin-top:10px}#wish-list{text-align:left;max-width:560px;margin:24px auto 0;max-height:400px;overflow:auto}#wish-list article{padding:16px;border-radius:8px;border:1px solid #542e0822;margin:12px 0;background:#fff4;overflow-wrap:anywhere}#wish-list p{font-size:14px;margin-top:8px}.gifts h2{text-transform:none}.gift-box{position:relative;width:260px;height:280px;border:0;padding:0;margin:16px auto;background:none;display:block;outline-offset:4px}.gift-bob{position:absolute;left:30px;bottom:26px;width:200px;height:220px;animation:bob 3s ease-in-out infinite}.gift-shadow{position:absolute;left:28px;bottom:-8px;width:144px;height:12px;border-radius:50%;background:#0007;filter:blur(4px)}.box-image{position:absolute;bottom:0;left:15px;width:170px;max-height:220px;object-fit:contain;z-index:2;filter:drop-shadow(0 10px 18px #0004)}.mini{position:absolute;z-index:1;filter:drop-shadow(0 2px 3px #0004);animation:mini-float 3s ease-in-out infinite}.m1{left:-20px;top:10px;width:34px;--rotation:-22deg}.m2{left:168px;top:2px;width:38px;--rotation:20deg;animation-delay:-1s}.m3{left:-16px;top:120px;width:26px;--rotation:-18deg;animation-delay:-.5s}.m4{left:182px;top:114px;width:24px;--rotation:14deg;animation-delay:-2s}.m5{left:-8px;top:172px;width:44px;z-index:3;--rotation:8deg}.m6{left:26px;top:182px;width:26px;z-index:3;--rotation:-10deg;animation-delay:-1.5s}.m7{left:118px;top:176px;width:40px;z-index:3;--rotation:-14deg;animation-delay:-2.5s}.gift-box small{position:absolute;bottom:0;left:0;right:0;font-size:12px;font-weight:500;color:var(--ink)}.sparkles{position:absolute;top:8%;left:14%;color:var(--ink);font-size:22px;animation:twinkle 2s infinite}.sparkles:before{content:'✦';position:absolute;top:26px;left:160px;font-size:16px}.sparkles:after{content:'✦';position:absolute;top:65px;left:-20px;font-size:14px}.gift-box:hover .gift-bob{animation:wiggle .45s infinite}.gift-box.opening .gift-bob{animation:gift-open .4s ease-in forwards}.confetti{position:fixed;width:8px;height:12px;z-index:1000;pointer-events:none;animation:confetti .8s ease-out forwards}.thanks{font:italic 18px/1.7 Lora,serif;margin:40px 0 0}.gifts{margin-bottom:15px}footer{text-align:center;padding:15px 0 30px;font-size:12px}footer a{color:var(--red);text-decoration:none}
dialog{width:min(calc(100% - 32px),576px);max-height:90svh;overflow:auto;border:0;border-radius:16px;padding:0;color:var(--ink);background:var(--paper);box-shadow:0 25px 50px -12px #0004}dialog::backdrop{background:#0006}.gift-header{position:relative;padding:25px 24px 16px;background:var(--red);text-align:center}.gift-header h2{color:var(--paper);font:600 30px/1.5 Oswald,sans-serif}.close{position:absolute;top:12px;right:15px;color:inherit;background:none;border:0;font:26px/1 Roboto,sans-serif;opacity:.7;padding:5px}.gift-header .close{color:#fff}.gift-columns{display:grid;grid-template-columns:1fr 1fr;gap:24px;padding:24px 32px}.gift-columns article{text-align:center;min-width:0}.gift-columns h3{font:400 13px/1.5 Roboto,sans-serif;color:var(--red);margin:0 0 22px}.qr-frame{width:160px;height:160px;max-width:100%;margin:0 auto 8px;padding:10px;background:#fff;border-radius:12px;box-shadow:0 4px 10px #542e0826;border:2px solid #c32a291a;overflow:hidden}.qr{width:100%;height:100%;object-fit:contain}.gift-columns p{font:400 10px/1.8 Roboto,sans-serif}.gift-columns p b{font-weight:400}.gift-columns a{display:inline-block;margin:5px auto 0;border-radius:99px;padding:4px 9px;font-size:10px;background:#c32a290a;color:var(--red);text-decoration:none}.copy-account{display:block;border:0;background:none;color:var(--red);font-size:11px;text-decoration:underline;margin:0 auto 12px}#copy-status{text-align:center;font-size:12px;padding:0 12px 8px}#copy-status:empty{display:none}#rsvp-dialog{padding:32px;max-width:450px}#rsvp-dialog h2{font:600 27px Oswald,sans-serif;color:var(--red);text-align:center;margin:8px 0 24px}#rsvp-dialog label{display:block;margin:16px 0 6px;font-size:14px}#rsvp-dialog .button{display:flex;margin:24px auto 0}.music-toggle{position:fixed;right:24px;bottom:64px;z-index:20;background:var(--red);color:white;border:3px solid #e2625a;border-radius:50%;width:52px;height:52px;box-shadow:0 4px 10px #0003;font-size:24px}.music-toggle.playing{animation:music-pulse 2s infinite}
@keyframes bob{50%{transform:translateY(-8px)}}@keyframes mini-float{0%,100%{transform:translateY(0) rotate(var(--rotation))}50%{transform:translateY(-5px) rotate(var(--rotation))}}@keyframes twinkle{50%{opacity:.25;transform:scale(.8)}}@keyframes wiggle{25%{transform:rotate(-4deg)}75%{transform:rotate(4deg)}}@keyframes gift-open{50%{transform:translateY(-15px) scale(1.05)}100%{transform:translateY(0) scale(.98)}}@keyframes confetti{to{transform:translate(var(--dx),var(--dy)) rotate(300deg);opacity:0}}@keyframes music-pulse{50%{box-shadow:0 0 0 7px #c32a2922}}
@media(min-width:768px){.sheet{max-width:900px;border:1px solid #542e0822}.hero{padding-top:calc(clamp(75px,5vw + 45px,140px) + 50px)}.hero-art{max-width:769px;height:480px}.art-happiness{width:54.6%;max-width:416px;transform:translateX(calc(-50% + 50px))}.art-fan{left:calc(18% - 20px);top:calc(36% + 50px);width:29.9%;max-width:225px}.art-cloud{top:calc(42% + 140px);width:66.3%;max-width:504px}.art-couple{width:48.1%;max-width:369px}.art-words{left:calc(3% + 100px);-webkit-text-stroke:5px #fad9b0}.art-flower{width:320px;max-width:min(320px,46%);left:-48px;top:78px}.art-lantern{width:9.2%;min-width:63px;max-width:85px;top:calc(4% - 246px);right:calc(6% - 24px)}.body-content{padding:350px 40px 48px}.section{margin-bottom:90px}.section h2{padding-top:15px;font-size:35px}.ceremony{gap:64px}.families{max-width:520px;gap:48px;padding:15px 0}.families p{font-size:18px}.families strong{font-size:20px}.families .family-address{font-size:15px}.families:after{height:64px;top:calc(50% - 32px)}.couple{font-size:58px;-webkit-text-stroke:4px var(--gold);padding:15px 0}.couple span{font-size:77px;margin:8px 0}.uppercase{font-size:20px}.ceremony .time{margin-top:-44px;font-size:30px}.ceremony .big-date,.ceremony .year,.ceremony .lunar{margin-top:-44px}.big-date{gap:24px;font-size:20px}.big-date b{font-size:50px;padding:0 26px}.year{font-size:31px}.lunar{font-size:18px}.ceremony .year{font-size:26px}.ceremony .big-date b{font-size:42px}.ceremony .lunar{font-size:18px}.ceremony:before,.ceremony:after,.party:before,.party:after{width:clamp(68px,14vw,104px)}.party{gap:20px;padding:15px 40px 35px}.party h2{margin-bottom:28px}.party h3{font-size:20px}.party .time{font-size:38px}.calendar{width:352px}.calendar h3{font-size:14px}.week{font-size:11px}.days>span{height:34px;font-size:13px}.button{padding:12px 28px;font-size:16px}.location p{font-size:18px}.location h3{font-size:23px}.map{height:350px}.timeline li{grid-template-columns:150px 1fr}.timeline b{font-size:21px}.timeline span{font-size:17px}.thanks{font-size:22px}.gift-header h2{font-size:32px}.gift-header{padding:25px 24px 16px}.music-toggle{bottom:64px}}
@media(min-width:1024px){.hero .art-flower{width:456px;max-width:min(456px,53%);left:-56px;top:calc(86px - 1cm)}.art-lantern{min-width:67px;max-width:90px;top:calc(4% - 276px)}.body-content{padding-top:380px}.section h2{font-size:45px;padding-top:20px}.ceremony{gap:80px}.families{max-width:600px;padding:20px 0}.families p{font-size:19px}.families .family-address{font-size:16px}.couple{font-size:68px;-webkit-text-stroke:5px var(--gold);padding:20px 0}.couple span{font-size:86px}.ceremony .time,.ceremony .big-date,.ceremony .year,.ceremony .lunar{margin-top:-60px}.ceremony .year{font-size:28px}.ceremony .big-date{font-size:19px}.ceremony .big-date b{font-size:46px}.ceremony .lunar{font-size:19px}.ceremony:before,.ceremony:after,.party:before,.party:after{width:clamp(76px,12vw,112px)}.party{padding-top:20px}.party h2{margin-bottom:36px}.section{margin-bottom:110px}.gifts{margin-bottom:15px}}
@media(max-width:400px){.gift-columns{gap:12px;padding:24px 16px}.qr-frame{height:auto;aspect-ratio:1}.gift-columns h3{font-size:11px}.hero h1{max-width:92%}.timeline li{grid-template-columns:105px 1fr;gap:10px}.music-toggle{right:16px;bottom:24px;width:44px;height:44px}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation:none!important}}
.album-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;max-width:750px;margin:26px auto 0}.album-placeholder{aspect-ratio:1/1;border-radius:14px;border:1px dashed #c32a2966;background:linear-gradient(145deg,#f1e7d1,#ead9bd);display:grid;place-items:center;text-align:center;color:#9d7561;font:18px/1.35 Oswald,sans-serif;letter-spacing:.04em}.album-placeholder:before{content:'♡';display:block;font:42px/1 Lora,serif;color:#c32a2966;margin-bottom:8px}@media(max-width:560px){.album-grid{gap:12px}.album-placeholder{font-size:14px}}
.invitation-intro{text-align:center;padding-top:0;padding-bottom:72px;max-width:650px;margin-inline:auto}.intro-kicker{margin:0 0 14px;color:#806c53;font:14px/1.4 Oswald,sans-serif;letter-spacing:.32em}.invitation-intro h2{margin:0 0 18px;color:#c32a29;font:34px/1.1 Bungee,sans-serif;-webkit-text-stroke:2px #f8c88b;paint-order:stroke fill}.intro-greeting{margin:0 0 28px;font-size:18px}.intro-copy{max-width:620px;margin:0 auto 38px;font-size:17px;line-height:1.75}.intro-closing{margin:0;font-size:17px}@media(max-width:560px){.invitation-intro{padding-bottom:56px}.intro-kicker{font-size:12px;letter-spacing:.24em}.invitation-intro h2{font-size:30px}.intro-copy{font-size:16px;line-height:1.7}}
.js-reveal .section{opacity:0;transform:translateY(26px);transition:opacity .72s ease var(--reveal-delay,0ms),transform .72s cubic-bezier(.22,.8,.25,1) var(--reveal-delay,0ms)}.js-reveal .section.is-visible{opacity:1;transform:none}@media(prefers-reduced-motion:reduce){.js-reveal .section{opacity:1;transform:none;transition:none}}
.countdown{width:100%;max-width:520px;margin:20px auto 8px}.countdown h3{color:var(--red);font:600 20px/1.4 Oswald,sans-serif;letter-spacing:.18em;text-transform:uppercase;margin:0 0 16px}.countdown-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.countdown-grid>div{display:flex;flex-direction:column;align-items:center;gap:8px}.countdown-grid strong{display:grid;place-items:center;width:100%;min-height:82px;border-radius:14px;background:#fffdf9d9;box-shadow:0 3px 10px #542e0817;color:var(--red);font:600 clamp(28px,5vw,44px)/1 Oswald,sans-serif}.countdown-grid span{font:15px/1 Roboto,sans-serif;color:#7b6d62}@media(max-width:560px){.countdown{margin-top:10px}.countdown h3{font-size:18px}.countdown-grid{gap:8px}.countdown-grid strong{min-height:68px;border-radius:12px;font-size:30px}.countdown-grid span{font-size:13px}}
.js-entrance .hero h1,.js-entrance .hero-art{opacity:0;transform:translateY(22px)}.js-entrance.entrance-ready .hero h1{animation:peek-in .8s cubic-bezier(.22,.8,.25,1) .05s forwards}.js-entrance.entrance-ready .hero-art{animation:peek-in .95s cubic-bezier(.22,.8,.25,1) .2s forwards}.js-reveal .section>*{opacity:0;transform:translateY(18px);transition:opacity .56s ease,transform .7s cubic-bezier(.22,.8,.25,1)}.js-reveal .section.is-visible>*{opacity:1;transform:none}.js-reveal .section.is-visible>*:nth-child(2){transition-delay:.08s}.js-reveal .section.is-visible>*:nth-child(3){transition-delay:.16s}.js-reveal .section.is-visible>*:nth-child(4){transition-delay:.24s}.js-reveal .section.is-visible>*:nth-child(5){transition-delay:.32s}@keyframes peek-in{from{opacity:0;transform:translateY(22px) scale(.985)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.js-entrance .hero h1,.js-entrance .hero-art,.js-reveal .section>*{opacity:1;transform:none;animation:none;transition:none}}
