@import url('https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@500;700;900&family=Outfit:wght@400;500;600&display=swap');
:root{--night:#07040c;--night-2:#100713;--cream:#fff7ea;--gold:#f4c987;--rose:#f15b79;--rose-2:#ff9caf;--wine:#65132e;--muted:#b9a7b5;--line:rgba(255,230,210,.14)}
*{box-sizing:border-box}html{background:var(--night);scroll-behavior:smooth;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;min-height:100svh;background:var(--night);color:var(--cream);font-family:Outfit,"PingFang SC",sans-serif;overflow:hidden}button,input,textarea{font:inherit}button{touch-action:manipulation}a{color:inherit}
#worldCanvas{position:fixed;inset:0;width:100%;height:100%;z-index:0;background:radial-gradient(circle at 72% 30%,#2a0b1a 0,transparent 28%),radial-gradient(circle at 22% 78%,#170818 0,transparent 33%),linear-gradient(145deg,#050308,#0c0611 64%,#09040c)}
.kicker{color:var(--gold);letter-spacing:.28em;font-size:.72rem;font-weight:600;margin:0 0 18px}.primary-btn{border:1px solid rgba(255,240,210,.2);border-radius:999px;background:linear-gradient(135deg,#f7d59b,#e99379);color:#28131c;min-height:54px;padding:0 29px;font-weight:700;cursor:pointer;box-shadow:0 12px 45px rgba(213,82,106,.18),inset 0 1px rgba(255,255,255,.5);transition:transform .25s,box-shadow .25s}.primary-btn:hover{transform:translateY(-2px);box-shadow:0 18px 55px rgba(213,82,106,.28)}.primary-btn span{margin-left:16px}.primary-btn.full{width:100%}

.lock-screen{position:fixed;z-index:40;inset:0;display:grid;grid-template-columns:minmax(360px,43%) 1fr;align-items:center;padding:clamp(30px,6vw,90px);background:linear-gradient(90deg,rgba(7,4,12,.98) 0 38%,rgba(7,4,12,.38) 66%,rgba(7,4,12,.02));transition:opacity 1s,visibility 1s}.lock-screen.is-unlocked{opacity:0;visibility:hidden;pointer-events:none}.lock-copy{max-width:540px;position:relative;z-index:2}.lock-copy h1{font-family:"Noto Serif SC",serif;font-size:clamp(2.55rem,5vw,5.7rem);line-height:1.17;margin:0;letter-spacing:-.045em;text-wrap:balance}.lock-copy h1 em{font-style:normal;color:var(--rose-2);text-shadow:0 0 35px rgba(241,91,121,.23)}.lock-copy>p:not(.kicker){color:#c7b6c2;font-size:1rem;line-height:1.8;margin:25px 0 28px}.password-row{display:flex;width:min(100%,390px);gap:10px}.password-row input{width:230px;min-height:56px;border:1px solid rgba(255,220,210,.22);border-radius:16px;background:rgba(21,8,19,.74);color:#fff;letter-spacing:.58em;text-align:center;font-size:1.2rem;outline:0;backdrop-filter:blur(16px);box-shadow:inset 0 0 20px rgba(0,0,0,.3)}.password-row input:focus{border-color:var(--rose-2);box-shadow:0 0 0 3px rgba(241,91,121,.13)}.password-row button{flex:1;border:0;border-radius:16px;background:var(--cream);color:#35121e;font-weight:700;cursor:pointer}.password-row button span{margin-left:7px;color:var(--rose)}#passwordForm label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}#passwordHint{font-size:.78rem!important;margin:10px 0 0!important;color:#806f7c!important}.password-row.shake{animation:shake .36s}@keyframes shake{25%{transform:translateX(-7px)}50%{transform:translateX(7px)}75%{transform:translateX(-4px)}}.rose-caption{position:absolute;right:clamp(28px,6vw,90px);bottom:clamp(24px,5vh,52px);font-size:.68rem!important;letter-spacing:.22em;color:#9c8997!important}.rose-caption span{display:inline-block;width:38px;height:1px;background:var(--rose);vertical-align:middle;margin-right:11px}
.password-row button b,.rose-caption b,.primary-btn b,.text-btn b,.file-label b{font:inherit}.file-label>b{display:block}

.topbar{position:fixed;z-index:20;top:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:max(18px,env(safe-area-inset-top)) clamp(18px,4vw,52px) 12px;opacity:1;transition:.6s}.is-locked .topbar{opacity:0;pointer-events:none}.brand{font-family:"Noto Serif SC",serif;color:var(--rose-2);font-size:1rem}.brand span{font-family:Outfit,sans-serif;color:#d4c2cf;font-size:.67rem;letter-spacing:.18em;margin-left:8px}.progress-dots{display:flex;gap:7px}.progress-dots i{width:20px;height:2px;border-radius:8px;background:rgba(255,255,255,.15);transition:.5s}.progress-dots i.active{width:34px;background:linear-gradient(90deg,var(--rose),var(--gold))}.music-pill{border:1px solid var(--line);background:rgba(13,6,14,.68);color:#f7eef4;border-radius:99px;padding:7px 11px;display:flex;align-items:center;gap:7px;backdrop-filter:blur(14px);cursor:pointer}.music-pill b{display:grid;place-items:center;width:25px;height:25px;border-radius:50%;background:linear-gradient(135deg,var(--rose-2),var(--gold));color:#32121c}.music-pill span{font-size:.72rem}.music-pill.playing b{animation:musicPulse 1.2s infinite}@keyframes musicPulse{50%{box-shadow:0 0 0 8px rgba(241,91,121,0)}}

main{position:relative;z-index:2;height:100svh;opacity:1;transition:opacity .6s}.is-locked main{opacity:0;pointer-events:none}.scene{height:100svh;padding:max(76px,env(safe-area-inset-top)) clamp(20px,5vw,76px) max(30px,env(safe-area-inset-bottom));display:none;flex-direction:column;justify-content:center;align-items:center;text-align:center;animation:sceneIn .9s cubic-bezier(.2,.78,.2,1)}.scene.is-active{display:flex}@keyframes sceneIn{from{opacity:0;transform:scale(1.025) translateY(10px)}to{opacity:1;transform:none}}
.intro-layout{width:min(1180px,100%);display:grid;grid-template-columns:1.05fr .95fr;align-items:center;min-height:76vh}.rose-space{min-height:650px}.intro-copy{text-align:left;max-width:560px}.intro-copy h2,.scene h2{font-family:"Noto Serif SC",serif;font-size:clamp(2.35rem,5.5vw,5rem);line-height:1.18;margin:0;font-weight:900;letter-spacing:-.04em}.scene h2 em{font-style:normal;color:var(--rose-2);text-shadow:0 0 28px rgba(241,91,121,.18)}.lead{color:#c8b6c2;line-height:1.85;max-width:470px;margin:24px 0;font-size:1rem}.countdown{display:flex;align-items:flex-start;gap:clamp(8px,1.4vw,18px);margin:32px 0}.countdown div{min-width:64px}.countdown strong{font-size:clamp(2.15rem,4.5vw,4.1rem);line-height:1;font-weight:500;font-variant-numeric:tabular-nums;text-shadow:0 0 18px rgba(255,156,175,.22)}.countdown span{display:block;color:#927f8c;font-size:.68rem;letter-spacing:.18em;margin-top:9px}.countdown i{font-style:normal;color:var(--rose);font-size:2.1rem;opacity:.65}.setup-trigger{position:absolute;right:clamp(18px,4vw,52px);bottom:max(22px,env(safe-area-inset-bottom));border:1px solid var(--line);border-radius:99px;background:rgba(20,8,18,.6);color:#d4c2ce;padding:10px 15px;backdrop-filter:blur(14px);cursor:pointer}

.scene--gifts{justify-content:center}.section-copy{margin-bottom:clamp(20px,3vh,36px)}.section-copy h2{font-size:clamp(2rem,4vw,3.7rem)}.section-copy>p:last-child,.cake-copy>p:last-child{color:var(--muted);line-height:1.7}.gift-grid{width:min(1120px,100%);display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.gift{height:310px;border:1px solid var(--line);border-radius:26px;background:linear-gradient(150deg,rgba(49,13,34,.62),rgba(11,6,14,.75));color:#fff;padding:0;position:relative;overflow:hidden;cursor:pointer;transition:.35s;box-shadow:inset 0 1px rgba(255,255,255,.04)}.gift:nth-child(even){background:linear-gradient(150deg,rgba(61,22,36,.62),rgba(11,6,14,.75))}.gift:hover,.gift:focus-visible{transform:translateY(-8px);border-color:rgba(255,156,175,.45);box-shadow:0 24px 70px rgba(47,4,20,.36),inset 0 1px rgba(255,255,255,.08)}.gift canvas{position:absolute;inset:0;width:100%;height:78%}.gift-no{position:absolute;top:15px;left:17px;font-size:.68rem;letter-spacing:.15em;color:#967d8c}.gift-meta{position:absolute;left:18px;right:18px;bottom:17px;display:flex;align-items:end;justify-content:space-between;text-align:left;border-top:1px solid rgba(255,255,255,.08);padding-top:13px}.gift-meta strong,.gift-meta small{display:block}.gift-meta strong{font-family:"Noto Serif SC",serif;font-size:1.05rem}.gift-meta small{font-size:.67rem;color:#a9919f}.gift.opened{border-color:rgba(244,201,135,.3)}.gift.opened:after{content:'已拆封';position:absolute;inset:0;display:grid;place-items:center;background:rgba(7,4,12,.56);color:var(--gold);font-size:.8rem;letter-spacing:.2em;backdrop-filter:blur(2px)}.text-btn{margin-top:26px;border:0;background:none;color:#c9b7c3;padding:12px 18px;cursor:pointer;opacity:.28;pointer-events:none;transition:.35s}.text-btn.ready{opacity:1;pointer-events:auto}.text-btn span{color:var(--rose-2);margin-left:10px}

dialog{border:0;padding:0;background:transparent;color:var(--cream);max-width:min(92vw,460px);width:100%}dialog::backdrop{background:rgba(4,2,7,.8);backdrop-filter:blur(12px)}.modal-card{position:relative;background:linear-gradient(145deg,#23101e,#0e0710);border:1px solid rgba(255,199,185,.2);border-radius:26px;padding:34px;box-shadow:0 35px 110px rgba(0,0,0,.62),inset 0 1px rgba(255,255,255,.04)}.modal-card h2{font-family:"Noto Serif SC",serif;font-size:1.65rem;line-height:1.5;margin:0 0 24px}.close{position:absolute;right:16px;top:12px;border:0;background:none;color:#a58e9c;font-size:1.8rem;cursor:pointer}.setup-card label{display:block;text-align:left;color:#d4c2cd;margin:15px 0;font-size:.86rem}.setup-card input{display:block;width:100%;margin-top:7px;border-radius:13px;border:1px solid var(--line);background:#09050b;color:#fff;padding:12px 14px;min-height:46px}.file-label input{position:absolute;opacity:0;pointer-events:none}.file-label span{display:block;margin-top:8px;border:1px dashed rgba(241,91,121,.32);border-radius:13px;padding:12px;text-align:center;color:var(--rose-2);cursor:pointer}.copy-link{width:100%;border:0;background:none;color:#bca8b5;padding:13px;cursor:pointer}.answers{display:grid;gap:9px}.answers button{border:1px solid rgba(255,255,255,.11);background:rgba(255,255,255,.04);border-radius:14px;padding:14px 16px;color:#fff;text-align:left;cursor:pointer;transition:.2s}.answers button:hover{border-color:var(--rose-2);color:var(--rose-2);transform:translateX(4px)}

.packet-wrap{position:relative;text-align:center;padding-top:20px}.packet-wrap>canvas{position:absolute;inset:-70px -80px;width:calc(100% + 160px);height:calc(100% + 140px);pointer-events:none}.packet-wrap>small{position:relative;color:#ac96a4}.red-packet{width:min(88vw,335px);min-height:455px;background:radial-gradient(circle at 50% -8%,#ff837f,#b31437 58%,#6f0b2d);border:1px solid rgba(255,217,160,.25);border-radius:28px;padding:38px 28px;color:#ffe5b1;text-align:center;box-shadow:0 35px 100px rgba(116,0,26,.5),inset 0 0 45px rgba(255,188,125,.08);position:relative;overflow:hidden;margin:0 auto 14px}.red-packet:before{content:'';position:absolute;left:-20%;right:-20%;top:-147px;height:300px;border-radius:50%;border:1px solid rgba(255,225,157,.32);background:rgba(82,0,25,.16)}.packet-star{position:relative;display:grid;place-items:center;margin:auto;width:60px;height:60px;border-radius:50%;background:linear-gradient(145deg,#fff0bd,#e6b86e);color:#a21132;font-size:1.5rem;box-shadow:0 0 24px rgba(255,218,148,.32)}.red-packet p{position:relative;margin:32px 0 7px}.red-packet strong{position:relative;display:block;font-size:3.4rem;color:#fff4d2}.red-packet strong small{font-size:1.1rem;margin-right:5px}.red-packet em{position:relative;display:block;font-style:normal;color:#ffdca2;margin:7px 0 38px}.red-packet button{position:relative;border:0;border-radius:99px;background:#ffe8aa;color:#991331;min-height:48px;padding:0 29px;font-weight:700;cursor:pointer}

.scene--cake{justify-content:space-between;padding-bottom:max(22px,env(safe-area-inset-bottom))}.cake-copy{position:relative;z-index:2}.cake-copy h2{font-size:clamp(2rem,4.4vw,3.9rem)}.cake-stage{position:relative;width:min(92vw,660px);height:min(48vh,430px);margin:-20px 0 -12px}.cake-stage canvas{width:100%;height:100%}.flame{position:absolute;left:50%;top:7%;width:17px;height:42px;transform:translateX(-50%);filter:drop-shadow(0 0 14px #ffb24f);transition:.65s}.flame i{display:block;width:100%;height:100%;border-radius:55% 45% 55% 45%;background:linear-gradient(#fff7ae,#ffad3e 55%,#ff536d);animation:flicker .18s infinite alternate;transform-origin:50% 100%}.flame.out{opacity:0;transform:translateX(-50%) scale(.1)}@keyframes flicker{to{transform:skewX(7deg) scaleY(.9)}}.blow-wrap{position:relative;z-index:2}.blow-meter{width:230px;height:3px;background:rgba(255,255,255,.1);border-radius:9px;margin:0 auto 13px;overflow:hidden}.blow-meter i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--rose),var(--gold));transition:width .08s;box-shadow:0 0 12px var(--rose)}.blow-btn{border:1px solid rgba(255,156,175,.24);background:rgba(18,7,16,.7);color:#fff;border-radius:99px;min-height:58px;padding:0 23px 0 9px;display:flex;align-items:center;gap:12px;margin:auto;cursor:pointer;backdrop-filter:blur(12px)}.blow-btn span{width:41px;height:41px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(145deg,var(--rose-2),var(--gold));color:#2d111b;font-size:1.45rem}.blow-wrap small{display:block;color:#8d7786;margin-top:9px}

.scene--final{padding:0;position:relative}.scene--final canvas{position:absolute;inset:0;width:100%;height:100%}.final-content{position:relative;z-index:2;width:min(670px,90vw)}.final-content h2{font-size:clamp(2rem,5vw,4.3rem)}.final-note{color:#d0bdc9;line-height:1.9;font-family:"Noto Serif SC",serif}.wish-field{display:block;width:min(100%,490px);text-align:left;color:#b29ba9;font-size:.82rem;margin:18px auto}.wish-field textarea{display:block;width:100%;resize:none;margin-top:8px;border:1px solid var(--line);background:rgba(18,7,16,.55);color:#fff;border-radius:16px;padding:14px;backdrop-filter:blur(10px)}.signature{color:var(--gold);font-family:"Noto Serif SC",serif;margin-top:22px}.sealed textarea{filter:blur(6px);pointer-events:none}.sealed #sealWish{background:#24141e;color:#a58f9d;box-shadow:none}.credit{position:fixed;z-index:21;left:18px;bottom:10px;color:#685763;font-size:.6rem;letter-spacing:.03em;opacity:0;transition:.6s}.body-ready .credit{opacity:.8}.credit a{text-decoration:none;border-bottom:1px solid #685763}

@media(max-width:820px){body{font-size:1rem}.kicker{font-size:.75rem;letter-spacing:.19em;margin-bottom:12px}.primary-btn{min-height:50px;padding:0 23px}.lock-screen{display:flex;align-items:flex-end;padding:24px 20px max(34px,env(safe-area-inset-bottom));background:linear-gradient(0deg,rgba(7,4,12,.99) 0 44%,rgba(7,4,12,.28) 76%,rgba(7,4,12,.06))}.lock-copy{width:100%;text-align:center}.lock-copy h1{font-size:clamp(1.9rem,8vw,2.55rem);line-height:1.24;letter-spacing:-.035em}.lock-copy>p:not(.kicker){font-size:1rem;line-height:1.65;margin:13px auto 18px;max-width:350px}.password-row{margin:auto;max-width:350px}.password-row input{width:min(62vw,218px);min-height:52px}.password-row button{min-width:92px}.rose-caption{top:max(21px,env(safe-area-inset-top));right:0;left:0;bottom:auto;text-align:center;font-size:.75rem!important}.rose-caption span{display:none}.brand span,.music-pill span{display:none}.topbar{padding:max(12px,env(safe-area-inset-top)) 14px 8px}.progress-dots i{width:15px}.progress-dots i.active{width:25px}.scene{padding:max(58px,calc(env(safe-area-inset-top) + 48px)) 16px max(18px,env(safe-area-inset-bottom))}.intro-layout{display:flex;min-height:100%;align-items:flex-end}.rose-space{display:none}.intro-copy{text-align:center;margin-bottom:max(50px,env(safe-area-inset-bottom));width:100%}.intro-copy h2{font-size:clamp(1.7rem,7.4vw,2.35rem);line-height:1.3}.lead{font-size:1rem;line-height:1.7;margin:14px auto;max-width:350px}.countdown{justify-content:center;gap:4px;margin:20px 0}.countdown div{min-width:49px}.countdown strong{font-size:1.9rem}.countdown span{font-size:.75rem;margin-top:6px}.countdown i{font-size:1.45rem}.setup-trigger{bottom:max(12px,env(safe-area-inset-bottom));font-size:.875rem;padding:8px 13px}.section-copy{margin-bottom:12px}.section-copy h2{font-size:clamp(1.55rem,6.8vw,2rem);line-height:1.32}.section-copy>p:last-child{font-size:.94rem;line-height:1.55;margin:8px 0}.gift-grid{grid-template-columns:repeat(2,1fr);gap:8px}.gift{height:clamp(155px,24svh,210px);border-radius:18px}.gift canvas{height:73%}.gift-meta{left:12px;right:12px;bottom:10px;padding-top:8px}.gift-meta strong{font-size:1rem}.gift-no{top:10px;left:12px;font-size:.75rem}.gift.opened:after{font-size:.875rem}.text-btn{margin-top:9px;padding:8px 12px;font-size:.9rem}.scene--gifts{padding-left:12px;padding-right:12px}.cake-copy h2{font-size:clamp(1.6rem,7vw,2rem);line-height:1.3}.cake-copy>p:last-child{font-size:.94rem;line-height:1.55;max-width:350px;margin:8px auto}.cake-stage{width:102vw;height:38svh;margin:-10px 0}.blow-btn{min-height:52px}.blow-wrap small{font-size:.78rem}.final-content{width:min(92vw,600px)}.final-content h2{font-size:clamp(1.65rem,7.2vw,2.1rem);line-height:1.35}.final-note{font-size:1rem;line-height:1.7;margin:14px 0}.wish-field{font-size:.875rem;margin:14px auto}.signature{font-size:.94rem;margin-top:16px}.modal-card{max-height:calc(100svh - 24px);overflow:auto;padding:26px 22px;border-radius:22px}.modal-card h2{font-size:1.35rem;line-height:1.45;margin-bottom:18px}.answers button{font-size:.9rem;line-height:1.45;padding:12px 14px}.red-packet{min-height:min(455px,76svh);padding:32px 24px}.red-packet strong{font-size:3rem}.credit{display:none}}
@media(max-width:390px){.lock-copy h1{font-size:1.82rem}.lock-copy .kicker{font-size:.7rem}.intro-copy h2{font-size:1.62rem}.lead{font-size:.94rem}.countdown{gap:2px;margin:16px 0}.countdown div{min-width:44px}.countdown strong{font-size:1.7rem}.countdown i{font-size:1.25rem}.section-copy h2{font-size:1.48rem}.gift{height:clamp(145px,23svh,185px)}.gift-meta strong{font-size:.94rem}.scene--final{padding:56px 15px 18px}.final-content h2{font-size:1.58rem}.final-note{font-size:.94rem;margin:10px 0}.wish-field{margin:10px auto}.signature{margin-top:11px}.cake-stage{height:36svh}}
@media(max-width:820px) and (max-height:700px){.lock-screen{padding-bottom:max(20px,env(safe-area-inset-bottom))}.rose-caption{top:14px}.scene{padding-top:max(52px,calc(env(safe-area-inset-top) + 42px));padding-bottom:max(10px,env(safe-area-inset-bottom))}.intro-copy{margin-bottom:max(38px,env(safe-area-inset-bottom))}.lead{margin:10px auto}.countdown{margin:13px 0}.gift{height:145px}.section-copy{margin-bottom:8px}.section-copy>p:last-child{margin:5px 0}.cake-stage{height:34svh}.cake-copy>p:last-child{margin:5px auto}.blow-wrap small{margin-top:5px}.final-note{margin:8px 0}.wish-field{margin:8px auto}.signature{margin-top:8px}}
.scene--fireworks{position:relative;overflow:hidden;justify-content:center;text-align:center;background:radial-gradient(circle at 50% 42%,rgba(87,21,68,.32),transparent 52%)}#fireworksCanvas{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.fireworks-copy,.fireworks-continue{position:relative;z-index:2}.fireworks-copy h2{font-size:clamp(2.25rem,5vw,4.6rem)}.fireworks-copy>p:last-child{color:var(--muted);margin-top:16px}.fireworks-continue{margin-top:32px}.age-badge{display:inline-block;color:var(--gold);font-size:.68rem;letter-spacing:.24em;border:1px solid rgba(244,201,135,.35);border-radius:99px;padding:7px 13px;margin:0 auto 10px;background:rgba(34,14,25,.5)}
.scene--cake .flame{display:none}
@media(max-width:820px){.fireworks-copy h2{font-size:clamp(1.75rem,8vw,2.6rem);line-height:1.32}.fireworks-copy>p:last-child{font-size:.94rem}.fireworks-continue{margin-top:24px}.age-badge{font-size:.72rem;letter-spacing:.13em}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}.music-pill.playing b{animation:none}}
