:root{--paper:#f3e8cc;--ink:#193c46;--teal:#397b78;--gold:#d49c42;--red:#b75d40;font-family:'Microsoft YaHei','PingFang SC',sans-serif;color:var(--ink)}*{box-sizing:border-box}body{margin:0;min-height:100dvh;background:#c5c7ab}button,a,input{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer;border:1px solid #193c4666;background:var(--paper);padding:10px 16px;min-height:44px;border-radius:2px}button:hover{filter:brightness(1.06)}button:active{translate:0 1px}button:focus-visible,a:focus-visible,canvas:focus-visible{outline:3px solid var(--gold);outline-offset:3px}button[hidden],[hidden]{display:none!important}button:disabled{opacity:.45;cursor:default}a{color:inherit}.landscape{position:fixed;inset:0;z-index:-2;overflow:hidden}.landscape>img{width:100%;height:100%;object-fit:cover;object-position:50% 50%}.shade{position:absolute;inset:0;background:linear-gradient(#163e4560,transparent 28%,transparent 52%,#163e45c9)}.sunlight{position:absolute;inset:0;background:linear-gradient(120deg,#fff0ad28,transparent 55%);animation:sun 12s ease-in-out infinite alternate}.water{position:absolute;left:44%;top:48%;width:13%;height:14%;background:repeating-linear-gradient(0deg,transparent 0 8px,#fff0b833 9px 10px);mix-blend-mode:soft-light;animation:water 5s linear infinite;opacity:.6}#leaves{position:absolute;inset:0;pointer-events:none}#leaves i{position:absolute;left:var(--x);top:-10%;width:8px;height:15px;background:#b58b37;border-radius:0 80% 0 80%;opacity:0;animation:leaf var(--d) linear var(--delay) infinite}@keyframes leaf{0%{opacity:0;transform:translate(0,0) rotate(0)}10%,80%{opacity:.65}100%{opacity:0;transform:translate(130px,105dvh) rotate(360deg)}}@keyframes sun{to{opacity:.4}}@keyframes water{to{background-position:0 22px}}
header{height:84px;position:relative;z-index:4;display:flex;align-items:center;gap:24px;margin:0 4%;border-bottom:1px solid #f3e8cc66;color:var(--paper)}.brand{display:flex;gap:12px;text-decoration:none;font:30px 'SimSun',serif;align-items:center}.brand small{font:10px/1.7 sans-serif;letter-spacing:.2em;max-width:4em}.chapter{font-size:12px;letter-spacing:.12em;display:flex;align-items:center;gap:15px}.chapter i{width:25px;height:1px;background:currentColor}header nav{margin-left:auto;display:flex;gap:12px}header button{padding:7px;min-width:44px;background:none;border:0;color:inherit;font-size:13px}header button span{font-size:11px}.eyebrow{font-size:11px;letter-spacing:.16em;margin:0 0 13px}main{position:relative}.square{height:calc(100dvh - 84px);min-height:660px;position:relative}.title{position:absolute;left:8%;top:5%;color:var(--ink);background:linear-gradient(90deg,#f3e8ccab,transparent);padding:13px 30px 20px 0}.title p{font-size:12px;letter-spacing:.13em}.title h1{font:50px/1.35 'SimSun','Songti SC',serif;margin:13px 0 20px;letter-spacing:.02em}.title>span{font-size:12px;background:#f8efd8ed;padding:8px 12px}.hotspot{position:absolute;background:none;border:0;padding:0;display:grid;justify-items:center;gap:15px;transition:transform .3s}.hotspot:hover{transform:translateY(-6px)}.hotspot strong{font-size:12px;font-weight:400;color:var(--paper);padding:6px 10px;background:#193c469e;white-space:nowrap}.old-photo{left:27%;bottom:35%;rotate:-7deg}.photo-drawing{width:155px;height:113px;display:block;background:#d9d3b3;border:8px solid #f9f0d8;box-shadow:3px 4px 0 #193c4650;position:relative}.photo-drawing:before,.photo-drawing:after{content:'';position:absolute;bottom:15px;width:34px;height:48px;border:2px solid var(--ink)}.photo-drawing:before{left:11px}.photo-drawing:after{right:11px}.photo-drawing i{position:absolute;left:44px;right:44px;top:33px;height:25px;border-block:2px solid var(--ink)}.photo-drawing b{position:absolute;left:37px;top:12px;width:65px;height:15px;background:var(--ink);border-radius:50%}.photo-drawing em{position:absolute;left:30px;right:30px;bottom:3px;height:6px;background:var(--teal)}.racket-hotspot{right:30%;bottom:34%;rotate:10deg}.racket-art{position:relative;display:block;width:120px;height:190px;transform-origin:50% 70%;filter:drop-shadow(4px 5px 2px #193c4640)}.racket-art i{display:block;position:absolute;left:20px;top:0;width:80px;height:103px;border:7px solid var(--ink);border-radius:49%;background:repeating-linear-gradient(90deg,transparent 0 8px,#397b7866 9px 10px),repeating-linear-gradient(0deg,#f9f0d8b0 0 8px,#397b7866 9px 10px)}.racket-art i:after{content:'';position:absolute;left:22px;top:86px;width:22px;height:24px;border:3px solid var(--ink);border-top:0;clip-path:polygon(0 0,100% 0,58% 100%,42% 100%)}.racket-art b{position:absolute;left:56px;top:110px;width:8px;height:35px;background:var(--ink)}.racket-art em{position:absolute;left:51px;top:138px;width:18px;height:51px;background:repeating-linear-gradient(-20deg,#397b78 0 8px,#80a69a 8px 10px);border:2px solid var(--ink);border-radius:3px}.racket-art em:after{content:'';position:absolute;right:-9px;bottom:8px;width:13px;height:8px;background:var(--gold);border:1px solid var(--ink);rotate:-28deg;transition:transform .4s}.court-entry{position:absolute;right:7%;top:26%;display:grid;gap:4px;text-align:left;padding:14px 18px;background:#f9efd6e8;border-left:4px solid var(--teal);box-shadow:3px 4px 0 #193c4633}.court-entry>span{position:absolute;right:12px;top:12px;font-size:20px}.court-entry b{font:19px 'SimSun',serif;padding-right:30px}.court-entry small{font-size:11px}.guide{position:absolute;right:12%;bottom:33%;width:100px;height:190px;color:var(--ink)}.guide svg{width:100%;height:165px;fill:var(--paper);stroke:var(--ink);stroke-width:5;stroke-linecap:round;stroke-linejoin:round;animation:guide 4s ease-in-out infinite}.guide span{font-size:10px;white-space:nowrap;padding:4px 7px;color:var(--paper);background:var(--ink)}@keyframes guide{50%{transform:rotate(2deg)}}
.aqi{position:fixed;width:145px;height:145px;left:7%;bottom:219px;pointer-events:none;z-index:3}.aqi i,.arrival-bird{display:block;width:100%;height:100%;background:url('../xinsu/assets/aqi-sprites.png') 0 0/300% 200% no-repeat}.aqi.cheer{animation:hop .55s ease-out}.aqi.cheer i{background-position:0 100%}@keyframes hop{40%{transform:translateY(-20px) scale(.95,1.08)}80%{transform:translateY(0) scale(1.08,.92)}}.dialogue{position:fixed;left:9%;right:9%;bottom:66px;min-height:137px;display:grid;grid-template-columns:96px 1fr auto;gap:18px;align-items:center;background:var(--paper);border:1.5px solid var(--ink);border-left:5px solid var(--gold);padding:18px 22px 21px;box-shadow:4px 5px 0 #193c4644;z-index:5}.portrait{width:90px;height:90px;border-radius:50%;background:#d0d7bd;overflow:hidden;position:relative}.portrait i{position:absolute;inset:0;background:url('../xinsu/assets/aqi-sprites.png') 0 0/300% 200%;transform:scale(1.12);transform-origin:50% 50%}.dialogue[data-who=zhou] .portrait i{background:none;inset:22px;border:4px solid var(--ink);border-radius:50%;transform:none}.dialogue[data-who=zhou] .portrait:after{content:'周';position:absolute;inset:0;display:grid;place-items:center;font:26px 'KaiTi',serif}.dialogue-copy strong{font:17px 'SimSun',serif}.dialogue-copy p{font-size:16px;line-height:1.85;margin:9px 0 0}.dialogue>button{background:var(--teal);color:var(--paper);border-color:var(--teal);min-width:113px}.dialogue>small{position:absolute;right:22px;bottom:7px;font:10px Georgia,serif;opacity:.6}footer{position:fixed;bottom:17px;left:5%;right:5%;display:flex;justify-content:space-between;align-items:center;color:var(--paper);z-index:4}footer p{font-size:11px}footer button{font-size:11px;background:none;border:0;color:inherit}.text-button{background:none;border:0;padding-inline:0;text-decoration:underline;text-underline-offset:5px;font-size:12px}.attention{animation:attention 1s ease-in-out 3}@keyframes attention{50%{filter:drop-shadow(0 0 12px #ffe29a);transform:translateY(-7px)}}
.court{width:min(1000px,92%);margin:20px auto 65px}.court-heading{display:flex;justify-content:space-between;align-items:center;color:var(--paper);margin-bottom:15px}.court-heading h1{font:32px 'SimSun',serif;margin:0}.court-heading .eyebrow{margin-bottom:8px;font-size:10px}.court-heading button{font-size:12px;background:#f3e8cced}.court-sheet{background:#f3e8ccf2;border:2px solid var(--ink);box-shadow:5px 6px 0 #193c4655;position:relative}.score{display:flex;align-items:center;justify-content:space-between;padding:15px 24px 0;font-size:13px;gap:15px}.score>span{display:flex;align-items:center;gap:10px}.score b{font:27px Georgia,serif}.score .rally{font-size:12px;letter-spacing:.1em}.teal-dot,.gold-dot{width:8px;height:8px;border-radius:50%;background:var(--teal)}.gold-dot{background:var(--gold)}#court-canvas{display:block;width:100%;height:auto;aspect-ratio:1000/580;touch-action:none;max-height:51dvh}.match-message{position:absolute;top:62px;left:15%;right:15%;text-align:center;font-size:13px;line-height:1.7;padding:7px 12px;background:#f9efd6dd;border:1px solid #193c4622;pointer-events:none}.practice-progress{display:flex;align-items:center;gap:17px;padding:0 24px 16px;font-size:12px}.practice-progress b{font:17px Georgia,serif;margin-left:8px}.practice-progress progress{flex:1;max-width:290px;height:5px;accent-color:var(--teal)}.practice-progress small{margin-left:auto;font-size:10px;opacity:.7}.game-controls{display:flex;gap:18px;justify-content:space-between;margin-top:16px}.movement{display:flex;gap:10px}.movement button{width:64px;height:56px;font-size:22px;touch-action:none;background:#f3e8cce8}.movement button[aria-pressed=true]{background:var(--gold)}.movement small{font-size:10px}.hit-button{min-width:210px;min-height:56px;background:var(--teal);color:var(--paper);border:1px solid #f3e8cc99;box-shadow:3px 4px 0 #193c4655;font-size:19px}.hit-button span{display:block;font-size:9px;margin-top:4px;opacity:.7}.game-options{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:12px}.game-options button{font-size:11px;background:#f3e8cce5;min-height:40px;padding:8px 13px}.game-options button[aria-pressed=true]{background:var(--ink);color:var(--paper)}.shot-type{display:flex;gap:1px}.game-options>#pause{margin-left:auto}.court-story{margin-top:15px;padding-top:12px;border-top:1px solid #f3e8cc88;display:flex;align-items:center;gap:20px;flex-wrap:wrap;color:var(--paper)}.court-story p{font-size:12px;margin:0;flex:1;min-width:240px;line-height:1.8}.court-story #collect-card{background:var(--gold);border:1px solid var(--gold);font-size:13px}.court-story .text-button{font-size:10px;color:var(--paper)}.keyboard-note{color:var(--paper);font-size:10px;line-height:1.7;margin-top:15px;opacity:.8}body[data-view=court] .aqi{width:74px;height:74px;left:1%;bottom:28px}body[data-view=court] footer{display:none}body[data-view=court] .landscape .shade{background:linear-gradient(#193c4666,#193c4655)}
.arrival{position:fixed;inset:0;z-index:20;display:grid;grid-template-columns:1fr 1fr;align-items:center;padding:5% 9%;gap:6%;background:#f3e8ccf8;overflow:auto;transition:opacity .5s,transform .5s}.arrival.leaving{opacity:0;transform:translateY(-15px);pointer-events:none}.arrival-art{position:relative;height:450px}.arrival-photo{width:90%;background:#fff3dc;border:1px solid var(--ink);padding:12px 12px 25px;rotate:-7deg;box-shadow:8px 10px 0 #397b7833;animation:photoIn 1.2s cubic-bezier(.2,.8,.3,1) both}.arrival-photo img{display:block;width:100%;aspect-ratio:1.5;object-fit:cover}.arrival-photo span{font:16px 'KaiTi',serif;display:block;margin-top:14px}.arrival-route{position:absolute;bottom:25%;font-size:11px;letter-spacing:.1em;border-bottom:1px dashed var(--teal);padding:13px 4px;animation:routeIn 1.3s .3s both}.arrival-route i{margin:0 15px;font-style:normal}.arrival-bird{position:absolute;bottom:0;right:9%;width:160px;height:160px;animation:birdIn 1.5s cubic-bezier(.2,.8,.3,1) both}.arrival-copy h1{font:52px/1.35 'SimSun',serif;margin:20px 0 25px}.arrival-copy>p:not(.eyebrow){font-size:15px;line-height:2}.arrival-copy button{background:var(--teal);color:var(--paper);margin:20px 0 22px;padding:15px 22px}.arrival-copy>small{font-size:10px;line-height:1.7;display:block;max-width:340px;opacity:.65}@keyframes photoIn{from{opacity:0;transform:translateY(35px) rotate(8deg)}}@keyframes routeIn{from{opacity:0;clip-path:inset(0 100% 0 0)}to{clip-path:inset(0)}}@keyframes birdIn{from{opacity:0;transform:translateX(-80px) scale(.8)}70%{transform:translateY(-10px)}}
dialog{width:min(650px,92vw);max-height:90dvh;overflow:auto;border:2px solid var(--ink);color:var(--ink);background:var(--paper);padding:35px 38px;box-shadow:8px 9px 0 #193c4644}dialog::backdrop{background:#16373fd6;backdrop-filter:blur(4px)}dialog h2{font:27px/1.5 'SimSun',serif;margin:0 0 20px}dialog p{font-size:14px;line-height:1.95}dialog button:not(.close):not(.text-button){background:var(--teal);color:var(--paper);font-size:13px}dialog>.close{position:absolute;top:7px;right:7px;background:none;border:0;font-size:22px}dialog a{display:block;font-size:12px;line-height:1.7;margin:16px 0}dialog .small{font-size:11px;opacity:.7}.memory-photo{width:100%;display:block}.racket-inspection{height:300px;position:relative;display:grid;place-items:center;background:repeating-linear-gradient(0deg,transparent 0 29px,#193c460a 29px 30px)}.racket-inspection .large{scale:1.3;rotate:-18deg;transition:rotate .8s}.racket-inspection .large.inspected{rotate:20deg}.racket-inspection .large.inspected em:after{transform:rotate(-40deg) translateX(4px)}#tape{position:absolute;right:0;bottom:8px}.programme{position:relative;min-height:360px;perspective:1000px;margin:24px 0}.programme>div{backface-visibility:hidden;transition:transform .8s cubic-bezier(.2,.8,.3,1);position:absolute;inset:0;padding:30px;background:#fff0cf;border:1.5px solid var(--ink);box-shadow:4px 5px 0 #397b7844}.programme-front{transform:rotateY(0deg)}.programme-back{transform:rotateY(180deg)}.programme.turned .programme-front{transform:rotateY(-180deg)}.programme.turned .programme-back{transform:rotateY(0deg)}.programme small{font-size:11px;letter-spacing:.14em}.programme h3{font:35px/1.4 'SimSun',serif;margin:30px 0 15px}.programme-front>span:last-child{display:block;font-size:9px;margin-top:18px;opacity:.6}.programme-mark{position:absolute;right:25px;top:46px;color:var(--teal);font-size:90px}.programme-back blockquote{font:24px/1.7 'KaiTi',serif;margin:30px 0 24px}.programme-back>b{font:21px 'SimSun',serif;border-bottom:2px solid var(--gold);padding-bottom:5px}.programme-back p{font-size:12px}#mark-destination{margin-top:10px}.evidence{padding:14px 0;border-bottom:1px solid #193c4622}.evidence p{font-size:13px;margin:6px 0}.finish{min-height:calc(100dvh - 84px);display:grid;place-items:center;padding:50px 8% 110px}.finish>div{background:#f3e8ccef;padding:38px 45px;width:min(850px,100%);border:1.5px solid var(--ink);box-shadow:7px 9px 0 #193c4655}.finish h1{font:49px/1.4 'SimSun',serif;margin:20px 0}.finish p:not(.eyebrow){font-size:15px;line-height:2}.route{display:flex;align-items:center;gap:15px;padding:23px 0;flex-wrap:wrap;font-size:12px;border-block:1px solid #193c4633;margin:25px 0}.route i{font-style:normal}.route b{color:var(--teal)}.finish-actions{display:flex;gap:12px;flex-wrap:wrap}.finish-actions button:first-child{background:var(--teal);color:var(--paper)}.finish>div>small{display:block;font-size:10px;margin-top:15px;opacity:.6}body[data-view=finish] .aqi{display:none}#toast{position:fixed;left:50%;top:100px;translate:-50% -10px;background:var(--ink);color:var(--paper);padding:12px 18px;max-width:88vw;width:max-content;font-size:12px;line-height:1.7;z-index:30;opacity:0;pointer-events:none;transition:opacity .2s,translate .2s}#toast.show{opacity:1;translate:-50% 0}
@media(max-width:760px){header{height:72px;margin:0 5%;gap:9px}.brand{font-size:24px;gap:7px}.brand small{font-size:8px}.chapter{font-size:9px;letter-spacing:0;gap:6px}.chapter i{display:none}header nav{gap:2px}header button{font-size:12px;padding:5px;min-width:35px}header button span{display:none}.square{min-height:650px;height:calc(100dvh - 72px)}.title{left:6%;top:3%;padding-right:10px}.title p{font-size:10px}.title h1{font-size:35px;margin:10px 0 16px}.title>span{font-size:10px}.old-photo{left:12%;bottom:39%}.photo-drawing{width:116px;height:90px;border-width:6px}.photo-drawing:before,.photo-drawing:after{width:24px;height:37px;bottom:11px}.photo-drawing:before{left:6px}.photo-drawing:after{right:6px}.photo-drawing i{left:30px;right:30px;top:27px;height:20px}.photo-drawing b{left:25px;width:55px;top:11px;height:11px}.racket-hotspot{right:12%;bottom:37%;rotate:12deg}.racket-art{scale:.82;transform-origin:50% 100%;height:170px}.hotspot strong{font-size:10px}.court-entry{top:26%;right:6%;padding:11px 12px}.court-entry b{font-size:15px}.court-entry small{font-size:9px}.guide{display:none}.aqi{width:112px;height:112px;left:3%;bottom:230px}.dialogue{left:5%;right:5%;bottom:53px;min-height:171px;grid-template-columns:60px 1fr;gap:10px;padding:15px 15px 22px}.portrait{width:60px;height:60px}.dialogue-copy strong{font-size:15px}.dialogue-copy p{font-size:14px;line-height:1.85;margin-top:7px}.dialogue>button{grid-column:2;justify-self:end;min-height:42px;min-width:100px;font-size:12px;padding:8px 12px}.dialogue>small{left:18px;right:auto;bottom:13px}.dialogue[data-who=zhou] .portrait i{inset:12px;border-width:3px}.dialogue[data-who=zhou] .portrait:after{font-size:20px}footer{bottom:10px;left:5%;right:5%;gap:7px}footer p{font-size:9px;max-width:65%;line-height:1.6}footer button{font-size:9px;min-height:36px;padding:6px 0}.court{width:92%;margin-top:16px;margin-bottom:30px}.court-heading{margin-bottom:11px}.court-heading h1{font-size:26px}.court-heading .eyebrow{font-size:8px;letter-spacing:.07em}.court-heading button{font-size:10px;padding:7px 10px}.score{padding:12px 12px 0;font-size:11px}.score b{font-size:23px}.score .rally{font-size:10px}.score>span{gap:6px}#court-canvas{aspect-ratio:1000/660;max-height:none}.match-message{top:45px;left:4%;right:4%;font-size:10px;padding:5px 7px}.practice-progress{padding:0 11px 12px;gap:8px;flex-wrap:wrap;font-size:10px}.practice-progress b{font-size:15px;margin-left:3px}.practice-progress progress{max-width:none;width:100px;flex:1}.practice-progress small{width:100%;text-align:right;font-size:8px}.game-controls{margin-top:12px;gap:12px}.movement{gap:5px;flex:1}.movement button{width:44px;height:53px;font-size:21px;padding:7px}.movement small{font-size:9px}.hit-button{min-width:135px;flex:1;min-height:53px;font-size:17px;padding:7px}.hit-button span{font-size:8px}.game-options{gap:6px}.game-options button{font-size:9px;min-height:39px;padding:8px 9px}.game-options>#pause{margin-left:auto}.court-story{gap:8px;margin-top:12px}.court-story p{font-size:11px;min-width:100%;margin-bottom:3px}.court-story #collect-card{font-size:12px}.court-story .text-button{font-size:10px;min-height:42px}.keyboard-note{display:none}body[data-view=court] .aqi{width:55px;height:55px;bottom:10px;left:auto;right:10px}.arrival{display:flex;flex-direction:column;padding:36px 8% 28px;justify-content:center;gap:0}.arrival-art{height:255px;width:100%;max-width:400px}.arrival-photo{width:71%;padding:8px 8px 17px;rotate:-6deg}.arrival-photo span{font-size:12px;margin-top:11px}.arrival-route{bottom:12%;font-size:9px;padding-block:8px}.arrival-route i{margin:0 9px}.arrival-bird{width:113px;height:113px;right:0;bottom:5%}.arrival-copy{width:100%;max-width:400px}.arrival-copy .eyebrow{font-size:9px;margin-bottom:10px}.arrival-copy h1{font-size:36px;margin:10px 0 17px;line-height:1.3}.arrival-copy>p:not(.eyebrow){font-size:13px;line-height:1.9}.arrival-copy button{font-size:13px;margin:10px 0 15px}.arrival-copy>small{font-size:9px}dialog{padding:29px 21px;max-height:92dvh}dialog h2{font-size:23px;line-height:1.6;margin-bottom:16px}dialog p{font-size:13px}.racket-inspection{height:280px}.racket-inspection .large{scale:1.2}#tape{font-size:11px;bottom:0}.programme{min-height:345px}.programme>div{padding:24px}.programme h3{font-size:30px}.programme-mark{right:16px;font-size:64px}.programme small{font-size:9px}.programme-back blockquote{font-size:22px}.programme-back>b{font-size:18px}.finish{min-height:calc(100dvh - 72px);padding:24px 5% 80px}.finish>div{padding:28px 23px}.finish h1{font-size:35px}.finish p:not(.eyebrow){font-size:13px;line-height:1.95}.route{font-size:10px;gap:10px;line-height:1.8;margin:20px 0}.finish-actions button{font-size:11px;min-height:44px}.finish>div>small{font-size:9px}}
@media(max-height:730px) and (max-width:760px){.arrival{justify-content:start;padding-top:25px}.arrival-art{height:210px;flex-shrink:0}.arrival-photo{width:60%}.arrival-route{bottom:7%}.arrival-bird{width:95px;height:95px}.arrival-copy h1{font-size:32px}.square{min-height:640px}.court{margin-top:10px}.court-heading h1{font-size:23px}.court-heading .eyebrow{margin-bottom:5px}}
.court-heading button{color:var(--ink)}
button.hit-button[data-ready=true]{background:var(--gold);color:var(--ink);box-shadow:0 0 0 3px #ffe2a455,3px 4px 0 #193c4655}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;scroll-behavior:auto!important;transition:none!important}.arrival.leaving{transform:none}#leaves{display:none}}

#export-image{display:block;width:100%;height:auto}.download-image{display:inline-flex;align-items:center;justify-content:center;min-height:44px;background:var(--teal);color:var(--paper);padding:12px 18px;text-decoration:none}

@media(max-width:760px){body[data-view=square] .aqi{left:calc(50% - 44px);bottom:226px;width:88px;height:88px}}

/* Chapter V2: a real model scene and a distinct overhead attacking shot. */
.building{width:min(1050px,92%);margin:22px auto 60px}.building-heading{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:18px;color:var(--paper)}.building-heading h1{font:32px/1.4 'SimSun',serif;margin:0}.building-heading button{color:var(--ink);font-size:12px;white-space:nowrap}.building-sheet{position:relative;background:#f3e8ccf5;border:1.5px solid var(--ink);box-shadow:5px 6px 0 #193c4655;overflow:hidden}.building-note{position:absolute;z-index:1;top:13px;left:20px;right:20px;margin:0;font-size:12px;line-height:1.8;pointer-events:none}#building-canvas{width:100%;height:min(48dvh,440px);display:block;touch-action:none}.building-views{display:flex;gap:8px;align-items:center;justify-content:center;padding:0 12px 12px}.building-views button{min-width:44px;min-height:40px;background:transparent;padding:6px 12px;font-size:12px}.building-views span{font-size:11px;opacity:.7;margin-right:10px}.building-drive{display:flex;gap:22px;align-items:center;color:var(--paper);padding:20px 0}.building-drive label{display:flex;align-items:center;gap:11px;white-space:nowrap}.building-drive label b{font-size:12px;font-weight:400}.building-drive output{font:18px Georgia,serif;min-width:48px}.building-drive input{flex:1;accent-color:var(--gold);min-width:60px;height:44px;cursor:ew-resize}.building-drive>button{font-size:12px;background:var(--teal);color:var(--paper);border:1px solid #f3e8cc88}#model-wheel{display:inline-block;font-size:39px;line-height:1;color:var(--gold)}.building-clue{padding:20px 25px;background:var(--paper);border-left:4px solid var(--gold);box-shadow:3px 4px 0 #193c4655}.building-clue strong{font:21px/1.6 'SimSun',serif}.building-clue p{font-size:12px;line-height:1.9;margin:10px 0}.building-clue button{background:var(--teal);color:var(--paper);font-size:12px}.building-boundary{color:var(--paper);font-size:10px;opacity:.8}.building #building-fallback{height:min(48dvh,440px);display:grid;place-items:center;padding:45px 15px 0}.building #building-fallback svg{height:100%;max-width:100%;transform-origin:50% 80%}body[data-view=building] footer,body[data-view=building] .aqi{display:none}.racket-actions{display:flex;gap:10px}.smash-button{background:var(--red);color:var(--paper);min-width:155px;border:1px solid #f3e8cc88;box-shadow:3px 4px 0 #193c4655;font-size:18px}.smash-button span{display:block;font-size:9px;margin-top:5px}.smash-button[data-ready=true]{background:var(--gold);color:var(--ink);box-shadow:0 0 0 3px #ffe2a455,3px 4px 0 #193c4655}.smash-tip{color:var(--paper);font-size:11px;line-height:1.8;opacity:.85;margin:12px 0}.smash-message{border-color:var(--gold);color:#854b1e;font-weight:bold}
@media(max-width:760px){header nav{gap:0}#model-entry{font-size:10px;max-width:44px;line-height:1.4;padding:3px}.building{margin-top:15px}.building-heading{gap:12px;margin-bottom:13px}.building-heading h1{font-size:24px}.building-heading .eyebrow{font-size:8px;line-height:1.8;margin-bottom:7px}.building-heading button{font-size:10px;padding:7px 9px}.building-note{font-size:10px;left:15px;right:15px}#building-canvas,.building #building-fallback{height:310px}.building-drive{display:grid;grid-template-columns:1fr auto;gap:6px 12px;padding:14px 0}.building-drive label{gap:8px}.building-drive input{width:100%;grid-column:1/-1;grid-row:2}.building-drive label b{font-size:10px}.building-drive label output{font-size:16px}#model-wheel{font-size:32px}.building-drive>button{font-size:10px;min-height:44px;padding:9px}.building-clue{padding:18px}.building-clue strong{font-size:18px}.building-clue p{font-size:11px}.building-boundary{font-size:8px;line-height:1.7}.building-views span{font-size:9px;margin:0}.building-views{gap:5px}.building-views button{font-size:10px;min-height:44px}.game-controls{gap:8px}.movement{flex:0}.racket-actions{display:grid;grid-template-columns:1fr 1fr;gap:6px;flex:1;min-width:0}.racket-actions button{min-width:0;font-size:14px;padding:7px 5px;min-height:56px}.racket-actions button span{font-size:7px;line-height:1.5}.smash-tip{font-size:10px;margin:10px 0 0}}

.building-heading>div{background:#f3e8ccee;color:var(--ink);padding:12px 16px;border-left:3px solid var(--gold)}

@media(max-width:760px){#model-entry{font-size:9px;white-space:nowrap}}

.building-drive{background:#193c46e6;padding:14px 18px;margin:14px 0;border:1px solid #f3e8cc55}
.next-chapter{display:block;width:fit-content;margin-top:22px;background:var(--teal);color:var(--paper);padding:13px 17px;font-size:12px;line-height:1.8;text-decoration:none;min-height:44px}

/* V3 — illustrated neighbour, prop and recorded dialogue. */
.guide{right:7%;bottom:34%;width:170px;height:265px;text-align:center;pointer-events:none}
.guide img{display:block;width:100%;height:240px;object-fit:contain;transform-origin:50% 95%;animation:neighbourBreath 5s ease-in-out infinite}
.guide span{display:inline-block;font-size:10px;letter-spacing:.08em}
.court-entry{top:15%}
.racket-art{background:url('./assets/art-v3/old-racket.webp') center/contain no-repeat}
.racket-art>i,.racket-art>b,.racket-art>em{display:none}
.racket-art.inspected:after{content:'';position:absolute;left:56%;top:80%;width:25px;height:25px;border:2px solid var(--gold);border-radius:50%;box-shadow:0 0 0 5px #d49c4225;animation:tapeRing 1.7s ease-in-out infinite}
.dialogue[data-who=zhou] .portrait{background:none;border:0;overflow:visible}
.dialogue[data-who=zhou] .portrait:after{content:none}
.dialogue[data-who=zhou] .portrait i,.zhou-face{display:block;width:100%;height:100%;background:url('./assets/art-v3/xiaozhou-expressions.webp') 0 0/200% 200% no-repeat;border:0;border-radius:0;position:static;transform:none}
.dialogue[data-who=zhou][data-face="1"] .portrait i{background-position:100% 0}
.dialogue[data-who=zhou][data-face="2"] .portrait i{background-position:0 100%}
.dialogue[data-who=zhou][data-face="3"] .portrait i{background-position:100% 100%}
.dialogue[data-who=zhou][data-speaking=true] .portrait i{animation:neighbourBreath 2.8s ease-in-out infinite;transform-origin:50% 90%}
.dialogue-copy p{margin-bottom:7px}
.voice-bar{display:flex;gap:10px;align-items:center;min-height:35px;flex-wrap:wrap}
.voice-bar button,dialog .voice-bar button:not(.close):not(.text-button){background:transparent;color:var(--teal);border:1px solid #397b7855;padding:3px 10px;font-size:11px;min-height:34px;white-space:nowrap}
.voice-bar span{font-size:10px;color:#486b68;line-height:1.5}
.programme-art{position:absolute;right:14px;top:65px;width:37%;height:215px;object-fit:contain;pointer-events:none}
.programme-front h3{max-width:62%;font-size:32px}
.programme-front>p,.programme-front>strong{position:relative;max-width:64%}
.programme-voice{display:grid;grid-template-columns:65px 1fr;gap:10px;padding:12px 0 20px;border-top:1px solid #193c4630}
.programme-voice .zhou-face{height:65px;background-position:100% 100%}
.programme-voice[data-speaking=true] .zhou-face{background-position:100% 0}
.programme-voice b{font-size:12px}
.programme-voice p{font-size:12px;line-height:1.85;margin:3px 0 7px}
@keyframes neighbourBreath{50%{transform:translateY(-2px) scaleY(1.012)}}
@keyframes tapeRing{50%{box-shadow:0 0 0 8px #d49c420c}}
@media(max-width:760px){
 .court-entry{top:26%}
 .dialogue{bottom:53px;min-height:188px}
 .dialogue-copy p{font-size:14px;line-height:1.75;margin:6px 0}
 .voice-bar{gap:7px;min-height:35px}
 .voice-bar button{min-height:36px;padding-inline:9px;font-size:10px}
 .voice-bar span{font-size:9px}
 body[data-view=square] .aqi{left:calc(50% - 34px);bottom:267px;width:68px;height:68px}
 .programme-art{right:8px;top:76px;width:37%;height:195px}
 .programme-front h3{font-size:24px;max-width:65%}
 .programme-front>p{font-size:11px}
 .programme-voice{grid-template-columns:53px 1fr;gap:8px}
 .programme-voice .zhou-face{height:53px}
 .programme-voice p{font-size:11px}
}
