:root{color-scheme:dark;--white:#edf2ff;--muted:#8392ad;--blue:#a5cbff;--pink:#ff9bc8}*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#02040b}body{font-family:"Microsoft YaHei","PingFang SC",Arial,sans-serif;color:var(--white);-webkit-font-smoothing:antialiased}button,a{-webkit-tap-highlight-color:transparent}button{font:inherit;cursor:pointer;touch-action:manipulation}button:disabled{cursor:wait}button[hidden],div[hidden]{display:none!important}button:focus-visible,a:focus-visible{outline:2px solid #b9d7ff;outline-offset:6px}a{color:inherit;text-decoration:none}#universe,#sceneHost{position:fixed;inset:0;width:100%;height:100%;height:100dvh}#sceneHost canvas{display:block;width:100%;height:100%;touch-action:none;cursor:grab;outline-offset:-12px}#sceneHost canvas:active{cursor:grabbing}.vignette{position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse at 53% 43%,transparent 25%,#01030a38 75%,#01030a80),linear-gradient(0deg,#02040bc9,transparent 31%);z-index:1}.topbar{position:absolute;left:0;right:0;top:0;z-index:10;display:flex;justify-content:space-between;align-items:center;padding:29px 42px;gap:20px;pointer-events:none}.topbar>*{pointer-events:auto}.wordmark{display:flex;gap:11px;align-items:center;font-size:14px;font-weight:400;letter-spacing:3px}.brand-star{font-family:Georgia,serif;font-size:33px;color:#cbd9f4;font-weight:400;line-height:1}.wordmark small{display:block;font-size:6px;letter-spacing:2.3px;color:#7f8da9;margin-top:8px}.journey-steps{list-style:none;display:flex;gap:25px;margin:0 32px 0 0;padding:0}.journey-steps li{display:flex;align-items:center;gap:7px;color:#59667f;font-size:9px;letter-spacing:1.5px;position:relative;transition:color .6s}.journey-steps li+li:before{content:"";position:absolute;width:12px;height:1px;background:#52638444;left:-19px}.journey-steps i{height:3px;width:3px;border-radius:50%;background:currentColor;transition:box-shadow .6s}.journey-steps li.active{color:#c7dcfa}.journey-steps li.active i{box-shadow:0 0 9px 2px #b6d1ff66}.journey-steps li.complete{color:#8eaccd}.reset-button{display:flex;align-items:center;gap:8px;background:#ffffff04;border:1px solid #9db7ed29;color:#a2b3cd;border-radius:30px;padding:8px 12px;min-height:35px;transition:.25s}.reset-button:hover{background:#b8d7ff14;border-color:#b2cdf55e}.reset-button>span{font-size:18px;line-height:1}.reset-button>small{font-size:8px;letter-spacing:1px}.scene-coordinate{position:absolute;left:45px;top:123px;display:flex;align-items:center;gap:11px;color:#70809e;font-size:7px;letter-spacing:2.5px;z-index:3;pointer-events:none}.scene-coordinate>span:first-child{font-family:Georgia,serif;font-size:16px;color:#abbdd8;letter-spacing:0}.scene-coordinate>i{width:30px;height:1px;background:#6a7f9e60}.story{position:absolute;bottom:92px;left:65px;z-index:4;width:425px;max-width:calc(100vw - 70px);pointer-events:none;transition:opacity .8s,transform .8s;opacity:1}.story .eyebrow{font-size:7px;letter-spacing:3.2px;color:#8c9fbe;margin:0 0 22px;font-weight:400;line-height:1.7}.story h1{font-size:43px;line-height:1.48;letter-spacing:2px;font-weight:300;margin:0;text-shadow:0 2px 25px #02040be6}.story-description{font-size:10px;line-height:2.2;letter-spacing:1px;color:#97a7c0;margin:20px 0 27px;text-shadow:0 1px 10px #02040b}.primary-action{pointer-events:auto;display:flex;align-items:center;justify-content:space-between;min-width:162px;gap:34px;padding:13px 17px;background:linear-gradient(115deg,#b8d5ff15,#8cacda09);border:1px solid #bed5ff57;border-radius:3px;color:#d6e6ff;min-height:44px;font-size:10px;letter-spacing:2px;backdrop-filter:blur(10px);transition:background .3s,box-shadow .3s,border-color .3s}.primary-action:hover{background:#bdd8ff25;box-shadow:0 0 30px #8cb8f521;border-color:#c8ddff9c}.primary-action:disabled{opacity:.4}.action-arrow{font-size:16px;line-height:1;letter-spacing:0}.interaction-hint{font-size:7px;letter-spacing:1px;color:#566986;display:block;margin-top:15px}.world-target{position:absolute;left:50%;top:45%;z-index:6;display:flex;align-items:center;gap:13px;border:0;background:none;padding:0;color:#c7dfff;transform:translate(-23px,-23px);min-height:46px;transition:opacity .5s;will-change:left,top;white-space:nowrap}.world-target:disabled{opacity:.25}.target-orbit{width:46px;height:46px;display:grid;place-items:center;position:relative;flex-shrink:0}.target-orbit:before,.target-orbit:after{content:"";position:absolute;inset:7px;border:1px solid #a4ceff7a;border-radius:50%;box-shadow:0 0 18px #86bdf735}.target-orbit:after{inset:1px;border-color:#a4ceff22;animation:targetPulse 3s ease-out infinite}.target-orbit>i{width:5px;height:5px;border-radius:50%;background:#d4eaff;box-shadow:0 0 14px 3px #80bfff99}.target-label{text-align:left;font-size:11px;letter-spacing:2px;text-shadow:0 1px 15px #000,0 1px 5px #000}.target-label>small{font-size:7px;display:block;letter-spacing:1px;color:#819bbf;margin-top:7px}.henan-target{color:#ffe1f0}.henan-target .target-orbit:before{border-color:#ffb2d3b3;box-shadow:0 0 20px #ff84b53b}.henan-target .target-orbit:after{border-color:#ffc0dc4d}.henan-target .target-orbit>i{background:#ffd6e9;box-shadow:0 0 13px 3px #ff7bb899}.henan-target .target-label>small{color:#ce9db8}.province-caption{position:absolute;right:45px;bottom:125px;z-index:3;display:flex;gap:12px;align-items:center;color:#efbad5;font-size:11px;letter-spacing:2px;text-align:left;pointer-events:none}.province-caption i{height:5px;width:5px;background:#ffc0de;border-radius:50%;box-shadow:0 0 13px 3px #ff8ac74d}.province-caption small{display:block;color:#ab7e9d;font-size:7px;margin-top:9px;letter-spacing:1px}.bottom-bar{position:absolute;bottom:23px;left:44px;right:44px;z-index:5;display:flex;align-items:center;justify-content:space-between;pointer-events:none;color:#46536d;font-size:6px;letter-spacing:2px}.render-note{display:flex;align-items:center;gap:8px;font-size:7px;letter-spacing:1px}.render-note>i{display:block;width:3px;height:3px;border-radius:50%;background:#7197bf}.travel-caption{position:absolute;bottom:15%;left:50%;transform:translate(-50%,10px);opacity:0;z-index:4;pointer-events:none;text-align:center;transition:opacity 1s,transform 1s}.travel-caption>span{display:block;margin:0 auto;width:1px;height:28px;background:linear-gradient(transparent,#b3c7e4);animation:travelLine 1.5s ease infinite}.travel-caption>p{font-size:10px;letter-spacing:3px;color:#a0b2cd;white-space:nowrap;margin-top:18px}.is-travelling .story,.is-travelling .world-target{opacity:0;pointer-events:none}.is-travelling .story{transform:translateY(15px)}.is-travelling .travel-caption{opacity:1;transform:translate(-50%,0)}body[data-stage=cake] .story .eyebrow{color:#da96b7}body[data-stage=cake] .story h1{color:#ffe1f0;font-size:35px;letter-spacing:1px}body[data-stage=cake] .primary-action{border-color:#f3a9d36b;color:#f7cfe6;background:#ed7db014}body[data-stage=cake] .primary-action:hover{background:#ed7db02c;box-shadow:0 0 30px #f484bb20}body[data-stage=cake] .interaction-hint{color:#8e6e88}.loading-screen{position:absolute;inset:0;background:#02040b;z-index:50;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:opacity 1s,visibility 1s}.loading-screen.ready{opacity:0;visibility:hidden;pointer-events:none}.loading-screen>p{font-size:11px;letter-spacing:3px;color:#b2c4df;margin-top:28px}.loading-screen>span{font-size:6px;letter-spacing:3px;color:#475871;margin-top:8px}.loading-orbit{width:50px;height:50px;border:1px solid #789dcf20;border-top-color:#c3dcffb3;border-radius:50%;animation:orbitSpin 2s linear infinite;position:relative}.loading-orbit:before{content:"";position:absolute;inset:10px;border:1px solid #789dcf24;border-radius:50%}.loading-orbit>i{position:absolute;width:4px;height:4px;top:5px;left:7px;border-radius:50%;background:#c4deff;box-shadow:0 0 12px #8fc3ff}.fatal{position:absolute;inset:0;background:#02040bf0;z-index:100;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;padding:30px}.fatal>span{font-size:40px;color:#a9c7ef}.fatal h2{font-size:19px;font-weight:400;letter-spacing:2px}.fatal p{font-size:11px;line-height:2;color:#98a8c2;max-width:380px}.fatal button{background:none;border:1px solid #9abbea45;border-radius:3px;color:#b4ceef;font-size:10px;padding:12px 20px;margin-top:15px}.toast{position:absolute;bottom:48px;left:50%;transform:translate(-50%,10px);z-index:40;opacity:0;pointer-events:none;color:#d5e1f5;background:#0b1428bd;border:1px solid #a8c8f12e;padding:12px 20px;border-radius:30px;font-size:10px;letter-spacing:1px;backdrop-filter:blur(12px);transition:.3s;text-align:center;max-width:90vw;white-space:nowrap}.toast.visible{opacity:1;transform:translate(-50%,0)}@keyframes targetPulse{0%{transform:scale(.8);opacity:.85}100%{transform:scale(1.5);opacity:0}}@keyframes orbitSpin{to{transform:rotate(360deg)}}@keyframes travelLine{50%{opacity:.3;transform:translateY(4px)}}
@media(min-width:1500px){.story{left:6%;bottom:13%}.story h1{font-size:49px}.topbar{padding-left:4%;padding-right:4%}.scene-coordinate{left:4%}}
@media(max-width:750px){.topbar{padding:22px 22px;gap:15px}.wordmark{font-size:12px;letter-spacing:2px;gap:8px}.brand-star{font-size:27px}.wordmark small{font-size:5px;letter-spacing:1.6px;margin-top:6px}.journey-steps{position:absolute;top:91px;left:22px;gap:17px;margin:0}.journey-steps li{font-size:7px;gap:5px;letter-spacing:.8px}.journey-steps li+li:before{width:7px;left:-12px}.journey-steps i{width:2px;height:2px}.reset-button{padding:8px 10px;min-height:32px;gap:6px}.reset-button>small{font-size:7px;letter-spacing:.6px}.reset-button>span{font-size:17px}.scene-coordinate{top:89px;right:22px;left:auto;gap:6px;font-size:5px;letter-spacing:1.3px}.scene-coordinate>span:first-child{font-size:13px}.scene-coordinate>i{width:13px}.story{left:26px;right:26px;bottom:max(74px,calc(env(safe-area-inset-bottom) + 58px));width:auto;max-width:none}.story .eyebrow{font-size:6px;letter-spacing:2px;margin-bottom:13px}.story h1{font-size:31px;line-height:1.46;letter-spacing:1px}.story-description{font-size:9px;line-height:2;letter-spacing:.4px;margin:13px 0 19px}.primary-action{font-size:9px;padding:12px 15px;min-height:42px;min-width:148px;letter-spacing:1.3px;gap:32px}.interaction-hint{font-size:6px;letter-spacing:.7px;margin-top:12px}.bottom-bar{left:22px;right:22px;bottom:max(20px,env(safe-area-inset-bottom));font-size:5px;letter-spacing:1.3px}.render-note{font-size:5px;letter-spacing:.3px;gap:5px}.world-target{gap:7px;transform:translate(-22px,-22px)}.target-orbit{width:44px;height:44px}.target-label{font-size:9px;letter-spacing:1px}.target-label>small{font-size:6px;letter-spacing:.5px;margin-top:5px}.province-caption{right:23px;bottom:160px;font-size:9px;gap:7px;letter-spacing:1px}.province-caption small{font-size:5px;letter-spacing:.5px;margin-top:6px}.province-caption i{width:3px;height:3px}.travel-caption{bottom:20%}.travel-caption>p{font-size:8px;letter-spacing:2px}.travel-caption>span{height:23px}.vignette{background:radial-gradient(ellipse at 50% 40%,transparent 15%,#02040b24 76%,#02040b55),linear-gradient(0deg,#02040bef,transparent 43%)}body[data-stage=cake] .story h1{font-size:27px}body[data-stage=cake] .story-description{font-size:9px}.toast{font-size:8px;bottom:40px;padding:11px 15px;letter-spacing:.5px;white-space:normal;width:max-content}.loading-screen>p{font-size:10px;letter-spacing:2px}}
@media(max-height:600px) and (min-width:650px){.topbar{padding:19px 30px}.scene-coordinate{top:96px;left:32px}.story{left:40px;bottom:65px;width:350px}.story h1{font-size:30px}.story-description{font-size:9px;margin:12px 0 17px}.story .eyebrow{margin-bottom:13px}.province-caption{bottom:92px}.bottom-bar{bottom:17px}.story .primary-action{padding:10px 14px;min-height:38px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.2s!important}}
.world-target.flip{flex-direction:row-reverse;transform:translate(calc(-100% + 23px),-23px)}.world-target.flip .target-label{text-align:right}
.story-description{font-size:11px}.primary-action{font-size:11px}.interaction-hint{font-size:8px}@media(max-width:750px){.story-description,body[data-stage=cake] .story-description{font-size:10px}.primary-action{font-size:10px}.interaction-hint{font-size:7px}}
.earth-controls{position:absolute;right:42px;bottom:125px;display:flex;align-items:center;gap:13px;z-index:7;border:1px solid #bad8ff38;border-radius:28px;background:#0813248c;backdrop-filter:blur(12px);padding:4px;color:#b7d2f5}.earth-controls>span{font-size:9px;letter-spacing:.7px}.earth-controls>button{width:34px;height:34px;border:0;border-radius:50%;color:#d7eaff;background:#c3ddff09;font-size:20px;line-height:1}.earth-controls>button:hover{background:#c3ddff25}.is-rotating #henanTarget{opacity:.25!important;pointer-events:none!important}.is-rotating #sceneHost canvas{cursor:grabbing}@media(max-width:750px){.earth-controls{right:22px;bottom:278px;gap:6px;padding:3px}.earth-controls>span{font-size:7px;letter-spacing:0}.earth-controls>button{width:27px;height:27px;font-size:17px}}
@media(min-width:751px){.vignette{background:linear-gradient(90deg,#02040ba6,transparent 37%),radial-gradient(ellipse at 53% 43%,transparent 25%,#01030a20 75%,#01030a60),linear-gradient(0deg,#02040bad,transparent 31%)}}
.zoom-controls{position:absolute;z-index:9;right:42px;top:110px;display:flex;align-items:center;gap:2px;padding:4px;border:1px solid #b2ccef35;background:#091223a6;backdrop-filter:blur(12px);border-radius:25px;transition:opacity .6s}.zoom-controls button{width:31px;height:31px;border:0;border-radius:50%;background:none;color:#d2e6ff;font-size:17px;padding:0}.zoom-controls button:hover{background:#b5d7ff24}.zoom-controls>span{font-size:9px;color:#a3b9d9;min-width:43px;text-align:center;letter-spacing:.7px}.zoom-controls #zoomReset{border-left:1px solid #b0c8eb26;border-radius:0;font-size:16px;color:#8ea7cb;width:28px}.is-travelling .zoom-controls{opacity:0;pointer-events:none}@media(max-width:750px){.zoom-controls{right:22px;top:130px;padding:3px}.zoom-controls button{width:28px;height:28px;font-size:16px}.zoom-controls>span{font-size:8px;min-width:38px}.zoom-controls #zoomReset{width:26px}}
.candle-view{display:inline-block;pointer-events:auto;background:none;border:0;border-bottom:1px solid #edadd132;color:#d59dbf;font-size:9px;letter-spacing:.7px;padding:7px 0;margin-top:10px;min-height:30px}.candle-view:hover{color:#ffe0ef;border-color:#f6bad77a}@media(max-width:750px){.candle-view{font-size:8px;margin-top:6px;min-height:28px}}.is-travelling .zoom-controls{visibility:hidden}
.birthday-mascot{position:absolute;z-index:5;left:34px;top:100px;width:clamp(150px,27vh,225px);pointer-events:none;filter:drop-shadow(0 0 20px #ffafd529);animation:mascotArrival 1.4s cubic-bezier(.16,1,.3,1) both}
.birthday-mascot[hidden]{display:none!important}.birthday-mascot img{display:block;width:100%;height:auto}
body[data-stage=cake] .scene-coordinate{opacity:0}
@keyframes mascotArrival{from{opacity:0;transform:translateY(22px) scale(.88) rotate(-5deg)}to{opacity:1;transform:translateY(0) scale(1) rotate(0)}}
@media(min-width:751px){body[data-stage=cake] .story{bottom:52px}body[data-stage=cake] .story-description{margin:12px 0 18px}body[data-stage=cake] .story .eyebrow{margin-bottom:12px}}
@media(max-width:750px){.birthday-mascot{left:17px;top:126px;width:clamp(118px,35vw,155px)}}
@media(prefers-reduced-motion:reduce){.birthday-mascot{animation:none}}
.cream-cake-hero{--cake-reveal:1;--cake-zoom:1;position:absolute;z-index:3;pointer-events:none;left:52%;top:52%;width:min(62vh,42vw,490px);transform:translate(-50%,-50%) scale(calc(var(--cake-reveal)*var(--cake-zoom)));transform-origin:center;transition:opacity .5s,transform .9s cubic-bezier(.16,1,.3,1)}
.cream-cake-hero[hidden]{display:none!important}.cream-cake-hero img{display:block;width:100%;height:auto;filter:drop-shadow(0 10px 18px #0005)}
@media(max-width:750px){.cream-cake-hero{left:50%;top:47%;width:min(83vw,40vh)}}
@media(prefers-reduced-motion:reduce){.cream-cake-hero{transition:none}}
#sceneHost{z-index:1}
.birthday-fireworks-canvas{-webkit-mask-image:radial-gradient(ellipse 20vw 33vh at 50% 54%,transparent 0 72%,#000 100%);mask-image:radial-gradient(ellipse 20vw 33vh at 50% 54%,transparent 0 72%,#000 100%)}
@media(max-width:750px){.birthday-fireworks-canvas{-webkit-mask-image:radial-gradient(ellipse 38vw 19vh at 50% 52%,transparent 0 72%,#000 100%);mask-image:radial-gradient(ellipse 38vw 19vh at 50% 52%,transparent 0 72%,#000 100%)}body[data-stage=cake] .story{bottom:max(38px,calc(env(safe-area-inset-bottom) + 28px))}}
@media(max-width:750px){
  body[data-stage=cake] .story{left:23px;bottom:max(46px,calc(env(safe-area-inset-bottom) + 36px));width:calc(100vw - 46px);max-width:none}
  body[data-stage=cake] .story .eyebrow{display:none}
  body[data-stage=cake] .story h1{font-size:24px;line-height:1.28;letter-spacing:1px}
  body[data-stage=cake] .story-description{font-size:9px;line-height:1.7;margin:9px 0 12px}
  body[data-stage=cake] .primary-action{display:inline-flex;min-width:142px;min-height:40px;padding:10px 13px;vertical-align:middle}
  body[data-stage=cake] .candle-view{display:inline-block;margin:0 0 0 12px;vertical-align:middle}
  body[data-stage=cake] .interaction-hint{margin-top:11px}
  body[data-stage=cake] .topbar{padding-top:calc(10px + env(safe-area-inset-top));padding-bottom:12px}
  body[data-stage=cake] .journey-steps{top:calc(58px + env(safe-area-inset-top))}
  body[data-stage=cake] .birthday-mascot{top:calc(72px + env(safe-area-inset-top));width:96px}
  body[data-stage=cake] .province-caption{bottom:252px}
}

/* A visible, quiet invitation anchored to the solar system. */
.solar-target{left:auto;right:clamp(90px,13vw,240px);top:clamp(160px,22vh,220px);min-height:68px;transform:none}
.solar-anchor{position:absolute;z-index:6;width:64px;height:64px;transform:translate(-32px,-32px);pointer-events:none;transition:opacity .6s}
.solar-anchor .target-orbit{width:64px;height:64px}
.solar-anchor .target-orbit:before{inset:9px;border-color:#c6e6ffc9;background:radial-gradient(circle,#a9dbff15,transparent 65%);box-shadow:0 0 24px #a7d8ff30,inset 0 0 14px #aedbff18}
.solar-anchor .target-orbit:after{inset:1px;border-color:#bbdfff70;animation:solarInvitation 4.2s ease-out infinite}
.solar-anchor .target-orbit>i{width:8px;height:8px;background:#f1fbff;box-shadow:0 0 10px 3px #b3e5ffb3,0 0 28px 7px #75bfff45}
.solar-guide{position:absolute;inset:0;width:100%;height:100%;z-index:5;pointer-events:none;transition:opacity .6s;overflow:visible}
.solar-guide[hidden]{display:none}
.solar-guide path{fill:none;stroke:#bddfff78;stroke-width:1;stroke-linecap:round;stroke-dasharray:3 5}
.is-travelling .solar-anchor,.is-travelling .solar-guide{opacity:0!important}
.solar-target .target-label{position:relative;padding:10px 15px 11px;border:1px solid #b5d9ff66;border-radius:12px;background:linear-gradient(125deg,#182b47d9,#0a152bc2);box-shadow:0 8px 28px #02040b66,0 0 24px #8abfff14;backdrop-filter:blur(12px);text-shadow:none;transition:background .3s,border-color .3s,box-shadow .3s}
.solar-target .target-kicker{display:block;font-size:7px;letter-spacing:2px;color:#a4bedc;margin-bottom:4px}
.solar-target .target-label strong{display:flex;align-items:center;justify-content:space-between;gap:20px;font-size:16px;font-weight:500;line-height:1.25;letter-spacing:2px;color:#eff8ff}
.solar-target .target-label strong>span{font-size:18px;color:#bdddff;font-weight:300}
.solar-target .target-label>small{font-size:10px;line-height:1.2;color:#bdd8f6;letter-spacing:1px;margin-top:6px}
.solar-target:hover .target-label,.solar-target:focus-visible .target-label{border-color:#e0f3ffbd;background:linear-gradient(125deg,#233e62e8,#102440df);box-shadow:0 8px 30px #02040b66,0 0 28px #9bd0ff2b}
.solar-target.flip{transform:none}
.solar-target.flip .target-label{text-align:left}
@keyframes solarInvitation{0%{transform:scale(.88);opacity:.72}72%,100%{transform:scale(1.38);opacity:0}}
@media(max-width:750px){.solar-target{right:26px;top:clamp(160px,22vh,190px)}.solar-target .target-label{padding:9px 12px 10px;border-radius:11px}.solar-target .target-label strong{font-size:15px;gap:16px}.solar-target .target-kicker{font-size:6px}.solar-target .target-label>small{font-size:9px;letter-spacing:.7px}}
@media(prefers-reduced-motion:reduce){.solar-anchor .target-orbit:after{animation:none;opacity:.35}}
