:root{--blush:#ffe6ef;--blush-soft:#fff4f8;--pink:#ff8fb8;--pink-hot:#ff5c8d;--crimson:#8c1033;--crimson-deep:#5c0820;--magenta:#c2185b;--gold:#ffd166;--white:#fff;--ink:#3b0d1d;--glass:rgba(40,8,24,.52);--glass-border:rgba(255,220,238,.26);--font:"Quicksand", ui-rounded,"SF Pro Rounded","Hiragino Maru Gothic ProN","Nunito","Segoe UI",system-ui,-apple-system,sans-serif;--font-cn:"Noto Sans SC","PingFang SC","Hiragino Sans GB","Microsoft YaHei",var(--font);--mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--ease:cubic-bezier(.22,.8,.22,1);--ease-in-out:cubic-bezier(.65,0,.35,1);--spring:cubic-bezier(.34,1.56,.64,1);--phase-fade:1.4s;--sat:env(safe-area-inset-top,0px);--sab:env(safe-area-inset-bottom,0px)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;width:100%;overflow:hidden;overscroll-behavior:none;background:var(--crimson-deep)}body{font-family:var(--font);color:var(--white);-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;touch-action:manipulation;user-select:none;-webkit-user-select:none}button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}html[lang^=zh] body,html[lang^=zh] .card__title,html[lang^=zh] .finale-title,html[lang^=zh] .modal-card h2,html[lang^=zh] #loveNote{font-family:var(--font-cn)}.stage{position:fixed;inset:0;width:100%;height:100vh;height:100dvh;height:100svh;overflow:hidden}.phase{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(24px + var(--sat)) 22px calc(24px + var(--sab));opacity:0;visibility:hidden;transform:translateZ(0) scale(1.03);filter:blur(6px);transition:opacity var(--phase-fade) var(--ease),transform var(--phase-fade) var(--ease),filter var(--phase-fade) var(--ease),visibility 0s linear var(--phase-fade);will-change:opacity,transform}.phase.is-active{opacity:1;visibility:visible;transform:translateZ(0) scale(1);filter:blur(0);transition-delay:0s}.phase[hidden]{display:none}.fx-layer{position:absolute;inset:0;pointer-events:none;overflow:hidden}.hint{position:absolute;bottom:calc(30px + var(--sab));left:0;right:0;text-align:center;font-size:.72rem;font-weight:500;letter-spacing:.34em;text-transform:uppercase;opacity:0;animation:hintPulse 2.8s var(--ease-in-out) 2.2s infinite;pointer-events:none}@keyframes hintPulse{0%,to{opacity:0;transform:translateY(5px)}50%{opacity:.66;transform:translateY(0)}}.hint.is-gone{animation:none;opacity:0;transition:opacity .4s}.hint--cake{animation:hintIn .7s var(--ease) 1.3s forwards,hintBreathe 3.2s var(--ease-in-out) 2s infinite}.hint--cake.is-gone{opacity:.62}@keyframes hintIn{0%{opacity:0;transform:translateY(6px)}to{opacity:.62;transform:translateY(0)}}@keyframes hintBreathe{0%,to{opacity:.5;transform:translateY(0)}50%{opacity:.85;transform:translateY(-1px)}}.ripple-host{position:fixed;inset:0;pointer-events:none;z-index:60}.ripple{position:absolute;width:18px;height:18px;margin:-9px 0 0 -9px;border-radius:50%;border:1.5px solid rgba(255,255,255,.85);box-shadow:0 0 22px #ff96c3cc;opacity:.9;animation:rippleOut .76s var(--ease) forwards}@keyframes rippleOut{to{transform:scale(11);opacity:0}}.vignette{position:fixed;inset:0;pointer-events:none;z-index:50;background:radial-gradient(130% 100% at 50% 45%,#0000 48%,#0000006b);mix-blend-mode:multiply}.w{display:inline-block;opacity:0;transform:translateY(18px) rotateX(-55deg);animation:wordIn .95s var(--ease) forwards;animation-delay:calc(var(--d, 2.1s) + var(--i) * .13s)}@keyframes wordIn{to{opacity:1;transform:translateY(0) rotateX(0)}}.phase--bloom{background:radial-gradient(90% 70% at 50% 42%,#b4164a,#8c1033 46%,#5c0820);overflow:hidden}.aurora{position:absolute;inset:-20%;pointer-events:none;filter:blur(70px);opacity:.55}.aurora__blob{position:absolute;border-radius:50%;width:60vw;height:60vw;max-width:560px;max-height:560px;will-change:transform}.a1{background:#ff4f86;top:-8%;left:-14%;animation:drift1 17s var(--ease-in-out) infinite}.a2{background:#ff9ec0;bottom:-12%;right:-16%;animation:drift2 21s var(--ease-in-out) infinite}.a3{background:#7a0c2e;top:30%;left:40%;animation:drift3 25s var(--ease-in-out) infinite}@keyframes drift1{0%,to{transform:translateZ(0) scale(1)}50%{transform:translate3d(16vw,10vh,0) scale(1.25)}}@keyframes drift2{0%,to{transform:translateZ(0) scale(1.1)}50%{transform:translate3d(-14vw,-12vh,0) scale(.85)}}@keyframes drift3{0%,to{transform:translateZ(0) scale(.9)}50%{transform:translate3d(-18vw,14vh,0) scale(1.2)}}.sparkle{position:absolute;width:3px;height:3px;border-radius:50%;background:#fff;box-shadow:0 0 8px #fff,0 0 16px #ffaacde6;opacity:0;animation:twinkle var(--dur,3.2s) var(--ease-in-out) infinite;animation-delay:var(--delay,0s);will-change:transform,opacity}@keyframes twinkle{0%,to{opacity:0;transform:scale(.4)}50%{opacity:var(--max,.95);transform:scale(1.5)}}.fx-petal{position:absolute;width:var(--s,14px);height:var(--s,14px);opacity:0;animation:petalFloat var(--dur,14s) linear infinite;animation-delay:var(--delay,0s);will-change:transform,opacity}.fx-petal:before{content:"";display:block;width:100%;height:100%;background:var(--c,#ffc2da);border-radius:50% 0 50% 50%;transform:rotate(45deg);box-shadow:0 0 12px #ffa0c899}@keyframes petalFloat{0%{opacity:0;transform:translate3d(0,8vh,0) rotate(0) scale(.7)}12%{opacity:.85}85%{opacity:.55}to{opacity:0;transform:translate3d(var(--dx,8vw),-112vh,0) rotate(540deg) scale(1.1)}}.bloom__halo{position:absolute;width:min(78vw,420px);aspect-ratio:1;border-radius:50%;background:radial-gradient(circle,#ffb4cd6b,#ff8cb424 42%,#ff8cb400 70%);filter:blur(6px);animation:halo 6s var(--ease-in-out) infinite;will-change:transform,opacity}@keyframes halo{0%,to{transform:scale(.9);opacity:.55}50%{transform:scale(1.08);opacity:1}}.bloom__rings{position:absolute;display:grid;place-items:center;pointer-events:none}.bloom__rings i{position:absolute;width:min(52vw,250px);aspect-ratio:1;border-radius:50%;border:1px solid rgba(255,200,220,.45);opacity:0;animation:ringOut 4.6s var(--ease) infinite}.bloom__rings i:nth-child(2){animation-delay:1.5s}.bloom__rings i:nth-child(3){animation-delay:3s}@keyframes ringOut{0%{transform:scale(.55);opacity:0}18%{opacity:.6}to{transform:scale(2.1);opacity:0}}.bloom__art{position:relative;width:min(76vw,330px);display:grid;place-items:center}.flower{width:100%;height:auto;overflow:visible}.stem{stroke-dasharray:180;stroke-dashoffset:180;animation:growStem 1.6s var(--ease) .2s forwards}@keyframes growStem{to{stroke-dashoffset:0}}.leaf{transform-box:view-box;opacity:0;animation:unfurl .95s var(--spring) forwards}.leaf--l{transform-origin:120px 252px;animation-delay:.95s}.leaf--r{transform-origin:121px 230px;animation-delay:1.15s}@keyframes unfurl{0%{opacity:0;transform:scale(.1) rotate(-28deg)}60%{opacity:1;transform:scale(1.08) rotate(4deg)}to{opacity:1;transform:scale(1) rotate(0)}}.leaf--l{animation:unfurl .95s var(--spring) .95s forwards,leafSway 5s var(--ease-in-out) 2.4s infinite}.leaf--r{animation:unfurl .95s var(--spring) 1.15s forwards,leafSway 5s var(--ease-in-out) 2.8s infinite reverse}@keyframes leafSway{0%,to{transform:rotate(0) scale(1)}50%{transform:rotate(3.5deg) scale(1.03)}}.petal-g{transform-box:view-box;transform-origin:120px 105px;transform:scale(0);opacity:0;animation:bloomOpen 1.05s var(--spring) var(--d) forwards}@keyframes bloomOpen{0%{transform:scale(.04);opacity:0}45%{opacity:1}72%{transform:scale(1.13);opacity:1}to{transform:scale(1);opacity:1}}@keyframes bloomBreathe{0%,to{transform:rotate(-1.4deg) translateY(0) scale(1)}50%{transform:rotate(1.4deg) translateY(-5px) scale(1.025)}}.petal{filter:drop-shadow(0 0 6px rgba(255,140,190,.55))}.petal-g--in .petal{opacity:.97}.core{transform-box:view-box;transform-origin:120px 105px;transform:scale(0);animation:coreIn .9s var(--spring) 1.9s forwards,corePulse 2.8s var(--ease-in-out) 3s infinite;filter:drop-shadow(0 0 12px rgba(255,209,102,.9))}@keyframes coreIn{0%{transform:scale(0)}70%{transform:scale(1.2)}to{transform:scale(1)}}@keyframes corePulse{0%,to{transform:scale(1);filter:drop-shadow(0 0 10px rgba(255,209,102,.75))}50%{transform:scale(1.09);filter:drop-shadow(0 0 22px rgba(255,209,102,1))}}.stamens{transform-box:view-box;transform-origin:120px 105px;opacity:0;animation:stamenIn .8s var(--ease) 2.5s forwards,stamenSpin 22s linear 3.3s infinite}@keyframes stamenIn{0%{opacity:0;transform:scale(.4)}to{opacity:1;transform:scale(1)}}@keyframes stamenSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.bloom-group{transform-box:view-box;transform-origin:120px 140px;animation:bloomBreathe 6s var(--ease-in-out) 3.2s infinite}.dew path{opacity:0;transform-box:view-box;transform-origin:center;animation:dewPop 3.4s var(--ease-in-out) var(--dd) infinite}@keyframes dewPop{0%,to{opacity:0;transform:scale(.3) rotate(0)}15%{opacity:1;transform:scale(1.2) rotate(45deg)}40%{opacity:.35;transform:scale(.9) rotate(90deg)}}.bloom__text{position:relative;margin-top:clamp(18px,4vh,38px);font-size:clamp(1.05rem,4.6vw,1.5rem);font-weight:300;letter-spacing:.09em;color:#fff0f5;text-align:center;text-shadow:0 2px 24px rgba(255,120,165,.55);perspective:500px}.bloom__text .w{margin:0 .18em}.phase--cake{background:radial-gradient(85% 65% at 50% 78%,#ffdfeb,#ffc6da 45%,#f3a7c3);color:var(--crimson);gap:clamp(18px,5vh,46px);overflow:hidden}.bokeh{position:absolute;border-radius:50%;width:var(--s,60px);height:var(--s,60px);background:radial-gradient(circle at 35% 35%,rgba(255,255,255,.9),rgba(255,180,210,.25) 60%,transparent 72%);opacity:0;animation:bokehFloat var(--dur,16s) var(--ease-in-out) infinite;animation-delay:var(--delay,0s);will-change:transform,opacity}@keyframes bokehFloat{0%{opacity:0;transform:translate3d(0,10vh,0) scale(.7)}20%{opacity:.6}80%{opacity:.4}to{opacity:0;transform:translate3d(var(--dx,6vw),-80vh,0) scale(1.3)}}.confetti{position:absolute;top:-6vh;width:7px;height:12px;border-radius:2px;background:var(--c,#ff5c8d);opacity:0;animation:confettiFall var(--dur,5s) linear infinite;animation-delay:var(--delay,0s);will-change:transform,opacity}@keyframes confettiFall{0%{opacity:0;transform:translateZ(0) rotate(0)}8%{opacity:.95}to{opacity:0;transform:translate3d(var(--dx,4vw),112vh,0) rotate(900deg)}}.cake__title{position:relative;font-size:clamp(1.25rem,5.6vw,1.85rem);font-weight:500;letter-spacing:.04em;text-align:center;color:var(--crimson);perspective:500px}.cake__title .w{margin:0 .14em;--d:.45s}.cake__title .accent{font-weight:700;color:var(--magenta)}.cake__scene{--blow:0;position:relative;display:grid;place-items:end center;opacity:0;animation:cakeRise 1.2s var(--spring) .55s forwards}@keyframes cakeRise{0%{opacity:0;transform:translateY(60px) scale(.82)}to{opacity:1;transform:translateY(0) scale(1)}}.cake__lightcone{position:absolute;bottom:18%;left:50%;width:min(90vw,380px);aspect-ratio:1;transform:translate(-50%);border-radius:50%;background:radial-gradient(circle,rgba(255,196,110,.55) 0%,rgba(255,170,90,.18) 38%,transparent 68%);filter:blur(14px);animation:conePulse 2.6s var(--ease-in-out) infinite;transition:opacity 1s var(--ease);pointer-events:none}@keyframes conePulse{0%,to{opacity:.75;transform:translate(-50%) scale(1)}50%{opacity:1;transform:translate(-50%) scale(1.07)}}.cake__scene.is-dark .cake__lightcone{opacity:0}.cake{position:relative;width:min(68vw,280px);display:flex;flex-direction:column;align-items:center;filter:drop-shadow(0 26px 34px rgba(140,16,51,.22));animation:cakeIdle 5s var(--ease-in-out) 1.8s infinite}@keyframes cakeIdle{0%,to{transform:translateY(0) rotate(0)}50%{transform:translateY(-6px) rotate(.6deg)}}.cake__scene.is-blowing .cake{animation:none;transform:rotate(calc(var(--blow, 0) * 3.2deg)) translate(calc(var(--blow, 0) * 7px));transition:transform .1s linear}.cake.is-celebrating{animation:cakeWiggle .7s var(--spring) 2}@keyframes cakeWiggle{0%,to{transform:scale(1) rotate(0)}25%{transform:scale(1.05) rotate(-2.5deg)}75%{transform:scale(1.05) rotate(2.5deg)}}.candles{display:flex;gap:clamp(22px,8vw,42px);margin-bottom:6px;z-index:3}.candle{position:relative;display:flex;flex-direction:column;align-items:center;padding:18px 18px 0;margin:-18px -18px 0;transition:transform .25s var(--spring)}.candle{pointer-events:none}.candle__glow{position:absolute;top:-6px;left:50%;width:90px;height:90px;margin-left:-45px;border-radius:50%;background:radial-gradient(circle,rgba(255,200,120,.55) 0%,rgba(255,150,80,.16) 45%,transparent 70%);animation:conePulse 1.8s var(--ease-in-out) infinite;transition:opacity .4s var(--ease);pointer-events:none}.candle.is-out .candle__glow{opacity:0}.cake__scene.is-blowing .candle__glow{opacity:calc(1 - var(--blow, 0) * .85)}.candle__body{position:relative;width:clamp(26px,8vw,34px);height:clamp(54px,15vw,70px);border-radius:8px 8px 4px 4px;background:repeating-linear-gradient(135deg,#fff 0 7px,#ffd0e0 7px 14px);background-size:200% 200%;box-shadow:inset -5px 0 10px #c2185b2e,inset 4px 0 8px #ffffffe6,0 4px 10px #8c10332e;display:grid;place-items:center;animation:stripeSlide 6s linear infinite}@keyframes stripeSlide{to{background-position:200% 0}}.candle__body em{font-style:normal;font-weight:700;font-size:clamp(1.1rem,4.4vw,1.4rem);color:var(--magenta);text-shadow:0 1px 0 rgba(255,255,255,.8)}.wax{position:absolute;top:0;left:22%;width:5px;height:0;border-radius:0 0 4px 4px;background:#ffffffeb;transition:height .9s var(--ease) .2s}.candle.is-out .wax{height:42%}.candle__wick{width:2px;height:9px;background:#4a3038;border-radius:2px}.candle__flame{position:relative;display:block;width:16px;height:26px;border-radius:50%/62% 62% 38% 38%;background:radial-gradient(ellipse at 50% 76%,#fff6d0,#ffbe55 42%,#ff6a3d 76%,#ff5a3c00);box-shadow:0 0 20px 7px #ffaa5a80,0 0 48px 18px #ff785042;transform-origin:50% 100%;transform:rotate(calc(var(--blow, 0) * -62deg)) scaleX(calc(1 + var(--blow, 0) * 1.15)) scaleY(calc(1 - var(--blow, 0) * .42));animation:flicker 1.1s var(--ease-in-out) infinite;will-change:transform}.flame__core{position:absolute;left:50%;bottom:2px;width:7px;height:13px;margin-left:-3.5px;border-radius:50%/62% 62% 38% 38%;background:radial-gradient(circle,#fff,#ffe9b0 55%,#ffdc9600);animation:flicker .7s var(--ease-in-out) infinite reverse}.candle.is-out .candle__flame{transform:rotate(-104deg) scaleX(2.4) scaleY(.22);opacity:0;animation:none;transition:transform .6s var(--ease),opacity .55s var(--ease)}.candle.is-out .flame__core{animation:none}@keyframes flicker{0%,to{transform:scale(1) rotate(-1.5deg);opacity:1}35%{transform:scaleY(1.16) scaleX(.92) rotate(2.5deg);opacity:.94}70%{transform:scaleY(.9) scaleX(1.08) rotate(-2.5deg);opacity:.98}}.candle.is-out .candle__wick{background:#2b1a20}.cake__top,.cake__mid,.cake__base{position:relative;border-radius:10px 10px 6px 6px}.cake__top{width:66%;height:clamp(34px,9vw,44px);background:linear-gradient(180deg,#fffdfe,#ffeaf2);box-shadow:inset 0 -6px 12px #c2185b1a;z-index:2}.cake__drip{position:absolute;left:0;right:0;top:-2px;height:16px;background:var(--pink-hot);border-radius:8px 8px 0 0;box-shadow:0 3px 8px #c2185b42}.cake__drip:after{content:"";position:absolute;left:0;right:0;top:14px;height:16px;background:radial-gradient(9px 12px at 12% 0,var(--pink-hot) 96%,transparent 100%),radial-gradient(8px 14px at 34% 0,var(--pink-hot) 96%,transparent 100%),radial-gradient(9px 10px at 56% 0,var(--pink-hot) 96%,transparent 100%),radial-gradient(8px 15px at 78% 0,var(--pink-hot) 96%,transparent 100%),radial-gradient(9px 11px at 95% 0,var(--pink-hot) 96%,transparent 100%)}.cake__mid{width:84%;height:clamp(40px,11vw,54px);margin-top:-4px;background:linear-gradient(180deg,#ffd9e7,#ffc2d8);box-shadow:inset 0 -8px 14px #c2185b1f;z-index:1;display:grid;place-items:center}.cake__bow{width:34px;height:16px;position:relative}.cake__bow:before,.cake__bow:after{content:"";position:absolute;top:0;width:16px;height:16px;border-radius:50% 10% 50% 50%;background:#fff;box-shadow:0 1px 3px #c2185b40}.cake__bow:before{left:0;transform:rotate(-20deg)}.cake__bow:after{right:0;transform:rotate(20deg) scaleX(-1)}.cake__base{width:100%;height:clamp(46px,13vw,62px);margin-top:-4px;background:linear-gradient(180deg,#fff0f6,#ffd2e3);box-shadow:inset 0 -10px 18px #c2185b24}.cake__plate{width:116%;height:12px;margin-top:-2px;border-radius:50%;background:linear-gradient(180deg,#fff,#f1c2d4);box-shadow:0 10px 22px #8c103333}.sprinkle{position:absolute;width:7px;height:3px;border-radius:3px;background:#fff;opacity:.9}.s1{top:24px;left:16%;transform:rotate(24deg)}.s2{top:30px;left:38%;transform:rotate(-38deg);background:#ffe08a}.s3{top:22px;left:58%;transform:rotate(12deg)}.s4{top:32px;left:76%;transform:rotate(-16deg);background:#b8e2ff}.s5{top:27px;left:88%;transform:rotate(44deg)}.wind{position:absolute;inset:0;pointer-events:none;overflow:hidden;opacity:0;transition:opacity .25s var(--ease)}.cake__scene.is-blowing .wind{opacity:calc(var(--blow, 0) * .95)}.wind i{position:absolute;left:-34%;top:var(--wy, 20%);width:48%;height:2px;border-radius:2px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.95),transparent);filter:blur(.4px);animation:windRush .6s linear var(--wd, 0s) infinite}@keyframes windRush{0%{transform:translate(0) scaleX(.45);opacity:0}22%{opacity:1}to{transform:translate(250%) scaleX(1.35);opacity:0}}.blow{position:relative;width:96px;height:96px;display:grid;place-items:center;border-radius:50%;color:var(--magenta);background:#ffffff8c;box-shadow:0 10px 26px #8c103338;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);touch-action:none;opacity:0;animation:fadeUp .9s var(--ease) 1.1s forwards;transition:box-shadow .18s var(--ease)}@keyframes fadeUp{0%{opacity:0;transform:translateY(14px) scale(.9)}to{opacity:1;transform:translateY(0) scale(1)}}.blow.is-done{animation:none;opacity:0;transform:scale(.86);transition:opacity .6s var(--ease),transform .6s var(--ease);pointer-events:none}.blow__ring{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg);overflow:visible}.blow__track{fill:none;stroke:#c2185b29;stroke-width:5}.blow__fill{fill:none;stroke:var(--magenta);stroke-width:5;stroke-linecap:round;stroke-dasharray:251;stroke-dashoffset:251;filter:drop-shadow(0 0 7px rgba(194,24,91,.6))}.blow__inner{position:relative;width:70px;height:70px;border-radius:50%;display:grid;place-items:center;background:radial-gradient(circle at 38% 30%,#fff,#fff0f6 48%,#ffd3e4);box-shadow:0 1px #fff inset,0 4px 12px #8c10332e;transition:transform .16s var(--ease)}.blow.is-holding{box-shadow:0 6px 16px #8c10334d}.blow.is-holding .blow__inner{transform:scale(.93)}.blow__puff{width:36px;height:26px}.blow.is-holding .blow__puff{animation:puffPush .42s var(--ease-in-out) infinite}@keyframes puffPush{0%,to{transform:translate(-4px) scaleX(.92);opacity:.72}50%{transform:translate(5px) scaleX(1.16);opacity:1}}.blow:after{content:"";position:absolute;inset:-4px;border-radius:50%;border:1.5px solid rgba(194,24,91,.4);animation:blowPulse 2.2s var(--ease-in-out) infinite}.blow.is-holding:after{animation:none;opacity:0}@keyframes blowPulse{0%,to{transform:scale(1);opacity:.6}60%{transform:scale(1.32);opacity:0}}.smoke{position:absolute;width:10px;height:10px;border-radius:50%;background:radial-gradient(circle,#fffffff2,#dcdce680 55%,#dcdce600);opacity:0;will-change:transform,opacity;animation:smokeRise var(--dur,1.9s) var(--ease) forwards}@keyframes smokeRise{0%{opacity:0;transform:translateZ(0) scale(.5)}18%{opacity:.75}to{opacity:0;transform:translate3d(var(--dx,0px),var(--dy,-130px),0) scale(var(--sc,3.4))}}.spark{position:absolute;width:4px;height:4px;border-radius:50%;background:var(--c,#ffd166);box-shadow:0 0 10px var(--c,#ffd166);opacity:0;will-change:transform,opacity;animation:sparkFly var(--dur,.9s) var(--ease) forwards}@keyframes sparkFly{0%{opacity:1;transform:translateZ(0) scale(1)}to{opacity:0;transform:translate3d(var(--dx,0px),var(--dy,-60px),0) scale(.2)}}.phase--letter{background:radial-gradient(90% 75% at 50% 30%,#ffd7e6,#ff9ec0 42%,#c2185b);color:var(--crimson);perspective:1200px;overflow:hidden}.phase--letter.is-blackout{background:#000;transition:background 1s var(--ease-in-out)}.floatheart{position:absolute;width:var(--s,16px);height:var(--s,16px);opacity:0;animation:heartRise var(--dur,11s) linear infinite;animation-delay:var(--delay,0s);will-change:transform,opacity}.floatheart:before,.floatheart:after{content:"";position:absolute;top:0;width:50%;height:80%;border-radius:50% 50% 0 0;background:var(--c,rgba(255,255,255,.75))}.floatheart:before{left:0;transform:rotate(-45deg);transform-origin:100% 100%}.floatheart:after{right:0;transform:rotate(45deg);transform-origin:0 100%}@keyframes heartRise{0%{opacity:0;transform:translate3d(0,10vh,0) scale(.6) rotate(0)}15%{opacity:.8}80%{opacity:.45}to{opacity:0;transform:translate3d(var(--dx,5vw),-108vh,0) scale(1.15) rotate(25deg)}}.envelope-wrap{animation:envFloat 5.5s var(--ease-in-out) 1s infinite;will-change:transform}@keyframes envFloat{0%,to{transform:translateY(0) rotate(0)}50%{transform:translateY(-12px) rotate(-1.2deg)}}.envelope-wrap.is-opened{animation:none}.envelope{position:relative;width:min(76vw,330px);aspect-ratio:1.5/1;transform-style:preserve-3d;opacity:0;animation:envIn 1.1s var(--spring) .2s forwards;transition:transform .9s var(--ease),opacity .7s var(--ease)}@keyframes envIn{0%{opacity:0;transform:translateY(40px) scale(.8) rotateX(28deg)}to{opacity:1;transform:translateY(0) scale(1) rotateX(0)}}.envelope>*{position:absolute;inset:0}.envelope__back{background:linear-gradient(160deg,#fff,#ffe9f1);border-radius:12px;box-shadow:0 26px 50px #5c082052}.envelope__paper{inset:8% 6% 14%;background:linear-gradient(180deg,#fff,#fff6fa);border-radius:8px;z-index:1;transform:translateY(0) scale(.98);transition:transform .95s var(--ease)}.envelope.is-open .envelope__paper{transform:translateY(-70%) scale(1) rotate(-2deg)}.envelope__front{z-index:3;border-radius:12px;background:linear-gradient(170deg,#ffeef4,#ffd2e3);clip-path:polygon(0 18%,50% 62%,100% 18%,100% 100%,0 100%);box-shadow:inset 0 10px 22px #c2185b1a}.envelope__flap{z-index:4;height:62%;background:linear-gradient(180deg,#ffd9e7,#ffb9d2);clip-path:polygon(0 0,100% 0,50% 100%);transform-origin:top center;transform:rotateX(0);transition:transform .8s var(--ease-in-out),z-index 0s .4s;border-radius:12px 12px 0 0}.envelope.is-open .envelope__flap{transform:rotateX(-174deg);z-index:0}.seal{z-index:5;position:absolute;inset:52% auto auto 50%;width:clamp(52px,16vw,66px);height:clamp(52px,16vw,66px);transform:translate(-50%,-50%);border-radius:50%;overflow:hidden;display:grid;place-items:center;background:radial-gradient(circle at 34% 30%,#e0366a,#b5174a 45%,#7d0f2c);box-shadow:0 8px 18px #5c08206b,inset 0 2px 6px #ffffff59;transition:transform .55s var(--spring),opacity .5s var(--ease);animation:sealPulse 2.6s var(--ease-in-out) infinite}.seal svg{width:72%;height:72%}.seal__shine{position:absolute;top:0;left:-120%;width:60%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.75),transparent);animation:sealShine 3.4s var(--ease-in-out) 1.4s infinite}@keyframes sealShine{0%{transform:translateZ(0)}35%,to{transform:translate3d(467%,0,0)}}@keyframes sealPulse{0%,to{box-shadow:0 8px 18px #5c08206b,inset 0 2px 6px #ffffff59,0 0 #ff8cb480}60%{box-shadow:0 8px 18px #5c08206b,inset 0 2px 6px #ffffff59,0 0 0 18px #ff8cb400}}.envelope.is-open .seal{transform:translate(-50%,-50%) scale(.5) rotate(-28deg);opacity:0;animation:none}.envelope.is-open{transform:translateY(20vh) scale(.66);opacity:0}.card{position:absolute;left:50%;--card-bottom:14vh;bottom:var(--card-bottom);transform:translate(-50%) translate3d(0,90vh,0);width:min(88vw,400px);padding:clamp(26px,7vw,38px) clamp(22px,6vw,32px) clamp(20px,5vw,26px);border-radius:26px;text-align:center;overflow:hidden;max-height:calc(100svh - var(--card-bottom) - 22px);display:flex;flex-direction:column;background:#ffffff42;-webkit-backdrop-filter:blur(22px) saturate(180%);backdrop-filter:blur(22px) saturate(180%);border:1px solid rgba(255,255,255,.55);box-shadow:0 24px 60px #5c08204d,inset 0 1px #ffffffb3;opacity:0;pointer-events:none;transition:transform 1.05s var(--spring),opacity .7s var(--ease);will-change:transform,opacity}.card__scroll{min-height:0;flex:1 1 auto;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-width:none}.card__scroll::-webkit-scrollbar{display:none}.card.is-up{transform:translate(-50%) translateZ(0);opacity:1;pointer-events:auto}.card__sheen{position:absolute;top:0;left:-60%;width:50%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.35),transparent);pointer-events:none}.card.is-up .card__sheen{animation:cardSheen 2.8s var(--ease-in-out) 1s infinite}@keyframes cardSheen{0%{transform:translateZ(0)}45%,to{transform:translate3d(400%,0,0)}}.card .r{opacity:0;transform:translateY(16px)}.card.is-up .r{animation:revealUp .8s var(--ease) forwards;animation-delay:calc(.25s + var(--i) * .14s)}@keyframes revealUp{to{opacity:1;transform:translateY(0)}}.photo{position:relative;width:min(60%,190px);margin:0 auto 20px;padding:9px;border-radius:18px;background:linear-gradient(160deg,#fffffff2,#ffecf4e0);box-shadow:0 14px 34px #5c082059,inset 0 1px #ffffffe6;transform:rotate(-2.2deg);overflow:hidden;animation:photoSway 7s var(--ease-in-out) 1.6s infinite}@keyframes photoSway{0%,to{transform:rotate(-2.2deg) translateY(0)}50%{transform:rotate(1.4deg) translateY(-5px)}}.photo img{display:block;width:100%;height:auto;aspect-ratio:3/4;object-fit:cover;object-position:50% 28%;border-radius:12px;background:#ffd9e7}.photo__tape{position:absolute;top:-9px;left:50%;width:58px;height:20px;margin-left:-29px;background:linear-gradient(180deg,#ff8cb9bf,#ff5c8d99);border-radius:3px;transform:rotate(-3deg);box-shadow:0 2px 8px #5c082040}.photo__glint{position:absolute;top:0;left:-70%;width:55%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.55),transparent);pointer-events:none}@keyframes glintSweep{0%{transform:translateZ(0)}45%,to{transform:translate3d(382%,0,0)}}.card.is-up .photo__glint{animation:glintSweep 4.2s var(--ease-in-out) 1.8s infinite}.card__eyebrow{font-size:.64rem;letter-spacing:.3em;text-transform:uppercase;color:#fffe;margin-bottom:14px}.card__title{font-size:clamp(1.35rem,6vw,1.9rem);font-weight:500;line-height:1.3;color:#fff;text-shadow:0 2px 16px rgba(140,16,51,.45)}.card__title span{font-weight:700}.typed{min-height:1em}.typed .tw{display:inline-block;white-space:nowrap}.typed .tc{display:inline-block;opacity:0;transform:translateY(.3em) scale(.82);filter:blur(3px);will-change:opacity,transform}.typed .tc.in{animation:charIn .36s var(--ease) forwards}@keyframes charIn{0%{opacity:0;transform:translateY(.3em) scale(.82);filter:blur(3px)}60%{opacity:1;transform:translateY(-.06em) scale(1.04);filter:blur(0)}to{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}}.caret{display:inline-block;width:2px;height:1em;margin-left:2px;vertical-align:-.12em;background:currentColor;box-shadow:0 0 10px #ffffffd9;animation:blink .68s steps(1) infinite}.typed.is-written{animation:lineLand .9s var(--ease) 1}@keyframes lineLand{0%{text-shadow:0 2px 16px rgba(140,16,51,.45)}40%{text-shadow:0 0 22px rgba(255,214,235,.95),0 2px 16px rgba(140,16,51,.45)}to{text-shadow:0 2px 16px rgba(140,16,51,.45)}}.card__body{margin-top:16px;font-size:clamp(.85rem,3.6vw,.96rem);line-height:1.75;color:#fff;text-shadow:0 1px 9px rgba(140,16,51,.45)}.btn-next{position:relative;overflow:hidden;margin-top:24px;padding:13px 42px;border-radius:999px;font-size:.82rem;font-weight:600;letter-spacing:.22em;text-transform:uppercase;color:var(--crimson);background:#ffffffeb;box-shadow:0 8px 22px #5c082047;flex:0 0 auto;align-self:center;opacity:0;transform:translateY(16px);pointer-events:none;transition:opacity .7s var(--ease),transform .7s var(--spring),box-shadow .22s var(--ease)}.card.is-typed .btn-next{opacity:1;transform:translateY(0);pointer-events:auto}.card.is-typed .btn-next:active{transform:scale(.93)}.btn-next:after{content:"";position:absolute;top:0;left:-70%;width:45%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,120,170,.45),transparent);animation:btnSheen 2.6s var(--ease-in-out) infinite}@keyframes btnSheen{0%{transform:translateZ(0)}55%,to{transform:translate3d(489%,0,0)}}.phase--galaxy{padding:0;isolation:isolate;background:radial-gradient(circle at 50% 54%,rgba(139,41,97,.16),transparent 30%),radial-gradient(circle at 14% 18%,rgba(92,8,32,.22),transparent 34%),#0a0410}.phase--galaxy:before,.phase--galaxy:after{content:"";position:absolute;z-index:-1;width:46vw;height:46vw;max-width:660px;max-height:660px;border-radius:50%;filter:blur(90px);opacity:.18;pointer-events:none;transition:background 1.8s ease,opacity 1.8s ease}.phase--galaxy:before{top:-22%;left:-12%;background:#ff3d9b}.phase--galaxy:after{right:-12%;bottom:-24%;background:#8c1033}.phase--galaxy.warm:before{background:#ff5c8d;opacity:.26}.phase--galaxy.warm:after{background:#ffb52d;opacity:.22}.phase--galaxy.is-active{filter:none}#cosmos{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none}.star-hint{position:absolute;left:0;right:0;bottom:calc(42px + var(--sab));text-align:center;z-index:6;color:#ffe6f2c7;font-size:.7rem;font-weight:500;letter-spacing:.32em;text-transform:uppercase;text-shadow:0 0 18px rgba(255,92,141,.6);pointer-events:none;opacity:0;transition:opacity 1.2s var(--ease),transform 1.2s var(--ease);transform:translateY(8px)}.star-hint.visible{opacity:1;transform:translateY(0);animation:starHintPulse 3s var(--ease-in-out) 1.2s infinite}.star-hint.is-gone{opacity:0;transform:translateY(8px);animation:none}@keyframes starHintPulse{0%,to{opacity:.5}50%{opacity:1}}.terminal{position:absolute;top:50%;left:50%;width:min(640px,calc(100vw - 48px));transform:translate(-50%,-50%);color:#fff4faf0;font:clamp(13px,3.6vw,18px)/1.7 var(--mono);letter-spacing:.03em;text-align:center;text-shadow:0 0 24px rgba(255,105,170,.7);transition:opacity .9s ease,transform 1s var(--ease);z-index:7}.terminal.fade-out{opacity:0;transform:translate(-50%,-54%) scale(.96)}.terminal-prefix{color:var(--pink-hot);margin-right:7px}.cursor{display:inline-block;width:8px;height:1.1em;margin-left:4px;vertical-align:-.16em;background:var(--pink-hot);box-shadow:0 0 14px var(--pink-hot);animation:blink .72s steps(1) infinite}@keyframes blink{50%{opacity:0}}.constellation-label{position:absolute;top:50%;left:50%;opacity:0;transform:translate(-50%,calc(-50% + 130px));color:#ffd2eba8;font-size:9.5px;letter-spacing:.34em;text-transform:uppercase;transition:opacity 1s ease,transform 1s var(--ease);pointer-events:none;z-index:7}.constellation-label.visible{opacity:1;transform:translate(-50%,calc(-50% + 112px))}.memory-modal{position:absolute;inset:0;z-index:10;display:grid;place-items:center;padding:22px;background:#0a030e80;-webkit-backdrop-filter:blur(9px);backdrop-filter:blur(9px);opacity:0;visibility:hidden;pointer-events:none;transition:opacity .5s ease,visibility .5s ease}.memory-modal.open{opacity:1;visibility:visible;pointer-events:auto}.modal-card{position:relative;width:min(480px,100%);padding:clamp(26px,6vw,46px);overflow:hidden;border:1px solid var(--glass-border);border-radius:26px;background:linear-gradient(140deg,rgba(255,255,255,.12),transparent 36%),var(--glass);box-shadow:0 24px 90px #00000080,inset 0 1px #ffffff1f;max-height:80svh;overflow-y:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;transform:translateY(26px) scale(.95);transition:transform .65s var(--spring)}.modal-card::-webkit-scrollbar{display:none}.memory-modal.open .modal-card{transform:translateY(0) scale(1)}.modal-card:after{content:"";position:absolute;width:180px;height:180px;right:-70px;top:-70px;border-radius:50%;background:#ff60aa2e;filter:blur(8px);pointer-events:none}.modal-kicker{margin-bottom:14px;color:var(--pink-hot);font-size:9.5px;letter-spacing:.24em;text-transform:uppercase;font-weight:700}.modal-card h2{margin:0 0 13px;color:#fff;font:600 clamp(24px,6vw,38px)/1.12 var(--font);letter-spacing:-.01em}#loveNote{margin:0;color:#fff5fad1;font:400 clamp(14px,3.8vw,16px)/1.8 var(--font)}#loveNote:lang(zh){font-family:var(--font-cn)}.modal-footer{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:26px}.memory-counter{color:#ffffff6b;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase}.close-note{padding:11px 17px;color:#fff;border:1px solid rgba(255,175,215,.42);border-radius:999px;background:#ff5c8d33;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;transition:background .25s ease,transform .25s var(--spring),box-shadow .25s ease}.close-note:active{transform:scale(.94);background:#ff5c8d5c}.finale-overlay{position:absolute;inset:0;z-index:8;display:grid;place-items:center;padding:24px;text-align:center;pointer-events:none;opacity:0;transform:scale(.94);transition:opacity 2s var(--ease),transform 2.2s var(--ease)}.finale-overlay.visible{opacity:1;transform:scale(1)}.finale-inner{max-width:840px}.finale-overline{margin-bottom:16px;color:var(--gold);font-size:10px;font-weight:700;letter-spacing:.4em;text-transform:uppercase;text-shadow:0 0 22px rgba(255,209,102,.7)}.finale-title{margin:0;color:#fff;font:600 clamp(38px,11vw,96px)/.98 var(--font);letter-spacing:-.04em;text-shadow:0 0 12px rgba(255,255,255,.5),0 0 40px rgba(255,80,150,.8),0 0 85px rgba(255,120,180,.35)}.finale-title span{background:linear-gradient(90deg,#fff,#ffc2da 45%,#ff5c8d);-webkit-background-clip:text;background-clip:text;color:transparent}.finale-cn{font-family:var(--font-cn);margin-top:18px;font-size:clamp(16px,4.6vw,24px);font-weight:500;letter-spacing:.3em;color:#ffd9e7;text-shadow:0 0 20px rgba(255,120,170,.7)}.finale-subtitle{margin:22px auto 0;color:#fff4fab8;font:400 clamp(13px,3.6vw,16px)/1.7 var(--font)}@media (max-width:380px){.bloom__art{width:82vw}.bloom__text{font-size:1rem;letter-spacing:.05em}.hint{font-size:.62rem;letter-spacing:.24em}.cake{width:72vw}.candles{gap:20px}.blow{width:92px;height:92px}.blow__inner{width:66px;height:66px}.envelope{width:84vw}.card{width:92vw;padding:22px 18px 18px;border-radius:22px}.photo{width:min(52%,150px)}.card__body{font-size:.82rem;line-height:1.65}.modal-card{padding:24px 20px;border-radius:20px}.modal-card h2{font-size:22px}#loveNote{font-size:13.5px;line-height:1.7}.close-note{padding:10px 14px;font-size:10px}.star-hint{font-size:.62rem;letter-spacing:.22em}.terminal{font-size:12px;width:calc(100vw - 34px)}.finale-title{font-size:clamp(32px,10vw,54px)}}@media (max-width:620px){.modal-card{border-radius:22px}.memory-modal{padding:18px}.finale-overlay{padding:20px}}@media (max-height:760px){.photo{width:min(46%,140px);margin-bottom:16px}.card{--card-bottom:6vh}}@media (max-height:640px){.bloom__art{width:62vw}.cake{width:min(54vw,220px)}.card{padding:20px 20px 16px}.card__body{font-size:.78rem;line-height:1.55;margin-top:10px}.photo{width:min(36%,108px);margin-bottom:10px}.finale-subtitle{display:none}.blow{width:84px;height:84px}.blow__inner{width:60px;height:60px}}@media (orientation:landscape) and (max-height:540px){.phase{padding:12px 18px}.phase--bloom{flex-direction:row;gap:4vw}.bloom__art{width:30vw;max-width:230px}.bloom__text{margin-top:0;max-width:40vw;font-size:1rem}.hint{bottom:10px;font-size:.58rem}.phase--cake{flex-direction:row;flex-wrap:wrap;gap:3vw;justify-content:center}.cake__title{width:100%;font-size:1.05rem}.cake{width:30vw;max-width:190px}.blow{width:80px;height:80px}.blow__inner{width:58px;height:58px}.envelope{width:40vw;max-width:260px}.card{width:min(68vw,460px);padding:18px 22px 16px}.card{--card-bottom:4vh}.photo{width:min(26%,96px);margin-bottom:8px}.card__body{font-size:.78rem;line-height:1.55;margin-top:10px}.modal-card{padding:20px 24px;max-height:84svh}.modal-card h2{font-size:21px}.finale-title{font-size:clamp(28px,7vw,52px)}.finale-subtitle{display:none}.star-hint{bottom:12px}}@media (min-width:768px){.bloom__art{width:min(46vw,380px)}.cake{width:min(42vw,300px)}.envelope{width:min(46vw,360px)}.card{width:min(60vw,440px)}.photo{width:min(52%,210px)}.blow{width:116px;height:116px}.blow__inner{width:84px;height:84px}.star-hint{font-size:.78rem}}@media (min-width:1100px){.bloom__art{width:360px}.cake{width:300px}.card{width:430px}}@supports (padding:max(0px)){.phase{padding-left:max(22px,env(safe-area-inset-left));padding-right:max(22px,env(safe-area-inset-right))}}@media (pointer:coarse){.close-note{min-height:44px}.btn-next{min-height:46px}}@media (prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.2s!important}}.gate{position:fixed;inset:0;z-index:60;display:grid;place-items:center;padding:28px;text-align:center;color:#fff;background:radial-gradient(125% 95% at 50% 16%,#ffa7c9,#e3568c 44%,#8c1033);transition:opacity .9s var(--ease),transform .9s var(--ease)}.gate[hidden]{display:none}.gate.is-open{opacity:0;transform:scale(1.07);pointer-events:none}.gate__bow{width:84px;height:84px;display:block;margin:0 auto 24px;filter:drop-shadow(0 12px 28px rgba(92,8,32,.45));animation:gateFloat 5.4s var(--ease-in-out) infinite}@keyframes gateFloat{0%,to{transform:translateZ(0) rotate(-2.5deg)}50%{transform:translate3d(0,-10px,0) rotate(2.5deg)}}.gate__kicker{font-size:.72rem;letter-spacing:.34em;text-transform:uppercase;opacity:.92;margin-bottom:26px}.gate__clock{display:flex;gap:9px;justify-content:center}.gate__unit{min-width:70px;padding:13px 9px 11px;border-radius:17px;background:#ffffff26;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:inset 0 1px #ffffff61,0 10px 26px #5c082038}.gate__unit b{display:block;line-height:1;font-weight:700;font-size:clamp(1.6rem,8vw,2.25rem);font-variant-numeric:tabular-nums}.gate__unit i{display:block;margin-top:8px;font-style:normal;font-size:.55rem;letter-spacing:.2em;text-transform:uppercase;opacity:.8}.gate.no-days .gate__unit--days{display:none}.gate__when{margin-top:27px;font-size:.82rem;opacity:.88}.gate__note{margin-top:9px;font-size:.68rem;opacity:.58}@media (prefers-reduced-motion:reduce){.gate__bow{animation:none}.gate{transition:opacity .4s linear}}html.gate-locked #phase1,html.gate-locked #phase1 *{animation-play-state:paused!important}
