*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:#ffe5e8;font-family:'PingFang SC','Microsoft YaHei',sans-serif;color:#70424b}[hidden]{display:none!important}button,input,textarea{font:inherit}button{cursor:pointer}body{overscroll-behavior-y:none}#app{max-width:750px;margin:auto}#stage{width:100%;aspect-ratio:750/1624;position:relative;overflow:hidden;isolation:isolate}#art{width:100%;height:100%;position:absolute;inset:0;object-fit:fill;user-select:none;pointer-events:none}#controls{position:absolute;inset:0}#stage.entering{animation:reveal .42s ease both}.hit{position:absolute;border:0;background:transparent;color:transparent;border-radius:999px;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.hit:focus-visible{outline:3px solid #db5c79;outline-offset:3px}.hit:active{background:#fff3;transform:scale(.97)}.hit:disabled{cursor:default}.small-note{position:absolute;font-size:clamp(10px,3.2vw,24px);text-align:center;line-height:1.5}.nickname-card{position:absolute;left:13%;top:34%;width:74%;padding:7% 6%;border:1px solid #fff;border-radius:24px;background:#fff9;box-shadow:0 8px 30px #d3758c22;backdrop-filter:blur(12px)}.nickname-card h1{font-size:clamp(19px,5vw,36px);margin:0 0 20px;color:#c04e6b}.nickname-card p{font-size:clamp(12px,3vw,21px);line-height:1.7}.nickname-card input{width:100%;border:1px solid #ecc1cb;border-radius:12px;padding:14px;background:#fff9;outline-color:#d56984}.pink-button{border:1px solid #fffc;border-radius:100px;background:linear-gradient(110deg,#ffdfad,#e38499);color:white;text-shadow:0 1px 4px #a84b5f66;box-shadow:0 4px 10px #b56b7b33;padding:13px 22px;font-weight:bold}.nickname-card button{width:100%;margin-top:18px}.rule-note{color:#665158;font-size:clamp(9px,3.4vw,26px)}.task-status{position:absolute;font-size:clamp(10px,3vw,22px);background:#fffb;border-radius:20px;padding:5px 10px;color:#ab536c;box-shadow:0 2px 8px #b2798b22}.task-status.done{background:#fff6dc;color:#8e6941}.letter-title,.letter-body{position:absolute;background:transparent;border:0;resize:none;outline:none;padding:0;border-radius:0;color:#5b5353;line-height:1.6;font-family:'Songti SC',SimSun,serif}.letter-title{font-size:clamp(15px,4.8vw,36px)}.letter-body{font-size:clamp(12px,3.6vw,27px);line-height:1.65}.counter{position:absolute;text-align:right;font-size:clamp(9px,2.7vw,19px);color:#a47b85}.poster{position:absolute;inset:0;width:100%;height:100%;object-fit:fill;-webkit-touch-callout:default;user-select:auto}.plain-overlay{position:absolute;left:12%;top:37%;width:76%;padding:10% 7%;text-align:center;border-radius:26px;background:#fffd;box-shadow:0 10px 40px #c96c8830}.plain-overlay h1{color:#c55c79;font-size:clamp(23px,6vw,44px);line-height:1.5}.plain-overlay p{line-height:1.8;font-size:clamp(13px,3.5vw,25px)}.plain-overlay .heart{font-size:54px;color:#e17f98}.pulse{animation:softPulse 2.2s ease-in-out infinite}#footer{padding:10px 16px calc(16px + env(safe-area-inset-bottom));text-align:center;background:#fff4f4;font-size:13px;line-height:1.6}#footer button{margin:4px 8px}.text-button{border:0;background:none;color:#a84d68;text-decoration:underline;padding:6px}#toast{position:fixed;left:50%;bottom:8%;transform:translateX(-50%);max-width:90%;width:max-content;padding:14px 22px;border-radius:14px;background:#6b3b50ed;color:white;z-index:50;font-size:15px;text-align:center}.loading{position:fixed;inset:0;display:grid;place-content:center;text-align:center;background:#fff4f4ed;z-index:60;color:#c3677f}.loading .heart{font-size:60px;animation:softPulse 1s infinite}.loading p{font-size:14px;letter-spacing:2px}#scanner{position:fixed;inset:0;background:#161318;z-index:40;color:white}#camera{width:100%;height:100%;object-fit:cover}.camera-shade{position:absolute;inset:0;background:linear-gradient(#0008,transparent 40%,#000b);text-align:center;padding:calc(45px + env(safe-area-inset-top)) 24px 30px;display:flex;flex-direction:column;align-items:center}.camera-shade h1{font-size:24px;line-height:1.7;margin-top:45px;text-shadow:0 2px 10px #000}.scan-box{width:min(65vw,300px);aspect-ratio:1;border:2px solid #ffb5c7;border-radius:20px;position:relative;margin:auto;box-shadow:0 0 0 500px #0001}.scan-box span{position:absolute;left:5%;width:90%;height:2px;background:#ffb5c7;box-shadow:0 0 16px #ff8dae;animation:scan 2.5s ease-in-out infinite}.camera-shade button,.upload-qr{background:#fff2;border:1px solid #fffa;color:white;border-radius:30px;padding:10px 20px;margin:7px}#camera-close{position:absolute;right:20px;top:calc(18px + env(safe-area-inset-top))}.upload-qr input{display:none}.camera-note{font-size:12px;opacity:.8;line-height:1.6}.progress-mark{position:absolute;left:20%;top:73%;width:60%;text-align:center;font-size:clamp(12px,3vw,22px);color:#ae526b;line-height:1.6}@keyframes reveal{from{opacity:.3;transform:translateY(10px)}to{opacity:1;transform:none}}@keyframes softPulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.06);opacity:1}}@keyframes scan{0%,100%{top:8%}50%{top:90%}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;scroll-behavior:auto!important}}

/* Preserve PSD canvas: operational text is not appended beneath the artwork. */
#footer{display:none!important}
/* Camera screen only uses the scan instruction requested by the client. Await PSD for extra controls. */
#camera-close,#camera-retry,.upload-qr,.camera-note{display:none!important}
