@font-face{font-family:Manrope;src:url('assets/manrope.ttf') format('truetype');font-style:normal;font-weight:200 800;font-display:swap}
@font-face{font-family:Birthday Sans;src:url('assets/chinese-subset.woff2') format('woff2');font-style:normal;font-weight:100 900;font-display:swap}
:root{--blue:#002fa7;--paper:#f4f4ef;--pale:#a9c7ff;--mid:#658cf3;--flame:#ffac70;--pink:#f1b7c9;--ink:#002b97;--ease:cubic-bezier(.16,1,.3,1)}
*{box-sizing:border-box}html{background:var(--paper);scrollbar-color:var(--blue) var(--paper);scrollbar-width:thin}body{margin:0;font-family:Manrope,'Birthday Sans','Microsoft YaHei',sans-serif;color:var(--blue);-webkit-font-smoothing:antialiased}body.birthday-mode{background:var(--blue);color:var(--paper)}body.quote-mode{background:var(--paper);color:var(--blue)}::selection{background:var(--flame);color:var(--blue)}button,a{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer;border:0;background:none}button:disabled{cursor:default}button:focus-visible,a:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--flame);outline-offset:7px}a{color:inherit;text-decoration:none}svg{display:block}button svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}button{min-height:44px}[hidden]{display:none!important}p,h1{margin:0}h1{font-family:'Birthday Sans','Microsoft YaHei',sans-serif;font-weight:500;letter-spacing:-.04em;line-height:1.2}h1:focus{outline:none}.period{color:var(--mid)}
.site-header{height:104px;padding:0 4.2%;display:flex;align-items:center;justify-content:space-between;position:relative;z-index:20}.wordmark{display:inline-flex;align-items:center;gap:13px;font-size:17px;font-weight:600;letter-spacing:.02em}.wordmark svg{width:27px;height:27px}.sound-control{display:flex;align-items:center;gap:11px;font-size:13px;padding:0 0 0 12px}.sound-control #sound-state{width:27px;height:27px;display:grid;place-items:center;border:1px solid currentColor;border-radius:50%;font-size:11px}.equalizer{display:flex;align-items:center;gap:3px;height:18px;margin-right:3px}.equalizer i{display:block;width:2px;height:6px;background:currentColor}.equalizer i:nth-child(2){height:15px}.equalizer i:nth-child(3){height:10px}.equalizer i:nth-child(4){height:18px}.sound-control[aria-pressed=true] .equalizer i{animation:equalize 1.1s ease-in-out infinite alternate}.sound-control[aria-pressed=true] .equalizer i:nth-child(2){animation-delay:-.4s}.sound-control[aria-pressed=true] .equalizer i:nth-child(3){animation-delay:-.7s}.sound-control[aria-pressed=true] .equalizer i:nth-child(4){animation-delay:-.2s}
.game-view{min-height:calc(100svh - 104px);padding:0 2.1% 2.1%;display:grid;grid-template-columns:.88fr 1.25fr;gap:20px}.game-copy{display:flex;flex-direction:column;justify-content:space-between;padding:8.3vh 4.5% 24px 5%}.game-heading h1{font-size:clamp(44px,5.2vw,80px)}.game-heading p{font-size:14px;line-height:1.8;margin-top:32px;color:var(--ink)}.game-meta{padding-top:55px}.progress{display:flex;gap:23px;align-items:center;font-size:13px;letter-spacing:.04em;font-variant-numeric:tabular-nums}.progress-shapes{display:flex;gap:10px;align-items:center}.progress-shapes i{width:12px;height:12px;border:1px solid var(--blue);transition:background .3s,transform .5s var(--ease)}.progress-shapes i:nth-child(2){border-radius:50%}.progress-shapes i:nth-child(3){transform:rotate(45deg);width:10px;height:10px;margin:0 2px}.progress-shapes i:nth-child(4){border-radius:50% 50% 0 0}.progress-shapes i:nth-child(5){border-radius:0 50% 50% 50%;transform:rotate(45deg)}.progress-shapes i.done{background:var(--blue)}.game-actions{display:flex;justify-content:space-between;align-items:center;gap:22px;margin-top:38px}.text-button{display:inline-flex;align-items:center;justify-content:center;gap:11px;font-size:13px;position:relative;padding:0;transition:opacity .2s}.text-button:hover{opacity:.65}.text-button:active{transform:translateY(1px)}.game-actions .text-button:first-child{opacity:.7}.game-field{background:var(--blue);min-height:530px;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden}.game-field>svg{width:100%;max-height:calc(100svh - 142px);touch-action:none;overflow:visible}.board-help{position:absolute;bottom:21px;left:12px;right:12px;text-align:center;font-size:11px;color:var(--paper);opacity:.85;pointer-events:none}.puzzle-slot{fill:var(--paper);fill-opacity:.025;stroke:var(--paper);stroke-opacity:.4;stroke-width:1.5;stroke-dasharray:5 7;cursor:pointer;transition:fill-opacity .25s,stroke-opacity .25s}.puzzle-slot.highlight{fill-opacity:.13;stroke-opacity:1;stroke-dasharray:0}.puzzle-slot.placed{opacity:0;pointer-events:none}.puzzle-piece{cursor:grab;touch-action:none;outline:none}.puzzle-piece path{stroke:var(--blue);stroke-width:1;stroke-linejoin:round}.puzzle-piece:focus-visible path,.puzzle-piece.selected path{stroke:var(--flame);stroke-width:3}.puzzle-piece.dragging{cursor:grabbing}.puzzle-piece.dragging path{filter:drop-shadow(0 12px 9px #001c6340)}.puzzle-piece.placed{pointer-events:none;cursor:default}.puzzle-piece.settling{transition:transform .5s var(--ease)}.completion-mark{position:absolute;right:25px;top:25px;width:35px;height:35px;opacity:0;transform:scale(.5);transition:opacity .3s,transform .6s var(--ease);color:var(--paper)}.completion-mark svg{fill:none;stroke:currentColor;stroke-width:1.5}.game-field.complete .completion-mark{opacity:1;transform:scale(1)}.game-field.complete .board-help{opacity:0}
.birthday-view{min-height:calc(100svh - 104px);position:relative;display:grid;grid-template-columns:1fr 1.2fr;align-items:center;padding:0 5.5% 100px;overflow:hidden}.birthday-copy{z-index:2;align-self:center;position:relative;padding-bottom:50px}.birthday-copy h1{font-size:clamp(45px,5.8vw,88px);line-height:1.23;font-weight:400}.birthday-copy .period{color:var(--flame)}.birthday-actions{display:flex;align-items:center;gap:36px;margin-top:48px}.round-action{display:flex;align-items:center;justify-content:space-between;gap:35px;min-width:160px;min-height:58px;background:var(--paper);color:var(--blue);padding:0 24px;font-size:15px;border-radius:0;transition:background .2s,transform .3s var(--ease)}.round-action:hover{background:var(--pale);transform:translateY(-3px)}.round-action:disabled{opacity:.65;transform:none}.gift-button{font-size:14px}.cake-stage{position:relative;align-self:center;width:115%;margin-left:-5%;transform:translateY(-15px)}.birthday-cake{width:100%;overflow:visible;transform:translateZ(0)}.cake-orbit{color:var(--pale);opacity:.3}.candle-flame{transform-origin:400px 150px;animation:flicker 2.1s ease-in-out infinite alternate}.candle-flame.extinguished{animation:none;transform:scale(0);opacity:0;transition:transform .6s var(--ease),opacity .4s}.cake-star{transform-origin:615px 157px}.candle-hit-area{position:absolute;top:11%;left:43%;width:14%;height:34%;border-radius:50%;z-index:3}.candle-hit-area:disabled{pointer-events:none}.candle-hit-area.ready:after{content:'';position:absolute;inset:10% -10% 8%;border:1px solid var(--paper);border-radius:50%;opacity:.65;animation:candle-hint 2.5s ease-in-out infinite}.wish-instruction{position:absolute;bottom:-12px;left:0;right:-20px;line-height:1.8;font-size:13px;color:var(--paper)}.birthday-bottom{position:absolute;bottom:30px;left:5.5%;right:5.5%;display:flex;justify-content:space-between;gap:24px}.birthday-bottom .text-button{font-size:12px;opacity:.85}.birthday-view.entering .birthday-copy{animation:arrive .9s var(--ease) both}.birthday-view.entering .cake-stage{animation:arrive 1.1s .08s var(--ease) both}
.gift-composition{position:absolute;inset:8% 6%;background:var(--paper);color:var(--blue);display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:4;animation:gift-open .65s var(--ease) both}.close-gift,.close-quote{display:grid;place-items:center;position:absolute;right:20px;top:14px;width:44px;height:44px}.origami-bow{position:relative;width:260px;height:180px;--bow:var(--pink);margin:20px 0 35px;perspective:500px}.origami-bow i{position:absolute;top:0;width:140px;height:150px;background:var(--bow);transition:background .5s,transform .7s var(--ease)}.origami-bow i:first-child{left:0;clip-path:polygon(0 0,100% 43%,100% 57%,0 100%);transform:rotate(-8deg)}.origami-bow i:nth-child(2){right:0;clip-path:polygon(100% 0,0 43%,0 57%,100% 100%);transform:rotate(8deg)}.origami-bow b{position:absolute;left:116px;top:62px;width:29px;height:29px;background:var(--blue);transform:rotate(45deg)}.origami-bow:before,.origami-bow:after{content:'';position:absolute;top:100px;width:38px;height:100px;background:var(--bow);clip-path:polygon(0 0,100% 0,100% 100%,50% 82%,0 100%);transition:background .5s}.origami-bow:before{left:97px;transform:rotate(24deg)}.origami-bow:after{left:130px;transform:rotate(-24deg)}.origami-bow:hover i:first-child{transform:rotate(-15deg)}.origami-bow:hover i:nth-child(2){transform:rotate(15deg)}
.quote-view{min-height:calc(100svh - 104px);position:relative;display:grid;grid-template-columns:.75fr 1.25fr;padding:4vh 9% 7vh;align-items:center;gap:8%;animation:arrive .7s var(--ease)}.quote-content>p{font-family:'Birthday Sans','Microsoft YaHei',sans-serif;font-size:clamp(31px,4.4vw,66px);line-height:1.55;font-weight:400;letter-spacing:-.03em;outline:none}.quote-content>p span{color:var(--blue);position:relative}.quote-credit{display:flex;justify-content:space-between;align-items:center;gap:25px;margin-top:35px;font-size:12px}.quote-decoration{width:100%;aspect-ratio:1;position:relative;align-self:center;max-width:340px}.quote-decoration i{position:absolute;left:0;width:100%;height:48%;border-radius:100% 100% 0 0;background:var(--blue);transform-origin:bottom center}.quote-decoration i:nth-child(1){transform:rotate(-42deg)}.quote-decoration i:nth-child(2){transform:rotate(0);opacity:.8}.quote-decoration i:nth-child(3){transform:rotate(42deg);opacity:.6}.quote-decoration:after{content:'';position:absolute;width:2px;height:40%;background:var(--blue);bottom:5%;left:50%;transform:rotate(14deg);transform-origin:top}.close-quote{right:4.2%;top:5px}.scene-transition{position:fixed;inset:0;z-index:50;pointer-events:none;background:var(--blue);clip-path:circle(0 at 73% 49%);transition:clip-path .65s var(--ease)}.scene-transition.active{clip-path:circle(150% at 73% 49%)}#confetti{position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:60}.sr-only{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.noscript{margin:30px;line-height:1.8}
@keyframes equalize{from{transform:scaleY(.35)}to{transform:scaleY(1)}}@keyframes flicker{from{transform:rotate(-3deg) scaleX(.95)}to{transform:rotate(3deg) scaleX(1.04)}}@keyframes arrive{from{opacity:0;transform:translateY(22px)}to{opacity:1;transform:translateY(0)}}@keyframes gift-open{from{opacity:0;clip-path:inset(45% 0 45%)}to{opacity:1;clip-path:inset(0)}}@keyframes candle-hint{0%,100%{transform:scale(.92);opacity:.25}50%{transform:scale(1.05);opacity:.7}}
@media(min-width:1600px){.game-view{max-width:1900px;margin:auto}.birthday-view{max-width:1800px;margin:auto}.game-heading h1{font-size:88px}}
@media(max-width:900px){.site-header{height:88px;padding:0 6%}.game-view{min-height:calc(100svh - 88px);grid-template-columns:.85fr 1.2fr;gap:10px;padding:0 2.5% 2.5%}.game-copy{padding:6vh 5% 15px}.game-heading h1{font-size:43px}.game-field{min-height:480px}.game-heading p{font-size:12px;margin-top:25px}.game-actions{gap:12px}.game-actions .text-button{font-size:11px}.board-help{font-size:10px}.birthday-view{min-height:calc(100svh - 88px);padding:0 6% 100px;grid-template-columns:1fr 1.1fr}.birthday-copy h1{font-size:49px}.birthday-actions{gap:22px}.round-action{min-width:140px;padding:0 18px}.cake-stage{width:125%;margin-left:-12%}.quote-view{padding:5vh 8%;min-height:calc(100svh - 88px);gap:7%;grid-template-columns:.6fr 1.4fr}}
@media(max-width:600px){.site-header{height:76px;padding:0 6%}.wordmark{font-size:15px;gap:10px}.wordmark svg{width:23px;height:23px}.sound-control{font-size:11px;gap:8px}.game-view{display:flex;flex-direction:column;gap:22px;padding:15px 5% 18px;min-height:calc(100svh - 76px)}.game-copy{padding:0 2%;gap:22px}.game-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:13px}.game-heading h1{font-size:37px;line-height:1.23}.game-heading p{font-size:11px;width:88px;line-height:1.8;margin:0 0 5px}.game-meta{padding:0;display:flex;justify-content:space-between;align-items:center;gap:15px}.progress{gap:13px;font-size:11px}.progress-shapes{gap:8px}.progress-shapes i{width:9px;height:9px}.progress-shapes i:nth-child(3){width:7px;height:7px}.game-actions{margin:0;gap:17px}.game-actions .text-button{font-size:10px}.game-field{flex:1;min-height:330px}.game-field>svg{width:100%;max-height:none;min-height:330px}.board-help{bottom:15px;font-size:10px}.birthday-view{min-height:calc(100svh - 76px);display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;padding:30px 8% 93px}.birthday-copy{padding:0;align-self:stretch}.birthday-copy h1{font-size:clamp(39px,10.8vw,61px);line-height:1.2}.birthday-actions{margin-top:28px;gap:30px}.round-action{min-height:47px;min-width:143px;font-size:13px}.gift-button{font-size:12px}.cake-stage{width:118%;margin-left:-9%;margin-top:-6px;transform:none}.birthday-cake{width:100%;max-height:390px}.birthday-bottom{bottom:19px;left:8%;right:8%}.birthday-bottom .text-button{font-size:11px}.wish-instruction{position:relative;bottom:auto;margin-top:16px;font-size:12px}.gift-composition{inset:4% 7%}.origami-bow{transform:scale(.72);margin:0 0 0}.close-gift{right:8px;top:4px}.gift-composition>.text-button{font-size:11px;margin-top:-18px}.quote-view{min-height:calc(100svh - 76px);display:flex;flex-direction:column;align-items:stretch;padding:40px 8% 30px;gap:25px;justify-content:center}.quote-decoration{width:95px;align-self:flex-start;margin-bottom:10px}.quote-content>p{font-size:clamp(29px,8.8vw,44px);line-height:1.6}.quote-credit{font-size:11px;margin-top:30px}.quote-credit .text-button{font-size:11px}.close-quote{right:5%;top:3px}}
@media(max-width:360px){.game-heading h1{font-size:32px}.game-actions{gap:10px}.game-actions .text-button{font-size:9px}.progress-shapes{gap:6px}.game-field,.game-field>svg{min-height:290px}.birthday-copy h1{font-size:37px}.birthday-view{padding-top:20px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}.candle-flame{animation:none}.birthday-view.entering .birthday-copy,.birthday-view.entering .cake-stage{animation:none}}
.sound-tools{display:flex;align-items:center;gap:14px}.audio-credit{display:grid;place-items:center;width:30px;height:44px;opacity:.65}.audio-credit:hover{opacity:1}.audio-credit svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.2}
/* Linear birthday ritual */
.site-header{justify-content:flex-end}.sound-tools{margin-left:auto}.back-button{margin-right:auto;width:44px;min-height:44px;padding:10px}.back-button svg{width:23px;height:23px}.sound-control{padding:0 6px;min-width:35px;justify-content:center}.audio-credit{opacity:.45}.game-copy{justify-content:center;padding-top:0;padding-bottom:8vh}.game-heading h1{font-size:clamp(48px,5.3vw,82px);font-weight:500}.game-heading p{margin-top:22px;font-size:14px;letter-spacing:.08em}.game-field{background:var(--blue)}.puzzle-piece:hover:not(.placed) path{stroke:var(--paper);stroke-width:2}.puzzle-fire{pointer-events:none;opacity:0;transform:scale(.1);transform-origin:400px 158px}.game-field.complete .puzzle-fire{animation:ignite .85s var(--ease) both,flicker 2.1s .85s ease-in-out infinite alternate}.game-field.complete .puzzle-piece{transition:transform .6s var(--ease)}
h1[tabindex]:focus,#quote-title:focus{outline:0}.birthday-copy h1{font-weight:400;letter-spacing:-.03em}.birthday-actions{min-height:58px}.round-action svg{transition:transform .35s var(--ease)}.round-action:hover svg{transform:translateX(5px)}.round-action:active{transform:translateY(0) scale(.98)}.round-action:focus-visible{outline:2px solid var(--flame);outline-offset:6px}.swipe-instruction{font-size:13px;line-height:1.8;margin-top:24px;letter-spacing:.04em}.swipe-area{position:absolute;left:7%;top:2%;width:86%;height:77%;z-index:5;touch-action:none;cursor:grab;pointer-events:none;outline:none}.swipe-area[aria-disabled=false]{pointer-events:auto}.swipe-area[aria-disabled=false]:active{cursor:grabbing}.swipe-area:focus-visible{outline:1px dashed #f4f4ef99;outline-offset:0;border-radius:50%}.cake-stage{--wind-force:0;--wind-direction:1}.candle-flame{transform-origin:400px 155px;animation:flicker 2.5s ease-in-out infinite alternate;transition:transform .15s ease-out}.wind-lines{opacity:0;transform-origin:400px 150px;transition:opacity .3s;pointer-events:none}.wind-active .wind-lines{opacity:calc(.2 + var(--wind-force)*.65);transform:translateX(calc(var(--wind-force)*40px)) scaleX(var(--wind-direction));stroke-dasharray:140 100;animation:wind-flow .7s linear infinite}.wind-active .candle-flame{animation:none;transform:rotate(calc(var(--wind-direction)*var(--wind-force)*32deg)) scaleX(calc(1 - var(--wind-force)*.3)) scaleY(calc(1 - var(--wind-force)*.15))}.cake-stage .candle-flame.blowing{animation:flame-out .65s ease-out forwards}.candle-smoke{opacity:0;transform-origin:400px 155px;pointer-events:none}.candle-smoke path{stroke-dasharray:150;stroke-dashoffset:150}.candle-smoke.rising{animation:smoke-rise 2.3s ease-out forwards}.candle-smoke.rising path{animation:smoke-draw 1.5s ease-out forwards}.candle-smoke.rising path:nth-child(2){animation-delay:.16s}.cake-star{animation:star-turn 16s ease-in-out infinite}.cake-orbit{stroke-dasharray:1000 50;animation:orbit-line 20s linear infinite}.dot-one{animation:float-dot 4.4s ease-in-out infinite alternate}.dot-two{animation:float-dot 5s 1s ease-in-out infinite alternate}
.quote-content #quote-title{font-size:clamp(31px,4.4vw,66px);line-height:1.55;font-weight:400;letter-spacing:-.025em}.quote-content #quote-title>span{display:block}.quote-content>.quote-credit{display:block;font-size:12px;line-height:1.8;letter-spacing:.02em;margin-top:30px;color:var(--blue);font-family:Manrope,'Birthday Sans',sans-serif}.quote-view.playing #quote-title>span{animation:quote-line 1s var(--ease) both}.quote-view.playing #quote-title>span:nth-child(2){animation-delay:.35s}.quote-view.playing #quote-title>span:nth-child(3){animation-delay:.7s}.quote-view.playing #quote-title>span:nth-child(4){animation-delay:1.05s}.quote-view.playing .quote-decoration{animation:quote-leaf 1.5s var(--ease) both}.quote-view.playing .quote-credit{animation:quote-line 1s 1.4s var(--ease) both}.quote-timer{position:absolute;bottom:38px;left:50%;width:68px;height:1px;background:#002fa71f;transform:translateX(-50%)}.quote-timer i{display:block;width:100%;height:100%;background:var(--blue);transform-origin:left}.quote-view.playing .quote-timer i{animation:quote-time var(--quote-duration,7200ms) linear both}
.eyelids{position:fixed;inset:0;z-index:45;pointer-events:none}.eyelids i{position:absolute;left:0;width:100%;height:51%;background:#001f75;transition:transform 1.1s cubic-bezier(.76,0,.24,1)}.eyelids i:first-child{top:0;transform:translateY(-105%)}.eyelids i:last-child{bottom:0;transform:translateY(105%)}.eyelids.closed{pointer-events:auto}.eyelids.closed i{transform:translateY(0)}
.gift-overlay{position:fixed;inset:0;z-index:65;display:flex;align-items:center;justify-content:center;padding:22px;background:#001b6580;animation:gift-overlay-in .5s ease-out both}.gift-dialog{position:relative;width:min(430px,100%);height:min(560px,82svh);background:var(--paper);color:var(--blue);box-shadow:0 28px 70px #001b6740;overflow:hidden;animation:gift-dialog-in .65s var(--ease) both}.gift-dialog .close-gift{top:12px;right:12px;z-index:4}.gift-wrap{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:40px}.gift-wrap .round-action{background:var(--blue);color:var(--paper);min-width:155px;min-height:52px;font-size:14px}.geometric-gift{width:230px;height:220px;position:relative;transform:translateY(10px)}.gift-box{position:absolute;top:80px;left:25px;width:180px;height:140px;background:var(--blue);transform-origin:bottom;transition:transform .7s var(--ease),opacity .5s}.gift-box>i{display:block;height:100%;width:30px;background:var(--pink);margin:auto}.gift-lid{position:absolute;top:60px;left:15px;width:200px;height:30px;background:var(--blue);z-index:3;transition:transform .8s var(--ease),opacity .6s}.gift-lid>i{display:block;width:30px;height:100%;background:var(--pink);margin:auto}.gift-ribbon{position:absolute;top:10px;width:85px;height:50px;border:11px solid var(--pink);z-index:4;transition:transform .8s var(--ease),opacity .6s}.ribbon-left{left:33px;border-radius:0 70% 0 70%;transform:rotate(8deg)}.ribbon-right{right:33px;border-radius:70% 0 70% 0;transform:rotate(-8deg)}.unwrapping .gift-lid{transform:translate(-30px,-130px) rotate(-18deg);opacity:0}.unwrapping .gift-box{transform:scaleY(.65);opacity:0}.unwrapping .ribbon-left{transform:translate(-90px,-90px) rotate(-35deg);opacity:0}.unwrapping .ribbon-right{transform:translate(90px,-90px) rotate(35deg);opacity:0}.unwrapping .round-action{opacity:0;transition:opacity .3s}.gift-photo{position:absolute;inset:68px 32px 32px;margin:0;animation:photo-arrive .8s var(--ease) both;display:flex;align-items:center;justify-content:center}.gift-photo img{max-width:100%;max-height:100%;object-fit:contain}.gift-placeholder{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px;background:#dfe7fa;color:var(--blue)}.gift-placeholder svg{width:65px;height:65px;fill:none;stroke:currentColor;stroke-width:1.2;opacity:.7}.gift-placeholder span{font-size:12px;letter-spacing:.08em}.gift-visible{overflow:hidden}
@keyframes ignite{0%{opacity:0;transform:translateY(10px) scale(.1)}45%{opacity:1;transform:translateY(0) scale(1.15,.95)}100%{opacity:1;transform:scale(1)}}@keyframes wind-flow{from{stroke-dashoffset:240}to{stroke-dashoffset:0}}@keyframes flame-out{0%{opacity:1;transform:rotate(24deg) scale(.9)}45%{opacity:.8;transform:translate(10px,-2px) rotate(52deg) scale(.8,.5)}100%{opacity:0;transform:translate(26px,-1px) rotate(74deg) scale(.1,.05)}}@keyframes smoke-rise{0%{opacity:0;transform:translateY(0)}25%{opacity:.6}100%{opacity:0;transform:translateY(-28px)}}@keyframes smoke-draw{from{stroke-dashoffset:150}to{stroke-dashoffset:0}}@keyframes star-turn{0%,100%{rotate:0deg;scale:1}50%{rotate:90deg;scale:.78}}@keyframes orbit-line{from{stroke-dashoffset:0}to{stroke-dashoffset:1050}}@keyframes float-dot{from{translate:0 -3px}to{translate:0 3px}}@keyframes quote-line{from{opacity:0;transform:translateY(15px);filter:blur(4px)}to{opacity:1;transform:translateY(0);filter:blur(0)}}@keyframes quote-leaf{from{opacity:0;transform:rotate(-12deg) scale(.95)}to{opacity:1;transform:rotate(0) scale(1)}}@keyframes quote-time{from{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes gift-overlay-in{from{opacity:0}to{opacity:1}}@keyframes gift-dialog-in{from{opacity:0;transform:translateY(35px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes photo-arrive{from{opacity:0;transform:translateY(25px) scale(.93);clip-path:inset(15% 0 15%)}to{opacity:1;transform:translateY(0) scale(1);clip-path:inset(0)}}
@media(max-width:900px){.game-heading h1{font-size:47px}.game-heading p{font-size:13px}.quote-content #quote-title{font-size:clamp(32px,4.9vw,48px)}}
@media(max-width:600px){.game-copy{padding:6px 2% 0;justify-content:flex-start}.game-heading{display:block}.game-heading h1{font-size:39px;line-height:1.25}.game-heading p{font-size:12px;margin-top:12px;width:auto}.game-view{gap:26px;padding-top:18px}.game-field{min-height:330px}.game-field>svg{min-height:330px}.birthday-view{padding-top:34px}.birthday-actions{min-height:48px}.swipe-instruction{font-size:12px;margin-top:22px}.cake-stage{margin-top:12px}.quote-content #quote-title{font-size:clamp(30px,8.6vw,43px);line-height:1.55}.quote-content>.quote-credit{font-size:11px;margin-top:24px}.quote-timer{bottom:23px}.quote-decoration{width:95px}.quote-view{padding-bottom:70px}.gift-wrap{gap:25px}.geometric-gift{transform:scale(.87);margin-bottom:-15px}.gift-dialog{height:min(520px,80svh)}.gift-photo{inset:66px 23px 23px}.gift-dialog .close-gift{top:8px;right:8px}}
@media(prefers-reduced-motion:reduce){.puzzle-fire{transform:none}.game-field.complete .puzzle-fire{animation:none;opacity:1;transform:none}.wind-active .wind-lines{animation:none;stroke-dasharray:none}.quote-view.playing #quote-title>span,.quote-view.playing .quote-credit,.quote-view.playing .quote-decoration{animation:none;opacity:1;transform:none;filter:none}.candle-smoke.rising{animation:none;opacity:.3}.candle-smoke.rising path{animation:none;stroke-dashoffset:0}.cake-stage .candle-flame.blowing{animation:none;opacity:0}.quote-timer{display:none}.cake-star,.cake-orbit,.cake-dot{animation:none}.gift-dialog,.gift-overlay,.gift-photo{animation:none}}
.quote-view.paused #quote-title>span,.quote-view.paused .quote-credit,.quote-view.paused .quote-decoration,.quote-view.paused .quote-timer i{animation-play-state:paused}
body[data-stage=blow] .birthday-actions,body[data-stage=blowing] .birthday-actions{display:none}
/* Opening sequence: a city, a clock, and a date. */
body.intro-mode{background:#031d54;color:var(--paper);overflow:hidden}.intro-view{position:fixed;inset:0;z-index:10;overflow:hidden;background:#031d54;color:var(--paper);transition:background 1s,color 1s}.intro-world{position:absolute;inset:0;overflow:hidden;transition:filter 1.4s,opacity 1s,transform 2s var(--ease)}.intro-city{position:absolute;bottom:31%;left:-3%;right:-3%;height:31%;display:flex;align-items:flex-end;gap:1.3%;opacity:.9;transition:transform 1.5s var(--ease),opacity 1s}.intro-city i{position:relative;display:block;flex:1;height:50%;background:#06358e;transform-origin:bottom}.intro-city i:after{content:'';position:absolute;top:14%;left:26%;width:4px;height:65%;background:repeating-linear-gradient(0deg,transparent 0 16px,#a9c7ff70 16px 20px);opacity:.6}.intro-city i:before{content:'';position:absolute;top:27%;right:24%;width:4px;height:50%;background:repeating-linear-gradient(0deg,transparent 0 16px,#a9c7ff55 16px 20px)}.intro-city i:nth-child(2n){background:#073076;height:70%}.intro-city i:nth-child(3n){height:92%;background:#0d3d97}.intro-city i:nth-child(4n){height:40%}.intro-city i:nth-child(5n){height:62%;background:#002fa7}.intro-city i:nth-child(7n){height:100%}.intro-horizon{position:absolute;left:6%;right:6%;height:1px;bottom:31%;background:#a9c7ff50;transition:opacity 1s}.intro-moon{position:absolute;left:calc(65% - 64px);top:14%;width:128px;height:128px;border-radius:50%;background:var(--paper);overflow:hidden;transition:transform 1.5s var(--ease),opacity 1s,background 1s}.intro-moon:after{content:'';position:absolute;width:122px;height:122px;left:27px;top:-16px;background:#031d54;border-radius:50%;transition:transform 2s,opacity 1s}.intro-clock{position:absolute;width:min(52vw,540px);height:min(52vw,540px);left:50%;top:40%;transform:translate(-50%,-50%) scale(.84);opacity:0;overflow:visible;fill:none;stroke:var(--pale);stroke-width:1;transition:opacity 1.2s,transform 1.5s var(--ease)}.clock-outer{stroke-dasharray:3 13;stroke-opacity:.7}.clock-inner{stroke-opacity:.35}.clock-hour,.clock-minute{transform-origin:300px 300px;stroke:var(--paper);stroke-width:2}.clock-hour{transform:rotate(-38deg)}.clock-minute{transform:rotate(24deg)}.clock-center{fill:var(--flame);stroke:none}.clock-orbit{stroke:var(--flame);stroke-opacity:.3;transform-origin:300px 300px;transform:rotate(-27deg)}.intro-constellation{position:absolute;inset:8% 12% 30%;opacity:0;transition:opacity 1s}.intro-constellation i{position:absolute;width:5px;height:5px;border-radius:50%;background:var(--paper)}.intro-constellation i:nth-child(1){left:15%;top:20%}.intro-constellation i:nth-child(2){left:73%;top:15%;width:3px;height:3px}.intro-constellation i:nth-child(3){left:83%;top:42%}.intro-constellation i:nth-child(4){left:37%;top:7%;width:3px;height:3px}.intro-constellation i:nth-child(5){left:8%;top:68%;width:3px;height:3px}.intro-constellation i:nth-child(6){left:64%;top:64%;background:var(--flame)}.intro-vignette,.intro-light{position:absolute;inset:0;pointer-events:none;opacity:0}.intro-vignette{background:radial-gradient(ellipse at 50% 40%,transparent 8%,#000d 90%)}.intro-light{background:var(--paper);clip-path:circle(0 at 50% 50%)}.intro-subtitles{position:absolute;left:11%;right:11%;bottom:11%;font-family:'Birthday Sans','Microsoft YaHei',sans-serif;font-weight:400;font-size:clamp(20px,2.4vw,32px);line-height:1.85;letter-spacing:.025em;pointer-events:none}.intro-line{display:block;animation:intro-line-in 1.2s var(--ease) both;animation-delay:calc(var(--line-index)*.5s)}.intro-start{position:absolute;top:75%;left:50%;transform:translate(-50%,-50%);display:flex;align-items:center;gap:16px;font-size:14px;letter-spacing:.15em;min-height:64px;padding:0 26px;border:1px solid #f4f4ef66;transition:background .3s,border-color .3s}.intro-start svg{width:32px;height:32px;fill:currentColor;stroke:none;transition:translate .3s var(--ease)}.intro-start:hover{background:#f4f4ef0d;border-color:var(--paper)}.intro-start:hover svg{translate:4px 0}.intro-skip{position:absolute;right:4.5%;bottom:28px;display:flex;align-items:center;gap:12px;font-size:12px;opacity:.65;z-index:2;transition:opacity .25s}.intro-skip:hover{opacity:1}.intro-skip svg{width:18px;height:18px}.intro-view[data-scene=ready] .intro-city{bottom:27%;opacity:.55}.intro-view[data-scene=ready] .intro-horizon{bottom:27%}.intro-view[data-scene=ready] .intro-moon{opacity:.7;transform:scale(.8)}
.intro-view[data-scene=legend] .intro-city{animation:city-arrive 2.8s var(--ease) both}.intro-view[data-scene=legend] .intro-moon{animation:moon-arrive 3.5s var(--ease) both}.intro-view[data-scene=legend] .intro-constellation{opacity:.6}.intro-view[data-scene=chant] .intro-clock,.intro-view[data-scene=blur] .intro-clock,.intro-view[data-scene=rewind] .intro-clock{opacity:1;transform:translate(-50%,-50%) scale(1)}.intro-view[data-scene=chant] .intro-moon{opacity:.1;transform:translate(-15vw,8vh) scale(.7)}.intro-view[data-scene=chant] .intro-city{opacity:.2;transform:translateY(6vh)}.intro-view[data-scene=chant] .intro-horizon{opacity:.2}.intro-view[data-scene=chant] .clock-outer{animation:spell-circle 16s linear infinite}.intro-view[data-scene=chant] .clock-orbit{animation:spell-orbit 7s ease-in-out infinite alternate}.intro-view[data-scene=chant] .intro-constellation{opacity:1;animation:spell-breathe 2s ease-in-out infinite alternate}.intro-view[data-scene=chant] .intro-subtitles{left:0;right:0;bottom:10%;text-align:center;font-size:clamp(17px,2vw,25px)}.intro-view[data-scene=chant] .intro-line:last-child{font-size:clamp(46px,6vw,78px);line-height:1.3;color:var(--flame);animation:spell-word 2.5s .5s var(--ease) both}.intro-view[data-scene=blur] .intro-world{animation:consciousness 3.6s ease-in-out both}.intro-view[data-scene=blur] .intro-vignette{animation:consciousness-shade 3.6s ease-in both}.intro-view[data-scene=blur] .intro-moon{opacity:0}.intro-view[data-scene=blur] .intro-city{opacity:.12}.intro-view[data-scene=blur] .intro-subtitles{left:0;right:0;text-align:center;bottom:17%;animation:subtitle-drift 3.6s ease-in both}.intro-view[data-scene=blur] .intro-line:last-child{letter-spacing:.2em}
.intro-view[data-scene=rewind] .intro-subtitles{left:0;right:0;top:12%;bottom:auto;text-align:center;font-size:clamp(19px,2.3vw,30px);letter-spacing:.12em}.intro-view[data-scene=rewind] .intro-clock{top:52%;animation:clock-recede 4.2s ease-in both}.intro-view[data-scene=rewind] .clock-minute{animation:reverse-minute 4.2s cubic-bezier(.6,.01,.9,.5) both}.intro-view[data-scene=rewind] .clock-hour{animation:reverse-hour 4.2s ease-in both}.intro-view[data-scene=rewind] .clock-outer{animation:reverse-ring 4.2s ease-in both}.intro-view[data-scene=rewind] .clock-orbit{animation:reverse-orbit 4.2s ease-in both}.intro-view[data-scene=rewind] .intro-city{bottom:0;opacity:.35;animation:city-unbuild 4.2s ease-in both}.intro-view[data-scene=rewind] .intro-city i:after,.intro-view[data-scene=rewind] .intro-city i:before{animation:window-rewind .6s linear infinite}.intro-view[data-scene=rewind] .intro-moon{opacity:.15;transform:translate(-40vw,-10vh) scale(.4)}.intro-view[data-scene=rewind] .intro-constellation{opacity:.8;animation:star-rewind 4.2s ease-in both}.intro-view[data-scene=silence]{background:#00102f}.intro-view[data-scene=silence] .intro-world{opacity:0;transition:opacity .3s}.intro-view[data-scene=silence] .intro-subtitles{inset:0;display:grid;place-items:center;line-height:1;font-size:30px;letter-spacing:.6em}.intro-view[data-scene=wake],.intro-view[data-scene=date]{background:var(--paper);color:var(--blue)}body.intro-mode:has(.intro-view[data-scene=wake]),body.intro-mode:has(.intro-view[data-scene=date]){color:var(--blue)}.intro-view[data-scene=wake] .intro-world,.intro-view[data-scene=date] .intro-world{opacity:1;filter:none}.intro-view[data-scene=wake] .intro-city,.intro-view[data-scene=date] .intro-city{opacity:0;transform:translateY(40vh)}.intro-view[data-scene=wake] .intro-horizon,.intro-view[data-scene=date] .intro-horizon{opacity:0}.intro-view[data-scene=wake] .intro-moon{left:calc(50% - 64px);top:calc(50% - 64px);background:var(--pale);opacity:.5;transform:scale(2.6);animation:wake-circle 2s var(--ease) both}.intro-view[data-scene=wake] .intro-moon:after,.intro-view[data-scene=date] .intro-moon:after{opacity:0}.intro-view[data-scene=wake] .intro-subtitles{inset:0;display:grid;place-items:center;font-size:clamp(42px,7vw,88px);font-weight:500;letter-spacing:-.02em}.intro-view[data-scene=wake] .intro-line{animation:wake-word .9s .1s var(--ease) both}.intro-view[data-scene=date] .intro-moon{left:calc(50% - 64px);top:calc(50% - 64px);background:none;border:1px solid var(--blue);opacity:.16;transform:scale(3.2)}.intro-view[data-scene=date] .intro-clock{top:50%;opacity:.12;stroke:var(--blue);transform:translate(-50%,-50%) scale(.96)}.intro-view[data-scene=date] .clock-hour,.intro-view[data-scene=date] .clock-minute,.intro-view[data-scene=date] #intro-clock-ticks,.intro-view[data-scene=date] .clock-orbit{opacity:0}.intro-view[data-scene=date] .intro-subtitles{left:50%;right:auto;top:50%;bottom:auto;transform:translate(-50%,-50%);width:max-content;max-width:90%;line-height:1.5}.intro-view[data-scene=date] .intro-line:nth-child(1){font-size:16px;letter-spacing:.12em;margin-left:5px}.intro-view[data-scene=date] .intro-line:nth-child(2){font-family:Manrope,'Birthday Sans',sans-serif;font-size:clamp(45px,8.4vw,108px);font-weight:500;letter-spacing:-.045em;animation:date-arrive 1.2s .3s var(--ease) both}.intro-view[data-scene=date] .intro-line:nth-child(3){font-size:32px;text-align:right;line-height:1.2;animation-delay:.8s}.intro-view.finished{pointer-events:none}.intro-view.paused *{animation-play-state:paused!important}
@keyframes intro-line-in{from{opacity:0;transform:translateY(20px);clip-path:inset(100% 0 0)}to{opacity:1;transform:translateY(0);clip-path:inset(0)}}@keyframes city-arrive{from{opacity:.3;transform:translateY(25px)}to{opacity:.9;transform:translateY(0)}}@keyframes moon-arrive{from{opacity:.4;transform:translateY(14px) scale(.85)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes spell-circle{to{transform:rotate(-360deg);transform-origin:300px 300px}}@keyframes spell-orbit{from{transform:rotate(-27deg) scale(.95)}to{transform:rotate(27deg) scale(1.08)}}@keyframes spell-breathe{from{opacity:.3;transform:scale(.98)}to{opacity:1;transform:scale(1.02)}}@keyframes spell-word{from{opacity:0;filter:blur(8px);letter-spacing:.45em;transform:translateX(.2em)}to{opacity:1;filter:blur(0);letter-spacing:.06em;transform:translateX(0)}}@keyframes consciousness{0%{filter:blur(0);transform:scale(1)}60%{filter:blur(4px);transform:scale(1.06) rotate(.6deg)}100%{filter:blur(10px);transform:scale(1.12) rotate(-1deg)}}@keyframes consciousness-shade{from{opacity:0}to{opacity:.9}}@keyframes subtitle-drift{0%,45%{filter:blur(0);opacity:1}100%{filter:blur(5px);opacity:.25;translate:0 20px}}@keyframes clock-recede{0%{transform:translate(-50%,-50%) scale(.9)}65%{opacity:1}100%{transform:translate(-50%,-50%) scale(2.7);opacity:0}}@keyframes reverse-minute{from{transform:rotate(24deg)}to{transform:rotate(-2136deg)}}@keyframes reverse-hour{from{transform:rotate(-38deg)}to{transform:rotate(-398deg)}}@keyframes reverse-ring{from{stroke-dashoffset:0}to{stroke-dashoffset:1200}}@keyframes reverse-orbit{from{transform:rotate(-27deg)}to{transform:rotate(-747deg)}}@keyframes city-unbuild{0%{transform:translateY(0) scaleY(1)}100%{transform:translateY(10vh) scaleY(.05);opacity:0}}@keyframes window-rewind{to{background-position:0 -40px}}@keyframes star-rewind{from{transform:rotate(0) scale(1)}to{transform:rotate(-150deg) scale(3);opacity:0}}@keyframes wake-circle{from{transform:scale(.02);opacity:0}to{transform:scale(2.6);opacity:.5}}@keyframes wake-word{from{transform:translateY(12px) scale(.96);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}@keyframes date-arrive{from{opacity:0;filter:blur(5px);transform:translateY(18px)}to{opacity:1;filter:blur(0);transform:translateY(0)}}
@media(max-width:600px){.intro-city{height:29%;gap:1.8%;bottom:35%}.intro-city i:nth-child(2n){flex:1.4}.intro-city i:after,.intro-city i:before{width:2px}.intro-horizon{bottom:35%}.intro-moon{width:92px;height:92px;left:calc(65% - 46px);top:18%}.intro-moon:after{width:90px;height:90px;left:23px;top:-12px}.intro-clock{width:88vw;height:88vw;top:36%}.intro-subtitles{left:8%;right:8%;bottom:17%;font-size:19px;line-height:1.85;letter-spacing:0}.intro-view[data-scene=legend] .intro-line:last-child{max-width:17em}.intro-view[data-scene=chant] .intro-subtitles{bottom:16%;font-size:16px}.intro-view[data-scene=chant] .intro-line:last-child{font-size:56px;line-height:1.5}.intro-view[data-scene=blur] .intro-subtitles{bottom:20%;font-size:23px}.intro-view[data-scene=rewind] .intro-subtitles{top:19%;font-size:20px}.intro-view[data-scene=wake] .intro-moon,.intro-view[data-scene=date] .intro-moon{left:calc(50% - 46px);top:calc(50% - 46px)}.intro-view[data-scene=wake] .intro-subtitles{font-size:57px}.intro-view[data-scene=date] .intro-line:nth-child(1){font-size:14px}.intro-view[data-scene=date] .intro-line:nth-child(2){font-size:clamp(43px,11.8vw,65px)}.intro-view[data-scene=date] .intro-line:nth-child(3){font-size:27px}.intro-skip{right:7%;bottom:24px;font-size:11px}.intro-start{top:76%;min-height:58px;padding:0 20px;font-size:13px}.intro-start svg{width:28px;height:28px}}
@media(max-width:600px) and (max-height:750px){.birthday-view{padding-top:23px;padding-bottom:28px}.birthday-cake{max-height:calc(100svh - 350px)}.cake-stage{margin-top:0}.intro-subtitles{bottom:14%}.intro-view[data-scene=chant] .intro-subtitles{bottom:11%}.intro-clock{top:36%;width:74vw;height:74vw}.intro-view[data-scene=rewind] .intro-subtitles{top:14%}}
@media(prefers-reduced-motion:reduce){.intro-view *{animation:none!important;transition:none!important}.intro-line{opacity:1!important;transform:none!important;filter:none!important;clip-path:none!important}.intro-view[data-scene=chant] .intro-line:last-child{letter-spacing:.06em}.intro-view[data-scene=blur] .intro-world{filter:none;transform:none;opacity:.45}.intro-view[data-scene=blur] .intro-subtitles{opacity:1;filter:none;translate:none}.intro-view[data-scene=rewind] .intro-clock{opacity:.5;transform:translate(-50%,-50%) scale(1)}.intro-view[data-scene=wake] .intro-moon{opacity:.2;transform:scale(2.6)}}
.clock-outer{transform-origin:300px 300px}
